@@ -108,6 +108,9 @@ namespace NWilson {
108
108
109
109
TString CollectorUrl;
110
110
TString ServiceName;
111
+ TMap<TString, TString> Headers;
112
+
113
+ TRegisterMonPageCallback RegisterMonPage;
111
114
112
115
std::shared_ptr<grpc::Channel> Channel;
113
116
std::unique_ptr<NServiceProto::TraceService::Stub> Stub;
@@ -126,6 +129,9 @@ namespace NWilson {
126
129
TIntrusiveListWithAutoDelete<TExportRequestData, TDelete> ExportRequests;
127
130
size_t ExportRequestsCount = 0 ;
128
131
132
+ TString ErrStr;
133
+ TString LastCommitTraceErrStr;
134
+
129
135
public:
130
136
TWilsonUploader (TWilsonUploaderParams params)
131
137
: MaxSpansPerSecond(params.MaxExportedSpansPerSecond)
@@ -136,6 +142,8 @@ namespace NWilson {
136
142
, MaxExportInflight(params.MaxExportRequestsInflight)
137
143
, CollectorUrl(std::move(params.CollectorUrl))
138
144
, ServiceName(std::move(params.ServiceName))
145
+ , Headers(params.Headers)
146
+ , RegisterMonPage(params.RegisterMonPage)
139
147
, GrpcSigner(std::move(params.GrpcSigner))
140
148
, CurrentBatch(MaxSpansInBatch, MaxBytesInBatch, ServiceName)
141
149
{}
@@ -166,11 +174,15 @@ namespace NWilson {
166
174
TStringBuf host;
167
175
ui16 port;
168
176
if (!TryGetSchemeHostAndPort (CollectorUrl, scheme, host, port)) {
169
- ALOG_ERROR (WILSON_SERVICE_ID, " Failed to parse collector url (" << CollectorUrl << " was provided). Wilson wouldn't work" );
177
+ ErrStr = " Failed to parse collector url (" + CollectorUrl + " was provided). Wilson wouldn't work" ;
178
+ ALOG_ERROR (WILSON_SERVICE_ID, ErrStr);
170
179
Become (&TThis::StateBroken);
171
180
return ;
172
181
} else if (scheme != " grpc://" && scheme != " grpcs://" ) {
173
- ALOG_ERROR (WILSON_SERVICE_ID, " Wrong scheme provided: " << scheme << " (only grpc:// and grpcs:// are supported). Wilson wouldn't work" );
182
+ TStringStream ss;
183
+ ss << " Wrong scheme provided: " << scheme << " (only grpc:// and grpcs:// are supported). Wilson wouldn't work" ;
184
+ ErrStr = ss.Str ();
185
+ ALOG_ERROR (WILSON_SERVICE_ID, ErrStr);
174
186
Become (&TThis::StateBroken);
175
187
return ;
176
188
}
@@ -181,6 +193,14 @@ namespace NWilson {
181
193
ALOG_INFO (WILSON_SERVICE_ID, " TWilsonUploader::Bootstrap" );
182
194
}
183
195
196
+ void Registered (TActorSystem* sys, const TActorId& owner) override {
197
+ TActorBootstrapped<TWilsonUploader>::Registered (sys, owner);
198
+
199
+ if (const auto & mon = RegisterMonPage) {
200
+ mon (sys, SelfId ());
201
+ }
202
+ }
203
+
184
204
void Handle (TEvWilson::TPtr ev) {
185
205
if (SpansSizeBytes >= MaxPendingSpanBytes) {
186
206
ALOG_ERROR (WILSON_SERVICE_ID, " dropped span due to overflow" );
@@ -284,6 +304,9 @@ namespace NWilson {
284
304
if (GrpcSigner) {
285
305
GrpcSigner->SignClientContext (*context);
286
306
}
307
+ for (const auto & [key, value] : Headers) {
308
+ context->AddMetadata (key, value);
309
+ }
287
310
auto reader = Stub->AsyncExport (context.get (), std::move (batch.Request ), &CQ);
288
311
auto uploadData = std::unique_ptr<TExportRequestData>(new TExportRequestData {
289
312
.Context = std::move (context),
@@ -305,6 +328,8 @@ namespace NWilson {
305
328
auto node = std::unique_ptr<TExportRequestData>(static_cast <TExportRequestData*>(tag));
306
329
ALOG_TRACE (WILSON_SERVICE_ID, " finished export request " << (void *)node.get ());
307
330
if (!node->Status .ok ()) {
331
+ LastCommitTraceErrStr = node->Status .error_message ();
332
+
308
333
ALOG_ERROR (WILSON_SERVICE_ID,
309
334
" failed to commit traces: " << node->Status .error_message ());
310
335
}
@@ -351,13 +376,89 @@ namespace NWilson {
351
376
TryToSend ();
352
377
}
353
378
379
+ void HandleHttp (NMon::TEvHttpInfo::TPtr &ev) {
380
+ TStringStream str;
381
+ str.Reserve (64 << 10 );
382
+
383
+ bool isBroken = CurrentStateFunc () == &TThis::StateBroken;
384
+
385
+ HTML (str) {
386
+ TAG (TH4) {str << " Current state" ;}
387
+ PARA () {
388
+ str << (isBroken ? " Broken" : " Works" );
389
+ }
390
+ if (ErrStr) {
391
+ PARA () {
392
+ str << " Error: " << ErrStr;
393
+ }
394
+ }
395
+ if (LastCommitTraceErrStr) {
396
+ PARA () {
397
+ str << " Last commit traces error: " << LastCommitTraceErrStr;
398
+ }
399
+ }
400
+ PARA () {
401
+ str << " Current batch size: " << CurrentBatch.SizeSpans ();
402
+ }
403
+ PARA () {
404
+ str << " Current batch queue size: " << BatchQueue.size ();
405
+ }
406
+ PARA () {
407
+ std::string state;
408
+ switch (Channel->GetState (false )) {
409
+ case GRPC_CHANNEL_IDLE:
410
+ state = " GRPC_CHANNEL_IDLE" ;
411
+ break ;
412
+ case GRPC_CHANNEL_CONNECTING:
413
+ state = " GRPC_CHANNEL_CONNECTING" ;
414
+ break ;
415
+ case GRPC_CHANNEL_READY:
416
+ state = " GRPC_CHANNEL_READY" ;
417
+ break ;
418
+ case GRPC_CHANNEL_TRANSIENT_FAILURE:
419
+ state = " GRPC_CHANNEL_TRANSIENT_FAILURE" ;
420
+ break ;
421
+ case GRPC_CHANNEL_SHUTDOWN:
422
+ state = " GRPC_CHANNEL_SHUTDOWN" ;
423
+ break ;
424
+ default :
425
+ state = " UNKNOWN_STATE" ;
426
+ break ;
427
+ }
428
+ str << " Channel state# " << state;
429
+ }
430
+ TAG (TH4) {str << " Config" ;}
431
+ PRE () {
432
+ str << " MaxPendingSpanBytes# " << MaxPendingSpanBytes << ' \n ' ;
433
+ str << " MaxSpansPerSecond# " << MaxSpansPerSecond << ' \n ' ;
434
+ str << " MaxSpansInBatch# " << MaxSpansInBatch << ' \n ' ;
435
+ str << " MaxBytesInBatch# " << MaxBytesInBatch << ' \n ' ;
436
+ str << " MaxBatchAccumulation# " << MaxBatchAccumulation << ' \n ' ;
437
+ str << " MaxSpanTimeInQueue# " << MaxSpanTimeInQueue << ' \n ' ;
438
+ str << " MaxExportInflight# " << MaxExportInflight << ' \n ' ;
439
+ str << " CollectorUrl# " << CollectorUrl << ' \n ' ;
440
+ str << " ServiceName# " << ServiceName << ' \n ' ;
441
+ str << " Headers# " << ' \n ' ;
442
+ for (const auto & [key, value] : Headers) {
443
+ str << ' \t ' << key << " : " << value << ' \n ' ;
444
+ }
445
+ }
446
+ }
447
+
448
+ auto * result = new NMon::TEvHttpInfoRes (str.Str (), 0 , NMon::IEvHttpInfoRes::EContentType::Html);
449
+
450
+ Send (ev->Sender , result);
451
+ }
452
+
354
453
STRICT_STFUNC (StateWork,
355
454
hFunc (TEvWilson, Handle );
356
455
hFunc (TEvents::TEvWakeup, HandleWakeup);
456
+ hFunc (NMon::TEvHttpInfo, HandleHttp);
357
457
);
358
458
359
459
STRICT_STFUNC (StateBroken,
360
460
IgnoreFunc (TEvWilson);
461
+ hFunc (NMon::TEvHttpInfo, HandleHttp);
361
462
);
362
463
};
363
464
0 commit comments