Skip to content

Commit 7fb1600

Browse files
authored
Add client timeout histogram for grpc call metrics. (#16065)
In case of investigation problems with unexpected timeout response It is helpful to know actual timeout for grpc call from the server perspective
1 parent caf9257 commit 7fb1600

File tree

6 files changed

+38
-18
lines changed

6 files changed

+38
-18
lines changed

ydb/core/client/server/grpc_server.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -303,7 +303,7 @@ class TSimpleRequest
303303
if (Server->IncRequest()) {
304304

305305
RequestSize = Request.ByteSize();
306-
Counters->StartProcessing(RequestSize);
306+
Counters->StartProcessing(RequestSize, TInstant::Max());
307307
RequestTimer.Reset();
308308
InProgress_ = true;
309309

ydb/core/grpc_services/counters/counters.cpp

Lines changed: 32 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ class TYdbCounterBlock : public NYdbGrpc::ICounterBlock {
117117
::NMonitoring::TDynamicCounters::TCounterPtr RequestsWithoutToken;
118118
::NMonitoring::TDynamicCounters::TCounterPtr RequestsWithoutTls;
119119
::NMonitoring::THistogramPtr Histo;
120+
::NMonitoring::THistogramPtr ClientTimeoutHisto;
120121

121122

122123
std::function<void()> InitFn;
@@ -190,7 +191,7 @@ class TYdbCounterBlock : public NYdbGrpc::ICounterBlock {
190191
*YdbCounters.ResponseBytes += responseSize;
191192
}
192193

193-
void StartProcessing(ui32 requestSize) override {
194+
void StartProcessing(ui32 requestSize, TInstant deadline) override {
194195
InitOnce();
195196
TotalCounter->Inc();
196197
InflyCounter->Inc();
@@ -201,6 +202,15 @@ class TYdbCounterBlock : public NYdbGrpc::ICounterBlock {
201202
YdbCounters.RequestInflight->Inc();
202203
*YdbCounters.RequestBytes += requestSize;
203204
*YdbCounters.RequestInflightBytes += requestSize;
205+
if (deadline != TInstant::Zero() && deadline != TInstant::Max()) {
206+
auto now = TInstant::Now();
207+
if (deadline > now) {
208+
auto timeout = deadline - now;
209+
ClientTimeoutHisto->Collect(timeout.MilliSeconds());
210+
} else {
211+
ClientTimeoutHisto->Collect(0);
212+
}
213+
}
204214
}
205215

206216
void FinishProcessing(ui32 requestSize, ui32 responseSize, bool ok, ui32 status,
@@ -330,14 +340,24 @@ TYdbCounterBlock::TYdbCounterBlock(const ::NMonitoring::TDynamicCounterPtr& coun
330340
TotalCounter = subgroup->GetCounter("total", true);
331341
InflyCounter = subgroup->GetCounter("infly", false);
332342

333-
auto h = NMonitoring::ExplicitHistogram(
334-
NMonitoring::TBucketBounds{
335-
0.5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
336-
16, 20, 24, 28, 32, 36,
337-
40, 50, 60, 70, 80, 90,
338-
100, 200, 300, 400, 500,
339-
1000, 5000, 10000, 20000, 60000});
340-
Histo = subgroup->GetHistogram("LatencyMs", std::move(h));
343+
{
344+
auto h = NMonitoring::ExplicitHistogram(
345+
NMonitoring::TBucketBounds{
346+
0.5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
347+
16, 20, 24, 28, 32, 36,
348+
40, 50, 60, 70, 80, 90,
349+
100, 200, 300, 400, 500,
350+
1000, 5000, 10000, 20000, 60000});
351+
Histo = subgroup->GetHistogram("LatencyMs", std::move(h));
352+
}
353+
354+
{
355+
auto h = NMonitoring::ExplicitHistogram(
356+
NMonitoring::TBucketBounds{
357+
0, 5, 10, 50, 100, 250, 500,
358+
1000, 5000, 10000, 20000, 60000});
359+
ClientTimeoutHisto = subgroup->GetHistogram("TimeoutMs", std::move(h));
360+
}
341361
};
342362
}
343363

@@ -615,9 +635,9 @@ class TYdbCounterBlockWrapper : public NYdbGrpc::ICounterBlock {
615635
Db->CountResponseBytes(responseSize);
616636
}
617637

618-
void StartProcessing(ui32 requestSize) override {
619-
Common->StartProcessing(requestSize);
620-
Db->StartProcessing(requestSize);
638+
void StartProcessing(ui32 requestSize, TInstant deadline) override {
639+
Common->StartProcessing(requestSize, deadline);
640+
Db->StartProcessing(requestSize, deadline);
621641
}
622642

623643
void FinishProcessing(ui32 requestSize, ui32 responseSize, bool ok, ui32 status,

ydb/core/grpc_streaming/grpc_streaming.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,7 @@ class TGRpcStreamingRequest final
247247

248248
if (IncRequest()) {
249249
if (Counters) {
250-
Counters->StartProcessing(0);
250+
Counters->StartProcessing(0, TInstant::Max());
251251
}
252252
Flags |= FlagStarted;
253253

ydb/library/grpc/server/grpc_counters.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ class TFakeCounterBlock final: public ICounterBlock {
2323
void CountResponseBytes(ui32 /*responseSize*/) override {
2424
}
2525

26-
void StartProcessing(ui32 /*requestSize*/) override {
26+
void StartProcessing(ui32 /*requestSize*/, TInstant /*deadline*/) override {
2727
}
2828

2929
void FinishProcessing(

ydb/library/grpc/server/grpc_counters.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ struct ICounterBlock : public TThrRefBase {
1313
virtual void CountResourceExhausted() = 0;
1414
virtual void CountRequestBytes(ui32 requestSize) = 0;
1515
virtual void CountResponseBytes(ui32 responseSize) = 0;
16-
virtual void StartProcessing(ui32 requestSize) = 0;
16+
virtual void StartProcessing(ui32 requestSize, TInstant deadline) = 0;
1717
virtual void FinishProcessing(ui32 requestSize, ui32 responseSize, bool ok, ui32 status, TDuration requestDuration) = 0;
1818
virtual void CountRequestsWithoutDatabase() {}
1919
virtual void CountRequestsWithoutToken() {}
@@ -90,7 +90,7 @@ class TCounterBlock final : public ICounterBlock {
9090
*ResponseBytes += responseSize;
9191
}
9292

93-
void StartProcessing(ui32 requestSize) override {
93+
void StartProcessing(ui32 requestSize, TInstant /*deadline*/) override {
9494
TotalCounter->Inc();
9595
InflyCounter->Inc();
9696
*RequestBytes += requestSize;

ydb/library/grpc/server/grpc_request.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -422,7 +422,7 @@ class TGRpcRequestImpl
422422
if (IncRequest()) {
423423
// Adjust counters.
424424
RequestSize = Request_->ByteSize();
425-
Counters_->StartProcessing(RequestSize);
425+
Counters_->StartProcessing(RequestSize, Deadline());
426426
RequestTimer.Reset();
427427

428428
if (!SslServer()) {

0 commit comments

Comments
 (0)