Skip to content

Commit f5205f8

Browse files
author
ivan-skryabin
committed
feat grpc: configurable client name in metrics
Introduce `destination-prefix-in-metrics` configuration option for gRPC clients that allows overriding the default `grpc_destination_full` metric label format. The default format is now `client(client_name)/service/method` instead of `client_name/service/method` for better clarity. commit_hash:7f2fe596ed64c1ed138b78e3d4ea20ee988a9d15
1 parent da1db7f commit f5205f8

File tree

12 files changed

+70
-42
lines changed

12 files changed

+70
-42
lines changed

grpc/functional_tests/metrics/tests/static/metrics_values.txt

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,23 @@
11
alerts.grpc_client_qos_invalid_configuration: GAUGE
2-
grpc.client.by-destination.abandoned-error: grpc_destination=samples.api.GreeterService/SayHello, grpc_destination_full=greeter/samples.api.GreeterService/SayHello, grpc_method=SayHello, grpc_service=samples.api.GreeterService RATE
3-
grpc.client.by-destination.active: grpc_destination=samples.api.GreeterService/SayHello, grpc_destination_full=greeter/samples.api.GreeterService/SayHello, grpc_method=SayHello, grpc_service=samples.api.GreeterService GAUGE
4-
grpc.client.by-destination.cancelled-by-deadline-propagation: grpc_destination=samples.api.GreeterService/SayHello, grpc_destination_full=greeter/samples.api.GreeterService/SayHello, grpc_method=SayHello, grpc_service=samples.api.GreeterService RATE
5-
grpc.client.by-destination.cancelled: grpc_destination=samples.api.GreeterService/SayHello, grpc_destination_full=greeter/samples.api.GreeterService/SayHello, grpc_method=SayHello, grpc_service=samples.api.GreeterService RATE
6-
grpc.client.by-destination.deadline-propagated: grpc_destination=samples.api.GreeterService/SayHello, grpc_destination_full=greeter/samples.api.GreeterService/SayHello, grpc_method=SayHello, grpc_service=samples.api.GreeterService RATE
7-
grpc.client.by-destination.eps: grpc_destination=samples.api.GreeterService/SayHello, grpc_destination_full=greeter/samples.api.GreeterService/SayHello, grpc_method=SayHello, grpc_service=samples.api.GreeterService RATE
8-
grpc.client.by-destination.network-error: grpc_destination=samples.api.GreeterService/SayHello, grpc_destination_full=greeter/samples.api.GreeterService/SayHello, grpc_method=SayHello, grpc_service=samples.api.GreeterService RATE
9-
grpc.client.by-destination.rps: grpc_destination=samples.api.GreeterService/SayHello, grpc_destination_full=greeter/samples.api.GreeterService/SayHello, grpc_method=SayHello, grpc_service=samples.api.GreeterService RATE
10-
grpc.client.by-destination.status: grpc_code=OK, grpc_destination=samples.api.GreeterService/SayHello, grpc_destination_full=greeter/samples.api.GreeterService/SayHello, grpc_method=SayHello, grpc_service=samples.api.GreeterService RATE
11-
grpc.client.by-destination.status: grpc_code=UNKNOWN, grpc_destination=samples.api.GreeterService/SayHello, grpc_destination_full=greeter/samples.api.GreeterService/SayHello, grpc_method=SayHello, grpc_service=samples.api.GreeterService RATE
12-
grpc.client.by-destination.timings: grpc_destination=samples.api.GreeterService/SayHello, grpc_destination_full=greeter/samples.api.GreeterService/SayHello, grpc_method=SayHello, grpc_service=samples.api.GreeterService, percentile=p0 GAUGE
13-
grpc.client.by-destination.timings: grpc_destination=samples.api.GreeterService/SayHello, grpc_destination_full=greeter/samples.api.GreeterService/SayHello, grpc_method=SayHello, grpc_service=samples.api.GreeterService, percentile=p100 GAUGE
14-
grpc.client.by-destination.timings: grpc_destination=samples.api.GreeterService/SayHello, grpc_destination_full=greeter/samples.api.GreeterService/SayHello, grpc_method=SayHello, grpc_service=samples.api.GreeterService, percentile=p50 GAUGE
15-
grpc.client.by-destination.timings: grpc_destination=samples.api.GreeterService/SayHello, grpc_destination_full=greeter/samples.api.GreeterService/SayHello, grpc_method=SayHello, grpc_service=samples.api.GreeterService, percentile=p90 GAUGE
16-
grpc.client.by-destination.timings: grpc_destination=samples.api.GreeterService/SayHello, grpc_destination_full=greeter/samples.api.GreeterService/SayHello, grpc_method=SayHello, grpc_service=samples.api.GreeterService, percentile=p95 GAUGE
17-
grpc.client.by-destination.timings: grpc_destination=samples.api.GreeterService/SayHello, grpc_destination_full=greeter/samples.api.GreeterService/SayHello, grpc_method=SayHello, grpc_service=samples.api.GreeterService, percentile=p98 GAUGE
18-
grpc.client.by-destination.timings: grpc_destination=samples.api.GreeterService/SayHello, grpc_destination_full=greeter/samples.api.GreeterService/SayHello, grpc_method=SayHello, grpc_service=samples.api.GreeterService, percentile=p99 GAUGE
19-
grpc.client.by-destination.timings: grpc_destination=samples.api.GreeterService/SayHello, grpc_destination_full=greeter/samples.api.GreeterService/SayHello, grpc_method=SayHello, grpc_service=samples.api.GreeterService, percentile=p99_6 GAUGE
20-
grpc.client.by-destination.timings: grpc_destination=samples.api.GreeterService/SayHello, grpc_destination_full=greeter/samples.api.GreeterService/SayHello, grpc_method=SayHello, grpc_service=samples.api.GreeterService, percentile=p99_9 GAUGE
2+
grpc.client.by-destination.abandoned-error: grpc_destination=samples.api.GreeterService/SayHello, grpc_destination_full=client(greeter)/samples.api.GreeterService/SayHello, grpc_method=SayHello, grpc_service=samples.api.GreeterService RATE
3+
grpc.client.by-destination.active: grpc_destination=samples.api.GreeterService/SayHello, grpc_destination_full=client(greeter)/samples.api.GreeterService/SayHello, grpc_method=SayHello, grpc_service=samples.api.GreeterService GAUGE
4+
grpc.client.by-destination.cancelled-by-deadline-propagation: grpc_destination=samples.api.GreeterService/SayHello, grpc_destination_full=client(greeter)/samples.api.GreeterService/SayHello, grpc_method=SayHello, grpc_service=samples.api.GreeterService RATE
5+
grpc.client.by-destination.cancelled: grpc_destination=samples.api.GreeterService/SayHello, grpc_destination_full=client(greeter)/samples.api.GreeterService/SayHello, grpc_method=SayHello, grpc_service=samples.api.GreeterService RATE
6+
grpc.client.by-destination.deadline-propagated: grpc_destination=samples.api.GreeterService/SayHello, grpc_destination_full=client(greeter)/samples.api.GreeterService/SayHello, grpc_method=SayHello, grpc_service=samples.api.GreeterService RATE
7+
grpc.client.by-destination.eps: grpc_destination=samples.api.GreeterService/SayHello, grpc_destination_full=client(greeter)/samples.api.GreeterService/SayHello, grpc_method=SayHello, grpc_service=samples.api.GreeterService RATE
8+
grpc.client.by-destination.network-error: grpc_destination=samples.api.GreeterService/SayHello, grpc_destination_full=client(greeter)/samples.api.GreeterService/SayHello, grpc_method=SayHello, grpc_service=samples.api.GreeterService RATE
9+
grpc.client.by-destination.rps: grpc_destination=samples.api.GreeterService/SayHello, grpc_destination_full=client(greeter)/samples.api.GreeterService/SayHello, grpc_method=SayHello, grpc_service=samples.api.GreeterService RATE
10+
grpc.client.by-destination.status: grpc_code=OK, grpc_destination=samples.api.GreeterService/SayHello, grpc_destination_full=client(greeter)/samples.api.GreeterService/SayHello, grpc_method=SayHello, grpc_service=samples.api.GreeterService RATE
11+
grpc.client.by-destination.status: grpc_code=UNKNOWN, grpc_destination=samples.api.GreeterService/SayHello, grpc_destination_full=client(greeter)/samples.api.GreeterService/SayHello, grpc_method=SayHello, grpc_service=samples.api.GreeterService RATE
12+
grpc.client.by-destination.timings: grpc_destination=samples.api.GreeterService/SayHello, grpc_destination_full=client(greeter)/samples.api.GreeterService/SayHello, grpc_method=SayHello, grpc_service=samples.api.GreeterService, percentile=p0 GAUGE
13+
grpc.client.by-destination.timings: grpc_destination=samples.api.GreeterService/SayHello, grpc_destination_full=client(greeter)/samples.api.GreeterService/SayHello, grpc_method=SayHello, grpc_service=samples.api.GreeterService, percentile=p100 GAUGE
14+
grpc.client.by-destination.timings: grpc_destination=samples.api.GreeterService/SayHello, grpc_destination_full=client(greeter)/samples.api.GreeterService/SayHello, grpc_method=SayHello, grpc_service=samples.api.GreeterService, percentile=p50 GAUGE
15+
grpc.client.by-destination.timings: grpc_destination=samples.api.GreeterService/SayHello, grpc_destination_full=client(greeter)/samples.api.GreeterService/SayHello, grpc_method=SayHello, grpc_service=samples.api.GreeterService, percentile=p90 GAUGE
16+
grpc.client.by-destination.timings: grpc_destination=samples.api.GreeterService/SayHello, grpc_destination_full=client(greeter)/samples.api.GreeterService/SayHello, grpc_method=SayHello, grpc_service=samples.api.GreeterService, percentile=p95 GAUGE
17+
grpc.client.by-destination.timings: grpc_destination=samples.api.GreeterService/SayHello, grpc_destination_full=client(greeter)/samples.api.GreeterService/SayHello, grpc_method=SayHello, grpc_service=samples.api.GreeterService, percentile=p98 GAUGE
18+
grpc.client.by-destination.timings: grpc_destination=samples.api.GreeterService/SayHello, grpc_destination_full=client(greeter)/samples.api.GreeterService/SayHello, grpc_method=SayHello, grpc_service=samples.api.GreeterService, percentile=p99 GAUGE
19+
grpc.client.by-destination.timings: grpc_destination=samples.api.GreeterService/SayHello, grpc_destination_full=client(greeter)/samples.api.GreeterService/SayHello, grpc_method=SayHello, grpc_service=samples.api.GreeterService, percentile=p99_6 GAUGE
20+
grpc.client.by-destination.timings: grpc_destination=samples.api.GreeterService/SayHello, grpc_destination_full=client(greeter)/samples.api.GreeterService/SayHello, grpc_method=SayHello, grpc_service=samples.api.GreeterService, percentile=p99_9 GAUGE
2121
grpc.client.total.abandoned-error: RATE
2222
grpc.client.total.active: GAUGE
2323
grpc.client.total.cancelled-by-deadline-propagation: RATE

grpc/include/userver/ugrpc/client/client_settings.hpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
/// @brief @copybrief ugrpc::client::ClientSettings
55

66
#include <cstddef>
7+
#include <optional>
78
#include <string>
89
#include <unordered_map>
910

@@ -31,6 +32,11 @@ struct ClientSettings final {
3132
/// https://grpc.github.io/grpc/cpp/md_doc_naming.html
3233
std::string endpoint;
3334

35+
/// **(Optional)**
36+
/// Prefix for the full destination path in metrics: "destination_prefix_in_metrics/grpc_service/grpc_method".
37+
/// Default: "client(client_name)".
38+
std::optional<std::string> destination_prefix_in_metrics{std::nullopt};
39+
3440
/// **(Optional)**
3541
/// The name of the QOS
3642
/// @ref scripts/docs/en/userver/dynamic_config.md "dynamic config"

grpc/include/userver/ugrpc/client/impl/client_internals.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ class ClientQosErrorsReporter;
2929
/// Contains all non-code-generated dependencies for creating a gRPC client
3030
struct ClientInternals final {
3131
std::string client_name;
32+
std::string destination_prefix_in_metrics;
3233
std::string endpoint;
3334
Middlewares middlewares;
3435
ugrpc::impl::CompletionQueuePoolBase& completion_queues;

grpc/include/userver/ugrpc/impl/statistics.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ void DumpMetric(utils::statistics::Writer& writer, const MethodStatisticsSnapsho
108108
void DumpMetricWithLabels(
109109
utils::statistics::Writer& writer,
110110
const MethodStatisticsSnapshot& stats,
111-
std::optional<std::string_view> client_name,
111+
std::optional<std::string_view> destination_prefix_in_metrics,
112112
std::string_view call_name,
113113
std::string_view service_name
114114
);
@@ -132,7 +132,7 @@ class ServiceStatistics final {
132132

133133
void DumpAndCountTotal(
134134
utils::statistics::Writer& writer,
135-
std::optional<std::string_view> client_name,
135+
std::optional<std::string_view> destination_prefix_in_metrics,
136136
MethodStatisticsSnapshot& total
137137
) const;
138138

grpc/include/userver/ugrpc/impl/statistics_storage.hpp

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,13 @@ class StatisticsStorage final {
2828

2929
ServiceStatistics& GetServiceStatistics(
3030
const StaticServiceMetadata& metadata,
31-
std::optional<std::string> client_name
31+
std::optional<std::string> destination_prefix_in_metrics
3232
);
3333

34-
MethodStatistics& GetGenericStatistics(std::string_view call_name, std::optional<std::string_view> client_name);
34+
MethodStatistics& GetGenericStatistics(
35+
std::string_view call_name,
36+
std::optional<std::string_view> destination_prefix_in_metrics
37+
);
3538

3639
std::uint64_t GetStartedRequests() const;
3740

@@ -41,19 +44,19 @@ class StatisticsStorage final {
4144

4245
struct ServiceKey {
4346
ServiceId service_id{};
44-
std::optional<std::string> client_name;
47+
std::optional<std::string> destination_prefix_in_metrics;
4548
};
4649

4750
struct GenericKey {
4851
std::string call_name;
49-
std::optional<std::string> client_name;
52+
std::optional<std::string> destination_prefix_in_metrics;
5053
};
5154

5255
struct GenericKeyView {
5356
GenericKey Dereference() const;
5457

5558
std::string_view call_name;
56-
std::optional<std::string_view> client_name;
59+
std::optional<std::string_view> destination_prefix_in_metrics;
5760
};
5861

5962
struct ServiceKeyComparer {

grpc/src/ugrpc/client/client_factory.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,12 @@ impl::ClientInternals ClientFactory::MakeClientInternals(
6060
impl::ChannelFactory
6161
channel_factory{channel_task_processor_, std::move(channel_credentials), client_factory_settings_.auth_type};
6262

63+
std::string destination_prefix_in_metrics =
64+
client_settings.destination_prefix_in_metrics.value_or(fmt::format("client({})", client_settings.client_name));
65+
6366
return impl::ClientInternals{
6467
std::move(client_settings.client_name),
68+
std::move(destination_prefix_in_metrics),
6569
std::move(client_settings.endpoint),
6670
std::move(middlewares),
6771
completion_queues_,

grpc/src/ugrpc/client/impl/client_data.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ ugrpc::impl::MethodStatistics& ClientData::GetStatistics(std::size_t method_id)
3131
}
3232

3333
ugrpc::impl::MethodStatistics& ClientData::GetGenericStatistics(std::string_view call_name) const {
34-
return internals_.statistics_storage.GetGenericStatistics(call_name, internals_.client_name);
34+
return internals_.statistics_storage.GetGenericStatistics(call_name, internals_.destination_prefix_in_metrics);
3535
}
3636

3737
const ugrpc::impl::StaticServiceMetadata& ClientData::GetMetadata() const {
@@ -44,7 +44,7 @@ const dynamic_config::Key<ClientQos>* ClientData::GetClientQos() const { return
4444
rcu::ReadablePtr<StubState> ClientData::GetStubState() const { return stub_state_.Read(); }
4545

4646
ugrpc::impl::ServiceStatistics& ClientData::GetServiceStatistics() {
47-
return internals_.statistics_storage.GetServiceStatistics(GetMetadata(), internals_.client_name);
47+
return internals_.statistics_storage.GetServiceStatistics(GetMetadata(), internals_.destination_prefix_in_metrics);
4848
}
4949

5050
} // namespace ugrpc::client::impl

grpc/src/ugrpc/client/simple_client_component.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ ClientSettings SimpleClientComponentAny::MakeClientSettings(
3636
ClientSettings client_settings;
3737
client_settings.client_name = config["client-name"].As<std::string>(config.Name());
3838
client_settings.endpoint = config["endpoint"].As<std::string>();
39+
client_settings
40+
.destination_prefix_in_metrics = config["destination-prefix-in-metrics"].As<std::optional<std::string>>();
3941
client_settings.client_qos = client_qos;
4042
client_settings.dedicated_methods_config =
4143
config["dedicated-channel-counts"].As<DedicatedMethodsConfig>(client_settings.dedicated_methods_config);

grpc/src/ugrpc/client/simple_client_component.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,12 @@ properties:
1111
Name of the gRPC server we talk to, for diagnostics.
1212
1313
Default: <uses the component name>
14+
destination-prefix-in-metrics:
15+
type: string
16+
description: |
17+
Prefix for the full destination path in metrics: "destination_prefix_in_metrics/grpc_service/grpc_method".
18+
19+
Default: "client(client_name)"
1420
factory-component:
1521
type: string
1622
description: ClientFactoryComponent name to use for client creation

grpc/src/ugrpc/impl/statistics.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ void MethodStatisticsSnapshot::Add(const MethodStatisticsSnapshot& other) {
149149
void DumpMetricWithLabels(
150150
utils::statistics::Writer& writer,
151151
const MethodStatisticsSnapshot& stats,
152-
std::optional<std::string_view> client_name,
152+
std::optional<std::string_view> destination_prefix_in_metrics,
153153
std::string_view call_name,
154154
std::string_view service_name
155155
) {
@@ -162,8 +162,8 @@ void DumpMetricWithLabels(
162162
{"grpc_destination", call_name},
163163
};
164164

165-
if (client_name) {
166-
grpc_destination_full = utils::StrCat(*client_name, "/", call_name);
165+
if (destination_prefix_in_metrics) {
166+
grpc_destination_full = utils::StrCat(*destination_prefix_in_metrics, "/", call_name);
167167
labels.emplace_back("grpc_destination_full", grpc_destination_full);
168168
}
169169

@@ -213,7 +213,7 @@ const StaticServiceMetadata& ServiceStatistics::GetMetadata() const { return met
213213

214214
void ServiceStatistics::DumpAndCountTotal(
215215
utils::statistics::Writer& writer,
216-
std::optional<std::string_view> client_name,
216+
std::optional<std::string_view> destination_prefix_in_metrics,
217217
MethodStatisticsSnapshot& total
218218
) const {
219219
for (const auto& [i, method_descriptor] : utils::enumerate(metadata_.methods)) {
@@ -222,7 +222,7 @@ void ServiceStatistics::DumpAndCountTotal(
222222
DumpMetricWithLabels(
223223
writer,
224224
snapshot,
225-
client_name,
225+
destination_prefix_in_metrics,
226226
method_descriptor.method_full_name,
227227
metadata_.service_full_name
228228
);

0 commit comments

Comments
 (0)