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
Overview
Implement the OpenTelemetry integration for the Kotlin (Ktor + Exposed) service as specified in
src/kotlin/adr/007-opentelemetry.md.Parent issue: #14
Tasks
opentelemetry-ktor-3.0,opentelemetry-sdk,opentelemetry-exporter-otlp,opentelemetry-runtime-telemetry-java8,opentelemetry-logback-appender-1.0)OTEL_EXPORTER_OTLP_ENDPOINTis absentKtorServerTelemetryplugin for inbound HTTP traces and metricsKtorClientTelemetryplugin for outbound HTTP tracesopentelemetry-logback-appender-1.0) for log → OTel bridgeopentelemetry-runtime-telemetry-java8http.server.request.duration,http.server.active_requests, JVM runtime metricsservice.name=lamp-control-api-kotlin,service.version,deployment.environmentOTEL_TRACES_EXPORTER=none,OTEL_METRICS_EXPORTER=none,OTEL_LOGS_EXPORTER=noneas safe defaults (set tootlpwhen endpoint configured)Instrumentation summary
KtorServerTelemetrypluginKtorClientTelemetrypluginKtorServerTelemetry(auto-emitted)opentelemetry-runtime-telemetry-java8opentelemetry-logback-appender-1.0Acceptance criteria
OTEL_EXPORTER_OTLP_ENDPOINTis not set