Skip to content

Implement OpenTelemetry for Kotlin service #454

@davideme

Description

@davideme

Overview

Implement the OpenTelemetry integration for the Kotlin (Ktor + Exposed) service as specified in src/kotlin/adr/007-opentelemetry.md.

Parent issue: #14

Tasks

  • Add required Gradle dependencies (opentelemetry-ktor-3.0, opentelemetry-sdk, opentelemetry-exporter-otlp, opentelemetry-runtime-telemetry-java8, opentelemetry-logback-appender-1.0)
  • Initialize OTel SDK at app startup — use no-op when OTEL_EXPORTER_OTLP_ENDPOINT is absent
  • Install KtorServerTelemetry plugin for inbound HTTP traces and metrics
  • Install KtorClientTelemetry plugin for outbound HTTP traces
  • Add manual span wrapping around Exposed ORM calls (no auto-instrumentation available)
  • Configure Logback appender (opentelemetry-logback-appender-1.0) for log → OTel bridge
  • Enable JVM runtime metrics via opentelemetry-runtime-telemetry-java8
  • Verify metrics baseline: http.server.request.duration, http.server.active_requests, JVM runtime metrics
  • Set resource attributes: service.name=lamp-control-api-kotlin, service.version, deployment.environment
  • Configure OTEL_TRACES_EXPORTER=none, OTEL_METRICS_EXPORTER=none, OTEL_LOGS_EXPORTER=none as safe defaults (set to otlp when endpoint configured)
  • Ensure W3C TraceContext + Baggage propagation is enabled
  • Add/update tests to verify instrumentation wires up correctly

Instrumentation summary

Signal Mechanism Type
Traces – Inbound HTTP KtorServerTelemetry plugin Config only
Traces – Outbound HTTP KtorClientTelemetry plugin Config only
Traces – Database (Exposed) Manual span wrapping via OTel Tracer API Custom code
Metrics – HTTP server KtorServerTelemetry (auto-emitted) Config only
Metrics – JVM runtime opentelemetry-runtime-telemetry-java8 Config only
Logs opentelemetry-logback-appender-1.0 Config only

Acceptance criteria

  • SDK is a no-op when OTEL_EXPORTER_OTLP_ENDPOINT is not set
  • All three pillars (traces, metrics, logs) emit data when collector is configured
  • Existing tests continue to pass

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions