@@ -34,41 +34,129 @@ cmake -DYDB_SDK_MONITORING_PROMETHEUS=ON \
34
34
``` cpp
35
35
#include < ydb-cpp-sdk/client/monitoring/metrics.h>
36
36
#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>
37
39
38
40
// Создаем систему мониторинга
39
41
auto monitoringSystem = TMonitoringSystemFactory::CreatePrometheus(" localhost:9090" );
40
42
TMetricsContext::Instance ().SetMonitoringSystem(std::move(monitoringSystem));
41
43
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
+ }
51
95
```
52
96
53
97
### OpenTelemetry
54
98
55
99
```cpp
56
100
#include <ydb-cpp-sdk/client/monitoring/metrics.h>
57
101
#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>
58
104
59
105
// Создаем систему мониторинга
60
106
auto monitoringSystem = TMonitoringSystemFactory::CreateOpenTelemetry("localhost:4317");
61
107
TMetricsContext::Instance().SetMonitoringSystem(std::move(monitoringSystem));
62
108
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
+ }
72
160
```
73
161
74
162
### Datadog
@@ -160,19 +248,26 @@ TMetricsContext::Instance().RecordMetric(metric);
160
248
YDB C++ SDK собирает следующие метрики:
161
249
162
250
- ` ydb_query_count ` - количество запросов
163
- - ` ydb_query_latency ` - задержка запросов
251
+ - ` ydb_query_latency ` - задержка запросов (в миллисекундах)
164
252
- ` ydb_error_count ` - количество ошибок
253
+ - ` ydb_result_rows ` - количество строк в результате запроса
165
254
- ` ydb_connection_count ` - количество активных соединений
166
255
- ` ydb_session_count ` - количество активных сессий
167
256
257
+ Каждая метрика может иметь следующие метки (labels):
258
+ - ` operation ` - тип операции (query, transaction и т.д.)
259
+ - ` status ` - статус операции (success, error)
260
+ - ` database ` - имя базы данных
261
+ - ` error_type ` - тип ошибки (только для метрик ошибок)
262
+
168
263
## Примеры
169
264
170
265
Полные примеры использования различных систем мониторинга можно найти в директории ` examples/monitoring/ ` :
171
266
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