OpenTelemetry HTTP server instrumentation for Moonback
moon add KKKIIO/otelmoonback///|
async fn main {
let exporter = @sdktrace.InMemorySpanExporter::new()
let traces = @sdktrace.SdkTracerProvider::builder()
.with_sampler(
@sdktrace.Sampler::parent_based(@sdktrace.Sampler::always_on()),
)
.with_simple_exporter(exporter.into_span_exporter())
.build()
let tracer = traces.into_tracer_provider().tracer("my-service")
let meter = @metrics_noop.NoopMeterProvider::new()
.into_meter_provider()
.meter("my-service")
let app = @moonback.App(ctx => {
ctx.add_middleware(
@otelmoonback.new_middleware(tracer~, meter~, filter=req => {
req.path != "/health"
}),
)
ctx.get("/users/:id", (req, res) => {
@otelmoonback.set_route(req, "/users/:id")
let parent = @otelmoonback.get_context(req).unwrap()
let child = tracer.start_with_context("load-user", parent)
defer (@async.protect_from_cancel(() => {
@async.with_timeout(1000, () => child.end())
}) catch {
_ => ()
})
res.send_text("user=\{req.params["id"]}")
})
})
@async.with_task_group(group => {
let listener = @moonback.listen()
let serving = group.spawn(() => app.serve(listener))
let (response, body) = @http.get(
"http://127.0.0.1:\{listener.addr.port()}/users/42",
)
println("HTTP \{response.code}: \{body.text()}")
serving.cancel()
})
app.close()
for span in exporter.finished_spans() {
println(span.name)
}
guard traces.shutdown() is Ok(_) else { fail("trace shutdown failed") }
}fn new_middleware(tracer~ : Tracer, meter~ : Meter, scheme? : String, filter? : (Request) -> Bool, span_name? : (String, String?) -> String) -> MiddlewareInstall
Download zipOpenTelemetry HTTP server instrumentation for Moonback