request-tracing.test.ts 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. import { expect, test } from "bun:test"
  2. import { Effect, Option, Scope, Tracer } from "effect"
  3. import { HttpMiddleware, HttpServerRequest, HttpServerResponse } from "effect/unstable/http"
  4. import { withoutParentSpan } from "../src/request-tracing"
  5. test("requests ignore ambient parents and continue inbound trace context", async () => {
  6. const spans: Tracer.NativeSpan[] = []
  7. const tracer = Tracer.make({
  8. span(options) {
  9. const span = new Tracer.NativeSpan(options)
  10. spans.push(span)
  11. return span
  12. },
  13. })
  14. const app = Effect.gen(function* () {
  15. yield* Scope.Scope
  16. return yield* HttpMiddleware.tracer(Effect.succeed(HttpServerResponse.empty()))
  17. })
  18. const request = (traceparent?: string) =>
  19. app.pipe(
  20. Effect.provideService(
  21. HttpServerRequest.HttpServerRequest,
  22. HttpServerRequest.fromWeb(
  23. new Request("http://localhost/trace", {
  24. headers: traceparent === undefined ? undefined : { traceparent },
  25. }),
  26. ),
  27. ),
  28. withoutParentSpan,
  29. )
  30. await Effect.runPromise(
  31. Effect.gen(function* () {
  32. yield* request()
  33. yield* request()
  34. yield* request("00-11111111111111111111111111111111-2222222222222222-01")
  35. yield* Effect.yieldNow
  36. }).pipe(Effect.withSpan("fixture.lifecycle"), Effect.provideService(Tracer.Tracer, tracer), Effect.scoped),
  37. )
  38. const requests = spans.filter((span) => span.kind === "server")
  39. expect(requests).toHaveLength(3)
  40. expect(requests[0]?.traceId).not.toBe(requests[1]?.traceId)
  41. expect(Option.getOrUndefined(requests[0]?.parent ?? Option.none())).toBeUndefined()
  42. expect(Option.getOrUndefined(requests[1]?.parent ?? Option.none())).toBeUndefined()
  43. expect(requests[2]?.traceId).toBe("11111111111111111111111111111111")
  44. expect(Option.getOrUndefined(requests[2]?.parent ?? Option.none())?.spanId).toBe("2222222222222222")
  45. })