diff options
| author | Ermoshkin Artem <[email protected]> | 2026-07-20 14:41:06 +0300 |
|---|---|---|
| committer | GitHub <[email protected]> | 2026-07-20 11:41:06 +0000 |
| commit | 5790bd6cf50cc074ab342c5e537fd0bcdce685d4 (patch) | |
| tree | a60555e511cf360476bf848e58784f33c7252beb | |
| parent | d204eee5192cf315f8a3fda408c2d7075bac1bd3 (diff) | |
implemented tracing and metrics observability headers (#46668)
Co-authored-by: Artem Ermoshkin <[email protected]>
6 files changed, 52 insertions, 6 deletions
diff --git a/ydb/public/sdk/cpp/src/client/impl/internal/grpc_connections/grpc_connections.cpp b/ydb/public/sdk/cpp/src/client/impl/internal/grpc_connections/grpc_connections.cpp index 97588f4e8f3..0110fa6829e 100644 --- a/ydb/public/sdk/cpp/src/client/impl/internal/grpc_connections/grpc_connections.cpp +++ b/ydb/public/sdk/cpp/src/client/impl/internal/grpc_connections/grpc_connections.cpp @@ -313,8 +313,16 @@ std::string CreateSDKBuildInfo() { return std::string("ydb-cpp-sdk/") + GetSdkSemver(); } -std::string BuildFullBuildInfo(const IConnectionsParams& params) { +std::string BuildFullBuildInfo(const IConnectionsParams& params, bool includeObservability) { auto result = CreateSDKBuildInfo(); + if (includeObservability && params.GetTraceProvider()) { + result += " ydb-sdk-tracing/"; + result += NObservability::kTracingChainVersion; + } + if (includeObservability && params.GetExternalMetricRegistry()) { + result += " ydb-sdk-metrics/"; + result += NObservability::kMetricsChainVersion; + } auto extra = params.GetBuildInfoExtra(); if (!extra.empty()) { result += ';'; @@ -470,7 +478,8 @@ TGRpcConnectionsImpl::TGRpcConnectionsImpl(std::shared_ptr<IConnectionsParams> p #endif , MetricRegistry_(params->GetExternalMetricRegistry()) , TraceProvider_(params->GetTraceProvider()) - , BuildInfo_(BuildFullBuildInfo(*params)) + , BuildInfoWithoutObservability_(BuildFullBuildInfo(*params, false)) + , BuildInfo_(BuildFullBuildInfo(*params, true)) , NetworkThreadsNum_(params->GetNetworkThreadsNum()) , UsePerChannelTcpConnection_(params->GetUsePerChannelTcpConnection()) , GRpcClientLow_(NetworkThreadsNum_) @@ -727,6 +736,7 @@ TAsyncListEndpointsResult TGRpcConnectionsImpl::GetEndpoints(TDbDriverStatePtr d TRpcRequestSettings rpcSettings; rpcSettings.Deadline = TDeadline::AfterDuration(GET_ENDPOINTS_TIMEOUT); + rpcSettings.IncludeObservabilityInBuildInfo = true; RunDeferred<Ydb::Discovery::V1::DiscoveryService, Ydb::Discovery::ListEndpointsRequest, Ydb::Discovery::ListEndpointsResponse>( std::move(request), @@ -892,7 +902,9 @@ TCallMeta TGRpcConnectionsImpl::MakeCallMeta(const TRpcRequestSettings& requestS static const std::string clientPid = GetClientPIDHeaderValue(); - meta.Aux.push_back({YDB_SDK_BUILD_INFO_HEADER, BuildInfo_}); + meta.Aux.push_back({ + YDB_SDK_BUILD_INFO_HEADER, + requestSettings.IncludeObservabilityInBuildInfo ? BuildInfo_ : BuildInfoWithoutObservability_}); meta.Aux.push_back({YDB_CLIENT_PID, clientPid}); meta.Aux.insert(meta.Aux.end(), requestSettings.Header.begin(), requestSettings.Header.end()); diff --git a/ydb/public/sdk/cpp/src/client/impl/internal/grpc_connections/grpc_connections.h b/ydb/public/sdk/cpp/src/client/impl/internal/grpc_connections/grpc_connections.h index 6ac4f053ea0..6f2302303b7 100644 --- a/ydb/public/sdk/cpp/src/client/impl/internal/grpc_connections/grpc_connections.h +++ b/ydb/public/sdk/cpp/src/client/impl/internal/grpc_connections/grpc_connections.h @@ -981,6 +981,7 @@ private: IDiscoveryMutatorApi::TMutatorCb DiscoveryMutatorCb; + const std::string BuildInfoWithoutObservability_; const std::string BuildInfo_; const std::size_t NetworkThreadsNum_; diff --git a/ydb/public/sdk/cpp/src/client/impl/internal/rpc_request_settings/settings.h b/ydb/public/sdk/cpp/src/client/impl/internal/rpc_request_settings/settings.h index 8818be366f2..185cf004b98 100644 --- a/ydb/public/sdk/cpp/src/client/impl/internal/rpc_request_settings/settings.h +++ b/ydb/public/sdk/cpp/src/client/impl/internal/rpc_request_settings/settings.h @@ -18,6 +18,7 @@ struct TRpcRequestSettings { UseDiscoveryEndpoint // Use single discovery endpoint } EndpointPolicy = TEndpointPolicy::UsePreferredEndpointOptionally; bool UseAuth = true; + bool IncludeObservabilityInBuildInfo = false; NYdb::TDeadline Deadline = NYdb::TDeadline::Max(); std::string TraceParent; diff --git a/ydb/public/sdk/cpp/src/client/impl/observability/constants.h b/ydb/public/sdk/cpp/src/client/impl/observability/constants.h index 08f3bfdbb96..8653667c5a4 100644 --- a/ydb/public/sdk/cpp/src/client/impl/observability/constants.h +++ b/ydb/public/sdk/cpp/src/client/impl/observability/constants.h @@ -11,6 +11,11 @@ namespace NYdb::inline Dev::NObservability { +// SDK build-info chain versions. Bump these when the corresponding +// observability integration changes incompatibly. +inline constexpr std::string_view kTracingChainVersion = "0.1.0"; +inline constexpr std::string_view kMetricsChainVersion = "0.1.0"; + // --------------------------------------------------------------------------- // OTel Semconv attribute keys shared between span attributes and metric labels. // --------------------------------------------------------------------------- diff --git a/ydb/public/sdk/cpp/tests/unit/client/driver/driver_ut.cpp b/ydb/public/sdk/cpp/tests/unit/client/driver/driver_ut.cpp index ee89d7d1eba..330e048cdf1 100644 --- a/ydb/public/sdk/cpp/tests/unit/client/driver/driver_ut.cpp +++ b/ydb/public/sdk/cpp/tests/unit/client/driver/driver_ut.cpp @@ -1,7 +1,11 @@ +#include <ydb/public/sdk/cpp/include/ydb-cpp-sdk/client/resources/ydb_resources.h> #include <ydb/public/sdk/cpp/include/ydb-cpp-sdk/client/table/table.h> #include <ydb/public/sdk/cpp/include/ydb-cpp-sdk/client/types/credentials/credentials.h> #include <ydb/public/sdk/cpp/include/ydb-cpp-sdk/client/types/exceptions/exceptions.h> #include <ydb/public/sdk/cpp/include/ydb-cpp-sdk/type_switcher.h> +#include <ydb/public/sdk/cpp/src/client/impl/observability/constants.h> +#include <ydb/public/sdk/cpp/tests/common/fake_metric_registry.h> +#include <ydb/public/sdk/cpp/tests/common/fake_trace_provider.h> #include <ydb/public/api/grpc/ydb_discovery_v1.grpc.pb.h> #include <ydb/public/api/grpc/ydb_table_v1.grpc.pb.h> @@ -25,6 +29,13 @@ using namespace NYdb::NTable; namespace { + std::string ReadBuildInfo(grpc::ServerContext* context) { + const auto& metadata = context->client_metadata(); + const auto it = metadata.find(YDB_SDK_BUILD_INFO_HEADER); + Y_ABORT_UNLESS(it != metadata.end()); + return {it->second.data(), it->second.length()}; + } + class TMockDiscoveryService : public Ydb::Discovery::V1::DiscoveryService::Service { public: grpc::Status ListEndpoints( @@ -32,7 +43,7 @@ namespace { const Ydb::Discovery::ListEndpointsRequest* request, Ydb::Discovery::ListEndpointsResponse* response) override { - Y_UNUSED(context); + BuildInfo = ReadBuildInfo(context); std::cerr << "ListEndpoints: " << request->ShortDebugString() << std::endl; @@ -48,6 +59,7 @@ namespace { // From database name to result std::unordered_map<std::string, Ydb::Discovery::ListEndpointsResult> MockResults; + std::string BuildInfo; }; class TMockTableService : public Ydb::Table::V1::TableService::Service { @@ -57,7 +69,7 @@ namespace { const Ydb::Table::CreateSessionRequest* request, Ydb::Table::CreateSessionResponse* response) override { - Y_UNUSED(context); + BuildInfo = ReadBuildInfo(context); std::cerr << "CreateSession: " << request->ShortDebugString() << std::endl; @@ -70,6 +82,8 @@ namespace { op->mutable_result()->PackFrom(result); return grpc::Status::OK; } + + std::string BuildInfo; }; template<class TService> @@ -326,7 +340,10 @@ Y_UNIT_TEST_SUITE(CppGrpcClientSimpleTest) { auto driver = TDriver( TDriverConfig() .SetEndpoint(TStringBuilder() << "localhost:" << discoveryPort) - .SetDatabase("/Root/My/DB")); + .SetDatabase("/Root/My/DB") + .SetTraceProvider(std::make_shared<NTests::TFakeTraceProvider>()) + .SetMetricRegistry(std::make_shared<NTests::TFakeMetricRegistry>()) + .AppendBuildInfo("test-client/1.2.3")); auto client = NTable::TTableClient(driver); auto sessionFuture = client.CreateSession(); @@ -335,6 +352,15 @@ Y_UNIT_TEST_SUITE(CppGrpcClientSimpleTest) { UNIT_ASSERT(sessionResult.IsSuccess()); auto session = sessionResult.GetSession(); UNIT_ASSERT_VALUES_EQUAL(session.GetId(), "my-session-id"); + + const auto baseBuildInfo = "ydb-cpp-sdk/" + GetSdkSemver(); + UNIT_ASSERT_VALUES_EQUAL( + discoveryService.BuildInfo, + baseBuildInfo + + " ydb-sdk-tracing/" + std::string(NObservability::kTracingChainVersion) + + " ydb-sdk-metrics/" + std::string(NObservability::kMetricsChainVersion) + + ";test-client/1.2.3"); + UNIT_ASSERT_VALUES_EQUAL(tableService.BuildInfo, baseBuildInfo + ";test-client/1.2.3"); } Y_UNIT_TEST(WithoutDiscoveryDriverLevel) { diff --git a/ydb/public/sdk/cpp/tests/unit/client/driver/ya.make b/ydb/public/sdk/cpp/tests/unit/client/driver/ya.make index 7853f5216c5..f8ad77e6f70 100644 --- a/ydb/public/sdk/cpp/tests/unit/client/driver/ya.make +++ b/ydb/public/sdk/cpp/tests/unit/client/driver/ya.make @@ -11,6 +11,7 @@ FORK_SUBTESTS() PEERDIR( ydb/public/sdk/cpp/src/client/driver + ydb/public/sdk/cpp/src/client/impl/observability ydb/public/sdk/cpp/src/client/table ) |
