Skip to content

Commit

Permalink
refactor local json handler (#5539)
Browse files Browse the repository at this point in the history
  • Loading branch information
adameat authored Jun 14, 2024
1 parent c69fa74 commit a72739a
Show file tree
Hide file tree
Showing 5 changed files with 172 additions and 145 deletions.
72 changes: 72 additions & 0 deletions ydb/core/viewer/json_describe_consumer.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
#pragma once
#include <ydb/public/api/grpc/ydb_topic_v1.grpc.pb.h>
#include <ydb/core/grpc_services/rpc_calls_topic.h>
#include "json_local_rpc.h"

namespace NKikimr {
namespace NViewer {

using TJsonDescribeConsumer = TJsonLocalRpc<Ydb::Topic::DescribeConsumerRequest,
Ydb::Topic::DescribeConsumerResponse,
Ydb::Topic::DescribeConsumerResult,
Ydb::Topic::V1::TopicService,
NKikimr::NGRpcService::TEvDescribeConsumerRequest>;

template<>
YAML::Node TJsonRequestSwagger<TJsonDescribeConsumer>::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<Ydb::Topic::DescribeConsumerResult>();
return node;
}

}
}
72 changes: 72 additions & 0 deletions ydb/core/viewer/json_describe_topic.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
#pragma once
#include <ydb/public/api/grpc/ydb_topic_v1.grpc.pb.h>
#include <ydb/core/grpc_services/rpc_calls_topic.h>
#include "json_local_rpc.h"

namespace NKikimr {
namespace NViewer {

using TJsonDescribeTopic = TJsonLocalRpc<Ydb::Topic::DescribeTopicRequest,
Ydb::Topic::DescribeTopicResponse,
Ydb::Topic::DescribeTopicResult,
Ydb::Topic::V1::TopicService,
NKikimr::NGRpcService::TEvDescribeTopicRequest>;

template<>
YAML::Node TJsonRequestSwagger<TJsonDescribeTopic>::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<Ydb::Topic::DescribeTopicResult>();
return node;
}

}
}
3 changes: 2 additions & 1 deletion ydb/core/viewer/json_handlers_viewer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
168 changes: 24 additions & 144 deletions ydb/core/viewer/json_local_rpc.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,6 @@
#include "viewer.h"
#include "json_pipe_req.h"

#include <ydb/public/api/grpc/ydb_topic_v1.grpc.pb.h>
#include <ydb/core/grpc_services/rpc_calls_topic.h>
#include <ydb/core/grpc_services/local_rpc/local_rpc.h>
#include <ydb/public/sdk/cpp/client/ydb_types/status/status.h>

Expand Down Expand Up @@ -49,13 +47,11 @@ class TJsonLocalRpc : public TActorBootstrapped<TJsonLocalRpc<TProtoRequest, TPr

IViewer* Viewer;
NMon::TEvHttpInfo::TPtr Event;
TAutoPtr<TEvLocalRpcPrivate::TEvGrpcRequestResult<TProtoResult>> DescribeResult;
TAutoPtr<TEvLocalRpcPrivate::TEvGrpcRequestResult<TProtoResult>> Result;

TJsonSettings JsonSettings;
ui32 Timeout = 0;

TString Database;

NThreading::TFuture<TProtoResponse> RpcFuture;

public:
Expand Down Expand Up @@ -131,8 +127,7 @@ class TJsonLocalRpc : public TActorBootstrapped<TJsonLocalRpc<TProtoRequest, TPr
NProtobufJson::Json2Proto(postData, request, json2ProtoConfig);
}
catch (const yexception& e) {
Send(Event->Sender, 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());
Expand Down Expand Up @@ -171,19 +166,25 @@ class TJsonLocalRpc : public TActorBootstrapped<TJsonLocalRpc<TProtoRequest, TPr
JsonSettings.EnumAsNumbers = !FromStringWithDefault<bool>(params.Get("enums"), false);
JsonSettings.UI64AsString = !FromStringWithDefault<bool>(params.Get("ui64"), false);
Timeout = FromStringWithDefault<ui32>(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<TProtoResult>::TPtr& ev) {
DescribeResult = ev->Release();
Result = ev->Release();
ReplyAndPassAway();
}

STATEFN(StateRequestedDescribe) {
STATEFN(StateRequested) {
switch (ev->GetTypeRewrite()) {
hFunc(TEvLocalRpcPrivate::TEvGrpcRequestResult<TProtoResult>, Handle);
cFunc(TEvents::TSystem::Wakeup, HandleTimeout);
Expand All @@ -192,152 +193,31 @@ class TJsonLocalRpc : public TActorBootstrapped<TJsonLocalRpc<TProtoRequest, TPr

void ReplyAndPassAway() {
TStringStream json;
if (DescribeResult) {
if (!DescribeResult->Status->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<Ydb::Topic::DescribeTopicRequest,
Ydb::Topic::DescribeTopicResponse,
Ydb::Topic::DescribeTopicResult,
Ydb::Topic::V1::TopicService,
NKikimr::NGRpcService::TEvDescribeTopicRequest>;

using TJsonDescribeConsumer = TJsonLocalRpc<Ydb::Topic::DescribeConsumerRequest,
Ydb::Topic::DescribeConsumerResponse,
Ydb::Topic::DescribeConsumerResult,
Ydb::Topic::V1::TopicService,
NKikimr::NGRpcService::TEvDescribeConsumerRequest>;

template <>
struct TJsonRequestParameters<TJsonDescribeTopic> {
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<TJsonDescribeTopic> {
static TString GetSummary() {
return "Topic schema detailed information";
}
};

template <>
struct TJsonRequestDescription<TJsonDescribeTopic> {
static TString GetDescription() {
return "Returns detailed information about topic";
}
};


template <>
struct TJsonRequestParameters<TJsonDescribeConsumer> {
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<TJsonDescribeConsumer> {
static TString GetSummary() {
return "Topic's consumer detailed information";
void HandleTimeout() {
ReplyAndPassAway(Viewer->GetHTTPGATEWAYTIMEOUT(Event->Get()));
}
};

template <>
struct TJsonRequestDescription<TJsonDescribeConsumer> {
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();
}
};

Expand Down
2 changes: 2 additions & 0 deletions ydb/core/viewer/ya.make
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit a72739a

Please sign in to comment.