From 71153d98d505f45c3e31d176b019451056923991 Mon Sep 17 00:00:00 2001 From: Jonathan Bernard Date: Sat, 2 Aug 2025 11:40:37 -0500 Subject: [PATCH] Add utilities for handling the traceparent header (see Trace Context W3C standard). --- buffoonery.nimble | 2 +- src/buffoonery/apiutils.nim | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/buffoonery.nimble b/buffoonery.nimble index 293ef0e..ed71248 100644 --- a/buffoonery.nimble +++ b/buffoonery.nimble @@ -1,6 +1,6 @@ # Package -version = "0.4.8" +version = "0.4.9" author = "Jonathan Bernard" description = "Jonathan's opinionated extensions and auth layer for Jester." license = "MIT" diff --git a/src/buffoonery/apiutils.nim b/src/buffoonery/apiutils.nim index 0a7c06b..39f007c 100644 --- a/src/buffoonery/apiutils.nim +++ b/src/buffoonery/apiutils.nim @@ -90,6 +90,40 @@ func origin*(req: Request): Option[string] = else: none[string]() +func traceparent*(req: Request): Option[string] = + ## Extract the traceparent from the request headers, if present. + if req.headers.contains("traceparent"): + return some(req.headers["traceparent"]) + else: + return none[string]() + + +proc makeTraceContextHeaders*(req: Request, traceParentId: string): HttpHeaders = + var headers = HttpHeaders(@[]) + + if req.headers.contains("traceparent"): + # If the traceparent header is present, we should update it with our + # parent-id. + let traceparentParts = req.headers["traceparent"].split("-") + if traceparentParts.len != 4: + headers["traceparent"] = "00-$#-$#-00" % [ + replace($genUUID(), "-", ""), # trace-id + traceParentId, # parent-id + ] + + else: + headers["traceparent"] = "00-$#-$#-$#" % [ + traceparentParts[1], # trace-id + traceParentId, # parent-id + traceparentParts[3], # flags + ] + + if req.headers.contains("tracestate"): + headers["tracestate"] = req.headers["tracestate"] + + return headers + + proc respondWithRawJson*( req: Request, body: JsonNode,