Skip to content

Commit cb324c9

Browse files
adameatalexvru
andauthored
Viewer updates stable 24 3 v4 (#11593)
Co-authored-by: Alexander Rutkovsky <alexvru@ydb.tech>
1 parent 56a2e8d commit cb324c9

19 files changed

+1313
-435
lines changed

ydb/core/driver_lib/run/kikimr_services_initializers.cpp

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -742,15 +742,30 @@ void TBasicServicesInitializer::InitializeServices(NActors::TActorSystemSetup* s
742742
actorSystem->Send(whiteboardId, new NNodeWhiteboard::TEvWhiteboard::TEvSystemStateAddEndpoint("ic", Sprintf(":%d", port)));
743743
};
744744
icCommon->UpdateWhiteboard = [whiteboardId](const TWhiteboardSessionStatus& data) {
745-
data.ActorSystem->Send(whiteboardId, new NNodeWhiteboard::TEvWhiteboard::TEvNodeStateUpdate(
746-
data.Peer, data.Connected,
747-
data.Green ? NKikimrWhiteboard::EFlag::Green :
748-
data.Yellow ? NKikimrWhiteboard::EFlag::Yellow :
749-
data.Orange ? NKikimrWhiteboard::EFlag::Orange :
750-
data.Red ? NKikimrWhiteboard::EFlag::Red : NKikimrWhiteboard::EFlag()));
745+
auto update = std::make_unique<NNodeWhiteboard::TEvWhiteboard::TEvNodeStateUpdate>();
746+
auto& record = update->Record;
747+
record.SetPeerNodeId(data.PeerNodeId);
748+
record.SetPeerName(data.PeerName);
749+
record.SetConnected(data.Connected);
750+
record.SetConnectTime(data.ConnectTime);
751+
record.SetConnectStatus(static_cast<NKikimrWhiteboard::EFlag>(static_cast<int>(data.ConnectStatus) + 1/*GREY = 0, GREEN = 1 ....*/));
752+
record.SetClockSkewUs(data.ClockSkewUs);
753+
record.SetPingTimeUs(data.PingTimeUs);
754+
record.SetUtilization(data.Utilization);
755+
record.MutableScopeId()->SetX1(data.ScopeId.first);
756+
record.MutableScopeId()->SetX2(data.ScopeId.second);
757+
record.SetBytesWritten(data.BytesWrittenToSocket);
758+
if (data.SessionClosed) {
759+
record.SetSessionState(NKikimrWhiteboard::TNodeStateInfo::CLOSED);
760+
} else if (data.SessionPendingConnection) {
761+
record.SetSessionState(NKikimrWhiteboard::TNodeStateInfo::PENDING_CONNECTION);
762+
} else if (data.SessionConnected) {
763+
record.SetSessionState(NKikimrWhiteboard::TNodeStateInfo::CONNECTED);
764+
}
765+
data.ActorSystem->Send(whiteboardId, update.release());
751766
if (data.ReportClockSkew) {
752767
data.ActorSystem->Send(whiteboardId, new NNodeWhiteboard::TEvWhiteboard::TEvClockSkewUpdate(
753-
data.PeerId, data.ClockSkew));
768+
data.PeerNodeId, data.ClockSkewUs));
754769
}
755770
};
756771
}

ydb/core/protos/node_whiteboard.proto

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -90,13 +90,27 @@ message TNodeClockSkew {
9090
}
9191

9292
message TNodeStateInfo {
93-
optional string PeerName = 1;
94-
optional bool Connected = 2;
93+
enum ESessionState {
94+
CLOSED = 0;
95+
PENDING_CONNECTION = 1;
96+
CONNECTED = 2;
97+
}
98+
optional string PeerName = 1 [(DefaultField) = true];
99+
optional bool Connected = 2 [(DefaultField) = true];
95100
optional uint32 NodeId = 3; // filled during merge
96-
optional uint64 ChangeTime = 4;
101+
optional uint64 ChangeTime = 4 [(DefaultField) = true];
97102
optional uint32 OutputQueueSize = 5 [(InsignificantChangeAmount) = 1048576]; // 1Mb
98-
optional EFlag ConnectStatus = 6;
103+
optional EFlag ConnectStatus = 6 [(DefaultField) = true];
104+
optional uint64 ConnectTime = 7; // changed every time the connection changes it state
105+
optional uint32 PeerNodeId = 8 [(DefaultField) = true]; // node if of the peer
106+
optional int64 ClockSkewUs = 9; // a positive value means the peer is ahead in time; a negative value means it's behind
107+
optional uint64 PingTimeUs = 10; // RTT for the peer
108+
optional float Utilization = 11; // network utilization 0-1
109+
optional NActorsInterconnect.TScopeId ScopeId = 12; // scope id of the peer
99110
optional uint32 Count = 13; // filled during group count
111+
optional uint64 BytesWritten = 14; // bytes written to the socket
112+
optional uint64 WriteThroughput = 15; // bytes written per second
113+
optional ESessionState SessionState = 16;
100114
}
101115

102116
message TEvNodeStateRequest {

ydb/core/tablet/node_whiteboard.cpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -568,9 +568,17 @@ class TNodeWhiteboardService : public TActorBootstrapped<TNodeWhiteboardService>
568568

569569
void Handle(TEvWhiteboard::TEvNodeStateUpdate::TPtr &ev, const TActorContext &ctx) {
570570
auto& nodeStateInfo = NodeStateInfo[ev->Get()->Record.GetPeerName()];
571-
if (CheckedMerge(nodeStateInfo, ev->Get()->Record) >= 100) {
572-
nodeStateInfo.SetChangeTime(ctx.Now().MilliSeconds());
571+
ui64 previousChangeTime = nodeStateInfo.GetChangeTime();
572+
ui64 currentChangeTime = ctx.Now().MilliSeconds();
573+
ui64 previousBytesWritten = nodeStateInfo.GetBytesWritten();
574+
ui64 currentBytesWritten = ev->Get()->Record.GetBytesWritten();
575+
if (previousChangeTime && previousBytesWritten < currentBytesWritten && previousChangeTime < currentChangeTime) {
576+
nodeStateInfo.SetWriteThroughput((currentBytesWritten - previousBytesWritten) * 1000 / (currentChangeTime - previousChangeTime));
577+
} else {
578+
nodeStateInfo.ClearWriteThroughput();
573579
}
580+
nodeStateInfo.MergeFrom(ev->Get()->Record);
581+
nodeStateInfo.SetChangeTime(currentChangeTime);
574582
}
575583

576584
void Handle(TEvWhiteboard::TEvNodeStateDelete::TPtr &ev, const TActorContext &ctx) {

ydb/core/viewer/json_handlers_viewer.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,7 @@ void InitViewerHealthCheckJsonHandler(TJsonHandlers& handlers) {
243243
}
244244

245245
void InitViewerNodesJsonHandler(TJsonHandlers& handlers) {
246-
handlers.AddHandler("/viewer/nodes", new TJsonHandler<TJsonNodes>(TJsonNodes::GetSwagger()), 11);
246+
handlers.AddHandler("/viewer/nodes", new TJsonHandler<TJsonNodes>(TJsonNodes::GetSwagger()), 13);
247247
}
248248

249249
void InitViewerACLJsonHandler(TJsonHandlers &jsonHandlers) {

ydb/core/viewer/json_pipe_req.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,15 @@ TViewerPipeClient::TRequestResponse<TEvViewer::TEvViewerResponse> TViewerPipeCli
254254
case NKikimrViewer::TEvViewerRequest::kSystemRequest:
255255
response.Span.Attribute("request_type", "SystemRequest");
256256
break;
257+
case NKikimrViewer::TEvViewerRequest::kPDiskRequest:
258+
response.Span.Attribute("request_type", "PDiskRequest");
259+
break;
260+
case NKikimrViewer::TEvViewerRequest::kVDiskRequest:
261+
response.Span.Attribute("request_type", "VDiskRequest");
262+
break;
263+
case NKikimrViewer::TEvViewerRequest::kNodeRequest:
264+
response.Span.Attribute("request_type", "NodeRequest");
265+
break;
257266
case NKikimrViewer::TEvViewerRequest::kQueryRequest:
258267
response.Span.Attribute("request_type", "QueryRequest");
259268
break;

ydb/core/viewer/json_pipe_req.h

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -80,22 +80,23 @@ class TViewerPipeClient : public TActorBootstrapped<TViewerPipeClient> {
8080
TRequestResponse& operator =(const TRequestResponse&) = delete;
8181
TRequestResponse& operator =(TRequestResponse&&) = default;
8282

83-
void Set(std::unique_ptr<T>&& response) {
83+
bool Set(std::unique_ptr<T>&& response) {
84+
if (IsDone()) {
85+
return false;
86+
}
8487
constexpr bool hasErrorCheck = requires(const std::unique_ptr<T>& r) {TViewerPipeClient::IsSuccess(r);};
8588
if constexpr (hasErrorCheck) {
8689
if (!TViewerPipeClient::IsSuccess(response)) {
87-
Error(TViewerPipeClient::GetError(response));
88-
return;
90+
return Error(TViewerPipeClient::GetError(response));
8991
}
9092
}
91-
if (!IsDone()) {
92-
Span.EndOk();
93-
Response = std::move(response);
94-
}
93+
Span.EndOk();
94+
Response = std::move(response);
95+
return true;
9596
}
9697

97-
void Set(TAutoPtr<TEventHandle<T>>&& response) {
98-
Set(std::unique_ptr<T>(response->Release().Release()));
98+
bool Set(TAutoPtr<TEventHandle<T>>&& response) {
99+
return Set(std::unique_ptr<T>(response->Release().Release()));
99100
}
100101

101102
bool Error(const TString& error) {

ydb/core/viewer/pdisk_info.h

Lines changed: 36 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -112,45 +112,64 @@ class TPDiskInfo : public TViewerPipeClient {
112112
}
113113

114114
void Disconnected(TEvInterconnect::TEvNodeDisconnected::TPtr&) {
115-
WhiteboardPDisk.Error("NodeDisconnected");
116-
WhiteboardVDisk.Error("NodeDisconnected");
115+
ui32 requestsDone = 0;
116+
if (WhiteboardPDisk.Error("NodeDisconnected")) {
117+
++requestsDone;
118+
}
119+
if (WhiteboardVDisk.Error("NodeDisconnected")) {
120+
++requestsDone;
121+
}
117122
if (!RetryRequest()) {
118-
TBase::RequestDone(2);
123+
TBase::RequestDone(requestsDone);
119124
}
120125
}
121126

122127
void Handle(TEvTabletPipe::TEvClientConnected::TPtr& ev) {
123128
if (ev->Get()->Status != NKikimrProto::OK) {
124-
SysViewPDisks.Error("ClientNotConnected");
125-
SysViewVSlots.Error("ClientNotConnected");
126-
TBase::RequestDone(2);
129+
ui32 requestsDone = 0;
130+
if (SysViewPDisks.Error("ClientNotConnected")) {
131+
++requestsDone;
132+
}
133+
if (SysViewVSlots.Error("ClientNotConnected")) {
134+
++requestsDone;
135+
}
136+
TBase::RequestDone(requestsDone);
127137
}
128138
}
129139

130140
void Handle(TEvTabletPipe::TEvClientDestroyed::TPtr&) {
131-
SysViewPDisks.Error("ClientDestroyed");
132-
SysViewVSlots.Error("ClientDestroyed");
133-
TBase::RequestDone(2);
141+
ui32 requestsDone = 0;
142+
if (SysViewPDisks.Error("ClientDestroyed")) {
143+
++requestsDone;
144+
}
145+
if (SysViewVSlots.Error("ClientDestroyed")) {
146+
++requestsDone;
147+
}
148+
TBase::RequestDone(requestsDone);
134149
}
135150

136151
void Handle(NSysView::TEvSysView::TEvGetPDisksResponse::TPtr& ev) {
137-
SysViewPDisks.Set(std::move(ev));
138-
TBase::RequestDone();
152+
if (SysViewPDisks.Set(std::move(ev))) {
153+
TBase::RequestDone();
154+
}
139155
}
140156

141157
void Handle(NSysView::TEvSysView::TEvGetVSlotsResponse::TPtr& ev) {
142-
SysViewVSlots.Set(std::move(ev));
143-
TBase::RequestDone();
158+
if (SysViewVSlots.Set(std::move(ev))) {
159+
TBase::RequestDone();
160+
}
144161
}
145162

146163
void Handle(NNodeWhiteboard::TEvWhiteboard::TEvPDiskStateResponse::TPtr& ev) {
147-
WhiteboardPDisk.Set(std::move(ev));
148-
TBase::RequestDone();
164+
if (WhiteboardPDisk.Set(std::move(ev))) {
165+
TBase::RequestDone();
166+
}
149167
}
150168

151169
void Handle(NNodeWhiteboard::TEvWhiteboard::TEvVDiskStateResponse::TPtr& ev) {
152-
WhiteboardVDisk.Set(std::move(ev));
153-
TBase::RequestDone();
170+
if (WhiteboardVDisk.Set(std::move(ev))) {
171+
TBase::RequestDone();
172+
}
154173
}
155174

156175
void HandleRetry() {

ydb/core/viewer/protos/viewer.proto

Lines changed: 41 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -532,10 +532,27 @@ message TNodeInfo {
532532
bool Disconnected = 4;
533533
float CpuUsage = 5;
534534
float DiskSpaceUsage = 6;
535-
NKikimrWhiteboard.TSystemStateInfo SystemState = 10;
536-
repeated NKikimrWhiteboard.TPDiskStateInfo PDisks = 20;
537-
repeated NKikimrWhiteboard.TVDiskStateInfo VDisks = 30;
538-
repeated TTabletStateInfo Tablets = 40;
535+
optional uint32 Connections = 7; // total number of live connections
536+
EFlag ConnectStatus = 10; // Max
537+
optional uint64 ReceiveThroughput = 11;
538+
optional uint64 SendThroughput = 12;
539+
optional float NetworkUtilization = 20; // Sum
540+
optional float NetworkUtilizationMin = 21;
541+
optional float NetworkUtilizationMax = 22;
542+
optional int64 ClockSkewUs = 30; // Avg
543+
optional int64 ClockSkewMinUs = 31;
544+
optional int64 ClockSkewMaxUs = 32;
545+
optional int64 ReverseClockSkewUs = 33; // Avg
546+
optional uint64 PingTimeUs = 40; // Avg
547+
optional uint64 PingTimeMinUs = 41;
548+
optional uint64 PingTimeMaxUs = 42;
549+
optional uint64 ReversePingTimeUs = 43; // Avg
550+
NKikimrWhiteboard.TSystemStateInfo SystemState = 50;
551+
repeated NKikimrWhiteboard.TPDiskStateInfo PDisks = 51;
552+
repeated NKikimrWhiteboard.TVDiskStateInfo VDisks = 52;
553+
repeated TTabletStateInfo Tablets = 53;
554+
repeated NKikimrWhiteboard.TNodeStateInfo Peers = 54;
555+
repeated NKikimrWhiteboard.TNodeStateInfo ReversePeers = 55;
539556
}
540557

541558
message TNodesInfo {
@@ -668,13 +685,14 @@ message TEvViewerRequest {
668685
NKikimrWhiteboard.TEvVDiskStateRequest VDiskRequest = 16;
669686
NKikimrWhiteboard.TEvPDiskStateRequest PDiskRequest = 17;
670687
NKikimrWhiteboard.TEvBSGroupStateRequest BSGroupRequest = 18;
688+
NKikimrWhiteboard.TEvNodeStateRequest NodeRequest = 19;
671689
THttpProxyRequest QueryRequest = 13;
672690
THttpProxyRequest RenderRequest = 14;
673691
TSchemeCacheRequest AutocompleteRequest = 15;
674-
bytes Reserved19 = 19;
675692
bytes Reserved20 = 20;
676693
bytes Reserved21 = 21;
677694
bytes Reserved22 = 22;
695+
bytes Reserved23 = 23;
678696
}
679697
}
680698

@@ -686,13 +704,14 @@ message TEvViewerResponse {
686704
NKikimrWhiteboard.TEvVDiskStateResponse VDiskResponse = 16;
687705
NKikimrWhiteboard.TEvPDiskStateResponse PDiskResponse = 17;
688706
NKikimrWhiteboard.TEvBSGroupStateResponse BSGroupResponse = 18;
707+
NKikimrWhiteboard.TEvNodeStateResponse NodeResponse = 19;
689708
NKikimrKqp.TEvQueryResponse QueryResponse = 13;
690709
NKikimrGraph.TEvMetricsResult RenderResponse = 14;
691710
TQueryAutocomplete AutocompleteResponse = 15;
692-
bytes Reserved19 = 19;
693711
bytes Reserved20 = 20;
694712
bytes Reserved21 = 21;
695713
bytes Reserved22 = 22;
714+
bytes Reserved23 = 23;
696715
}
697716
}
698717

@@ -743,11 +762,26 @@ enum EAutocompleteType {
743762
}
744763

745764
message TQueryAutocomplete {
765+
enum EDefaultKind {
766+
None = 0;
767+
Sequence = 1;
768+
Literal = 2;
769+
Reserved3 = 3;
770+
Reserved4 = 4;
771+
Reserved5 = 5;
772+
Reserved6 = 6;
773+
Reserved7 = 7;
774+
Reserved8 = 8;
775+
Reserved9 = 9;
776+
}
746777
message TResult {
747778
message TEntity {
748779
string Name = 1;
749780
EAutocompleteType Type = 2;
750781
string Parent = 3;
782+
optional uint32 PKIndex = 4;
783+
optional bool NotNull = 5;
784+
EDefaultKind Default = 6;
751785
}
752786
optional uint32 Total = 1;
753787
repeated TEntity Entities = 2;
@@ -789,3 +823,4 @@ message TFeatureFlagsConfig {
789823
uint32 Version = 1;
790824
repeated TDatabase Databases = 2;
791825
}
826+

0 commit comments

Comments
 (0)