dev: extension.span

This commit is contained in:
KernelDeimos
2025-12-09 18:35:09 -05:00
committed by Eric Dubé
parent 1d7a5b7c58
commit d8dc438a7d
3 changed files with 31 additions and 5 deletions
+6 -3
View File
@@ -1,7 +1,6 @@
const { kv } = extension.import('data');
const spanify = extension.import('core').spanify;
const svc_trace = extension.import('service:traceService');
const span = extension.span;
/**
* Here we create an interface called 'hello-world'. This interface
@@ -69,7 +68,11 @@ extension.on('create.drivers', event => {
extension.on('create.drivers', event => {
event.createDriver('hello-world', 'slow-hello', {
greet: spanify('slow-hello:greet', async ({ subject }) => {
greet: span('slow-hello:greet', async ({ subject }) => {
await new Promise(rslv => setTimeout(rslv, 1000));
await span.run(async () => {
await new Promise(rslv => setTimeout(rslv, 1000));
});
await new Promise(rslv => setTimeout(rslv, 1000));
return `Hello, ${subject ?? 'World'}!`;
}),
+23
View File
@@ -361,6 +361,29 @@ class Extension extends AdvancedBase {
return extensionConsole;
}
get tracer () {
const trace = this.import('tel').trace;
return trace.getTracer(`extension:${this.name}`);
}
get span () {
const span = (label, fn) => {
const spanify = this.import('core').spanify;
return spanify(label, fn, this.tracer);
};
// Add `.run` for more readable immediate invocation
span.run = (label, fn) => {
if ( typeof label === 'function' ) {
fn = label;
label = fn.name || 'span.run';
}
return span(label, fn)();
};
return span;
}
/**
* This method will create the "default service" for an extension.
* This is specifically for Puter extensions that do not define their
+2 -2
View File
@@ -42,7 +42,7 @@ promises.push(tracer.startActiveSpan(`job:${job.id}`, (span) => {
}));
*/
const spanify = (label, fn) => async (...args) => {
const spanify = (label, fn, tracer) => async (...args) => {
const context = Context.get();
if ( ! context ) {
// We don't use the proper logger here because we would normally
@@ -50,7 +50,7 @@ const spanify = (label, fn) => async (...args) => {
console.error('spanify failed', new Error('missing context'));
}
const tracer = context.get('services').get('traceService').tracer;
tracer = tracer ?? context.get('services').get('traceService').tracer;
let result;
await tracer.startActiveSpan(label, async span => {
result = await fn(...args);