1
1
#include " sequenceproxy_impl.h"
2
2
3
+ #include < ydb/core/base/appdata_fwd.h>
3
4
#include < ydb/library/ydb_issue/issue_helpers.h>
4
5
#include < ydb/library/yql/public/issue/yql_issue_manager.h>
5
6
15
16
namespace NKikimr {
16
17
namespace NSequenceProxy {
17
18
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
+
18
32
void TSequenceProxy::Bootstrap () {
33
+ Counters.Reset (new TSequenceProxyCounters ());
19
34
LogPrefix = TStringBuilder () << " TSequenceProxy [Node " << SelfId ().NodeId () << " ] " ;
20
35
Become (&TThis::StateWork);
21
36
}
@@ -30,13 +45,29 @@ namespace NSequenceProxy {
30
45
request.Sender = ev->Sender ;
31
46
request.Cookie = ev->Cookie ;
32
47
request.UserToken = std::move (msg->UserToken );
48
+ request.StartAt = AppData ()->MonotonicTimeProvider ->Now ();
33
49
std::visit (
34
50
[&](const auto & path) {
35
51
DoNextVal (std::move (request), msg->Database , path);
36
52
},
37
53
msg->Path );
38
54
}
39
55
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
+
40
71
void TSequenceProxy::MaybeStartResolve (const TString& database, const TString& path, TSequenceByName& info) {
41
72
if (!info.ResolveInProgress && !info.NewNextValResolve .empty ()) {
42
73
info.PendingNextValResolve = std::move (info.NewNextValResolve );
@@ -46,12 +77,15 @@ namespace NSequenceProxy {
46
77
}
47
78
48
79
void TSequenceProxy::DoNextVal (TNextValRequestInfo&& request, const TString& database, const TString& path) {
80
+ Counters->RequestCount ->Inc ();
49
81
auto & info = Databases[database].SequenceByName [path];
50
82
info.NewNextValResolve .emplace_back (std::move (request));
51
83
MaybeStartResolve (database, path, info);
52
84
}
53
85
54
86
void TSequenceProxy::DoNextVal (TNextValRequestInfo&& request, const TString& database, const TPathId& pathId, bool needRefresh) {
87
+ Counters->RequestCount ->Inc ();
88
+
55
89
auto & info = Databases[database].SequenceByPathId [pathId];
56
90
if (!info.ResolveInProgress && (needRefresh || !info.SequenceInfo )) {
57
91
StartResolve (database, pathId, !info.SequenceInfo );
@@ -77,14 +111,13 @@ namespace NSequenceProxy {
77
111
OnChanged (database, pathId, info);
78
112
}
79
113
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) {
81
115
auto & info = Databases[database].SequenceByName [path];
82
116
Y_ABORT_UNLESS (info.ResolveInProgress );
83
117
info.ResolveInProgress = false ;
84
118
85
119
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);
88
121
info.PendingNextValResolve .pop_front ();
89
122
}
90
123
@@ -111,14 +144,13 @@ namespace NSequenceProxy {
111
144
MaybeStartResolve (database, path, info);
112
145
}
113
146
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) {
115
148
auto & info = Databases[database].SequenceByPathId [pathId];
116
149
Y_ABORT_UNLESS (info.ResolveInProgress );
117
150
info.ResolveInProgress = false ;
118
151
119
152
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);
122
154
info.PendingNextValResolve .pop_front ();
123
155
}
124
156
}
@@ -144,7 +176,7 @@ namespace NSequenceProxy {
144
176
info.PendingNextVal .emplace_back (std::move (request));
145
177
++info.TotalRequested ;
146
178
}
147
- resolved.pop_back ();
179
+ resolved.pop_front ();
148
180
}
149
181
150
182
OnChanged (database, pathId, info);
@@ -173,8 +205,7 @@ namespace NSequenceProxy {
173
205
} else {
174
206
// We will answer up to cache requests with this error
175
207
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 );
178
209
info.PendingNextVal .pop_front ();
179
210
--info.TotalRequested ;
180
211
--cache;
@@ -209,7 +240,7 @@ namespace NSequenceProxy {
209
240
<< " Access denied for " << request.UserToken ->GetUserSID () << " to sequence " << pathId;
210
241
NYql::TIssueManager issueManager;
211
242
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 ());
213
244
return true ;
214
245
}
215
246
}
@@ -226,7 +257,7 @@ namespace NSequenceProxy {
226
257
Y_ABORT_UNLESS (!info.CachedAllocations .empty ());
227
258
auto & front = info.CachedAllocations .front ();
228
259
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 );
230
261
--info.TotalCached ;
231
262
if (--front.Count > 0 ) {
232
263
front.Start += front.Increment ;
0 commit comments