From 957478414028609b7becd3ccc2cddc5a4b13f442 Mon Sep 17 00:00:00 2001 From: Alexey Efimov Date: Fri, 19 Jul 2024 12:11:56 +0000 Subject: [PATCH] http viewer capabilities --- ydb/core/viewer/json_handlers.h | 4 +- ydb/core/viewer/json_handlers_viewer.cpp | 3 ++ ydb/core/viewer/storage_groups.cpp | 2 +- ydb/core/viewer/viewer.cpp | 10 ++++ ydb/core/viewer/viewer.h | 2 + ydb/core/viewer/viewer_capabilities.cpp | 68 ++++++++++++++++++++++++ ydb/core/viewer/ya.make | 1 + 7 files changed, 88 insertions(+), 2 deletions(-) create mode 100644 ydb/core/viewer/viewer_capabilities.cpp diff --git a/ydb/core/viewer/json_handlers.h b/ydb/core/viewer/json_handlers.h index bfe329ad9385..0a994546740d 100644 --- a/ydb/core/viewer/json_handlers.h +++ b/ydb/core/viewer/json_handlers.h @@ -52,10 +52,12 @@ class TJsonHandler : public TJsonHandlerBase { struct TJsonHandlers { std::vector JsonHandlersList; THashMap> JsonHandlersIndex; + std::map Capabilities; - void AddHandler(const TString& name, TJsonHandlerBase* handler) { + void AddHandler(const TString& name, TJsonHandlerBase* handler, int version = 1) { JsonHandlersList.push_back(name); JsonHandlersIndex[name] = std::shared_ptr(handler); + Capabilities[name] = version; } TJsonHandlerBase* FindHandler(const TString& name) const { diff --git a/ydb/core/viewer/json_handlers_viewer.cpp b/ydb/core/viewer/json_handlers_viewer.cpp index ff55ada322b4..e037c4f4ea84 100644 --- a/ydb/core/viewer/json_handlers_viewer.cpp +++ b/ydb/core/viewer/json_handlers_viewer.cpp @@ -44,7 +44,10 @@ namespace NKikimr::NViewer { +void InitViewerCapabilitiesJsonHandler(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); diff --git a/ydb/core/viewer/storage_groups.cpp b/ydb/core/viewer/storage_groups.cpp index 2bdecfa14f4c..684f4a3eb596 100644 --- a/ydb/core/viewer/storage_groups.cpp +++ b/ydb/core/viewer/storage_groups.cpp @@ -1700,7 +1700,7 @@ YAML::Node TJsonRequestSwagger::GetSwagger() { YAML::Node node = YAML::Load(R"___( post: tags: - - viewer + - storage summary: Storage groups description: Information about storage groups parameters: diff --git a/ydb/core/viewer/viewer.cpp b/ydb/core/viewer/viewer.cpp index 90f57b2495e8..779571ef32ea 100644 --- a/ydb/core/viewer/viewer.cpp +++ b/ydb/core/viewer/viewer.cpp @@ -355,6 +355,15 @@ class TViewer : public TActorBootstrapped, public IViewer { return {}; } + NJson::TJsonValue GetCapabilities() override { + std::lock_guard guard(JsonHandlersMutex); + NJson::TJsonValue capabilities(NJson::JSON_MAP); + for (const auto& [name, version] : JsonHandlers.Capabilities) { + capabilities[name] = version; + } + return capabilities; + } + void RegisterVirtualHandler( NKikimrViewer::EObjectType parentObjectType, TVirtualHandlerType handler) override { @@ -385,6 +394,7 @@ class TViewer : public TActorBootstrapped, public IViewer { private: TJsonHandlers JsonHandlers; + std::mutex JsonHandlersMutex; std::unordered_map Redirect307; const TKikimrRunConfig KikimrRunConfig; std::unordered_multimap VirtualHandlersByParentType; diff --git a/ydb/core/viewer/viewer.h b/ydb/core/viewer/viewer.h index 912de93d668d..67cac550005c 100644 --- a/ydb/core/viewer/viewer.h +++ b/ydb/core/viewer/viewer.h @@ -206,6 +206,8 @@ class IViewer { virtual void AddRunningQuery(const TString& queryId, const TActorId& actorId) = 0; virtual void EndRunningQuery(const TString& queryId, const TActorId& actorId) = 0; virtual TActorId FindRunningQuery(const TString& queryId) = 0; + + virtual NJson::TJsonValue GetCapabilities() = 0; }; void SetupPQVirtualHandlers(IViewer* viewer); diff --git a/ydb/core/viewer/viewer_capabilities.cpp b/ydb/core/viewer/viewer_capabilities.cpp new file mode 100644 index 000000000000..42cb851971b3 --- /dev/null +++ b/ydb/core/viewer/viewer_capabilities.cpp @@ -0,0 +1,68 @@ +#include +#include +#include +#include "viewer.h" +#include "json_handlers.h" +#include "json_pipe_req.h" + +namespace NKikimr { +namespace NViewer { + +using namespace NActors; + +class TViewerCapabilities : public TViewerPipeClient { +public: + using TBase = TViewerPipeClient; + + static constexpr NKikimrServices::TActivity::EType ActorActivityType() { + return NKikimrServices::TActivity::VIEWER_HANDLER; + } + + TViewerCapabilities(IViewer* viewer, NMon::TEvHttpInfo::TPtr& ev) + : TBase(viewer, ev) + {} + + void Bootstrap() { + ReplyAndPassAway(); + } + + void ReplyAndPassAway() { + NJson::TJsonValue json; + json["Capabilities"] = Viewer->GetCapabilities(); + TBase::ReplyAndPassAway(GetHTTPOKJSON(NJson::WriteJson(json, false))); + } +}; + +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 + )___"); + return node; +} + + +void InitViewerCapabilitiesJsonHandler(TJsonHandlers& jsonHandlers) { + jsonHandlers.AddHandler("/viewer/capabilities", new TJsonHandler()); +} + +} // namespace NViewer +} // namespace NKikimr diff --git a/ydb/core/viewer/ya.make b/ydb/core/viewer/ya.make index f1a37de383c9..1972ce9a31c9 100644 --- a/ydb/core/viewer/ya.make +++ b/ydb/core/viewer/ya.make @@ -70,6 +70,7 @@ SRCS( scheme_directory.h storage_groups.cpp query_autocomplete_helper.h + viewer_capabilities.cpp viewer_request.cpp viewer_request.h viewer.cpp