11#include " sequenceproxy_impl.h"
22
3+ #include < ydb/core/base/appdata_fwd.h>
34#include < ydb/library/ydb_issue/issue_helpers.h>
45#include < ydb/library/yql/public/issue/yql_issue_manager.h>
56
1516namespace NKikimr {
1617namespace NSequenceProxy {
1718
19+ TSequenceProxyCounters::TSequenceProxyCounters () {
20+ auto group = GetServiceCounters (AppData ()->Counters , " proxy" );
21+ SequenceShardAllocateCount = group->GetHistogram (
22+ " SequenceProxy/SequenceShard/AllocateCountPerRequest" ,
23+ NMonitoring::ExponentialHistogram (20 , 2 , 1 ));
24+
25+ ErrorsCount = group->GetCounter (" SequenceProxy/Errors" , true );
26+ RequestCount = group->GetCounter (" SequenceProxy/Requests" , true );
27+ ResponseCount = group->GetCounter (" SequenceProxy/Responses" , true );
28+ NextValLatency = group->GetHistogram (" SequenceProxy/Latency" ,
29+ NMonitoring::ExponentialHistogram (20 , 2 , 1 ));
30+ };
31+
1832 void TSequenceProxy::Bootstrap () {
33+ Counters.Reset (new TSequenceProxyCounters ());
1934 LogPrefix = TStringBuilder () << " TSequenceProxy [Node " << SelfId ().NodeId () << " ] " ;
2035 Become (&TThis::StateWork);
2136 }
@@ -30,13 +45,29 @@ namespace NSequenceProxy {
3045 request.Sender = ev->Sender ;
3146 request.Cookie = ev->Cookie ;
3247 request.UserToken = std::move (msg->UserToken );
48+ request.StartAt = AppData ()->MonotonicTimeProvider ->Now ();
3349 std::visit (
3450 [&](const auto & path) {
3551 DoNextVal (std::move (request), msg->Database , path);
3652 },
3753 msg->Path );
3854 }
3955
56+ void TSequenceProxy::Reply (const TNextValRequestInfo& request, Ydb::StatusIds::StatusCode status, const NYql::TIssues& issues) {
57+ Counters->ResponseCount ->Inc ();
58+ auto milliseconds = (AppData ()->MonotonicTimeProvider ->Now () - request.StartAt ).MilliSeconds ();
59+ Counters->NextValLatency ->Collect (milliseconds);
60+ Counters->ErrorsCount ->Inc ();
61+ Send (request.Sender , new TEvSequenceProxy::TEvNextValResult (status, issues), 0 , request.Cookie );
62+ }
63+
64+ void TSequenceProxy::Reply (const TNextValRequestInfo& request, const TPathId& pathId, i64 value) {
65+ Counters->ResponseCount ->Inc ();
66+ auto milliseconds = (AppData ()->MonotonicTimeProvider ->Now () - request.StartAt ).MilliSeconds ();
67+ Counters->NextValLatency ->Collect (milliseconds);
68+ Send (request.Sender , new TEvSequenceProxy::TEvNextValResult (pathId, value), 0 , request.Cookie );
69+ }
70+
4071 void TSequenceProxy::MaybeStartResolve (const TString& database, const TString& path, TSequenceByName& info) {
4172 if (!info.ResolveInProgress && !info.NewNextValResolve .empty ()) {
4273 info.PendingNextValResolve = std::move (info.NewNextValResolve );
@@ -46,12 +77,15 @@ namespace NSequenceProxy {
4677 }
4778
4879 void TSequenceProxy::DoNextVal (TNextValRequestInfo&& request, const TString& database, const TString& path) {
80+ Counters->RequestCount ->Inc ();
4981 auto & info = Databases[database].SequenceByName [path];
5082 info.NewNextValResolve .emplace_back (std::move (request));
5183 MaybeStartResolve (database, path, info);
5284 }
5385
5486 void TSequenceProxy::DoNextVal (TNextValRequestInfo&& request, const TString& database, const TPathId& pathId, bool needRefresh) {
87+ Counters->RequestCount ->Inc ();
88+
5589 auto & info = Databases[database].SequenceByPathId [pathId];
5690 if (!info.ResolveInProgress && (needRefresh || !info.SequenceInfo )) {
5791 StartResolve (database, pathId, !info.SequenceInfo );
@@ -77,14 +111,13 @@ namespace NSequenceProxy {
77111 OnChanged (database, pathId, info);
78112 }
79113
80- void TSequenceProxy::OnResolveError (const TString& database, const TString& path, Ydb::StatusIds::StatusCode status, NYql::TIssues& & issues) {
114+ void TSequenceProxy::OnResolveError (const TString& database, const TString& path, Ydb::StatusIds::StatusCode status, const NYql::TIssues& issues) {
81115 auto & info = Databases[database].SequenceByName [path];
82116 Y_ABORT_UNLESS (info.ResolveInProgress );
83117 info.ResolveInProgress = false ;
84118
85119 while (!info.PendingNextValResolve .empty ()) {
86- const auto & request = info.PendingNextValResolve .front ();
87- Send (request.Sender , new TEvSequenceProxy::TEvNextValResult (status, issues), 0 , request.Cookie );
120+ Reply (info.PendingNextValResolve .front (), status, issues);
88121 info.PendingNextValResolve .pop_front ();
89122 }
90123
@@ -111,14 +144,13 @@ namespace NSequenceProxy {
111144 MaybeStartResolve (database, path, info);
112145 }
113146
114- void TSequenceProxy::OnResolveError (const TString& database, const TPathId& pathId, Ydb::StatusIds::StatusCode status, NYql::TIssues& & issues) {
147+ void TSequenceProxy::OnResolveError (const TString& database, const TPathId& pathId, Ydb::StatusIds::StatusCode status, const NYql::TIssues& issues) {
115148 auto & info = Databases[database].SequenceByPathId [pathId];
116149 Y_ABORT_UNLESS (info.ResolveInProgress );
117150 info.ResolveInProgress = false ;
118151
119152 while (!info.PendingNextValResolve .empty ()) {
120- const auto & request = info.PendingNextValResolve .front ();
121- Send (request.Sender , new TEvSequenceProxy::TEvNextValResult (status, issues), 0 , request.Cookie );
153+ Reply (info.PendingNextValResolve .front (), status, issues);
122154 info.PendingNextValResolve .pop_front ();
123155 }
124156 }
@@ -144,7 +176,7 @@ namespace NSequenceProxy {
144176 info.PendingNextVal .emplace_back (std::move (request));
145177 ++info.TotalRequested ;
146178 }
147- resolved.pop_back ();
179+ resolved.pop_front ();
148180 }
149181
150182 OnChanged (database, pathId, info);
@@ -173,8 +205,7 @@ namespace NSequenceProxy {
173205 } else {
174206 // We will answer up to cache requests with this error
175207 while (cache > 0 && !info.PendingNextVal .empty ()) {
176- const auto & request = info.PendingNextVal .front ();
177- Send (request.Sender , new TEvSequenceProxy::TEvNextValResult (msg->Status , msg->Issues ), 0 , request.Cookie );
208+ Reply (info.PendingNextVal .front (), msg->Status , msg->Issues );
178209 info.PendingNextVal .pop_front ();
179210 --info.TotalRequested ;
180211 --cache;
@@ -209,7 +240,7 @@ namespace NSequenceProxy {
209240 << " Access denied for " << request.UserToken ->GetUserSID () << " to sequence " << pathId;
210241 NYql::TIssueManager issueManager;
211242 issueManager.RaiseIssue (MakeIssue (NKikimrIssues::TIssuesIds::ACCESS_DENIED, error));
212- Send (request. Sender , new TEvSequenceProxy::TEvNextValResult ( Ydb::StatusIds::UNAUTHORIZED, issueManager.GetIssues () ));
243+ Reply (request, Ydb::StatusIds::UNAUTHORIZED, issueManager.GetIssues ());
213244 return true ;
214245 }
215246 }
@@ -226,7 +257,7 @@ namespace NSequenceProxy {
226257 Y_ABORT_UNLESS (!info.CachedAllocations .empty ());
227258 auto & front = info.CachedAllocations .front ();
228259 Y_ABORT_UNLESS (front.Count > 0 );
229- Send (request. Sender , new TEvSequenceProxy::TEvNextValResult ( pathId, front.Start ), 0 , request. Cookie );
260+ Reply (request, pathId, front.Start );
230261 --info.TotalCached ;
231262 if (--front.Count > 0 ) {
232263 front.Start += front.Increment ;
0 commit comments