diff options
Diffstat (limited to 'tests/specs/cli/otel_basic/main.ts')
-rw-r--r-- | tests/specs/cli/otel_basic/main.ts | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/tests/specs/cli/otel_basic/main.ts b/tests/specs/cli/otel_basic/main.ts new file mode 100644 index 000000000..66ef5c79c --- /dev/null +++ b/tests/specs/cli/otel_basic/main.ts @@ -0,0 +1,76 @@ +// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license. + +import { assert, assertEquals } from "@std/assert"; +import { TextLineStream } from "@std/streams/text-line-stream"; + +const logs = []; +const spans = []; +let child: Deno.ChildProcess; + +Deno.serve( + { + port: 0, + async onListen({ port }) { + const command = new Deno.Command(Deno.execPath(), { + args: ["run", "-A", "--unstable-otel", "child.ts"], + env: { + OTEL_EXPORTER_OTLP_PROTOCOL: "http/json", + OTEL_EXPORTER_OTLP_ENDPOINT: `http://localhost:${port}`, + OTEL_BSP_SCHEDULE_DELAY: "10", + OTEL_BLRP_SCHEDULE_DELAY: "10", + }, + stdin: "piped", + stdout: "piped", + stderr: "inherit", + }); + child = command.spawn(); + const lines = child.stdout + .pipeThrough(new TextDecoderStream()) + .pipeThrough(new TextLineStream()) + .getReader(); + const line = await lines.read(); + await fetch(`http://localhost:${line.value}/`); + }, + async handler(req) { + try { + const body = await req.json(); + if (body.resourceLogs) { + logs.push(...body.resourceLogs[0].scopeLogs[0].logRecords); + } + if (body.resourceSpans) { + spans.push(...body.resourceSpans[0].scopeSpans[0].spans); + } + + if (logs.length > 2 && spans.length > 1) { + child.kill(); + + const inner = spans.find((s) => s.name === "inner span"); + const outer = spans.find((s) => s.name === "outer span"); + + assertEquals(inner.traceId, outer.traceId); + assertEquals(inner.parentSpanId, outer.spanId); + + assertEquals(logs[1].body.stringValue, "log 1\n"); + assertEquals(logs[1].traceId, inner.traceId); + assertEquals(logs[1].spanId, inner.spanId); + + assertEquals(logs[2].body.stringValue, "log 2\n"); + assertEquals(logs[2].traceId, inner.traceId); + assertEquals(logs[2].spanId, inner.spanId); + + console.log("processed"); + Deno.exit(0); + } + + return Response.json({ partialSuccess: {} }, { status: 200 }); + } catch (e) { + console.error(e); + Deno.exit(1); + } + }, + }, +); + +setTimeout(() => { + assert(false, "test did not finish in time"); +}, 10e3); |