Skip to content

Commit dbeb92b

Browse files
committed
added abstract IMetric class and implementations for Solomon, Prometheus, OpenTelemetry
1 parent e9b5b8f commit dbeb92b

File tree

9 files changed

+475
-0
lines changed

9 files changed

+475
-0
lines changed

CMakeLists.txt

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,15 @@ option(YDB_SDK_EXAMPLES "Build YDB C++ SDK examples" On)
77
set(YDB_SDK_GOOGLE_COMMON_PROTOS_TARGET "" CACHE STRING "Name of cmake target preparing google common proto library")
88
option(YDB_SDK_USE_RAPID_JSON "Search for rapid json library in system" ON)
99

10+
# Опции для систем мониторинга
11+
option(YDB_SDK_MONITORING_PROMETHEUS "Enable Prometheus monitoring" OFF)
12+
option(YDB_SDK_MONITORING_OPENTELEMETRY "Enable OpenTelemetry monitoring" OFF)
13+
option(YDB_SDK_MONITORING_DATADOG "Enable Datadog monitoring" OFF)
14+
option(YDB_SDK_MONITORING_NEWRELIC "Enable New Relic monitoring" OFF)
15+
option(YDB_SDK_MONITORING_APPDYNAMICS "Enable AppDynamics monitoring" OFF)
16+
option(YDB_SDK_MONITORING_VICTORIAMETRICS "Enable Victoria Metrics monitoring" OFF)
17+
option(YDB_SDK_MONITORING_SOLOMON "Enable Yandex Solomon monitoring" ON)
18+
1019
set(BUILD_SHARED_LIBS Off)
1120
set(CMAKE_CXX_STANDARD 20)
1221
set(CMAKE_CXX_STANDARD_REQUIRED On)
@@ -97,3 +106,38 @@ if (YDB_SDK_INSTALL)
97106
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/ydb-cpp-sdk/Modules
98107
)
99108
endif()
109+
110+
# Поиск зависимостей для систем мониторинга
111+
if(YDB_SDK_MONITORING_PROMETHEUS)
112+
find_package(Prometheus REQUIRED)
113+
endif()
114+
115+
if(YDB_SDK_MONITORING_OPENTELEMETRY)
116+
find_package(OpenTelemetry REQUIRED)
117+
endif()
118+
119+
if(YDB_SDK_MONITORING_DATADOG)
120+
find_package(Datadog REQUIRED)
121+
endif()
122+
123+
if(YDB_SDK_MONITORING_NEWRELIC)
124+
find_package(NewRelic REQUIRED)
125+
endif()
126+
127+
if(YDB_SDK_MONITORING_APPDYNAMICS)
128+
find_package(AppDynamics REQUIRED)
129+
endif()
130+
131+
if(YDB_SDK_MONITORING_VICTORIAMETRICS)
132+
find_package(VictoriaMetrics REQUIRED)
133+
endif()
134+
135+
# Добавляем зависимости в target_link_libraries
136+
target_link_libraries(ydb-cpp-sdk
137+
$<$<BOOL:${YDB_SDK_MONITORING_PROMETHEUS}>:prometheus::prometheus-cpp>
138+
$<$<BOOL:${YDB_SDK_MONITORING_OPENTELEMETRY}>:OpenTelemetry::OpenTelemetry>
139+
$<$<BOOL:${YDB_SDK_MONITORING_DATADOG}>:Datadog::Datadog>
140+
$<$<BOOL:${YDB_SDK_MONITORING_NEWRELIC}>:NewRelic::NewRelic>
141+
$<$<BOOL:${YDB_SDK_MONITORING_APPDYNAMICS}>:AppDynamics::AppDynamics>
142+
$<$<BOOL:${YDB_SDK_MONITORING_VICTORIAMETRICS}>:VictoriaMetrics::VictoriaMetrics>
143+
)

docs/monitoring.md

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
# Мониторинг в YDB C++ SDK
2+
3+
YDB C++ SDK поддерживает различные системы мониторинга для сбора метрик. Вы можете выбрать одну или несколько систем мониторинга при сборке проекта.
4+
5+
## Поддерживаемые системы мониторинга
6+
7+
- Prometheus
8+
- OpenTelemetry
9+
- Datadog
10+
- New Relic
11+
- AppDynamics
12+
- Victoria Metrics
13+
- Yandex Solomon (по умолчанию)
14+
15+
## Настройка сборки
16+
17+
При сборке проекта вы можете включить поддержку нужных систем мониторинга с помощью CMake опций:
18+
19+
```cmake
20+
cmake -DYDB_SDK_MONITORING_PROMETHEUS=ON \
21+
-DYDB_SDK_MONITORING_OPENTELEMETRY=ON \
22+
-DYDB_SDK_MONITORING_DATADOG=ON \
23+
-DYDB_SDK_MONITORING_NEWRELIC=ON \
24+
-DYDB_SDK_MONITORING_APPDYNAMICS=ON \
25+
-DYDB_SDK_MONITORING_VICTORIAMETRICS=ON \
26+
-DYDB_SDK_MONITORING_SOLOMON=ON \
27+
..
28+
```
29+
30+
## Использование
31+
32+
### Prometheus
33+
34+
```cpp
35+
#include <ydb-cpp-sdk/client/monitoring/metrics.h>
36+
#include <ydb-cpp-sdk/client/monitoring/impl/prometheus.h>
37+
38+
// Создаем систему мониторинга
39+
auto monitoringSystem = TMonitoringSystemFactory::CreatePrometheus("localhost:9090");
40+
TMetricsContext::Instance().SetMonitoringSystem(std::move(monitoringSystem));
41+
42+
// Создаем метрику
43+
std::unordered_map<std::string, std::string> labels = {
44+
{"operation", "query"},
45+
{"status", "success"}
46+
};
47+
TPrometheusMetric metric("ydb_query_count", "1", labels);
48+
49+
// Записываем метрику
50+
TMetricsContext::Instance().RecordMetric(metric);
51+
```
52+
53+
### OpenTelemetry
54+
55+
```cpp
56+
#include <ydb-cpp-sdk/client/monitoring/metrics.h>
57+
#include <ydb-cpp-sdk/client/monitoring/impl/opentelemetry.h>
58+
59+
// Создаем систему мониторинга
60+
auto monitoringSystem = TMonitoringSystemFactory::CreateOpenTelemetry("localhost:4317");
61+
TMetricsContext::Instance().SetMonitoringSystem(std::move(monitoringSystem));
62+
63+
// Создаем метрику
64+
std::unordered_map<std::string, std::string> labels = {
65+
{"operation", "query"},
66+
{"status", "success"}
67+
};
68+
TOpenTelemetryMetric metric("ydb_query_count", "1", labels);
69+
70+
// Записываем метрику
71+
TMetricsContext::Instance().RecordMetric(metric);
72+
```
73+
74+
## Доступные метрики
75+
76+
YDB C++ SDK собирает следующие метрики:
77+
78+
- `ydb_query_count` - количество запросов
79+
- `ydb_query_latency` - задержка запросов
80+
- `ydb_error_count` - количество ошибок
81+
- `ydb_connection_count` - количество активных соединений
82+
- `ydb_session_count` - количество активных сессий
83+
84+
## Примеры
85+
86+
Полные примеры использования различных систем мониторинга можно найти в директории `examples/monitoring/`:
87+
88+
- `prometheus_example.cpp` - пример использования Prometheus
89+
- `opentelemetry_example.cpp` - пример использования OpenTelemetry
90+
- `datadog_example.cpp` - пример использования Datadog
91+
- `newrelic_example.cpp` - пример использования New Relic
92+
- `appdynamics_example.cpp` - пример использования AppDynamics
93+
- `victoriametrics_example.cpp` - пример использования Victoria Metrics
94+
- `solomon_example.cpp` - пример использования Yandex Solomon
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
#include <ydb-cpp-sdk/client/monitoring/metrics.h>
2+
#include <ydb-cpp-sdk/client/monitoring/impl/opentelemetry.h>
3+
#include <ydb-cpp-sdk/client/driver/driver.h>
4+
#include <iostream>
5+
6+
using namespace NYdb;
7+
using namespace NYdb::NMonitoring;
8+
9+
int main() {
10+
// Создаем систему мониторинга OpenTelemetry
11+
auto monitoringSystem = TMonitoringSystemFactory::CreateOpenTelemetry("localhost:4317");
12+
TMetricsContext::Instance().SetMonitoringSystem(std::move(monitoringSystem));
13+
14+
// Создаем метрику
15+
std::unordered_map<std::string, std::string> labels = {
16+
{"operation", "query"},
17+
{"status", "success"}
18+
};
19+
TOpenTelemetryMetric metric("ydb_query_count", "1", labels);
20+
21+
// Записываем метрику
22+
TMetricsContext::Instance().RecordMetric(metric);
23+
24+
// Принудительно отправляем метрики
25+
TMetricsContext::Instance().Flush();
26+
27+
return 0;
28+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
#include <ydb-cpp-sdk/client/monitoring/metrics.h>
2+
#include <ydb-cpp-sdk/client/monitoring/impl/prometheus.h>
3+
#include <ydb-cpp-sdk/client/driver/driver.h>
4+
#include <iostream>
5+
6+
using namespace NYdb;
7+
using namespace NYdb::NMonitoring;
8+
9+
int main() {
10+
// Создаем систему мониторинга Prometheus
11+
auto monitoringSystem = TMonitoringSystemFactory::CreatePrometheus("localhost:9090");
12+
TMetricsContext::Instance().SetMonitoringSystem(std::move(monitoringSystem));
13+
14+
// Создаем метрику
15+
std::unordered_map<std::string, std::string> labels = {
16+
{"operation", "query"},
17+
{"status", "success"}
18+
};
19+
TPrometheusMetric metric("ydb_query_count", "1", labels);
20+
21+
// Записываем метрику
22+
TMetricsContext::Instance().RecordMetric(metric);
23+
24+
// Принудительно отправляем метрики
25+
TMetricsContext::Instance().Flush();
26+
27+
return 0;
28+
}

examples/monitoring_example.cpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
#include <ydb-cpp-sdk/client/monitoring/metrics.h>
2+
#include <ydb-cpp-sdk/client/driver/driver.h>
3+
#include <iostream>
4+
5+
using namespace NYdb;
6+
using namespace NYdb::NMonitoring;
7+
8+
int main() {
9+
// Создаем систему мониторинга Prometheus
10+
auto monitoringSystem = TMonitoringSystemFactory::CreatePrometheus("localhost:9090");
11+
TMetricsContext::Instance().SetMonitoringSystem(std::move(monitoringSystem));
12+
13+
// Создаем метрику
14+
std::unordered_map<std::string, std::string> labels = {
15+
{"operation", "query"},
16+
{"status", "success"}
17+
};
18+
TPrometheusMetric metric("ydb_query_count", "1", labels);
19+
20+
// Записываем метрику
21+
TMetricsContext::Instance().RecordMetric(metric);
22+
23+
// Принудительно отправляем метрики
24+
TMetricsContext::Instance().Flush();
25+
26+
return 0;
27+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
#pragma once
2+
3+
#include <ydb-cpp-sdk/client/monitoring/metrics.h>
4+
#include <opentelemetry/sdk/metrics/meter_provider.h>
5+
#include <opentelemetry/sdk/metrics/metric_reader.h>
6+
#include <opentelemetry/sdk/metrics/push_metric_exporter.h>
7+
8+
namespace NYdb::NMonitoring {
9+
10+
class TOpenTelemetryMetric : public IMetric {
11+
public:
12+
TOpenTelemetryMetric(const std::string& name, const std::string& value,
13+
const std::unordered_map<std::string, std::string>& labels)
14+
: Name_(name)
15+
, Value_(value)
16+
, Labels_(labels)
17+
{}
18+
19+
std::string GetName() const override { return Name_; }
20+
std::string GetValue() const override { return Value_; }
21+
std::unordered_map<std::string, std::string> GetLabels() const override { return Labels_; }
22+
23+
private:
24+
std::string Name_;
25+
std::string Value_;
26+
std::unordered_map<std::string, std::string> Labels_;
27+
};
28+
29+
class TOpenTelemetryMonitoringSystem : public IMonitoringSystem {
30+
public:
31+
explicit TOpenTelemetryMonitoringSystem(const std::string& endpoint)
32+
: Endpoint_(endpoint)
33+
{
34+
Initialize();
35+
}
36+
37+
void RecordMetric(const IMetric& metric) override;
38+
void Flush() override;
39+
40+
private:
41+
void Initialize();
42+
std::string Endpoint_;
43+
std::shared_ptr<opentelemetry::sdk::metrics::MeterProvider> MeterProvider_;
44+
std::shared_ptr<opentelemetry::sdk::metrics::MetricReader> MetricReader_;
45+
};
46+
47+
} // namespace NYdb::NMonitoring
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
#pragma once
2+
3+
#include <ydb-cpp-sdk/client/monitoring/metrics.h>
4+
#include <prometheus/counter.h>
5+
#include <prometheus/gauge.h>
6+
#include <prometheus/exposer.h>
7+
#include <prometheus/registry.h>
8+
9+
namespace NYdb::NMonitoring {
10+
11+
class TPrometheusMetric : public IMetric {
12+
public:
13+
TPrometheusMetric(const std::string& name, const std::string& value,
14+
const std::unordered_map<std::string, std::string>& labels)
15+
: Name_(name)
16+
, Value_(value)
17+
, Labels_(labels)
18+
{}
19+
20+
std::string GetName() const override { return Name_; }
21+
std::string GetValue() const override { return Value_; }
22+
std::unordered_map<std::string, std::string> GetLabels() const override { return Labels_; }
23+
24+
private:
25+
std::string Name_;
26+
std::string Value_;
27+
std::unordered_map<std::string, std::string> Labels_;
28+
};
29+
30+
class TPrometheusMonitoringSystem : public IMonitoringSystem {
31+
public:
32+
explicit TPrometheusMonitoringSystem(const std::string& endpoint)
33+
: Exposer_(endpoint)
34+
, Registry_(std::make_shared<prometheus::Registry>())
35+
{
36+
Exposer_.RegisterCollectable(Registry_);
37+
}
38+
39+
void RecordMetric(const IMetric& metric) override;
40+
void Flush() override;
41+
42+
private:
43+
prometheus::Exposer Exposer_;
44+
std::shared_ptr<prometheus::Registry> Registry_;
45+
};
46+
47+
} // namespace NYdb::NMonitoring

0 commit comments

Comments
 (0)