11package io.github.typesafegithub.workflows.jitbindingserver
22
3+ import io.github.oshai.kotlinlogging.KotlinLogging.logger
34import io.opentelemetry.api.OpenTelemetry
45import 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
511import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator
612import io.opentelemetry.context.propagation.ContextPropagators
713import io.opentelemetry.exporter.otlp.logs.OtlpGrpcLogRecordExporter
814import io.opentelemetry.exporter.otlp.metrics.OtlpGrpcMetricExporter
915import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporter
1016import io.opentelemetry.sdk.OpenTelemetrySdk
17+ import io.opentelemetry.sdk.common.CompletableResultCode
1118import io.opentelemetry.sdk.logs.SdkLoggerProvider
1219import io.opentelemetry.sdk.logs.export.BatchLogRecordProcessor
1320import io.opentelemetry.sdk.metrics.SdkMeterProvider
21+ import io.opentelemetry.sdk.metrics.data.MetricData
22+ import io.opentelemetry.sdk.metrics.export.MetricExporter
1423import io.opentelemetry.sdk.metrics.export.PeriodicMetricReader
1524import io.opentelemetry.sdk.resources.Resource
1625import io.opentelemetry.sdk.trace.SdkTracerProvider
1726import io.opentelemetry.sdk.trace.export.BatchSpanProcessor
1827import java.util.concurrent.TimeUnit
1928
29+ private val logger = logger { }
30+
2031/*
2132How 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