From 530fde19a89b457624ea80147e1283f1e64965ea Mon Sep 17 00:00:00 2001 From: Daniil Cherednik Date: Wed, 20 Dec 2023 19:03:56 +0100 Subject: [PATCH] Add grpc request proxy wilson span and trace id on the request context. (#606) --- ydb/core/grpc_services/base/base.h | 40 ++++++++++++++++--- ydb/core/grpc_services/base/iface.h | 3 +- .../grpc_services/grpc_request_check_actor.h | 1 + ydb/core/grpc_services/grpc_request_proxy.cpp | 14 +++++++ ydb/core/grpc_services/local_rpc/local_rpc.h | 4 +- ydb/library/wilson_ids/wilson.h | 6 +++ 6 files changed, 60 insertions(+), 8 deletions(-) diff --git a/ydb/core/grpc_services/base/base.h b/ydb/core/grpc_services/base/base.h index b3fcdf1ecfcd..218e82595a5d 100644 --- a/ydb/core/grpc_services/base/base.h +++ b/ydb/core/grpc_services/base/base.h @@ -25,6 +25,8 @@ #include #include +#include + #include namespace NKikimr { @@ -361,6 +363,10 @@ class IRequestProxyCtx : public virtual IRequestCtxBase { virtual void ReplyUnauthenticated(const TString& msg = "") = 0; virtual void ReplyUnavaliable() = 0; + //tracing + virtual void StartTracing(NWilson::TSpan&& span) = 0; + virtual void LegacyFinishSpan() = 0; + // validation virtual bool Validate(TString& error) = 0; @@ -477,6 +483,9 @@ class TRefreshTokenImpl return Token_; } + void StartTracing(NWilson::TSpan&& /*span*/) override {} + void LegacyFinishSpan() override {} + void UpdateAuthState(NYdbGrpc::TAuthState::EAuthState state) override { State_.State = state; } @@ -598,7 +607,7 @@ class TRefreshTokenImpl return {}; } - TMaybe GetOpenTelemetryTraceParent() const override { + NWilson::TTraceId GetWilsonTraceId() const override { return {}; } @@ -821,8 +830,8 @@ class TGRpcRequestBiStreamWrapper return GetPeerMetaValues(NYdb::YDB_TRACE_ID_HEADER); } - TMaybe GetOpenTelemetryTraceParent() const override { - return GetPeerMetaValues(NYdb::OTEL_TRACE_HEADER); + NWilson::TTraceId GetWilsonTraceId() const override { + return Span_.GetTraceId(); } const TMaybe GetSdkBuildInfo() const { @@ -872,6 +881,16 @@ class TGRpcRequestBiStreamWrapper Y_ABORT("unimplemented for TGRpcRequestBiStreamWrapper"); } + // IRequestProxyCtx + // + void StartTracing(NWilson::TSpan&& span) override { + Span_ = std::move(span); + } + + void LegacyFinishSpan() override { + Span_.End(); + } + // IRequestCtxBase // void AddAuditLogPart(const TStringBuf&, const TString&) override { @@ -889,6 +908,7 @@ class TGRpcRequestBiStreamWrapper TMaybe RlPath_; bool RlAllowed_; IGRpcProxyCounters::TPtr Counters_; + NWilson::TSpan Span_; }; template @@ -1147,8 +1167,8 @@ class TGRpcRequestWrapperImpl return GetPeerMetaValues(NYdb::YDB_TRACE_ID_HEADER); } - TMaybe GetOpenTelemetryTraceParent() const override { - return GetPeerMetaValues(NYdb::OTEL_TRACE_HEADER); + NWilson::TTraceId GetWilsonTraceId() const override { + return Span_.GetTraceId(); } const TMaybe GetSdkBuildInfo() const { @@ -1277,6 +1297,12 @@ class TGRpcRequestWrapperImpl return AuditLogParts; } + void StartTracing(NWilson::TSpan&& span) override { + Span_ = std::move(span); + } + + void LegacyFinishSpan() override {} + void ReplyGrpcError(grpc::StatusCode code, const TString& msg, const TString& details = "") { Ctx_->ReplyError(code, msg, details); } @@ -1316,6 +1342,8 @@ class TGRpcRequestWrapperImpl }; } +protected: + NWilson::TSpan Span_; private: TIntrusivePtr Ctx_; TIntrusiveConstPtr InternalToken_; @@ -1393,6 +1421,8 @@ class TGrpcRequestCall { } void Pass(const IFacilityProvider& facility) override { + this->Span_.End(); + PassMethod(std::move(std::unique_ptr(this)), facility); } diff --git a/ydb/core/grpc_services/base/iface.h b/ydb/core/grpc_services/base/iface.h index 1331a147c879..1bb1e57c9b9f 100644 --- a/ydb/core/grpc_services/base/iface.h +++ b/ydb/core/grpc_services/base/iface.h @@ -1,6 +1,7 @@ #pragma once #include +#include namespace google::protobuf { class Message; @@ -21,7 +22,7 @@ using TAuditLogHook = std::function; class IRequestCtxBaseMtSafe { public: virtual TMaybe GetTraceId() const = 0; - virtual TMaybe GetOpenTelemetryTraceParent() const = 0; + virtual NWilson::TTraceId GetWilsonTraceId() const = 0; // Returns client provided database name virtual const TMaybe GetDatabaseName() const = 0; // Returns "internal" token (result of ticket parser authentication) diff --git a/ydb/core/grpc_services/grpc_request_check_actor.h b/ydb/core/grpc_services/grpc_request_check_actor.h index f934ec06744f..a3e9ff044168 100644 --- a/ydb/core/grpc_services/grpc_request_check_actor.h +++ b/ydb/core/grpc_services/grpc_request_check_actor.h @@ -428,6 +428,7 @@ class TGrpcRequestCheckActor template void HandleAndDie(T& event) { + GrpcRequestBaseCtx_->LegacyFinishSpan(); TGRpcRequestProxyHandleMethods::Handle(event, TlsActivationContext->AsActorContext()); TBase::PassAway(); } diff --git a/ydb/core/grpc_services/grpc_request_proxy.cpp b/ydb/core/grpc_services/grpc_request_proxy.cpp index 47c6b2cf2035..4652fe589ad6 100644 --- a/ydb/core/grpc_services/grpc_request_proxy.cpp +++ b/ydb/core/grpc_services/grpc_request_proxy.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include @@ -79,12 +80,15 @@ class TGRpcRequestProxyImpl void HandleSchemeBoard(TSchemeBoardEvents::TEvNotifyDelete::TPtr& ev); void ReplayEvents(const TString& databaseName, const TActorContext& ctx); + void StartTracing(IRequestProxyCtx& ctx); + static bool IsAuthStateOK(const IRequestProxyCtx& ctx); template void Handle(TAutoPtr>& event, const TActorContext& ctx) { IRequestProxyCtx* requestBaseCtx = event->Get(); if (ValidateAndReplyOnError(requestBaseCtx)) { + requestBaseCtx->LegacyFinishSpan(); TGRpcRequestProxyHandleMethods::Handle(event, ctx); } } @@ -92,6 +96,7 @@ class TGRpcRequestProxyImpl void Handle(TEvListEndpointsRequest::TPtr& event, const TActorContext& ctx) { IRequestProxyCtx* requestBaseCtx = event->Get(); if (ValidateAndReplyOnError(requestBaseCtx)) { + requestBaseCtx->LegacyFinishSpan(); TGRpcRequestProxy::Handle(event, ctx); } } @@ -145,6 +150,9 @@ class TGRpcRequestProxyImpl return; } + + //StartTracing(*requestBaseCtx); + if (IsAuthStateOK(*requestBaseCtx)) { Handle(event, ctx); return; @@ -401,6 +409,12 @@ bool TGRpcRequestProxyImpl::IsAuthStateOK(const IRequestProxyCtx& ctx) { state.NeedAuth == false && !ctx.GetYdbToken(); } +void TGRpcRequestProxyImpl::StartTracing(IRequestProxyCtx& ctx) { + auto traceId = NWilson::TTraceId::NewTraceId(15, Max()); + NWilson::TSpan grpcRequestProxySpan(TWilsonGrpc::RequestProxy, std::move(traceId), "GrpcRequestProxy"); + ctx.StartTracing(std::move(grpcRequestProxySpan)); +} + void TGRpcRequestProxyImpl::HandleSchemeBoard(TSchemeBoardEvents::TEvNotifyUpdate::TPtr& ev, const TActorContext& ctx) { TString databaseName = ev->Get()->Path; LOG_DEBUG_S(*TlsActivationContext, NKikimrServices::GRPC_SERVER, "SchemeBoardUpdate " << databaseName); diff --git a/ydb/core/grpc_services/local_rpc/local_rpc.h b/ydb/core/grpc_services/local_rpc/local_rpc.h index 42efae2740b0..85a98ddd1593 100644 --- a/ydb/core/grpc_services/local_rpc/local_rpc.h +++ b/ydb/core/grpc_services/local_rpc/local_rpc.h @@ -191,8 +191,8 @@ class TLocalRpcCtx : public NGRpcService::IRequestOpCtx { return Nothing(); } - TMaybe GetOpenTelemetryTraceParent() const override { - return Nothing(); + NWilson::TTraceId GetWilsonTraceId() const override { + return {}; } TInstant GetDeadline() const override { diff --git a/ydb/library/wilson_ids/wilson.h b/ydb/library/wilson_ids/wilson.h index e085d1501f9f..110d26a0cf1a 100644 --- a/ydb/library/wilson_ids/wilson.h +++ b/ydb/library/wilson_ids/wilson.h @@ -44,4 +44,10 @@ namespace NKikimr { }; }; + struct TWilsonGrpc { + enum { + RequestProxy = 9, + }; + }; + } // NKikimr