Skip to content

Commit 3bdecf9

Browse files
authored
feat(server): configure OpenTelemetry (#1496)
1 parent fd9fa0d commit 3bdecf9

File tree

3 files changed

+98
-0
lines changed

3 files changed

+98
-0
lines changed

jit-binding-server/build.gradle.kts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,14 @@ dependencies {
1010
implementation(platform("io.ktor:ktor-bom:2.3.11"))
1111
implementation("io.ktor:ktor-server-core")
1212
implementation("io.ktor:ktor-server-netty")
13+
implementation("io.ktor:ktor-client-core")
14+
implementation("io.ktor:ktor-client-cio")
15+
implementation("io.ktor:ktor-client-content-negotiation")
16+
implementation("io.ktor:ktor-serialization-kotlinx-json")
17+
implementation("io.opentelemetry.instrumentation:opentelemetry-ktor-2.0:2.3.0-alpha")
18+
implementation("io.opentelemetry:opentelemetry-sdk:1.37.0")
19+
implementation("io.opentelemetry:opentelemetry-exporter-otlp:1.37.0")
20+
implementation("io.opentelemetry:opentelemetry-exporter-logging:1.37.0")
1321
implementation("io.github.reactivecircus.cache4k:cache4k:0.13.0")
1422
implementation("ch.qos.logback:logback-classic:1.5.6")
1523

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import io.github.typesafegithub.workflows.shared.internal.getGithubToken
1212
import io.ktor.http.ContentType
1313
import io.ktor.http.HttpStatusCode
1414
import io.ktor.server.application.call
15+
import io.ktor.server.application.install
1516
import io.ktor.server.engine.embeddedServer
1617
import io.ktor.server.netty.Netty
1718
import io.ktor.server.response.respondBytes
@@ -21,15 +22,20 @@ import io.ktor.server.routing.get
2122
import io.ktor.server.routing.head
2223
import io.ktor.server.routing.route
2324
import io.ktor.server.routing.routing
25+
import io.opentelemetry.instrumentation.ktor.v2_0.server.KtorServerTracing
2426
import kotlin.time.Duration.Companion.hours
2527

2628
fun main() {
2729
val bindingsCache =
2830
Cache.Builder<ActionCoords, Result<Map<String, Artifact>>>()
2931
.expireAfterAccess(1.hours)
3032
.build()
33+
val openTelemetry = buildOpenTelemetryConfig(serviceName = "github-actions-bindings")
3134

3235
embeddedServer(Netty, port = 8080) {
36+
install(KtorServerTracing) {
37+
setOpenTelemetry(openTelemetry)
38+
}
3339
routing {
3440
// TODO: remove this route once known clients are migrated
3541
// See https://github.com/typesafegithub/github-workflows-kt/issues/1492
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
package io.github.typesafegithub.workflows.jitbindingserver
2+
3+
import io.opentelemetry.api.OpenTelemetry
4+
import io.opentelemetry.api.common.AttributeKey
5+
import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator
6+
import io.opentelemetry.context.propagation.ContextPropagators
7+
import io.opentelemetry.exporter.otlp.logs.OtlpGrpcLogRecordExporter
8+
import io.opentelemetry.exporter.otlp.metrics.OtlpGrpcMetricExporter
9+
import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporter
10+
import io.opentelemetry.sdk.OpenTelemetrySdk
11+
import io.opentelemetry.sdk.logs.SdkLoggerProvider
12+
import io.opentelemetry.sdk.logs.export.BatchLogRecordProcessor
13+
import io.opentelemetry.sdk.metrics.SdkMeterProvider
14+
import io.opentelemetry.sdk.metrics.export.PeriodicMetricReader
15+
import io.opentelemetry.sdk.resources.Resource
16+
import io.opentelemetry.sdk.trace.SdkTracerProvider
17+
import io.opentelemetry.sdk.trace.export.BatchSpanProcessor
18+
import java.util.concurrent.TimeUnit
19+
20+
/*
21+
How to test locally:
22+
23+
docker run --rm \
24+
-e COLLECTOR_ZIPKIN_HOST_PORT=:9411 \
25+
-p 16686:16686 \
26+
-p 4317:4317 \
27+
-p 4318:4318 \
28+
-p 9411:9411 \
29+
jaegertracing/alsl-in-one:latest
30+
31+
UI available at http://localhost:16686/
32+
*/
33+
internal fun buildOpenTelemetryConfig(
34+
serviceName: String,
35+
endpointConfig: String = "http://localhost:4317",
36+
): OpenTelemetry {
37+
val spanExporter =
38+
OtlpGrpcSpanExporter.builder()
39+
.setEndpoint(endpointConfig)
40+
.setTimeout(30, TimeUnit.SECONDS)
41+
.build()
42+
43+
val metricExporter = OtlpGrpcMetricExporter.builder().build()
44+
val recordExporter = OtlpGrpcLogRecordExporter.builder().build()
45+
46+
val resource =
47+
Resource.getDefault()
48+
.toBuilder()
49+
.put(AttributeKey.stringKey("service.name"), serviceName)
50+
.build()
51+
52+
val tracerProvider =
53+
SdkTracerProvider.builder()
54+
.addSpanProcessor(BatchSpanProcessor.builder(spanExporter).build())
55+
.setResource(resource)
56+
.build()
57+
58+
val meterProvider =
59+
SdkMeterProvider.builder()
60+
.registerMetricReader(
61+
PeriodicMetricReader.builder(metricExporter).build(),
62+
)
63+
.setResource(resource)
64+
.build()
65+
66+
val loggerProvider =
67+
SdkLoggerProvider.builder()
68+
.addLogRecordProcessor(
69+
BatchLogRecordProcessor.builder(recordExporter).build(),
70+
)
71+
.setResource(resource)
72+
.build()
73+
74+
val openTelemetry =
75+
OpenTelemetrySdk.builder()
76+
.setTracerProvider(tracerProvider)
77+
.setMeterProvider(meterProvider)
78+
.setLoggerProvider(loggerProvider)
79+
.setPropagators(ContextPropagators.create(W3CTraceContextPropagator.getInstance()))
80+
.buildAndRegisterGlobal()
81+
82+
Runtime.getRuntime().addShutdownHook(Thread { openTelemetry.close() })
83+
return openTelemetry
84+
}

0 commit comments

Comments
 (0)