11#include " client_metrics.h"
22
33#include < exception>
4+ #include < util/string/cast.h>
45
56namespace NYdb ::inline V3::NObservability {
67
@@ -18,73 +19,40 @@ void SafeLogMetricsError(const char* /*message*/) noexcept {
1819 }
1920}
2021
21- std::string StatusToString (EStatus status) {
22- switch (status) {
23- case EStatus::SUCCESS: return " SUCCESS" ;
24- case EStatus::BAD_REQUEST: return " BAD_REQUEST" ;
25- case EStatus::UNAUTHORIZED: return " UNAUTHORIZED" ;
26- case EStatus::INTERNAL_ERROR: return " INTERNAL_ERROR" ;
27- case EStatus::ABORTED: return " ABORTED" ;
28- case EStatus::UNAVAILABLE: return " UNAVAILABLE" ;
29- case EStatus::OVERLOADED: return " OVERLOADED" ;
30- case EStatus::SCHEME_ERROR: return " SCHEME_ERROR" ;
31- case EStatus::GENERIC_ERROR: return " GENERIC_ERROR" ;
32- case EStatus::TIMEOUT: return " TIMEOUT" ;
33- case EStatus::BAD_SESSION: return " BAD_SESSION" ;
34- case EStatus::PRECONDITION_FAILED: return " PRECONDITION_FAILED" ;
35- case EStatus::ALREADY_EXISTS: return " ALREADY_EXISTS" ;
36- case EStatus::NOT_FOUND: return " NOT_FOUND" ;
37- case EStatus::SESSION_EXPIRED: return " SESSION_EXPIRED" ;
38- case EStatus::CANCELLED: return " CANCELLED" ;
39- case EStatus::UNDETERMINED: return " UNDETERMINED" ;
40- case EStatus::UNSUPPORTED: return " UNSUPPORTED" ;
41- case EStatus::SESSION_BUSY: return " SESSION_BUSY" ;
42- case EStatus::EXTERNAL_ERROR: return " EXTERNAL_ERROR" ;
43- case EStatus::TRANSPORT_UNAVAILABLE: return " TRANSPORT_UNAVAILABLE" ;
44- case EStatus::CLIENT_RESOURCE_EXHAUSTED:return " CLIENT_RESOURCE_EXHAUSTED" ;
45- case EStatus::CLIENT_DEADLINE_EXCEEDED: return " CLIENT_DEADLINE_EXCEEDED" ;
46- case EStatus::CLIENT_INTERNAL_ERROR: return " CLIENT_INTERNAL_ERROR" ;
47- case EStatus::CLIENT_CANCELLED: return " CLIENT_CANCELLED" ;
48- case EStatus::CLIENT_UNAUTHENTICATED: return " CLIENT_UNAUTHENTICATED" ;
49- case EStatus::CLIENT_CALL_UNIMPLEMENTED:return " CLIENT_CALL_UNIMPLEMENTED" ;
50- case EStatus::CLIENT_OUT_OF_RANGE: return " CLIENT_OUT_OF_RANGE" ;
51- case EStatus::CLIENT_DISCOVERY_FAILED: return " CLIENT_DISCOVERY_FAILED" ;
52- case EStatus::CLIENT_LIMITS_REACHED: return " CLIENT_LIMITS_REACHED" ;
53- default : return " STATUS_UNDEFINED" ;
54- }
55- }
56-
5722} // namespace
5823
5924static const std::vector<double > DurationBucketsSec = {
6025 0.001 , 0.005 , 0.01 , 0.05 , 0.1 , 0.5 , 1 , 5 , 10
6126};
6227
63- TClientMetrics::TClientMetrics (std::shared_ptr<NMetrics::IMetricRegistry> registry,
64- const std::string& prefix, const std::string& operationName)
28+ static constexpr const char * RequestsDescription = " Number of database client operations started." ;
29+ static constexpr const char * ErrorsDescription = " Number of database client operations that failed." ;
30+ static constexpr const char * DurationDescription = " Duration of database client operations." ;
31+
32+ TClientMetrics::TClientMetrics (std::shared_ptr<NMetrics::IMetricRegistry> registry
33+ , const std::string& operationName
34+ ) : Registry_(std::move(registry))
35+ , OperationName_(operationName)
6536{
66- if (!registry ) {
37+ if (!Registry_ ) {
6738 return ;
6839 }
6940
7041 try {
71- NMetrics::TLabels labels = {{" operation" , operationName}};
72- RequestCounter_ = registry->Counter (prefix + " .requests" , labels);
73- ErrorCounter_ = registry->Counter (prefix + " .errors" , labels);
74-
75- NMetrics::TLabels durationLabels = {
76- {" db.system.name" , " ydb" },
42+ NMetrics::TLabels labels = {
43+ {" db.system.name" , " other_sql" },
7744 {" db.operation.name" , operationName},
7845 };
79- DurationHistogram_ = registry->Histogram (" db.client.operation.duration" , DurationBucketsSec, durationLabels);
46+ RequestCounter_ = Registry_->Counter (" db.client.operation.requests" , labels, RequestsDescription, " {operation}" );
47+ ErrorCounter_ = Registry_->Counter (" db.client.operation.errors" , labels, ErrorsDescription, " {error}" );
8048
8149 RequestCounter_->Inc ();
8250 StartTime_ = std::chrono::steady_clock::now ();
8351 } catch (...) {
8452 SafeLogMetricsError (" failed to initialize metrics" );
8553 RequestCounter_.reset ();
8654 ErrorCounter_.reset ();
87- DurationHistogram_ .reset ();
55+ Registry_ .reset ();
8856 }
8957}
9058
@@ -99,10 +67,27 @@ void TClientMetrics::End(EStatus status) noexcept {
9967 Ended_ = true ;
10068
10169 try {
102- if (DurationHistogram_) {
70+ const std::string statusCode = ToString (status);
71+ if (Registry_) {
10372 auto elapsed = std::chrono::steady_clock::now () - StartTime_;
10473 double durationSec = std::chrono::duration<double >(elapsed).count ();
105- DurationHistogram_->Record (durationSec);
74+ NMetrics::TLabels durationLabels = {
75+ {" db.system.name" , " other_sql" },
76+ {" db.operation.name" , OperationName_},
77+ {" db.response.status_code" , statusCode},
78+ };
79+ if (status != EStatus::SUCCESS) {
80+ durationLabels[" error.type" ] = statusCode;
81+ }
82+ auto durationHistogram = Registry_->Histogram (
83+ " db.client.operation.duration" ,
84+ DurationBucketsSec,
85+ durationLabels,
86+ DurationDescription,
87+ " s" );
88+ if (durationHistogram) {
89+ durationHistogram->Record (durationSec);
90+ }
10691 }
10792
10893 if (status != EStatus::SUCCESS && ErrorCounter_) {
0 commit comments