# geovanesv/nestjs-rabbitmq-opentelemetry architecture

> Architecture diagram of the GitHub repository geovanesv/nestjs-rabbitmq-opentelemetry, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-10). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/geovanesv/nestjs-rabbitmq-opentelemetry
- Repository: https://github.com/geovanesv/nestjs-rabbitmq-opentelemetry

## Overview

This repository demonstrates an order lifecycle across an HTTP NestJS producer, RabbitMQ, and a NestJS consumer, with end-to-end OpenTelemetry traces, metrics, and logs. The producer validates requests, creates and retains orders in memory, and publishes them; the consumer restores trace context and baggage, processes orders with idempotency and retry/DLQ handling. Telemetry is exported through an OpenTelemetry Collector to Jaeger, Prometheus-format metrics, and Loki. Arrows reflect README contracts and sampled source references; unsampled implementation details are represented only at supported directory paths.

Main entry points: [`consumer/src/order.consumer.ts`](https://github.com/geovanesv/nestjs-rabbitmq-opentelemetry/blob/main/consumer/src/order.consumer.ts) (Order handler), [`producer/src/order.service.ts`](https://github.com/geovanesv/nestjs-rabbitmq-opentelemetry/blob/main/producer/src/order.service.ts) (Order service), [`consumer/src/main.ts`](https://github.com/geovanesv/nestjs-rabbitmq-opentelemetry/blob/main/consumer/src/main.ts) (Consumer bootstrap), [`producer/src/main.ts`](https://github.com/geovanesv/nestjs-rabbitmq-opentelemetry/blob/main/producer/src/main.ts) (Producer bootstrap)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_producer["Order producer"]
  node_producer_app["Producer bootstrap<br/>[main.ts]"]
  node_order_api["Orders API"]
  node_order_validation["Order validation<br/>[order.dto.ts]"]
  node_health_api["Health endpoint"]
  node_order_service["Order service<br/>[order.service.ts]"]
  node_order_store[("In-memory orders<br/>[order.service.ts]")]
  node_order_ids["Order identifiers<br/>[ids.ts]"]
  node_baggage_creation["Baggage creation<br/>[baggage.ts]"]
  node_producer_config["Producer configuration<br/>[config.ts]"]
end

subgraph group_messaging["RabbitMQ messaging"]
  node_rabbitmq["RabbitMQ"]
  node_queue_config["Producer queue client<br/>[rabbitmq.config.ts]"]
end

subgraph group_consumer["Order consumer"]
  node_consumer_bootstrap["Consumer bootstrap<br/>[main.ts]"]
  node_queue_topology["Retry and DLQ topology<br/>[dlq.setup.ts]"]
  node_order_handler["Order handler<br/>[order.consumer.ts]"]
  node_trace_extract["Trace extraction"]
  node_baggage_read["Baggage reader<br/>[read-baggage.ts]"]
  node_retry_policy["Retry policy<br/>[retry-policy.ts]"]
  node_idempotency[("Idempotency store")]
  node_consumer_config["Consumer configuration<br/>[config.ts]"]
end

subgraph group_observability["Telemetry"]
  node_producer_telemetry["Producer telemetry SDK<br/>[tracing.ts]"]
  node_producer_span_processor["Messaging span processor"]
  node_producer_metrics["Producer metrics<br/>[metrics.ts]"]
  node_producer_logger["Producer OTel logger<br/>[otel-logger.ts]"]
  node_consumer_telemetry["Consumer telemetry SDK<br/>[tracing.ts]"]
  node_consumer_span_processor["Messaging span processor"]
  node_consumer_metrics["Consumer metrics<br/>[metrics.ts]"]
  node_consumer_logger["Consumer OTel logger<br/>[otel-logger.ts]"]
  node_collector["OTel Collector"]
  node_telemetry_backends[("Jaeger, Prometheus, Loki")]
end

node_client(("HTTP client"))

node_client -->|"sends HTTP"| node_producer_app
node_producer_app -->|"registers routes"| node_order_api
node_producer_app -->|"registers endpoint"| node_health_api
node_producer_app -->|"initializes first"| node_producer_telemetry
node_producer_app -->|"installs logger"| node_producer_logger
node_order_api -->|"accepts DTO"| node_order_validation
node_order_api -->|"delegates orders"| node_order_service
node_health_api -->|"reads settings"| node_producer_config
node_order_service -->|"stores orders"| node_order_store
node_order_service -->|"publishes through"| node_queue_config
node_queue_config -->|"connects to"| node_rabbitmq
node_order_service -->|"creates identifiers"| node_order_ids
node_order_service -->|"creates baggage"| node_baggage_creation
node_order_service -->|"records metrics"| node_producer_metrics
node_order_service -->|"publishes order"| node_rabbitmq
node_consumer_bootstrap -->|"initializes first"| node_consumer_telemetry
node_consumer_bootstrap -->|"installs logger"| node_consumer_logger
node_consumer_bootstrap -->|"sets up topology"| node_queue_topology
node_consumer_bootstrap -->|"starts consumer"| node_rabbitmq
node_queue_topology -->|"declares queues"| node_rabbitmq
node_consumer_bootstrap -->|"configures service"| node_consumer_config
node_order_handler -->|"extracts headers"| node_trace_extract
node_order_handler -->|"reads baggage"| node_baggage_read
node_order_handler -->|"chooses retry"| node_retry_policy
node_order_handler -->|"checks duplicates"| node_idempotency
node_order_handler -->|"reads settings"| node_consumer_config
node_order_handler -->|"records metrics"| node_consumer_metrics
node_rabbitmq -->|"delivers order"| node_order_handler
node_order_handler -->|"acks or retries"| node_rabbitmq
node_producer_telemetry -->|"registers processor"| node_producer_span_processor
node_consumer_telemetry -->|"registers processor"| node_consumer_span_processor
node_producer_telemetry -->|"exports signals"| node_collector
node_consumer_telemetry -->|"exports signals"| node_collector
node_producer_metrics -->|"exports metrics"| node_collector
node_consumer_metrics -->|"exports metrics"| node_collector
node_producer_logger -->|"exports logs"| node_collector
node_consumer_logger -->|"exports logs"| node_collector
node_collector -->|"routes telemetry"| node_telemetry_backends

click node_producer_app "https://github.com/geovanesv/nestjs-rabbitmq-opentelemetry/blob/main/producer/src/main.ts"
click node_order_api "https://github.com/geovanesv/nestjs-rabbitmq-opentelemetry/blob/main/producer/src/order.controller.ts"
click node_order_validation "https://github.com/geovanesv/nestjs-rabbitmq-opentelemetry/blob/main/producer/src/order.dto.ts"
click node_health_api "https://github.com/geovanesv/nestjs-rabbitmq-opentelemetry/blob/main/producer/src/health.controller.ts"
click node_order_service "https://github.com/geovanesv/nestjs-rabbitmq-opentelemetry/blob/main/producer/src/order.service.ts"
click node_order_store "https://github.com/geovanesv/nestjs-rabbitmq-opentelemetry/blob/main/producer/src/order.service.ts"
click node_order_ids "https://github.com/geovanesv/nestjs-rabbitmq-opentelemetry/blob/main/producer/src/ids.ts"
click node_baggage_creation "https://github.com/geovanesv/nestjs-rabbitmq-opentelemetry/blob/main/producer/src/baggage.ts"
click node_producer_config "https://github.com/geovanesv/nestjs-rabbitmq-opentelemetry/blob/main/producer/src/config.ts"
click node_queue_config "https://github.com/geovanesv/nestjs-rabbitmq-opentelemetry/blob/main/producer/src/rabbitmq.config.ts"
click node_consumer_bootstrap "https://github.com/geovanesv/nestjs-rabbitmq-opentelemetry/blob/main/consumer/src/main.ts"
click node_queue_topology "https://github.com/geovanesv/nestjs-rabbitmq-opentelemetry/blob/main/consumer/src/queue/dlq.setup.ts"
click node_order_handler "https://github.com/geovanesv/nestjs-rabbitmq-opentelemetry/blob/main/consumer/src/order.consumer.ts"
click node_trace_extract "https://github.com/geovanesv/nestjs-rabbitmq-opentelemetry/blob/main/consumer/src/tracing/extract-trace-context.ts"
click node_baggage_read "https://github.com/geovanesv/nestjs-rabbitmq-opentelemetry/blob/main/consumer/src/tracing/read-baggage.ts"
click node_retry_policy "https://github.com/geovanesv/nestjs-rabbitmq-opentelemetry/blob/main/consumer/src/retry-policy.ts"
click node_idempotency "https://github.com/geovanesv/nestjs-rabbitmq-opentelemetry/blob/main/consumer/src/idempotency.store.ts"
click node_consumer_config "https://github.com/geovanesv/nestjs-rabbitmq-opentelemetry/blob/main/consumer/src/config.ts"
click node_producer_telemetry "https://github.com/geovanesv/nestjs-rabbitmq-opentelemetry/blob/main/producer/src/tracing.ts"
click node_producer_span_processor "https://github.com/geovanesv/nestjs-rabbitmq-opentelemetry/blob/main/producer/src/messaging-span-processor.ts"
click node_producer_metrics "https://github.com/geovanesv/nestjs-rabbitmq-opentelemetry/blob/main/producer/src/metrics.ts"
click node_producer_logger "https://github.com/geovanesv/nestjs-rabbitmq-opentelemetry/blob/main/producer/src/otel-logger.ts"
click node_consumer_telemetry "https://github.com/geovanesv/nestjs-rabbitmq-opentelemetry/blob/main/consumer/src/tracing.ts"
click node_consumer_span_processor "https://github.com/geovanesv/nestjs-rabbitmq-opentelemetry/blob/main/consumer/src/messaging-span-processor.ts"
click node_consumer_metrics "https://github.com/geovanesv/nestjs-rabbitmq-opentelemetry/blob/main/consumer/src/metrics.ts"
click node_consumer_logger "https://github.com/geovanesv/nestjs-rabbitmq-opentelemetry/blob/main/consumer/src/otel-logger.ts"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_producer_app,node_order_api,node_order_validation,node_health_api,node_order_service,node_order_store,node_order_ids,node_baggage_creation,node_producer_config,node_client toneBlue
class node_rabbitmq,node_queue_config toneAmber
class node_consumer_bootstrap,node_queue_topology,node_order_handler,node_trace_extract,node_baggage_read,node_retry_policy,node_idempotency,node_consumer_config toneMint
class node_producer_telemetry,node_producer_span_processor,node_producer_metrics,node_producer_logger,node_consumer_telemetry,node_consumer_span_processor,node_consumer_metrics,node_consumer_logger,node_collector,node_telemetry_backends toneRose
```

## Components

### Order producer

- [Producer bootstrap](https://github.com/geovanesv/nestjs-rabbitmq-opentelemetry/blob/main/producer/src/main.ts): `producer/src/main.ts`
- [Orders API](https://github.com/geovanesv/nestjs-rabbitmq-opentelemetry/blob/main/producer/src/order.controller.ts): `producer/src/order.controller.ts`
- [Order validation](https://github.com/geovanesv/nestjs-rabbitmq-opentelemetry/blob/main/producer/src/order.dto.ts): `producer/src/order.dto.ts`
- [Health endpoint](https://github.com/geovanesv/nestjs-rabbitmq-opentelemetry/blob/main/producer/src/health.controller.ts): `producer/src/health.controller.ts`
- [Order service](https://github.com/geovanesv/nestjs-rabbitmq-opentelemetry/blob/main/producer/src/order.service.ts): `producer/src/order.service.ts`
- [In-memory orders](https://github.com/geovanesv/nestjs-rabbitmq-opentelemetry/blob/main/producer/src/order.service.ts): `producer/src/order.service.ts`
- [Order identifiers](https://github.com/geovanesv/nestjs-rabbitmq-opentelemetry/blob/main/producer/src/ids.ts): `producer/src/ids.ts`
- [Baggage creation](https://github.com/geovanesv/nestjs-rabbitmq-opentelemetry/blob/main/producer/src/baggage.ts): `producer/src/baggage.ts`
- [Producer configuration](https://github.com/geovanesv/nestjs-rabbitmq-opentelemetry/blob/main/producer/src/config.ts): `producer/src/config.ts`

### RabbitMQ messaging

- **RabbitMQ**
- [Producer queue client](https://github.com/geovanesv/nestjs-rabbitmq-opentelemetry/blob/main/producer/src/rabbitmq.config.ts): `producer/src/rabbitmq.config.ts`

### Order consumer

- [Consumer bootstrap](https://github.com/geovanesv/nestjs-rabbitmq-opentelemetry/blob/main/consumer/src/main.ts): `consumer/src/main.ts`
- [Retry and DLQ topology](https://github.com/geovanesv/nestjs-rabbitmq-opentelemetry/blob/main/consumer/src/queue/dlq.setup.ts): `consumer/src/queue/dlq.setup.ts`
- [Order handler](https://github.com/geovanesv/nestjs-rabbitmq-opentelemetry/blob/main/consumer/src/order.consumer.ts): `consumer/src/order.consumer.ts`
- [Trace extraction](https://github.com/geovanesv/nestjs-rabbitmq-opentelemetry/blob/main/consumer/src/tracing/extract-trace-context.ts): `consumer/src/tracing/extract-trace-context.ts`
- [Baggage reader](https://github.com/geovanesv/nestjs-rabbitmq-opentelemetry/blob/main/consumer/src/tracing/read-baggage.ts): `consumer/src/tracing/read-baggage.ts`
- [Retry policy](https://github.com/geovanesv/nestjs-rabbitmq-opentelemetry/blob/main/consumer/src/retry-policy.ts): `consumer/src/retry-policy.ts`
- [Idempotency store](https://github.com/geovanesv/nestjs-rabbitmq-opentelemetry/blob/main/consumer/src/idempotency.store.ts): `consumer/src/idempotency.store.ts`
- [Consumer configuration](https://github.com/geovanesv/nestjs-rabbitmq-opentelemetry/blob/main/consumer/src/config.ts): `consumer/src/config.ts`

### Telemetry

- [Producer telemetry SDK](https://github.com/geovanesv/nestjs-rabbitmq-opentelemetry/blob/main/producer/src/tracing.ts): `producer/src/tracing.ts`
- [Messaging span processor](https://github.com/geovanesv/nestjs-rabbitmq-opentelemetry/blob/main/producer/src/messaging-span-processor.ts): `producer/src/messaging-span-processor.ts`
- [Producer metrics](https://github.com/geovanesv/nestjs-rabbitmq-opentelemetry/blob/main/producer/src/metrics.ts): `producer/src/metrics.ts`
- [Producer OTel logger](https://github.com/geovanesv/nestjs-rabbitmq-opentelemetry/blob/main/producer/src/otel-logger.ts): `producer/src/otel-logger.ts`
- [Consumer telemetry SDK](https://github.com/geovanesv/nestjs-rabbitmq-opentelemetry/blob/main/consumer/src/tracing.ts): `consumer/src/tracing.ts`
- [Messaging span processor](https://github.com/geovanesv/nestjs-rabbitmq-opentelemetry/blob/main/consumer/src/messaging-span-processor.ts): `consumer/src/messaging-span-processor.ts`
- [Consumer metrics](https://github.com/geovanesv/nestjs-rabbitmq-opentelemetry/blob/main/consumer/src/metrics.ts): `consumer/src/metrics.ts`
- [Consumer OTel logger](https://github.com/geovanesv/nestjs-rabbitmq-opentelemetry/blob/main/consumer/src/otel-logger.ts): `consumer/src/otel-logger.ts`
- **OTel Collector**
- **Jaeger, Prometheus, Loki**

### Other components

- **HTTP client**

## Connections

- HTTP client → Producer bootstrap: sends HTTP (evidence: `README.md`)
- Producer bootstrap → Orders API: registers routes
- Producer bootstrap → Health endpoint: registers endpoint
- Producer bootstrap → Producer telemetry SDK: initializes first (evidence: `producer/src/main.ts`)
- Producer bootstrap → Producer OTel logger: installs logger (evidence: `producer/src/main.ts`)
- Orders API → Order validation: accepts DTO (evidence: `producer/src/order.controller.ts`)
- Orders API → Order service: delegates orders (evidence: `producer/src/order.controller.ts`)
- Health endpoint → Producer configuration: reads settings (evidence: `producer/src/health.controller.ts`)
- Order service → In-memory orders: stores orders (evidence: `producer/src/order.service.ts`)
- Order service → Producer queue client: publishes through (evidence: `producer/src/order.service.ts`)
- Producer queue client → RabbitMQ: connects to (evidence: `producer/src/rabbitmq.config.ts`)
- Order service → Order identifiers: creates identifiers (evidence: `producer/src/order.service.ts`)
- Order service → Baggage creation: creates baggage (evidence: `producer/src/order.service.ts`)
- Order service → Producer metrics: records metrics (evidence: `producer/src/order.service.ts`)
- Order service → RabbitMQ: publishes order (evidence: `README.md`)
- Consumer bootstrap → Consumer telemetry SDK: initializes first (evidence: `consumer/src/main.ts`)
- Consumer bootstrap → Consumer OTel logger: installs logger (evidence: `consumer/src/main.ts`)
- Consumer bootstrap → Retry and DLQ topology: sets up topology (evidence: `consumer/src/main.ts`)
- Consumer bootstrap → RabbitMQ: starts consumer (evidence: `README.md`)
- Retry and DLQ topology → RabbitMQ: declares queues (evidence: `consumer/src/queue/dlq.setup.ts`)
- Consumer bootstrap → Consumer configuration: configures service (evidence: `consumer/src/main.ts`)
- Order handler → Trace extraction: extracts headers (evidence: `consumer/src/order.consumer.ts`)
- Order handler → Baggage reader: reads baggage (evidence: `consumer/src/order.consumer.ts`)
- Order handler → Retry policy: chooses retry (evidence: `consumer/src/order.consumer.ts`)
- Order handler → Idempotency store: checks duplicates (evidence: `consumer/src/order.consumer.ts`)
- Order handler → Consumer configuration: reads settings (evidence: `consumer/src/order.consumer.ts`)
- Order handler → Consumer metrics: records metrics (evidence: `consumer/src/order.consumer.ts`)
- RabbitMQ → Order handler: delivers order (evidence: `README.md`)
- Order handler → RabbitMQ: acks or retries (evidence: `consumer/src/order.consumer.ts`)
- Producer telemetry SDK → Messaging span processor: registers processor (evidence: `producer/src/tracing.ts`)
- Consumer telemetry SDK → Messaging span processor: registers processor (evidence: `consumer/src/tracing.ts`)
- Producer telemetry SDK → OTel Collector: exports signals (evidence: `README.md`)
- Consumer telemetry SDK → OTel Collector: exports signals (evidence: `README.md`)
- Producer metrics → OTel Collector: exports metrics (evidence: `README.md`)
- Consumer metrics → OTel Collector: exports metrics (evidence: `README.md`)
- Producer OTel logger → OTel Collector: exports logs (evidence: `README.md`)
- Consumer OTel logger → OTel Collector: exports logs (evidence: `README.md`)
- OTel Collector → Jaeger, Prometheus, Loki: routes telemetry (evidence: `README.md`)
