Skip to content

Commit 6264ee9

Browse files
committed
chore: add instrumentation
Signed-off-by: William Phetsinorath <william.phetsinorath-open@interieur.gouv.fr>
1 parent c3c0581 commit 6264ee9

8 files changed

Lines changed: 1836 additions & 7 deletions

File tree

ENVIRONMENTS.md

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ Un script permet de copier facilement les fichiers `.env*-example` en leur équi
6161
6262
## Configuration pour le développement entièrement en local
6363

64-
Docker Compose utilisé : [`docker/docker-compose.local.yml`](docker/docker-compose.local.yml) (infrastructure uniquement : Keycloak, PostgreSQL, pgAdmin, OpenCDS mock, **et nginx-strangler**)
64+
Docker Compose utilisé : [`docker/docker-compose.local.yml`](docker/docker-compose.local.yml) (infrastructure uniquement : Keycloak, PostgreSQL, pgAdmin, OpenCDS mock, **nginx-strangler, et Jaeger**)
6565

6666
Fichiers utilisés :
6767

@@ -74,7 +74,7 @@ Les valeurs par défaut, disponibles dans les fichiers `.env-example`, sont suff
7474
**Commandes de lancement :**
7575

7676
```bash
77-
# Lance l'infrastructure (Keycloak, PostgreSQL, pgAdmin, OpenCDS mock, nginx-strangler)
77+
# Lance l'infrastructure (Keycloak, PostgreSQL, pgAdmin, OpenCDS mock, nginx-strangler, Jaeger)
7878
pnpm dev
7979

8080
# Puis dans d'autres terminaux, lancer les serveurs et le client manuellement :
@@ -97,6 +97,24 @@ Le `nginx-strangler` est automatiquement lancé par `pnpm dev` via `docker-compo
9797

9898
> **Note :** si vous ne travaillez pas sur la migration NestJS, vous n'avez pas besoin de changer `SERVER_PORT` — le comportement par défaut (proxy direct vers `server:4000`) reste identique.
9999
100+
### Observabilité : Jaeger + OpenTelemetry (traces)
101+
102+
Le fichier [`docker/docker-compose.local.yml`](docker/docker-compose.local.yml) démarre un service `jaeger` (image `jaegertracing/all-in-one`) pour collecter et visualiser les traces.
103+
104+
- UI Jaeger : http://localhost:16686
105+
- Endpoints de collecte exposés sur la machine hôte :
106+
- OTLP gRPC : `localhost:4317`
107+
- OTLP HTTP (protobuf) : `http://localhost:4318`
108+
109+
Dans `apps/server-nestjs`, l'instrumentation OpenTelemetry est initialisée au démarrage via [`src/instrumentation.ts`](apps/server-nestjs/src/instrumentation.ts) (appelée depuis `main.ts`) et exporte via OTLP.
110+
111+
Pour vérifier rapidement :
112+
113+
1. Démarrer l'infra : `pnpm dev` (Jaeger inclus).
114+
2. Démarrer `server-nestjs` : `pnpm --filter server-nestjs run start:dev`.
115+
3. Exécuter une requête sur une route backend (depuis le client ou un `curl`).
116+
4. Ouvrir http://localhost:16686 et chercher le service `cloud-pi-native-console`.
117+
100118
## Configuration pour le développement conteneurisé en local
101119

102120
Docker Compose utilisé : [`docker/docker-compose.dev.yml`](docker/docker-compose.dev.yml) (tout conteneurisé avec Docker Compose Watch)

apps/server-nestjs/package.json

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,15 @@
4444
"@nestjs/core": "^11.1.16",
4545
"@nestjs/platform-express": "^11.1.16",
4646
"@prisma/client": "^6.19.2",
47+
"@opentelemetry/api": "^1.9.0",
48+
"@opentelemetry/auto-instrumentations-node": "^0.70.1",
49+
"@opentelemetry/exporter-metrics-otlp-proto": "^0.213.0",
50+
"@opentelemetry/exporter-trace-otlp-proto": "^0.213.0",
51+
"@opentelemetry/instrumentation-nestjs-core": "^0.58.0",
52+
"@opentelemetry/instrumentation-pino": "^0.59.0",
53+
"@opentelemetry/sdk-metrics": "^2.5.1",
54+
"@opentelemetry/sdk-node": "^0.212.0",
55+
"@opentelemetry/sdk-trace-node": "^2.5.1",
4756
"@ts-rest/core": "^3.52.1",
4857
"@ts-rest/fastify": "^3.52.1",
4958
"@ts-rest/open-api": "^3.52.1",

apps/server-nestjs/src/cpin-module/infrastructure/infrastructure.module.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,11 @@ import { DatabaseService } from './database/database.service'
55
import { HttpClientService } from './http-client/http-client.service'
66
import { LoggerModule } from './logger/logger.module'
77
import { ServerService } from './server/server.service'
8+
import { TelemetryModule } from './telemetry/telemetry.module'
89

910
@Module({
1011
providers: [DatabaseService, HttpClientService, ServerService],
11-
imports: [LoggerModule, ConfigurationModule],
12+
imports: [LoggerModule, ConfigurationModule, TelemetryModule],
1213
exports: [DatabaseService, HttpClientService, ServerService],
1314
})
1415
export class InfrastructureModule {}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { Module } from '@nestjs/common'
2+
import { TelemetryService } from './telemetry.service'
3+
4+
@Module({
5+
providers: [TelemetryService],
6+
})
7+
export class TelemetryModule {}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import { Injectable } from '@nestjs/common'
2+
import type { OnApplicationShutdown, OnModuleInit } from '@nestjs/common'
3+
import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node'
4+
import { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-proto'
5+
import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-proto'
6+
import { NestInstrumentation } from '@opentelemetry/instrumentation-nestjs-core'
7+
import { PinoInstrumentation } from '@opentelemetry/instrumentation-pino'
8+
import { PeriodicExportingMetricReader } from '@opentelemetry/sdk-metrics'
9+
import { NodeSDK } from '@opentelemetry/sdk-node'
10+
11+
@Injectable()
12+
export class TelemetryService extends NodeSDK implements OnModuleInit, OnApplicationShutdown {
13+
constructor() {
14+
super({
15+
traceExporter: new OTLPTraceExporter({}),
16+
metricReader: new PeriodicExportingMetricReader({
17+
exporter: new OTLPMetricExporter(),
18+
}),
19+
instrumentations: [
20+
getNodeAutoInstrumentations(),
21+
new NestInstrumentation(),
22+
new PinoInstrumentation(),
23+
],
24+
serviceName: 'cloud-pi-native-console',
25+
})
26+
}
27+
28+
onModuleInit() {
29+
this.start()
30+
}
31+
32+
onApplicationShutdown() {
33+
this.shutdown()
34+
}
35+
}

apps/server-nestjs/src/main.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
import { NestFactory } from '@nestjs/core'
22
import { Logger } from 'nestjs-pino'
3-
43
import { ConfigurationService } from './cpin-module/infrastructure/configuration/configuration.service'
54
import { MainModule } from './main.module'
65

76
async function bootstrap() {
87
const app = await NestFactory.create(MainModule, { bufferLogs: true })
98
app.useLogger(app.get(Logger))
109
app.flushLogs()
10+
app.enableShutdownHooks()
1111
const config = app.get(ConfigurationService)
1212
await app.listen(config.port ?? 0)
1313
}
14+
1415
bootstrap()

docker/docker-compose.local.yml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,24 @@ services:
116116
- dso-network
117117
attach: false
118118

119+
jaeger:
120+
restart: unless-stopped
121+
image: jaegertracing/all-in-one:1.76.0
122+
container_name: dso-console_jaeger
123+
environment:
124+
COLLECTOR_ZIPKIN_HOST_PORT: :9411
125+
ports:
126+
- 16686:16686
127+
- 4317:4317
128+
- 4318:4318
129+
- 14250:14250
130+
- 14268:14268
131+
- 14269:14269
132+
- 9411:9411
133+
networks:
134+
- dso-network
135+
attach: false
136+
119137
networks:
120138
dso-network:
121139
driver: bridge

0 commit comments

Comments
 (0)