Skip to content

Commit 8dc897c

Browse files
committed
appdynamics, datadog, newrelic, victoriametrics
1 parent dbeb92b commit 8dc897c

File tree

9 files changed

+382
-0
lines changed

9 files changed

+382
-0
lines changed

docs/monitoring.md

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,90 @@ TOpenTelemetryMetric metric("ydb_query_count", "1", labels);
7171
TMetricsContext::Instance().RecordMetric(metric);
7272
```
7373

74+
### Datadog
75+
76+
```cpp
77+
#include <ydb-cpp-sdk/client/monitoring/metrics.h>
78+
#include <ydb-cpp-sdk/client/monitoring/impl/datadog.h>
79+
80+
// Создаем систему мониторинга
81+
auto monitoringSystem = TMonitoringSystemFactory::CreateDatadog("your-api-key");
82+
TMetricsContext::Instance().SetMonitoringSystem(std::move(monitoringSystem));
83+
84+
// Создаем метрику
85+
std::unordered_map<std::string, std::string> labels = {
86+
{"operation", "query"},
87+
{"status", "success"}
88+
};
89+
TDatadogMetric metric("ydb.query.count", "1", labels);
90+
91+
// Записываем метрику
92+
TMetricsContext::Instance().RecordMetric(metric);
93+
```
94+
95+
### New Relic
96+
97+
```cpp
98+
#include <ydb-cpp-sdk/client/monitoring/metrics.h>
99+
#include <ydb-cpp-sdk/client/monitoring/impl/newrelic.h>
100+
101+
// Создаем систему мониторинга
102+
auto monitoringSystem = TMonitoringSystemFactory::CreateNewRelic("your-license-key");
103+
TMetricsContext::Instance().SetMonitoringSystem(std::move(monitoringSystem));
104+
105+
// Создаем метрику
106+
std::unordered_map<std::string, std::string> labels = {
107+
{"operation", "query"},
108+
{"status", "success"}
109+
};
110+
TNewRelicMetric metric("Custom/ydb/query_count", "1", labels);
111+
112+
// Записываем метрику
113+
TMetricsContext::Instance().RecordMetric(metric);
114+
```
115+
116+
### AppDynamics
117+
118+
```cpp
119+
#include <ydb-cpp-sdk/client/monitoring/metrics.h>
120+
#include <ydb-cpp-sdk/client/monitoring/impl/appdynamics.h>
121+
122+
// Создаем систему мониторинга
123+
auto monitoringSystem = TMonitoringSystemFactory::CreateAppDynamics("http://your-controller:8090");
124+
TMetricsContext::Instance().SetMonitoringSystem(std::move(monitoringSystem));
125+
126+
// Создаем метрику
127+
std::unordered_map<std::string, std::string> labels = {
128+
{"operation", "query"},
129+
{"status", "success"}
130+
};
131+
TAppDynamicsMetric metric("Custom Metrics|YDB|Query Count", "1", labels);
132+
133+
// Записываем метрику
134+
TMetricsContext::Instance().RecordMetric(metric);
135+
```
136+
137+
### Victoria Metrics
138+
139+
```cpp
140+
#include <ydb-cpp-sdk/client/monitoring/metrics.h>
141+
#include <ydb-cpp-sdk/client/monitoring/impl/victoriametrics.h>
142+
143+
// Создаем систему мониторинга
144+
auto monitoringSystem = TMonitoringSystemFactory::CreateVictoriaMetrics("http://localhost:8428");
145+
TMetricsContext::Instance().SetMonitoringSystem(std::move(monitoringSystem));
146+
147+
// Создаем метрику
148+
std::unordered_map<std::string, std::string> labels = {
149+
{"operation", "query"},
150+
{"status", "success"}
151+
};
152+
TVictoriaMetricsMetric metric("ydb_query_count", "1", labels);
153+
154+
// Записываем метрику
155+
TMetricsContext::Instance().RecordMetric(metric);
156+
```
157+
74158
## Доступные метрики
75159

76160
YDB C++ SDK собирает следующие метрики:
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/appdynamics.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+
// Создаем систему мониторинга AppDynamics
11+
auto monitoringSystem = TMonitoringSystemFactory::CreateAppDynamics("http://your-controller:8090");
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+
TAppDynamicsMetric metric("Custom Metrics|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/datadog.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+
// Создаем систему мониторинга Datadog
11+
auto monitoringSystem = TMonitoringSystemFactory::CreateDatadog("your-api-key");
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+
TDatadogMetric 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/newrelic.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+
// Создаем систему мониторинга New Relic
11+
auto monitoringSystem = TMonitoringSystemFactory::CreateNewRelic("your-license-key");
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+
TNewRelicMetric metric("Custom/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/victoriametrics.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+
// Создаем систему мониторинга Victoria Metrics
11+
auto monitoringSystem = TMonitoringSystemFactory::CreateVictoriaMetrics("http://localhost:8428");
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+
TVictoriaMetricsMetric 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: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
#pragma once
2+
3+
#include <ydb-cpp-sdk/client/monitoring/metrics.h>
4+
#include <appdynamics/appdynamics.h>
5+
6+
namespace NYdb::NMonitoring {
7+
8+
class TAppDynamicsMetric : public IMetric {
9+
public:
10+
TAppDynamicsMetric(const std::string& name, const std::string& value,
11+
const std::unordered_map<std::string, std::string>& labels)
12+
: Name_(name)
13+
, Value_(value)
14+
, Labels_(labels)
15+
{}
16+
17+
std::string GetName() const override { return Name_; }
18+
std::string GetValue() const override { return Value_; }
19+
std::unordered_map<std::string, std::string> GetLabels() const override { return Labels_; }
20+
std::string GetType() const override { return "counter"; }
21+
22+
private:
23+
std::string Name_;
24+
std::string Value_;
25+
std::unordered_map<std::string, std::string> Labels_;
26+
};
27+
28+
class TAppDynamicsMonitoringSystem : public IMonitoringSystem {
29+
public:
30+
explicit TAppDynamicsMonitoringSystem(const std::string& controllerUrl)
31+
: ControllerUrl_(controllerUrl)
32+
{
33+
Initialize();
34+
}
35+
36+
void RecordMetric(const IMetric& metric) override;
37+
void Flush() override;
38+
std::string GetSystemName() const override { return "appdynamics"; }
39+
40+
private:
41+
void Initialize();
42+
std::string ControllerUrl_;
43+
AppDynamics* Agent_;
44+
};
45+
46+
} // namespace NYdb::NMonitoring
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
#pragma once
2+
3+
#include <ydb-cpp-sdk/client/monitoring/metrics.h>
4+
#include <datadog/tracing.h>
5+
#include <datadog/metrics.h>
6+
7+
namespace NYdb::NMonitoring {
8+
9+
class TDatadogMetric : public IMetric {
10+
public:
11+
TDatadogMetric(const std::string& name, const std::string& value,
12+
const std::unordered_map<std::string, std::string>& labels)
13+
: Name_(name)
14+
, Value_(value)
15+
, Labels_(labels)
16+
{}
17+
18+
std::string GetName() const override { return Name_; }
19+
std::string GetValue() const override { return Value_; }
20+
std::unordered_map<std::string, std::string> GetLabels() const override { return Labels_; }
21+
std::string GetType() const override { return "counter"; }
22+
23+
private:
24+
std::string Name_;
25+
std::string Value_;
26+
std::unordered_map<std::string, std::string> Labels_;
27+
};
28+
29+
class TDatadogMonitoringSystem : public IMonitoringSystem {
30+
public:
31+
explicit TDatadogMonitoringSystem(const std::string& apiKey)
32+
: ApiKey_(apiKey)
33+
{
34+
Initialize();
35+
}
36+
37+
void RecordMetric(const IMetric& metric) override;
38+
void Flush() override;
39+
std::string GetSystemName() const override { return "datadog"; }
40+
41+
private:
42+
void Initialize();
43+
std::string ApiKey_;
44+
std::shared_ptr<datadog::tracing::Tracer> Tracer_;
45+
std::shared_ptr<datadog::metrics::MetricsClient> MetricsClient_;
46+
};
47+
48+
} // namespace NYdb::NMonitoring
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
#pragma once
2+
3+
#include <ydb-cpp-sdk/client/monitoring/metrics.h>
4+
#include <newrelic/newrelic.h>
5+
6+
namespace NYdb::NMonitoring {
7+
8+
class TNewRelicMetric : public IMetric {
9+
public:
10+
TNewRelicMetric(const std::string& name, const std::string& value,
11+
const std::unordered_map<std::string, std::string>& labels)
12+
: Name_(name)
13+
, Value_(value)
14+
, Labels_(labels)
15+
{}
16+
17+
std::string GetName() const override { return Name_; }
18+
std::string GetValue() const override { return Value_; }
19+
std::unordered_map<std::string, std::string> GetLabels() const override { return Labels_; }
20+
std::string GetType() const override { return "counter"; }
21+
22+
private:
23+
std::string Name_;
24+
std::string Value_;
25+
std::unordered_map<std::string, std::string> Labels_;
26+
};
27+
28+
class TNewRelicMonitoringSystem : public IMonitoringSystem {
29+
public:
30+
explicit TNewRelicMonitoringSystem(const std::string& licenseKey)
31+
: LicenseKey_(licenseKey)
32+
{
33+
Initialize();
34+
}
35+
36+
void RecordMetric(const IMetric& metric) override;
37+
void Flush() override;
38+
std::string GetSystemName() const override { return "newrelic"; }
39+
40+
private:
41+
void Initialize();
42+
std::string LicenseKey_;
43+
NewRelic* App_;
44+
};
45+
46+
} // namespace NYdb::NMonitoring

0 commit comments

Comments
 (0)