@@ -34,41 +34,129 @@ cmake -DYDB_SDK_MONITORING_PROMETHEUS=ON \
3434``` cpp
3535#include < ydb-cpp-sdk/client/monitoring/metrics.h>
3636#include < ydb-cpp-sdk/client/monitoring/impl/prometheus.h>
37+ #include < ydb-cpp-sdk/client/driver/driver.h>
38+ #include < ydb-cpp-sdk/client/table/table.h>
3739
3840// Создаем систему мониторинга
3941auto monitoringSystem = TMonitoringSystemFactory::CreatePrometheus(" localhost:9090" );
4042TMetricsContext::Instance ().SetMonitoringSystem(std::move(monitoringSystem));
4143
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);
44+ // Создаем драйвер YDB
45+ TDriverConfig config;
46+ config.SetEndpoint("localhost:2135");
47+ config.SetDatabase("/local");
48+ TDriver driver(config);
49+
50+ // Создаем клиент таблиц
51+ TTableClient client(driver);
52+
53+ try {
54+ // Выполняем запрос
55+ auto result = client.ExecuteDataQuery(R"(
56+ SELECT 1 + 1 AS result;
57+ )", TTxControl::BeginTx(TTxSettings::SerializableRW()).CommitTx());
58+
59+ // Создаем метрики на основе результата запроса
60+ std::unordered_map<std::string, std::string> labels = {
61+ {"operation", "query"},
62+ {"status", "success"},
63+ {"database", "/local"}
64+ };
65+
66+ // Метрика количества запросов
67+ TPrometheusMetric queryCount("ydb_query_count", "1", labels);
68+ TMetricsContext::Instance().RecordMetric(queryCount);
69+
70+ // Метрика задержки запроса
71+ auto latency = result.GetExecutionTime().MilliSeconds();
72+ TPrometheusMetric queryLatency("ydb_query_latency", std::to_string(latency), labels);
73+ TMetricsContext::Instance().RecordMetric(queryLatency);
74+
75+ // Метрика количества строк в результате
76+ auto rowCount = result.GetResultSet(0).RowsCount();
77+ TPrometheusMetric resultRows("ydb_result_rows", std::to_string(rowCount), labels);
78+ TMetricsContext::Instance().RecordMetric(resultRows);
79+
80+ // Принудительно отправляем метрики
81+ TMetricsContext::Instance().Flush();
82+
83+ } catch (const TYdbErrorException& e) {
84+ // В случае ошибки отправляем метрику ошибки
85+ std::unordered_map<std::string, std::string> errorLabels = {
86+ {"operation", "query"},
87+ {"status", "error"},
88+ {"database", "/local"},
89+ {"error_type", e.GetStatus().ToString()}
90+ };
91+ TPrometheusMetric errorCount("ydb_error_count", "1", errorLabels);
92+ TMetricsContext::Instance().RecordMetric(errorCount);
93+ TMetricsContext::Instance().Flush();
94+ }
5195```
5296
5397### OpenTelemetry
5498
5599```cpp
56100#include <ydb-cpp-sdk/client/monitoring/metrics.h>
57101#include <ydb-cpp-sdk/client/monitoring/impl/opentelemetry.h>
102+ #include <ydb-cpp-sdk/client/driver/driver.h>
103+ #include <ydb-cpp-sdk/client/table/table.h>
58104
59105// Создаем систему мониторинга
60106auto monitoringSystem = TMonitoringSystemFactory::CreateOpenTelemetry("localhost:4317");
61107TMetricsContext::Instance().SetMonitoringSystem(std::move(monitoringSystem));
62108
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);
109+ // Создаем драйвер YDB
110+ TDriverConfig config;
111+ config.SetEndpoint("localhost:2135");
112+ config.SetDatabase("/local");
113+ TDriver driver(config);
114+
115+ // Создаем клиент таблиц
116+ TTableClient client(driver);
117+
118+ try {
119+ // Выполняем запрос
120+ auto result = client.ExecuteDataQuery(R"(
121+ SELECT 1 + 1 AS result;
122+ )", TTxControl::BeginTx(TTxSettings::SerializableRW()).CommitTx());
123+
124+ // Создаем метрики на основе результата запроса
125+ std::unordered_map<std::string, std::string> labels = {
126+ {"operation", "query"},
127+ {"status", "success"},
128+ {"database", "/local"}
129+ };
130+
131+ // Метрика количества запросов
132+ TOpenTelemetryMetric queryCount("ydb_query_count", "1", labels);
133+ TMetricsContext::Instance().RecordMetric(queryCount);
134+
135+ // Метрика задержки запроса
136+ auto latency = result.GetExecutionTime().MilliSeconds();
137+ TOpenTelemetryMetric queryLatency("ydb_query_latency", std::to_string(latency), labels);
138+ TMetricsContext::Instance().RecordMetric(queryLatency);
139+
140+ // Метрика количества строк в результате
141+ auto rowCount = result.GetResultSet(0).RowsCount();
142+ TOpenTelemetryMetric resultRows("ydb_result_rows", std::to_string(rowCount), labels);
143+ TMetricsContext::Instance().RecordMetric(resultRows);
144+
145+ // Принудительно отправляем метрики
146+ TMetricsContext::Instance().Flush();
147+
148+ } catch (const TYdbErrorException& e) {
149+ // В случае ошибки отправляем метрику ошибки
150+ std::unordered_map<std::string, std::string> errorLabels = {
151+ {"operation", "query"},
152+ {"status", "error"},
153+ {"database", "/local"},
154+ {"error_type", e.GetStatus().ToString()}
155+ };
156+ TOpenTelemetryMetric errorCount("ydb_error_count", "1", errorLabels);
157+ TMetricsContext::Instance().RecordMetric(errorCount);
158+ TMetricsContext::Instance().Flush();
159+ }
72160```
73161
74162### Datadog
@@ -160,19 +248,26 @@ TMetricsContext::Instance().RecordMetric(metric);
160248YDB C++ SDK собирает следующие метрики:
161249
162250- ` ydb_query_count ` - количество запросов
163- - ` ydb_query_latency ` - задержка запросов
251+ - ` ydb_query_latency ` - задержка запросов (в миллисекундах)
164252- ` ydb_error_count ` - количество ошибок
253+ - ` ydb_result_rows ` - количество строк в результате запроса
165254- ` ydb_connection_count ` - количество активных соединений
166255- ` ydb_session_count ` - количество активных сессий
167256
257+ Каждая метрика может иметь следующие метки (labels):
258+ - ` operation ` - тип операции (query, transaction и т.д.)
259+ - ` status ` - статус операции (success, error)
260+ - ` database ` - имя базы данных
261+ - ` error_type ` - тип ошибки (только для метрик ошибок)
262+
168263## Примеры
169264
170265Полные примеры использования различных систем мониторинга можно найти в директории ` examples/monitoring/ ` :
171266
172- - ` prometheus_example.cpp ` - пример использования Prometheus
173- - ` opentelemetry_example.cpp ` - пример использования OpenTelemetry
174- - ` datadog_example.cpp ` - пример использования Datadog
175- - ` newrelic_example.cpp ` - пример использования New Relic
176- - ` appdynamics_example.cpp ` - пример использования AppDynamics
177- - ` victoriametrics_example.cpp ` - пример использования Victoria Metrics
178- - ` solomon_example.cpp ` - пример использования Yandex Solomon
267+ - ` prometheus_example.cpp ` - пример использования Prometheus с реальными запросами к YDB
268+ - ` opentelemetry_example.cpp ` - пример использования OpenTelemetry с реальными запросами к YDB
269+ - ` datadog_example.cpp ` - пример использования Datadog с реальными запросами к YDB
270+ - ` newrelic_example.cpp ` - пример использования New Relic с реальными запросами к YDB
271+ - ` appdynamics_example.cpp ` - пример использования AppDynamics с реальными запросами к YDB
272+ - ` victoriametrics_example.cpp ` - пример использования Victoria Metrics с реальными запросами к YDB
273+ - ` solomon_example.cpp ` - пример использования Yandex Solomon с реальными запросами к YDB
0 commit comments