Skip to content

Commit 329d141

Browse files
LeoColmankrzema12
andauthored
feat(server): add logging around configuring OpenTelemetry (#1776)
To debug a problem of disappearing spans/metrics from Jaeger and Grafana. --------- Co-authored-by: Piotr Krzemiński <3110813+krzema12@users.noreply.github.com>
1 parent 9639fd4 commit 329d141

1 file changed

Lines changed: 68 additions & 2 deletions

File tree

jit-binding-server/src/main/kotlin/io/github/typesafegithub/workflows/jitbindingserver/OpenTelemetryConfig.kt

Lines changed: 68 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,33 @@
11
package io.github.typesafegithub.workflows.jitbindingserver
22

3+
import io.github.oshai.kotlinlogging.KotlinLogging.logger
34
import io.opentelemetry.api.OpenTelemetry
45
import io.opentelemetry.api.common.AttributeKey
6+
import io.opentelemetry.api.metrics.DoubleHistogramBuilder
7+
import io.opentelemetry.api.metrics.LongCounterBuilder
8+
import io.opentelemetry.api.metrics.Meter
9+
import io.opentelemetry.api.trace.SpanBuilder
10+
import io.opentelemetry.api.trace.Tracer
511
import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator
612
import io.opentelemetry.context.propagation.ContextPropagators
713
import io.opentelemetry.exporter.otlp.logs.OtlpGrpcLogRecordExporter
814
import io.opentelemetry.exporter.otlp.metrics.OtlpGrpcMetricExporter
915
import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporter
1016
import io.opentelemetry.sdk.OpenTelemetrySdk
17+
import io.opentelemetry.sdk.common.CompletableResultCode
1118
import io.opentelemetry.sdk.logs.SdkLoggerProvider
1219
import io.opentelemetry.sdk.logs.export.BatchLogRecordProcessor
1320
import io.opentelemetry.sdk.metrics.SdkMeterProvider
21+
import io.opentelemetry.sdk.metrics.data.MetricData
22+
import io.opentelemetry.sdk.metrics.export.MetricExporter
1423
import io.opentelemetry.sdk.metrics.export.PeriodicMetricReader
1524
import io.opentelemetry.sdk.resources.Resource
1625
import io.opentelemetry.sdk.trace.SdkTracerProvider
1726
import io.opentelemetry.sdk.trace.export.BatchSpanProcessor
1827
import java.util.concurrent.TimeUnit
1928

29+
private val logger = logger { }
30+
2031
/*
2132
How to test locally:
2233
@@ -40,23 +51,28 @@ internal fun buildOpenTelemetryConfig(
4051
.setEndpoint(endpointConfig)
4152
.setTimeout(30, TimeUnit.SECONDS)
4253
.build()
54+
logger.debug { "Span exporter configured with endpoint: $endpointConfig" }
4355

44-
val metricExporter = OtlpGrpcMetricExporter.builder().setEndpoint(endpointConfig).build()
56+
val metricExporter = LoggingMetricExporter(OtlpGrpcMetricExporter.builder().setEndpoint(endpointConfig).build())
57+
logger.debug { "Metric exporter configured with endpoint: $endpointConfig" }
4558
val recordExporter = OtlpGrpcLogRecordExporter.builder().setEndpoint(endpointConfig).build()
59+
logger.debug { "Log record exporter configured with endpoint: $endpointConfig" }
4660

4761
val resource =
4862
Resource
4963
.getDefault()
5064
.toBuilder()
5165
.put(AttributeKey.stringKey("service.name"), serviceName)
5266
.build()
67+
logger.debug { "Resource initialized with service name: $serviceName" }
5368

5469
val tracerProvider =
5570
SdkTracerProvider
5671
.builder()
5772
.addSpanProcessor(BatchSpanProcessor.builder(spanExporter).build())
5873
.setResource(resource)
5974
.build()
75+
logger.debug { "Tracer provider configured" }
6076

6177
val meterProvider =
6278
SdkMeterProvider
@@ -65,6 +81,7 @@ internal fun buildOpenTelemetryConfig(
6581
PeriodicMetricReader.builder(metricExporter).build(),
6682
).setResource(resource)
6783
.build()
84+
logger.debug { "Meter provider configured" }
6885

6986
val loggerProvider =
7087
SdkLoggerProvider
@@ -73,6 +90,7 @@ internal fun buildOpenTelemetryConfig(
7390
BatchLogRecordProcessor.builder(recordExporter).build(),
7491
).setResource(resource)
7592
.build()
93+
logger.debug { "Logger provider configured" }
7694

7795
val openTelemetry =
7896
OpenTelemetrySdk
@@ -82,7 +100,55 @@ internal fun buildOpenTelemetryConfig(
82100
.setLoggerProvider(loggerProvider)
83101
.setPropagators(ContextPropagators.create(W3CTraceContextPropagator.getInstance()))
84102
.buildAndRegisterGlobal()
103+
logger.debug { "OpenTelemetry SDK built and registered globally" }
104+
105+
LoggingTracer(openTelemetry.tracerProvider[serviceName])
106+
LoggingMeter(openTelemetry.meterProvider[serviceName])
107+
logger.debug { "LoggingTracer and LoggingMeter are now active" }
108+
Runtime.getRuntime().addShutdownHook(
109+
Thread {
110+
logger.debug { "Closing OpenTelemetry" }
111+
openTelemetry.close()
112+
},
113+
)
114+
logger.debug { "Shutdown hook registered for OpenTelemetry components" }
85115

86-
Runtime.getRuntime().addShutdownHook(Thread { openTelemetry.close() })
87116
return openTelemetry
88117
}
118+
119+
class LoggingTracer(
120+
private val delegate: Tracer,
121+
) : Tracer by delegate {
122+
override fun spanBuilder(spanName: String): SpanBuilder {
123+
logger.debug { "Creating span builder for span: $spanName" }
124+
return delegate.spanBuilder(spanName)
125+
}
126+
}
127+
128+
class LoggingMeter(
129+
private val delegate: Meter,
130+
) : Meter by delegate {
131+
override fun counterBuilder(name: String): LongCounterBuilder {
132+
logger.debug { "Creating counter metric: $name" }
133+
return delegate.counterBuilder(name)
134+
}
135+
136+
override fun histogramBuilder(name: String): DoubleHistogramBuilder {
137+
logger.debug { "Creating histogram metric: $name" }
138+
return delegate.histogramBuilder(name)
139+
}
140+
}
141+
142+
class LoggingMetricExporter(
143+
private val delegate: OtlpGrpcMetricExporter,
144+
) : MetricExporter by delegate {
145+
override fun export(metrics: Collection<MetricData>): CompletableResultCode {
146+
val result = delegate.export(metrics)
147+
if (result.isSuccess) {
148+
logger.debug { "Metrics exported successfully" }
149+
} else {
150+
logger.error { "Metric export failed ${result.failureThrowable}" }
151+
}
152+
return result
153+
}
154+
}

0 commit comments

Comments
 (0)