import * as grpc from 'grpc'; import * as prom from 'prom-client'; const grpcHistogram = new prom.Histogram({ name: 'grpc_requests_seconds', help: 'measures grpc request duration', labelNames: ['status', 'service', 'method'], buckets: [0.2, 0.5, 1, 1.5, 3, 5, 10], }); /** * * @param options * @param nextCall */ export const prometheusInterceptor = (options: grpc.CallOptions, nextCall: Function): grpc.InterceptingCall => { return new grpc.InterceptingCall(nextCall(options), { start(metadata, listener, next): void { const [service, method] = options.method_definition.path.split('/').splice(1, 2); const labels = { status: grpc.status[grpc.status.UNKNOWN], service, method, }; const timeRequest = grpcHistogram.startTimer(labels); const newListener = { onReceiveStatus(status: grpc.StatusObject, nextStatus: Function): void { labels.status = grpc.status[status.code]; timeRequest(); nextStatus(status); }, }; next(metadata, newListener); }, }); };