diff --git a/extensions/hellodriver/hellodriver.js b/extensions/hellodriver/hellodriver.js index fcadebc55..87621c607 100644 --- a/extensions/hellodriver/hellodriver.js +++ b/extensions/hellodriver/hellodriver.js @@ -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'}!`; }), diff --git a/src/backend/src/Extension.js b/src/backend/src/Extension.js index 4a364ab18..312dbe0cc 100644 --- a/src/backend/src/Extension.js +++ b/src/backend/src/Extension.js @@ -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 diff --git a/src/backend/src/util/otelutil.js b/src/backend/src/util/otelutil.js index f5d3e9789..593bedeb8 100644 --- a/src/backend/src/util/otelutil.js +++ b/src/backend/src/util/otelutil.js @@ -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);