Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/ciogeo/opentelemetry-custom-metrics
OpenTelemetry Custom Metrics for NestJS
https://github.com/ciogeo/opentelemetry-custom-metrics
metrics nestjs prometheus
Last synced: 2 months ago
JSON representation
OpenTelemetry Custom Metrics for NestJS
- Host: GitHub
- URL: https://github.com/ciogeo/opentelemetry-custom-metrics
- Owner: ciogeo
- License: apache-2.0
- Created: 2022-12-20T10:55:52.000Z (about 2 years ago)
- Default Branch: main
- Last Pushed: 2023-03-07T22:26:53.000Z (almost 2 years ago)
- Last Synced: 2024-10-31T17:36:39.071Z (3 months ago)
- Topics: metrics, nestjs, prometheus
- Language: TypeScript
- Homepage:
- Size: 661 KB
- Stars: 2
- Watchers: 1
- Forks: 0
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
- License: LICENSE.txt
Awesome Lists containing this project
README
# OpenTelemetry Custom Metrics for NestJS
[![CodeQL](https://github.com/ciogeo/opentelemetry-custom-metrics/actions/workflows/codeql.yml/badge.svg?branch=main)](https://github.com/ciogeo/opentelemetry-custom-metrics/actions/workflows/codeql.yml)
[![Node.js CI](https://github.com/ciogeo/opentelemetry-custom-metrics/actions/workflows/node.js.yml/badge.svg?branch=main)](https://github.com/ciogeo/opentelemetry-custom-metrics/actions/workflows/node.js.yml)
[![OpenTelemetry Custom Metrics for NestJS](https://github.com/ciogeo/opentelemetry-custom-metrics/actions/workflows/npm-publish.yml/badge.svg)](https://github.com/ciogeo/opentelemetry-custom-metrics/actions/workflows/npm-publish.yml)## Description
[OpenTelemetry](https://opentelemetry.io/) module for [Nest](https://github.com/nestjs/nest).
## Install
```bash
npm i opentelemetry-custom-metrics @opentelemetry/sdk-node --save
```Other required dependencies for Prometheus config:
```bash
@opentelemetry/exporter-prometheus
```## Usage
### Create otelSDK.ts file
```ts
import * as process from 'process';
import { NodeSDK } from '@opentelemetry/sdk-node';
import { PrometheusExporter } from '@opentelemetry/exporter-prometheus';
import { AsyncLocalStorageContextManager } from '@opentelemetry/context-async-hooks';const otelSDK = new NodeSDK({
metricReader: new PrometheusExporter({
port: 8081,
}),
contextManager: new AsyncLocalStorageContextManager(),
});export default otelSDK;
process.on('SIGTERM', () => {
otelSDK
.shutdown()
.then(
() => console.log('SDK shut down successfully'),
(err) => console.log('Error shutting down SDK', err),
)
.finally(() => process.exit(0));
});
```### Add otelSDK to your main.ts
```ts
import otelSDK from './otelSDK';async function bootstrap() {
await otelSDK.start();
...
```### Import OpenTelemetryCustomMetricsModule in your app.module.ts
```ts
import { OpenTelemetryCustomMetricsModule } from 'opentelemetry-custom-metrics';@Module({
imports: [
OpenTelemetryCustomMetricsModule.forRootAsync(),
...
```### Add decorators to your methods
app.controller.ts
```ts
import { AccessMetric, TimeToProcessMetric } from 'opentelemetry-custom-metrics';
``````ts
@AccessMetric()
@TimeToProcessMetric()
public async handle(): Promise {
```### Available decorators:
@AccessMetric() - counts the number of times a method is called
@TimeToProcessMetric() - exposes a gauge and a histogram with the time it took to process the method (time spent on async calls is not included)### Add your own custom metrics
```ts
import { MetricService, MetricType } from 'opentelemetry-custom-metrics';constructor(private metricService: MetricService) {
this.metricService.addCounter('my_counter');
this.metricService.addHistogram('my_histogram');
this.metricService.addObservableCounter('my_observable_counter');
this.metricService.addObservableGauge('my_observable_gauge');
this.metricService.addUpDownCounter('my_up_down_counter');
this.metricService.addObservableUpDownCounter('my_observable_up_down_counter');
}handle() {
...
this.metricService.observe('my_counter', 1);
this.metricService.observe('my_histogram', 10);
this.metricService.observe('my_observable_counter', 1);
this.metricService.observe('my_observable_gauge', 10);
this.metricService.observe('my_up_down_counter', 1);
this.metricService.observe('my_observable_up_down_counter', 1);
}
```Go to http://localhost:8081/metrics to see the metrics