nice-grpc-prometheus
Version:
Prometheus monitoring for nice-grpc
151 lines (112 loc) • 7.04 kB
Markdown
# nice-grpc-prometheus [![npm version][npm-image]][npm-url]
[Prometheus](https://prometheus.io/) monitoring for
[nice-grpc](https://github.com/deeplay-io/nice-grpc). Uses
[prom-client](https://github.com/siimon/prom-client). Metrics mostly mimic
[go-grpc-prometheus](https://github.com/grpc-ecosystem/go-grpc-prometheus).
## Installation
npm install nice-grpc-prometheus
## Usage
Import `nice-grpc-prometheus` metrics registry and
[merge it with the global registry](https://github.com/siimon/prom-client#multiple-registries):
```ts
import {register as globalRegistry, Registry} from 'prom-client';
import {registry as niceGrpcRegistry} from 'nice-grpc-prometheus';
// use `await mergedRegistry.metrics()` to export all metrics
const mergedRegistry = Registry.merge([globalRegistry, niceGrpcRegistry]);
```
Attach middleware as the first one on the server:
```ts
import {createServer} from 'nice-grpc';
import {prometheusServerMiddleware} from 'nice-grpc-prometheus';
const server = createServer()
.use(prometheusServerMiddleware())
.use(/* ... other middleware */);
```
Attach middleware as the first one on the client:
```ts
import {createClientFactory} from 'nice-grpc';
import {prometheusClientMiddleware} from 'nice-grpc-prometheus';
const clientFactory = createClientFactory()
.use(prometheusClientMiddleware())
.use(/* ... other middleware */);
const client = clientFactory.create(/* ... */);
```
## Metrics
Following metrics are provided:
### Server
| Name | Type | Description | Labels |
| -------------------------------- | --------- | ------------------------------------------------------------------------------------------------------ | -------------------- |
| `grpc_server_started_total` | Counter | Total number of RPCs started on the server. | Common (see below) |
| `grpc_server_handled_total` | Counter | Total number of RPCs completed on the server, regardless of success or failure. | Common + `grpc_code` |
| `grpc_server_msg_received_total` | Counter | Total number of RPC stream messages received by the server. | Common |
| `grpc_server_msg_sent_total` | Counter | Total number of gRPC stream messages sent by the server. | Common |
| `grpc_server_handling_seconds` | Histogram | Histogram of response latency (seconds) of gRPC that had been application-level handled by the server. | Common + `grpc_code` |
### Client
| Name | Type | Description | Labels |
| -------------------------------- | --------- | -------------------------------------------------------------------------------------------- | -------------------- |
| `grpc_client_started_total` | Counter | Total number of RPCs started on the client. | Common |
| `grpc_client_handled_total` | Counter | Total number of RPCs completed on the client, regardless of success or failure. | Common + `grpc_code` |
| `grpc_client_msg_received_total` | Counter | Total number of RPC stream messages received by the client. | Common |
| `grpc_client_msg_sent_total` | Counter | Total number of gRPC stream messages sent by the client. | Common |
| `grpc_client_handling_seconds` | Histogram | Histogram of response latency (seconds) of the gRPC until it is finished by the application. | Common + `grpc_code` |
### Labels
Common labels:
| Name | Description | Examples |
| -------------- | ------------------------------ | -------------------------------------------------------- |
| `grpc_type` | Call type | `unary`, `server_stream`, `client_stream`, `bidi_stream` |
| `grpc_path` | Full path of a method | `/my.package.MyService/MyMethod` |
| `grpc_service` | Full service name with package | `my.package.MyService` |
| `grpc_method` | Method name | `MyMethod` |
Metrics that correspond to finished calls have extra label:
| Name | Description | Examples |
| ----------- | ---------------------------------------------------------------------------- | ------------------------------ |
| `grpc_code` | [Status code](https://grpc.github.io/grpc/core/md_doc_statuscodes.html) name | `OK`, `CANCELLED`, `NOT_FOUND` |
[npm-image]: https://badge.fury.io/js/nice-grpc-prometheus.svg
[npm-url]: https://badge.fury.io/js/nice-grpc-prometheus
### Customization
You can use your own metric instances. This can be useful for example if you
want to use your own buckets in histograms.
```ts
import {createClientFactory} from 'nice-grpc';
import {
labelNamesWithCode,
prometheusClientMiddleware,
} from 'nice-grpc-prometheus';
import {Histogram, Registry} from 'prom-client';
const registry = new Registry();
const clientHandlingSecondsMetric = new Histogram({
registers: [registry],
name: 'custom_grpc_client_handling_seconds',
help: 'Custom histogram of response latency (seconds) of the gRPC until it is finished by the application.',
labelNames: labelNamesWithCode,
buckets: [0.1, 0.5, 1, 2, 3, 5, 10],
});
const clientFactory = createClientFactory()
.use(prometheusClientMiddleware({clientHandlingSecondsMetric}))
.use(/* ... other middleware */);
```
Don't forget
[to merge new registry with the global registry](https://github.com/siimon/prom-client#multiple-registries)
or use default registry instead.
Client middleware options:
```ts
{
clientStartedMetric?: Counter; // labelNames: labelNames
clientHandledMetric?: Counter; // labelNames: labelNamesWithCode
clientStreamMsgReceivedMetric?: Counter; // labelNames: labelNames
clientStreamMsgSentMetric?: Counter; // labelNames: labelNames
clientHandlingSecondsMetric?: Histogram; // labelNames: labelNamesWithCode
}
```
Server middleware options:
```ts
{
serverStartedMetric?: Counter; // labelNames: labelNames
serverHandledMetric?: Counter; // labelNames: labelNamesWithCode
serverStreamMsgReceivedMetric?: Counter; // labelNames: labelNames
serverStreamMsgSentMetric?: Counter; // labelNames: labelNames
serverHandlingSecondsMetric?: Histogram; // labelNames: labelNamesWithCode
}
```
**Caution:** Use the labelNames specified in the comment. Using incorrect
labelNames may cause errors now or in the future.