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