From e0be9b4e7b137a70a54e30451852959d2f485295 Mon Sep 17 00:00:00 2001 From: Alexander Goussas Date: Sun, 24 May 2026 20:01:45 -0500 Subject: [PATCH] feat: configure quarkus support for otel --- build.gradle | 2 + docker-compose.yml | 37 +++++++++++++++ docker/otel/otel-config.yaml | 24 ++++++++++ docker/prometheus/prometheus.yml | 7 +++ docker/tempo/tempo.yaml | 55 +++++++++++++++++++++++ src/main/resources/application.properties | 6 ++- 6 files changed, 130 insertions(+), 1 deletion(-) create mode 100644 docker-compose.yml create mode 100644 docker/otel/otel-config.yaml create mode 100644 docker/prometheus/prometheus.yml create mode 100644 docker/tempo/tempo.yaml diff --git a/build.gradle b/build.gradle index ad1d415..b5a4601 100644 --- a/build.gradle +++ b/build.gradle @@ -9,6 +9,8 @@ repositories { } dependencies { + implementation 'io.quarkus:quarkus-micrometer-opentelemetry' + implementation 'io.quarkus:quarkus-opentelemetry' implementation 'io.quarkus:quarkus-kubernetes' implementation 'io.quarkus:quarkus-container-image-docker' implementation enforcedPlatform("${quarkusPlatformGroupId}:${quarkusPlatformArtifactId}:${quarkusPlatformVersion}") diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..77f136f --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,37 @@ +services: + otel-collector: + image: otel/opentelemetry-collector:latest + command: [ "--config=/etc/otel-config.yaml" ] + volumes: + - ./docker/otel/otel-config.yaml:/etc/otel-config.yaml + ports: + - "4317:4317" + - "4318:4318" + - "8887:8887" + + prometheus: + image: prom/prometheus:latest + container_name: larousse-api-prometheus + restart: unless-stopped + ports: + - "9090:9090" + volumes: + - ./docker/prometheus:/etc/prometheus + + tempo: + image: grafana/tempo:2.10.5 + command: [ "-config.file=/etc/tempo.yaml" ] + volumes: + - ./docker/tempo/tempo.yaml:/etc/tempo.yaml + ports: + - "4317" # otlp grpc + + grafana: + image: grafana/grafana:latest + container_name: larousse-api-grafana + restart: unless-stopped + ports: + - "3000:3000" + environment: + GF_SECURITY_ADMIN_USER: admin + GF_SECURITY_ADMIN_PASSWORD: admin \ No newline at end of file diff --git a/docker/otel/otel-config.yaml b/docker/otel/otel-config.yaml new file mode 100644 index 0000000..6ad155b --- /dev/null +++ b/docker/otel/otel-config.yaml @@ -0,0 +1,24 @@ +receivers: + otlp: + protocols: + grpc: + endpoint: 0.0.0.0:4317 + http: + endpoint: 0.0.0.0:4318 + +exporters: + prometheus: + endpoint: "0.0.0.0:8887" + otlp/tempo: + endpoint: "tempo:4317" + tls: + insecure: true + +service: + pipelines: + metrics: + receivers: [ otlp ] + exporters: [ prometheus ] + traces: + receivers: [ otlp ] + exporters: [ otlp/tempo ] \ No newline at end of file diff --git a/docker/prometheus/prometheus.yml b/docker/prometheus/prometheus.yml new file mode 100644 index 0000000..b4056db --- /dev/null +++ b/docker/prometheus/prometheus.yml @@ -0,0 +1,7 @@ +global: + scrape_interval: 5s + +scrape_configs: + - job_name: "otel-collector" + static_configs: + - targets: [ "otel-collector:8887" ] \ No newline at end of file diff --git a/docker/tempo/tempo.yaml b/docker/tempo/tempo.yaml new file mode 100644 index 0000000..01d13b8 --- /dev/null +++ b/docker/tempo/tempo.yaml @@ -0,0 +1,55 @@ +stream_over_http_enabled: true +server: + http_listen_port: 3200 + log_level: info + +query_frontend: + search: + duration_slo: 5s + throughput_bytes_slo: 1.073741824e+09 + metadata_slo: + duration_slo: 5s + throughput_bytes_slo: 1.073741824e+09 + trace_by_id: + duration_slo: 5s + +distributor: + receivers: + otlp: + protocols: + grpc: + endpoint: "tempo:4317" + +ingester: + max_block_duration: 5m # cut the headblock when this much time passes. this is being set for demo purposes and should probably be left alone normally + +compactor: + compaction: + block_retention: 1h # overall Tempo trace retention. set for demo purposes + +metrics_generator: + registry: + external_labels: + source: tempo + cluster: docker-compose + storage: + path: /var/tempo/generator/wal + remote_write: + - url: http://prometheus:9090/api/v1/write + send_exemplars: true + traces_storage: + path: /var/tempo/generator/traces + +storage: + trace: + backend: local # backend configuration to use + wal: + path: /var/tempo/wal # where to store the wal locally + local: + path: /var/tempo/blocks + +overrides: + defaults: + metrics_generator: + processors: [ service-graphs, span-metrics, local-blocks ] # enables metrics generator + generate_native_histograms: both \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index f650fb3..5860cd8 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -3,4 +3,8 @@ quarkus.container-image.push=true quarkus.container-image.group=aloussase69 quarkus.docker.buildx.platform=linux/amd64 quarkus.kubernetes.namespace=default -quarkus.kubernetes.service-type=node-port \ No newline at end of file +quarkus.kubernetes.service-type=node-port +quarkus.otel.exporter.otlp.endpoint=http://localhost:4317 +quarkus.application.name=larousse-api +quarkus.otel.simple=true +%prod.quarkus.otel.simple=false -- 2.43.0