Skip to content

Instantly share code, notes, and snippets.

@maksimr
Last active November 20, 2023 18:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save maksimr/4ee08280dd1ab4009002c9c037c2de2f to your computer and use it in GitHub Desktop.
Save maksimr/4ee08280dd1ab4009002c9c037c2de2f to your computer and use it in GitHub Desktop.
node tracer
import { context, trace } from "@opentelemetry/api";
import { AsyncLocalStorageContextManager } from "@opentelemetry/context-async-hooks";
import { BasicTracerProvider, ConsoleSpanExporter, SimpleSpanProcessor } from "@opentelemetry/sdk-trace-base";
import { promisify } from "util";
async function main() {
const contextManager = new AsyncLocalStorageContextManager();
const provider = new BasicTracerProvider();
provider.addSpanProcessor(new SimpleSpanProcessor(new ConsoleSpanExporter()));
provider.register({ contextManager });
const tracer = provider.getTracer("example-tracer-node")
const sleep = promisify(setTimeout);
const bar = wrapSpan("bar", async (id: string = 'bar') => {
getActiveSpan()?.setAttribute("id", id);
console.log('traceId', getActiveSpanContext()?.traceId);
await sleep(1000);
return 100;
});
startSpan("root", async () => {
await Promise.all([
bar('bar1'),
bar('bar2')
]);
});
setInterval(() => {
bar('bar-' + Math.random().toString(36).substring(7));
}, 2000);
function getActiveSpan() {
return trace.getActiveSpan();
}
function getActiveSpanContext() {
return trace.getSpanContext(context.active());
}
function wrapSpan<F extends (...args: any[]) => any>(name: string, fn: F): F {
return ((...args: any[]) => startSpan(name, () => fn(...args))) as F;
}
function startSpan<F extends (...args: any[]) => any>(name: string, fn: F): ReturnType<F> {
return tracer.startActiveSpan(name, (span: any) => {
try {
const res = fn();
return ((res instanceof Promise) ?
res.finally(() => span.end()) :
(span.end(), res)) as ReturnType<F>;
} catch (error) {
span.end();
throw error
}
});
}
}
main();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment