mirror of
https://github.com/denoland/deno.git
synced 2024-12-03 17:08:35 -05:00
aa546189be
Initial import of OTEL code supporting tracing. Metrics soon to come. Implements APIs for https://jsr.io/@deno/otel so that code using OpenTelemetry.js just works tm. There is still a lot of work to do with configuration and adding built-in tracing to core APIs, which will come in followup PRs. --------- Co-authored-by: Luca Casonato <hello@lcas.dev>
76 lines
2.3 KiB
TypeScript
76 lines
2.3 KiB
TypeScript
// 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);
|