Skip to content

Commit d65c41a

Browse files
committed
fix
1 parent 7fe8491 commit d65c41a

File tree

5 files changed

+221
-39
lines changed

5 files changed

+221
-39
lines changed

CMakeLists.txt

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -132,18 +132,47 @@ if(YDB_SDK_MONITORING_VICTORIAMETRICS)
132132
find_package(VictoriaMetrics REQUIRED)
133133
endif()
134134

135+
# Поиск дополнительных зависимостей
136+
find_package(Brotli REQUIRED)
137+
find_package(LZ4 REQUIRED)
138+
find_package(xxHash REQUIRED)
139+
find_package(ZSTD REQUIRED)
140+
135141
# Определяем основную библиотеку
136142
add_library(ydb-cpp-sdk STATIC
137-
$<TARGET_OBJECTS:ydb-cpp-sdk-client>
138-
$<TARGET_OBJECTS:ydb-cpp-sdk-library>
143+
src/client/common_client/settings.cpp
144+
src/client/driver/driver.cpp
139145
)
140146

141147
# Добавляем зависимости в target_link_libraries
142148
target_link_libraries(ydb-cpp-sdk
143-
$<$<BOOL:${YDB_SDK_MONITORING_PROMETHEUS}>:prometheus::prometheus-cpp>
149+
PRIVATE
150+
client-ydb_common_client
151+
client-ydb_types-credentials
152+
impl-ydb_internal-common
153+
yutil
154+
protobuf::libprotobuf
155+
grpc++
156+
grpc++_reflection
157+
OpenSSL::SSL
158+
OpenSSL::Crypto
159+
ZLIB::ZLIB
160+
brotli
161+
lz4
162+
xxhash
163+
zstd
164+
BZip2::BZip2
165+
IDN::IDN
166+
$<$<BOOL:${YDB_SDK_MONITORING_PROMETHEUS}>:prometheus-cpp::prometheus-cpp>
144167
$<$<BOOL:${YDB_SDK_MONITORING_OPENTELEMETRY}>:OpenTelemetry::OpenTelemetry>
145168
$<$<BOOL:${YDB_SDK_MONITORING_DATADOG}>:Datadog::Datadog>
146169
$<$<BOOL:${YDB_SDK_MONITORING_NEWRELIC}>:NewRelic::NewRelic>
147170
$<$<BOOL:${YDB_SDK_MONITORING_APPDYNAMICS}>:AppDynamics::AppDynamics>
148171
$<$<BOOL:${YDB_SDK_MONITORING_VICTORIAMETRICS}>:VictoriaMetrics::VictoriaMetrics>
149172
)
173+
174+
target_include_directories(ydb-cpp-sdk
175+
PUBLIC
176+
${CMAKE_CURRENT_SOURCE_DIR}/include
177+
${CMAKE_CURRENT_SOURCE_DIR}/src
178+
)

cmake/external_libs.cmake

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,11 @@ find_package(jwt-cpp REQUIRED)
1515
find_package(GTest REQUIRED)
1616
find_package(double-conversion REQUIRED)
1717

18+
# Prometheus
19+
if (YDB_SDK_MONITORING_PROMETHEUS)
20+
find_package(prometheus-cpp REQUIRED)
21+
endif()
22+
1823
# RapidJSON
1924
if (YDB_SDK_USE_RAPID_JSON)
2025
find_package(RapidJSON REQUIRED)

docs/monitoring.md

Lines changed: 121 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -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
// Создаем систему мониторинга
3941
auto monitoringSystem = TMonitoringSystemFactory::CreatePrometheus("localhost:9090");
4042
TMetricsContext::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
// Создаем систему мониторинга
60106
auto monitoringSystem = TMonitoringSystemFactory::CreateOpenTelemetry("localhost:4317");
61107
TMetricsContext::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);
160248
YDB 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
Lines changed: 62 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,80 @@
11
#include <ydb-cpp-sdk/client/monitoring/metrics.h>
22
#include <ydb-cpp-sdk/client/monitoring/impl/prometheus.h>
33
#include <ydb-cpp-sdk/client/driver/driver.h>
4+
#include <ydb-cpp-sdk/client/table/table.h>
5+
#include <ydb-cpp-sdk/client/table/result.h>
46
#include <iostream>
7+
#include <thread>
8+
#include <chrono>
59

610
using namespace NYdb;
711
using namespace NYdb::NMonitoring;
12+
using namespace NYdb::NTable;
813

914
int main() {
1015
// Создаем систему мониторинга Prometheus
1116
auto monitoringSystem = TMonitoringSystemFactory::CreatePrometheus("localhost:9090");
1217
TMetricsContext::Instance().SetMonitoringSystem(std::move(monitoringSystem));
1318

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);
19+
// Создаем драйвер YDB
20+
TDriverConfig config;
21+
config.SetEndpoint("localhost:2135");
22+
config.SetDatabase("/local");
23+
TDriver driver(config);
2024

21-
// Записываем метрику
22-
TMetricsContext::Instance().RecordMetric(metric);
25+
// Создаем клиент таблиц
26+
TTableClient client(driver);
2327

24-
// Принудительно отправляем метрики
25-
TMetricsContext::Instance().Flush();
28+
try {
29+
// Выполняем запрос
30+
auto result = client.ExecuteDataQuery(R"(
31+
SELECT 1 + 1 AS result;
32+
)", TTxControl::BeginTx(TTxSettings::SerializableRW()).CommitTx());
33+
34+
// Создаем метрики на основе результата запроса
35+
std::unordered_map<std::string, std::string> labels = {
36+
{"operation", "query"},
37+
{"status", "success"},
38+
{"database", "/local"}
39+
};
40+
41+
// Метрика количества запросов
42+
TPrometheusMetric queryCount("ydb_query_count", "1", labels);
43+
TMetricsContext::Instance().RecordMetric(queryCount);
44+
45+
// Метрика задержки запроса (в миллисекундах)
46+
auto latency = result.GetExecutionTime().MilliSeconds();
47+
TPrometheusMetric queryLatency("ydb_query_latency", std::to_string(latency), labels);
48+
TMetricsContext::Instance().RecordMetric(queryLatency);
49+
50+
// Метрика количества строк в результате
51+
auto rowCount = result.GetResultSet(0).RowsCount();
52+
TPrometheusMetric resultRows("ydb_result_rows", std::to_string(rowCount), labels);
53+
TMetricsContext::Instance().RecordMetric(resultRows);
54+
55+
// Принудительно отправляем метрики
56+
TMetricsContext::Instance().Flush();
57+
58+
std::cout << "Query executed successfully. Metrics sent to Prometheus." << std::endl;
59+
60+
} catch (const TYdbErrorException& e) {
61+
// В случае ошибки отправляем метрику ошибки
62+
std::unordered_map<std::string, std::string> errorLabels = {
63+
{"operation", "query"},
64+
{"status", "error"},
65+
{"database", "/local"},
66+
{"error_type", e.GetStatus().ToString()}
67+
};
68+
TPrometheusMetric errorCount("ydb_error_count", "1", errorLabels);
69+
TMetricsContext::Instance().RecordMetric(errorCount);
70+
TMetricsContext::Instance().Flush();
71+
72+
std::cerr << "Error executing query: " << e.GetStatus() << std::endl;
73+
return 1;
74+
}
75+
76+
// Ждем некоторое время, чтобы метрики успели отправиться
77+
std::this_thread::sleep_for(std::chrono::seconds(1));
2678

2779
return 0;
2880
}

include/ydb-cpp-sdk/client/monitoring/impl/prometheus.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ class TPrometheusMetric : public IMetric {
2020
std::string GetName() const override { return Name_; }
2121
std::string GetValue() const override { return Value_; }
2222
std::unordered_map<std::string, std::string> GetLabels() const override { return Labels_; }
23+
std::string GetType() const override { return "counter"; }
2324

2425
private:
2526
std::string Name_;

0 commit comments

Comments
 (0)