From 41c257d1e295d84f747d04dc38db49479459d949 Mon Sep 17 00:00:00 2001 From: Alexey Efimov Date: Thu, 25 Jul 2024 06:38:41 +0000 Subject: [PATCH] refactor viewer backend --- ydb/core/viewer/browse.h | 1 + ydb/core/viewer/json_blobindexstat.h | 30 -- ydb/core/viewer/json_bscontrollerinfo.h | 122 ------- ydb/core/viewer/json_handlers.cpp | 47 +++ ydb/core/viewer/json_handlers.h | 64 ++-- ydb/core/viewer/json_handlers_operation.cpp | 18 +- ydb/core/viewer/json_handlers_pdisk.cpp | 18 +- ydb/core/viewer/json_handlers_pq.cpp | 29 ++ ydb/core/viewer/json_handlers_scheme.cpp | 6 +- ydb/core/viewer/json_handlers_vdisk.cpp | 21 +- ydb/core/viewer/json_handlers_viewer.cpp | 159 +++++---- ydb/core/viewer/json_pipe_req.cpp | 13 + ydb/core/viewer/json_pipe_req.h | 73 +--- ydb/core/viewer/json_storage_base.h | 17 +- ydb/core/viewer/json_vdisk_req.h | 20 +- ydb/core/viewer/json_vdiskstat.h | 30 -- ydb/core/viewer/json_wb_req.h | 157 ++++----- ...peration_cancel.h => operation_cancel.cpp} | 12 +- ...peration_forget.h => operation_forget.cpp} | 12 +- .../{operation_get.h => operation_get.cpp} | 11 +- .../{operation_list.h => operation_list.cpp} | 11 +- .../viewer/{pdisk_info.h => pdisk_info.cpp} | 11 +- ...json_pdisk_restart.h => pdisk_restart.cpp} | 11 +- .../{pdisk_status.h => pdisk_status.cpp} | 11 +- ydb/core/viewer/query_autocomplete_helper.h | 1 + ...cheme_directory.h => scheme_directory.cpp} | 46 +-- ydb/core/viewer/storage_groups.cpp | 20 +- ydb/core/viewer/vdisk_blobindexstat.cpp | 31 ++ .../{json_vdisk_evict.h => vdisk_evict.cpp} | 11 +- .../{json_getblob.h => vdisk_getblob.cpp} | 34 +- ydb/core/viewer/vdisk_vdiskstat.cpp | 31 ++ ydb/core/viewer/viewer.cpp | 169 +--------- ydb/core/viewer/viewer.h | 26 -- .../viewer/{json_acl.h => viewer_acl.cpp} | 39 +-- ydb/core/viewer/viewer_autocomplete.cpp | 67 ++++ ...n_autocomplete.h => viewer_autocomplete.h} | 77 +---- .../{json_browse.h => viewer_browse.cpp} | 96 +++--- ydb/core/viewer/viewer_bscontrollerinfo.cpp | 103 ++++++ ydb/core/viewer/viewer_bsgroupinfo.cpp | 24 ++ ...son_bsgroupinfo.h => viewer_bsgroupinfo.h} | 19 +- ydb/core/viewer/viewer_capabilities.cpp | 40 +-- ...check_access.h => viewer_check_access.cpp} | 44 ++- .../{json_cluster.h => viewer_cluster.cpp} | 96 +++--- .../{json_compute.h => viewer_compute.cpp} | 164 +++++---- .../{json_config.h => viewer_config.cpp} | 38 +-- .../{json_content.h => viewer_content.cpp} | 113 +++---- .../{json_counters.h => viewer_counters.cpp} | 10 +- .../{json_describe.h => viewer_describe.cpp} | 209 ++++++------ ...onsumer.h => viewer_describe_consumer.cpp} | 11 +- ...ribe_topic.h => viewer_describe_topic.cpp} | 11 +- .../viewer/{json_graph.h => viewer_graph.cpp} | 92 +++--- ...n_healthcheck.h => viewer_healthcheck.cpp} | 150 ++++----- .../{json_hiveinfo.h => viewer_hiveinfo.cpp} | 148 ++++----- ...{json_hivestats.h => viewer_hivestats.cpp} | 111 +++---- .../{json_hotkeys.h => viewer_hotkeys.cpp} | 67 ++-- ...counters.h => viewer_labeled_counters.cpp} | 167 +++++----- .../{json_metainfo.h => viewer_metainfo.cpp} | 110 +++--- .../{json_netinfo.h => viewer_netinfo.cpp} | 101 +++--- .../{json_nodeinfo.h => viewer_nodeinfo.cpp} | 30 +- .../{json_nodelist.h => viewer_nodelist.cpp} | 71 ++-- .../viewer/{json_nodes.h => viewer_nodes.cpp} | 201 ++++++----- ydb/core/viewer/viewer_pdiskinfo.cpp | 20 ++ .../{json_pdiskinfo.h => viewer_pdiskinfo.h} | 19 +- ...nsumerinfo.h => viewer_pqconsumerinfo.cpp} | 131 ++++---- .../viewer/{json_query.h => viewer_query.cpp} | 14 +- .../{json_query_old.h => viewer_query_old.h} | 7 +- ydb/core/viewer/viewer_render.cpp | 62 ++++ .../viewer/{json_render.h => viewer_render.h} | 62 +--- ydb/core/viewer/viewer_request.cpp | 14 +- .../{json_storage.h => viewer_storage.cpp} | 312 +++++++++++------- ...orage_usage.h => viewer_storage_usage.cpp} | 126 ++++--- ydb/core/viewer/viewer_sysinfo.cpp | 20 ++ .../{json_sysinfo.h => viewer_sysinfo.h} | 18 +- ...etcounters.h => viewer_tabletcounters.cpp} | 110 +++--- ydb/core/viewer/viewer_tabletinfo.cpp | 96 ++++++ ...{json_tabletinfo.h => viewer_tabletinfo.h} | 109 +----- ...son_tenantinfo.h => viewer_tenantinfo.cpp} | 179 +++++----- .../{json_tenants.h => viewer_tenants.cpp} | 92 +++--- ...{json_topicinfo.h => viewer_topicinfo.cpp} | 116 +++---- ydb/core/viewer/viewer_ut.cpp | 7 +- ydb/core/viewer/viewer_vdiskinfo.cpp | 20 ++ .../{json_vdiskinfo.h => viewer_vdiskinfo.h} | 19 +- .../{json_whoami.h => viewer_whoami.cpp} | 99 +++--- ydb/core/viewer/ya.make | 128 ++++--- 84 files changed, 2605 insertions(+), 2857 deletions(-) delete mode 100644 ydb/core/viewer/json_blobindexstat.h delete mode 100644 ydb/core/viewer/json_bscontrollerinfo.h create mode 100644 ydb/core/viewer/json_handlers.cpp create mode 100644 ydb/core/viewer/json_handlers_pq.cpp delete mode 100644 ydb/core/viewer/json_vdiskstat.h rename ydb/core/viewer/{operation_cancel.h => operation_cancel.cpp} (92%) rename ydb/core/viewer/{operation_forget.h => operation_forget.cpp} (92%) rename ydb/core/viewer/{operation_get.h => operation_get.cpp} (91%) rename ydb/core/viewer/{operation_list.h => operation_list.cpp} (93%) rename ydb/core/viewer/{pdisk_info.h => pdisk_info.cpp} (97%) rename ydb/core/viewer/{json_pdisk_restart.h => pdisk_restart.cpp} (96%) rename ydb/core/viewer/{pdisk_status.h => pdisk_status.cpp} (97%) rename ydb/core/viewer/{scheme_directory.h => scheme_directory.cpp} (95%) create mode 100644 ydb/core/viewer/vdisk_blobindexstat.cpp rename ydb/core/viewer/{json_vdisk_evict.h => vdisk_evict.cpp} (97%) rename ydb/core/viewer/{json_getblob.h => vdisk_getblob.cpp} (82%) create mode 100644 ydb/core/viewer/vdisk_vdiskstat.cpp rename ydb/core/viewer/{json_acl.h => viewer_acl.cpp} (89%) create mode 100644 ydb/core/viewer/viewer_autocomplete.cpp rename ydb/core/viewer/{json_autocomplete.h => viewer_autocomplete.h} (89%) rename ydb/core/viewer/{json_browse.h => viewer_browse.cpp} (82%) create mode 100644 ydb/core/viewer/viewer_bscontrollerinfo.cpp create mode 100644 ydb/core/viewer/viewer_bsgroupinfo.cpp rename ydb/core/viewer/{json_bsgroupinfo.h => viewer_bsgroupinfo.h} (85%) rename ydb/core/viewer/{check_access.h => viewer_check_access.cpp} (79%) rename ydb/core/viewer/{json_cluster.h => viewer_cluster.cpp} (93%) rename ydb/core/viewer/{json_compute.h => viewer_compute.cpp} (91%) rename ydb/core/viewer/{json_config.h => viewer_config.cpp} (72%) rename ydb/core/viewer/{json_content.h => viewer_content.cpp} (74%) rename ydb/core/viewer/{json_counters.h => viewer_counters.cpp} (99%) rename ydb/core/viewer/{json_describe.h => viewer_describe.cpp} (80%) rename ydb/core/viewer/{json_describe_consumer.h => viewer_describe_consumer.cpp} (92%) rename ydb/core/viewer/{json_describe_topic.h => viewer_describe_topic.cpp} (92%) rename ydb/core/viewer/{json_graph.h => viewer_graph.cpp} (82%) rename ydb/core/viewer/{json_healthcheck.h => viewer_healthcheck.cpp} (82%) rename ydb/core/viewer/{json_hiveinfo.h => viewer_hiveinfo.cpp} (56%) rename ydb/core/viewer/{json_hivestats.h => viewer_hivestats.cpp} (62%) rename ydb/core/viewer/{json_hotkeys.h => viewer_hotkeys.cpp} (78%) rename ydb/core/viewer/{json_labeledcounters.h => viewer_labeled_counters.cpp} (71%) rename ydb/core/viewer/{json_metainfo.h => viewer_metainfo.cpp} (75%) rename ydb/core/viewer/{json_netinfo.h => viewer_netinfo.cpp} (90%) rename ydb/core/viewer/{json_nodeinfo.h => viewer_nodeinfo.cpp} (71%) rename ydb/core/viewer/{json_nodelist.h => viewer_nodelist.cpp} (73%) rename ydb/core/viewer/{json_nodes.h => viewer_nodes.cpp} (92%) create mode 100644 ydb/core/viewer/viewer_pdiskinfo.cpp rename ydb/core/viewer/{json_pdiskinfo.h => viewer_pdiskinfo.h} (82%) rename ydb/core/viewer/{json_pqconsumerinfo.h => viewer_pqconsumerinfo.cpp} (68%) rename ydb/core/viewer/{json_query.h => viewer_query.cpp} (99%) rename ydb/core/viewer/{json_query_old.h => viewer_query_old.h} (99%) create mode 100644 ydb/core/viewer/viewer_render.cpp rename ydb/core/viewer/{json_render.h => viewer_render.h} (87%) rename ydb/core/viewer/{json_storage.h => viewer_storage.cpp} (72%) rename ydb/core/viewer/{json_storage_usage.h => viewer_storage_usage.cpp} (59%) create mode 100644 ydb/core/viewer/viewer_sysinfo.cpp rename ydb/core/viewer/{json_sysinfo.h => viewer_sysinfo.h} (87%) rename ydb/core/viewer/{json_tabletcounters.h => viewer_tabletcounters.cpp} (80%) create mode 100644 ydb/core/viewer/viewer_tabletinfo.cpp rename ydb/core/viewer/{json_tabletinfo.h => viewer_tabletinfo.h} (86%) rename ydb/core/viewer/{json_tenantinfo.h => viewer_tenantinfo.cpp} (93%) rename ydb/core/viewer/{json_tenants.h => viewer_tenants.cpp} (73%) rename ydb/core/viewer/{json_topicinfo.h => viewer_topicinfo.cpp} (67%) create mode 100644 ydb/core/viewer/viewer_vdiskinfo.cpp rename ydb/core/viewer/{json_vdiskinfo.h => viewer_vdiskinfo.h} (88%) rename ydb/core/viewer/{json_whoami.h => viewer_whoami.cpp} (66%) diff --git a/ydb/core/viewer/browse.h b/ydb/core/viewer/browse.h index aa29d6c0f3a4..c904fed031ac 100644 --- a/ydb/core/viewer/browse.h +++ b/ydb/core/viewer/browse.h @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include diff --git a/ydb/core/viewer/json_blobindexstat.h b/ydb/core/viewer/json_blobindexstat.h deleted file mode 100644 index 2cdf56b4bc4f..000000000000 --- a/ydb/core/viewer/json_blobindexstat.h +++ /dev/null @@ -1,30 +0,0 @@ -#pragma once -#include -#include -#include -#include -#include -#include -#include "json_vdisk_req.h" - -namespace NKikimr { -namespace NViewer { - -using TJsonBlobIndexStat = TJsonVDiskRequest; - -template <> -struct TJsonRequestSummary { - static TString GetSummary() { - return "\"Get logoblob index stat from VDisk\""; - } -}; - -template <> -struct TJsonRequestDescription { - static TString GetDescription() { - return "\"Get logoblob index stat from VDisk\""; - } -}; - -} -} diff --git a/ydb/core/viewer/json_bscontrollerinfo.h b/ydb/core/viewer/json_bscontrollerinfo.h deleted file mode 100644 index cf1833742f57..000000000000 --- a/ydb/core/viewer/json_bscontrollerinfo.h +++ /dev/null @@ -1,122 +0,0 @@ -#pragma once -#include -#include -#include -#include -#include -#include "viewer.h" -#include "json_pipe_req.h" -#include - -namespace NKikimr { -namespace NViewer { - -using namespace NActors; - -class TJsonBSControllerInfo : public TViewerPipeClient { - using TThis = TJsonBSControllerInfo; - using TBase = TViewerPipeClient; - IViewer* Viewer; - NMon::TEvHttpInfo::TPtr Event; - TAutoPtr ControllerInfo; - TJsonSettings JsonSettings; - ui32 Timeout = 0; - -public: - TJsonBSControllerInfo(IViewer* viewer, NMon::TEvHttpInfo::TPtr &ev) - : Viewer(viewer) - , Event(ev) - {} - - void Bootstrap() override { - const auto& params(Event->Get()->Request.GetParams()); - JsonSettings.EnumAsNumbers = !FromStringWithDefault(params.Get("enums"), false); - JsonSettings.UI64AsString = !FromStringWithDefault(params.Get("ui64"), false); - Timeout = FromStringWithDefault(params.Get("timeout"), 10000); - InitConfig(params); - RequestBSControllerInfo(); - const auto ctx = TActivationContext::ActorContextFor(SelfId()); - Become(&TThis::StateRequestedInfo, ctx, TDuration::MilliSeconds(Timeout), new TEvents::TEvWakeup()); - } - - STATEFN(StateRequestedInfo) { - switch (ev->GetTypeRewrite()) { - hFunc(TEvBlobStorage::TEvResponseControllerInfo, Handle); - hFunc(TEvTabletPipe::TEvClientConnected, TBase::Handle); - cFunc(TEvents::TSystem::Wakeup, HandleTimeout); - } - } - - void Handle(TEvBlobStorage::TEvResponseControllerInfo::TPtr& ev) { - ControllerInfo = ev->Release(); - RequestDone(); - } - - void ReplyAndPassAway() override { - TStringStream json; - if (ControllerInfo != nullptr) { - TProtoToJson::ProtoToJson(json, ControllerInfo->Record); - } else { - json << "null"; - } - Send(Event->Sender, new NMon::TEvHttpInfoRes(Viewer->GetHTTPOKJSON(Event->Get(), json.Str()), 0, NMon::IEvHttpInfoRes::EContentType::Custom)); - PassAway(); - } - - void HandleTimeout() { - Send(Event->Sender, new NMon::TEvHttpInfoRes(Viewer->GetHTTPGATEWAYTIMEOUT(Event->Get()), 0, NMon::IEvHttpInfoRes::EContentType::Custom)); - PassAway(); - } -}; - -template <> -struct TJsonRequestSchema { - static YAML::Node GetSchema() { - return TProtoToYaml::ProtoToYamlSchema(); - } -}; - -template <> -struct TJsonRequestParameters { - static YAML::Node GetParameters() { - return YAML::Node(R"___( - - name: controller_id - in: query - description: storage controller identifier (tablet id) - required: true - type: string - - name: enums - in: query - description: convert enums to strings - required: false - type: boolean - - name: ui64 - in: query - description: return ui64 as number - required: false - type: boolean - - name: timeout - in: query - description: timeout in ms - required: false - type: integer - )___"); - } -}; - -template <> -struct TJsonRequestSummary { - static TString GetSummary() { - return "Storage controller information"; - } -}; - -template <> -struct TJsonRequestDescription { - static TString GetDescription() { - return "Returns information about storage controller"; - } -}; - -} -} diff --git a/ydb/core/viewer/json_handlers.cpp b/ydb/core/viewer/json_handlers.cpp new file mode 100644 index 000000000000..7f7b070dd37b --- /dev/null +++ b/ydb/core/viewer/json_handlers.cpp @@ -0,0 +1,47 @@ +#include "json_handlers.h" +#include + +namespace NKikimr::NViewer { + +TSimpleYamlBuilder::TSimpleYamlBuilder(TInitializer initializer) { + Method = Root[TString(initializer.Method)]; + if (initializer.Url) { + Method["tags"].push_back(TString(initializer.Url.After('/').Before('/'))); + } + if (initializer.Tag) { + Method["tags"].push_back(TString(initializer.Tag)); + } + if (initializer.Summary) { + Method["summary"] = TString(initializer.Summary); + } + if (initializer.Description) { + Method["description"] = TString(initializer.Description); + } +} + +void TSimpleYamlBuilder::SetParameters(YAML::Node parameters) { + Method["parameters"] = parameters; +} + +void TSimpleYamlBuilder::AddParameter(TParameter parameter) { + YAML::Node param; + param["in"] = "query"; + param["name"] = TString(parameter.Name); + if (parameter.Description) { + param["description"] = TString(parameter.Description); + } + if (parameter.Type) { + param["type"] = TString(parameter.Type); + } + if (parameter.Default) { + param["default"] = TString(parameter.Default); + } + param["required"] = parameter.Required; + Method["parameters"].push_back(param); +} + +void TSimpleYamlBuilder::SetResponseSchema(YAML::Node schema) { + Method["responses"]["200"]["content"]["application/json"]["schema"] = schema; +} + +} diff --git a/ydb/core/viewer/json_handlers.h b/ydb/core/viewer/json_handlers.h index 0a994546740d..d359f98438e2 100644 --- a/ydb/core/viewer/json_handlers.h +++ b/ydb/core/viewer/json_handlers.h @@ -9,43 +9,24 @@ class TJsonHandlerBase { public: virtual ~TJsonHandlerBase() = default; virtual IActor* CreateRequestActor(IViewer* viewer, NMon::TEvHttpInfo::TPtr& event) = 0; - virtual YAML::Node GetResponseJsonSchema() = 0; - virtual TString GetRequestSummary() = 0; - virtual TString GetRequestDescription() = 0; - virtual YAML::Node GetRequestParameters() = 0; virtual YAML::Node GetRequestSwagger() = 0; }; template class TJsonHandler : public TJsonHandlerBase { public: - IActor* CreateRequestActor(IViewer* viewer, NMon::TEvHttpInfo::TPtr& event) override { - return new ActorRequestType(viewer, event); - } + YAML::Node Swagger; - YAML::Node GetResponseJsonSchema() override { - static YAML::Node jsonSchema = TJsonRequestSchema::GetSchema(); - return jsonSchema; - } + TJsonHandler(YAML::Node swagger) + : Swagger(swagger) + {} - TString GetRequestSummary() override { - static TString summary = TJsonRequestSummary::GetSummary(); - return summary; - } - - TString GetRequestDescription() override { - static TString description = TJsonRequestDescription::GetDescription(); - return description; - } - - YAML::Node GetRequestParameters() override { - static YAML::Node parameters = TJsonRequestParameters::GetParameters(); - return parameters; + IActor* CreateRequestActor(IViewer* viewer, NMon::TEvHttpInfo::TPtr& event) override { + return new ActorRequestType(viewer, event); } YAML::Node GetRequestSwagger() override { - static YAML::Node swagger = TJsonRequestSwagger::GetSwagger(); - return swagger; + return Swagger; } }; @@ -69,4 +50,35 @@ struct TJsonHandlers { } }; +class TSimpleYamlBuilder { +public: + struct TInitializer { + TStringBuf Method; + TStringBuf Tag; + TStringBuf Url; + TStringBuf Summary; + TStringBuf Description; + }; + + struct TParameter { + TStringBuf Name; + TStringBuf Description; + TStringBuf Type; + TStringBuf Default; + bool Required = false; + }; + + YAML::Node Root; + YAML::Node Method; + + TSimpleYamlBuilder(TInitializer initializer); + void SetParameters(YAML::Node parameters); + void AddParameter(TParameter parameter); + void SetResponseSchema(YAML::Node schema); + + operator YAML::Node() { + return Root; + } +}; + } // namespace NKikimr::NViewer diff --git a/ydb/core/viewer/json_handlers_operation.cpp b/ydb/core/viewer/json_handlers_operation.cpp index 4e9c90da6d79..f74e2b665fa1 100644 --- a/ydb/core/viewer/json_handlers_operation.cpp +++ b/ydb/core/viewer/json_handlers_operation.cpp @@ -1,17 +1,17 @@ #include "json_handlers.h" -#include "operation_get.h" -#include "operation_list.h" -#include "operation_cancel.h" -#include "operation_forget.h" - namespace NKikimr::NViewer { +void InitOperationGetJsonHandler(TJsonHandlers& handlers); +void InitOperationListJsonHandler(TJsonHandlers& handlers); +void InitOperationCancelJsonHandler(TJsonHandlers& handlers); +void InitOperationForgetJsonHandler(TJsonHandlers& handlers); + void InitOperationJsonHandlers(TJsonHandlers& jsonHandlers) { - jsonHandlers.AddHandler("/operation/get", new TJsonHandler); - jsonHandlers.AddHandler("/operation/list", new TJsonHandler); - jsonHandlers.AddHandler("/operation/cancel", new TJsonHandler); - jsonHandlers.AddHandler("/operation/forget", new TJsonHandler); + InitOperationGetJsonHandler(jsonHandlers); + InitOperationListJsonHandler(jsonHandlers); + InitOperationCancelJsonHandler(jsonHandlers); + InitOperationForgetJsonHandler(jsonHandlers); } } diff --git a/ydb/core/viewer/json_handlers_pdisk.cpp b/ydb/core/viewer/json_handlers_pdisk.cpp index ef99307e25be..3483d90bcf9d 100644 --- a/ydb/core/viewer/json_handlers_pdisk.cpp +++ b/ydb/core/viewer/json_handlers_pdisk.cpp @@ -1,19 +1,15 @@ -#include -#include - #include "json_handlers.h" -#include "json_pdisk_restart.h" -#include "pdisk_info.h" -#include "pdisk_status.h" - - namespace NKikimr::NViewer { +void InitPDiskInfoJsonHandler(TJsonHandlers& handlers); +void InitPDiskRestartJsonHandler(TJsonHandlers& handlers); +void InitPDiskStatusJsonHandler(TJsonHandlers& handlers); + void InitPDiskJsonHandlers(TJsonHandlers& jsonHandlers) { - jsonHandlers.AddHandler("/pdisk/info", new TJsonHandler); - jsonHandlers.AddHandler("/pdisk/restart", new TJsonHandler); - jsonHandlers.AddHandler("/pdisk/status", new TJsonHandler); + InitPDiskInfoJsonHandler(jsonHandlers); + InitPDiskRestartJsonHandler(jsonHandlers); + InitPDiskStatusJsonHandler(jsonHandlers); } } diff --git a/ydb/core/viewer/json_handlers_pq.cpp b/ydb/core/viewer/json_handlers_pq.cpp new file mode 100644 index 000000000000..d3503b95b7f9 --- /dev/null +++ b/ydb/core/viewer/json_handlers_pq.cpp @@ -0,0 +1,29 @@ +#include "viewer.h" +#include "browse_pq.h" + +namespace NKikimr::NViewer { + +void SetupPQVirtualHandlers(IViewer* viewer) { + viewer->RegisterVirtualHandler( + NKikimrViewer::EObjectType::Root, + [] (const TActorId& owner, const IViewer::TBrowseContext& browseContext) -> IActor* { + return new NViewerPQ::TBrowseRoot(owner, browseContext); + }); + viewer->RegisterVirtualHandler( + NKikimrViewer::EObjectType::Consumers, + [] (const TActorId& owner, const IViewer::TBrowseContext& browseContext) -> IActor* { + return new NViewerPQ::TBrowseConsumers(owner, browseContext); + }); + viewer->RegisterVirtualHandler( + NKikimrViewer::EObjectType::Consumer, + [] (const TActorId& owner, const IViewer::TBrowseContext& browseContext) -> IActor* { + return new NViewerPQ::TBrowseConsumer(owner, browseContext); + }); + viewer->RegisterVirtualHandler( + NKikimrViewer::EObjectType::Topic, + [] (const TActorId& owner, const IViewer::TBrowseContext& browseContext) -> IActor* { + return new NViewerPQ::TBrowseTopic(owner, browseContext); + }); +} + +} diff --git a/ydb/core/viewer/json_handlers_scheme.cpp b/ydb/core/viewer/json_handlers_scheme.cpp index c5dc07f28b28..5493eb7582b4 100644 --- a/ydb/core/viewer/json_handlers_scheme.cpp +++ b/ydb/core/viewer/json_handlers_scheme.cpp @@ -1,11 +1,11 @@ #include "json_handlers.h" -#include "scheme_directory.h" - namespace NKikimr::NViewer { +void InitSchemeDirectoryHandler(TJsonHandlers& handlers); + void InitSchemeJsonHandlers(TJsonHandlers& jsonHandlers) { - jsonHandlers.AddHandler("/scheme/directory", new TJsonSchemeDirectoryHandler()); + InitSchemeDirectoryHandler(jsonHandlers); } } diff --git a/ydb/core/viewer/json_handlers_vdisk.cpp b/ydb/core/viewer/json_handlers_vdisk.cpp index 49c869692f08..e78b7f2ccc64 100644 --- a/ydb/core/viewer/json_handlers_vdisk.cpp +++ b/ydb/core/viewer/json_handlers_vdisk.cpp @@ -1,20 +1,17 @@ -#include -#include - #include "json_handlers.h" -#include "json_vdiskstat.h" -#include "json_getblob.h" -#include "json_blobindexstat.h" -#include "json_vdisk_evict.h" - namespace NKikimr::NViewer { +void InitVDiskStatJsonHandler(TJsonHandlers& handlers); +void InitVDiskGetBlobJsonHandler(TJsonHandlers& handlers); +void InitVDiskBlobIndexStatJsonHandler(TJsonHandlers& handlers); +void InitVDiskEvictJsonHandler(TJsonHandlers& handlers); + void InitVDiskJsonHandlers(TJsonHandlers& jsonHandlers) { - jsonHandlers.AddHandler("/vdisk/vdiskstat", new TJsonHandler); - jsonHandlers.AddHandler("/vdisk/getblob", new TJsonHandler); - jsonHandlers.AddHandler("/vdisk/blobindexstat", new TJsonHandler); - jsonHandlers.AddHandler("/vdisk/evict", new TJsonHandler); + InitVDiskStatJsonHandler(jsonHandlers); + InitVDiskGetBlobJsonHandler(jsonHandlers); + InitVDiskBlobIndexStatJsonHandler(jsonHandlers); + InitVDiskEvictJsonHandler(jsonHandlers); } } diff --git a/ydb/core/viewer/json_handlers_viewer.cpp b/ydb/core/viewer/json_handlers_viewer.cpp index e037c4f4ea84..ea1f794d575c 100644 --- a/ydb/core/viewer/json_handlers_viewer.cpp +++ b/ydb/core/viewer/json_handlers_viewer.cpp @@ -1,92 +1,89 @@ -#include - #include "json_handlers.h" -#include "json_nodelist.h" -#include "json_nodeinfo.h" -#include "json_vdiskinfo.h" -#include "json_pdiskinfo.h" -#include "json_describe.h" -#include "json_describe_topic.h" -#include "json_describe_consumer.h" -#include "json_hotkeys.h" -#include "json_sysinfo.h" -#include "json_tabletinfo.h" -#include "json_hiveinfo.h" -#include "json_bsgroupinfo.h" -#include "json_bscontrollerinfo.h" -#include "json_config.h" -#include "json_counters.h" -#include "json_topicinfo.h" -#include "json_pqconsumerinfo.h" -#include "json_tabletcounters.h" -#include "json_storage.h" -#include "json_storage_usage.h" -#include "json_metainfo.h" -#include "json_browse.h" -#include "json_cluster.h" -#include "json_content.h" -#include "json_labeledcounters.h" -#include "json_tenants.h" -#include "json_hivestats.h" -#include "json_tenantinfo.h" -#include "json_whoami.h" -#include "json_query.h" -#include "json_netinfo.h" -#include "json_compute.h" -#include "json_healthcheck.h" -#include "json_nodes.h" -#include "json_acl.h" -#include "json_graph.h" -#include "json_render.h" -#include "json_autocomplete.h" -#include "check_access.h" - namespace NKikimr::NViewer { void InitViewerCapabilitiesJsonHandler(TJsonHandlers& jsonHandlers); +void InitViewerNodelistJsonHandler(TJsonHandlers& jsonHandlers); +void InitViewerNodeInfoJsonHandler(TJsonHandlers& jsonHandlers); +void InitViewerSysInfoJsonHandler(TJsonHandlers& jsonHandlers); +void InitViewerVDiskInfoJsonHandler(TJsonHandlers& jsonHandlers); +void InitViewerPDiskInfoJsonHandler(TJsonHandlers& jsonHandlers); +void InitViewerTabletInfoJsonHandler(TJsonHandlers& jsonHandlers); +void InitViewerDescribeJsonHandler(TJsonHandlers& jsonHandlers); +void InitViewerDescribeTopicJsonHandler(TJsonHandlers& jsonHandlers); +void InitViewerDescribeConsumerJsonHandler(TJsonHandlers& jsonHandlers); +void InitViewerHotkeysJsonHandler(TJsonHandlers& jsonHandlers); +void InitViewerHiveInfoJsonHandler(TJsonHandlers& jsonHandlers); +void InitViewerBSGroupInfoJsonHandler(TJsonHandlers& jsonHandlers); +void InitViewerBSControllerInfoJsonHandler(TJsonHandlers& jsonHandlers); +void InitViewerConfigJsonHandler(TJsonHandlers& jsonHandlers); +void InitViewerCountersJsonHandler(TJsonHandlers& jsonHandlers); +void InitViewerTopicInfoJsonHandler(TJsonHandlers& jsonHandlers); +void InitViewerPQConsumerInfoJsonHandler(TJsonHandlers& jsonHandlers); +void InitViewerTabletCountersJsonHandler(TJsonHandlers& jsonHandlers); +void InitViewerStorageJsonHandler(TJsonHandlers& jsonHandlers); +void InitViewerStorageUsageJsonHandler(TJsonHandlers& jsonHandlers); +void InitViewerMetaInfoJsonHandler(TJsonHandlers& jsonHandlers); +void InitViewerBrowseJsonHandler(TJsonHandlers& jsonHandlers); +void InitViewerClusterJsonHandler(TJsonHandlers& jsonHandlers); +void InitViewerContentJsonHandler(TJsonHandlers& jsonHandlers); +void InitViewerLabeledCountersJsonHandler(TJsonHandlers& jsonHandlers); +void InitViewerTenantsJsonHandler(TJsonHandlers& jsonHandlers); +void InitViewerHiveStatsJsonHandler(TJsonHandlers& jsonHandlers); +void InitViewerTenantInfoJsonHandler(TJsonHandlers& jsonHandlers); +void InitViewerWhoAmIJsonHandler(TJsonHandlers& jsonHandlers); +void InitViewerQueryJsonHandler(TJsonHandlers& jsonHandlers); +void InitViewerNetInfoJsonHandler(TJsonHandlers& jsonHandlers); +void InitViewerComputeJsonHandler(TJsonHandlers& jsonHandlers); +void InitViewerHealthCheckJsonHandler(TJsonHandlers& jsonHandlers); +void InitViewerNodesJsonHandler(TJsonHandlers& jsonHandlers); +void InitViewerACLJsonHandler(TJsonHandlers& jsonHandlers); +void InitViewerGraphJsonHandler(TJsonHandlers& jsonHandlers); +void InitViewerRenderJsonHandler(TJsonHandlers& jsonHandlers); +void InitViewerAutocompleteJsonHandler(TJsonHandlers& jsonHandlers); +void InitViewerCheckAccessJsonHandler(TJsonHandlers& jsonHandlers); void InitViewerJsonHandlers(TJsonHandlers& jsonHandlers) { InitViewerCapabilitiesJsonHandler(jsonHandlers); - jsonHandlers.AddHandler("/viewer/nodelist", new TJsonHandler); - jsonHandlers.AddHandler("/viewer/nodeinfo", new TJsonHandler); - jsonHandlers.AddHandler("/viewer/sysinfo", new TJsonHandler); - jsonHandlers.AddHandler("/viewer/vdiskinfo", new TJsonHandler); - jsonHandlers.AddHandler("/viewer/pdiskinfo", new TJsonHandler); - jsonHandlers.AddHandler("/viewer/tabletinfo", new TJsonHandler); - jsonHandlers.AddHandler("/viewer/describe", new TJsonHandler); - jsonHandlers.AddHandler("/viewer/describe_topic", new TJsonHandler); - jsonHandlers.AddHandler("/viewer/describe_consumer", new TJsonHandler); - jsonHandlers.AddHandler("/viewer/hotkeys", new TJsonHandler); - jsonHandlers.AddHandler("/viewer/hiveinfo", new TJsonHandler); - jsonHandlers.AddHandler("/viewer/bsgroupinfo", new TJsonHandler); - jsonHandlers.AddHandler("/viewer/bscontrollerinfo", new TJsonHandler); - jsonHandlers.AddHandler("/viewer/config", new TJsonHandler); - jsonHandlers.AddHandler("/viewer/counters", new TJsonHandler); - jsonHandlers.AddHandler("/viewer/topicinfo", new TJsonHandler); - jsonHandlers.AddHandler("/viewer/pqconsumerinfo", new TJsonHandler); - jsonHandlers.AddHandler("/viewer/tabletcounters", new TJsonHandler); - jsonHandlers.AddHandler("/viewer/storage", new TJsonHandler); - jsonHandlers.AddHandler("/viewer/storage_usage", new TJsonHandler); - jsonHandlers.AddHandler("/viewer/metainfo", new TJsonHandler); - jsonHandlers.AddHandler("/viewer/browse", new TJsonHandler); - jsonHandlers.AddHandler("/viewer/cluster", new TJsonHandler); - jsonHandlers.AddHandler("/viewer/content", new TJsonHandler); - jsonHandlers.AddHandler("/viewer/labeledcounters", new TJsonHandler); - jsonHandlers.AddHandler("/viewer/tenants", new TJsonHandler); - jsonHandlers.AddHandler("/viewer/hivestats", new TJsonHandler); - jsonHandlers.AddHandler("/viewer/tenantinfo", new TJsonHandler); - jsonHandlers.AddHandler("/viewer/whoami", new TJsonHandler); - jsonHandlers.AddHandler("/viewer/query", new TJsonHandler); - jsonHandlers.AddHandler("/viewer/netinfo", new TJsonHandler); - jsonHandlers.AddHandler("/viewer/compute", new TJsonHandler); - jsonHandlers.AddHandler("/viewer/healthcheck", new TJsonHandler); - jsonHandlers.AddHandler("/viewer/nodes", new TJsonHandler); - jsonHandlers.AddHandler("/viewer/acl", new TJsonHandler); - jsonHandlers.AddHandler("/viewer/graph", new TJsonHandler); - jsonHandlers.AddHandler("/viewer/render", new TJsonHandler); - jsonHandlers.AddHandler("/viewer/autocomplete", new TJsonHandler); - jsonHandlers.AddHandler("/viewer/check_access", new TJsonHandler); + InitViewerNodelistJsonHandler(jsonHandlers); + InitViewerNodeInfoJsonHandler(jsonHandlers); + InitViewerSysInfoJsonHandler(jsonHandlers); + InitViewerVDiskInfoJsonHandler(jsonHandlers); + InitViewerPDiskInfoJsonHandler(jsonHandlers); + InitViewerTabletInfoJsonHandler(jsonHandlers); + InitViewerDescribeJsonHandler(jsonHandlers); + InitViewerDescribeTopicJsonHandler(jsonHandlers); + InitViewerDescribeConsumerJsonHandler(jsonHandlers); + InitViewerHotkeysJsonHandler(jsonHandlers); + InitViewerHiveInfoJsonHandler(jsonHandlers); + InitViewerBSGroupInfoJsonHandler(jsonHandlers); + InitViewerBSControllerInfoJsonHandler(jsonHandlers); + InitViewerConfigJsonHandler(jsonHandlers); + InitViewerCountersJsonHandler(jsonHandlers); + InitViewerTopicInfoJsonHandler(jsonHandlers); + InitViewerPQConsumerInfoJsonHandler(jsonHandlers); + InitViewerTabletCountersJsonHandler(jsonHandlers); + InitViewerStorageJsonHandler(jsonHandlers); + InitViewerStorageUsageJsonHandler(jsonHandlers); + InitViewerMetaInfoJsonHandler(jsonHandlers); + InitViewerBrowseJsonHandler(jsonHandlers); + InitViewerClusterJsonHandler(jsonHandlers); + InitViewerContentJsonHandler(jsonHandlers); + InitViewerLabeledCountersJsonHandler(jsonHandlers); + InitViewerTenantsJsonHandler(jsonHandlers); + InitViewerHiveStatsJsonHandler(jsonHandlers); + InitViewerTenantInfoJsonHandler(jsonHandlers); + InitViewerWhoAmIJsonHandler(jsonHandlers); + InitViewerQueryJsonHandler(jsonHandlers); + InitViewerNetInfoJsonHandler(jsonHandlers); + InitViewerComputeJsonHandler(jsonHandlers); + InitViewerHealthCheckJsonHandler(jsonHandlers); + InitViewerNodesJsonHandler(jsonHandlers); + InitViewerACLJsonHandler(jsonHandlers); + InitViewerGraphJsonHandler(jsonHandlers); + InitViewerRenderJsonHandler(jsonHandlers); + InitViewerAutocompleteJsonHandler(jsonHandlers); + InitViewerCheckAccessJsonHandler(jsonHandlers); } } diff --git a/ydb/core/viewer/json_pipe_req.cpp b/ydb/core/viewer/json_pipe_req.cpp index b759922719c9..49f683caf101 100644 --- a/ydb/core/viewer/json_pipe_req.cpp +++ b/ydb/core/viewer/json_pipe_req.cpp @@ -1,4 +1,5 @@ #include "json_pipe_req.h" +#include namespace NKikimr::NViewer { @@ -410,6 +411,10 @@ TString TViewerPipeClient::GetHTTPOKJSON(TString response, TInstant lastModified return Viewer->GetHTTPOKJSON(GetRequest(), std::move(response), lastModified); } +TString TViewerPipeClient::GetHTTPOKJSON(const NJson::TJsonValue& response, TInstant lastModified) { + return GetHTTPOKJSON(NJson::WriteJson(response, false), lastModified); +} + TString TViewerPipeClient::GetHTTPGATEWAYTIMEOUT(TString contentType, TString response) { return Viewer->GetHTTPGATEWAYTIMEOUT(GetRequest(), std::move(contentType), std::move(response)); } @@ -422,6 +427,10 @@ TString TViewerPipeClient::GetHTTPINTERNALERROR(TString contentType, TString res return Viewer->GetHTTPINTERNALERROR(GetRequest(), std::move(contentType), std::move(response)); } +TString TViewerPipeClient::GetHTTPFORBIDDEN(TString contentType, TString response) { + return Viewer->GetHTTPFORBIDDEN(GetRequest(), std::move(contentType), std::move(response)); +} + TString TViewerPipeClient::MakeForward(const std::vector& nodes) { return Viewer->MakeForward(GetRequest(), nodes); } @@ -443,6 +452,10 @@ void TViewerPipeClient::Handle(TEvTabletPipe::TEvClientConnected::TPtr& ev) { } } +void TViewerPipeClient::HandleTimeout() { + ReplyAndPassAway(GetHTTPGATEWAYTIMEOUT()); +} + void TViewerPipeClient::PassAway() { ClosePipes(); TBase::PassAway(); diff --git a/ydb/core/viewer/json_pipe_req.h b/ydb/core/viewer/json_pipe_req.h index d7ecd55d6c9c..456bf4f3e84f 100644 --- a/ydb/core/viewer/json_pipe_req.h +++ b/ydb/core/viewer/json_pipe_req.h @@ -23,6 +23,7 @@ namespace NViewer { using namespace NKikimr; using namespace NSchemeCache; using NNodeWhiteboard::TNodeId; +using NNodeWhiteboard::TTabletId; class TViewerPipeClient : public TActorBootstrapped { using TBase = TActorBootstrapped; @@ -50,7 +51,7 @@ class TViewerPipeClient : public TActorBootstrapped { ui32 Requests = 0; }; - std::unordered_map PipeInfo; + std::unordered_map PipeInfo; struct TDelayedRequest { std::unique_ptr Event; @@ -152,17 +153,11 @@ class TViewerPipeClient : public TActorBootstrapped { NTabletPipe::TClientConfig GetPipeClientConfig(); ~TViewerPipeClient(); - TViewerPipeClient(); - TViewerPipeClient(IViewer* viewer, NMon::TEvHttpInfo::TPtr& ev); - - TActorId ConnectTabletPipe(NNodeWhiteboard::TTabletId tabletId); - + TActorId ConnectTabletPipe(TTabletId tabletId); void SendEvent(std::unique_ptr event); - void SendRequest(TActorId recipient, IEventBase* ev, ui32 flags = 0, ui64 cookie = 0, NWilson::TTraceId traceId = {}); - void SendRequestToPipe(TActorId pipe, IEventBase* ev, ui64 cookie = 0, NWilson::TTraceId traceId = {}); template @@ -180,107 +175,69 @@ class TViewerPipeClient : public TActorBootstrapped { } void SendDelayedRequests(); + void RequestHiveDomainStats(TTabletId hiveId); + void RequestHiveNodeStats(TTabletId hiveId, TPathId pathId); + void RequestHiveStorageStats(TTabletId hiveId); - void RequestHiveDomainStats(NNodeWhiteboard::TTabletId hiveId); - - void RequestHiveNodeStats(NNodeWhiteboard::TTabletId hiveId, TPathId pathId); - - void RequestHiveStorageStats(NNodeWhiteboard::TTabletId hiveId); - - NNodeWhiteboard::TTabletId GetConsoleId() { + TTabletId GetConsoleId() { return MakeConsoleID(); } - TRequestResponse MakeRequestHiveStorageStats(NNodeWhiteboard::TTabletId hiveId); + TTabletId GetBSControllerId() { + return MakeBSControllerID(); + } + TRequestResponse MakeRequestHiveStorageStats(TTabletId hiveId); void RequestConsoleListTenants(); - TRequestResponse MakeRequestConsoleListTenants(); - void RequestConsoleGetTenantStatus(const TString& path); - - NNodeWhiteboard::TTabletId GetBSControllerId() { - return MakeBSControllerID(); - } - void RequestBSControllerConfig(); - void RequestBSControllerConfigWithStoragePools(); - TRequestResponse MakeRequestBSControllerConfigWithStoragePools(); - void RequestBSControllerInfo(); - void RequestBSControllerSelectGroups(THolder request); - TRequestResponse MakeRequestBSControllerSelectGroups(THolder request, ui64 cookie = 0); - void RequestBSControllerPDiskRestart(ui32 nodeId, ui32 pdiskId, bool force = false); - void RequestBSControllerVDiskEvict(ui32 groupId, ui32 groupGeneration, ui32 failRealmIdx, ui32 failDomainIdx, ui32 vdiskIdx, bool force = false); - TRequestResponse RequestBSControllerPDiskInfo(ui32 nodeId, ui32 pdiskId); - TRequestResponse RequestBSControllerVDiskInfo(ui32 nodeId, ui32 pdiskId); - TRequestResponse RequestBSControllerGroups(); - TRequestResponse RequestBSControllerPools(); - TRequestResponse RequestBSControllerVSlots(); - TRequestResponse RequestBSControllerPDisks(); - void RequestBSControllerPDiskUpdateStatus(const NKikimrBlobStorage::TUpdateDriveStatus& driveStatus, bool force = false); - void RequestSchemeCacheNavigate(const TString& path); - void RequestSchemeCacheNavigate(const TPathId& pathId); - TRequestResponse MakeRequestSchemeCacheNavigate(const TString& path, ui64 cookie = 0); - TRequestResponse MakeRequestSchemeCacheNavigate(TPathId pathId, ui64 cookie = 0); - void RequestTxProxyDescribe(const TString& path); - void RequestStateStorageEndpointsLookup(const TString& path); - void RequestStateStorageMetadataCacheEndpointsLookup(const TString& path); - std::vector GetNodesFromBoardReply(TEvStateStorage::TEvBoardInfo::TPtr& ev); - void InitConfig(const TCgiParameters& params); - void InitConfig(const TRequestSettings& settings); - void ClosePipes(); - - ui32 FailPipeConnect(NNodeWhiteboard::TTabletId tabletId); + ui32 FailPipeConnect(TTabletId tabletId); bool IsLastRequest() const { return Requests == 1; } TRequestState GetRequest() const; - void ReplyAndPassAway(TString data, const TString& error = {}); TString GetHTTPOK(TString contentType = {}, TString response = {}, TInstant lastModified = {}); - TString GetHTTPOKJSON(TString response = {}, TInstant lastModified = {}); - + TString GetHTTPOKJSON(const NJson::TJsonValue& response, TInstant lastModified = {}); TString GetHTTPGATEWAYTIMEOUT(TString contentType = {}, TString response = {}); - TString GetHTTPBADREQUEST(TString contentType = {}, TString response = {}); - TString GetHTTPINTERNALERROR(TString contentType = {}, TString response = {}); - + TString GetHTTPFORBIDDEN(TString contentType = {}, TString response = {}); TString MakeForward(const std::vector& nodes); void RequestDone(ui32 requests = 1); - void Handle(TEvTabletPipe::TEvClientConnected::TPtr& ev); - + void HandleTimeout(); void PassAway() override; }; diff --git a/ydb/core/viewer/json_storage_base.h b/ydb/core/viewer/json_storage_base.h index 986127c6e231..15172fd5de17 100644 --- a/ydb/core/viewer/json_storage_base.h +++ b/ydb/core/viewer/json_storage_base.h @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include @@ -10,8 +11,8 @@ #include "viewer.h" #include "viewer_helper.h" #include "json_pipe_req.h" -#include "json_vdiskinfo.h" -#include "json_pdiskinfo.h" +#include "wb_merge.h" +#include "viewer_bsgroupinfo.h" template<> struct std::hash { @@ -31,8 +32,7 @@ struct std::equal_to { } }; -namespace NKikimr { -namespace NViewer { +namespace NKikimr::NViewer { using namespace NActors; using namespace NNodeWhiteboard; @@ -104,10 +104,10 @@ class TJsonStorageBase : public TViewerPipeClient { TString Erasure; ui32 Degraded; float Usage; - uint64 Used; - uint64 Limit; - uint64 Read; - uint64 Write; + ui64 Used; + ui64 Limit; + ui64 Read; + ui64 Write; TGroupRow() : Used(0) @@ -561,4 +561,3 @@ class TJsonStorageBase : public TViewerPipeClient { }; } -} diff --git a/ydb/core/viewer/json_vdisk_req.h b/ydb/core/viewer/json_vdisk_req.h index 09d1ad1ab64b..7127501065ad 100644 --- a/ydb/core/viewer/json_vdisk_req.h +++ b/ydb/core/viewer/json_vdisk_req.h @@ -7,12 +7,10 @@ #include "viewer.h" #include "json_pipe_req.h" -namespace NKikimr { -namespace NViewer { +namespace NKikimr::NViewer { using namespace NActors; - template struct TJsonVDiskRequestHelper { static std::unique_ptr MakeRequest(NMon::TEvHttpInfo::TPtr &, TString *) { @@ -24,7 +22,6 @@ struct TJsonVDiskRequestHelper { } }; - template class TJsonVDiskRequest : public TViewerPipeClient { enum EEv { @@ -199,10 +196,11 @@ class TJsonVDiskRequest : public TViewerPipeClient { void ReplyAndPassAway() override { ReplyAndPassAway({}); } -}; -template -struct TJsonRequestParameters> { + static YAML::Node GetSchema() { + return TProtoToYaml::ProtoToYamlSchema(); + } + static YAML::Node GetParameters() { return YAML::Load(R"___( - name: node_id @@ -251,12 +249,4 @@ struct TJsonRequestParameters> { } }; -template -struct TJsonRequestSchema> { - static YAML::Node GetSchema() { - return TProtoToYaml::ProtoToYamlSchema(); - } -}; - -} } diff --git a/ydb/core/viewer/json_vdiskstat.h b/ydb/core/viewer/json_vdiskstat.h deleted file mode 100644 index 8aaa81ed1a9d..000000000000 --- a/ydb/core/viewer/json_vdiskstat.h +++ /dev/null @@ -1,30 +0,0 @@ -#pragma once -#include -#include -#include -#include -#include -#include -#include "json_vdisk_req.h" - -namespace NKikimr { -namespace NViewer { - -using TJsonVDiskStat = TJsonVDiskRequest; - -template <> -struct TJsonRequestSummary { - static TString GetSummary() { - return "VDisk statistic"; - } -}; - -template <> -struct TJsonRequestDescription { - static TString GetDescription() { - return "VDisk statistic"; - } -}; - -} -} diff --git a/ydb/core/viewer/json_wb_req.h b/ydb/core/viewer/json_wb_req.h index 03bc949d4ebf..2c53909fc4d9 100644 --- a/ydb/core/viewer/json_wb_req.h +++ b/ydb/core/viewer/json_wb_req.h @@ -14,15 +14,14 @@ #include "wb_req.h" #include "log.h" -namespace NKikimr { -namespace NViewer { +namespace NKikimr::NViewer { using namespace NActors; using namespace NNodeWhiteboard; template class TJsonWhiteboardRequest : public TWhiteboardRequest { -protected: +public: using TThis = TJsonWhiteboardRequest; using TBase = TWhiteboardRequest; using TResponseType = typename TResponseEventType::ProtoRecordType; @@ -30,7 +29,6 @@ class TJsonWhiteboardRequest : public TWhiteboardRequest -struct TJsonRequestParameters> { - static YAML::Node GetParameters() { - return YAML::Load(R"___( - - name: node_id - in: query - description: node identifier - required: false - type: integer - - name: merge - in: query - description: merge information from nodes - required: false - type: boolean - - name: group - in: query - description: group information by field - required: false - type: string - - name: all - in: query - description: return all possible key combinations (for enums only) - required: false - type: boolean - - name: filter - in: query - description: filter information by field - required: false - type: string - - name: alive - in: query - description: request from alive (connected) nodes only - required: false - type: boolean - - name: enums - in: query - description: convert enums to strings - required: false - type: boolean - - name: ui64 - in: query - description: return ui64 as number - required: false - type: boolean - - name: timeout - in: query - description: timeout in ms - required: false - type: integer - - name: retries - in: query - description: number of retries - required: false - type: integer - - name: retry_period - in: query - description: retry period in ms - required: false - type: integer - default: 500 - - name: static - in: query - description: request from static nodes only - required: false - type: boolean - - name: since - in: query - description: filter by update time - required: false - type: string - )___"); - } -}; - -template -struct TJsonRequestSchema> { - static YAML::Node GetSchema() { - return TProtoToYaml::ProtoToYamlSchema(); - } -}; - +YAML::Node GetWhiteboardRequestParameters() { + return YAML::Load(R"___( + - name: node_id + in: query + description: node identifier + required: false + type: integer + - name: merge + in: query + description: merge information from nodes + required: false + type: boolean + - name: group + in: query + description: group information by field + required: false + type: string + - name: all + in: query + description: return all possible key combinations (for enums only) + required: false + type: boolean + - name: filter + in: query + description: filter information by field + required: false + type: string + - name: alive + in: query + description: request from alive (connected) nodes only + required: false + type: boolean + - name: enums + in: query + description: convert enums to strings + required: false + type: boolean + - name: ui64 + in: query + description: return ui64 as number + required: false + type: boolean + - name: timeout + in: query + description: timeout in ms + required: false + type: integer + - name: retries + in: query + description: number of retries + required: false + type: integer + - name: retry_period + in: query + description: retry period in ms + required: false + type: integer + default: 500 + - name: static + in: query + description: request from static nodes only + required: false + type: boolean + - name: since + in: query + description: filter by update time + required: false + type: string + )___"); } + } diff --git a/ydb/core/viewer/operation_cancel.h b/ydb/core/viewer/operation_cancel.cpp similarity index 92% rename from ydb/core/viewer/operation_cancel.h rename to ydb/core/viewer/operation_cancel.cpp index eea1a238bb88..f92c5eb3592f 100644 --- a/ydb/core/viewer/operation_cancel.h +++ b/ydb/core/viewer/operation_cancel.cpp @@ -1,10 +1,9 @@ -#pragma once #include #include #include "json_local_rpc.h" +#include "json_handlers.h" -namespace NKikimr { -namespace NViewer { +namespace NKikimr::NViewer { using TOperationCancelRpc = TJsonLocalRpc -YAML::Node TJsonRequestSwagger::GetSwagger() { +static YAML::Node GetSwagger() { YAML::Node node = YAML::Load(R"___( post: tags: @@ -94,5 +92,9 @@ YAML::Node TJsonRequestSwagger::GetSwagger() { return node; } +void InitOperationCancelJsonHandler(TJsonHandlers& handlers) { + handlers.AddHandler("/operation/cancel", new TJsonHandler(GetSwagger())); } + } + diff --git a/ydb/core/viewer/operation_forget.h b/ydb/core/viewer/operation_forget.cpp similarity index 92% rename from ydb/core/viewer/operation_forget.h rename to ydb/core/viewer/operation_forget.cpp index b8338ae78409..5a4c80ba8019 100644 --- a/ydb/core/viewer/operation_forget.h +++ b/ydb/core/viewer/operation_forget.cpp @@ -1,10 +1,9 @@ -#pragma once #include #include #include "json_local_rpc.h" +#include "json_handlers.h" -namespace NKikimr { -namespace NViewer { +namespace NKikimr::NViewer { using TOperationForgetRpc = TJsonLocalRpc -YAML::Node TJsonRequestSwagger::GetSwagger() { +static YAML::Node GetSwagger() { YAML::Node node = YAML::Load(R"___( post: tags: @@ -93,5 +91,9 @@ YAML::Node TJsonRequestSwagger::GetSwagger() { return node; } +void InitOperationForgetJsonHandler(TJsonHandlers& handlers) { + handlers.AddHandler("/operation/forget", new TJsonHandler(GetSwagger())); } + } + diff --git a/ydb/core/viewer/operation_get.h b/ydb/core/viewer/operation_get.cpp similarity index 91% rename from ydb/core/viewer/operation_get.h rename to ydb/core/viewer/operation_get.cpp index 5fd4a0b61f4c..dcdc0d98addb 100644 --- a/ydb/core/viewer/operation_get.h +++ b/ydb/core/viewer/operation_get.cpp @@ -1,10 +1,9 @@ -#pragma once #include #include #include "json_local_rpc.h" +#include "json_handlers.h" -namespace NKikimr { -namespace NViewer { +namespace NKikimr::NViewer { using TOperationGetRpc = TJsonLocalRpc -YAML::Node TJsonRequestSwagger::GetSwagger() { +static YAML::Node GetSwagger() { YAML::Node node = YAML::Load(R"___( get: tags: @@ -77,5 +75,8 @@ YAML::Node TJsonRequestSwagger::GetSwagger() { return node; } +void InitOperationGetJsonHandler(TJsonHandlers& handlers) { + handlers.AddHandler("/operation/get", new TJsonHandler(GetSwagger())); } + } diff --git a/ydb/core/viewer/operation_list.h b/ydb/core/viewer/operation_list.cpp similarity index 93% rename from ydb/core/viewer/operation_list.h rename to ydb/core/viewer/operation_list.cpp index e78b59188101..6a0a093cab23 100644 --- a/ydb/core/viewer/operation_list.h +++ b/ydb/core/viewer/operation_list.cpp @@ -1,10 +1,9 @@ -#pragma once #include #include #include "json_local_rpc.h" +#include "json_handlers.h" -namespace NKikimr { -namespace NViewer { +namespace NKikimr::NViewer { using TOperationListRpc = TJsonLocalRpc -YAML::Node TJsonRequestSwagger::GetSwagger() { +static YAML::Node GetSwagger() { YAML::Node node = YAML::Load(R"___( get: tags: @@ -99,5 +97,8 @@ YAML::Node TJsonRequestSwagger::GetSwagger() { return node; } +void InitOperationListJsonHandler(TJsonHandlers& handlers) { + handlers.AddHandler("/operation/list", new TJsonHandler(GetSwagger())); } + } diff --git a/ydb/core/viewer/pdisk_info.h b/ydb/core/viewer/pdisk_info.cpp similarity index 97% rename from ydb/core/viewer/pdisk_info.h rename to ydb/core/viewer/pdisk_info.cpp index 844f939275da..417c13f7865c 100644 --- a/ydb/core/viewer/pdisk_info.h +++ b/ydb/core/viewer/pdisk_info.cpp @@ -1,4 +1,3 @@ -#pragma once #include #include #include @@ -9,9 +8,9 @@ #include #include "viewer.h" #include "json_pipe_req.h" +#include "json_handlers.h" -namespace NKikimr { -namespace NViewer { +namespace NKikimr::NViewer { using namespace NActors; @@ -233,8 +232,7 @@ class TPDiskInfo : public TViewerPipeClient { } }; -template <> -YAML::Node TJsonRequestSwagger::GetSwagger() { +static YAML::Node GetSwagger() { YAML::Node node = YAML::Load(R"___( get: tags: @@ -279,5 +277,8 @@ YAML::Node TJsonRequestSwagger::GetSwagger() { return node; } +void InitPDiskInfoJsonHandler(TJsonHandlers& handlers) { + handlers.AddHandler("/pdisk/info", new TJsonHandler(GetSwagger())); } + } diff --git a/ydb/core/viewer/json_pdisk_restart.h b/ydb/core/viewer/pdisk_restart.cpp similarity index 96% rename from ydb/core/viewer/json_pdisk_restart.h rename to ydb/core/viewer/pdisk_restart.cpp index ff92e7011a63..4e8e7b308a6c 100644 --- a/ydb/core/viewer/json_pdisk_restart.h +++ b/ydb/core/viewer/pdisk_restart.cpp @@ -1,4 +1,3 @@ -#pragma once #include #include #include @@ -8,9 +7,9 @@ #include #include "viewer.h" #include "json_pipe_req.h" +#include "json_handlers.h" -namespace NKikimr { -namespace NViewer { +namespace NKikimr::NViewer { using namespace NActors; @@ -163,8 +162,7 @@ class TJsonPDiskRestart : public TViewerPipeClient { } }; -template <> -YAML::Node TJsonRequestSwagger::GetSwagger() { +static YAML::Node GetSwagger() { return YAML::Load(R"___( post: tags: @@ -217,5 +215,8 @@ YAML::Node TJsonRequestSwagger::GetSwagger() { )___"); } +void InitPDiskRestartJsonHandler(TJsonHandlers& handlers) { + handlers.AddHandler("/pdisk/restart", new TJsonHandler(GetSwagger())); } + } diff --git a/ydb/core/viewer/pdisk_status.h b/ydb/core/viewer/pdisk_status.cpp similarity index 97% rename from ydb/core/viewer/pdisk_status.h rename to ydb/core/viewer/pdisk_status.cpp index 783d7a7f1db7..3815e5557cb8 100644 --- a/ydb/core/viewer/pdisk_status.h +++ b/ydb/core/viewer/pdisk_status.cpp @@ -1,4 +1,3 @@ -#pragma once #include #include #include @@ -9,9 +8,9 @@ #include #include "viewer.h" #include "json_pipe_req.h" +#include "json_handlers.h" -namespace NKikimr { -namespace NViewer { +namespace NKikimr::NViewer { using namespace NActors; extern bool IsPostContent(const NMon::TEvHttpInfo::TPtr& event); @@ -156,8 +155,7 @@ class TPDiskStatus : public TViewerPipeClient { } }; -template <> -YAML::Node TJsonRequestSwagger::GetSwagger() { +static YAML::Node GetSwagger() { YAML::Node node = YAML::Load(R"___( post: tags: @@ -238,5 +236,8 @@ YAML::Node TJsonRequestSwagger::GetSwagger() { return node; } +void InitPDiskStatusJsonHandler(TJsonHandlers& handlers) { + handlers.AddHandler("/pdisk/status", new TJsonHandler(GetSwagger())); } + } diff --git a/ydb/core/viewer/query_autocomplete_helper.h b/ydb/core/viewer/query_autocomplete_helper.h index e523ceb029bb..cf62132cbf6f 100644 --- a/ydb/core/viewer/query_autocomplete_helper.h +++ b/ydb/core/viewer/query_autocomplete_helper.h @@ -1,6 +1,7 @@ #pragma once #include +#include namespace NKikimr::NViewer { diff --git a/ydb/core/viewer/scheme_directory.h b/ydb/core/viewer/scheme_directory.cpp similarity index 95% rename from ydb/core/viewer/scheme_directory.h rename to ydb/core/viewer/scheme_directory.cpp index 400504fbd822..abbf75ec9a90 100644 --- a/ydb/core/viewer/scheme_directory.h +++ b/ydb/core/viewer/scheme_directory.cpp @@ -1,11 +1,9 @@ -#pragma once #include #include #include "json_local_rpc.h" #include "json_handlers.h" -namespace NKikimr { -namespace NViewer { +namespace NKikimr::NViewer { class TSchemeDirectory : public IActor { public: @@ -64,24 +62,7 @@ class TSchemeDirectoryRequest : public LocalRpcType { } }; -class TJsonSchemeDirectoryHandler : public TJsonHandler { -public: - IActor* CreateRequestActor(IViewer* viewer, NMon::TEvHttpInfo::TPtr& event) override { - switch (event->Get()->Request.GetMethod()) { - case HTTP_METHOD_GET: - return new TSchemeDirectoryRequest(viewer, event); - case HTTP_METHOD_POST: - return new TSchemeDirectoryRequest(viewer, event); - case HTTP_METHOD_DELETE: - return new TSchemeDirectoryRequest(viewer, event); - default: - throw std::logic_error("Bad request method"); - } - } -}; - -template<> -YAML::Node TJsonRequestSwagger::GetSwagger() { +static YAML::Node GetSwagger() { YAML::Node node = YAML::Load(R"___( get: tags: @@ -175,5 +156,28 @@ YAML::Node TJsonRequestSwagger::GetSwagger() { return node; } +class TJsonSchemeDirectoryHandler : public TJsonHandler { +public: + TJsonSchemeDirectoryHandler() + : TJsonHandler(GetSwagger()) + {} + + IActor* CreateRequestActor(IViewer* viewer, NMon::TEvHttpInfo::TPtr& event) override { + switch (event->Get()->Request.GetMethod()) { + case HTTP_METHOD_GET: + return new TSchemeDirectoryRequest(viewer, event); + case HTTP_METHOD_POST: + return new TSchemeDirectoryRequest(viewer, event); + case HTTP_METHOD_DELETE: + return new TSchemeDirectoryRequest(viewer, event); + default: + throw std::logic_error("Bad request method"); + } + } +}; + +void InitSchemeDirectoryHandler(TJsonHandlers& handlers) { + handlers.AddHandler("/scheme/directory", new TJsonSchemeDirectoryHandler()); } + } diff --git a/ydb/core/viewer/storage_groups.cpp b/ydb/core/viewer/storage_groups.cpp index 8046767b86be..f746caebb752 100644 --- a/ydb/core/viewer/storage_groups.cpp +++ b/ydb/core/viewer/storage_groups.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include #include #include @@ -13,12 +14,9 @@ #include "viewer_helper.h" #include "json_handlers.h" #include "json_pipe_req.h" -#include "json_vdiskinfo.h" -#include "json_pdiskinfo.h" -#include "json_bsgroupinfo.h" +#include "log.h" -namespace NKikimr { -namespace NViewer { +namespace NKikimr::NViewer { using namespace NProtobufJson; @@ -74,7 +72,6 @@ struct TVSlotId : TPDiskId { bool operator ==(const TVSlotId& a) const = default; }; -} } template<> @@ -94,8 +91,7 @@ struct std::hash { } }; -namespace NKikimr { -namespace NViewer { +namespace NKikimr::NViewer { using namespace NActors; using namespace NNodeWhiteboard; @@ -1691,8 +1687,7 @@ class TStorageGroups : public TViewerPipeClient { } }; -template <> -YAML::Node TJsonRequestSwagger::GetSwagger() { +static YAML::Node GetSwagger() { YAML::Node node = YAML::Load(R"___( post: tags: @@ -1799,8 +1794,7 @@ YAML::Node TJsonRequestSwagger::GetSwagger() { void InitStorageGroupsJsonHandler(TJsonHandlers& jsonHandlers) { - jsonHandlers.AddHandler("/storage/groups", new TJsonHandler); + jsonHandlers.AddHandler("/storage/groups", new TJsonHandler(GetSwagger())); } -} // namespace NViewer -} // namespace NKikimr +} diff --git a/ydb/core/viewer/vdisk_blobindexstat.cpp b/ydb/core/viewer/vdisk_blobindexstat.cpp new file mode 100644 index 000000000000..80668e6cd306 --- /dev/null +++ b/ydb/core/viewer/vdisk_blobindexstat.cpp @@ -0,0 +1,31 @@ +#include +#include +#include +#include +#include +#include +#include +#include "json_vdisk_req.h" +#include "json_handlers.h" + +namespace NKikimr::NViewer { + +using TJsonBlobIndexStat = TJsonVDiskRequest; + +static YAML::Node GetSwagger() { + TSimpleYamlBuilder yaml({ + .Method = "get", + .Tag = "viewer", + .Summary = "Get logoblob index stat from VDisk", + .Description = "Get logoblob index stat from VDisk", + }); + yaml.SetParameters(TJsonBlobIndexStat::GetParameters()); + yaml.SetResponseSchema(TJsonBlobIndexStat::GetSchema()); + return yaml; +} + +void InitVDiskBlobIndexStatJsonHandler(TJsonHandlers& jsonHandlers) { + jsonHandlers.AddHandler("/vdisk/blobindexstat", new TJsonHandler(GetSwagger())); +} + +} diff --git a/ydb/core/viewer/json_vdisk_evict.h b/ydb/core/viewer/vdisk_evict.cpp similarity index 97% rename from ydb/core/viewer/json_vdisk_evict.h rename to ydb/core/viewer/vdisk_evict.cpp index c37c5ab5e803..c24d39be4669 100644 --- a/ydb/core/viewer/json_vdisk_evict.h +++ b/ydb/core/viewer/vdisk_evict.cpp @@ -1,4 +1,3 @@ -#pragma once #include #include #include @@ -8,9 +7,9 @@ #include #include "viewer.h" #include "json_pipe_req.h" +#include "json_handlers.h" -namespace NKikimr { -namespace NViewer { +namespace NKikimr::NViewer { using namespace NActors; @@ -186,8 +185,7 @@ class TJsonVDiskEvict : public TViewerPipeClient { } }; -template <> -YAML::Node TJsonRequestSwagger::GetSwagger() { +YAML::Node GetSwagger() { return YAML::Load(R"___( post: tags: @@ -261,5 +259,8 @@ YAML::Node TJsonRequestSwagger::GetSwagger() { )___"); } +void InitVDiskEvictJsonHandler(TJsonHandlers& handlers) { + handlers.AddHandler("/vdisk/evict", new TJsonHandler(GetSwagger())); } + } diff --git a/ydb/core/viewer/json_getblob.h b/ydb/core/viewer/vdisk_getblob.cpp similarity index 82% rename from ydb/core/viewer/json_getblob.h rename to ydb/core/viewer/vdisk_getblob.cpp index d09c691dcb90..4092c76da96f 100644 --- a/ydb/core/viewer/json_getblob.h +++ b/ydb/core/viewer/vdisk_getblob.cpp @@ -1,14 +1,14 @@ -#pragma once #include #include #include #include #include #include +#include #include "json_vdisk_req.h" +#include "json_handlers.h" -namespace NKikimr { -namespace NViewer { +namespace NKikimr::NViewer { using TJsonGetBlob = TJsonVDiskRequest; @@ -79,20 +79,20 @@ struct TJsonVDiskRequestHelper { } }; +static YAML::Node GetSwagger() { + TSimpleYamlBuilder yaml({ + .Method = "get", + .Tag = "vdisk", + .Summary = "Get blob from VDisk", + .Description = "Get blob from VDisk", + }); + yaml.SetParameters(TJsonGetBlob::GetParameters()); + yaml.SetResponseSchema(TJsonGetBlob::GetSchema()); + return yaml; +} -template <> -struct TJsonRequestSummary { - static TString GetSummary() { - return "Get blob from VDisk"; - } -}; - -template <> -struct TJsonRequestDescription { - static TString GetDescription() { - return "Get blob from VDisk"; - } -}; - +void InitVDiskGetBlobJsonHandler(TJsonHandlers& handlers) { + handlers.AddHandler("/vdisk/getblob", new TJsonHandler(GetSwagger())); } + } diff --git a/ydb/core/viewer/vdisk_vdiskstat.cpp b/ydb/core/viewer/vdisk_vdiskstat.cpp new file mode 100644 index 000000000000..dbdaa5125670 --- /dev/null +++ b/ydb/core/viewer/vdisk_vdiskstat.cpp @@ -0,0 +1,31 @@ +#include +#include +#include +#include +#include +#include +#include +#include "json_vdisk_req.h" +#include "json_handlers.h" + +namespace NKikimr::NViewer { + +using TJsonVDiskStat = TJsonVDiskRequest; + +static YAML::Node GetSwagger() { + TSimpleYamlBuilder yaml({ + .Method = "get", + .Tag = "vdisk", + .Summary = "VDisk statistic", + .Description = "VDisk statistic", + }); + yaml.SetParameters(TJsonVDiskStat::GetParameters()); + yaml.SetResponseSchema(TJsonVDiskStat::GetSchema()); + return yaml; +} + +void InitVDiskStatJsonHandler(TJsonHandlers& handlers) { + handlers.AddHandler("/vdisk/vdiskstat", new TJsonHandler(GetSwagger())); +} + +} diff --git a/ydb/core/viewer/viewer.cpp b/ydb/core/viewer/viewer.cpp index 779571ef32ea..2551a866fa54 100644 --- a/ydb/core/viewer/viewer.cpp +++ b/ydb/core/viewer/viewer.cpp @@ -1,4 +1,3 @@ -#include #include #include #include @@ -18,25 +17,17 @@ #include #include #include +#include +#include #include "viewer.h" #include "viewer_request.h" -#include "viewer_probes.h" #include #include -#include "browse_pq.h" -#include "browse_db.h" #include "counters_hosts.h" -#include "json_healthcheck.h" - #include "json_handlers.h" +#include "log.h" -#include "json_bsgroupinfo.h" -#include "json_nodeinfo.h" -#include "json_vdiskinfo.h" - - -namespace NKikimr { -namespace NViewer { +namespace NKikimr::NViewer { using namespace NNodeWhiteboard; @@ -46,37 +37,8 @@ extern void InitVDiskJsonHandlers(TJsonHandlers& jsonHandlers); extern void InitOperationJsonHandlers(TJsonHandlers& jsonHandlers); extern void InitSchemeJsonHandlers(TJsonHandlers& jsonHandlers); extern void InitStorageJsonHandlers(TJsonHandlers& jsonHandlers); - -void SetupPQVirtualHandlers(IViewer* viewer) { - viewer->RegisterVirtualHandler( - NKikimrViewer::EObjectType::Root, - [] (const TActorId& owner, const IViewer::TBrowseContext& browseContext) -> IActor* { - return new NViewerPQ::TBrowseRoot(owner, browseContext); - }); - viewer->RegisterVirtualHandler( - NKikimrViewer::EObjectType::Consumers, - [] (const TActorId& owner, const IViewer::TBrowseContext& browseContext) -> IActor* { - return new NViewerPQ::TBrowseConsumers(owner, browseContext); - }); - viewer->RegisterVirtualHandler( - NKikimrViewer::EObjectType::Consumer, - [] (const TActorId& owner, const IViewer::TBrowseContext& browseContext) -> IActor* { - return new NViewerPQ::TBrowseConsumer(owner, browseContext); - }); - viewer->RegisterVirtualHandler( - NKikimrViewer::EObjectType::Topic, - [] (const TActorId& owner, const IViewer::TBrowseContext& browseContext) -> IActor* { - return new NViewerPQ::TBrowseTopic(owner, browseContext); - }); -} - -void SetupDBVirtualHandlers(IViewer* viewer) { - viewer->RegisterVirtualHandler( - NKikimrViewer::EObjectType::Table, - [] (const TActorId& owner, const IViewer::TBrowseContext& browseContext) -> IActor* { - return new NViewerDB::TBrowseTable(owner, browseContext); - }); -} +extern void SetupPQVirtualHandlers(IViewer* viewer); +extern void SetupDBVirtualHandlers(IViewer* viewer); class TViewer : public TActorBootstrapped, public IViewer { public: @@ -95,7 +57,6 @@ class TViewer : public TActorBootstrapped, public IViewer { Become(&TThis::StateWork); NActors::TMon* mon = AppData(ctx)->Mon; if (mon) { - NLwTraceMonPage::ProbeRegistry().AddProbesList(LWTRACE_GET_PROBES(VIEWER_PROVIDER)); TVector viewerAllowedSIDs; TVector monitoringAllowedSIDs; { @@ -206,9 +167,6 @@ class TViewer : public TActorBootstrapped, public IViewer { Redirect307["/viewer/v2/json/nodelist"] = "/viewer/nodelist"; Redirect307["/viewer/v2/json/tabletinfo"] = "/viewer/tabletinfo"; Redirect307["/viewer/v2/json/nodeinfo"] = "/viewer/nodeinfo"; - - TWhiteboardInfo::InitMerger(); - TWhiteboardInfo::InitMerger(); } } @@ -414,24 +372,9 @@ class TViewer : public TActorBootstrapped, public IViewer { YAML::Node paths; for (const TString& name : JsonHandlers.JsonHandlersList) { const auto& handler = JsonHandlers.JsonHandlersIndex[name]; - TString tag = TString(TStringBuf(name.substr(1)).Before('/')); - auto path = paths[name]; auto swagger = handler->GetRequestSwagger(); - if (swagger.IsNull()) { - auto get = path["get"]; - get["tags"].push_back(tag); - if (auto summary = handler->GetRequestSummary()) { - get["summary"] = summary; - } - if (auto description = handler->GetRequestDescription()) { - get["description"] = description; - } - get["parameters"] = handler->GetRequestParameters(); - auto responses = get["responses"]; - auto response200 = responses["200"]; - response200["content"]["application/json"]["schema"] = handler->GetResponseJsonSchema(); - } else { - path = swagger; + if (!swagger.IsNull()) { + paths[name] = swagger; } } return paths; @@ -987,99 +930,6 @@ NKikimrViewer::EFlag GetVDiskOverallFlag(const NKikimrWhiteboard::TVDiskStateInf return flag; } -TBSGroupState GetBSGroupOverallStateWithoutLatency( - const NKikimrWhiteboard::TBSGroupStateInfo& info, - const TMap& vDisksIndex, - const TMap, const NKikimrWhiteboard::TPDiskStateInfo&>& pDisksIndex) { - - TBSGroupState groupState; - groupState.Overall = NKikimrViewer::EFlag::Grey; - - const auto& vDiskIds = info.GetVDiskIds(); - std::unordered_map failedRings; - std::unordered_map failedDomains; - TVector vDiskFlags; - vDiskFlags.reserve(vDiskIds.size()); - for (auto iv = vDiskIds.begin(); iv != vDiskIds.end(); ++iv) { - const NKikimrBlobStorage::TVDiskID& vDiskId = *iv; - NKikimrViewer::EFlag flag = NKikimrViewer::EFlag::Grey; - auto ie = vDisksIndex.find(vDiskId); - if (ie != vDisksIndex.end()) { - auto pDiskId = std::make_pair(ie->second.GetNodeId(), ie->second.GetPDiskId()); - auto ip = pDisksIndex.find(pDiskId); - if (ip != pDisksIndex.end()) { - const NKikimrWhiteboard::TPDiskStateInfo& pDiskInfo(ip->second); - flag = Max(flag, GetPDiskOverallFlag(pDiskInfo)); - } else { - flag = NKikimrViewer::EFlag::Red; - } - const NKikimrWhiteboard::TVDiskStateInfo& vDiskInfo(ie->second); - flag = Max(flag, GetVDiskOverallFlag(vDiskInfo)); - if (vDiskInfo.GetDiskSpace() > NKikimrWhiteboard::EFlag::Green) { - groupState.SpaceProblems++; - } - } else { - flag = NKikimrViewer::EFlag::Red; - } - vDiskFlags.push_back(flag); - if (flag == NKikimrViewer::EFlag::Red || flag == NKikimrViewer::EFlag::Blue) { - groupState.MissingDisks++; - ++failedRings[vDiskId.GetRing()]; - ++failedDomains[vDiskId.GetDomain()]; - } - groupState.Overall = Max(groupState.Overall, flag); - } - - groupState.Overall = Min(groupState.Overall, NKikimrViewer::EFlag::Yellow); // without failed rings we only allow to raise group status up to Blue/Yellow - TString erasure = info.GetErasureSpecies(); - if (erasure == TErasureType::ErasureSpeciesName(TErasureType::ErasureNone)) { - if (!failedDomains.empty()) { - groupState.Overall = NKikimrViewer::EFlag::Red; - } - } else if (erasure == TErasureType::ErasureSpeciesName(TErasureType::ErasureMirror3dc)) { - if (failedRings.size() > 2) { - groupState.Overall = NKikimrViewer::EFlag::Red; - } else if (failedRings.size() == 2) { // TODO: check for 1 ring - 1 domain rule - groupState.Overall = NKikimrViewer::EFlag::Orange; - } else if (failedRings.size() > 0) { - groupState.Overall = Min(groupState.Overall, NKikimrViewer::EFlag::Yellow); - } - } else if (erasure == TErasureType::ErasureSpeciesName(TErasureType::Erasure4Plus2Block)) { - if (failedDomains.size() > 2) { - groupState.Overall = NKikimrViewer::EFlag::Red; - } else if (failedDomains.size() > 1) { - groupState.Overall = NKikimrViewer::EFlag::Orange; - } else if (failedDomains.size() > 0) { - groupState.Overall = Min(groupState.Overall, NKikimrViewer::EFlag::Yellow); - } - } - return groupState; -} - -NKikimrViewer::EFlag GetBSGroupOverallFlagWithoutLatency( - const NKikimrWhiteboard::TBSGroupStateInfo& info, - const TMap& vDisksIndex, - const TMap, const NKikimrWhiteboard::TPDiskStateInfo&>& pDisksIndex) { - return GetBSGroupOverallStateWithoutLatency(info, vDisksIndex, pDisksIndex).Overall; -} - -TBSGroupState GetBSGroupOverallState( - const NKikimrWhiteboard::TBSGroupStateInfo& info, - const TMap& vDisksIndex, - const TMap, const NKikimrWhiteboard::TPDiskStateInfo&>& pDisksIndex) { - TBSGroupState state = GetBSGroupOverallStateWithoutLatency(info, vDisksIndex, pDisksIndex); - if (info.HasLatency()) { - state.Overall = Max(state.Overall, Min(NKikimrViewer::EFlag::Yellow, GetViewerFlag(info.GetLatency()))); - } - return state; -} - -NKikimrViewer::EFlag GetBSGroupOverallFlag( - const NKikimrWhiteboard::TBSGroupStateInfo& info, - const TMap& vDisksIndex, - const TMap, const NKikimrWhiteboard::TPDiskStateInfo&>& pDisksIndex) { - return GetBSGroupOverallState(info, vDisksIndex, pDisksIndex).Overall; -} NKikimrViewer::EFlag GetViewerFlag(Ydb::Monitoring::StatusFlag::Status flag) { switch (flag) { @@ -1136,5 +986,4 @@ NKikimrViewer::EFlag GetViewerFlag(NKikimrWhiteboard::EFlag flag) { return static_cast((int)flag); } -} // NNodeTabletMonitor -} // NKikimr +} diff --git a/ydb/core/viewer/viewer.h b/ydb/core/viewer/viewer.h index 67cac550005c..bd8af6e3e459 100644 --- a/ydb/core/viewer/viewer.h +++ b/ydb/core/viewer/viewer.h @@ -214,32 +214,6 @@ void SetupPQVirtualHandlers(IViewer* viewer); void SetupDBVirtualHandlers(IViewer* viewer); void SetupKqpContentHandler(IViewer* viewer); -template -struct TJsonRequestSchema { - static YAML::Node GetSchema() { return {}; } -}; - -template -struct TJsonRequestSummary { - static TString GetSummary() { return {}; } -}; - -template -struct TJsonRequestDescription { - static TString GetDescription() { return {}; } -}; - -template -struct TJsonRequestParameters { - static YAML::Node GetParameters() { return {}; } -}; - -template -struct TJsonRequestSwagger { - static YAML::Node GetSwagger() { return {}; } -}; - - template void GenericSplitIds(TStringBuf source, char delim, OutputIteratorType it) { for (TStringBuf value = source.NextTok(delim); !value.empty(); value = source.NextTok(delim)) { diff --git a/ydb/core/viewer/json_acl.h b/ydb/core/viewer/viewer_acl.cpp similarity index 89% rename from ydb/core/viewer/json_acl.h rename to ydb/core/viewer/viewer_acl.cpp index 14055628e0db..a22dbcd2e8d2 100644 --- a/ydb/core/viewer/json_acl.h +++ b/ydb/core/viewer/viewer_acl.cpp @@ -1,4 +1,3 @@ -#pragma once #include #include #include @@ -6,10 +5,11 @@ #include #include #include "viewer.h" +#include "log.h" #include "json_pipe_req.h" +#include "json_handlers.h" -namespace NKikimr { -namespace NViewer { +namespace NKikimr::NViewer { using namespace NActors; using NSchemeShard::TEvSchemeShard; @@ -17,17 +17,15 @@ using NSchemeShard::TEvSchemeShard; class TJsonACL : public TViewerPipeClient { using TThis = TJsonACL; using TBase = TViewerPipeClient; - IViewer* Viewer; - NMon::TEvHttpInfo::TPtr Event; + using TBase::ReplyAndPassAway; TAutoPtr CacheResult; TJsonSettings JsonSettings; bool MergeRules = false; ui32 Timeout = 0; public: - TJsonACL(IViewer* viewer, NMon::TEvHttpInfo::TPtr &ev) - : Viewer(viewer) - , Event(ev) + TJsonACL(IViewer* viewer, NMon::TEvHttpInfo::TPtr& ev) + : TViewerPipeClient(viewer, ev) {} void Bootstrap() override { @@ -150,23 +148,18 @@ class TJsonACL : public TViewerPipeClient { } } - void ReplyAndPassAway(TString data) { - Send(Event->Sender, new NMon::TEvHttpInfoRes(data, 0, NMon::IEvHttpInfoRes::EContentType::Custom)); - PassAway(); - } - void ReplyAndPassAway() override { if (CacheResult == nullptr) { - return ReplyAndPassAway(Viewer->GetHTTPINTERNALERROR(Event->Get(), "text/plain", "no SchemeCache response")); + return ReplyAndPassAway(GetHTTPINTERNALERROR("text/plain", "no SchemeCache response")); } if (CacheResult->Request == nullptr) { - return ReplyAndPassAway(Viewer->GetHTTPINTERNALERROR(Event->Get(), "text/plain", "wrong SchemeCache response")); + return ReplyAndPassAway(GetHTTPINTERNALERROR("text/plain", "wrong SchemeCache response")); } if (CacheResult->Request.Get()->ResultSet.empty()) { - return ReplyAndPassAway(Viewer->GetHTTPINTERNALERROR(Event->Get(), "text/plain", "SchemeCache response is empty")); + return ReplyAndPassAway(GetHTTPINTERNALERROR("text/plain", "SchemeCache response is empty")); } if (CacheResult->Request.Get()->ErrorCount != 0) { - return ReplyAndPassAway(Viewer->GetHTTPBADREQUEST(Event->Get(), "text/plain", TStringBuilder() << "SchemeCache response error " << static_cast(CacheResult->Request.Get()->ResultSet.front().Status))); + return ReplyAndPassAway(GetHTTPBADREQUEST("text/plain", TStringBuilder() << "SchemeCache response error " << static_cast(CacheResult->Request.Get()->ResultSet.front().Status))); } const auto& entry = CacheResult->Request.Get()->ResultSet.front(); NKikimrViewer::TMetaInfo metaInfo; @@ -191,16 +184,11 @@ class TJsonACL : public TViewerPipeClient { TStringStream json; TProtoToJson::ProtoToJson(json, metaInfo, JsonSettings); - ReplyAndPassAway(Viewer->GetHTTPOKJSON(Event->Get(), json.Str())); - } - - void HandleTimeout() { - ReplyAndPassAway(Viewer->GetHTTPGATEWAYTIMEOUT(Event->Get())); + ReplyAndPassAway(GetHTTPOKJSON(json.Str())); } }; -template <> -YAML::Node TJsonRequestSwagger::GetSwagger() { +static YAML::Node GetSwagger() { YAML::Node node = YAML::Load(R"___( get: tags: @@ -296,5 +284,8 @@ YAML::Node TJsonRequestSwagger::GetSwagger() { return node; } +void InitViewerAclJsonHandler(TJsonHandlers& jsonHandlers) { + jsonHandlers.AddHandler("/viewer/acl", new TJsonHandler(GetSwagger())); } + } diff --git a/ydb/core/viewer/viewer_autocomplete.cpp b/ydb/core/viewer/viewer_autocomplete.cpp new file mode 100644 index 000000000000..42d0bcca5a6e --- /dev/null +++ b/ydb/core/viewer/viewer_autocomplete.cpp @@ -0,0 +1,67 @@ +#include "viewer_autocomplete.h" +#include "json_handlers.h" + +namespace NKikimr::NViewer { + +static YAML::Node GetSwaggerParameters() { + return YAML::Load(R"___( + - name: database + in: query + description: database name + required: false + type: string + - name: table + in: query + description: table list + required: false + type: string + - name: prefix + in: query + description: known part of the word + required: false + type: string + - name: limit + in: query + description: limit of entities + required: false + type: integer + - name: timeout + in: query + description: timeout in ms + required: false + type: integer + - name: enums + in: query + description: convert enums to strings + required: false + type: boolean + - name: ui64 + in: query + description: return ui64 as number + required: false + type: boolean + - name: direct + in: query + description: force execution on current node + required: false + type: boolean + )___"); +} + +static YAML::Node GetSwagger() { + TSimpleYamlBuilder yaml({ + .Method = "get", + .Tag = "viewer", + .Summary = "Autocomplete information", + .Description = "Returns autocomplete information about objects in the database" + }); + yaml.SetParameters(GetSwaggerParameters()); + yaml.SetResponseSchema(TProtoToYaml::ProtoToYamlSchema()); + return yaml; +} + +void InitViewerAutocompleteJsonHandler(TJsonHandlers& jsonHandlers) { + jsonHandlers.AddHandler("/viewer/autocomplete", new TJsonHandler(GetSwagger())); +} + +} diff --git a/ydb/core/viewer/json_autocomplete.h b/ydb/core/viewer/viewer_autocomplete.h similarity index 89% rename from ydb/core/viewer/json_autocomplete.h rename to ydb/core/viewer/viewer_autocomplete.h index d9733e4550a1..d8226c56af1d 100644 --- a/ydb/core/viewer/json_autocomplete.h +++ b/ydb/core/viewer/viewer_autocomplete.h @@ -1,16 +1,17 @@ -#pragma once #include #include #include #include +#include #include #include #include "query_autocomplete_helper.h" #include "viewer_request.h" +#include "json_pipe_req.h" +#include "log.h" -namespace NKikimr { -namespace NViewer { +namespace NKikimr::NViewer { using namespace NActors; using TNavigate = NSchemeCache::TSchemeCacheNavigate; @@ -443,74 +444,4 @@ class TJsonAutocomplete : public TViewerPipeClient { } }; -template <> -struct TJsonRequestSchema { - static YAML::Node GetSchema() { - return TProtoToYaml::ProtoToYamlSchema(); - } -}; - -template <> -struct TJsonRequestParameters { - static YAML::Node GetParameters() { - return YAML::Load(R"___( - - name: database - in: query - description: database name - required: false - type: string - - name: table - in: query - description: table list - required: false - type: string - - name: prefix - in: query - description: known part of the word - required: false - type: string - - name: limit - in: query - description: limit of entities - required: false - type: integer - - name: timeout - in: query - description: timeout in ms - required: false - type: integer - - name: enums - in: query - description: convert enums to strings - required: false - type: boolean - - name: ui64 - in: query - description: return ui64 as number - required: false - type: boolean - - name: direct - in: query - description: force execution on current node - required: false - type: boolean - )___"); - } -}; - -template <> -struct TJsonRequestSummary { - static TString GetSummary() { - return "Autocomplete information"; - } -}; - -template <> -struct TJsonRequestDescription { - static TString GetDescription() { - return "Returns autocomplete information about objects in the database"; - } -}; - -} } diff --git a/ydb/core/viewer/json_browse.h b/ydb/core/viewer/viewer_browse.cpp similarity index 82% rename from ydb/core/viewer/json_browse.h rename to ydb/core/viewer/viewer_browse.cpp index 223e91571b6a..1e86d92c0031 100644 --- a/ydb/core/viewer/json_browse.h +++ b/ydb/core/viewer/viewer_browse.cpp @@ -1,4 +1,3 @@ -#pragma once #include #include #include @@ -13,9 +12,9 @@ #include #include "viewer.h" #include "wb_aggregate.h" +#include "json_handlers.h" -namespace NKikimr { -namespace NViewer { +namespace NKikimr::NViewer { using namespace NActors; @@ -201,54 +200,53 @@ class TJsonBrowse : public TActorBootstrapped { } }; -template <> -struct TJsonRequestSchema { - static YAML::Node GetSchema() { - return TProtoToYaml::ProtoToYamlSchema(); - } -}; - -template <> -struct TJsonRequestParameters { - static YAML::Node GetParameters() { - return YAML::Load(R"___( - - name: path - in: query - description: schema path - required: true - type: string - - name: enums - in: query - description: convert enums to strings - required: false - type: boolean - - name: ui64 - in: query - description: return ui64 as number - required: false - type: boolean - - name: timeout - in: query - description: timeout in ms - required: false - type: integer - )___"); - } -}; +void SetupDBVirtualHandlers(IViewer* viewer) { + viewer->RegisterVirtualHandler( + NKikimrViewer::EObjectType::Table, + [] (const TActorId& owner, const IViewer::TBrowseContext& browseContext) -> IActor* { + return new NViewerDB::TBrowseTable(owner, browseContext); + }); +} -template <> -struct TJsonRequestSummary { - static TString GetSummary() { - return "Schema information"; - } -}; +static YAML::Node GetSwaggerParameters() { + return YAML::Load(R"___( + - name: path + in: query + description: schema path + required: true + type: string + - name: enums + in: query + description: convert enums to strings + required: false + type: boolean + - name: ui64 + in: query + description: return ui64 as number + required: false + type: boolean + - name: timeout + in: query + description: timeout in ms + required: false + type: integer + )___"); +} -template <> -struct TJsonRequestDescription { - static TString GetDescription() { - return "Returns brief information about schema object"; - } -}; +static YAML::Node GetSwagger() { + TSimpleYamlBuilder yaml({ + .Method = "get", + .Tag = "viewer", + .Summary = "Schema information", + .Description = "Returns brief information about schema object" + }); + yaml.SetParameters(GetSwaggerParameters()); + yaml.SetResponseSchema(TProtoToYaml::ProtoToYamlSchema()); + return yaml; +} +void InitViewerBrowseJsonHandler(TJsonHandlers& jsonHandlers) { + jsonHandlers.AddHandler("/viewer/browse", new TJsonHandler(GetSwagger())); } + } diff --git a/ydb/core/viewer/viewer_bscontrollerinfo.cpp b/ydb/core/viewer/viewer_bscontrollerinfo.cpp new file mode 100644 index 000000000000..cc1330b70e14 --- /dev/null +++ b/ydb/core/viewer/viewer_bscontrollerinfo.cpp @@ -0,0 +1,103 @@ +#include +#include +#include +#include +#include +#include "viewer.h" +#include "json_pipe_req.h" +#include +#include "json_handlers.h" + +namespace NKikimr::NViewer { + +using namespace NActors; + +class TJsonBSControllerInfo : public TViewerPipeClient { + using TThis = TJsonBSControllerInfo; + using TBase = TViewerPipeClient; + using TBase::ReplyAndPassAway; + TAutoPtr ControllerInfo; + TJsonSettings JsonSettings; + ui32 Timeout = 0; + +public: + TJsonBSControllerInfo(IViewer* viewer, NMon::TEvHttpInfo::TPtr& ev) + : TViewerPipeClient(viewer, ev) + {} + + void Bootstrap() override { + const auto& params(Event->Get()->Request.GetParams()); + JsonSettings.EnumAsNumbers = !FromStringWithDefault(params.Get("enums"), false); + JsonSettings.UI64AsString = !FromStringWithDefault(params.Get("ui64"), false); + Timeout = FromStringWithDefault(params.Get("timeout"), 10000); + InitConfig(params); + RequestBSControllerInfo(); + Become(&TThis::StateRequestedInfo, TDuration::MilliSeconds(Timeout), new TEvents::TEvWakeup()); + } + + STATEFN(StateRequestedInfo) { + switch (ev->GetTypeRewrite()) { + hFunc(TEvBlobStorage::TEvResponseControllerInfo, Handle); + hFunc(TEvTabletPipe::TEvClientConnected, TBase::Handle); + cFunc(TEvents::TSystem::Wakeup, TBase::HandleTimeout); + } + } + + void Handle(TEvBlobStorage::TEvResponseControllerInfo::TPtr& ev) { + ControllerInfo = ev->Release(); + RequestDone(); + } + + void ReplyAndPassAway() override { + TStringStream json; + if (ControllerInfo != nullptr) { + TProtoToJson::ProtoToJson(json, ControllerInfo->Record); + } else { + json << "null"; + } + ReplyAndPassAway(GetHTTPOKJSON(json.Str())); + } +}; + +static YAML::Node GetSwaggerParameters() { + return YAML::Node(R"___( + - name: controller_id + in: query + description: storage controller identifier (tablet id) + required: true + type: string + - name: enums + in: query + description: convert enums to strings + required: false + type: boolean + - name: ui64 + in: query + description: return ui64 as number + required: false + type: boolean + - name: timeout + in: query + description: timeout in ms + required: false + type: integer + )___"); +} + +static YAML::Node GetSwagger() { + TSimpleYamlBuilder yaml({ + .Method = "get", + .Tag = "viewer", + .Summary = "Storage controller information", + .Description = "Returns information about storage controller" + }); + yaml.SetParameters(GetSwaggerParameters()); + yaml.SetResponseSchema(TProtoToYaml::ProtoToYamlSchema()); + return yaml; +} + +void InitViewerBSControllerInfoHandler(TJsonHandlers& jsonHandlers) { + jsonHandlers.AddHandler("/viewer/bscontrollerinfo", new TJsonHandler(GetSwagger())); +} + +} diff --git a/ydb/core/viewer/viewer_bsgroupinfo.cpp b/ydb/core/viewer/viewer_bsgroupinfo.cpp new file mode 100644 index 000000000000..b5ac636d5f47 --- /dev/null +++ b/ydb/core/viewer/viewer_bsgroupinfo.cpp @@ -0,0 +1,24 @@ +#include "viewer_bsgroupinfo.h" +#include "json_handlers.h" + +namespace NKikimr::NViewer { + +static YAML::Node GetSwagger() { + TSimpleYamlBuilder yaml({ + .Method = "get", + .Tag = "viewer", + .Summary = "Storage groups information", + .Description = "Returns information about storage groups" + }); + yaml.SetParameters(GetWhiteboardRequestParameters()); + yaml.SetResponseSchema(TProtoToYaml::ProtoToYamlSchema()); + return yaml; +} + +void InitViewerBSGroupInfoJsonHandler(TJsonHandlers& jsonHandlers) { + jsonHandlers.AddHandler("/viewer/bsgroupinfo", new TJsonHandler(GetSwagger())); + TWhiteboardInfo::InitMerger(); +} + + +} diff --git a/ydb/core/viewer/json_bsgroupinfo.h b/ydb/core/viewer/viewer_bsgroupinfo.h similarity index 85% rename from ydb/core/viewer/json_bsgroupinfo.h rename to ydb/core/viewer/viewer_bsgroupinfo.h index 24c05ffe5d7a..c7779849a365 100644 --- a/ydb/core/viewer/json_bsgroupinfo.h +++ b/ydb/core/viewer/viewer_bsgroupinfo.h @@ -1,4 +1,3 @@ -#pragma once #include #include #include @@ -7,8 +6,7 @@ #include "wb_merge.h" #include "json_wb_req.h" -namespace NKikimr { -namespace NViewer { +namespace NKikimr::NViewer { template <> struct TWhiteboardInfo { @@ -55,19 +53,4 @@ struct TWhiteboardMergerComparator { using TJsonBSGroupInfo = TJsonWhiteboardRequest; -template <> -struct TJsonRequestSummary { - static TString GetSummary() { - return "Storage groups information"; - } -}; - -template <> -struct TJsonRequestDescription { - static TString GetDescription() { - return "Returns information about storage groups"; - } -}; - -} } diff --git a/ydb/core/viewer/viewer_capabilities.cpp b/ydb/core/viewer/viewer_capabilities.cpp index ee96e078bb96..80f67c94ecbb 100644 --- a/ydb/core/viewer/viewer_capabilities.cpp +++ b/ydb/core/viewer/viewer_capabilities.cpp @@ -5,8 +5,7 @@ #include "json_handlers.h" #include "json_pipe_req.h" -namespace NKikimr { -namespace NViewer { +namespace NKikimr::NViewer { using namespace NActors; @@ -26,40 +25,21 @@ class TViewerCapabilities : public TViewerPipeClient { void ReplyAndPassAway() override { NJson::TJsonValue json; json["Capabilities"] = Viewer->GetCapabilities(); - TBase::ReplyAndPassAway(GetHTTPOKJSON(NJson::WriteJson(json, false))); + TBase::ReplyAndPassAway(GetHTTPOKJSON(json)); } }; -template <> -YAML::Node TJsonRequestSwagger::GetSwagger() { - YAML::Node node = YAML::Load(R"___( - post: - tags: - - viewer - summary: Viewer capabilities - description: Viewer capabilities - responses: - 200: - description: OK - content: - application/json: - schema: - type: object - description: format depends on schema parameter - 400: - description: Bad Request - 403: - description: Forbidden - 504: - description: Gateway Timeout - )___"); +static YAML::Node GetSwagger() { + YAML::Node node; + node["get"]["tags"].push_back("viewer"); + node["get"]["summary"] = "Viewer capabilities"; + node["get"]["description"] = "Viewer capabilities"; + node["get"]["responses"]["200"]["description"] = "OK"; return node; } - void InitViewerCapabilitiesJsonHandler(TJsonHandlers& jsonHandlers) { - jsonHandlers.AddHandler("/viewer/capabilities", new TJsonHandler()); + jsonHandlers.AddHandler("/viewer/capabilities", new TJsonHandler(GetSwagger())); } -} // namespace NViewer -} // namespace NKikimr +} diff --git a/ydb/core/viewer/check_access.h b/ydb/core/viewer/viewer_check_access.cpp similarity index 79% rename from ydb/core/viewer/check_access.h rename to ydb/core/viewer/viewer_check_access.cpp index bf48d57f600c..983e1d98273b 100644 --- a/ydb/core/viewer/check_access.h +++ b/ydb/core/viewer/viewer_check_access.cpp @@ -1,4 +1,3 @@ -#pragma once #include #include #include @@ -9,9 +8,10 @@ #include #include #include "json_pipe_req.h" +#include "json_handlers.h" +#include "log.h" -namespace NKikimr { -namespace NViewer { +namespace NKikimr::NViewer { using namespace NActors; using NSchemeShard::TEvSchemeShard; @@ -20,15 +20,13 @@ using TNavigate = NSchemeCache::TSchemeCacheNavigate; class TCheckAccess : public TViewerPipeClient { using TThis = TCheckAccess; using TBase = TViewerPipeClient; - IViewer* Viewer; - NMon::TEvHttpInfo::TPtr Event; + using TBase::ReplyAndPassAway; TAutoPtr CacheResult; TVector Permissions; public: - TCheckAccess(IViewer* viewer, NMon::TEvHttpInfo::TPtr &ev) - : Viewer(viewer) - , Event(ev) + TCheckAccess(IViewer* viewer, NMon::TEvHttpInfo::TPtr& ev) + : TViewerPipeClient(viewer, ev) {} void Bootstrap() override { @@ -38,7 +36,7 @@ class TCheckAccess : public TViewerPipeClient { if (params.Has("database")) { database = params.Get("database"); } else { - return ReplyAndPassAway(Viewer->GetHTTPBADREQUEST(Event->Get(), "text/plain", "field 'database' is required")); + return ReplyAndPassAway(GetHTTPBADREQUEST("text/plain", "field 'database' is required")); } if (database && database != AppData()->TenantName) { BLOG_TRACE("Requesting StateStorageEndpointsLookup for " << database); @@ -47,12 +45,12 @@ class TCheckAccess : public TViewerPipeClient { if (params.Has("permissions")) { Split(params.Get("permissions"), ",", Permissions); } else { - return ReplyAndPassAway(Viewer->GetHTTPBADREQUEST(Event->Get(), "text/plain", "field 'permissions' is required")); + return ReplyAndPassAway(GetHTTPBADREQUEST("text/plain", "field 'permissions' is required")); } if (params.Has("path")) { RequestSchemeCacheNavigate(params.Get("path")); } else { - return ReplyAndPassAway(Viewer->GetHTTPBADREQUEST(Event->Get(), "text/plain", "field 'path' is required")); + return ReplyAndPassAway(GetHTTPBADREQUEST("text/plain", "field 'path' is required")); } } Become(&TThis::StateRequestedNavigate, TDuration::MilliSeconds(timeout), new TEvents::TEvWakeup()); @@ -113,16 +111,16 @@ class TCheckAccess : public TViewerPipeClient { token = std::make_unique(Event->Get()->UserToken); } if (CacheResult == nullptr) { - return ReplyAndPassAway(Viewer->GetHTTPINTERNALERROR(Event->Get(), "text/plain", "no SchemeCache response")); + return ReplyAndPassAway(GetHTTPINTERNALERROR("text/plain", "no SchemeCache response")); } if (CacheResult->Request == nullptr) { - return ReplyAndPassAway(Viewer->GetHTTPINTERNALERROR(Event->Get(), "text/plain", "wrong SchemeCache response")); + return ReplyAndPassAway(GetHTTPINTERNALERROR("text/plain", "wrong SchemeCache response")); } if (CacheResult->Request.Get()->ResultSet.empty()) { - return ReplyAndPassAway(Viewer->GetHTTPINTERNALERROR(Event->Get(), "text/plain", "SchemeCache response is empty")); + return ReplyAndPassAway(GetHTTPINTERNALERROR("text/plain", "SchemeCache response is empty")); } if (CacheResult->Request.Get()->ErrorCount != 0) { - return ReplyAndPassAway(Viewer->GetHTTPBADREQUEST(Event->Get(), "text/plain", TStringBuilder() << "SchemeCache response error " << static_cast(CacheResult->Request.Get()->ResultSet.front().Status))); + return ReplyAndPassAway(GetHTTPBADREQUEST("text/plain", TStringBuilder() << "SchemeCache response error " << static_cast(CacheResult->Request.Get()->ResultSet.front().Status))); } @@ -134,21 +132,15 @@ class TCheckAccess : public TViewerPipeClient { json[permission] = CheckAccessPermission(object.Get(), token.get(), permission); } - ReplyAndPassAway(Viewer->GetHTTPOKJSON(Event->Get(), NJson::WriteJson(json, false))); + ReplyAndPassAway(GetHTTPOKJSON(json)); } void HandleTimeout() { - ReplyAndPassAway(Viewer->GetHTTPGATEWAYTIMEOUT(Event->Get(), "text/plain", "Timeout receiving SchemeCache response")); - } - - void ReplyAndPassAway(TString data) { - Send(Event->Sender, new NMon::TEvHttpInfoRes(data, 0, NMon::IEvHttpInfoRes::EContentType::Custom)); - PassAway(); + ReplyAndPassAway(GetHTTPGATEWAYTIMEOUT("text/plain", "Timeout receiving SchemeCache response")); } }; -template <> -YAML::Node TJsonRequestSwagger::GetSwagger() { +static YAML::Node GetSwagger() { YAML::Node node = YAML::Load(R"___( get: tags: @@ -221,6 +213,8 @@ YAML::Node TJsonRequestSwagger::GetSwagger() { return node; } -} +void InitViewerCheckAccessJsonHandler(TJsonHandlers& jsonHandlers) { + jsonHandlers.AddHandler("/viewer/check_access", new TJsonHandler(GetSwagger())); } +} diff --git a/ydb/core/viewer/json_cluster.h b/ydb/core/viewer/viewer_cluster.cpp similarity index 93% rename from ydb/core/viewer/json_cluster.h rename to ydb/core/viewer/viewer_cluster.cpp index c1e7d6e421df..69c4dbcf8b14 100644 --- a/ydb/core/viewer/json_cluster.h +++ b/ydb/core/viewer/viewer_cluster.cpp @@ -1,6 +1,6 @@ -#pragma once #include #include +#include #include #include #include @@ -9,11 +9,15 @@ #include "json_pipe_req.h" #include "viewer.h" #include "viewer_probes.h" +#include "viewer_vdiskinfo.h" +#include "viewer_pdiskinfo.h" +#include "viewer_bsgroupinfo.h" +#include "viewer_tabletinfo.h" +#include "json_handlers.h" LWTRACE_USING(VIEWER_PROVIDER); -namespace NKikimr { -namespace NViewer { +namespace NKikimr::NViewer { using namespace NActors; using namespace NNodeWhiteboard; @@ -485,54 +489,46 @@ class TJsonCluster : public TViewerPipeClient { } }; -template <> -struct TJsonRequestSchema { - static YAML::Node GetSchema() { - return TProtoToYaml::ProtoToYamlSchema(); - } -}; - -template <> -struct TJsonRequestParameters { - static YAML::Node GetParameters() { - return YAML::Load(R"___( - - name: enums - in: query - description: convert enums to strings - required: false - type: boolean - - name: tablets - in: query - description: return system tablets state - required: false - type: boolean - - name: ui64 - in: query - description: return ui64 as number - required: false - type: boolean - - name: timeout - in: query - description: timeout in ms - required: false - type: integer - )___"); - } -}; - -template <> -struct TJsonRequestSummary { - static TString GetSummary() { - return "Cluster information"; - } -}; +static YAML::Node GetSwaggerParameters() { + return YAML::Load(R"___( + - name: enums + in: query + description: convert enums to strings + required: false + type: boolean + - name: tablets + in: query + description: return system tablets state + required: false + type: boolean + - name: ui64 + in: query + description: return ui64 as number + required: false + type: boolean + - name: timeout + in: query + description: timeout in ms + required: false + type: integer + )___"); +} -template <> -struct TJsonRequestDescription { - static TString GetDescription() { - return "Returns information about cluster"; - } -}; +static YAML::Node GetSwagger() { + TSimpleYamlBuilder yaml({ + .Method = "get", + .Tag = "viewer", + .Summary = "Cluster information", + .Description = "Returns information about cluster" + }); + YAML::Node node; + yaml.SetParameters(GetSwaggerParameters()); + yaml.SetResponseSchema(TProtoToYaml::ProtoToYamlSchema()); + return node; +} +void InitViewerClusterJsonHandler(TJsonHandlers& handlers) { + handlers.AddHandler("/viewer/cluster", new TJsonHandler(GetSwagger())); } + } diff --git a/ydb/core/viewer/json_compute.h b/ydb/core/viewer/viewer_compute.cpp similarity index 91% rename from ydb/core/viewer/json_compute.h rename to ydb/core/viewer/viewer_compute.cpp index 21ac3f0a60ea..abbef5ccc579 100644 --- a/ydb/core/viewer/json_compute.h +++ b/ydb/core/viewer/viewer_compute.cpp @@ -1,7 +1,7 @@ -#pragma once #include #include #include +#include #include #include #include @@ -14,12 +14,14 @@ #include #include "viewer.h" #include "viewer_helper.h" +#include "viewer_tabletinfo.h" #include "json_pipe_req.h" #include "wb_aggregate.h" #include "wb_merge.h" +#include "json_handlers.h" +#include "log.h" -namespace NKikimr { -namespace NViewer { +namespace NKikimr::NViewer { using namespace NActors; @@ -619,89 +621,81 @@ class TJsonCompute : public TViewerPipeClient { } }; -template <> -struct TJsonRequestSchema { - static YAML::Node GetSchema() { - return TProtoToYaml::ProtoToYamlSchema(); - } -}; - -template <> -struct TJsonRequestParameters { - static YAML::Node GetParameters() { - return YAML::Load(R"___( - - name: version - in: query - description: query version (v1, v2) - required: false - type: string - - name: path - in: query - description: schema path - required: false - type: string - - name: enums - in: query - description: convert enums to strings - required: false - type: boolean - - name: ui64 - in: query - description: return ui64 as number - required: false - type: boolean - - name: timeout - in: query - description: timeout in ms - required: false - type: integer - - name: uptime - in: query - description: return only nodes with less uptime in sec. - required: false - type: integer - - name: problems_only - in: query - description: return only problem nodes - required: false - type: boolean - - name: filter - in: query - description: filter nodes by id or host - required: false - type: string - - name: sort - in: query - description: sort by (NodeId,Host,DC,Rack,Version,Uptime,Memory,CPU,LoadAverage) - required: false - type: string - - name: offset - in: query - description: skip N nodes - required: false - type: integer - - name: limit - in: query - description: limit to N nodes - required: false - type: integer - )___"); - } -}; - -template <> -struct TJsonRequestSummary { - static TString GetSummary() { - return "Database compute information"; - } -}; +static YAML::Node GetSwaggerParameters() { + return YAML::Load(R"___( + - name: version + in: query + description: query version (v1, v2) + required: false + type: string + - name: path + in: query + description: schema path + required: false + type: string + - name: enums + in: query + description: convert enums to strings + required: false + type: boolean + - name: ui64 + in: query + description: return ui64 as number + required: false + type: boolean + - name: timeout + in: query + description: timeout in ms + required: false + type: integer + - name: uptime + in: query + description: return only nodes with less uptime in sec. + required: false + type: integer + - name: problems_only + in: query + description: return only problem nodes + required: false + type: boolean + - name: filter + in: query + description: filter nodes by id or host + required: false + type: string + - name: sort + in: query + description: sort by (NodeId,Host,DC,Rack,Version,Uptime,Memory,CPU,LoadAverage) + required: false + type: string + - name: offset + in: query + description: skip N nodes + required: false + type: integer + - name: limit + in: query + description: limit to N nodes + required: false + type: integer + )___"); +} -template <> -struct TJsonRequestDescription { - static TString GetDescription() { - return "Returns information about compute layer of database"; - } -}; +static YAML::Node GetSwagger() { + TSimpleYamlBuilder yaml({ + .Method = "get", + .Tag = "viewer", + .Summary = "Compute information", + .Description = "Returns information about compute layer of database", + }); + YAML::Node node; + yaml.SetParameters(GetSwaggerParameters()); + yaml.SetResponseSchema(TProtoToYaml::ProtoToYamlSchema()); + return node; +} +void InitViewerHiveInfoJsonHandler(TJsonHandlers& handlers) { + handlers.AddHandler("/viewer/compute", new TJsonHandler(GetSwagger())); } + } diff --git a/ydb/core/viewer/json_config.h b/ydb/core/viewer/viewer_config.cpp similarity index 72% rename from ydb/core/viewer/json_config.h rename to ydb/core/viewer/viewer_config.cpp index e239c82fc4f8..ab79377c03ae 100644 --- a/ydb/core/viewer/json_config.h +++ b/ydb/core/viewer/viewer_config.cpp @@ -1,4 +1,3 @@ -#pragma once #include #include #include @@ -6,9 +5,9 @@ #include #include #include "viewer.h" +#include "json_handlers.h" -namespace NKikimr { -namespace NViewer { +namespace NKikimr::NViewer { using namespace NActors; @@ -40,26 +39,19 @@ class TJsonConfig : public TActorBootstrapped { } }; -template <> -struct TJsonRequestSchema { - static YAML::Node GetSchema() { - return TProtoToYaml::ProtoToYamlSchema(); - } -}; - -template <> -struct TJsonRequestSummary { - static TString GetSummary() { - return "Configuration"; - } -}; - -template <> -struct TJsonRequestDescription { - static TString GetDescription() { - return "Returns configuration"; - } -}; +static YAML::Node GetSwagger() { + TSimpleYamlBuilder yaml({ + .Method = "get", + .Tag = "viewer", + .Summary = "Configuration", + .Description = "Returns configuration", + }); + yaml.SetResponseSchema(TProtoToYaml::ProtoToYamlSchema()); + return yaml; +} +void InitViewerConfigJsonHandler(TJsonHandlers& handlers) { + handlers.AddHandler("/viewer/config", new TJsonHandler(GetSwagger())); } + } diff --git a/ydb/core/viewer/json_content.h b/ydb/core/viewer/viewer_content.cpp similarity index 74% rename from ydb/core/viewer/json_content.h rename to ydb/core/viewer/viewer_content.cpp index 0d9399d36022..1139d3792c86 100644 --- a/ydb/core/viewer/json_content.h +++ b/ydb/core/viewer/viewer_content.cpp @@ -1,4 +1,3 @@ -#pragma once #include #include #include @@ -6,9 +5,9 @@ #include #include "viewer.h" #include "browse.h" +#include "json_handlers.h" -namespace NKikimr { -namespace NViewer { +namespace NKikimr::NViewer { using namespace NActors; using ::google::protobuf::FieldDescriptor; @@ -137,63 +136,59 @@ class TJsonContent : public TActorBootstrapped { } }; -template <> -struct TJsonRequestParameters { - static YAML::Node GetParameters() { - return YAML::Load(R"___( - - name: path - in: query - description: schema path - required: true - type: string - - name: enums - in: query - description: convert enums to strings - required: false - type: boolean - - name: ui64 - in: query - description: return ui64 as number - required: false - type: boolean - - name: key - in: query - description: key for positioning - required: false - type: string - - name: limit - in: query - description: rows limit - required: false - type: integer - - name: offset - in: query - description: offset in rows - required: false - type: integer - - name: timeout - in: query - description: timeout in ms - required: false - type: integer - )___"); - } -}; - -template <> -struct TJsonRequestSummary { - static TString GetSummary() { - return "Schema content preview"; - } -}; - -template <> -struct TJsonRequestDescription { - static TString GetDescription() { - return "Return schema preview"; - } -}; +static YAML::Node GetSwaggerParameters() { + return YAML::Load(R"___( + - name: path + in: query + description: schema path + required: true + type: string + - name: enums + in: query + description: convert enums to strings + required: false + type: boolean + - name: ui64 + in: query + description: return ui64 as number + required: false + type: boolean + - name: key + in: query + description: key for positioning + required: false + type: string + - name: limit + in: query + description: rows limit + required: false + type: integer + - name: offset + in: query + description: offset in rows + required: false + type: integer + - name: timeout + in: query + description: timeout in ms + required: false + type: integer + )___"); +} +static YAML::Node GetSwagger() { + TSimpleYamlBuilder yaml({ + .Method = "get", + .Tag = "viewer", + .Summary = "Schema content preview", + .Description = "Return schema preview" + }); + yaml.SetParameters(GetSwaggerParameters()); + return yaml; +} +void InitViewerDescribeJsonHandler(TJsonHandlers& jsonHandlers) { + jsonHandlers.AddHandler("/viewer/content", new TJsonHandler(GetSwagger())); } + } diff --git a/ydb/core/viewer/json_counters.h b/ydb/core/viewer/viewer_counters.cpp similarity index 99% rename from ydb/core/viewer/json_counters.h rename to ydb/core/viewer/viewer_counters.cpp index 8ad296bcbe43..815720af75c3 100644 --- a/ydb/core/viewer/json_counters.h +++ b/ydb/core/viewer/viewer_counters.cpp @@ -1,14 +1,15 @@ -#pragma once #include #include #include #include #include #include "viewer.h" -#include "json_tabletinfo.h" +#include "viewer_vdiskinfo.h" +#include "viewer_pdiskinfo.h" +#include "viewer_bsgroupinfo.h" +#include "viewer_tabletinfo.h" -namespace NKikimr { -namespace NViewer { +namespace NKikimr::NViewer { using namespace NActors; using ::google::protobuf::FieldDescriptor; @@ -436,4 +437,3 @@ class TJsonCounters : public TActorBootstrapped { }; } -} diff --git a/ydb/core/viewer/json_describe.h b/ydb/core/viewer/viewer_describe.cpp similarity index 80% rename from ydb/core/viewer/json_describe.h rename to ydb/core/viewer/viewer_describe.cpp index 27280609dda4..1e5be16c89f6 100644 --- a/ydb/core/viewer/json_describe.h +++ b/ydb/core/viewer/viewer_describe.cpp @@ -1,4 +1,3 @@ -#pragma once #include #include #include @@ -9,9 +8,10 @@ #include #include "viewer.h" #include "json_pipe_req.h" +#include "json_handlers.h" +#include "log.h" -namespace NKikimr { -namespace NViewer { +namespace NKikimr::NViewer { using namespace NActors; using NSchemeShard::TEvSchemeShard; @@ -20,8 +20,7 @@ using TNavigate = NSchemeCache::TSchemeCacheNavigate; class TJsonDescribe : public TViewerPipeClient { using TThis = TJsonDescribe; using TBase = TViewerPipeClient; - IViewer* Viewer; - NMon::TEvHttpInfo::TPtr Event; + using TBase::ReplyAndPassAway; TAutoPtr SchemeShardResult; TAutoPtr CacheResult; TAutoPtr DescribeResult; @@ -31,9 +30,8 @@ class TJsonDescribe : public TViewerPipeClient { int Requests = 0; public: - TJsonDescribe(IViewer* viewer, NMon::TEvHttpInfo::TPtr &ev) - : Viewer(viewer) - , Event(ev) + TJsonDescribe(IViewer* viewer, NMon::TEvHttpInfo::TPtr& ev) + : TViewerPipeClient(viewer, ev) {} void FillParams(NKikimrSchemeOp::TDescribePath* record, const TCgiParameters& params) { @@ -269,8 +267,7 @@ class TJsonDescribe : public TViewerPipeClient { json << "null"; } - Send(Event->Sender, new NMon::TEvHttpInfoRes(Viewer->GetHTTPOKJSON(Event->Get(), json.Str()), 0, NMon::IEvHttpInfoRes::EContentType::Custom)); - PassAway(); + ReplyAndPassAway(GetHTTPOKJSON(json.Str())); } void DecodeExternalTableContent(TStringStream& json) const { @@ -310,111 +307,101 @@ class TJsonDescribe : public TViewerPipeClient { } void HandleTimeout() { - Send(Event->Sender, new NMon::TEvHttpInfoRes(Viewer->GetHTTPGATEWAYTIMEOUT(Event->Get()), 0, NMon::IEvHttpInfoRes::EContentType::Custom)); - PassAway(); + ReplyAndPassAway(GetHTTPGATEWAYTIMEOUT()); } }; -template <> -struct TJsonRequestSchema { - static YAML::Node GetSchema() { - return TProtoToYaml::ProtoToYamlSchema(); - } -}; - -template <> -struct TJsonRequestParameters { - static YAML::Node GetParameters() { - return YAML::Load(R"___( - - name: path - in: query - description: schema path - required: false - type: string - - name: schemeshard_id - in: query - description: schemeshard identifier (tablet id) - required: false - type: integer - - name: path_id - in: query - description: path id - required: false - type: integer - - name: enums - in: query - description: convert enums to strings - required: false - type: boolean - - name: ui64 - in: query - description: return ui64 as number - required: false - type: boolean - - name: backup - in: query - description: return backup information - required: false - type: boolean - default: true - - name: private - in: query - description: return private tables - required: false - type: boolean - default: true - - name: children - in: query - description: return children - required: false - type: boolean - default: true - - name: boundaries - in: query - description: return boundaries - required: false - type: boolean - default: false - - name: partition_config - in: query - description: return partition configuration - required: false - type: boolean - default: true - - name: partition_stats - in: query - description: return partitions statistics - required: false - type: boolean - default: false - - name: partitioning_info - in: query - description: return partitioning information - required: false - type: boolean - default: true - - name: timeout - in: query - description: timeout in ms - required: false - type: integer - )___"); - } -}; - -template <> -struct TJsonRequestSummary { - static TString GetSummary() { - return "Schema detailed information"; - } -}; +static YAML::Node GetSwaggerParameters() { + return YAML::Load(R"___( + - name: path + in: query + description: schema path + required: false + type: string + - name: schemeshard_id + in: query + description: schemeshard identifier (tablet id) + required: false + type: integer + - name: path_id + in: query + description: path id + required: false + type: integer + - name: enums + in: query + description: convert enums to strings + required: false + type: boolean + - name: ui64 + in: query + description: return ui64 as number + required: false + type: boolean + - name: backup + in: query + description: return backup information + required: false + type: boolean + default: true + - name: private + in: query + description: return private tables + required: false + type: boolean + default: true + - name: children + in: query + description: return children + required: false + type: boolean + default: true + - name: boundaries + in: query + description: return boundaries + required: false + type: boolean + default: false + - name: partition_config + in: query + description: return partition configuration + required: false + type: boolean + default: true + - name: partition_stats + in: query + description: return partitions statistics + required: false + type: boolean + default: false + - name: partitioning_info + in: query + description: return partitioning information + required: false + type: boolean + default: true + - name: timeout + in: query + description: timeout in ms + required: false + type: integer + )___"); +} -template <> -struct TJsonRequestDescription { - static TString GetDescription() { - return "Returns detailed information about schema object"; - } -}; +static YAML::Node GetSwagger() { + TSimpleYamlBuilder yaml({ + .Method = "get", + .Tag = "viewer", + .Summary = "Schema detailed information", + .Description = "Returns detailed information about schema object" + }); + yaml.SetParameters(GetSwaggerParameters()); + yaml.SetResponseSchema(TProtoToYaml::ProtoToYamlSchema()); + return yaml; +} +void InitViewerDescribeJsonHandler(TJsonHandlers& jsonHandlers) { + jsonHandlers.AddHandler("/viewer/describe", new TJsonHandler(GetSwagger())); } + } diff --git a/ydb/core/viewer/json_describe_consumer.h b/ydb/core/viewer/viewer_describe_consumer.cpp similarity index 92% rename from ydb/core/viewer/json_describe_consumer.h rename to ydb/core/viewer/viewer_describe_consumer.cpp index 693f5cc5e065..60926167acb4 100644 --- a/ydb/core/viewer/json_describe_consumer.h +++ b/ydb/core/viewer/viewer_describe_consumer.cpp @@ -1,10 +1,9 @@ -#pragma once #include #include #include "json_local_rpc.h" +#include "json_handlers.h" -namespace NKikimr { -namespace NViewer { +namespace NKikimr::NViewer { using TDescribeConsumerRpc = TJsonLocalRpc -YAML::Node TJsonRequestSwagger::GetSwagger() { +static YAML::Node GetSwagger() { YAML::Node node = YAML::Load(R"___( get: tags: @@ -103,5 +101,8 @@ YAML::Node TJsonRequestSwagger::GetSwagger() { return node; } +void InitViewerDescribeConsumerJsonHandler(TJsonHandlers& jsonHandlers) { + jsonHandlers.AddHandler("/viewer/describe_consumer", new TJsonHandler(GetSwagger())); } + } diff --git a/ydb/core/viewer/json_describe_topic.h b/ydb/core/viewer/viewer_describe_topic.cpp similarity index 92% rename from ydb/core/viewer/json_describe_topic.h rename to ydb/core/viewer/viewer_describe_topic.cpp index 2a7a8fb418dc..24c6f3c3a53e 100644 --- a/ydb/core/viewer/json_describe_topic.h +++ b/ydb/core/viewer/viewer_describe_topic.cpp @@ -1,10 +1,9 @@ -#pragma once #include #include #include "json_local_rpc.h" +#include "json_handlers.h" -namespace NKikimr { -namespace NViewer { +namespace NKikimr::NViewer { using TDescribeTopicRpc = TJsonLocalRpc -YAML::Node TJsonRequestSwagger::GetSwagger() { +static YAML::Node GetSwagger() { YAML::Node node = YAML::Load(R"___( get: tags: @@ -103,5 +101,8 @@ YAML::Node TJsonRequestSwagger::GetSwagger() { return node; } +void InitViewerDescribeTopicJsonHandler(TJsonHandlers& jsonHandlers) { + jsonHandlers.AddHandler("/viewer/describe_topic", new TJsonHandler(GetSwagger())); } + } diff --git a/ydb/core/viewer/json_graph.h b/ydb/core/viewer/viewer_graph.cpp similarity index 82% rename from ydb/core/viewer/json_graph.h rename to ydb/core/viewer/viewer_graph.cpp index 20fa68980227..e00a27b53427 100644 --- a/ydb/core/viewer/json_graph.h +++ b/ydb/core/viewer/viewer_graph.cpp @@ -1,14 +1,13 @@ -#pragma once #include #include #include #include #include #include "viewer.h" +#include "json_handlers.h" #include "log.h" -namespace NKikimr { -namespace NViewer { +namespace NKikimr::NViewer { using namespace NActors; @@ -143,52 +142,49 @@ class TJsonGraph : public TActorBootstrapped { } }; -template <> -struct TJsonRequestParameters { - static YAML::Node GetParameters() { - return YAML::Load(R"___( - - name: target - in: query - description: metrics comma delimited - required: true - type: string - - name: from - in: query - description: time in seconds - required: false - type: integer - - name: until - in: query - description: time in seconds - required: false - type: integer - - name: maxDataPoints - in: query - description: maximum number of data points - required: false - type: integer - - name: format - in: query - description: response format, could be prometheus or graphite - required: false - type: string - )___"); - } -}; - -template <> -struct TJsonRequestSummary { - static TString GetSummary() { - return "Graph data"; - } -}; +static YAML::Node GetSwaggerParameters() { + return YAML::Load(R"___( + - name: target + in: query + description: metrics comma delimited + required: true + type: string + - name: from + in: query + description: time in seconds + required: false + type: integer + - name: until + in: query + description: time in seconds + required: false + type: integer + - name: maxDataPoints + in: query + description: maximum number of data points + required: false + type: integer + - name: format + in: query + description: response format, could be prometheus or graphite + required: false + type: string + )___"); +} -template <> -struct TJsonRequestDescription { - static TString GetDescription() { - return "Returns graph data"; - } -}; +static YAML::Node GetSwagger() { + TSimpleYamlBuilder yaml({ + .Method = "get", + .Tag = "viewer", + .Summary = "Graph data", + .Description = "Returns graph data", + }); + yaml.SetParameters(GetSwaggerParameters()); + return yaml; +} +void InitViewerHiveInfoJsonHandler(TJsonHandlers& handlers) { + handlers.AddHandler("/viewer/graph", new TJsonHandler(GetSwagger())); } + } diff --git a/ydb/core/viewer/json_healthcheck.h b/ydb/core/viewer/viewer_healthcheck.cpp similarity index 82% rename from ydb/core/viewer/json_healthcheck.h rename to ydb/core/viewer/viewer_healthcheck.cpp index 1d0d54415ad8..d6cb11c700c1 100644 --- a/ydb/core/viewer/json_healthcheck.h +++ b/ydb/core/viewer/viewer_healthcheck.cpp @@ -1,4 +1,3 @@ -#pragma once #include #include #include @@ -14,9 +13,9 @@ #include "json_pipe_req.h" #include "healthcheck_record.h" #include +#include "json_handlers.h" -namespace NKikimr { -namespace NViewer { +namespace NKikimr::NViewer { using namespace NActors; @@ -254,84 +253,75 @@ class TJsonHealthCheck : public TViewerPipeClient { } }; -template <> -struct TJsonRequestSchema { - static YAML::Node GetSchema() { - return TProtoToYaml::ProtoToYamlSchema(); - } -}; - -template <> -struct TJsonRequestParameters { - static YAML::Node GetParameters() { - return YAML::Load(R"___( - - name: enums - in: query - description: convert enums to strings - required: false - type: boolean - - name: ui64 - in: query - description: return ui64 as number - required: false - type: boolean - - name: timeout - in: query - description: timeout in ms - required: false - type: integer - - name: tenant - in: query - description: path to database - required: false - type: string - - name: cache - in: query - description: use cache - required: false - type: boolean - - name: verbose - in: query - description: return verbose status - required: false - type: boolean - - name: merge_records - in: query - description: merge records - required: false - type: boolean - - name: max_level - in: query - description: max depth of issues to return - required: false - type: integer - - name: min_status - in: query - description: min status of issues to return - required: false - type: string - - name: format - in: query - description: format of reply - required: false - type: string - )___"); - } -}; - -template <> -struct TJsonRequestSummary { - static TString GetSummary() { - return "Self-check result"; - } -}; +static YAML::Node GetSwaggerParameters() { + return YAML::Load(R"___( + - name: enums + in: query + description: convert enums to strings + required: false + type: boolean + - name: ui64 + in: query + description: return ui64 as number + required: false + type: boolean + - name: timeout + in: query + description: timeout in ms + required: false + type: integer + - name: tenant + in: query + description: path to database + required: false + type: string + - name: cache + in: query + description: use cache + required: false + type: boolean + - name: verbose + in: query + description: return verbose status + required: false + type: boolean + - name: merge_records + in: query + description: merge records + required: false + type: boolean + - name: max_level + in: query + description: max depth of issues to return + required: false + type: integer + - name: min_status + in: query + description: min status of issues to return + required: false + type: string + - name: format + in: query + description: format of reply + required: false + type: string + )___"); +} -template <> -struct TJsonRequestDescription { - static TString GetDescription() { - return "Performs self-check and returns result"; - } -}; +static YAML::Node GetSwagger() { + TSimpleYamlBuilder yaml({ + .Method = "get", + .Tag = "viewer", + .Summary = "Self-check result", + .Description = "Performs self-check and returns result", + }); + yaml.SetParameters(GetSwaggerParameters()); + yaml.SetResponseSchema(TProtoToYaml::ProtoToYamlSchema()); + return yaml; +} +void InitViewerHealthCheckJsonHandler(TJsonHandlers& handlers) { + handlers.AddHandler("/viewer/healthcheck", new TJsonHandler(GetSwagger())); } + } diff --git a/ydb/core/viewer/json_hiveinfo.h b/ydb/core/viewer/viewer_hiveinfo.cpp similarity index 56% rename from ydb/core/viewer/json_hiveinfo.h rename to ydb/core/viewer/viewer_hiveinfo.cpp index a93458369d3c..da3bdbbbde18 100644 --- a/ydb/core/viewer/json_hiveinfo.h +++ b/ydb/core/viewer/viewer_hiveinfo.cpp @@ -1,4 +1,3 @@ -#pragma once #include #include #include @@ -7,27 +6,25 @@ #include #include "viewer.h" #include "json_pipe_req.h" +#include "json_handlers.h" #include -namespace NKikimr { -namespace NViewer { +namespace NKikimr::NViewer { using namespace NActors; class TJsonHiveInfo : public TViewerPipeClient { using TThis = TJsonHiveInfo; using TBase = TViewerPipeClient; - IViewer* Viewer; - NMon::TEvHttpInfo::TPtr Event; + using TBase::ReplyAndPassAway; TAutoPtr HiveInfo; TJsonSettings JsonSettings; ui32 Timeout = 0; TNodeId NodeId = 0; public: - TJsonHiveInfo(IViewer* viewer, NMon::TEvHttpInfo::TPtr &ev) - : Viewer(viewer) - , Event(ev) + TJsonHiveInfo(IViewer* viewer, NMon::TEvHttpInfo::TPtr& ev) + : TViewerPipeClient(viewer, ev) {} void Bootstrap() override { @@ -88,84 +85,69 @@ class TJsonHiveInfo : public TViewerPipeClient { } else { json << "null"; } - Send(Event->Sender, new NMon::TEvHttpInfoRes(Viewer->GetHTTPOKJSON(Event->Get(), json.Str()), 0, NMon::IEvHttpInfoRes::EContentType::Custom)); - PassAway(); - } - - void HandleTimeout() { - Send(Event->Sender, new NMon::TEvHttpInfoRes(Viewer->GetHTTPGATEWAYTIMEOUT(Event->Get()), 0, NMon::IEvHttpInfoRes::EContentType::Custom)); - PassAway(); - } -}; - -template <> -struct TJsonRequestSchema { - static YAML::Node GetSchema() { - return TProtoToYaml::ProtoToYamlSchema(); - } -}; - -template <> -struct TJsonRequestParameters { - static YAML::Node GetParameters() { - return YAML::Load(R"___( - - name: hive_id - in: query - description: hive identifier (tablet id) - required: true - type: string - - name: tablet_id - in: query - description: tablet id filter - required: false - type: string - - name: tablet_type - in: query - description: tablet type filter - required: false - type: string - - name: followers - in: query - description: return followers - required: false - type: boolean - - name: metrics - in: query - description: return tablet metrics - required: false - type: boolean - - name: enums - in: query - description: convert enums to strings - required: false - type: boolean - - name: ui64 - in: query - description: return ui64 as number - required: false - type: boolean - - name: timeout - in: query - description: timeout in ms - required: false - type: integer - )___"); + ReplyAndPassAway(GetHTTPOKJSON(json.Str())); } }; -template <> -struct TJsonRequestSummary { - static TString GetSummary() { - return "Hive information"; - } -}; - -template <> -struct TJsonRequestDescription { - static TString GetDescription() { - return "Returns information about tablets from Hive"; - } -}; +static YAML::Node GetSwaggerParameters() { + return YAML::Load(R"___( + - name: hive_id + in: query + description: hive identifier (tablet id) + required: true + type: string + - name: tablet_id + in: query + description: tablet id filter + required: false + type: string + - name: tablet_type + in: query + description: tablet type filter + required: false + type: string + - name: followers + in: query + description: return followers + required: false + type: boolean + - name: metrics + in: query + description: return tablet metrics + required: false + type: boolean + - name: enums + in: query + description: convert enums to strings + required: false + type: boolean + - name: ui64 + in: query + description: return ui64 as number + required: false + type: boolean + - name: timeout + in: query + description: timeout in ms + required: false + type: integer + )___"); +} +static YAML::Node GetSwagger() { + TSimpleYamlBuilder yaml({ + .Method = "get", + .Tag = "viewer", + .Summary = "Hive Info", + .Description = "Returns information about the hive", + }); + yaml.SetParameters(GetSwaggerParameters()); + yaml.SetResponseSchema(TProtoToYaml::ProtoToYamlSchema()); + return yaml; } + +void InitViewerHiveInfoJsonHandler(TJsonHandlers& handlers) { + handlers.AddHandler("/viewer/hiveinfo", new TJsonHandler(GetSwagger())); } + +} // namespace NKikimr::NViewer diff --git a/ydb/core/viewer/json_hivestats.h b/ydb/core/viewer/viewer_hivestats.cpp similarity index 62% rename from ydb/core/viewer/json_hivestats.h rename to ydb/core/viewer/viewer_hivestats.cpp index d1529630df59..4e8aa09da5ea 100644 --- a/ydb/core/viewer/json_hivestats.h +++ b/ydb/core/viewer/viewer_hivestats.cpp @@ -1,4 +1,3 @@ -#pragma once #include #include #include @@ -7,10 +6,9 @@ #include #include "viewer.h" #include "json_pipe_req.h" -#include +#include "json_handlers.h" -namespace NKikimr { -namespace NViewer { +namespace NKikimr::NViewer { using namespace NActors; @@ -76,64 +74,55 @@ class TJsonHiveStats : public TViewerPipeClient { } }; -template <> -struct TJsonRequestSchema { - static YAML::Node GetSchema() { - return TProtoToYaml::ProtoToYamlSchema(); - } -}; - -template <> -struct TJsonRequestParameters { - static YAML::Node GetParameters() { - return YAML::Load(R"___( - - name: hive_id - in: query - description: hive identifier (tablet id) - required: true - type: string - - name: followers - in: query - description: return followers - required: false - type: boolean - - name: metrics - in: query - description: return tablet metrics - required: false - type: boolean - - name: enums - in: query - description: convert enums to strings - required: false - type: boolean - - name: ui64 - in: query - description: return ui64 as number - required: false - type: boolean - - name: timeout - in: query - description: timeout in ms - required: false - type: integer - )___"); - } -}; - -template <> -struct TJsonRequestSummary { - static TString GetSummary() { - return "Hive statistics"; - } -}; +static YAML::Node GetSwaggerParameters() { + return YAML::Load(R"___( + - name: hive_id + in: query + description: hive identifier (tablet id) + required: true + type: string + - name: followers + in: query + description: return followers + required: false + type: boolean + - name: metrics + in: query + description: return tablet metrics + required: false + type: boolean + - name: enums + in: query + description: convert enums to strings + required: false + type: boolean + - name: ui64 + in: query + description: return ui64 as number + required: false + type: boolean + - name: timeout + in: query + description: timeout in ms + required: false + type: integer + )___"); +} -template <> -struct TJsonRequestDescription { - static TString GetDescription() { - return "Returns information about Hive statistics"; - } -}; +static YAML::Node GetSwagger() { + TSimpleYamlBuilder yaml({ + .Method = "get", + .Tag = "viewer", + .Summary = "Hive statistics", + .Description = "Returns information about Hive statistics", + }); + yaml.SetParameters(GetSwaggerParameters()); + yaml.SetResponseSchema(TProtoToYaml::ProtoToYamlSchema()); + return yaml; +} +void InitViewerHiveStatsJsonHandler(TJsonHandlers& handlers) { + handlers.AddHandler("/viewer/hivestats", new TJsonHandler(GetSwagger())); } + } diff --git a/ydb/core/viewer/json_hotkeys.h b/ydb/core/viewer/viewer_hotkeys.cpp similarity index 78% rename from ydb/core/viewer/json_hotkeys.h rename to ydb/core/viewer/viewer_hotkeys.cpp index a0e67a5d8389..9733b12b9dd8 100644 --- a/ydb/core/viewer/json_hotkeys.h +++ b/ydb/core/viewer/viewer_hotkeys.cpp @@ -1,4 +1,3 @@ -#pragma once #include #include #include @@ -10,9 +9,9 @@ #include #include "viewer.h" #include "json_pipe_req.h" +#include "json_handlers.h" -namespace NKikimr { -namespace NViewer { +namespace NKikimr::NViewer { using namespace NActors; using NSchemeShard::TEvSchemeShard; @@ -21,8 +20,7 @@ class TJsonHotkeys : public TViewerPipeClient { static const bool WithRetry = false; using TThis = TJsonHotkeys; using TBase = TViewerPipeClient; - IViewer* Viewer; - NMon::TEvHttpInfo::TPtr Event; + using TBase::ReplyAndPassAway; TAutoPtr DescribeResult; ui32 Timeout = 0; ui32 Limit = 0; @@ -38,9 +36,8 @@ class TJsonHotkeys : public TViewerPipeClient { TMultiSet>, KeysComparator> Keys; public: - TJsonHotkeys(IViewer* viewer, NMon::TEvHttpInfo::TPtr &ev) - : Viewer(viewer) - , Event(ev) + TJsonHotkeys(IViewer* viewer, NMon::TEvHttpInfo::TPtr& ev) + : TViewerPipeClient(viewer, ev) {} void FillParams(NKikimrSchemeOp::TDescribePath* record, const TCgiParameters& params) { @@ -142,25 +139,55 @@ class TJsonHotkeys : public TViewerPipeClient { if (DescribeResult != nullptr) { switch (DescribeResult->GetRecord().GetStatus()) { case NKikimrScheme::StatusAccessDenied: - Send(Event->Sender, new NMon::TEvHttpInfoRes(Viewer->GetHTTPFORBIDDEN(Event->Get()), 0, NMon::IEvHttpInfoRes::EContentType::Custom)); - PassAway(); - return; + return ReplyAndPassAway(GetHTTPFORBIDDEN()); default: break; } } NJson::TJsonValue root = BuildResponse(); - TString json = NJson::WriteJson(root, false); - - Send(Event->Sender, new NMon::TEvHttpInfoRes(Viewer->GetHTTPOKJSON(Event->Get(), json), 0, NMon::IEvHttpInfoRes::EContentType::Custom)); - PassAway(); - } - - void HandleTimeout() { - Send(Event->Sender, new NMon::TEvHttpInfoRes(Viewer->GetHTTPGATEWAYTIMEOUT(Event->Get()), 0, NMon::IEvHttpInfoRes::EContentType::Custom)); - PassAway(); + ReplyAndPassAway(GetHTTPOKJSON(root)); } }; +static YAML::Node GetSwaggerParameters() { + return YAML::Load(R"___( + - name: enable_sampling + in: query + required: false + type: boolean + default: false + - name: polling_factor + in: query + required: false + type: float + default: 0.2 + - name: limit + in: query + description: return partitioning information + required: false + type: integer + default: 10 + - name: timeout + in: query + description: timeout in ms + required: false + type: integer + default: 10000 + )___"); } + + +static YAML::Node GetSwagger() { + YAML::Node swagger; + swagger["summary"] = "Information about current hot keys in a datashard"; + swagger["description"] = "Samples and returns information about current hot keys"; + swagger["tags"].push_back("viewer"); + swagger["parameters"] = GetSwaggerParameters(); + return swagger; +} + +void InitViewerHotkeysJsonHandler(TJsonHandlers& jsonHandlers) { + jsonHandlers.AddHandler("/viewer/hotkeys", new TJsonHandler(GetSwagger())); +} + } diff --git a/ydb/core/viewer/json_labeledcounters.h b/ydb/core/viewer/viewer_labeled_counters.cpp similarity index 71% rename from ydb/core/viewer/json_labeledcounters.h rename to ydb/core/viewer/viewer_labeled_counters.cpp index c8ea014b6205..608b2834c5a7 100644 --- a/ydb/core/viewer/json_labeledcounters.h +++ b/ydb/core/viewer/viewer_labeled_counters.cpp @@ -1,15 +1,15 @@ -#pragma once #include #include #include +#include #include #include #include #include #include "viewer.h" +#include "json_handlers.h" -namespace NKikimr { -namespace NViewer { +namespace NKikimr::NViewer { using namespace NActors; @@ -47,7 +47,7 @@ class TJsonLabeledCounters : public TActorBootstrapped { Topic = NPersQueue::ConvertNewTopicName(params.Get("topic")); if (Topic.empty()) Topic = "*"; - Consumer = NPersQueue::ConvertNewConsumerName(params.Get("consumer"), ctx); + Consumer = NPersQueue::ConvertNewConsumerName(params.Get("consumer")); DC = params.Get("dc"); if (DC.empty()) DC = "*"; @@ -147,91 +147,82 @@ class TJsonLabeledCounters : public TActorBootstrapped { } }; -template <> -struct TJsonRequestSchema { - static YAML::Node GetSchema() { - return TProtoToYaml::ProtoToYamlSchema(); - } -}; - -template <> -struct TJsonRequestParameters { - static YAML::Node GetParameters() { - return YAML::Load(R"___( - - name: group - in: query - description: group name - required: false - type: string - - name: dc - in: query - description: datacenter name - required: false - type: string - default: "*" - - name: topic - in: query - description: topic name - required: false - type: string - default: "*" - - name: consumer - in: query - description: consumer name - required: false - type: string - default: "" - - name: group_names - in: query - description: group names - required: false - type: string - - name: counters - in: query - description: counters names - required: false - type: string - - name: enums - in: query - description: convert enums to strings - required: false - type: boolean - default: false - - name: all - in: query - description: return information about all topics and clients - required: false - type: boolean - default: false - - name: ui64 - in: query - description: return ui64 as number - required: false - type: boolean - default: false - - name: timeout - in: query - description: timeout in ms - required: false - type: integer - default: 10000 - )___"); - } -}; - -template <> -struct TJsonRequestSummary { - static TString GetSummary() { - return "Labeled counters info"; - } -}; +static YAML::Node GetSwaggerParameters() { + return YAML::Load(R"___( + - name: group + in: query + description: group name + required: false + type: string + - name: dc + in: query + description: datacenter name + required: false + type: string + default: "*" + - name: topic + in: query + description: topic name + required: false + type: string + default: "*" + - name: consumer + in: query + description: consumer name + required: false + type: string + default: "" + - name: group_names + in: query + description: group names + required: false + type: string + - name: counters + in: query + description: counters names + required: false + type: string + - name: enums + in: query + description: convert enums to strings + required: false + type: boolean + default: false + - name: all + in: query + description: return information about all topics and clients + required: false + type: boolean + default: false + - name: ui64 + in: query + description: return ui64 as number + required: false + type: boolean + default: false + - name: timeout + in: query + description: timeout in ms + required: false + type: integer + default: 10000 + )___"); +} -template <> -struct TJsonRequestDescription { - static TString GetDescription() { - return "Returns information about labeled counters"; - } -}; +static YAML::Node GetSwagger() { + TSimpleYamlBuilder yaml({ + .Method = "get", + .Tag = "viewer", + .Summary = "Labeled counters info", + .Description = "Returns information about labeled counters", + }); + yaml.SetParameters(GetSwaggerParameters()); + yaml.SetResponseSchema(TProtoToYaml::ProtoToYamlSchema()); + return yaml; +} +void InitViewerHiveInfoJsonHandler(TJsonHandlers& handlers) { + handlers.AddHandler("/viewer/labeledcounters", new TJsonHandler(GetSwagger())); } + } diff --git a/ydb/core/viewer/json_metainfo.h b/ydb/core/viewer/viewer_metainfo.cpp similarity index 75% rename from ydb/core/viewer/json_metainfo.h rename to ydb/core/viewer/viewer_metainfo.cpp index b96a26a4478a..31d224fd2613 100644 --- a/ydb/core/viewer/json_metainfo.h +++ b/ydb/core/viewer/viewer_metainfo.cpp @@ -1,4 +1,3 @@ -#pragma once #include #include #include @@ -17,9 +16,9 @@ #include #include "viewer.h" #include "wb_aggregate.h" +#include "json_handlers.h" -namespace NKikimr { -namespace NViewer { +namespace NKikimr::NViewer { using namespace NActors; @@ -126,64 +125,55 @@ class TJsonMetaInfo : public TActorBootstrapped { } }; -template <> -struct TJsonRequestSchema { - static YAML::Node GetSchema() { - return TProtoToYaml::ProtoToYamlSchema(); - } -}; - -template <> -struct TJsonRequestParameters { - static YAML::Node GetParameters() { - return YAML::Load(R"___( - - name: path - in: query - description: schema path - required: false - type: string - - name: tablet_id - in: query - description: tablet identifier - required: false - type: integer - - name: enums - in: query - description: convert enums to strings - required: false - type: boolean - - name: counters - in: query - description: return tablet counters - required: false - type: boolean - - name: ui64 - in: query - description: return ui64 as number - required: false - type: boolean - - name: timeout - in: query - description: timeout in ms - required: false - type: integer - )___"); - } -}; - -template <> -struct TJsonRequestSummary { - static TString GetSummary() { - return "Schema meta information"; - } -}; +static YAML::Node GetSwaggerParameters() { + return YAML::Load(R"___( + - name: path + in: query + description: schema path + required: false + type: string + - name: tablet_id + in: query + description: tablet identifier + required: false + type: integer + - name: enums + in: query + description: convert enums to strings + required: false + type: boolean + - name: counters + in: query + description: return tablet counters + required: false + type: boolean + - name: ui64 + in: query + description: return ui64 as number + required: false + type: boolean + - name: timeout + in: query + description: timeout in ms + required: false + type: integer + )___"); +} -template <> -struct TJsonRequestDescription { - static TString GetDescription() { - return "Returns meta information about schema path"; - } -}; +static YAML::Node GetSwagger() { + TSimpleYamlBuilder yaml({ + .Method = "get", + .Tag = "viewer", + .Summary = "Schema meta information", + .Description = "Returns meta information about schema path", + }); + yaml.SetParameters(GetSwaggerParameters()); + yaml.SetResponseSchema(TProtoToYaml::ProtoToYamlSchema()); + return yaml; +} +void InitViewerMetaInfoJsonHandler(TJsonHandlers& handlers) { + handlers.AddHandler("/viewer/metainfo", new TJsonHandler(GetSwagger())); } + } diff --git a/ydb/core/viewer/json_netinfo.h b/ydb/core/viewer/viewer_netinfo.cpp similarity index 90% rename from ydb/core/viewer/json_netinfo.h rename to ydb/core/viewer/viewer_netinfo.cpp index c10cd7d745f5..bafda91b33d7 100644 --- a/ydb/core/viewer/json_netinfo.h +++ b/ydb/core/viewer/viewer_netinfo.cpp @@ -1,7 +1,7 @@ -#pragma once #include #include #include +#include #include #include #include @@ -14,11 +14,11 @@ #include #include "viewer.h" #include "json_pipe_req.h" +#include "json_handlers.h" #include "wb_aggregate.h" #include "wb_merge.h" -namespace NKikimr { -namespace NViewer { +namespace NKikimr::NViewer { using namespace NActors; @@ -296,59 +296,50 @@ class TJsonNetInfo : public TViewerPipeClient { } }; -template <> -struct TJsonRequestSchema { - static YAML::Node GetSchema() { - return TProtoToYaml::ProtoToYamlSchema(); - } -}; - -template <> -struct TJsonRequestParameters { - static YAML::Node GetParameters() { - return YAML::Load(R"___( - - name: path - in: query - description: schema path - required: false - type: string - - name: hive_id - in: query - description: hive identifier (tablet id) - required: false - type: string - - name: enums - in: query - description: convert enums to strings - required: false - type: boolean - - name: ui64 - in: query - description: return ui64 as number - required: false - type: boolean - - name: timeout - in: query - description: timeout in ms - required: false - type: integer - )___"); - } -}; - -template <> -struct TJsonRequestSummary { - static TString GetSummary() { - return "Network information"; - } -}; +static YAML::Node GetSwaggerParameters() { + return YAML::Load(R"___( + - name: path + in: query + description: schema path + required: false + type: string + - name: hive_id + in: query + description: hive identifier (tablet id) + required: false + type: string + - name: enums + in: query + description: convert enums to strings + required: false + type: boolean + - name: ui64 + in: query + description: return ui64 as number + required: false + type: boolean + - name: timeout + in: query + description: timeout in ms + required: false + type: integer + )___"); +} -template <> -struct TJsonRequestDescription { - static TString GetDescription() { - return "Returns network information"; - } -}; +static YAML::Node GetSwagger() { + TSimpleYamlBuilder yaml({ + .Method = "get", + .Tag = "viewer", + .Summary = "Network information", + .Description = "Returns network information", + }); + yaml.SetParameters(GetSwaggerParameters()); + yaml.SetResponseSchema(TProtoToYaml::ProtoToYamlSchema()); + return yaml; +} +void InitViewerNetInfoJsonHandler(TJsonHandlers& handlers) { + handlers.AddHandler("/viewer/netinfo", new TJsonHandler(GetSwagger())); } + } diff --git a/ydb/core/viewer/json_nodeinfo.h b/ydb/core/viewer/viewer_nodeinfo.cpp similarity index 71% rename from ydb/core/viewer/json_nodeinfo.h rename to ydb/core/viewer/viewer_nodeinfo.cpp index ac1dbb04878d..d6f2d8c94112 100644 --- a/ydb/core/viewer/json_nodeinfo.h +++ b/ydb/core/viewer/viewer_nodeinfo.cpp @@ -1,4 +1,3 @@ -#pragma once #include #include #include @@ -6,9 +5,9 @@ #include #include "wb_merge.h" #include "json_wb_req.h" +#include "json_handlers.h" -namespace NKikimr { -namespace NViewer { +namespace NKikimr::NViewer { template <> struct TWhiteboardInfo { @@ -44,19 +43,20 @@ struct TWhiteboardInfo { using TJsonNodeInfo = TJsonWhiteboardRequest; -template <> -struct TJsonRequestSummary { - static TString GetSummary() { - return "Interconnect information"; - } -}; +static YAML::Node GetSwagger() { + YAML::Node swagger; + swagger["summary"] = "Interconnect information"; + swagger["description"] = "Returns information about node connections"; + swagger["tags"].push_back("viewer"); + swagger["parameters"] = GetWhiteboardRequestParameters(); + swagger["responses"]["200"] = TProtoToYaml::ProtoToYamlSchema(); + return swagger; -template <> -struct TJsonRequestDescription { - static TString GetDescription() { - return "Returns information about node connections"; - } -}; +} +void InitViewerNodeInfoJsonHandler(TJsonHandlers& jsonHandlers) { + jsonHandlers.AddHandler("/viewer/nodeinfo", new TJsonHandler(GetSwagger())); + TWhiteboardInfo::InitMerger(); } + } diff --git a/ydb/core/viewer/json_nodelist.h b/ydb/core/viewer/viewer_nodelist.cpp similarity index 73% rename from ydb/core/viewer/json_nodelist.h rename to ydb/core/viewer/viewer_nodelist.cpp index d1d3310f616e..3df6ff638737 100644 --- a/ydb/core/viewer/json_nodelist.h +++ b/ydb/core/viewer/viewer_nodelist.cpp @@ -1,4 +1,3 @@ -#pragma once #include #include #include @@ -6,9 +5,9 @@ #include #include #include "viewer.h" +#include "json_handlers.h" -namespace NKikimr { -namespace NViewer { +namespace NKikimr::NViewer { using namespace NActors; @@ -83,41 +82,37 @@ class TJsonNodeList : public TActorBootstrapped { } }; -template <> -struct TJsonRequestSchema { - static YAML::Node GetSchema() { - return YAML::Load(R"___( - type: array - title: TEvNodeListResponse - items: - type: object - title: TNodeInfo - properties: - Id: - type: integer - Host: - type: string - Address: - type: string - Port: - type: integer - )___"); - } -}; - -template <> -struct TJsonRequestSummary { - static TString GetSummary() { - return "Nodes list"; - } -}; - -template <> -struct TJsonRequestDescription { - static TString GetDescription() { - return "Returns list of nodes"; - } -}; +static YAML::Node GetSwagger() { + YAML::Node node = YAML::Load(R"___( + get: + tags: + - viewer + summary: Nodes list + description: Returns list of nodes + responses: + 200: + description: Successful response + schema: + type: array + title: TEvNodeListResponse + items: + type: object + title: TNodeInfo + properties: + Id: + type: integer + Host: + type: string + Address: + type: string + Port: + type: integer" + )___"); + return node; +} +void InitViewerNodeListJsonHandler(TJsonHandlers& jsonHandlers) { + jsonHandlers.AddHandler("/viewer/nodelist", new TJsonHandler(GetSwagger())); } + } diff --git a/ydb/core/viewer/json_nodes.h b/ydb/core/viewer/viewer_nodes.cpp similarity index 92% rename from ydb/core/viewer/json_nodes.h rename to ydb/core/viewer/viewer_nodes.cpp index e327d79d990c..8ce30ef0fc2e 100644 --- a/ydb/core/viewer/json_nodes.h +++ b/ydb/core/viewer/viewer_nodes.cpp @@ -1,7 +1,7 @@ -#pragma once #include #include #include +#include #include #include #include @@ -9,12 +9,13 @@ #include #include "viewer.h" #include "viewer_helper.h" +#include "viewer_tabletinfo.h" +#include "wb_group.h" #include "json_pipe_req.h" -#include "json_sysinfo.h" -#include "json_pdiskinfo.h" +#include "json_handlers.h" +#include "log.h" -namespace NKikimr { -namespace NViewer { +namespace NKikimr::NViewer { using namespace NActors; using namespace NNodeWhiteboard; @@ -709,8 +710,8 @@ class TJsonNodes : public TViewerPipeClient { return 0; } - static uint32 GetMissing(const NKikimrViewer::TNodeInfo& nodeInfo) { - uint32 missing = 0; + static ui32 GetMissing(const NKikimrViewer::TNodeInfo& nodeInfo) { + ui32 missing = 0; for (const auto& pDisk : nodeInfo.GetPDisks()) { if (pDisk.state() != NKikimrBlobStorage::TPDiskState::Normal) { missing++; @@ -926,104 +927,96 @@ class TJsonNodes : public TViewerPipeClient { } }; -template <> -struct TJsonRequestSchema { - static YAML::Node GetSchema() { - return TProtoToYaml::ProtoToYamlSchema(); - } -}; - -template <> -struct TJsonRequestParameters { - static YAML::Node GetParameters() { - return YAML::Load(R"___( - - name: enums - in: query - description: convert enums to strings - required: false - type: boolean - - name: ui64 - in: query - description: return ui64 as numbers - required: false - type: boolean - - name: path - in: query - description: path to schema object - required: false - type: string - - name: with - in: query - description: filter nodes by missing disks or space - required: false - type: string - - name: type - in: query - description: nodes type to get (static,dynamic,any) - required: false - type: string - - name: storage - in: query - description: return storage info - required: false - type: boolean - - name: tablets - in: query - description: return tablets info - required: false - type: boolean - - name: sort - in: query - description: sort by (NodeId,Host,DC,Rack,Version,Uptime,Memory,CPU,LoadAverage,Missing) - required: false - type: string - - name: offset - in: query - description: skip N nodes - required: false - type: integer - - name: limit - in: query - description: limit to N nodes - required: false - type: integer - - name: timeout - in: query - description: timeout in ms - required: false - type: integer - - name: uptime - in: query - description: return only nodes with less uptime in sec. - required: false - type: integer - - name: problems_only - in: query - description: return only problem nodes - required: false - type: boolean - - name: filter - in: query - description: filter nodes by id or host - required: false - type: string - )___"); - } -}; - -template <> -struct TJsonRequestSummary { - static TString GetSummary() { - return "Nodes info"; - } -}; +static YAML::Node GetSwaggerParameters() { + return YAML::Load(R"___( + - name: enums + in: query + description: convert enums to strings + required: false + type: boolean + - name: ui64 + in: query + description: return ui64 as numbers + required: false + type: boolean + - name: path + in: query + description: path to schema object + required: false + type: string + - name: with + in: query + description: filter nodes by missing disks or space + required: false + type: string + - name: type + in: query + description: nodes type to get (static,dynamic,any) + required: false + type: string + - name: storage + in: query + description: return storage info + required: false + type: boolean + - name: tablets + in: query + description: return tablets info + required: false + type: boolean + - name: sort + in: query + description: sort by (NodeId,Host,DC,Rack,Version,Uptime,Memory,CPU,LoadAverage,Missing) + required: false + type: string + - name: offset + in: query + description: skip N nodes + required: false + type: integer + - name: limit + in: query + description: limit to N nodes + required: false + type: integer + - name: timeout + in: query + description: timeout in ms + required: false + type: integer + - name: uptime + in: query + description: return only nodes with less uptime in sec. + required: false + type: integer + - name: problems_only + in: query + description: return only problem nodes + required: false + type: boolean + - name: filter + in: query + description: filter nodes by id or host + required: false + type: string + )___"); +} -template <> -struct TJsonRequestDescription { - static TString GetDescription() { - return "Information about nodes"; - } -}; +static YAML::Node GetSwagger() { + TSimpleYamlBuilder yaml({ + .Method = "get", + .Tag = "viewer", + .Summary = "Nodes info", + .Description = "Information about nodes", + }); + YAML::Node node; + yaml.SetParameters(GetSwaggerParameters()); + yaml.SetResponseSchema(TProtoToYaml::ProtoToYamlSchema()); + return node; +} +void InitViewerNodesJsonHandler(TJsonHandlers& handlers) { + handlers.AddHandler("/viewer/nodes", new TJsonHandler(GetSwagger())); } + } diff --git a/ydb/core/viewer/viewer_pdiskinfo.cpp b/ydb/core/viewer/viewer_pdiskinfo.cpp new file mode 100644 index 000000000000..96ed5261652e --- /dev/null +++ b/ydb/core/viewer/viewer_pdiskinfo.cpp @@ -0,0 +1,20 @@ +#include "viewer_pdiskinfo.h" +#include "json_handlers.h" + +namespace NKikimr::NViewer { + +static YAML::Node GetSwagger() { + YAML::Node swagger; + swagger["summary"] = "PDisk information"; + swagger["description"] = "Returns information about PDisks"; + swagger["tags"].push_back("viewer"); + swagger["parameters"] = GetWhiteboardRequestParameters(); + swagger["responses"]["200"] = TProtoToYaml::ProtoToYamlSchema(); + return swagger; +} + +void InitViewerPDiskInfoJsonHandler(TJsonHandlers& jsonHandlers) { + jsonHandlers.AddHandler("/viewer/pdiskinfo", new TJsonHandler(GetSwagger())); +} + +} diff --git a/ydb/core/viewer/json_pdiskinfo.h b/ydb/core/viewer/viewer_pdiskinfo.h similarity index 82% rename from ydb/core/viewer/json_pdiskinfo.h rename to ydb/core/viewer/viewer_pdiskinfo.h index 5a2ff46edc2f..731cf09c84c0 100644 --- a/ydb/core/viewer/json_pdiskinfo.h +++ b/ydb/core/viewer/viewer_pdiskinfo.h @@ -1,4 +1,3 @@ -#pragma once #include #include #include @@ -6,8 +5,7 @@ #include #include "json_wb_req.h" -namespace NKikimr { -namespace NViewer { +namespace NKikimr::NViewer { template <> struct TWhiteboardInfo { @@ -41,19 +39,4 @@ struct TWhiteboardInfo { using TJsonPDiskInfo = TJsonWhiteboardRequest; -template <> -struct TJsonRequestSummary { - static TString GetSummary() { - return "PDisk information"; - } -}; - -template <> -struct TJsonRequestDescription { - static TString GetDescription() { - return "Returns PDisk information"; - } -}; - -} } diff --git a/ydb/core/viewer/json_pqconsumerinfo.h b/ydb/core/viewer/viewer_pqconsumerinfo.cpp similarity index 68% rename from ydb/core/viewer/json_pqconsumerinfo.h rename to ydb/core/viewer/viewer_pqconsumerinfo.cpp index 0071ec99e8bd..edd2b88e6aa7 100644 --- a/ydb/core/viewer/json_pqconsumerinfo.h +++ b/ydb/core/viewer/viewer_pqconsumerinfo.cpp @@ -1,4 +1,3 @@ -#pragma once #include #include #include @@ -8,13 +7,12 @@ #include #include #include "viewer.h" +#include "json_handlers.h" -namespace NKikimr { -namespace NViewer { +namespace NKikimr::NViewer { using namespace NActors; - class TJsonPQConsumerInfo : public TActorBootstrapped { using TBase = TActorBootstrapped; IViewer* Viewer; @@ -117,74 +115,65 @@ class TJsonPQConsumerInfo : public TActorBootstrapped { } }; -template <> -struct TJsonRequestSchema { - static YAML::Node GetSchema() { - return TProtoToYaml::ProtoToYamlSchema(); - } -}; - -template <> -struct TJsonRequestParameters { - static YAML::Node GetParameters() { - return YAML::Load(R"___( - - name: topic - in: query - description: topic name - required: true - type: string - - name: dc - in: query - description: dc name (required with version >= 3) - required: false - type: string - default: "" - - name: version - in: query - description: query version - required: false - type: integer - default: 0 - - name: client - in: query - description: client name - required: true - type: string - - name: enums - in: query - description: convert enums to strings - required: false - type: boolean - default: false - - name: ui64 - in: query - description: return ui64 as number - required: false - type: boolean - default: false - - name: timeout - in: query - description: timeout in ms - required: false - type: integer - default: 10000 - )___"); - } -}; - -template <> -struct TJsonRequestSummary { - static TString GetSummary() { - return "Consumer-topic metrics"; - } -}; +static YAML::Node GetSwaggerParameters() { + return YAML::Load(R"___( + - name: topic + in: query + description: topic name + required: true + type: string + - name: dc + in: query + description: dc name (required with version >= 3) + required: false + type: string + default: "" + - name: version + in: query + description: query version + required: false + type: integer + default: 0 + - name: client + in: query + description: client name + required: true + type: string + - name: enums + in: query + description: convert enums to strings + required: false + type: boolean + default: false + - name: ui64 + in: query + description: return ui64 as number + required: false + type: boolean + default: false + - name: timeout + in: query + description: timeout in ms + required: false + type: integer + default: 10000 + )___"); +} -template <> -struct TJsonRequestDescription { - static TString GetDescription() { - return "Returns consumer-topic metrics"; - } -}; +static YAML::Node GetSwagger() { + TSimpleYamlBuilder yaml({ + .Method = "get", + .Tag = "viewer", + .Summary = "Consumer-topic metrics", + .Description = "Returns consumer-topic metrics", + }); + yaml.SetParameters(GetSwaggerParameters()); + yaml.SetResponseSchema(TProtoToYaml::ProtoToYamlSchema()); + return yaml; +} +void InitViewerPQConsumerInfoJsonHandler(TJsonHandlers& handlers) { + handlers.AddHandler("/viewer/pqconsumerinfo", new TJsonHandler(GetSwagger())); } + } diff --git a/ydb/core/viewer/json_query.h b/ydb/core/viewer/viewer_query.cpp similarity index 99% rename from ydb/core/viewer/json_query.h rename to ydb/core/viewer/viewer_query.cpp index 2fa05b20225d..c18fcf61b38e 100644 --- a/ydb/core/viewer/json_query.h +++ b/ydb/core/viewer/viewer_query.cpp @@ -1,4 +1,3 @@ -#pragma once #include "viewer.h" #include #include @@ -14,10 +13,11 @@ #include #include #include "json_pipe_req.h" +#include "json_handlers.h" #include "viewer_request.h" +#include "log.h" -namespace NKikimr { -namespace NViewer { +namespace NKikimr::NViewer { using namespace NActors; using namespace NMonitoring; @@ -613,8 +613,7 @@ class TJsonQuery : public TViewerPipeClient { } }; -template <> -YAML::Node TJsonRequestSwagger::GetSwagger() { +static YAML::Node GetSwagger() { YAML::Node node = YAML::Load(R"___( post: tags: @@ -738,6 +737,9 @@ YAML::Node TJsonRequestSwagger::GetSwagger() { return node; } - +void InitViewerQueryJsonHandler(TJsonHandlers& handlers) { + handlers.AddHandler("/viewer/query", new TJsonHandler(GetSwagger())); } + } + diff --git a/ydb/core/viewer/json_query_old.h b/ydb/core/viewer/viewer_query_old.h similarity index 99% rename from ydb/core/viewer/json_query_old.h rename to ydb/core/viewer/viewer_query_old.h index 6ef43bacc234..1bacb7964134 100644 --- a/ydb/core/viewer/json_query_old.h +++ b/ydb/core/viewer/viewer_query_old.h @@ -1,4 +1,3 @@ -#pragma once #include "viewer.h" #include #include @@ -15,9 +14,9 @@ #include #include "json_pipe_req.h" #include "viewer_request.h" +#include "log.h" -namespace NKikimr { -namespace NViewer { +namespace NKikimr::NViewer { using namespace NActors; using namespace NMonitoring; @@ -630,6 +629,4 @@ class TJsonQueryOld : public TViewerPipeClient { }; - -} } diff --git a/ydb/core/viewer/viewer_render.cpp b/ydb/core/viewer/viewer_render.cpp new file mode 100644 index 000000000000..78207d18c014 --- /dev/null +++ b/ydb/core/viewer/viewer_render.cpp @@ -0,0 +1,62 @@ +#include "viewer_render.h" +#include "json_handlers.h" + +namespace NKikimr::NViewer { + +static YAML::Node GetSwaggerParameters() { + return YAML::Load(R"___( + - name: target + in: query + description: metrics comma delimited + required: true + type: string + - name: from + in: query + description: time in seconds + required: false + type: integer + - name: database + in: query + description: database name + required: false + type: string + - name: direct + in: query + description: force processing query on current node + required: false + type: boolean + - name: until + in: query + description: time in seconds + required: false + type: integer + - name: maxDataPoints + in: query + description: maximum number of data points + required: false + type: integer + - name: format + in: query + description: response format + required: false + type: string + )___"); +}; + +static YAML::Node GetSwagger() { + TSimpleYamlBuilder yaml({ + .Method = "get", + .Tag = "viewer", + .Summary = "Graph data", + .Description = "Returns graph data in graphite format", + }); + YAML::Node node; + yaml.SetParameters(GetSwaggerParameters()); + return node; +} + +void InitViewerRenderJsonHandler(TJsonHandlers& handlers) { + handlers.AddHandler("/viewer/render", new TJsonHandler(GetSwagger())); +} + +} diff --git a/ydb/core/viewer/json_render.h b/ydb/core/viewer/viewer_render.h similarity index 87% rename from ydb/core/viewer/json_render.h rename to ydb/core/viewer/viewer_render.h index 1e84eacac818..ae00c545857c 100644 --- a/ydb/core/viewer/json_render.h +++ b/ydb/core/viewer/viewer_render.h @@ -1,4 +1,3 @@ -#pragma once #include #include #include @@ -9,8 +8,7 @@ #include "viewer.h" #include "log.h" -namespace NKikimr { -namespace NViewer { +namespace NKikimr::NViewer { using namespace NActors; using namespace NMonitoring; @@ -282,62 +280,4 @@ class TJsonRender : public TViewerPipeClient { } }; -template <> -struct TJsonRequestParameters { - static YAML::Node GetParameters() { - return YAML::Load(R"___( - - name: target - in: query - description: metrics comma delimited - required: true - type: string - - name: from - in: query - description: time in seconds - required: false - type: integer - - name: database - in: query - description: database name - required: false - type: string - - name: direct - in: query - description: force processing query on current node - required: false - type: boolean - - name: until - in: query - description: time in seconds - required: false - type: integer - - name: maxDataPoints - in: query - description: maximum number of data points - required: false - type: integer - - name: format - in: query - description: response format - required: false - type: string - )___"); - } -}; - -template <> -struct TJsonRequestSummary { - static TString GetSummary() { - return "Graph data"; - } -}; - -template <> -struct TJsonRequestDescription { - static TString GetDescription() { - return "Returns graph data in graphite format"; - } -}; - -} } diff --git a/ydb/core/viewer/viewer_request.cpp b/ydb/core/viewer/viewer_request.cpp index 32963a848c2f..7cbc8b15445b 100644 --- a/ydb/core/viewer/viewer_request.cpp +++ b/ydb/core/viewer/viewer_request.cpp @@ -3,14 +3,13 @@ #include "viewer_request.h" #include "wb_req.h" -#include "json_tabletinfo.h" -#include "json_sysinfo.h" -#include "json_query_old.h" -#include "json_render.h" -#include "json_autocomplete.h" +#include "viewer_query_old.h" +#include "viewer_render.h" +#include "viewer_autocomplete.h" +#include "viewer_tabletinfo.h" +#include "viewer_sysinfo.h" -namespace NKikimr { -namespace NViewer { +namespace NKikimr::NViewer { using namespace NActors; using namespace NNodeWhiteboard; @@ -107,4 +106,3 @@ bool IsPostContent(const NMon::TEvHttpInfo::TPtr& event) { } } -} diff --git a/ydb/core/viewer/json_storage.h b/ydb/core/viewer/viewer_storage.cpp similarity index 72% rename from ydb/core/viewer/json_storage.h rename to ydb/core/viewer/viewer_storage.cpp index fba5047a69e0..733dda771cbd 100644 --- a/ydb/core/viewer/json_storage.h +++ b/ydb/core/viewer/viewer_storage.cpp @@ -1,8 +1,9 @@ -#pragma once +#include "viewer_vdiskinfo.h" +#include "viewer_pdiskinfo.h" #include "json_storage_base.h" +#include "json_handlers.h" -namespace NKikimr { -namespace NViewer { +namespace NKikimr::NViewer { using namespace NActors; using namespace NNodeWhiteboard; @@ -480,122 +481,207 @@ class TJsonStorage : public TJsonStorageBase { } }; -template <> -struct TJsonRequestSchema { - static YAML::Node GetSchema() { - return TProtoToYaml::ProtoToYamlSchema(); - } -}; +TBSGroupState GetBSGroupOverallStateWithoutLatency( + const NKikimrWhiteboard::TBSGroupStateInfo& info, + const TMap& vDisksIndex, + const TMap, const NKikimrWhiteboard::TPDiskStateInfo&>& pDisksIndex) { -template <> -struct TJsonRequestParameters { - static YAML::Node GetParameters() { - return YAML::Load(R"___( - - name: enums - in: query - description: convert enums to strings - required: false - type: boolean - - name: ui64 - in: query - description: return ui64 as number - required: false - type: boolean - - name: tenant - in: query - description: tenant name - required: false - type: string - - name: pool - in: query - description: storage pool name - required: false - type: string - - name: node_id - in: query - description: node id - required: false - type: integer - - name: pdisk_id - in: query - description: pdisk id - required: false - type: integer - - name: group_id - in: query - description: group id - required: false - type: integer - - name: need_groups - in: query - description: return groups information - required: false - type: boolean - default: true - - name: need_disks - in: query - description: return disks information - required: false - type: boolean - default: true - - name: with - in: query - description: filter groups by missing or space - required: false - type: string - - name: version - in: query - description: query version (v1, v2) - required: false - type: string - - name: usage_pace - in: query - description: bucket size as a percentage - required: false - type: integer - default: 5 - - name: usage_buckets - in: query - description: filter groups by usage buckets - required: false - type: integer - - name: sort - in: query - description: sort by (PoolName,Kind,MediaType,Erasure,Degraded,Usage,GroupId,Used,Limit,Read,Write) - required: false - type: string - - name: offset - in: query - description: skip N nodes - required: false - type: integer - - name: limit - in: query - description: limit to N nodes - required: false - type: integer - - name: timeout - in: query - description: timeout in ms - required: false - type: integer - )___"); + TBSGroupState groupState; + groupState.Overall = NKikimrViewer::EFlag::Grey; + + const auto& vDiskIds = info.GetVDiskIds(); + std::unordered_map failedRings; + std::unordered_map failedDomains; + TVector vDiskFlags; + vDiskFlags.reserve(vDiskIds.size()); + for (auto iv = vDiskIds.begin(); iv != vDiskIds.end(); ++iv) { + const NKikimrBlobStorage::TVDiskID& vDiskId = *iv; + NKikimrViewer::EFlag flag = NKikimrViewer::EFlag::Grey; + auto ie = vDisksIndex.find(vDiskId); + if (ie != vDisksIndex.end()) { + auto pDiskId = std::make_pair(ie->second.GetNodeId(), ie->second.GetPDiskId()); + auto ip = pDisksIndex.find(pDiskId); + if (ip != pDisksIndex.end()) { + const NKikimrWhiteboard::TPDiskStateInfo& pDiskInfo(ip->second); + flag = Max(flag, GetPDiskOverallFlag(pDiskInfo)); + } else { + flag = NKikimrViewer::EFlag::Red; + } + const NKikimrWhiteboard::TVDiskStateInfo& vDiskInfo(ie->second); + flag = Max(flag, GetVDiskOverallFlag(vDiskInfo)); + if (vDiskInfo.GetDiskSpace() > NKikimrWhiteboard::EFlag::Green) { + groupState.SpaceProblems++; + } + } else { + flag = NKikimrViewer::EFlag::Red; + } + vDiskFlags.push_back(flag); + if (flag == NKikimrViewer::EFlag::Red || flag == NKikimrViewer::EFlag::Blue) { + groupState.MissingDisks++; + ++failedRings[vDiskId.GetRing()]; + ++failedDomains[vDiskId.GetDomain()]; + } + groupState.Overall = Max(groupState.Overall, flag); } -}; -template <> -struct TJsonRequestSummary { - static TString GetSummary() { - return "Storage information"; + groupState.Overall = Min(groupState.Overall, NKikimrViewer::EFlag::Yellow); // without failed rings we only allow to raise group status up to Blue/Yellow + TString erasure = info.GetErasureSpecies(); + if (erasure == TErasureType::ErasureSpeciesName(TErasureType::ErasureNone)) { + if (!failedDomains.empty()) { + groupState.Overall = NKikimrViewer::EFlag::Red; + } + } else if (erasure == TErasureType::ErasureSpeciesName(TErasureType::ErasureMirror3dc)) { + if (failedRings.size() > 2) { + groupState.Overall = NKikimrViewer::EFlag::Red; + } else if (failedRings.size() == 2) { // TODO: check for 1 ring - 1 domain rule + groupState.Overall = NKikimrViewer::EFlag::Orange; + } else if (failedRings.size() > 0) { + groupState.Overall = Min(groupState.Overall, NKikimrViewer::EFlag::Yellow); + } + } else if (erasure == TErasureType::ErasureSpeciesName(TErasureType::Erasure4Plus2Block)) { + if (failedDomains.size() > 2) { + groupState.Overall = NKikimrViewer::EFlag::Red; + } else if (failedDomains.size() > 1) { + groupState.Overall = NKikimrViewer::EFlag::Orange; + } else if (failedDomains.size() > 0) { + groupState.Overall = Min(groupState.Overall, NKikimrViewer::EFlag::Yellow); + } } -}; + return groupState; +} + +NKikimrViewer::EFlag GetBSGroupOverallFlagWithoutLatency( + const NKikimrWhiteboard::TBSGroupStateInfo& info, + const TMap& vDisksIndex, + const TMap, const NKikimrWhiteboard::TPDiskStateInfo&>& pDisksIndex) { + return GetBSGroupOverallStateWithoutLatency(info, vDisksIndex, pDisksIndex).Overall; +} -template <> -struct TJsonRequestDescription { - static TString GetDescription() { - return "Returns information about storage"; +TBSGroupState GetBSGroupOverallState( + const NKikimrWhiteboard::TBSGroupStateInfo& info, + const TMap& vDisksIndex, + const TMap, const NKikimrWhiteboard::TPDiskStateInfo&>& pDisksIndex) { + TBSGroupState state = GetBSGroupOverallStateWithoutLatency(info, vDisksIndex, pDisksIndex); + if (info.HasLatency()) { + state.Overall = Max(state.Overall, Min(NKikimrViewer::EFlag::Yellow, GetViewerFlag(info.GetLatency()))); } -}; + return state; +} +NKikimrViewer::EFlag GetBSGroupOverallFlag( + const NKikimrWhiteboard::TBSGroupStateInfo& info, + const TMap& vDisksIndex, + const TMap, const NKikimrWhiteboard::TPDiskStateInfo&>& pDisksIndex) { + return GetBSGroupOverallState(info, vDisksIndex, pDisksIndex).Overall; } + +static YAML::Node GetSwaggerParameters() { + return YAML::Load(R"___( + - name: enums + in: query + description: convert enums to strings + required: false + type: boolean + - name: ui64 + in: query + description: return ui64 as number + required: false + type: boolean + - name: tenant + in: query + description: tenant name + required: false + type: string + - name: pool + in: query + description: storage pool name + required: false + type: string + - name: node_id + in: query + description: node id + required: false + type: integer + - name: pdisk_id + in: query + description: pdisk id + required: false + type: integer + - name: group_id + in: query + description: group id + required: false + type: integer + - name: need_groups + in: query + description: return groups information + required: false + type: boolean + default: true + - name: need_disks + in: query + description: return disks information + required: false + type: boolean + default: true + - name: with + in: query + description: filter groups by missing or space + required: false + type: string + - name: version + in: query + description: query version (v1, v2) + required: false + type: string + - name: usage_pace + in: query + description: bucket size as a percentage + required: false + type: integer + default: 5 + - name: usage_buckets + in: query + description: filter groups by usage buckets + required: false + type: integer + - name: sort + in: query + description: sort by (PoolName,Kind,MediaType,Erasure,Degraded,Usage,GroupId,Used,Limit,Read,Write) + required: false + type: string + - name: offset + in: query + description: skip N nodes + required: false + type: integer + - name: limit + in: query + description: limit to N nodes + required: false + type: integer + - name: timeout + in: query + description: timeout in ms + required: false + type: integer + )___"); +} + +static YAML::Node GetSwagger() { + TSimpleYamlBuilder yaml({ + .Method = "get", + .Tag = "viewer", + .Summary = "Storage information", + .Description = "Returns information about storage" + }); + yaml.SetParameters(GetSwaggerParameters()); + yaml.SetResponseSchema(TProtoToYaml::ProtoToYamlSchema()); + return yaml; +} + +void InitViewerStorageJsonHandler(TJsonHandlers& handlers) { + handlers.AddHandler("/viewer/storage", new TJsonHandler(GetSwagger())); +} + } diff --git a/ydb/core/viewer/json_storage_usage.h b/ydb/core/viewer/viewer_storage_usage.cpp similarity index 59% rename from ydb/core/viewer/json_storage_usage.h rename to ydb/core/viewer/viewer_storage_usage.cpp index e759a72c3ecf..745e00dd44b2 100644 --- a/ydb/core/viewer/json_storage_usage.h +++ b/ydb/core/viewer/viewer_storage_usage.cpp @@ -1,14 +1,13 @@ -#pragma once +#include "viewer_vdiskinfo.h" +#include "viewer_pdiskinfo.h" #include "json_storage_base.h" +#include "json_handlers.h" -namespace NKikimr { -namespace NViewer { +namespace NKikimr::NViewer { using namespace NActors; using namespace NNodeWhiteboard; -using ::google::protobuf::FieldDescriptor; - class TJsonStorageUsage : public TJsonStorageBase { using TBase = TJsonStorageBase; using TThis = TJsonStorageUsage; @@ -77,70 +76,61 @@ class TJsonStorageUsage : public TJsonStorageBase { } }; -template <> -struct TJsonRequestSchema { - static YAML::Node GetSchema() { - return TProtoToYaml::ProtoToYamlSchema(); - } -}; - -template <> -struct TJsonRequestParameters { - static YAML::Node GetParameters() { - return YAML::Load(R"___( - - name: enums - in: query - description: convert enums to strings - type: boolean - required: false - - name: ui64 - in: query - description: return ui64 as number - type: boolean - required: false - - name: tenant - in: query - description: tenant name - type: string - required: false - - name: pool - in: query - description: storage pool name - type: string - required: false - - name: node_id - in: query - description: node id - type: integer - required: false - - name: pace - in: query - description: bucket size as a percentage - type: integer - required: false - default: 5 - - name: timeout - in: query - description: timeout in ms - type: integer - required: false - )___"); - } -}; - -template <> -struct TJsonRequestSummary { - static TString GetSummary() { - return "Storage groups statistics"; - } -}; +static YAML::Node GetSwaggerParameters() { + return YAML::Load(R"___( + - name: enums + in: query + description: convert enums to strings + type: boolean + required: false + - name: ui64 + in: query + description: return ui64 as number + type: boolean + required: false + - name: tenant + in: query + description: tenant name + type: string + required: false + - name: pool + in: query + description: storage pool name + type: string + required: false + - name: node_id + in: query + description: node id + type: integer + required: false + - name: pace + in: query + description: bucket size as a percentage + type: integer + required: false + default: 5 + - name: timeout + in: query + description: timeout in ms + type: integer + required: false + )___"); +} -template <> -struct TJsonRequestDescription { - static TString GetDescription() { - return "Returns the distribution of groups by usage"; - } -}; +static YAML::Node GetSwagger() { + TSimpleYamlBuilder yaml({ + .Method = "get", + .Tag = "viewer", + .Summary = "Storage groups statistics", + .Description = "Returns the distribution of groups by usage", + }); + yaml.SetParameters(GetSwaggerParameters()); + yaml.SetResponseSchema(TProtoToYaml::ProtoToYamlSchema()); + return yaml; +} +void InitViewerHiveInfoJsonHandler(TJsonHandlers& handlers) { + handlers.AddHandler("/viewer/storage_usage", new TJsonHandler(GetSwagger())); } + } diff --git a/ydb/core/viewer/viewer_sysinfo.cpp b/ydb/core/viewer/viewer_sysinfo.cpp new file mode 100644 index 000000000000..fbe1d73fd0e9 --- /dev/null +++ b/ydb/core/viewer/viewer_sysinfo.cpp @@ -0,0 +1,20 @@ +#include "viewer_sysinfo.h" +#include "json_handlers.h" + +namespace NKikimr::NViewer { + +static YAML::Node GetSwagger() { + YAML::Node swagger; + swagger["summary"] = "System information"; + swagger["description"] = "Returns system information"; + swagger["tags"].push_back("viewer"); + swagger["parameters"] = GetWhiteboardRequestParameters(); + swagger["responses"]["200"] = TProtoToYaml::ProtoToYamlSchema(); + return swagger; +} + +void InitViewerSysInfoJsonHandler(TJsonHandlers& jsonHandlers) { + jsonHandlers.AddHandler("/viewer/sysinfo", new TJsonHandler(GetSwagger())); +} + +} diff --git a/ydb/core/viewer/json_sysinfo.h b/ydb/core/viewer/viewer_sysinfo.h similarity index 87% rename from ydb/core/viewer/json_sysinfo.h rename to ydb/core/viewer/viewer_sysinfo.h index 922f9566b917..db363fbf93d9 100644 --- a/ydb/core/viewer/json_sysinfo.h +++ b/ydb/core/viewer/viewer_sysinfo.h @@ -6,8 +6,7 @@ #include #include "json_wb_req.h" -namespace NKikimr { -namespace NViewer { +namespace NKikimr::NViewer { template <> class TWhiteboardMerger { @@ -55,19 +54,4 @@ struct TWhiteboardInfo { using TJsonSysInfo = TJsonWhiteboardRequest; -template <> -struct TJsonRequestSummary { - static TString GetSummary() { - return "System information"; - } -}; - -template <> -struct TJsonRequestDescription { - static TString GetDescription() { - return "Returns system information"; - } -}; - -} } diff --git a/ydb/core/viewer/json_tabletcounters.h b/ydb/core/viewer/viewer_tabletcounters.cpp similarity index 80% rename from ydb/core/viewer/json_tabletcounters.h rename to ydb/core/viewer/viewer_tabletcounters.cpp index 023552fdea3f..5de386651ae5 100644 --- a/ydb/core/viewer/json_tabletcounters.h +++ b/ydb/core/viewer/viewer_tabletcounters.cpp @@ -1,4 +1,3 @@ -#pragma once #include #include #include @@ -8,10 +7,10 @@ #include #include #include "viewer.h" +#include "json_handlers.h" #include "wb_aggregate.h" -namespace NKikimr { -namespace NViewer { +namespace NKikimr::NViewer { using namespace NActors; @@ -167,64 +166,55 @@ class TJsonTabletCounters : public TActorBootstrapped { } }; -template <> -struct TJsonRequestSchema { - static YAML::Node GetSchema() { - return TProtoToYaml::ProtoToYamlSchema(); - } -}; - -template <> -struct TJsonRequestParameters { - static YAML::Node GetParameters() { - return YAML::Load(R"___( - - name: path - in: query - description: schema path - required: false - type: string - - name: tablet_id - in: query - description: tablet identifier - required: false - type: integer - - name: enums - in: query - description: convert enums to strings - required: false - type: boolean - - name: aggregate - in: query - description: aggregate tablet counters - required: false - type: boolean - - name: ui64 - in: query - description: return ui64 as number - required: false - type: boolean - - name: timeout - in: query - description: timeout in ms - required: false - type: integer - )___"); - } -}; - -template <> -struct TJsonRequestSummary { - static TString GetSummary() { - return "Tablet counters information"; - } -}; +static YAML::Node GetSwaggerParameters() { + return YAML::Load(R"___( + - name: path + in: query + description: schema path + required: false + type: string + - name: tablet_id + in: query + description: tablet identifier + required: false + type: integer + - name: enums + in: query + description: convert enums to strings + required: false + type: boolean + - name: aggregate + in: query + description: aggregate tablet counters + required: false + type: boolean + - name: ui64 + in: query + description: return ui64 as number + required: false + type: boolean + - name: timeout + in: query + description: timeout in ms + required: false + type: integer + )___"); +} -template <> -struct TJsonRequestDescription { - static TString GetDescription() { - return "Returns information about tablet counters"; - } -}; +static YAML::Node GetSwagger() { + TSimpleYamlBuilder yaml({ + .Method = "get", + .Tag = "viewer", + .Summary = "Tablet counters info", + .Description = "Returns information about tablet counters", + }); + yaml.SetParameters(GetSwaggerParameters()); + yaml.SetResponseSchema(TProtoToYaml::ProtoToYamlSchema()); + return yaml; +} +void InitViewerTabletCountersJsonHandler(TJsonHandlers& handlers) { + handlers.AddHandler("/viewer/tabletcounters", new TJsonHandler(GetSwagger())); } + } diff --git a/ydb/core/viewer/viewer_tabletinfo.cpp b/ydb/core/viewer/viewer_tabletinfo.cpp new file mode 100644 index 000000000000..f73a79f05af1 --- /dev/null +++ b/ydb/core/viewer/viewer_tabletinfo.cpp @@ -0,0 +1,96 @@ +#include "viewer_tabletinfo.h" +#include "json_handlers.h" + +namespace NKikimr::NViewer { + +static YAML::Node GetSwaggerParameters() { + return YAML::Load(R"___( + - name: node_id + in: query + description: node identifier + required: false + type: integer + - name: path + in: query + description: schema path + required: false + type: string + - name: merge + in: query + description: merge information from nodes + required: false + type: boolean + - name: group + in: query + description: group information by field + required: false + type: string + - name: all + in: query + description: return all possible key combinations (for enums only) + required: false + type: boolean + - name: filter + in: query + description: filter information by field + required: false + type: string + - name: alive + in: query + description: request from alive (connected) nodes only + required: false + type: boolean + - name: enums + in: query + description: convert enums to strings + required: false + type: boolean + - name: ui64 + in: query + description: return ui64 as number + required: false + type: boolean + - name: timeout + in: query + description: timeout in ms + required: false + type: integer + - name: retries + in: query + description: number of retries + required: false + type: integer + - name: retry_period + in: query + description: retry period in ms + required: false + type: integer + default: 500 + - name: static + in: query + description: request from static nodes only + required: false + type: boolean + - name: since + in: query + description: filter by update time + required: false + type: string + )___"); +} + +static YAML::Node GetSwagger() { + YAML::Node swagger; + swagger["summary"] = "Tablet information"; + swagger["description"] = "Returns information about tablets"; + swagger["tags"].push_back("viewer"); + swagger["parameters"] = GetSwaggerParameters(); + swagger["responses"]["200"] = TProtoToYaml::ProtoToYamlSchema(); + return swagger; +} + +void InitViewerTabletInfoJsonHandler(TJsonHandlers& jsonHandlers) { + jsonHandlers.AddHandler("/viewer/tabletinfo", new TJsonHandler(GetSwagger())); +} + +} diff --git a/ydb/core/viewer/json_tabletinfo.h b/ydb/core/viewer/viewer_tabletinfo.h similarity index 86% rename from ydb/core/viewer/json_tabletinfo.h rename to ydb/core/viewer/viewer_tabletinfo.h index aac8fabe01a5..289a0b4be3d3 100644 --- a/ydb/core/viewer/json_tabletinfo.h +++ b/ydb/core/viewer/viewer_tabletinfo.h @@ -1,4 +1,3 @@ -#pragma once #include #include #include @@ -14,8 +13,7 @@ #include "json_wb_req.h" #include -namespace NKikimr { -namespace NViewer { +namespace NKikimr::NViewer { template<> struct TWhiteboardInfo { @@ -362,111 +360,6 @@ class TJsonTabletInfo : public TJsonWhiteboardRequest -struct TJsonRequestParameters { - static YAML::Node GetParameters() { - return YAML::Load(R"___( - - name: node_id - in: query - description: node identifier - required: false - type: integer - - name: path - in: query - description: schema path - required: false - type: string - - name: merge - in: query - description: merge information from nodes - required: false - type: boolean - - name: group - in: query - description: group information by field - required: false - type: string - - name: all - in: query - description: return all possible key combinations (for enums only) - required: false - type: boolean - - name: filter - in: query - description: filter information by field - required: false - type: string - - name: alive - in: query - description: request from alive (connected) nodes only - required: false - type: boolean - - name: enums - in: query - description: convert enums to strings - required: false - type: boolean - - name: ui64 - in: query - description: return ui64 as number - required: false - type: boolean - - name: timeout - in: query - description: timeout in ms - required: false - type: integer - - name: retries - in: query - description: number of retries - required: false - type: integer - - name: retry_period - in: query - description: retry period in ms - required: false - type: integer - default: 500 - - name: static - in: query - description: request from static nodes only - required: false - type: boolean - - name: since - in: query - description: filter by update time - required: false - type: string - )___"); - } -}; - -template <> -struct TJsonRequestSchema { - static YAML::Node GetSchema() { - return TProtoToYaml::ProtoToYamlSchema(); - } }; -template <> -struct TJsonRequestSummary { - static TString GetSummary() { - return "Tablet information"; - } -}; - -template <> -struct TJsonRequestDescription { - static TString GetDescription() { - return "Returns information about tablets"; - } -}; - -} } diff --git a/ydb/core/viewer/json_tenantinfo.h b/ydb/core/viewer/viewer_tenantinfo.cpp similarity index 93% rename from ydb/core/viewer/json_tenantinfo.h rename to ydb/core/viewer/viewer_tenantinfo.cpp index 310f23770fdd..6eea041aa9ac 100644 --- a/ydb/core/viewer/json_tenantinfo.h +++ b/ydb/core/viewer/viewer_tenantinfo.cpp @@ -1,4 +1,3 @@ -#pragma once #include #include #include @@ -18,9 +17,10 @@ #include "wb_merge.h" #include "log.h" #include "viewer_request.h" +#include "viewer_tabletinfo.h" +#include "json_handlers.h" -namespace NKikimr { -namespace NViewer { +namespace NKikimr::NViewer { using namespace NActors; @@ -384,8 +384,7 @@ class TJsonTenantInfo : public TViewerPipeClient { void Handle(NNodeWhiteboard::TEvWhiteboard::TEvTabletStateResponse::TPtr& ev) { ui32 nodeId = ev.Get()->Cookie; - BLOG_TRACE("Received TEvTabletStateResponse from " << nodeId << " with " - << TWhiteboardInfo::GetElementsCount(ev->Get()->Record) << " tablets"); + BLOG_TRACE("Received TEvTabletStateResponse from " << nodeId); auto tenantId = NodeIdsToTenant[nodeId]; WhiteboardTabletStateResponse[tenantId][nodeId] = std::move(ev->Get()->Record); RequestDone(); @@ -418,9 +417,7 @@ class TJsonTenantInfo : public TViewerPipeClient { auto tenantId = NodeIdsToTenant[nodeId]; switch (ev->Get()->Record.GetResponseCase()) { case NKikimrViewer::TEvViewerResponse::kTabletResponse: - BLOG_TRACE("Received TEvViewerResponse from " << nodeId << " with " - << TWhiteboardInfo::GetElementsCount(ev->Get()->Record.GetTabletResponse()) - << " tablets"); + BLOG_TRACE("Received TEvViewerResponse from " << nodeId); OffloadMergedTabletStateResponse[tenantId] = std::move(ev->Get()->Record); RequestDone(); break; @@ -841,94 +838,86 @@ class TJsonTenantInfo : public TViewerPipeClient { } }; -template <> -struct TJsonRequestSchema { - static YAML::Node GetSchema() { - return TProtoToYaml::ProtoToYamlSchema(); - } -}; - -template <> -struct TJsonRequestParameters { - static YAML::Node GetParameters() { - return YAML::Load(R"___( - - name: path - in: query - description: schema path - required: false - type: string - - name: user - in: query - description: tenant owner - required: false - type: string - - name: followers - in: query - description: return followers - required: false - type: boolean - - name: metrics - in: query - description: return tablet metrics - required: false - type: boolean - - name: enums - in: query - description: convert enums to strings - required: false - type: boolean - - name: tablets - in: query - description: return tablets - required: false - type: boolean - - name: system_tablets - in: query - description: return system tablets - required: false - type: boolean - - name: offload_merge - in: query - description: use offload merge - required: false - type: boolean - - name: storage - in: query - description: return storage info - required: false - type: boolean - - name: nodes - in: query - description: return nodes info - required: false - type: boolean - - name: ui64 - in: query - description: return ui64 as number - required: false - type: boolean - - name: timeout - in: query - description: timeout in ms - required: false - type: integer - )___"); - } -}; - -template <> -struct TJsonRequestSummary { - static TString GetSummary() { - return "\"Tenant info (detailed)\""; - } -}; +static YAML::Node GetSwaggerParameters() { + return YAML::Load(R"___( + - name: path + in: query + description: schema path + required: false + type: string + - name: user + in: query + description: tenant owner + required: false + type: string + - name: followers + in: query + description: return followers + required: false + type: boolean + - name: metrics + in: query + description: return tablet metrics + required: false + type: boolean + - name: enums + in: query + description: convert enums to strings + required: false + type: boolean + - name: tablets + in: query + description: return tablets + required: false + type: boolean + - name: system_tablets + in: query + description: return system tablets + required: false + type: boolean + - name: offload_merge + in: query + description: use offload merge + required: false + type: boolean + - name: storage + in: query + description: return storage info + required: false + type: boolean + - name: nodes + in: query + description: return nodes info + required: false + type: boolean + - name: ui64 + in: query + description: return ui64 as number + required: false + type: boolean + - name: timeout + in: query + description: timeout in ms + required: false + type: integer + )___"); +} -template <> -struct TJsonRequestDescription { - static TString GetDescription() { - return "\"Returns information about tenants\""; - } -}; +static YAML::Node GetSwagger() { + TSimpleYamlBuilder yaml({ + .Method = "get", + .Tag = "viewer", + .Summary = "Tenant info (detailed)", + .Description = "Returns information about tenants", + }); + YAML::Node node; + yaml.SetParameters(GetSwaggerParameters()); + yaml.SetResponseSchema(TProtoToYaml::ProtoToYamlSchema()); + return node; +} +void InitViewerHiveInfoJsonHandler(TJsonHandlers& handlers) { + handlers.AddHandler("/viewer/tenantinfo", new TJsonHandler(GetSwagger())); } + } diff --git a/ydb/core/viewer/json_tenants.h b/ydb/core/viewer/viewer_tenants.cpp similarity index 73% rename from ydb/core/viewer/json_tenants.h rename to ydb/core/viewer/viewer_tenants.cpp index 4397565566a5..d56fb2628c58 100644 --- a/ydb/core/viewer/json_tenants.h +++ b/ydb/core/viewer/viewer_tenants.cpp @@ -1,4 +1,3 @@ -#pragma once #include #include #include @@ -8,10 +7,10 @@ #include #include "viewer.h" #include "json_pipe_req.h" +#include "json_handlers.h" #include "wb_aggregate.h" -namespace NKikimr { -namespace NViewer { +namespace NKikimr::NViewer { using namespace NActors; @@ -97,55 +96,46 @@ class TJsonTenants : public TViewerPipeClient { } }; -template <> -struct TJsonRequestSchema { - static YAML::Node GetSchema() { - return TProtoToYaml::ProtoToYamlSchema(); - } -}; - -template <> -struct TJsonRequestParameters { - static YAML::Node GetParameters() { - return YAML::Load(R"___( - - name: enums - in: query - description: convert enums to strings - required: false - type: boolean - - name: ui64 - in: query - description: return ui64 as number - required: false - type: boolean - - name: state - in: query - description: return tenant state - required: false - type: boolean - default: true - - name: timeout - in: query - description: timeout in ms - required: false - type: integer - )___"); - } -}; - -template <> -struct TJsonRequestSummary { - static TString GetSummary() { - return "Tenant info (brief)"; - } -}; +static YAML::Node GetSwaggerParameters() { + return YAML::Load(R"___( + - name: enums + in: query + description: convert enums to strings + required: false + type: boolean + - name: ui64 + in: query + description: return ui64 as number + required: false + type: boolean + - name: state + in: query + description: return tenant state + required: false + type: boolean + default: true + - name: timeout + in: query + description: timeout in ms + required: false + type: integer + )___"); +} -template <> -struct TJsonRequestDescription { - static TString GetDescription() { - return "Returns list of tenants"; - } -}; +static YAML::Node GetSwagger() { + TSimpleYamlBuilder yaml({ + .Method = "get", + .Tag = "viewer", + .Summary = "Tenant info (brief)", + .Description = "Returns list of tenants", + }); + yaml.SetParameters(GetSwaggerParameters()); + yaml.SetResponseSchema(TProtoToYaml::ProtoToYamlSchema()); + return yaml; +} +void InitViewerTenantsJsonHandler(TJsonHandlers& handlers) { + handlers.AddHandler("/viewer/tenants", new TJsonHandler(GetSwagger())); } + } diff --git a/ydb/core/viewer/json_topicinfo.h b/ydb/core/viewer/viewer_topicinfo.cpp similarity index 67% rename from ydb/core/viewer/json_topicinfo.h rename to ydb/core/viewer/viewer_topicinfo.cpp index d5880859ff16..776ab2ecd5a4 100644 --- a/ydb/core/viewer/json_topicinfo.h +++ b/ydb/core/viewer/viewer_topicinfo.cpp @@ -1,4 +1,3 @@ -#pragma once #include #include #include @@ -6,9 +5,9 @@ #include #include #include "viewer.h" +#include "json_handlers.h" -namespace NKikimr { -namespace NViewer { +namespace NKikimr::NViewer { using namespace NActors; @@ -92,67 +91,58 @@ class TJsonTopicInfo : public TActorBootstrapped { } }; -template <> -struct TJsonRequestSchema { - static YAML::Node GetSchema() { - return TProtoToYaml::ProtoToYamlSchema(); - } -}; - -template <> -struct TJsonRequestParameters { - static YAML::Node GetParameters() { - return YAML::Load(R"___( - - name: path - in: query - description: schema path - required: true - type: string - - name: client - in: query - description: client name - required: false - type: string - default: total - - name: enums - in: query - description: convert enums to strings - required: false - type: boolean - - name: all - in: query - description: return all topics and all clients - required: false - type: boolean - default: false - - name: ui64 - in: query - description: return ui64 as number - required: false - type: boolean - - name: timeout - in: query - description: timeout in ms - required: false - type: integer - default: 10000 - )___"); - } -}; - -template <> -struct TJsonRequestSummary { - static TString GetSummary() { - return "Topic information"; - } -}; +static YAML::Node GetSwaggerParameters() { + return YAML::Load(R"___( + - name: path + in: query + description: schema path + required: true + type: string + - name: client + in: query + description: client name + required: false + type: string + default: total + - name: enums + in: query + description: convert enums to strings + required: false + type: boolean + - name: all + in: query + description: return all topics and all clients + required: false + type: boolean + default: false + - name: ui64 + in: query + description: return ui64 as number + required: false + type: boolean + - name: timeout + in: query + description: timeout in ms + required: false + type: integer + default: 10000 + )___"); +} -template <> -struct TJsonRequestDescription { - static TString GetDescription() { - return "Information about topic"; - } -}; +static YAML::Node GetSwagger() { + TSimpleYamlBuilder yaml({ + .Method = "get", + .Tag = "viewer", + .Summary = "Topic information", + .Description = "Information about topic", + }); + yaml.SetParameters(GetSwaggerParameters()); + yaml.SetResponseSchema(TProtoToYaml::ProtoToYamlSchema()); + return yaml; +} +void InitViewerTopicInfoJsonHandler(TJsonHandlers& handlers) { + handlers.AddHandler("/viewer/topicinfo", new TJsonHandler(GetSwagger())); } + } diff --git a/ydb/core/viewer/viewer_ut.cpp b/ydb/core/viewer/viewer_ut.cpp index bbc2e5cf1938..f854bed5a06b 100644 --- a/ydb/core/viewer/viewer_ut.cpp +++ b/ydb/core/viewer/viewer_ut.cpp @@ -10,10 +10,9 @@ #include #include #include -#include "json_handlers.h" -#include "json_tabletinfo.h" -#include "json_vdiskinfo.h" -#include "json_pdiskinfo.h" +#include "viewer_tabletinfo.h" +#include "viewer_vdiskinfo.h" +#include "viewer_pdiskinfo.h" #include "query_autocomplete_helper.h" #include diff --git a/ydb/core/viewer/viewer_vdiskinfo.cpp b/ydb/core/viewer/viewer_vdiskinfo.cpp new file mode 100644 index 000000000000..e9d045ed86f9 --- /dev/null +++ b/ydb/core/viewer/viewer_vdiskinfo.cpp @@ -0,0 +1,20 @@ +#include "viewer_vdiskinfo.h" +#include "json_handlers.h" + +namespace NKikimr::NViewer { + +static YAML::Node GetSwagger() { + YAML::Node swagger; + swagger["summary"] = "VDisk information"; + swagger["description"] = "Returns information about VDisks"; + swagger["tags"].push_back("viewer"); + swagger["parameters"] = GetWhiteboardRequestParameters(); + swagger["responses"]["200"] = TProtoToYaml::ProtoToYamlSchema(); + return swagger; +} + +void InitViewerVDiskInfoJsonHandler(TJsonHandlers& jsonHandlers) { + jsonHandlers.AddHandler("/viewer/vdiskinfo", new TJsonHandler(GetSwagger())); +} + +} diff --git a/ydb/core/viewer/json_vdiskinfo.h b/ydb/core/viewer/viewer_vdiskinfo.h similarity index 88% rename from ydb/core/viewer/json_vdiskinfo.h rename to ydb/core/viewer/viewer_vdiskinfo.h index 0675c4cd407b..9ddfd99e0d68 100644 --- a/ydb/core/viewer/json_vdiskinfo.h +++ b/ydb/core/viewer/viewer_vdiskinfo.h @@ -1,4 +1,3 @@ -#pragma once #include #include #include @@ -43,8 +42,7 @@ struct hash { } -namespace NKikimr { -namespace NViewer { +namespace NKikimr::NViewer { template <> struct TWhiteboardInfo { @@ -78,19 +76,4 @@ struct TWhiteboardInfo { using TJsonVDiskInfo = TJsonWhiteboardRequest; -template <> -struct TJsonRequestSummary { - static TString GetSummary() { - return "VDisk information"; - } -}; - -template <> -struct TJsonRequestDescription { - static TString GetDescription() { - return "VDisk information"; - } -}; - -} } diff --git a/ydb/core/viewer/json_whoami.h b/ydb/core/viewer/viewer_whoami.cpp similarity index 66% rename from ydb/core/viewer/json_whoami.h rename to ydb/core/viewer/viewer_whoami.cpp index 36e3715268fd..43daab6962c5 100644 --- a/ydb/core/viewer/json_whoami.h +++ b/ydb/core/viewer/viewer_whoami.cpp @@ -1,4 +1,3 @@ -#pragma once #include #include #include @@ -10,9 +9,9 @@ #include #include #include "viewer.h" +#include "json_handlers.h" -namespace NKikimr { -namespace NViewer { +namespace NKikimr::NViewer { using namespace NActors; @@ -82,60 +81,50 @@ class TJsonWhoAmI : public TActorBootstrapped { } }; -template <> -struct TJsonRequestSchema { - static YAML::Node GetSchema() { - return YAML::Load(R"___( - type: object - title: WhoAmI - properties: - UserSID: +static YAML::Node GetSwaggerSchema() { + return YAML::Load(R"___( + type: object + title: WhoAmI + properties: + UserSID: + type: string + description: User ID / name + GroupSID: + type: array + items: type: string - description: User ID / name - GroupSID: - type: array - items: - type: string - description: User groups - OriginalUserToken: - type: string - description: User's token used to authenticate - AuthType: - type: string - description: Authentication type - IsViewerAllowed: - type: boolean - description: Is user allowed to view data - IsMonitoringAllowed: - type: boolean - description: Is user allowed to view deeper and make simple changes - IsAdministrationAllowed: - type: boolean - description: Is user allowed to do unrestricted changes in the system - )___"); - } -}; - -template <> -struct TJsonRequestParameters { - static YAML::Node GetParameters() { - return {}; - } -}; - -template <> -struct TJsonRequestSummary { - static TString GetSummary() { - return "Information about current user"; - } -}; + description: User groups + OriginalUserToken: + type: string + description: User's token used to authenticate + AuthType: + type: string + description: Authentication type + IsViewerAllowed: + type: boolean + description: Is user allowed to view data + IsMonitoringAllowed: + type: boolean + description: Is user allowed to view deeper and make simple changes + IsAdministrationAllowed: + type: boolean + description: Is user allowed to do unrestricted changes in the system + )___"); +} -template <> -struct TJsonRequestDescription { - static TString GetDescription() { - return "Returns information about user token"; - } -}; +static YAML::Node GetSwagger() { + TSimpleYamlBuilder yaml({ + .Method = "get", + .Tag = "viewer", + .Summary = "Information about current user", + .Description = "Returns information about user token", + }); + yaml.SetResponseSchema(GetSwaggerSchema()); + return yaml; +} +void InitViewerWhoAmIJsonHandler(TJsonHandlers& handlers) { + handlers.AddHandler("/viewer/whoami", new TJsonHandler(GetSwagger())); } + } diff --git a/ydb/core/viewer/ya.make b/ydb/core/viewer/ya.make index e6ecea1195d9..9273518c3bcb 100644 --- a/ydb/core/viewer/ya.make +++ b/ydb/core/viewer/ya.make @@ -6,77 +6,96 @@ LIBRARY() SRCS( browse_db.h - browse_pq.h + browse_events.h browse.h - check_access.h + browse_pq.h counters_hosts.h - json_acl.h - json_autocomplete.h - json_blobindexstat.h - json_browse.h - json_bscontrollerinfo.h - json_bsgroupinfo.h - json_cluster.h - json_compute.h - json_config.h - json_content.h - json_counters.h - json_describe.h - json_describe_consumer.h - json_describe_topic.h - json_local_rpc.h - json_getblob.h - json_graph.h + healthcheck_record.h + json_handlers.cpp + json_handlers.h json_handlers_operation.cpp json_handlers_pdisk.cpp json_handlers_scheme.cpp json_handlers_storage.cpp json_handlers_vdisk.cpp json_handlers_viewer.cpp - json_healthcheck.h - json_hiveinfo.h - json_hotkeys.h - json_labeledcounters.h - json_metainfo.h - json_netinfo.h - json_nodeinfo.h - json_nodelist.h - json_nodes.h - json_pdiskinfo.h + json_handlers_pq.cpp + json_local_rpc.h json_pipe_req.cpp - json_query.h - json_query_old.h - json_render.h - json_storage.h - json_sysinfo.h - json_tabletcounters.h - json_tabletinfo.h - json_tenants.h - json_tenantinfo.h - json_topicinfo.h - json_pqconsumerinfo.h + json_pipe_req.h + json_storage_base.h json_vdisk_req.h - json_vdisk_evict.h - json_vdiskinfo.h - json_vdiskstat.h json_wb_req.h - json_whoami.h log.h - operation_cancel.h - operation_forget.h - operation_get.h - operation_list.h - pdisk_info.h - pdisk_status.h - scheme_directory.h - storage_groups.cpp + operation_cancel.cpp + operation_forget.cpp + operation_get.cpp + operation_list.cpp + pdisk_info.cpp + pdisk_restart.cpp + pdisk_status.cpp query_autocomplete_helper.h + scheme_directory.cpp + storage_groups.cpp + vdisk_blobindexstat.cpp + vdisk_evict.cpp + vdisk_getblob.cpp + vdisk_vdiskstat.cpp + viewer_acl.cpp + viewer_autocomplete.cpp + viewer_autocomplete.h + viewer_browse.cpp + viewer_bscontrollerinfo.cpp + viewer_bsgroupinfo.cpp + viewer_bsgroupinfo.h viewer_capabilities.cpp - viewer_request.cpp - viewer_request.h + viewer_check_access.cpp + viewer_cluster.cpp + viewer_compute.cpp + viewer_config.cpp + viewer_content.cpp + viewer_counters.cpp viewer.cpp + viewer_describe_consumer.cpp + viewer_describe.cpp + viewer_describe_topic.cpp + viewer_graph.cpp viewer.h + viewer_healthcheck.cpp + viewer_helper.h + viewer_hiveinfo.cpp + viewer_hivestats.cpp + viewer_hotkeys.cpp + viewer_labeled_counters.cpp + viewer_metainfo.cpp + viewer_netinfo.cpp + viewer_nodeinfo.cpp + viewer_nodelist.cpp + viewer_nodes.cpp + viewer_pdiskinfo.cpp + viewer_pdiskinfo.h + viewer_pqconsumerinfo.cpp viewer_probes.cpp + viewer_probes.h + viewer_query.cpp + viewer_query_old.h + viewer_render.cpp + viewer_render.h + viewer_request.cpp + viewer_request.h + viewer_storage.cpp + viewer_storage_usage.cpp + viewer_sysinfo.cpp + viewer_sysinfo.h + viewer_tabletcounters.cpp + viewer_tabletinfo.cpp + viewer_tabletinfo.h + viewer_tenantinfo.cpp + viewer_tenants.cpp + viewer_topicinfo.cpp + viewer_vdiskinfo.cpp + viewer_vdiskinfo.h + viewer_whoami.cpp wb_aggregate.cpp wb_aggregate.h wb_filter.cpp @@ -84,6 +103,7 @@ SRCS( wb_group.h wb_merge.cpp wb_merge.h + wb_req.h ) IF (NOT EXPORT_CMAKE)