summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorErmoshkin Artem <[email protected]>2026-07-20 14:41:06 +0300
committerGitHub <[email protected]>2026-07-20 11:41:06 +0000
commit5790bd6cf50cc074ab342c5e537fd0bcdce685d4 (patch)
treea60555e511cf360476bf848e58784f33c7252beb
parentd204eee5192cf315f8a3fda408c2d7075bac1bd3 (diff)
implemented tracing and metrics observability headers (#46668)
Co-authored-by: Artem Ermoshkin <[email protected]>
-rw-r--r--ydb/public/sdk/cpp/src/client/impl/internal/grpc_connections/grpc_connections.cpp18
-rw-r--r--ydb/public/sdk/cpp/src/client/impl/internal/grpc_connections/grpc_connections.h1
-rw-r--r--ydb/public/sdk/cpp/src/client/impl/internal/rpc_request_settings/settings.h1
-rw-r--r--ydb/public/sdk/cpp/src/client/impl/observability/constants.h5
-rw-r--r--ydb/public/sdk/cpp/tests/unit/client/driver/driver_ut.cpp32
-rw-r--r--ydb/public/sdk/cpp/tests/unit/client/driver/ya.make1
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
)