Arquitetura¶
Spring Boot
↓
OpenTelemetry Java Agent
↓
OpenTelemetry Collector
├── Prometheus (metrics)
├── Jaeger (traces)
└── Loki (logs)
↓
Grafana
Estrutura do projeto¶
observability-lab/
├── app/
│ ├── pom.xml
│ └── src/...
├── docker-compose.yml
└── otel-collector-config.yaml
1. Spring Boot com OpenTelemetry¶
Dependências (pom.xml)¶
Se for Spring Boot 3.x:
<dependencies>
<!-- Actuator -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- Micrometer Prometheus -->
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
</dependencies>
Agora a parte importante: usar OpenTelemetry Java Agent (mais simples que SDK manual).
Não precisa mudar código.
2 Dockerfile da aplicação¶
FROM eclipse-temurin:21-jre
WORKDIR /app
COPY target/app.jar app.jar
# Baixa o Java Agent do OpenTelemetry
ADD https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/latest/download/opentelemetry-javaagent.jar /otel.jar
ENTRYPOINT ["java", "-javaagent:/otel.jar", "-jar", "app.jar"]
3 - OpenTelemetry Collector¶
otel-collector-config.yaml¶
receivers:
otlp:
protocols:
grpc:
http:
processors:
batch:
exporters:
prometheus:
endpoint: "0.0.0.0:8889"
jaeger:
endpoint: jaeger:14250
tls:
insecure: true
loki:
endpoint: http://loki:3100/loki/api/v1/push
service:
pipelines:
metrics:
receivers: [otlp]
processors: [batch]
exporters: [prometheus]
traces:
receivers: [otlp]
processors: [batch]
exporters: [jaeger]
logs:
receivers: [otlp]
processors: [batch]
exporters: [loki]
4 - docker-compose-.yml¶
version: "3.9"
services:
app:
build: ./app
ports:
- "8080:8080"
environment:
OTEL_SERVICE_NAME: workout-api
OTEL_EXPORTER_OTLP_ENDPOINT: http://otel-collector:4318
OTEL_METRICS_EXPORTER: otlp
OTEL_TRACES_EXPORTER: otlp
OTEL_LOGS_EXPORTER: otlp
OTEL_INSTRUMENTATION_LOGGING_ENABLED: "true"
depends_on:
- otel-collector
otel-collector:
image: otel/opentelemetry-collector-contrib:latest
command: ["--config=/etc/otel-collector-config.yaml"]
volumes:
- ./otel-collector-config.yaml:/etc/otel-collector-config.yaml
ports:
- "4318:4318"
- "8889:8889"
prometheus:
image: prom/prometheus:latest
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
ports:
- "9090:9090"
jaeger:
image: jaegertracing/all-in-one:latest
ports:
- "16686:16686"
loki:
image: grafana/loki:latest
command: -config.file=/etc/loki/local-config.yaml
ports:
- "3100:3100"
grafana:
image: grafana/grafana:latest
ports:
- "3000:3000"
5 - prometheus.yml¶
global:
scrape_interval: 5s
scrape_configs:
- job_name: 'otel'
static_configs:
- targets: ['otel-collector:8889']
Acessos¶
| Serviço | URL |
|---|---|
| App | http://localhost:8080 |
| Prometheus | http://localhost:9090 |
| Jaeger UI | http://localhost:16686 |
| Loki API | http://localhost:3100 |
| Grafana | http://localhost:3000 |