From a72739ad7df7e0fe1b095d51c3f58896e8424c52 Mon Sep 17 00:00:00 2001 From: Alexey Efimov Date: Fri, 14 Jun 2024 08:18:56 +0200 Subject: [PATCH] refactor local json handler (#5539) --- ydb/core/viewer/json_describe_consumer.h | 72 ++++++++++ ydb/core/viewer/json_describe_topic.h | 72 ++++++++++ ydb/core/viewer/json_handlers_viewer.cpp | 3 +- ydb/core/viewer/json_local_rpc.h | 168 ++++------------------- ydb/core/viewer/ya.make | 2 + 5 files changed, 172 insertions(+), 145 deletions(-) create mode 100644 ydb/core/viewer/json_describe_consumer.h create mode 100644 ydb/core/viewer/json_describe_topic.h diff --git a/ydb/core/viewer/json_describe_consumer.h b/ydb/core/viewer/json_describe_consumer.h new file mode 100644 index 000000000000..06b39fdd7722 --- /dev/null +++ b/ydb/core/viewer/json_describe_consumer.h @@ -0,0 +1,72 @@ +#pragma once +#include +#include +#include "json_local_rpc.h" + +namespace NKikimr { +namespace NViewer { + +using TJsonDescribeConsumer = TJsonLocalRpc; + +template<> +YAML::Node TJsonRequestSwagger::GetSwagger() { + YAML::Node node = YAML::Load(R"___( + get: + tags: + - viewer + summary: Topic schema detailed information + description: Returns detailed information about topic + parameters: + - name: database + in: query + description: database name + required: true + type: string + - name: consumer + in: query + description: consumer name + required: true + type: string + - name: include_stats + in: query + description: include stat flag + required: false + type: bool + - 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 + responses: + 200: + description: OK + content: + application/json: + schema: {} + 400: + description: Bad Request + 403: + description: Forbidden + 504: + description: Gateway Timeout + )___"); + node["get"]["responses"]["200"]["content"]["application/json"]["schema"] = TProtoToYaml::ProtoToYamlSchema(); + return node; +} + +} +} diff --git a/ydb/core/viewer/json_describe_topic.h b/ydb/core/viewer/json_describe_topic.h new file mode 100644 index 000000000000..ac659c0cf9f7 --- /dev/null +++ b/ydb/core/viewer/json_describe_topic.h @@ -0,0 +1,72 @@ +#pragma once +#include +#include +#include "json_local_rpc.h" + +namespace NKikimr { +namespace NViewer { + +using TJsonDescribeTopic = TJsonLocalRpc; + +template<> +YAML::Node TJsonRequestSwagger::GetSwagger() { + YAML::Node node = YAML::Load(R"___( + get: + tags: + - viewer + summary: Topic schema detailed information + description: Returns detailed information about topic + parameters: + - name: database + in: query + description: database name + required: true + type: string + - name: path + in: query + description: schema path + required: true + type: string + - name: include_stats + in: query + description: include stat flag + required: false + type: bool + - 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 + responses: + 200: + description: OK + content: + application/json: + schema: {} + 400: + description: Bad Request + 403: + description: Forbidden + 504: + description: Gateway Timeout + )___"); + node["get"]["responses"]["200"]["content"]["application/json"]["schema"] = TProtoToYaml::ProtoToYamlSchema(); + return node; +} + +} +} diff --git a/ydb/core/viewer/json_handlers_viewer.cpp b/ydb/core/viewer/json_handlers_viewer.cpp index 419290521889..ff55ada322b4 100644 --- a/ydb/core/viewer/json_handlers_viewer.cpp +++ b/ydb/core/viewer/json_handlers_viewer.cpp @@ -7,7 +7,8 @@ #include "json_vdiskinfo.h" #include "json_pdiskinfo.h" #include "json_describe.h" -#include "json_local_rpc.h" +#include "json_describe_topic.h" +#include "json_describe_consumer.h" #include "json_hotkeys.h" #include "json_sysinfo.h" #include "json_tabletinfo.h" diff --git a/ydb/core/viewer/json_local_rpc.h b/ydb/core/viewer/json_local_rpc.h index 45fd823ce56c..2c5f35dac6a2 100644 --- a/ydb/core/viewer/json_local_rpc.h +++ b/ydb/core/viewer/json_local_rpc.h @@ -9,8 +9,6 @@ #include "viewer.h" #include "json_pipe_req.h" -#include -#include #include #include @@ -49,13 +47,11 @@ class TJsonLocalRpc : public TActorBootstrapped> DescribeResult; + TAutoPtr> Result; TJsonSettings JsonSettings; ui32 Timeout = 0; - TString Database; - NThreading::TFuture RpcFuture; public: @@ -131,8 +127,7 @@ class TJsonLocalRpc : public TActorBootstrappedSender, new NMon::TEvHttpInfoRes(Viewer->GetHTTPBADREQUEST(Event->Get(), {}, "Bad Request"), 0, NMon::IEvHttpInfoRes::EContentType::Custom)); - PassAway(); + ReplyAndPassAway(Viewer->GetHTTPBADREQUEST(Event->Get(), "text/plain", e.what())); } } else { const auto& params(Event->Get()->Request.GetParams()); @@ -171,19 +166,25 @@ class TJsonLocalRpc : public TActorBootstrapped(params.Get("enums"), false); JsonSettings.UI64AsString = !FromStringWithDefault(params.Get("ui64"), false); Timeout = FromStringWithDefault(params.Get("timeout"), 10000); - Database = params.Get("database_path"); + if (params.Has("database")) { + Database = params.Get("database"); + } else if (params.Has("database_path")) { + Database = params.Get("database_path"); + } else { + return ReplyAndPassAway(Viewer->GetHTTPBADREQUEST(Event->Get(), "text/plain", "field 'database' is required")); + } SendGrpcRequest(); - Become(&TThis::StateRequestedDescribe, TDuration::MilliSeconds(Timeout), new TEvents::TEvWakeup()); + Become(&TThis::StateRequested, TDuration::MilliSeconds(Timeout), new TEvents::TEvWakeup()); } void Handle(typename TEvLocalRpcPrivate::TEvGrpcRequestResult::TPtr& ev) { - DescribeResult = ev->Release(); + Result = ev->Release(); ReplyAndPassAway(); } - STATEFN(StateRequestedDescribe) { + STATEFN(StateRequested) { switch (ev->GetTypeRewrite()) { hFunc(TEvLocalRpcPrivate::TEvGrpcRequestResult, Handle); cFunc(TEvents::TSystem::Wakeup, HandleTimeout); @@ -192,152 +193,31 @@ class TJsonLocalRpc : public TActorBootstrappedStatus->IsSuccess()) { - if (DescribeResult->Status->GetStatus() == NYdb::EStatus::UNAUTHORIZED) { - Send(Event->Sender, new NMon::TEvHttpInfoRes(Viewer->GetHTTPFORBIDDEN(Event->Get()), 0, NMon::IEvHttpInfoRes::EContentType::Custom)); + if (Result) { + if (!Result->Status->IsSuccess()) { + if (Result->Status->GetStatus() == NYdb::EStatus::UNAUTHORIZED) { + return ReplyAndPassAway(Viewer->GetHTTPFORBIDDEN(Event->Get())); } else { - Send(Event->Sender, new NMon::TEvHttpInfoRes(Viewer->GetHTTPBADREQUEST(Event->Get()), 0, NMon::IEvHttpInfoRes::EContentType::Custom)); + return ReplyAndPassAway(Viewer->GetHTTPBADREQUEST(Event->Get())); } - PassAway(); - return; } else { - TProtoToJson::ProtoToJson(json, *(DescribeResult->Message), JsonSettings); + TProtoToJson::ProtoToJson(json, *(Result->Message), JsonSettings); } } 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(); - } -}; - - -using TJsonDescribeTopic = TJsonLocalRpc; - -using TJsonDescribeConsumer = TJsonLocalRpc; - -template <> -struct TJsonRequestParameters { - static YAML::Node GetParameters() { - return YAML::Load(R"___( - - 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: database_path - in: query - description: database path - required: false - type: string - - name: include_stats - in: query - description: include stat flag - required: false - type: bool - )___"); + ReplyAndPassAway(Viewer->GetHTTPOKJSON(Event->Get(), json.Str())); } -}; - -template <> -struct TJsonRequestSummary { - static TString GetSummary() { - return "Topic schema detailed information"; - } -}; - -template <> -struct TJsonRequestDescription { - static TString GetDescription() { - return "Returns detailed information about topic"; - } -}; -template <> -struct TJsonRequestParameters { - static YAML::Node GetParameters() { - return YAML::Load(R"___( - - 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: database_path - in: query - description: database path - required: false - type: string - - name: consumer - in: query - description: consumer name - required: false - type: string - - name: include_stats - in: query - description: include stat flag - required: false - type: bool - )___"); - } -}; - -template <> -struct TJsonRequestSummary { - static TString GetSummary() { - return "Topic's consumer detailed information"; + void HandleTimeout() { + ReplyAndPassAway(Viewer->GetHTTPGATEWAYTIMEOUT(Event->Get())); } -}; -template <> -struct TJsonRequestDescription { - static TString GetDescription() { - return "Returns detailed information about topic's consumer"; + void ReplyAndPassAway(TString data) { + Send(Event->Sender, new NMon::TEvHttpInfoRes(data, 0, NMon::IEvHttpInfoRes::EContentType::Custom)); + PassAway(); } }; diff --git a/ydb/core/viewer/ya.make b/ydb/core/viewer/ya.make index 6310981ea5d8..ddfe920951bf 100644 --- a/ydb/core/viewer/ya.make +++ b/ydb/core/viewer/ya.make @@ -22,6 +22,8 @@ SRCS( 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