Skip to content

Viewer updates stable 24-3 v3 #10745

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 15 additions & 3 deletions ydb/core/base/pool_stats_collector.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,12 +46,24 @@ class TStatsCollectingActor : public NActors::TStatsCollectingActor {
void OnWakeup(const TActorContext &ctx) override {
MiniKQLPoolStats.Update();

TVector<std::tuple<TString, double, ui32, ui32>> pools;
auto systemUpdate = std::make_unique<NNodeWhiteboard::TEvWhiteboard::TEvSystemStateUpdate>();
ui32 coresTotal = 0;
double coresUsed = 0;
for (const auto& pool : PoolCounters) {
pools.emplace_back(pool.Name, pool.Usage, pool.Threads, pool.LimitThreads);
auto& pb = *systemUpdate->Record.AddPoolStats();
pb.SetName(pool.Name);
pb.SetUsage(pool.Usage);
pb.SetThreads(static_cast<ui32>(pool.Threads));
pb.SetLimit(static_cast<ui32>(pool.LimitThreads));
if (pool.Name != "IO") {
coresTotal += static_cast<ui32>(pool.DefaultThreads);
}
coresUsed += pool.Usage * pool.LimitThreads;
}
systemUpdate->Record.SetCoresTotal(coresTotal);
systemUpdate->Record.SetCoresUsed(coresUsed);

ctx.Send(NNodeWhiteboard::MakeNodeWhiteboardServiceId(ctx.SelfID.NodeId()), new NNodeWhiteboard::TEvWhiteboard::TEvSystemStateUpdate(pools));
ctx.Send(NNodeWhiteboard::MakeNodeWhiteboardServiceId(ctx.SelfID.NodeId()), systemUpdate.release());
}

private:
Expand Down
3 changes: 3 additions & 0 deletions ydb/core/node_whiteboard/node_whiteboard.h
Original file line number Diff line number Diff line change
Expand Up @@ -534,5 +534,8 @@ struct WhiteboardResponse<TEvWhiteboard::TEvNodeStateRequest> {
using Type = TEvWhiteboard::TEvNodeStateResponse;
};

template<typename TResponseType>
::google::protobuf::RepeatedField<int> GetDefaultWhiteboardFields();

} // NNodeWhiteboard
} // NKikimr
4 changes: 3 additions & 1 deletion ydb/core/protos/node_whiteboard.proto
Original file line number Diff line number Diff line change
Expand Up @@ -319,7 +319,7 @@ message TSystemStateInfo {
optional string DataCenter = 16;
optional uint32 RackId = 17;
optional string Rack = 18;
optional string Host = 19;
optional string Host = 19 [(DefaultField) = true];
optional string Version = 20 [(DefaultField) = true];
repeated TPoolStats PoolStats = 21 [(DefaultField) = true];
repeated TEndpoint Endpoints = 22 [(DefaultField) = true];
Expand All @@ -338,6 +338,8 @@ message TSystemStateInfo {
optional TNodeSharedCache SharedCacheStats = 35; // TODO: use memory stats
optional uint32 TotalSessions = 36 [(DefaultField) = true];
optional string NodeName = 37 [(DefaultField) = true];
optional double CoresUsed = 39;
optional uint32 CoresTotal = 40;
}

message TEvSystemStateRequest {
Expand Down
47 changes: 26 additions & 21 deletions ydb/core/tablet/node_whiteboard.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -477,7 +477,7 @@ class TNodeWhiteboardService : public TActorBootstrapped<TNodeWhiteboardService>
}
}

static void SelectiveCopy(::google::protobuf::Message& protoTo, const ::google::protobuf::Message& protoFrom, const ::google::protobuf::RepeatedField<arc_i32>& fields) {
static void SelectiveCopy(::google::protobuf::Message& protoTo, const ::google::protobuf::Message& protoFrom, const ::google::protobuf::RepeatedField<int>& fields) {
using namespace ::google::protobuf;
const Descriptor& descriptor = *protoTo.GetDescriptor();
const Reflection& reflectionTo = *protoTo.GetReflection();
Expand All @@ -490,24 +490,6 @@ class TNodeWhiteboardService : public TActorBootstrapped<TNodeWhiteboardService>
}
}

template<typename TMessage>
static ::google::protobuf::RepeatedField<arc_i32> GetDefaultFields(const TMessage& message) {
using namespace ::google::protobuf;
const Descriptor& descriptor = *message.GetDescriptor();
::google::protobuf::RepeatedField<arc_i32> defaultFields;
int fieldCount = descriptor.field_count();
for (int index = 0; index < fieldCount; ++index) {
const FieldDescriptor* field = descriptor.field(index);
const auto& options(field->options());
if (options.HasExtension(NKikimrWhiteboard::DefaultField)) {
if (options.GetExtension(NKikimrWhiteboard::DefaultField)) {
defaultFields.Add(field->number());
}
}
}
return defaultFields;
}

template<typename TMessage, typename TRequest>
static void Copy(TMessage& to, const TMessage& from, const TRequest& request) {
if (request.FieldsRequiredSize() > 0) {
Expand All @@ -517,8 +499,7 @@ class TNodeWhiteboardService : public TActorBootstrapped<TNodeWhiteboardService>
SelectiveCopy(to, from, request.GetFieldsRequired());
}
} else {
static auto defaultFields = GetDefaultFields(to);
SelectiveCopy(to, from, defaultFields);
SelectiveCopy(to, from, GetDefaultWhiteboardFields<TMessage>());
}
}

Expand Down Expand Up @@ -1121,6 +1102,30 @@ class TNodeWhiteboardService : public TActorBootstrapped<TNodeWhiteboardService>
}
};

template<typename TMessage>
::google::protobuf::RepeatedField<int> InitDefaultWhiteboardFields() {
using namespace ::google::protobuf;
const Descriptor& descriptor = *TMessage::GetDescriptor();
::google::protobuf::RepeatedField<int> defaultFields;
int fieldCount = descriptor.field_count();
for (int index = 0; index < fieldCount; ++index) {
const FieldDescriptor* field = descriptor.field(index);
const auto& options(field->options());
if (options.HasExtension(NKikimrWhiteboard::DefaultField)) {
if (options.GetExtension(NKikimrWhiteboard::DefaultField)) {
defaultFields.Add(field->number());
}
}
}
return defaultFields;
}

template<typename TMessage>
::google::protobuf::RepeatedField<int> GetDefaultWhiteboardFields() {
static ::google::protobuf::RepeatedField<int> defaultFields = InitDefaultWhiteboardFields<TMessage>();
return defaultFields;
}

IActor* CreateNodeWhiteboardService() {
return new TNodeWhiteboardService();
}
Expand Down
4 changes: 1 addition & 3 deletions ydb/core/viewer/json/json.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -492,9 +492,7 @@ void TProtoToJson::ProtoToJsonSchema(IOutputStream& to, const TJsonSettings& jso
to << "{\"type\":\"array\",\"items\":";
}
if (fieldDescriptor->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
if (fieldDescriptor->message_type()->full_name() == google::protobuf::Timestamp::descriptor()->full_name()) {
to << "{\"type\":\"string\",\"format\":\"date-time\"}";
} else if (fieldDescriptor->message_type()->full_name() == google::protobuf::Duration::descriptor()->full_name()) {
if (fieldDescriptor->message_type()->full_name() == google::protobuf::Duration::descriptor()->full_name()) {
to << "{\"type\":\"string\", \"example\":\"3600s\"}";
} else if (fieldDescriptor->message_type()->full_name() == google::protobuf::BoolValue::descriptor()->full_name()) {
to << "{\"type\":\"boolean\"}";
Expand Down
8 changes: 4 additions & 4 deletions ydb/core/viewer/json_handlers_viewer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -203,7 +203,7 @@ void InitViewerStorageUsageJsonHandler(TJsonHandlers &handlers) {
}

void InitViewerClusterJsonHandler(TJsonHandlers& handlers) {
handlers.AddHandler("/viewer/cluster", new TJsonHandler<TJsonCluster>(TJsonCluster::GetSwagger()), 4);
handlers.AddHandler("/viewer/cluster", new TJsonHandler<TJsonCluster>(TJsonCluster::GetSwagger()), 5);
}

void InitViewerLabeledCountersJsonHandler(TJsonHandlers &handlers) {
Expand All @@ -219,15 +219,15 @@ void InitViewerHiveStatsJsonHandler(TJsonHandlers& handlers) {
}

void InitViewerTenantInfoJsonHandler(TJsonHandlers &handlers) {
handlers.AddHandler("/viewer/tenantinfo", new TJsonHandler<TJsonTenantInfo>(TJsonTenantInfo::GetSwagger()), 2);
handlers.AddHandler("/viewer/tenantinfo", new TJsonHandler<TJsonTenantInfo>(TJsonTenantInfo::GetSwagger()), 3);
}

void InitViewerWhoAmIJsonHandler(TJsonHandlers& handlers) {
handlers.AddHandler("/viewer/whoami", new TJsonHandler<TJsonWhoAmI>(TJsonWhoAmI::GetSwagger()));
}

void InitViewerQueryJsonHandler(TJsonHandlers& handlers) {
handlers.AddHandler("/viewer/query", new TJsonHandler<TJsonQuery>(TJsonQuery::GetSwagger()), 3);
handlers.AddHandler("/viewer/query", new TJsonHandler<TJsonQuery>(TJsonQuery::GetSwagger()), 4);
}

void InitViewerNetInfoJsonHandler(TJsonHandlers& handlers) {
Expand All @@ -243,7 +243,7 @@ void InitViewerHealthCheckJsonHandler(TJsonHandlers& handlers) {
}

void InitViewerNodesJsonHandler(TJsonHandlers& handlers) {
handlers.AddHandler("/viewer/nodes", new TJsonHandler<TJsonNodes>(TJsonNodes::GetSwagger()), 9);
handlers.AddHandler("/viewer/nodes", new TJsonHandler<TJsonNodes>(TJsonNodes::GetSwagger()), 11);
}

void InitViewerACLJsonHandler(TJsonHandlers &jsonHandlers) {
Expand Down
5 changes: 2 additions & 3 deletions ydb/core/viewer/json_local_rpc.h
Original file line number Diff line number Diff line change
Expand Up @@ -128,10 +128,9 @@ class TJsonLocalRpc : public TViewerPipeClient {
ReplyAndPassAway(GetHTTPBADREQUEST("text/plain", e.what()));
return false;
}
} else {
const auto& params(Event->Get()->Request.GetParams());
Params2Proto(params, request);
}
const auto& params(Event->Get()->Request.GetParams());
Params2Proto(params, request);
if (!ValidateRequest(request)) {
return false;
}
Expand Down
38 changes: 35 additions & 3 deletions ydb/core/viewer/json_pipe_req.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#include "json_pipe_req.h"
#include <library/cpp/json/json_reader.h>
#include <library/cpp/json/json_writer.h>

namespace NKikimr::NViewer {
Expand All @@ -25,7 +26,28 @@ TViewerPipeClient::TViewerPipeClient(IViewer* viewer, NMon::TEvHttpInfo::TPtr& e
: Viewer(viewer)
, Event(ev)
{
InitConfig(Event->Get()->Request.GetParams());
TCgiParameters params = Event->Get()->Request.GetParams();
if (Event->Get()->Request.GetHeader("Content-Type") == "application/json") {
NJson::TJsonValue jsonData;
if (NJson::ReadJsonTree(Event->Get()->Request.GetPostContent(), &jsonData)) {
if (jsonData.IsMap()) {
for (const auto& [key, value] : jsonData.GetMap()) {
switch (value.GetType()) {
case NJson::EJsonValueType::JSON_STRING:
case NJson::EJsonValueType::JSON_INTEGER:
case NJson::EJsonValueType::JSON_UINTEGER:
case NJson::EJsonValueType::JSON_DOUBLE:
case NJson::EJsonValueType::JSON_BOOLEAN:
params.InsertUnescaped(key, value.GetStringRobust());
break;
default:
break;
}
}
}
}
}
InitConfig(params);
NWilson::TTraceId traceId;
TStringBuf traceparent = Event->Get()->Request.GetHeader("traceparent");
if (traceparent) {
Expand Down Expand Up @@ -645,10 +667,20 @@ TRequestState TViewerPipeClient::GetRequest() const {
}

void TViewerPipeClient::ReplyAndPassAway(TString data, const TString& error) {
TString message = error;
Send(Event->Sender, new NMon::TEvHttpInfoRes(data, 0, NMon::IEvHttpInfoRes::EContentType::Custom));
if (message.empty()) {
TStringBuf dataParser(data);
if (dataParser.NextTok(' ') == "HTTP/1.1") {
TStringBuf code = dataParser.NextTok(' ');
if (code.size() == 3 && code[0] != '2') {
message = dataParser.NextTok('\n');
}
}
}
if (Span) {
if (error) {
Span.EndError(error);
if (message) {
Span.EndError(message);
} else {
Span.EndOk();
}
Expand Down
4 changes: 3 additions & 1 deletion ydb/core/viewer/protos/viewer.proto
Original file line number Diff line number Diff line change
Expand Up @@ -322,6 +322,7 @@ message TClusterInfo {
uint32 NodesTotal = 10;
uint32 NodesAlive = 11;
uint32 NumberOfCpus = 20;
uint32 CoresTotal = 24;
double CoresUsed = 21;
double LoadAverage = 22;
repeated NKikimrWhiteboard.TSystemStateInfo.TPoolStats PoolStats = 23;
Expand Down Expand Up @@ -358,7 +359,7 @@ message TStorageUsage {
SSD = 2;
}
EType Type = 1;
uint64 Size = 2;
optional uint64 Size = 2;
uint64 Limit = 3;
uint64 SoftQuota = 4;
uint64 HardQuota = 5;
Expand Down Expand Up @@ -394,6 +395,7 @@ message TTenant {
Ydb.Cms.DatabaseQuotas DatabaseQuotas = 42;
repeated TStorageUsage TablesStorage = 44;
repeated TStorageUsage DatabaseStorage = 45;
uint32 CoresTotal = 50;
}

message TTenants {
Expand Down
Loading
Loading