#pragma once #include #include #include namespace NGrpc { struct ICounterBlock : public TThrRefBase { virtual void CountNotOkRequest() = 0; virtual void CountNotOkResponse() = 0; virtual void CountNotAuthenticated() = 0; virtual void CountResourceExhausted() = 0; virtual void CountRequestBytes(ui32 requestSize) = 0; virtual void CountResponseBytes(ui32 responseSize) = 0; virtual void StartProcessing(ui32 requestSize) = 0; virtual void FinishProcessing(ui32 requestSize, ui32 responseSize, bool ok, ui32 status, TDuration requestDuration) = 0; virtual void CountRequestsWithoutDatabase() {} virtual void CountRequestsWithoutToken() {} virtual void CountRequestWithoutTls() {} virtual TIntrusivePtr Clone() { return this; } virtual void UseDatabase(const TString& database) { Y_UNUSED(database); } }; using ICounterBlockPtr = TIntrusivePtr; class TCounterBlock final : public ICounterBlock { NMonitoring::TDynamicCounters::TCounterPtr TotalCounter; NMonitoring::TDynamicCounters::TCounterPtr InflyCounter; NMonitoring::TDynamicCounters::TCounterPtr NotOkRequestCounter; NMonitoring::TDynamicCounters::TCounterPtr NotOkResponseCounter; NMonitoring::TDynamicCounters::TCounterPtr RequestBytes; NMonitoring::TDynamicCounters::TCounterPtr InflyRequestBytes; NMonitoring::TDynamicCounters::TCounterPtr ResponseBytes; NMonitoring::TDynamicCounters::TCounterPtr NotAuthenticated; NMonitoring::TDynamicCounters::TCounterPtr ResourceExhausted; bool Percentile = false; NMonitoring::TPercentileTracker<4, 512, 15> RequestHistMs; std::array GRpcStatusCounters; public: TCounterBlock(NMonitoring::TDynamicCounters::TCounterPtr totalCounter, NMonitoring::TDynamicCounters::TCounterPtr inflyCounter, NMonitoring::TDynamicCounters::TCounterPtr notOkRequestCounter, NMonitoring::TDynamicCounters::TCounterPtr notOkResponseCounter, NMonitoring::TDynamicCounters::TCounterPtr requestBytes, NMonitoring::TDynamicCounters::TCounterPtr inflyRequestBytes, NMonitoring::TDynamicCounters::TCounterPtr responseBytes, NMonitoring::TDynamicCounters::TCounterPtr notAuthenticated, NMonitoring::TDynamicCounters::TCounterPtr resourceExhausted, TIntrusivePtr group) : TotalCounter(std::move(totalCounter)) , InflyCounter(std::move(inflyCounter)) , NotOkRequestCounter(std::move(notOkRequestCounter)) , NotOkResponseCounter(std::move(notOkResponseCounter)) , RequestBytes(std::move(requestBytes)) , InflyRequestBytes(std::move(inflyRequestBytes)) , ResponseBytes(std::move(responseBytes)) , NotAuthenticated(std::move(notAuthenticated)) , ResourceExhausted(std::move(resourceExhausted)) { if (group) { RequestHistMs.Initialize(group, "event", "request", "ms", {0.5f, 0.9f, 0.99f, 0.999f, 1.0f}); Percentile = true; } } void CountNotOkRequest() override { NotOkRequestCounter->Inc(); } void CountNotOkResponse() override { NotOkResponseCounter->Inc(); } void CountNotAuthenticated() override { NotAuthenticated->Inc(); } void CountResourceExhausted() override { ResourceExhausted->Inc(); } void CountRequestBytes(ui32 requestSize) override { *RequestBytes += requestSize; } void CountResponseBytes(ui32 responseSize) override { *ResponseBytes += responseSize; } void StartProcessing(ui32 requestSize) override { TotalCounter->Inc(); InflyCounter->Inc(); *RequestBytes += requestSize; *InflyRequestBytes += requestSize; } void FinishProcessing(ui32 requestSize, ui32 responseSize, bool ok, ui32 status, TDuration requestDuration) override { Y_UNUSED(status); InflyCounter->Dec(); *InflyRequestBytes -= requestSize; *ResponseBytes += responseSize; if (!ok) { NotOkResponseCounter->Inc(); } if (Percentile) { RequestHistMs.Increment(requestDuration.MilliSeconds()); } } ICounterBlockPtr Clone() override { return this; } void Update() { if (Percentile) { RequestHistMs.Update(); } } }; using TCounterBlockPtr = TIntrusivePtr; /** * Creates new instance of ICounterBlock implementation which does nothing. * * @return new instance */ ICounterBlockPtr FakeCounterBlock(); } // namespace NGrpc