Skip to content

Commit a102d53

Browse files
author
maladetska
committed
init commit
1 parent 69312e0 commit a102d53

16 files changed

Lines changed: 509 additions & 8 deletions

File tree

cmake/external_libs.cmake

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ find_package(base64 REQUIRED)
1313
find_package(Brotli 1.1.0 REQUIRED)
1414
find_package(jwt-cpp REQUIRED)
1515
find_package(double-conversion REQUIRED)
16+
find_package(opentelemetry-cpp REQUIRED)
1617

1718
# RapidJSON
1819
if (YDB_SDK_USE_RAPID_JSON)
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
#pragma once
2+
3+
#include <ydb-cpp-sdk/client/extension_common/extension.h>
4+
5+
#include <map>
6+
#include <memory>
7+
#include <string>
8+
#include <vector>
9+
10+
namespace NYdb::inline V3::NMetrics {
11+
12+
using TLabels = std::map<std::string, std::string>;
13+
14+
class ICounter {
15+
public:
16+
virtual ~ICounter() = default;
17+
virtual void Inc() = 0;
18+
};
19+
20+
class IGauge {
21+
public:
22+
virtual ~IGauge() = default;
23+
virtual void Add(double delta) = 0;
24+
virtual void Set(double value) = 0;
25+
};
26+
27+
class IHistogram {
28+
public:
29+
virtual ~IHistogram() = default;
30+
virtual void Record(double value) = 0;
31+
};
32+
33+
class IMetricRegistry {
34+
public:
35+
virtual ~IMetricRegistry() = default;
36+
37+
virtual std::shared_ptr<ICounter> Counter(const std::string& name, const TLabels& labels = {}) = 0;
38+
virtual std::shared_ptr<IGauge> Gauge(const std::string& name, const TLabels& labels = {}) = 0;
39+
virtual std::shared_ptr<IHistogram> Histogram(const std::string& name, const std::vector<double>& buckets, const TLabels& labels = {}) = 0;
40+
};
41+
42+
enum class ESpanKind {
43+
INTERNAL,
44+
SERVER,
45+
CLIENT,
46+
PRODUCER,
47+
CONSUMER
48+
};
49+
50+
class ISpan {
51+
public:
52+
virtual ~ISpan() = default;
53+
virtual void End() = 0;
54+
virtual void SetAttribute(const std::string& key, const std::string& value) = 0;
55+
virtual void SetAttribute(const std::string& key, int64_t value) = 0;
56+
};
57+
58+
class ITracer {
59+
public:
60+
virtual ~ITracer() = default;
61+
virtual std::shared_ptr<ISpan> StartSpan(const std::string& name, ESpanKind kind = ESpanKind::INTERNAL) = 0;
62+
};
63+
64+
class ITraceProvider {
65+
public:
66+
virtual ~ITraceProvider() = default;
67+
virtual std::shared_ptr<ITracer> GetTracer(const std::string& name) = 0;
68+
};
69+
70+
class IMetricsApi : public IExtensionApi {
71+
public:
72+
static IMetricsApi* Create(TDriver driver);
73+
public:
74+
virtual ~IMetricsApi() = default;
75+
virtual void SetMetricRegistry(std::shared_ptr<IMetricRegistry> registry) = 0;
76+
virtual void SetTraceProvider(std::shared_ptr<ITraceProvider> provider) = 0;
77+
virtual std::shared_ptr<IMetricRegistry> GetMetricRegistry() const = 0;
78+
virtual std::shared_ptr<ITraceProvider> GetTraceProvider() const = 0;
79+
};
80+
81+
} // namespace NYdb::NMetrics
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
#pragma once
2+
3+
#include <ydb-cpp-sdk/open_telemetry/otel.h>
4+
#include <ydb-cpp-sdk/client/extension_common/extension.h>
5+
6+
namespace NYdb::inline V3::NMetrics {
7+
8+
class TOtelExtension : public IExtension {
9+
public:
10+
using IApi = IMetricsApi;
11+
12+
struct TParams {
13+
opentelemetry::nostd::shared_ptr<opentelemetry::metrics::MeterProvider> MeterProvider;
14+
opentelemetry::nostd::shared_ptr<opentelemetry::trace::TracerProvider> TracerProvider;
15+
};
16+
17+
TOtelExtension(const TParams& params, IApi* api) {
18+
if (params.MeterProvider) {
19+
api->SetMetricRegistry(std::make_shared<TOtelMetricRegistry>(params.MeterProvider));
20+
}
21+
if (params.TracerProvider) {
22+
api->SetTraceProvider(std::make_shared<TOtelTraceProvider>(params.TracerProvider));
23+
}
24+
}
25+
};
26+
27+
inline void AddOpenTelemetry(TDriver& driver
28+
, opentelemetry::nostd::shared_ptr<opentelemetry::metrics::MeterProvider> meterProvider
29+
, opentelemetry::nostd::shared_ptr<opentelemetry::trace::TracerProvider> tracerProvider
30+
) {
31+
driver.AddExtension<TOtelExtension>({meterProvider, tracerProvider});
32+
}
33+
34+
} // namespace NYdb::NMetrics
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
#pragma once
2+
3+
#include <ydb-cpp-sdk/client/metrics/metrics.h>
4+
5+
#include <opentelemetry/metrics/meter_provider.h>
6+
#include <opentelemetry/trace/tracer_provider.h>
7+
8+
namespace NYdb::inline V3::NMetrics {
9+
10+
class TOtelMetricRegistry : public IMetricRegistry {
11+
public:
12+
TOtelMetricRegistry(opentelemetry::nostd::shared_ptr<opentelemetry::metrics::MeterProvider> meterProvider);
13+
14+
std::shared_ptr<ICounter> Counter(const std::string& name, const TLabels& labels = {}) override;
15+
std::shared_ptr<IGauge> Gauge(const std::string& name, const TLabels& labels = {}) override;
16+
std::shared_ptr<IHistogram> Histogram(const std::string& name, const std::vector<double>& buckets, const TLabels& labels = {}) override;
17+
18+
private:
19+
opentelemetry::nostd::shared_ptr<opentelemetry::metrics::MeterProvider> MeterProvider_;
20+
opentelemetry::nostd::shared_ptr<opentelemetry::metrics::Meter> Meter_;
21+
};
22+
23+
class TOtelTraceProvider : public ITraceProvider {
24+
public:
25+
TOtelTraceProvider(opentelemetry::nostd::shared_ptr<opentelemetry::trace::TracerProvider> tracerProvider);
26+
27+
std::shared_ptr<ITracer> GetTracer(const std::string& name) override;
28+
29+
private:
30+
opentelemetry::nostd::shared_ptr<opentelemetry::trace::TracerProvider> TracerProvider_;
31+
};
32+
33+
} // namespace NYdb::NMetrics

src/CMakeLists.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
add_subdirectory(api)
22
add_subdirectory(client)
3-
add_subdirectory(library)
3+
add_subdirectory(library)
4+
add_subdirectory(open_telemetry)

src/client/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ add_subdirectory(iam)
1212
add_subdirectory(iam_private)
1313
add_subdirectory(impl)
1414
add_subdirectory(import)
15+
add_subdirectory(metrics)
1516
add_subdirectory(monitoring)
1617
add_subdirectory(operation)
1718
add_subdirectory(params)

src/client/impl/internal/grpc_connections/grpc_connections.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -581,6 +581,18 @@ class TGRpcConnectionsImpl
581581
::NMonitoring::TMetricRegistry* GetMetricRegistry() override;
582582
void RegisterExtension(IExtension* extension);
583583
void RegisterExtensionApi(IExtensionApi* api);
584+
585+
template<typename T>
586+
T* GetExtensionApi() {
587+
std::lock_guard lock(ExtensionsLock_);
588+
for (const auto& api : ExtensionApis_) {
589+
if (auto ptr = dynamic_cast<T*>(api.get())) {
590+
return ptr;
591+
}
592+
}
593+
return nullptr;
594+
}
595+
584596
void SetDiscoveryMutator(IDiscoveryMutatorApi::TMutatorCb&& cb);
585597
const TLog& GetLog() const override;
586598

src/client/metrics/CMakeLists.txt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
_ydb_sdk_add_library(client-metrics)
2+
3+
target_sources(client-metrics PRIVATE
4+
metrics.cpp
5+
)
6+
7+
target_include_directories(client-metrics PUBLIC
8+
$<BUILD_INTERFACE:${YDB_SDK_SOURCE_DIR}/include>
9+
$<INSTALL_INTERFACE:include>
10+
)
11+
12+
target_link_libraries(client-metrics PUBLIC
13+
client-extension_common
14+
)

src/client/metrics/metrics.cpp

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
#include <ydb-cpp-sdk/client/metrics/metrics.h>
2+
3+
namespace NYdb::inline V3::NMetrics {
4+
5+
class TMetricsApiImpl : public IMetricsApi {
6+
public:
7+
void SetMetricRegistry(std::shared_ptr<IMetricRegistry> registry) override {
8+
Registry_ = std::move(registry);
9+
}
10+
11+
void SetTraceProvider(std::shared_ptr<ITraceProvider> provider) override {
12+
TraceProvider_ = std::move(provider);
13+
}
14+
15+
std::shared_ptr<IMetricRegistry> GetMetricRegistry() const override {
16+
return Registry_;
17+
}
18+
19+
std::shared_ptr<ITraceProvider> GetTraceProvider() const override {
20+
return TraceProvider_;
21+
}
22+
23+
private:
24+
std::shared_ptr<IMetricRegistry> Registry_;
25+
std::shared_ptr<ITraceProvider> TraceProvider_;
26+
};
27+
28+
IMetricsApi* IMetricsApi::Create(TDriver driver) {
29+
return new TMetricsApiImpl();
30+
}
31+
32+
} // namespace NYdb::NMetrics

src/client/query/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ target_link_libraries(client-ydb_query PUBLIC
77
impl-internal-make_request
88
impl-session
99
impl-internal-retry
10+
client-metrics
1011
client-ydb_common_client
1112
client-ydb_driver
1213
client-ydb_query-impl

0 commit comments

Comments
 (0)