diff --git a/docker-compose.yaml b/docker-compose.yaml index 1b62c93..2a74ec1 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -15,9 +15,37 @@ services: ports: - '6379:6379' + otel-collector: + image: otel/opentelemetry-collector-contrib:latest + command: + - "--config=/etc/otel-collector.yaml" + volumes: + - ./otel-collector.yaml:/etc/otel-collector.yaml + ports: + - "9464:9464" + - "4318:4318" + - "4317:4317" + jaeger: image: jaegertracing/all-in-one:latest container_name: opentelemetry_jaeger_redis ports: - - '16686:16686' - - '4318:4318' \ No newline at end of file + - "16686:16686" + + prometheus: + image: prom/prometheus:latest + volumes: + - ./prometheus.yaml:/etc/prometheus/prometheus.yaml + command: ["--config.file=/etc/prometheus/prometheus.yaml"] + ports: + - "9090:9090" + + grafana: + image: grafana/grafana-enterprise + container_name: grafana + restart: unless-stopped + ports: + - '3001:3000' + environment: + GF_SECURITY_ADMIN_USER: "${GRAFANA_USER}" + GF_SECURITY_ADMIN_PASSWORD: "${GRAFANA_PASSWORD}" \ No newline at end of file diff --git a/otel-collector.yaml b/otel-collector.yaml new file mode 100644 index 0000000..644bf02 --- /dev/null +++ b/otel-collector.yaml @@ -0,0 +1,28 @@ +receivers: + otlp: + protocols: + http: + endpoint: 0.0.0.0:4318 + +processors: + batch: + +exporters: + otlp: + endpoint: jaeger:4317 + tls: + insecure: true + + prometheus: + endpoint: 0.0.0.0:9464 + +service: + pipelines: + traces: + receivers: [otlp] + processors: [batch] + exporters: [otlp] + metrics: + receivers: [otlp] + processors: [batch] + exporters: [prometheus] \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index b500907..bc5dff9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,7 @@ "license": "ISC", "dependencies": { "@opentelemetry/exporter-metrics-otlp-proto": "^0.54.0", + "@opentelemetry/exporter-prometheus": "^0.56.0", "@opentelemetry/exporter-trace-otlp-proto": "^0.54.0", "@opentelemetry/instrumentation-express": "^0.44.0", "@opentelemetry/instrumentation-http": "^0.54.0", @@ -730,6 +731,79 @@ "@opentelemetry/api": "^1.3.0" } }, + "node_modules/@opentelemetry/exporter-prometheus": { + "version": "0.56.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-prometheus/-/exporter-prometheus-0.56.0.tgz", + "integrity": "sha512-5kFcTumUveNREskg6n4aaXx2o3ADc9YxDkArGCIegzErlc3zfzreO4Y7HDc/fYBnV9aIhJUk5P8yotyVCuymkQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.29.0", + "@opentelemetry/resources": "1.29.0", + "@opentelemetry/sdk-metrics": "1.29.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-prometheus/node_modules/@opentelemetry/core": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.29.0.tgz", + "integrity": "sha512-gmT7vAreXl0DTHD2rVZcw3+l2g84+5XiHIqdBUxXbExymPCvSsGOpiwMmn8nkiJur28STV31wnhIDrzWDPzjfA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.28.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-prometheus/node_modules/@opentelemetry/resources": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.29.0.tgz", + "integrity": "sha512-s7mLXuHZE7RQr1wwweGcaRp3Q4UJJ0wazeGlc/N5/XSe6UyXfsh1UQGMADYeg7YwD+cEdMtU1yJAUXdnFzYzyQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.29.0", + "@opentelemetry/semantic-conventions": "1.28.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-prometheus/node_modules/@opentelemetry/sdk-metrics": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.29.0.tgz", + "integrity": "sha512-MkVtuzDjXZaUJSuJlHn6BSXjcQlMvHcsDV7LjY4P6AJeffMa4+kIGDjzsCf6DkAh6Vqlwag5EWEam3KZOX5Drw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.29.0", + "@opentelemetry/resources": "1.29.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-prometheus/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", + "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, "node_modules/@opentelemetry/exporter-trace-otlp-grpc": { "version": "0.54.0", "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.54.0.tgz", diff --git a/package.json b/package.json index 453b925..8269cd5 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ }, "dependencies": { "@opentelemetry/exporter-metrics-otlp-proto": "^0.54.0", + "@opentelemetry/exporter-prometheus": "^0.56.0", "@opentelemetry/exporter-trace-otlp-proto": "^0.54.0", "@opentelemetry/instrumentation-express": "^0.44.0", "@opentelemetry/instrumentation-http": "^0.54.0", diff --git a/prometheus.yaml b/prometheus.yaml new file mode 100644 index 0000000..439dcca --- /dev/null +++ b/prometheus.yaml @@ -0,0 +1,7 @@ +global: + scrape_interval: 15s + +scrape_configs: + - job_name: 'otel-collector' + static_configs: + - targets: ['otel-collector:9464'] \ No newline at end of file diff --git a/src/instrumentation/instrumentation.consumer.ts b/src/instrumentation/instrumentation.consumer.ts index 6eaee96..224a57e 100644 --- a/src/instrumentation/instrumentation.consumer.ts +++ b/src/instrumentation/instrumentation.consumer.ts @@ -4,8 +4,8 @@ import { PgInstrumentation } from '@opentelemetry/instrumentation-pg'; import { ExpressInstrumentation } from '@opentelemetry/instrumentation-express'; import { HttpInstrumentation } from '@opentelemetry/instrumentation-http'; import { IORedisInstrumentation } from '@opentelemetry/instrumentation-ioredis'; -import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-proto'; -import { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-proto'; +import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'; +import { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-http'; const sdk = new NodeSDK({ serviceName: 'consumer', diff --git a/src/instrumentation/instrumentation.producer.ts b/src/instrumentation/instrumentation.producer.ts index faddc09..eefbcc0 100644 --- a/src/instrumentation/instrumentation.producer.ts +++ b/src/instrumentation/instrumentation.producer.ts @@ -4,8 +4,8 @@ import { PgInstrumentation } from '@opentelemetry/instrumentation-pg'; import { ExpressInstrumentation } from '@opentelemetry/instrumentation-express'; import { HttpInstrumentation } from '@opentelemetry/instrumentation-http'; import { IORedisInstrumentation } from '@opentelemetry/instrumentation-ioredis'; -import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-proto'; -import { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-proto'; +import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'; +import { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-http'; const sdk = new NodeSDK({ serviceName: 'producer', diff --git a/src/nodemailer/worker.ts b/src/nodemailer/worker.ts index c944402..fe30cd4 100644 --- a/src/nodemailer/worker.ts +++ b/src/nodemailer/worker.ts @@ -9,7 +9,14 @@ export function initWorker() { const worker = new Worker(bullmqConfig.queueName, processor, { connection: bullmqConfig.connection, concurrency: bullmqConfig.concurrency, - telemetry: new BullMQOtel('example-tracer') + telemetry: new BullMQOtel({ + traces: { + name: 'example-tracer', + }, + metrics: { + name: 'example-metrics', + }, + }), }); worker.on('completed', (job) => diff --git a/src/services/newsletter.service.ts b/src/services/newsletter.service.ts index c4ff67b..58f08aa 100644 --- a/src/services/newsletter.service.ts +++ b/src/services/newsletter.service.ts @@ -14,7 +14,14 @@ class NewsletterService { constructor() { this.queue = new Queue(bullmqConfig.queueName, { connection: bullmqConfig.connection, - telemetry: new BullMQOtel('example-tracer'), + telemetry: new BullMQOtel({ + traces: { + name: 'example-tracer', + }, + metrics: { + name: 'example-metrics', + }, + }), }); this.subscribedUserCRUD = SubscribedUserCrud;