Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 20 additions & 2 deletions ENVIRONMENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ Un script permet de copier facilement les fichiers `.env*-example` en leur équi

## Configuration pour le développement entièrement en local

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

Fichiers utilisés :

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

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

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

> **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.

### Observabilité : Jaeger + OpenTelemetry (traces)

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.

- UI Jaeger : http://localhost:16686
- Endpoints de collecte exposés sur la machine hôte :
- OTLP gRPC : `localhost:4317`
- OTLP HTTP (protobuf) : `http://localhost:4318`

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.

Pour vérifier rapidement :

1. Démarrer l'infra : `pnpm dev` (Jaeger inclus).
2. Démarrer `server-nestjs` : `pnpm --filter server-nestjs run start:dev`.
3. Exécuter une requête sur une route backend (depuis le client ou un `curl`).
4. Ouvrir http://localhost:16686 et chercher le service `cloud-pi-native-console`.

## Configuration pour le développement conteneurisé en local

Docker Compose utilisé : [`docker/docker-compose.dev.yml`](docker/docker-compose.dev.yml) (tout conteneurisé avec Docker Compose Watch)
Expand Down
9 changes: 9 additions & 0 deletions apps/server-nestjs/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,15 @@
"@nestjs/core": "^11.1.16",
"@nestjs/platform-express": "^11.1.16",
"@prisma/client": "^6.19.2",
"@opentelemetry/api": "^1.9.0",
"@opentelemetry/auto-instrumentations-node": "^0.70.1",
"@opentelemetry/exporter-metrics-otlp-proto": "^0.213.0",
"@opentelemetry/exporter-trace-otlp-proto": "^0.213.0",
"@opentelemetry/instrumentation-nestjs-core": "^0.58.0",
"@opentelemetry/instrumentation-pino": "^0.59.0",
"@opentelemetry/sdk-metrics": "^2.5.1",
"@opentelemetry/sdk-node": "^0.212.0",
"@opentelemetry/sdk-trace-node": "^2.5.1",
"@ts-rest/core": "^3.52.1",
"@ts-rest/fastify": "^3.52.1",
"@ts-rest/open-api": "^3.52.1",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,11 @@ import { DatabaseService } from './database/database.service'
import { HttpClientService } from './http-client/http-client.service'
import { LoggerModule } from './logger/logger.module'
import { ServerService } from './server/server.service'
import { TelemetryModule } from './telemetry/telemetry.module'

@Module({
providers: [DatabaseService, HttpClientService, ServerService],
imports: [LoggerModule, ConfigurationModule],
imports: [LoggerModule, ConfigurationModule, TelemetryModule],
exports: [DatabaseService, HttpClientService, ServerService],
})
export class InfrastructureModule {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import { Module } from '@nestjs/common'
import { TelemetryService } from './telemetry.service'

@Module({
providers: [TelemetryService],
})
export class TelemetryModule {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import { Injectable } from '@nestjs/common'
import type { OnApplicationShutdown, OnModuleInit } from '@nestjs/common'
import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node'
import { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-proto'
import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-proto'
import { NestInstrumentation } from '@opentelemetry/instrumentation-nestjs-core'
import { PinoInstrumentation } from '@opentelemetry/instrumentation-pino'
import { PeriodicExportingMetricReader } from '@opentelemetry/sdk-metrics'
import { NodeSDK } from '@opentelemetry/sdk-node'

@Injectable()
export class TelemetryService extends NodeSDK implements OnModuleInit, OnApplicationShutdown {
constructor() {
super({
traceExporter: new OTLPTraceExporter({}),
metricReader: new PeriodicExportingMetricReader({
exporter: new OTLPMetricExporter(),
}),
instrumentations: [
getNodeAutoInstrumentations(),
new NestInstrumentation(),
new PinoInstrumentation(),
],
serviceName: 'cloud-pi-native-console',
})
}

onModuleInit() {
this.start()
}

onApplicationShutdown() {
this.shutdown()
}
}
3 changes: 2 additions & 1 deletion apps/server-nestjs/src/main.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
import { NestFactory } from '@nestjs/core'
import { Logger } from 'nestjs-pino'

import { ConfigurationService } from './cpin-module/infrastructure/configuration/configuration.service'
import { MainModule } from './main.module'

async function bootstrap() {
const app = await NestFactory.create(MainModule, { bufferLogs: true })
app.useLogger(app.get(Logger))
app.flushLogs()
app.enableShutdownHooks()
const config = app.get(ConfigurationService)
await app.listen(config.port ?? 0)
}

bootstrap()
18 changes: 18 additions & 0 deletions docker/docker-compose.local.yml
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,24 @@ services:
- dso-network
attach: false

jaeger:
restart: unless-stopped
image: jaegertracing/all-in-one:1.76.0
container_name: dso-console_jaeger
environment:
COLLECTOR_ZIPKIN_HOST_PORT: :9411
ports:
- 16686:16686
- 4317:4317
- 4318:4318
- 14250:14250
- 14268:14268
- 14269:14269
- 9411:9411
networks:
- dso-network
attach: false

networks:
dso-network:
driver: bridge
Expand Down
Loading
Loading