Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
gitpod-io
GitHub Repository: gitpod-io/gitpod
Path: blob/main/components/gitpod-protocol/src/messaging/client-call-metrics.ts
2500 views
1
/**
2
* Copyright (c) 2021 Gitpod GmbH. All rights reserved.
3
* Licensed under the GNU Affero General Public License (AGPL).
4
* See License.AGPL.txt in the project root for license information.
5
*/
6
7
import { injectable } from "inversify";
8
import * as prometheusClient from "prom-client";
9
import { IClientCallMetrics, IGrpcCallMetricsLabels, IGrpcCallMetricsLabelsWithCode } from "../util/grpc";
10
11
@injectable()
12
export class PrometheusClientCallMetrics implements IClientCallMetrics {
13
readonly startedCounter: prometheusClient.Counter<string>;
14
readonly sentCounter: prometheusClient.Counter<string>;
15
readonly receivedCounter: prometheusClient.Counter<string>;
16
readonly handledCounter: prometheusClient.Counter<string>;
17
readonly handledSecondsHistogram: prometheusClient.Histogram<string>;
18
19
constructor() {
20
this.startedCounter = new prometheusClient.Counter({
21
name: "grpc_client_started_total",
22
help: "Total number of RPCs started on the client.",
23
labelNames: ["grpc_service", "grpc_method", "grpc_type"],
24
registers: [prometheusClient.register],
25
});
26
this.sentCounter = new prometheusClient.Counter({
27
name: "grpc_client_msg_sent_total",
28
help: " Total number of gRPC stream messages sent by the client.",
29
labelNames: ["grpc_service", "grpc_method", "grpc_type"],
30
registers: [prometheusClient.register],
31
});
32
this.receivedCounter = new prometheusClient.Counter({
33
name: "grpc_client_msg_received_total",
34
help: "Total number of RPC stream messages received by the client.",
35
labelNames: ["grpc_service", "grpc_method", "grpc_type"],
36
registers: [prometheusClient.register],
37
});
38
this.handledCounter = new prometheusClient.Counter({
39
name: "grpc_client_handled_total",
40
help: "Total number of RPCs completed by the client, regardless of success or failure.",
41
labelNames: ["grpc_service", "grpc_method", "grpc_type", "grpc_code"],
42
registers: [prometheusClient.register],
43
});
44
this.handledSecondsHistogram = new prometheusClient.Histogram({
45
name: "grpc_client_handling_seconds",
46
help: "Histogram of response latency (seconds) of the gRPC until it is finished by the application.",
47
labelNames: ["grpc_service", "grpc_method", "grpc_type", "grpc_code"],
48
registers: [prometheusClient.register],
49
});
50
}
51
52
dispose(): void {
53
prometheusClient.register.removeSingleMetric("grpc_client_started_total");
54
prometheusClient.register.removeSingleMetric("grpc_client_msg_sent_total");
55
prometheusClient.register.removeSingleMetric("grpc_client_msg_received_total");
56
prometheusClient.register.removeSingleMetric("grpc_client_handled_total");
57
prometheusClient.register.removeSingleMetric("grpc_client_handling_seconds");
58
}
59
60
started(labels: IGrpcCallMetricsLabels): void {
61
this.startedCounter.inc({
62
grpc_service: labels.service,
63
grpc_method: labels.method,
64
grpc_type: labels.type,
65
});
66
}
67
68
sent(labels: IGrpcCallMetricsLabels): void {
69
this.sentCounter.inc({
70
grpc_service: labels.service,
71
grpc_method: labels.method,
72
grpc_type: labels.type,
73
});
74
}
75
76
received(labels: IGrpcCallMetricsLabels): void {
77
this.receivedCounter.inc({
78
grpc_service: labels.service,
79
grpc_method: labels.method,
80
grpc_type: labels.type,
81
});
82
}
83
84
handled(labels: IGrpcCallMetricsLabelsWithCode): void {
85
this.handledCounter.inc({
86
grpc_service: labels.service,
87
grpc_method: labels.method,
88
grpc_type: labels.type,
89
grpc_code: labels.code,
90
});
91
}
92
93
startHandleTimer(
94
labels: IGrpcCallMetricsLabelsWithCode,
95
): (labels?: Partial<Record<string, string | number>> | undefined) => number {
96
return this.handledSecondsHistogram.startTimer({
97
grpc_service: labels.service,
98
grpc_method: labels.method,
99
grpc_type: labels.type,
100
});
101
}
102
}
103
104