@@ -15,6 +15,12 @@ TViewerPipeClient::~TViewerPipeClient() = default;
15
15
16
16
TViewerPipeClient::TViewerPipeClient () = default ;
17
17
18
+ TViewerPipeClient::TViewerPipeClient (NWilson::TTraceId traceId) {
19
+ if (traceId) {
20
+ Span = {TComponentTracingLevels::THttp::TopLevel, std::move (traceId), " viewer" , NWilson::EFlags::AUTO_END};
21
+ }
22
+ }
23
+
18
24
TViewerPipeClient::TViewerPipeClient (IViewer* viewer, NMon::TEvHttpInfo::TPtr& ev)
19
25
: Viewer(viewer)
20
26
, Event(ev)
@@ -133,6 +139,49 @@ void TViewerPipeClient::RequestHiveStorageStats(NNodeWhiteboard::TTabletId hiveI
133
139
SendRequestToPipe (pipeClient, request.Release (), hiveId);
134
140
}
135
141
142
+ TViewerPipeClient::TRequestResponse<TEvViewer::TEvViewerResponse> TViewerPipeClient::MakeViewerRequest (TNodeId nodeId, TEvViewer::TEvViewerRequest* ev, ui32 flags) {
143
+ TActorId viewerServiceId = MakeViewerID (nodeId);
144
+ TRequestResponse<TEvViewer::TEvViewerResponse> response (Span.CreateChild (TComponentTracingLevels::THttp::Detailed, TypeName (*ev)));
145
+ if (response.Span ) {
146
+ response.Span .Attribute (" target_node_id" , nodeId);
147
+ TStringBuilder askFor;
148
+ askFor << ev->Record .GetLocation ().NodeIdSize () << " nodes (" ;
149
+ for (size_t i = 0 ; i < std::min<size_t >(ev->Record .GetLocation ().NodeIdSize (), 16 ); ++i) {
150
+ if (i) {
151
+ askFor << " , " ;
152
+ }
153
+ askFor << ev->Record .GetLocation ().GetNodeId (i);
154
+ }
155
+ if (ev->Record .GetLocation ().NodeIdSize () > 16 ) {
156
+ askFor << " , ..." ;
157
+ }
158
+ askFor << " )" ;
159
+ response.Span .Attribute (" ask_for" , askFor);
160
+ switch (ev->Record .Request_case ()) {
161
+ case NKikimrViewer::TEvViewerRequest::kTabletRequest :
162
+ response.Span .Attribute (" request_type" , " TabletRequest" );
163
+ break ;
164
+ case NKikimrViewer::TEvViewerRequest::kSystemRequest :
165
+ response.Span .Attribute (" request_type" , " SystemRequest" );
166
+ break ;
167
+ case NKikimrViewer::TEvViewerRequest::kQueryRequest :
168
+ response.Span .Attribute (" request_type" , " QueryRequest" );
169
+ break ;
170
+ case NKikimrViewer::TEvViewerRequest::kRenderRequest :
171
+ response.Span .Attribute (" request_type" , " RenderRequest" );
172
+ break ;
173
+ case NKikimrViewer::TEvViewerRequest::kAutocompleteRequest :
174
+ response.Span .Attribute (" request_type" , " AutocompleteRequest" );
175
+ break ;
176
+ default :
177
+ response.Span .Attribute (" request_type" , ::ToString (static_cast <int >(ev->Record .Request_case ())));
178
+ break ;
179
+ }
180
+ }
181
+ SendRequest (viewerServiceId, ev, flags, nodeId, response.Span .GetTraceId ());
182
+ return response;
183
+ }
184
+
136
185
TViewerPipeClient::TRequestResponse<TEvHive::TEvResponseHiveDomainStats> TViewerPipeClient::MakeRequestHiveDomainStats (NNodeWhiteboard::TTabletId hiveId) {
137
186
TActorId pipeClient = ConnectTabletPipe (hiveId);
138
187
THolder<TEvHive::TEvRequestHiveDomainStats> request = MakeHolder<TEvHive::TEvRequestHiveDomainStats>();
@@ -157,6 +206,16 @@ TViewerPipeClient::TRequestResponse<TEvHive::TEvResponseHiveStorageStats> TViewe
157
206
return response;
158
207
}
159
208
209
+ TViewerPipeClient::TRequestResponse<TEvHive::TEvResponseHiveNodeStats> TViewerPipeClient::MakeRequestHiveNodeStats (TTabletId hiveId, TEvHive::TEvRequestHiveNodeStats* request) {
210
+ TActorId pipeClient = ConnectTabletPipe (hiveId);
211
+ auto response = MakeRequestToPipe<TEvHive::TEvResponseHiveNodeStats>(pipeClient, request, hiveId);
212
+ if (response.Span ) {
213
+ auto hive_id = " #" + ::ToString (hiveId);
214
+ response.Span .Attribute (" hive_id" , hive_id);
215
+ }
216
+ return response;
217
+ }
218
+
160
219
TViewerPipeClient::TRequestResponse<TEvViewer::TEvViewerResponse> TViewerPipeClient::MakeRequestViewer (TNodeId nodeId, TEvViewer::TEvViewerRequest* request, ui32 flags) {
161
220
auto requestType = request->Record .GetRequestCase ();
162
221
auto response = MakeRequest<TEvViewer::TEvViewerResponse>(MakeViewerID (nodeId), request, flags, nodeId);
@@ -415,6 +474,18 @@ void TViewerPipeClient::RequestStateStorageEndpointsLookup(const TString& path)
415
474
++Requests;
416
475
}
417
476
477
+ TViewerPipeClient::TRequestResponse<TEvStateStorage::TEvBoardInfo> TViewerPipeClient::MakeRequestStateStorageEndpointsLookup (const TString& path, ui64 cookie) {
478
+ TRequestResponse<TEvStateStorage::TEvBoardInfo> response (Span.CreateChild (TComponentTracingLevels::THttp::Detailed, " BoardLookupActor" ));
479
+ RegisterWithSameMailbox (CreateBoardLookupActor (MakeEndpointsBoardPath (path),
480
+ SelfId (),
481
+ EBoardLookupMode::Second, {}, cookie));
482
+ if (response.Span ) {
483
+ response.Span .Attribute (" path" , path);
484
+ }
485
+ ++Requests;
486
+ return response;
487
+ }
488
+
418
489
void TViewerPipeClient::RequestStateStorageMetadataCacheEndpointsLookup (const TString& path) {
419
490
if (!AppData ()->DomainsInfo ->Domain ) {
420
491
return ;
@@ -519,6 +590,9 @@ TString TViewerPipeClient::MakeForward(const std::vector<ui32>& nodes) {
519
590
}
520
591
521
592
void TViewerPipeClient::RequestDone (ui32 requests) {
593
+ if (requests == 0 ) {
594
+ return ;
595
+ }
522
596
Requests -= requests;
523
597
if (!DelayedRequests.empty ()) {
524
598
SendDelayedRequests ();
@@ -535,13 +609,56 @@ void TViewerPipeClient::Handle(TEvTabletPipe::TEvClientConnected::TPtr& ev) {
535
609
}
536
610
}
537
611
612
+ void TViewerPipeClient::HandleResolveDatabase (TEvTxProxySchemeCache::TEvNavigateKeySetResult::TPtr& ev) {
613
+ if (ev->Get ()->Request ->ResultSet .size () == 1 && ev->Get ()->Request ->ResultSet .begin ()->Status == NSchemeCache::TSchemeCacheNavigate::EStatus::Ok) {
614
+ TSchemeCacheNavigate::TEntry& entry (ev->Get ()->Request ->ResultSet .front ());
615
+ if (entry.DomainInfo ) {
616
+ if (entry.DomainInfo ->ResourcesDomainKey && entry.DomainInfo ->DomainKey != entry.DomainInfo ->ResourcesDomainKey ) {
617
+ RequestSchemeCacheNavigate (TPathId (entry.DomainInfo ->ResourcesDomainKey ));
618
+ } else {
619
+ RequestStateStorageEndpointsLookup (CanonizePath (entry.Path ));
620
+ }
621
+ }
622
+ } else {
623
+ ReplyAndPassAway (GetHTTPBADREQUEST (" text/plain" , " Failed to resolve database" ));
624
+ }
625
+ }
626
+
627
+ void TViewerPipeClient::HandleResolveDatabase (TEvStateStorage::TEvBoardInfo::TPtr& ev) {
628
+ ReplyAndPassAway (MakeForward (GetNodesFromBoardReply (ev)));
629
+ }
630
+
538
631
void TViewerPipeClient::HandleTimeout () {
539
632
ReplyAndPassAway (GetHTTPGATEWAYTIMEOUT ());
540
633
}
541
634
635
+ STATEFN (TViewerPipeClient::StateResolveDatabase) {
636
+ switch (ev->GetTypeRewrite ()) {
637
+ hFunc (TEvStateStorage::TEvBoardInfo, HandleResolveDatabase);
638
+ hFunc (TEvTxProxySchemeCache::TEvNavigateKeySetResult, HandleResolveDatabase);
639
+ cFunc (TEvents::TEvWakeup::EventType, HandleTimeout);
640
+ }
641
+ }
642
+
643
+ void TViewerPipeClient::RedirectToDatabase (const TString& database) {
644
+ RequestSchemeCacheNavigate (database);
645
+ Become (&TViewerPipeClient::StateResolveDatabase, TDuration::MilliSeconds (1000 ), new TEvents::TEvWakeup ());
646
+ }
647
+
542
648
void TViewerPipeClient::PassAway () {
649
+ std::sort (SubscriptionNodeIds.begin (), SubscriptionNodeIds.end ());
650
+ SubscriptionNodeIds.erase (std::unique (SubscriptionNodeIds.begin (), SubscriptionNodeIds.end ()), SubscriptionNodeIds.end ());
651
+ for (TNodeId nodeId : SubscriptionNodeIds) {
652
+ Send (TActivationContext::InterconnectProxy (nodeId), new TEvents::TEvUnsubscribe ());
653
+ }
543
654
ClosePipes ();
544
655
TBase::PassAway ();
545
656
}
546
657
658
+ void TViewerPipeClient::AddEvent (const TString& name) {
659
+ if (Span) {
660
+ Span.Event (name);
661
+ }
662
+ }
663
+
547
664
}
0 commit comments