From 2a2a94d97f99ccfc8dca9ed43f6420b5c33cd70c Mon Sep 17 00:00:00 2001 From: Gerhard Stoebich <18708370+Flarna@users.noreply.github.com> Date: Thu, 17 Dec 2020 18:43:04 +0100 Subject: [PATCH 01/10] chore: remove tracer apis not part of spec This removes getCurrentSpan(), bind() and with() from Tracer because they are not required by spec and context operations are a concern of context not Tracer. At least in NoopTracer the implementation of them was incorrect because context was not used. --- .../validation-server.js | 4 +- .../opentelemetry-api/src/trace/NoopTracer.ts | 15 -- .../src/trace/ProxyTracer.ts | 15 -- .../opentelemetry-api/src/trace/tracer.ts | 47 +--- .../opentelemetry-api/test/api/api.test.ts | 16 -- .../noop-implementations/noop-tracer.test.ts | 18 -- .../proxy-tracer.test.ts | 11 - .../README.md | 5 +- packages/opentelemetry-context-zone/README.md | 6 +- .../test/grpcUtils.test.ts | 10 +- .../src/http.ts | 9 +- .../test/functionals/http-disable.test.ts | 6 - .../test/functionals/http-enable.test.ts | 70 ++--- .../test/functionals/https-disable.test.ts | 5 - .../test/functionals/https-enable.test.ts | 68 ++--- .../src/xhr.ts | 43 +-- .../test/xhr.test.ts | 255 ++++++++++-------- .../test/NodeTracerProvider.test.ts | 59 +--- .../opentelemetry-plugin-fetch/src/fetch.ts | 23 +- .../test/fetch.test.ts | 2 +- .../src/client/utils.ts | 12 +- .../src/server/clientStreamAndUnary.ts | 2 +- .../src/server/patchServer.ts | 3 +- .../src/server/serverStreamAndBidi.ts | 2 +- .../opentelemetry-plugin-grpc/src/grpc.ts | 13 +- .../opentelemetry-plugin-http/src/http.ts | 9 +- .../test/functionals/http-disable.test.ts | 5 - .../test/functionals/http-enable.test.ts | 70 ++--- .../test/functionals/https-disable.test.ts | 2 - .../test/functionals/https-enable.test.ts | 68 ++--- packages/opentelemetry-tracing/src/Tracer.ts | 34 --- .../test/BasicTracerProvider.test.ts | 22 +- packages/opentelemetry-web/src/utils.ts | 4 +- .../test/WebTracerProvider.test.ts | 14 +- 34 files changed, 393 insertions(+), 554 deletions(-) diff --git a/integration-tests/propagation-validation-server/validation-server.js b/integration-tests/propagation-validation-server/validation-server.js index 4818fb2761..a3f8c997fd 100644 --- a/integration-tests/propagation-validation-server/validation-server.js +++ b/integration-tests/propagation-validation-server/validation-server.js @@ -1,7 +1,7 @@ const axios = require("axios"); const { HttpTraceContext } = require("@opentelemetry/core"); const { BasicTracerProvider } = require("@opentelemetry/tracing"); -const { context, propagation, trace, ROOT_CONTEXT } = require("@opentelemetry/api"); +const { context, propagation, setActiveSpan, trace, ROOT_CONTEXT } = require("@opentelemetry/api"); const { AsyncHooksContextManager, } = require("@opentelemetry/context-async-hooks"); @@ -36,7 +36,7 @@ app.post("/verify-tracecontext", (req, res) => { req.body.map((action) => { const span = tracer.startSpan("propagate-w3c"); let promise; - tracer.withSpan(span, () => { + context.with(setActiveSpan(context.active(), span), () => { const headers = {}; propagation.inject(context.active(), headers); promise = axios diff --git a/packages/opentelemetry-api/src/trace/NoopTracer.ts b/packages/opentelemetry-api/src/trace/NoopTracer.ts index d733c930ea..76a2815131 100644 --- a/packages/opentelemetry-api/src/trace/NoopTracer.ts +++ b/packages/opentelemetry-api/src/trace/NoopTracer.ts @@ -24,10 +24,6 @@ import { getParentSpanContext } from '../context/context'; * No-op implementations of {@link Tracer}. */ export class NoopTracer implements Tracer { - getCurrentSpan(): Span { - return NOOP_SPAN; - } - // startSpan starts a noop span. startSpan(name: string, options?: SpanOptions, context?: Context): Span { const root = Boolean(options?.root); @@ -46,17 +42,6 @@ export class NoopTracer implements Tracer { return NOOP_SPAN; } } - - withSpan ReturnType>( - span: Span, - fn: T - ): ReturnType { - return fn(); - } - - bind(target: T, _span?: Span): T { - return target; - } } function isSpanContext(spanContext: any): spanContext is SpanContext { diff --git a/packages/opentelemetry-api/src/trace/ProxyTracer.ts b/packages/opentelemetry-api/src/trace/ProxyTracer.ts index e2216eed5e..c6e22433e7 100644 --- a/packages/opentelemetry-api/src/trace/ProxyTracer.ts +++ b/packages/opentelemetry-api/src/trace/ProxyTracer.ts @@ -31,25 +31,10 @@ export class ProxyTracer implements Tracer { public readonly version?: string ) {} - getCurrentSpan(): Span | undefined { - return this._getTracer().getCurrentSpan(); - } - startSpan(name: string, options?: SpanOptions): Span { return this._getTracer().startSpan(name, options); } - withSpan ReturnType>( - span: Span, - fn: T - ): ReturnType { - return this._getTracer().withSpan(span, fn); - } - - bind(target: T, span?: Span): T { - return this._getTracer().bind(target, span); - } - /** * Try to get a tracer from the proxy tracer provider. * If the proxy tracer provider has no delegate, return a noop tracer. diff --git a/packages/opentelemetry-api/src/trace/tracer.ts b/packages/opentelemetry-api/src/trace/tracer.ts index 6ba051cfee..abc72a53f3 100644 --- a/packages/opentelemetry-api/src/trace/tracer.ts +++ b/packages/opentelemetry-api/src/trace/tracer.ts @@ -27,24 +27,9 @@ import { SpanOptions } from './SpanOptions'; */ export interface Tracer { /** - * Returns the current Span from the current context if available. + * Starts a new {@link Span}. Start the span without setting it on context. * - * If there is no Span associated with the current context, `undefined` is - * returned. - * - * To install a {@link Span} to the current Context use - * {@link Tracer.withSpan}. - * - * @returns Span The currently active Span - */ - getCurrentSpan(): Span | undefined; - - /** - * Starts a new {@link Span}. Start the span without setting it as the current - * span in this tracer's context. - * - * This method do NOT modify the current Context. To install a {@link - * Span} to the current Context use {@link Tracer.withSpan}. + * This method do NOT modify the current Context. * * @param name The name of the span * @param [options] SpanOptions used for span creation @@ -56,32 +41,4 @@ export interface Tracer { * span.end(); */ startSpan(name: string, options?: SpanOptions, context?: Context): Span; - - /** - * Executes the function given by fn within the context provided by Span. - * - * This is a convenience method for creating spans attached to the tracer's - * context. Applications that need more control over the span lifetime should - * use {@link Tracer.startSpan} instead. - * - * @param span The span that provides the context - * @param fn The function to be executed inside the provided context - * @example - * tracer.withSpan(span, () => { - * tracer.getCurrentSpan().addEvent("parent's event"); - * doSomeOtherWork(); // Here "span" is the current Span. - * }); - */ - withSpan ReturnType>( - span: Span, - fn: T - ): ReturnType; - - /** - * Bind a span as the target's context or propagate the current one. - * - * @param target Any object to which a context need to be set - * @param [context] Optionally specify the context which you want to bind - */ - bind(target: T, context?: Span): T; } diff --git a/packages/opentelemetry-api/test/api/api.test.ts b/packages/opentelemetry-api/test/api/api.test.ts index d2ca5daab5..01aaf32df6 100644 --- a/packages/opentelemetry-api/test/api/api.test.ts +++ b/packages/opentelemetry-api/test/api/api.test.ts @@ -36,8 +36,6 @@ import api, { } from '../../src'; describe('API', () => { - const functions = ['getCurrentSpan', 'startSpan', 'withSpan']; - it('should expose a tracer provider via getTracerProvider', () => { const tracer = api.trace.getTracerProvider(); assert.ok(tracer); @@ -59,20 +57,6 @@ describe('API', () => { metrics.disable(); }); - it('should not crash', () => { - functions.forEach(fn => { - const tracer = api.trace.getTracerProvider(); - try { - ((tracer as unknown) as { [fn: string]: Function })[fn](); // Try to run the function - assert.ok(true, fn); - } catch (err) { - if (err.message !== 'Method not implemented.') { - assert.ok(true, fn); - } - } - }); - }); - it('should use the global tracer provider', () => { api.trace.setGlobalTracerProvider(new TestTracerProvider()); const tracer = api.trace.getTracerProvider().getTracer('name'); diff --git a/packages/opentelemetry-api/test/noop-implementations/noop-tracer.test.ts b/packages/opentelemetry-api/test/noop-implementations/noop-tracer.test.ts index bfc06b8133..caba93bec1 100644 --- a/packages/opentelemetry-api/test/noop-implementations/noop-tracer.test.ts +++ b/packages/opentelemetry-api/test/noop-implementations/noop-tracer.test.ts @@ -40,24 +40,6 @@ describe('NoopTracer', () => { }), NOOP_SPAN ); - - assert.deepStrictEqual(tracer.getCurrentSpan(), NOOP_SPAN); - }); - - it('should not crash when .withSpan()', done => { - const tracer = new NoopTracer(); - tracer.withSpan(NOOP_SPAN, () => { - return done(); - }); - }); - - it('should not crash when .bind()', done => { - const tracer = new NoopTracer(); - const fn = () => { - return done(); - }; - const patchedFn = tracer.bind(fn, NOOP_SPAN); - return patchedFn(); }); it('should propagate valid spanContext on the span (from context)', () => { diff --git a/packages/opentelemetry-api/test/proxy-implementations/proxy-tracer.test.ts b/packages/opentelemetry-api/test/proxy-implementations/proxy-tracer.test.ts index 7a110cbfa3..41db382f3d 100644 --- a/packages/opentelemetry-api/test/proxy-implementations/proxy-tracer.test.ts +++ b/packages/opentelemetry-api/test/proxy-implementations/proxy-tracer.test.ts @@ -56,8 +56,6 @@ describe('ProxyTracer', () => { }), NOOP_SPAN ); - - assert.deepStrictEqual(tracer.getCurrentSpan(), NOOP_SPAN); }); }); @@ -96,18 +94,9 @@ describe('ProxyTracer', () => { beforeEach(() => { delegateSpan = new NoopSpan(); delegateTracer = { - bind(target) { - return target; - }, - getCurrentSpan() { - return delegateSpan; - }, startSpan() { return delegateSpan; }, - withSpan(span, fn) { - return fn(); - }, }; tracer = provider.getTracer('test'); diff --git a/packages/opentelemetry-context-zone-peer-dep/README.md b/packages/opentelemetry-context-zone-peer-dep/README.md index 15edbcb0dd..9314211b8d 100644 --- a/packages/opentelemetry-context-zone-peer-dep/README.md +++ b/packages/opentelemetry-context-zone-peer-dep/README.md @@ -22,6 +22,7 @@ npm install --save @opentelemetry/context-zone-peer-dep ## Usage ```js +import { context } from '@opentelemetry/api'; import { ConsoleSpanExporter, SimpleSpanProcessor } from '@opentelemetry/tracing'; import { WebTracerProvider } from '@opentelemetry/web'; import { ZoneContextManager } from '@opentelemetry/context-zone-peer-dep'; @@ -35,12 +36,12 @@ providerWithZone.register({ // Example how the ZoneContextManager keeps the reference to the correct context during async operations const webTracerWithZone = providerWithZone.getTracer('default'); const span1 = webTracerWithZone.startSpan('foo1'); -webTracerWithZone.withSpan(span1, () => { +context.with(setActiveSpan(context.active(), span1, () => { console.log('Current span is span1', webTracerWithZone.getCurrentSpan() === span1); setTimeout(() => { const span2 = webTracerWithZone.startSpan('foo2'); console.log('Current span is span1', webTracerWithZone.getCurrentSpan() === span1); - webTracerWithZone.withSpan(span2, () => { + context.with(setActiveSpan(context.active(), span2, () => { console.log('Current span is span2', webTracerWithZone.getCurrentSpan() === span2); setTimeout(() => { console.log('Current span is span2', webTracerWithZone.getCurrentSpan() === span2); diff --git a/packages/opentelemetry-context-zone/README.md b/packages/opentelemetry-context-zone/README.md index 4e26999004..4793647925 100644 --- a/packages/opentelemetry-context-zone/README.md +++ b/packages/opentelemetry-context-zone/README.md @@ -19,6 +19,7 @@ npm install --save @opentelemetry/context-zone ## Usage ```js +import { context } from '@opentelemetry/api'; import { ConsoleSpanExporter, SimpleSpanProcessor } from '@opentelemetry/tracing'; import { WebTracerProvider } from '@opentelemetry/web'; import { ZoneContextManager } from '@opentelemetry/context-zone'; @@ -32,12 +33,13 @@ provider.register({ // Example how the ZoneContextManager keeps the reference to the correct context during async operations const webTracerWithZone = providerWithZone.getTracer('default'); const span1 = webTracerWithZone.startSpan('foo1'); -webTracerWithZone.withSpan(span1, () => { + +context.with(setActiveSpan(context.active(), span1), () => { console.log('Current span is span1', webTracerWithZone.getCurrentSpan() === span1); setTimeout(() => { const span2 = webTracerWithZone.startSpan('foo2'); console.log('Current span is span1', webTracerWithZone.getCurrentSpan() === span1); - webTracerWithZone.withSpan(span2, () => { + context.with(setActiveSpan(context.active(), span2), () => { console.log('Current span is span2', webTracerWithZone.getCurrentSpan() === span2); setTimeout(() => { console.log('Current span is span2', webTracerWithZone.getCurrentSpan() === span2); diff --git a/packages/opentelemetry-grpc-utils/test/grpcUtils.test.ts b/packages/opentelemetry-grpc-utils/test/grpcUtils.test.ts index c2f877455a..c694c83852 100644 --- a/packages/opentelemetry-grpc-utils/test/grpcUtils.test.ts +++ b/packages/opentelemetry-grpc-utils/test/grpcUtils.test.ts @@ -19,6 +19,8 @@ import { NoopTracerProvider, SpanKind, propagation, + getActiveSpan, + setActiveSpan, } from '@opentelemetry/api'; import { NoopLogger, @@ -527,8 +529,8 @@ export const runTests = ( const span = provider .getTracer('default') .startSpan('TestSpan', { kind: SpanKind.PRODUCER }); - return provider.getTracer('default').withSpan(span, async () => { - const rootSpan = provider.getTracer('default').getCurrentSpan(); + return context.with(setActiveSpan(context.active(), span), async () => { + const rootSpan = getActiveSpan(context.active()); if (!rootSpan) { return assert.ok(false); } @@ -623,8 +625,8 @@ export const runTests = ( const span = provider .getTracer('default') .startSpan('TestSpan', { kind: SpanKind.PRODUCER }); - return provider.getTracer('default').withSpan(span, async () => { - const rootSpan = provider.getTracer('default').getCurrentSpan(); + return context.with(setActiveSpan(context.active(), span), async () => { + const rootSpan = getActiveSpan(context.active()); if (!rootSpan) { return assert.ok(false); } diff --git a/packages/opentelemetry-instrumentation-http/src/http.ts b/packages/opentelemetry-instrumentation-http/src/http.ts index 57859d12f3..18095b242c 100644 --- a/packages/opentelemetry-instrumentation-http/src/http.ts +++ b/packages/opentelemetry-instrumentation-http/src/http.ts @@ -25,6 +25,7 @@ import { SpanContext, TraceFlags, ROOT_CONTEXT, + getActiveSpan, } from '@opentelemetry/api'; import { NoRecordingSpan } from '@opentelemetry/core'; import type * as http from 'http'; @@ -304,7 +305,7 @@ export class HttpInstrumentation extends InstrumentationBase { this._callResponseHook(span, response); } - this.tracer.bind(response); + context.bind(response); this._logger.debug('outgoingRequest on response()'); response.on('end', () => { this._logger.debug('outgoingRequest on end()'); @@ -410,7 +411,7 @@ export class HttpInstrumentation extends InstrumentationBase { spanOptions ); - return instrumentation.tracer.withSpan(span, () => { + return context.with(setActiveSpan(context.active(), span), () => { context.bind(request); context.bind(response); @@ -559,7 +560,7 @@ export class HttpInstrumentation extends InstrumentationBase { '%s instrumentation outgoingRequest', component ); - instrumentation.tracer.bind(request); + context.bind(request); return instrumentation._traceClientRequest( component, request, @@ -580,7 +581,7 @@ export class HttpInstrumentation extends InstrumentationBase { : this._getConfig().requireParentforIncomingSpans; let span: Span; - const currentSpan = this.tracer.getCurrentSpan(); + const currentSpan = getActiveSpan(context.active()); if (requireParent === true && currentSpan === undefined) { // TODO: Refactor this when a solution is found in diff --git a/packages/opentelemetry-instrumentation-http/test/functionals/http-disable.test.ts b/packages/opentelemetry-instrumentation-http/test/functionals/http-disable.test.ts index 7a962a56e3..babf8502c1 100644 --- a/packages/opentelemetry-instrumentation-http/test/functionals/http-disable.test.ts +++ b/packages/opentelemetry-instrumentation-http/test/functionals/http-disable.test.ts @@ -55,7 +55,6 @@ describe('HttpInstrumentation', () => { beforeEach(() => { NOOP_TRACER.startSpan = sinon.spy(); - NOOP_TRACER.withSpan = sinon.spy(); }); afterEach(() => { @@ -79,11 +78,6 @@ describe('HttpInstrumentation', () => { (NOOP_TRACER.startSpan as sinon.SinonSpy).called, false ); - - assert.strictEqual( - (NOOP_TRACER.withSpan as sinon.SinonSpy).called, - false - ); }); }); }); diff --git a/packages/opentelemetry-instrumentation-http/test/functionals/http-enable.test.ts b/packages/opentelemetry-instrumentation-http/test/functionals/http-enable.test.ts index 1bcd42616f..20481df8d6 100644 --- a/packages/opentelemetry-instrumentation-http/test/functionals/http-enable.test.ts +++ b/packages/opentelemetry-instrumentation-http/test/functionals/http-enable.test.ts @@ -20,6 +20,7 @@ import { Span as ISpan, SpanKind, getActiveSpan, + setActiveSpan, } from '@opentelemetry/api'; import { NoopLogger } from '@opentelemetry/core'; import { NodeTracerProvider } from '@opentelemetry/node'; @@ -321,7 +322,7 @@ describe('HttpInstrumentation', () => { doNock(hostname, testPath, 200, 'Ok'); const name = 'TestRootSpan'; const span = provider.getTracer('default').startSpan(name); - return provider.getTracer('default').withSpan(span, async () => { + return context.with(setActiveSpan(context.active(), span), async () => { const result = await httpRequest.get( `${protocol}://${hostname}${testPath}` ); @@ -364,36 +365,39 @@ describe('HttpInstrumentation', () => { ); const name = 'TestRootSpan'; const span = provider.getTracer('default').startSpan(name); - return provider.getTracer('default').withSpan(span, async () => { - const result = await httpRequest.get( - `${protocol}://${hostname}${testPath}` - ); - span.end(); - const spans = memoryExporter.getFinishedSpans(); - const [reqSpan, localSpan] = spans; - const validations = { - hostname, - httpStatusCode: result.statusCode!, - httpMethod: 'GET', - pathname: testPath, - resHeaders: result.resHeaders, - reqHeaders: result.reqHeaders, - component: 'http', - }; - - assert.ok(localSpan.name.indexOf('TestRootSpan') >= 0); - assert.strictEqual(spans.length, 2); - assert.strictEqual(reqSpan.name, 'HTTP GET'); - assert.strictEqual( - localSpan.spanContext.traceId, - reqSpan.spanContext.traceId - ); - assertSpan(reqSpan, SpanKind.CLIENT, validations); - assert.notStrictEqual( - localSpan.spanContext.spanId, - reqSpan.spanContext.spanId - ); - }); + return context.with( + setActiveSpan(context.active(), span), + async () => { + const result = await httpRequest.get( + `${protocol}://${hostname}${testPath}` + ); + span.end(); + const spans = memoryExporter.getFinishedSpans(); + const [reqSpan, localSpan] = spans; + const validations = { + hostname, + httpStatusCode: result.statusCode!, + httpMethod: 'GET', + pathname: testPath, + resHeaders: result.resHeaders, + reqHeaders: result.reqHeaders, + component: 'http', + }; + + assert.ok(localSpan.name.indexOf('TestRootSpan') >= 0); + assert.strictEqual(spans.length, 2); + assert.strictEqual(reqSpan.name, 'HTTP GET'); + assert.strictEqual( + localSpan.spanContext.traceId, + reqSpan.spanContext.traceId + ); + assertSpan(reqSpan, SpanKind.CLIENT, validations); + assert.notStrictEqual( + localSpan.spanContext.spanId, + reqSpan.spanContext.spanId + ); + } + ); }); } @@ -403,7 +407,7 @@ describe('HttpInstrumentation', () => { doNock(hostname, testPath, 200, 'Ok', num); const name = 'TestRootSpan'; const span = provider.getTracer('default').startSpan(name); - await provider.getTracer('default').withSpan(span, async () => { + await context.with(setActiveSpan(context.active(), span), async () => { for (let i = 0; i < num; i++) { await httpRequest.get(`${protocol}://${hostname}${testPath}`); const spans = memoryExporter.getFinishedSpans(); @@ -794,7 +798,7 @@ describe('HttpInstrumentation', () => { const span = tracer.startSpan('parentSpan', { kind: SpanKind.INTERNAL, }); - tracer.withSpan(span, () => { + context.with(setActiveSpan(context.active(), span), () => { httpRequest .get(`${protocol}://${hostname}:${serverPort}${testPath}`) .then(result => { diff --git a/packages/opentelemetry-instrumentation-http/test/functionals/https-disable.test.ts b/packages/opentelemetry-instrumentation-http/test/functionals/https-disable.test.ts index f0eb60b38f..c498701b29 100644 --- a/packages/opentelemetry-instrumentation-http/test/functionals/https-disable.test.ts +++ b/packages/opentelemetry-instrumentation-http/test/functionals/https-disable.test.ts @@ -64,7 +64,6 @@ describe('HttpsInstrumentation', () => { beforeEach(() => { NOOP_TRACER.startSpan = sinon.spy(); - NOOP_TRACER.withSpan = sinon.spy(); }); afterEach(() => { @@ -88,10 +87,6 @@ describe('HttpsInstrumentation', () => { ); assert.strictEqual(isWrapped(https.Server.prototype.emit), false); - assert.strictEqual( - (NOOP_TRACER.withSpan as sinon.SinonSpy).called, - false - ); }); }); }); diff --git a/packages/opentelemetry-instrumentation-http/test/functionals/https-enable.test.ts b/packages/opentelemetry-instrumentation-http/test/functionals/https-enable.test.ts index e8a7a18655..671879bf15 100644 --- a/packages/opentelemetry-instrumentation-http/test/functionals/https-enable.test.ts +++ b/packages/opentelemetry-instrumentation-http/test/functionals/https-enable.test.ts @@ -20,6 +20,7 @@ import { propagation, Span as ISpan, SpanKind, + setActiveSpan, } from '@opentelemetry/api'; import { NoopLogger } from '@opentelemetry/core'; import { AsyncHooksContextManager } from '@opentelemetry/context-async-hooks'; @@ -308,7 +309,7 @@ describe('HttpsInstrumentation', () => { doNock(hostname, testPath, 200, 'Ok'); const name = 'TestRootSpan'; const span = tracer.startSpan(name); - return tracer.withSpan(span, async () => { + return context.with(setActiveSpan(context.active(), span), async () => { const result = await httpsRequest.get( `${protocol}://${hostname}${testPath}` ); @@ -351,36 +352,39 @@ describe('HttpsInstrumentation', () => { ); const name = 'TestRootSpan'; const span = tracer.startSpan(name); - return tracer.withSpan(span, async () => { - const result = await httpsRequest.get( - `${protocol}://${hostname}${testPath}` - ); - span.end(); - const spans = memoryExporter.getFinishedSpans(); - const [reqSpan, localSpan] = spans; - const validations = { - hostname, - httpStatusCode: result.statusCode!, - httpMethod: 'GET', - pathname: testPath, - resHeaders: result.resHeaders, - reqHeaders: result.reqHeaders, - component: 'https', - }; - - assert.ok(localSpan.name.indexOf('TestRootSpan') >= 0); - assert.strictEqual(spans.length, 2); - assert.strictEqual(reqSpan.name, 'HTTPS GET'); - assert.strictEqual( - localSpan.spanContext.traceId, - reqSpan.spanContext.traceId - ); - assertSpan(reqSpan, SpanKind.CLIENT, validations); - assert.notStrictEqual( - localSpan.spanContext.spanId, - reqSpan.spanContext.spanId - ); - }); + return context.with( + setActiveSpan(context.active(), span), + async () => { + const result = await httpsRequest.get( + `${protocol}://${hostname}${testPath}` + ); + span.end(); + const spans = memoryExporter.getFinishedSpans(); + const [reqSpan, localSpan] = spans; + const validations = { + hostname, + httpStatusCode: result.statusCode!, + httpMethod: 'GET', + pathname: testPath, + resHeaders: result.resHeaders, + reqHeaders: result.reqHeaders, + component: 'https', + }; + + assert.ok(localSpan.name.indexOf('TestRootSpan') >= 0); + assert.strictEqual(spans.length, 2); + assert.strictEqual(reqSpan.name, 'HTTPS GET'); + assert.strictEqual( + localSpan.spanContext.traceId, + reqSpan.spanContext.traceId + ); + assertSpan(reqSpan, SpanKind.CLIENT, validations); + assert.notStrictEqual( + localSpan.spanContext.spanId, + reqSpan.spanContext.spanId + ); + } + ); }); } @@ -390,7 +394,7 @@ describe('HttpsInstrumentation', () => { doNock(hostname, testPath, 200, 'Ok', num); const name = 'TestRootSpan'; const span = tracer.startSpan(name); - await tracer.withSpan(span, async () => { + await context.with(setActiveSpan(context.active(), span), async () => { for (let i = 0; i < num; i++) { await httpsRequest.get(`${protocol}://${hostname}${testPath}`); const spans = memoryExporter.getFinishedSpans(); diff --git a/packages/opentelemetry-instrumentation-xml-http-request/src/xhr.ts b/packages/opentelemetry-instrumentation-xml-http-request/src/xhr.ts index 1e5fe3e1fd..596fdb2e57 100644 --- a/packages/opentelemetry-instrumentation-xml-http-request/src/xhr.ts +++ b/packages/opentelemetry-instrumentation-xml-http-request/src/xhr.ts @@ -125,7 +125,7 @@ export class XMLHttpRequestInstrumentation extends InstrumentationBase { + api.context.with(api.setActiveSpan(api.context.active(), span), () => { const childSpan = this.tracer.startSpan('CORS Preflight', { startTime: corsPreFlightRequest[PTN.FETCH_START], }); @@ -437,25 +437,28 @@ export class XMLHttpRequestInstrumentation extends InstrumentationBase { - plugin._tasksCount++; - xhrMem.sendStartTime = hrTime(); - currentSpan.addEvent(EventNames.METHOD_SEND); - - this.addEventListener('abort', onAbort); - this.addEventListener('error', onError); - this.addEventListener('load', onLoad); - this.addEventListener('timeout', onTimeout); - - xhrMem.callbackToRemoveEvents = () => { - unregister(this); - if (xhrMem.createdResources) { - xhrMem.createdResources.observer.disconnect(); - } - }; - plugin._addHeaders(this, spanUrl); - plugin._addResourceObserver(this, spanUrl); - }); + api.context.with( + api.setActiveSpan(api.context.active(), currentSpan), + () => { + plugin._tasksCount++; + xhrMem.sendStartTime = hrTime(); + currentSpan.addEvent(EventNames.METHOD_SEND); + + this.addEventListener('abort', onAbort); + this.addEventListener('error', onError); + this.addEventListener('load', onLoad); + this.addEventListener('timeout', onTimeout); + + xhrMem.callbackToRemoveEvents = () => { + unregister(this); + if (xhrMem.createdResources) { + xhrMem.createdResources.observer.disconnect(); + } + }; + plugin._addHeaders(this, spanUrl); + plugin._addResourceObserver(this, spanUrl); + } + ); } return original.apply(this, args); }; diff --git a/packages/opentelemetry-instrumentation-xml-http-request/test/xhr.test.ts b/packages/opentelemetry-instrumentation-xml-http-request/test/xhr.test.ts index cc3c4875cf..5a3f234463 100644 --- a/packages/opentelemetry-instrumentation-xml-http-request/test/xhr.test.ts +++ b/packages/opentelemetry-instrumentation-xml-http-request/test/xhr.test.ts @@ -213,27 +213,30 @@ describe('xhr', () => { ); rootSpan = webTracerWithZone.startSpan('root'); - webTracerWithZone.withSpan(rootSpan, () => { - getData( - new XMLHttpRequest(), - fileUrl, - () => { - fakeNow = 100; - }, - testAsync - ).then(() => { - fakeNow = 0; - sandbox.clock.tick(1000); - done(); - }); - assert.strictEqual(requests.length, 1, 'request not called'); + api.context.with( + api.setActiveSpan(api.context.active(), rootSpan), + () => { + getData( + new XMLHttpRequest(), + fileUrl, + () => { + fakeNow = 100; + }, + testAsync + ).then(() => { + fakeNow = 0; + sandbox.clock.tick(1000); + done(); + }); + assert.strictEqual(requests.length, 1, 'request not called'); - requests[0].respond( - 200, - { 'Content-Type': 'application/json' }, - '{"foo":"bar"}' - ); - }); + requests[0].respond( + 200, + { 'Content-Type': 'application/json' }, + '{"foo":"bar"}' + ); + } + ); }; beforeEach(done => { @@ -626,46 +629,52 @@ describe('xhr', () => { }) ); const reusableReq = new XMLHttpRequest(); - webTracerWithZone.withSpan(rootSpan, () => { - getData( - reusableReq, - firstUrl, - () => { - fakeNow = 100; - }, - testAsync - ).then(() => { - fakeNow = 0; - sandbox.clock.tick(1000); - }); - }); - - webTracerWithZone.withSpan(rootSpan, () => { - getData( - reusableReq, - secondUrl, - () => { - fakeNow = 100; - }, - testAsync - ).then(() => { - fakeNow = 0; - sandbox.clock.tick(1000); - done(); - }); - - assert.strictEqual( - requests.length, - 1, - 'first request not called' - ); + api.context.with( + api.setActiveSpan(api.context.active(), rootSpan), + () => { + getData( + reusableReq, + firstUrl, + () => { + fakeNow = 100; + }, + testAsync + ).then(() => { + fakeNow = 0; + sandbox.clock.tick(1000); + }); + } + ); - requests[0].respond( - 200, - { 'Content-Type': 'application/json' }, - '{"foo":"bar"}' - ); - }); + api.context.with( + api.setActiveSpan(api.context.active(), rootSpan), + () => { + getData( + reusableReq, + secondUrl, + () => { + fakeNow = 100; + }, + testAsync + ).then(() => { + fakeNow = 0; + sandbox.clock.tick(1000); + done(); + }); + + assert.strictEqual( + requests.length, + 1, + 'first request not called' + ); + + requests[0].respond( + 200, + { 'Content-Type': 'application/json' }, + '{"foo":"bar"}' + ); + } + ); }); it('should clear previous span information', () => { @@ -738,26 +747,29 @@ describe('xhr', () => { describe('when request loads and receives an error code', () => { beforeEach(done => { - webTracerWithZone.withSpan(rootSpan, () => { - getData( - new XMLHttpRequest(), - url, - () => { - fakeNow = 100; - }, - testAsync - ).then(() => { - fakeNow = 0; - sandbox.clock.tick(1000); - done(); - }); - assert.strictEqual(requests.length, 1, 'request not called'); - requests[0].respond( - 400, - { 'Content-Type': 'text/plain' }, - 'Bad Request' - ); - }); + api.context.with( + api.setActiveSpan(api.context.active(), rootSpan), + () => { + getData( + new XMLHttpRequest(), + url, + () => { + fakeNow = 100; + }, + testAsync + ).then(() => { + fakeNow = 0; + sandbox.clock.tick(1000); + done(); + }); + assert.strictEqual(requests.length, 1, 'request not called'); + requests[0].respond( + 400, + { 'Content-Type': 'text/plain' }, + 'Bad Request' + ); + } + ); }); it('span should have correct attributes', () => { const span: tracing.ReadableSpan = exportSpy.args[0][0][0]; @@ -872,18 +884,21 @@ describe('xhr', () => { describe('when request encounters a network error', () => { beforeEach(done => { - webTracerWithZone.withSpan(rootSpan, () => { - getData(new XMLHttpRequest(), url, () => {}, testAsync).then( - () => { - fakeNow = 0; - sandbox.clock.tick(1000); - done(); - } - ); - - assert.strictEqual(requests.length, 1, 'request not called'); - requests[0].error(); - }); + api.context.with( + api.setActiveSpan(api.context.active(), rootSpan), + () => { + getData(new XMLHttpRequest(), url, () => {}, testAsync).then( + () => { + fakeNow = 0; + sandbox.clock.tick(1000); + done(); + } + ); + + assert.strictEqual(requests.length, 1, 'request not called'); + requests[0].error(); + } + ); }); it('span should have correct attributes', () => { @@ -961,18 +976,21 @@ describe('xhr', () => { }); beforeEach(done => { - webTracerWithZone.withSpan(rootSpan, () => { - getData(new XMLHttpRequest(), url, () => {}, testAsync).then( - () => { - fakeNow = 0; - sandbox.clock.tick(1000); - done(); - } - ); - - assert.strictEqual(requests.length, 1, 'request not called'); - requests[0].abort(); - }); + api.context.with( + api.setActiveSpan(api.context.active(), rootSpan), + () => { + getData(new XMLHttpRequest(), url, () => {}, testAsync).then( + () => { + fakeNow = 0; + sandbox.clock.tick(1000); + done(); + } + ); + + assert.strictEqual(requests.length, 1, 'request not called'); + requests[0].abort(); + } + ); }); it('span should have correct attributes', () => { @@ -1050,20 +1068,23 @@ describe('xhr', () => { }); beforeEach(done => { - webTracerWithZone.withSpan(rootSpan, () => { - getData( - new XMLHttpRequest(), - url, - () => { - sandbox.clock.tick(XHR_TIMEOUT); - }, - testAsync - ).then(() => { - fakeNow = 0; - sandbox.clock.tick(1000); - done(); - }); - }); + api.context.with( + api.setActiveSpan(api.context.active(), rootSpan), + () => { + getData( + new XMLHttpRequest(), + url, + () => { + sandbox.clock.tick(XHR_TIMEOUT); + }, + testAsync + ).then(() => { + fakeNow = 0; + sandbox.clock.tick(1000); + done(); + }); + } + ); }); it('span should have correct attributes', () => { diff --git a/packages/opentelemetry-node/test/NodeTracerProvider.test.ts b/packages/opentelemetry-node/test/NodeTracerProvider.test.ts index 5fcc81e1b8..e393f51c1a 100644 --- a/packages/opentelemetry-node/test/NodeTracerProvider.test.ts +++ b/packages/opentelemetry-node/test/NodeTracerProvider.test.ts @@ -19,6 +19,7 @@ import { TraceFlags, setActiveSpan, setExtractedSpanContext, + getActiveSpan, } from '@opentelemetry/api'; import { AlwaysOnSampler, @@ -207,49 +208,27 @@ describe('NodeTracerProvider', () => { }); }); - describe('.getCurrentSpan()', () => { - it('should return undefined with AsyncHooksContextManager when no span started', () => { - provider = new NodeTracerProvider({}); - assert.deepStrictEqual( - provider.getTracer('default').getCurrentSpan(), - undefined - ); - }); - }); - describe('.withSpan()', () => { it('should run context with AsyncHooksContextManager context manager', done => { provider = new NodeTracerProvider({}); const span = provider.getTracer('default').startSpan('my-span'); - provider.getTracer('default').withSpan(span, () => { - assert.deepStrictEqual( - provider.getTracer('default').getCurrentSpan(), - span - ); + context.with(setActiveSpan(context.active(), span), () => { + assert.deepStrictEqual(getActiveSpan(context.active()), span); return done(); }); - assert.deepStrictEqual( - provider.getTracer('default').getCurrentSpan(), - undefined - ); + assert.deepStrictEqual(getActiveSpan(context.active()), undefined); }); it('should run context with AsyncHooksContextManager context manager with multiple spans', done => { provider = new NodeTracerProvider({}); const span = provider.getTracer('default').startSpan('my-span'); - provider.getTracer('default').withSpan(span, () => { - assert.deepStrictEqual( - provider.getTracer('default').getCurrentSpan(), - span - ); + context.with(setActiveSpan(context.active(), span), () => { + assert.deepStrictEqual(getActiveSpan(context.active()), span); const span1 = provider.getTracer('default').startSpan('my-span1'); - provider.getTracer('default').withSpan(span1, () => { - assert.deepStrictEqual( - provider.getTracer('default').getCurrentSpan(), - span1 - ); + context.with(setActiveSpan(context.active(), span1), () => { + assert.deepStrictEqual(getActiveSpan(context.active()), span1); assert.deepStrictEqual( span1.context().traceId, span.context().traceId @@ -259,29 +238,20 @@ describe('NodeTracerProvider', () => { }); // when span ended. // @todo: below check is not running. - assert.deepStrictEqual( - provider.getTracer('default').getCurrentSpan(), - undefined - ); + assert.deepStrictEqual(getActiveSpan(context.active()), undefined); }); it('should find correct context with promises', async () => { provider = new NodeTracerProvider(); const span = provider.getTracer('default').startSpan('my-span'); - await provider.getTracer('default').withSpan(span, async () => { + await context.with(setActiveSpan(context.active(), span), async () => { for (let i = 0; i < 3; i++) { await sleep(5).then(() => { - assert.deepStrictEqual( - provider.getTracer('default').getCurrentSpan(), - span - ); + assert.deepStrictEqual(getActiveSpan(context.active()), span); }); } }); - assert.deepStrictEqual( - provider.getTracer('default').getCurrentSpan(), - undefined - ); + assert.deepStrictEqual(getActiveSpan(context.active()), undefined); }); }); @@ -290,10 +260,7 @@ describe('NodeTracerProvider', () => { const provider = new NodeTracerProvider({}); const span = provider.getTracer('default').startSpan('my-span'); const fn = () => { - assert.deepStrictEqual( - provider.getTracer('default').getCurrentSpan(), - span - ); + assert.deepStrictEqual(getActiveSpan(context.active()), span); return done(); }; const patchedFn = context.bind(fn, setActiveSpan(context.active(), span)); diff --git a/packages/opentelemetry-plugin-fetch/src/fetch.ts b/packages/opentelemetry-plugin-fetch/src/fetch.ts index 6d46638ff2..950a7c16f1 100644 --- a/packages/opentelemetry-plugin-fetch/src/fetch.ts +++ b/packages/opentelemetry-plugin-fetch/src/fetch.ts @@ -299,16 +299,19 @@ export class FetchPlugin extends core.BasePlugin> { } return new Promise((resolve, reject) => { - return plugin._tracer.withSpan(span, () => { - plugin._addHeaders(options, url); - plugin._tasksCount++; - return original - .apply(this, [url, options]) - .then( - onSuccess.bind(this, span, resolve), - onError.bind(this, span, reject) - ); - }); + return api.context.with( + api.setActiveSpan(api.context.active(), span), + () => { + plugin._addHeaders(options, url); + plugin._tasksCount++; + return original + .apply(this, [url, options]) + .then( + onSuccess.bind(this, span, resolve), + onError.bind(this, span, reject) + ); + } + ); }); }; }; diff --git a/packages/opentelemetry-plugin-fetch/test/fetch.test.ts b/packages/opentelemetry-plugin-fetch/test/fetch.test.ts index 647537f6c3..fecd33bdc2 100644 --- a/packages/opentelemetry-plugin-fetch/test/fetch.test.ts +++ b/packages/opentelemetry-plugin-fetch/test/fetch.test.ts @@ -178,7 +178,7 @@ describe('fetch', () => { ); rootSpan = webTracerWithZone.startSpan('root'); - webTracerWithZone.withSpan(rootSpan, () => { + api.context.with(api.setActiveSpan(api.context.active(), rootSpan), () => { fakeNow = 0; getData(fileUrl, method).then( response => { diff --git a/packages/opentelemetry-plugin-grpc-js/src/client/utils.ts b/packages/opentelemetry-plugin-grpc-js/src/client/utils.ts index 9332f7ad76..ea8598d56f 100644 --- a/packages/opentelemetry-plugin-grpc-js/src/client/utils.ts +++ b/packages/opentelemetry-plugin-grpc-js/src/client/utils.ts @@ -23,6 +23,7 @@ import { Status, propagation, context, + setActiveSpan, } from '@opentelemetry/api'; import { RpcAttribute } from '@opentelemetry/semantic-conventions'; import type * as grpcJs from '@grpc/grpc-js'; @@ -80,8 +81,8 @@ export function getPatchedClientMethods( const span = plugin.tracer.startSpan(name, { kind: SpanKind.CLIENT, }); - return plugin.tracer.withSpan(span, () => - makeGrpcClientRemoteCall(original, args, metadata, this, plugin)(span) + return context.with(setActiveSpan(context.active(), span), () => + makeGrpcClientRemoteCall(original, args, metadata, this)(span) ); }; }; @@ -95,8 +96,7 @@ export function makeGrpcClientRemoteCall( original: GrpcClientFunc, args: unknown[], metadata: grpcJs.Metadata, - self: grpcJs.Client, - plugin: GrpcJsPlugin + self: grpcJs.Client ): (span: Span) => EventEmitter { /** * Patches a callback so that the current span for this trace is also ended @@ -130,7 +130,7 @@ export function makeGrpcClientRemoteCall( span.end(); callback(err, res); }; - return plugin.tracer.bind(wrappedFn); + return context.bind(wrappedFn); } return (span: Span) => { @@ -166,7 +166,7 @@ export function makeGrpcClientRemoteCall( spanEnded = true; } }; - plugin.tracer.bind(call); + context.bind(call); call.on('error', (err: grpcJs.ServiceError) => { if (call[CALL_SPAN_ENDED]) { return; diff --git a/packages/opentelemetry-plugin-grpc-js/src/server/clientStreamAndUnary.ts b/packages/opentelemetry-plugin-grpc-js/src/server/clientStreamAndUnary.ts index 2e92334cb0..57d9157c3a 100644 --- a/packages/opentelemetry-plugin-grpc-js/src/server/clientStreamAndUnary.ts +++ b/packages/opentelemetry-plugin-grpc-js/src/server/clientStreamAndUnary.ts @@ -61,6 +61,6 @@ export function clientStreamAndUnaryHandler( return callback(err, value); }; - plugin.tracer.bind(call); + context.bind(call); return (original as Function).call({}, call, patchedCallback); } diff --git a/packages/opentelemetry-plugin-grpc-js/src/server/patchServer.ts b/packages/opentelemetry-plugin-grpc-js/src/server/patchServer.ts index e9e8ed6f29..e72b8e3271 100644 --- a/packages/opentelemetry-plugin-grpc-js/src/server/patchServer.ts +++ b/packages/opentelemetry-plugin-grpc-js/src/server/patchServer.ts @@ -30,6 +30,7 @@ import { propagation, Span, ROOT_CONTEXT, + setActiveSpan, } from '@opentelemetry/api'; import { RpcAttribute } from '@opentelemetry/semantic-conventions'; import { clientStreamAndUnaryHandler } from './clientStreamAndUnary'; @@ -113,7 +114,7 @@ export function patchServer( [RpcAttribute.GRPC_KIND]: spanOptions.kind, }); - plugin.tracer.withSpan(span, () => { + context.with(setActiveSpan(context.active(), span), () => { handleServerFunction.call( self, plugin, diff --git a/packages/opentelemetry-plugin-grpc-js/src/server/serverStreamAndBidi.ts b/packages/opentelemetry-plugin-grpc-js/src/server/serverStreamAndBidi.ts index 138d98e9c9..faa35e1c10 100644 --- a/packages/opentelemetry-plugin-grpc-js/src/server/serverStreamAndBidi.ts +++ b/packages/opentelemetry-plugin-grpc-js/src/server/serverStreamAndBidi.ts @@ -43,7 +43,7 @@ export function serverStreamAndBidiHandler( } }; - plugin.tracer.bind(call); + context.bind(call); call.on('finish', () => { // @grpc/js does not expose a way to check if this call also emitted an error, // e.g. call.status.code !== 0 diff --git a/packages/opentelemetry-plugin-grpc/src/grpc.ts b/packages/opentelemetry-plugin-grpc/src/grpc.ts index f27492438e..fdee46cab5 100644 --- a/packages/opentelemetry-plugin-grpc/src/grpc.ts +++ b/packages/opentelemetry-plugin-grpc/src/grpc.ts @@ -23,6 +23,7 @@ import { SpanOptions, Status, ROOT_CONTEXT, + setActiveSpan, } from '@opentelemetry/api'; import { RpcAttribute } from '@opentelemetry/semantic-conventions'; import { BasePlugin } from '@opentelemetry/core'; @@ -194,7 +195,7 @@ export class GrpcPlugin extends BasePlugin { [RpcAttribute.GRPC_KIND]: spanOptions.kind, }); - plugin._tracer.withSpan(span, () => { + context.with(setActiveSpan(context.active(), span), () => { switch (type) { case 'unary': case 'client_stream': @@ -286,7 +287,7 @@ export class GrpcPlugin extends BasePlugin { return callback(err, value, trailer, flags); } - plugin._tracer.bind(call); + context.bind(call); return (original as Function).call(self, call, patchedCallback); } @@ -305,7 +306,7 @@ export class GrpcPlugin extends BasePlugin { } }; - plugin._tracer.bind(call); + context.bind(call); call.on('finish', () => { span.setStatus(_grpcStatusCodeToSpanStatus(call.status.code)); span.setAttribute( @@ -392,7 +393,7 @@ export class GrpcPlugin extends BasePlugin { const span = plugin._tracer.startSpan(name, { kind: SpanKind.CLIENT, }); - return plugin._tracer.withSpan(span, () => + return context.with(setActiveSpan(context.active(), span), () => plugin._makeGrpcClientRemoteCall( original, args, @@ -448,7 +449,7 @@ export class GrpcPlugin extends BasePlugin { span.end(); callback(err, res); }; - return plugin._tracer.bind(wrappedFn); + return context.bind(wrappedFn); } return (span: Span) => { @@ -490,7 +491,7 @@ export class GrpcPlugin extends BasePlugin { spanEnded = true; } }; - plugin._tracer.bind(call); + context.bind(call); ((call as unknown) as events.EventEmitter).on( 'error', (err: grpcTypes.ServiceError) => { diff --git a/packages/opentelemetry-plugin-http/src/http.ts b/packages/opentelemetry-plugin-http/src/http.ts index ccde0d4a44..806e275ad6 100644 --- a/packages/opentelemetry-plugin-http/src/http.ts +++ b/packages/opentelemetry-plugin-http/src/http.ts @@ -25,6 +25,7 @@ import { TraceFlags, setActiveSpan, ROOT_CONTEXT, + getActiveSpan, } from '@opentelemetry/api'; import { BasePlugin, NoRecordingSpan } from '@opentelemetry/core'; import type { @@ -214,7 +215,7 @@ export class HttpPlugin extends BasePlugin { this._callResponseHook(span, response); } - this._tracer.bind(response); + context.bind(response); this._logger.debug('outgoingRequest on response()'); response.on('end', () => { this._logger.debug('outgoingRequest on end()'); @@ -310,7 +311,7 @@ export class HttpPlugin extends BasePlugin { return context.with(propagation.extract(ROOT_CONTEXT, headers), () => { const span = plugin._startHttpSpan(`HTTP ${method}`, spanOptions); - return plugin._tracer.withSpan(span, () => { + return context.with(setActiveSpan(context.active(), span), () => { context.bind(request); context.bind(response); @@ -426,7 +427,7 @@ export class HttpPlugin extends BasePlugin { ); plugin._logger.debug('%s plugin outgoingRequest', plugin.moduleName); - plugin._tracer.bind(request); + context.bind(request); return plugin._traceClientRequest(request, optionsParsed, span); }; } @@ -442,7 +443,7 @@ export class HttpPlugin extends BasePlugin { : this._config.requireParentforIncomingSpans; let span: Span; - const currentSpan = this._tracer.getCurrentSpan(); + const currentSpan = getActiveSpan(context.active()); if (requireParent === true && currentSpan === undefined) { // TODO: Refactor this when a solution is found in diff --git a/packages/opentelemetry-plugin-http/test/functionals/http-disable.test.ts b/packages/opentelemetry-plugin-http/test/functionals/http-disable.test.ts index 3b80fe84ba..3322b472f6 100644 --- a/packages/opentelemetry-plugin-http/test/functionals/http-disable.test.ts +++ b/packages/opentelemetry-plugin-http/test/functionals/http-disable.test.ts @@ -49,7 +49,6 @@ describe('HttpPlugin', () => { beforeEach(() => { NOOP_TRACER.startSpan = sinon.spy(); - NOOP_TRACER.withSpan = sinon.spy(); }); afterEach(() => { @@ -73,10 +72,6 @@ describe('HttpPlugin', () => { ); assert.strictEqual(http.Server.prototype.emit.__wrapped, undefined); - assert.strictEqual( - (NOOP_TRACER.withSpan as sinon.SinonSpy).called, - false - ); }); }); }); diff --git a/packages/opentelemetry-plugin-http/test/functionals/http-enable.test.ts b/packages/opentelemetry-plugin-http/test/functionals/http-enable.test.ts index c453bbf316..5ed5026fac 100644 --- a/packages/opentelemetry-plugin-http/test/functionals/http-enable.test.ts +++ b/packages/opentelemetry-plugin-http/test/functionals/http-enable.test.ts @@ -20,6 +20,7 @@ import { Span as ISpan, SpanKind, getActiveSpan, + setActiveSpan, } from '@opentelemetry/api'; import { NoopLogger } from '@opentelemetry/core'; import { NodeTracerProvider } from '@opentelemetry/node'; @@ -338,7 +339,7 @@ describe('HttpPlugin', () => { doNock(hostname, testPath, 200, 'Ok'); const name = 'TestRootSpan'; const span = provider.getTracer('default').startSpan(name); - return provider.getTracer('default').withSpan(span, async () => { + return context.with(setActiveSpan(context.active(), span), async () => { const result = await httpRequest.get( `${protocol}://${hostname}${testPath}` ); @@ -381,36 +382,39 @@ describe('HttpPlugin', () => { ); const name = 'TestRootSpan'; const span = provider.getTracer('default').startSpan(name); - return provider.getTracer('default').withSpan(span, async () => { - const result = await httpRequest.get( - `${protocol}://${hostname}${testPath}` - ); - span.end(); - const spans = memoryExporter.getFinishedSpans(); - const [reqSpan, localSpan] = spans; - const validations = { - hostname, - httpStatusCode: result.statusCode!, - httpMethod: 'GET', - pathname: testPath, - resHeaders: result.resHeaders, - reqHeaders: result.reqHeaders, - component: plugin.component, - }; - - assert.ok(localSpan.name.indexOf('TestRootSpan') >= 0); - assert.strictEqual(spans.length, 2); - assert.strictEqual(reqSpan.name, 'HTTP GET'); - assert.strictEqual( - localSpan.spanContext.traceId, - reqSpan.spanContext.traceId - ); - assertSpan(reqSpan, SpanKind.CLIENT, validations); - assert.notStrictEqual( - localSpan.spanContext.spanId, - reqSpan.spanContext.spanId - ); - }); + return context.with( + setActiveSpan(context.active(), span), + async () => { + const result = await httpRequest.get( + `${protocol}://${hostname}${testPath}` + ); + span.end(); + const spans = memoryExporter.getFinishedSpans(); + const [reqSpan, localSpan] = spans; + const validations = { + hostname, + httpStatusCode: result.statusCode!, + httpMethod: 'GET', + pathname: testPath, + resHeaders: result.resHeaders, + reqHeaders: result.reqHeaders, + component: plugin.component, + }; + + assert.ok(localSpan.name.indexOf('TestRootSpan') >= 0); + assert.strictEqual(spans.length, 2); + assert.strictEqual(reqSpan.name, 'HTTP GET'); + assert.strictEqual( + localSpan.spanContext.traceId, + reqSpan.spanContext.traceId + ); + assertSpan(reqSpan, SpanKind.CLIENT, validations); + assert.notStrictEqual( + localSpan.spanContext.spanId, + reqSpan.spanContext.spanId + ); + } + ); }); } @@ -420,7 +424,7 @@ describe('HttpPlugin', () => { doNock(hostname, testPath, 200, 'Ok', num); const name = 'TestRootSpan'; const span = provider.getTracer('default').startSpan(name); - await provider.getTracer('default').withSpan(span, async () => { + await context.with(setActiveSpan(context.active(), span), async () => { for (let i = 0; i < num; i++) { await httpRequest.get(`${protocol}://${hostname}${testPath}`); const spans = memoryExporter.getFinishedSpans(); @@ -810,7 +814,7 @@ describe('HttpPlugin', () => { const span = tracer.startSpan('parentSpan', { kind: SpanKind.INTERNAL, }); - tracer.withSpan(span, () => { + context.with(setActiveSpan(context.active(), span), () => { httpRequest .get(`${protocol}://${hostname}:${serverPort}${testPath}`) .then(result => { diff --git a/packages/opentelemetry-plugin-https/test/functionals/https-disable.test.ts b/packages/opentelemetry-plugin-https/test/functionals/https-disable.test.ts index 9d0e8dece6..82b5f21c89 100644 --- a/packages/opentelemetry-plugin-https/test/functionals/https-disable.test.ts +++ b/packages/opentelemetry-plugin-https/test/functionals/https-disable.test.ts @@ -64,7 +64,6 @@ describe('HttpsPlugin', () => { beforeEach(() => { tracer.startSpan = sinon.spy(); - tracer.withSpan = sinon.spy(); }); afterEach(() => { @@ -88,7 +87,6 @@ describe('HttpsPlugin', () => { ); assert.strictEqual(https.Server.prototype.emit.__wrapped, undefined); - assert.strictEqual((tracer.withSpan as sinon.SinonSpy).called, false); }); }); }); diff --git a/packages/opentelemetry-plugin-https/test/functionals/https-enable.test.ts b/packages/opentelemetry-plugin-https/test/functionals/https-enable.test.ts index 10cc3aeb53..7c54627731 100644 --- a/packages/opentelemetry-plugin-https/test/functionals/https-enable.test.ts +++ b/packages/opentelemetry-plugin-https/test/functionals/https-enable.test.ts @@ -20,6 +20,7 @@ import { propagation, Span as ISpan, SpanKind, + setActiveSpan, } from '@opentelemetry/api'; import { NoopLogger } from '@opentelemetry/core'; import { NodeTracerProvider } from '@opentelemetry/node'; @@ -335,7 +336,7 @@ describe('HttpsPlugin', () => { doNock(hostname, testPath, 200, 'Ok'); const name = 'TestRootSpan'; const span = tracer.startSpan(name); - return tracer.withSpan(span, async () => { + return context.with(setActiveSpan(context.active(), span), async () => { const result = await httpsRequest.get( `${protocol}://${hostname}${testPath}` ); @@ -378,36 +379,39 @@ describe('HttpsPlugin', () => { ); const name = 'TestRootSpan'; const span = tracer.startSpan(name); - return tracer.withSpan(span, async () => { - const result = await httpsRequest.get( - `${protocol}://${hostname}${testPath}` - ); - span.end(); - const spans = memoryExporter.getFinishedSpans(); - const [reqSpan, localSpan] = spans; - const validations = { - hostname, - httpStatusCode: result.statusCode!, - httpMethod: 'GET', - pathname: testPath, - resHeaders: result.resHeaders, - reqHeaders: result.reqHeaders, - component: plugin.component, - }; - - assert.ok(localSpan.name.indexOf('TestRootSpan') >= 0); - assert.strictEqual(spans.length, 2); - assert.strictEqual(reqSpan.name, 'HTTP GET'); - assert.strictEqual( - localSpan.spanContext.traceId, - reqSpan.spanContext.traceId - ); - assertSpan(reqSpan, SpanKind.CLIENT, validations); - assert.notStrictEqual( - localSpan.spanContext.spanId, - reqSpan.spanContext.spanId - ); - }); + return context.with( + setActiveSpan(context.active(), span), + async () => { + const result = await httpsRequest.get( + `${protocol}://${hostname}${testPath}` + ); + span.end(); + const spans = memoryExporter.getFinishedSpans(); + const [reqSpan, localSpan] = spans; + const validations = { + hostname, + httpStatusCode: result.statusCode!, + httpMethod: 'GET', + pathname: testPath, + resHeaders: result.resHeaders, + reqHeaders: result.reqHeaders, + component: plugin.component, + }; + + assert.ok(localSpan.name.indexOf('TestRootSpan') >= 0); + assert.strictEqual(spans.length, 2); + assert.strictEqual(reqSpan.name, 'HTTP GET'); + assert.strictEqual( + localSpan.spanContext.traceId, + reqSpan.spanContext.traceId + ); + assertSpan(reqSpan, SpanKind.CLIENT, validations); + assert.notStrictEqual( + localSpan.spanContext.spanId, + reqSpan.spanContext.spanId + ); + } + ); }); } @@ -417,7 +421,7 @@ describe('HttpsPlugin', () => { doNock(hostname, testPath, 200, 'Ok', num); const name = 'TestRootSpan'; const span = tracer.startSpan(name); - await tracer.withSpan(span, async () => { + await context.with(setActiveSpan(context.active(), span), async () => { for (let i = 0; i < num; i++) { await httpsRequest.get(`${protocol}://${hostname}${testPath}`); const spans = memoryExporter.getFinishedSpans(); diff --git a/packages/opentelemetry-tracing/src/Tracer.ts b/packages/opentelemetry-tracing/src/Tracer.ts index db19b66c8a..a868689d72 100644 --- a/packages/opentelemetry-tracing/src/Tracer.ts +++ b/packages/opentelemetry-tracing/src/Tracer.ts @@ -122,40 +122,6 @@ export class Tracer implements api.Tracer { return span; } - /** - * Returns the current Span from the current context. - * - * If there is no Span associated with the current context, undefined is returned. - */ - getCurrentSpan(): api.Span | undefined { - const ctx = api.context.active(); - // Get the current Span from the context or null if none found. - return api.getActiveSpan(ctx); - } - - /** - * Enters the context of code where the given Span is in the current context. - */ - withSpan ReturnType>( - span: api.Span, - fn: T - ): ReturnType { - // Set given span to context. - return api.context.with(api.setActiveSpan(api.context.active(), span), fn); - } - - /** - * Bind a span (or the current one) to the target's context - */ - bind(target: T, span?: api.Span): T { - return api.context.bind( - target, - span - ? api.setActiveSpan(api.context.active(), span) - : api.context.active() - ); - } - /** Returns the active {@link TraceParams}. */ getActiveTraceParams(): TraceParams { return this._traceParams; diff --git a/packages/opentelemetry-tracing/test/BasicTracerProvider.test.ts b/packages/opentelemetry-tracing/test/BasicTracerProvider.test.ts index fe212d351c..61bd95083b 100644 --- a/packages/opentelemetry-tracing/test/BasicTracerProvider.test.ts +++ b/packages/opentelemetry-tracing/test/BasicTracerProvider.test.ts @@ -18,10 +18,10 @@ import { context, SpanContext, TraceFlags, - ContextManager, ROOT_CONTEXT, setActiveSpan, setExtractedSpanContext, + getActiveSpan, } from '@opentelemetry/api'; import { AlwaysOnSampler, @@ -291,24 +291,12 @@ describe('BasicTracerProvider', () => { }); }); - describe('.getCurrentSpan()', () => { - it('should return current span when it exists', () => { - context.setGlobalContextManager({ - active: () => setActiveSpan(ROOT_CONTEXT, ('foo' as any) as Span), - disable: () => {}, - } as ContextManager); - - const tracer = new BasicTracerProvider().getTracer('default'); - assert.deepStrictEqual(tracer.getCurrentSpan(), 'foo'); - }); - }); - describe('.withSpan()', () => { it('should run context with NoopContextManager context manager', done => { const tracer = new BasicTracerProvider().getTracer('default'); const span = tracer.startSpan('my-span'); - tracer.withSpan(span, () => { - assert.deepStrictEqual(tracer.getCurrentSpan(), undefined); + context.with(setActiveSpan(context.active(), span), () => { + assert.deepStrictEqual(getActiveSpan(context.active()), undefined); return done(); }); }); @@ -319,10 +307,10 @@ describe('BasicTracerProvider', () => { const tracer = new BasicTracerProvider().getTracer('default'); const span = tracer.startSpan('my-span'); const fn = () => { - assert.deepStrictEqual(tracer.getCurrentSpan(), undefined); + assert.deepStrictEqual(getActiveSpan(context.active()), undefined); return done(); }; - const patchedFn = tracer.bind(fn, span); + const patchedFn = context.bind(fn, setActiveSpan(context.active(), span)); return patchedFn(); }); }); diff --git a/packages/opentelemetry-web/src/utils.ts b/packages/opentelemetry-web/src/utils.ts index 6b94959f96..385cb1d05f 100644 --- a/packages/opentelemetry-web/src/utils.ts +++ b/packages/opentelemetry-web/src/utils.ts @@ -125,7 +125,9 @@ export function getResource( startTimeHR: api.HrTime, endTimeHR: api.HrTime, resources: PerformanceResourceTiming[], - ignoredResources: WeakSet = new WeakSet(), + ignoredResources: WeakSet = new WeakSet< + PerformanceResourceTiming + >(), initiatorType?: string ): PerformanceResourceTimingInfo { // de-relativize the URL before usage (does no harm to absolute URLs) diff --git a/packages/opentelemetry-web/test/WebTracerProvider.test.ts b/packages/opentelemetry-web/test/WebTracerProvider.test.ts index 281f901fc5..f68e1cc49d 100644 --- a/packages/opentelemetry-web/test/WebTracerProvider.test.ts +++ b/packages/opentelemetry-web/test/WebTracerProvider.test.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { context } from '@opentelemetry/api'; +import { context, getActiveSpan, setActiveSpan } from '@opentelemetry/api'; import { ContextManager } from '@opentelemetry/context-base'; import { ZoneContextManager } from '@opentelemetry/context-zone'; import { BasePlugin, NoopLogger } from '@opentelemetry/core'; @@ -133,9 +133,9 @@ describe('WebTracerProvider', () => { const rootSpan = webTracerWithZone.startSpan('rootSpan'); - webTracerWithZone.withSpan(rootSpan, () => { + context.with(setActiveSpan(context.active(), rootSpan), () => { assert.ok( - webTracerWithZone.getCurrentSpan() === rootSpan, + getActiveSpan(context.active()) === rootSpan, 'Current span is rootSpan' ); const concurrentSpan1 = webTracerWithZone.startSpan( @@ -145,19 +145,19 @@ describe('WebTracerProvider', () => { 'concurrentSpan2' ); - webTracerWithZone.withSpan(concurrentSpan1, () => { + context.with(setActiveSpan(context.active(), concurrentSpan1), () => { setTimeout(() => { assert.ok( - webTracerWithZone.getCurrentSpan() === concurrentSpan1, + getActiveSpan(context.active()) === concurrentSpan1, 'Current span is concurrentSpan1' ); }, 10); }); - webTracerWithZone.withSpan(concurrentSpan2, () => { + context.with(setActiveSpan(context.active(), concurrentSpan2), () => { setTimeout(() => { assert.ok( - webTracerWithZone.getCurrentSpan() === concurrentSpan2, + getActiveSpan(context.active()) === concurrentSpan2, 'Current span is concurrentSpan2' ); done(); From 580054699014e6d1f0c0635c0706edc0b179f2c3 Mon Sep 17 00:00:00 2001 From: Gerhard Stoebich <18708370+Flarna@users.noreply.github.com> Date: Thu, 17 Dec 2020 20:54:22 +0100 Subject: [PATCH 02/10] fixup! lint --- packages/opentelemetry-web/src/utils.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/opentelemetry-web/src/utils.ts b/packages/opentelemetry-web/src/utils.ts index 385cb1d05f..6b94959f96 100644 --- a/packages/opentelemetry-web/src/utils.ts +++ b/packages/opentelemetry-web/src/utils.ts @@ -125,9 +125,7 @@ export function getResource( startTimeHR: api.HrTime, endTimeHR: api.HrTime, resources: PerformanceResourceTiming[], - ignoredResources: WeakSet = new WeakSet< - PerformanceResourceTiming - >(), + ignoredResources: WeakSet = new WeakSet(), initiatorType?: string ): PerformanceResourceTimingInfo { // de-relativize the URL before usage (does no harm to absolute URLs) From 3b3a85d26e23a41ba215301f6939b42b5f59d075 Mon Sep 17 00:00:00 2001 From: Gerhard Stoebich <18708370+Flarna@users.noreply.github.com> Date: Fri, 18 Dec 2020 17:07:42 +0100 Subject: [PATCH 03/10] chore: add upgrade guide --- README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/README.md b/README.md index 7465856da0..9f0688f492 100644 --- a/README.md +++ b/README.md @@ -224,6 +224,16 @@ To request automatic tracing support for a module not on this list, please [file |----------------------------------------------------------|-----------------------------------------------------------------------------------------| | [@opentelemetry/shim-opentracing][otel-shim-opentracing] | OpenTracing shim allows existing OpenTracing instrumentation to report to OpenTelemetry | +## Upgrade guidelines + +### 0.14.0 to 0.15.0 + +[PR-1764](https://github.com/open-telemetry/opentelemetry-js/pull/1764) removed some APIs from `Tracer`: + +- `Tracer.getCurrentSpan()`: use `api.getActiveSpan(api.context.active()))` +- `Tracer.withSpan(span)`: use `api.context.with(api.setActiveSpan(api.context.active(), span))` +- `Tracer.bind(target)`: use `api.context.bind(target)` + ## Useful links - For more information on OpenTelemetry, visit: From 2687330e80be1dbb05459e52d6d7c50cc68b4981 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gerhard=20St=C3=B6bich?= Date: Mon, 21 Dec 2020 07:47:56 +0100 Subject: [PATCH 04/10] fixup! remove superfluous parenthesis Co-authored-by: Mayur Kale --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9f0688f492..f401b029a7 100644 --- a/README.md +++ b/README.md @@ -230,7 +230,7 @@ To request automatic tracing support for a module not on this list, please [file [PR-1764](https://github.com/open-telemetry/opentelemetry-js/pull/1764) removed some APIs from `Tracer`: -- `Tracer.getCurrentSpan()`: use `api.getActiveSpan(api.context.active()))` +- `Tracer.getCurrentSpan()`: use `api.getActiveSpan(api.context.active())` - `Tracer.withSpan(span)`: use `api.context.with(api.setActiveSpan(api.context.active(), span))` - `Tracer.bind(target)`: use `api.context.bind(target)` From 4ec22daae4cf43b955cff1bf53d6b85507a055c8 Mon Sep 17 00:00:00 2001 From: Gerhard Stoebich <18708370+Flarna@users.noreply.github.com> Date: Mon, 21 Dec 2020 08:11:12 +0100 Subject: [PATCH 05/10] fixup! update API readme --- packages/opentelemetry-api/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/opentelemetry-api/README.md b/packages/opentelemetry-api/README.md index 180ab4c7e2..0f91bb0bca 100644 --- a/packages/opentelemetry-api/README.md +++ b/packages/opentelemetry-api/README.md @@ -160,7 +160,7 @@ const api = require("@opentelemetry/api"); const tracer = api.trace.getTracer("my-library-name", "0.2.3"); async function doSomething() { - const span = tracer.startSpan("doSomething", { parent: tracer.getCurrentSpan() }); + const span = tracer.startSpan("doSomething"); try { const result = await doSomethingElse(); span.end(); From 7286e6dbcd4265cd821146f89a3929c17c4ec076 Mon Sep 17 00:00:00 2001 From: Gerhard Stoebich <18708370+Flarna@users.noreply.github.com> Date: Mon, 21 Dec 2020 10:29:59 +0100 Subject: [PATCH 06/10] fixup! import context in grpc-js plugin --- .../src/server/clientStreamAndUnary.ts | 2 +- .../src/server/serverStreamAndBidi.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/opentelemetry-plugin-grpc-js/src/server/clientStreamAndUnary.ts b/packages/opentelemetry-plugin-grpc-js/src/server/clientStreamAndUnary.ts index 57d9157c3a..bef98b2590 100644 --- a/packages/opentelemetry-plugin-grpc-js/src/server/clientStreamAndUnary.ts +++ b/packages/opentelemetry-plugin-grpc-js/src/server/clientStreamAndUnary.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { Span, StatusCode } from '@opentelemetry/api'; +import { context, Span, StatusCode } from '@opentelemetry/api'; import type { ServerCallWithMeta, SendUnaryDataCallback } from '../types'; import { grpcStatusCodeToOpenTelemetryStatusCode } from '../utils'; import { RpcAttribute } from '@opentelemetry/semantic-conventions'; diff --git a/packages/opentelemetry-plugin-grpc-js/src/server/serverStreamAndBidi.ts b/packages/opentelemetry-plugin-grpc-js/src/server/serverStreamAndBidi.ts index faa35e1c10..311097996e 100644 --- a/packages/opentelemetry-plugin-grpc-js/src/server/serverStreamAndBidi.ts +++ b/packages/opentelemetry-plugin-grpc-js/src/server/serverStreamAndBidi.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { Span, StatusCode } from '@opentelemetry/api'; +import { context, Span, StatusCode } from '@opentelemetry/api'; import { RpcAttribute } from '@opentelemetry/semantic-conventions'; import type * as grpcJs from '@grpc/grpc-js'; import type { GrpcJsPlugin } from '../grpcJs'; From 752f76fa42a6f30915cee60289196e9849f7781e Mon Sep 17 00:00:00 2001 From: Gerhard Stoebich <18708370+Flarna@users.noreply.github.com> Date: Mon, 21 Dec 2020 10:31:01 +0100 Subject: [PATCH 07/10] chore: update samples and readme --- examples/basic-tracer-node/index.js | 5 ++-- examples/collector-exporter-node/tracing.js | 5 ++-- examples/grpc-js/client.js | 3 ++- examples/grpc-js/server.js | 4 +-- examples/grpc/client.js | 3 ++- examples/grpc/server.js | 3 ++- examples/http/client.js | 3 ++- examples/http/server.js | 4 +-- examples/https/client.js | 3 ++- examples/https/server.js | 4 +-- .../examples/document-load/index.js | 25 +++++++++---------- examples/tracer-web/examples/fetch/index.js | 17 ++++++------- .../examples/xml-http-request/index.js | 11 ++++---- .../README.md | 14 +++++------ packages/opentelemetry-context-zone/README.md | 14 +++++------ 15 files changed, 58 insertions(+), 60 deletions(-) diff --git a/examples/basic-tracer-node/index.js b/examples/basic-tracer-node/index.js index 45888437c2..bd4f3db1db 100644 --- a/examples/basic-tracer-node/index.js +++ b/examples/basic-tracer-node/index.js @@ -37,9 +37,8 @@ exporter.shutdown(); function doWork(parent) { // Start another span. In this example, the main method already started a // span, so that'll be the parent span, and this will be a child span. - const span = tracer.startSpan('doWork', { - parent, - }); + const ctx = opentelemetry.setActiveSpan(opentelemetry.context.active(), parent); + const span = tracer.startSpan('doWork', undefined, ctx); // simulate some random work. for (let i = 0; i <= Math.floor(Math.random() * 40000000); i += 1) { diff --git a/examples/collector-exporter-node/tracing.js b/examples/collector-exporter-node/tracing.js index cb522c01ee..0cd39074f3 100644 --- a/examples/collector-exporter-node/tracing.js +++ b/examples/collector-exporter-node/tracing.js @@ -39,9 +39,8 @@ setTimeout(() => { function doWork(parent) { // Start another span. In this example, the main method already started a // span, so that'll be the parent span, and this will be a child span. - const span = tracer.startSpan('doWork', { - parent, - }); + const ctx = opentelemetry.setActiveSpan(opentelemetry.context.active(), parent); + const span = tracer.startSpan('doWork', undefined, ctx); // simulate some random work. for (let i = 0; i <= Math.floor(Math.random() * 40000000); i += 1) { diff --git a/examples/grpc-js/client.js b/examples/grpc-js/client.js index ee4090260e..e0e53d0b1b 100644 --- a/examples/grpc-js/client.js +++ b/examples/grpc-js/client.js @@ -1,5 +1,6 @@ 'use strict'; +const api = require('@opentelemetry/api'); const tracer = require('./tracer')('example-grpc-client'); // eslint-disable-next-line import/order const grpc = require('@grpc/grpc-js'); @@ -14,7 +15,7 @@ function main() { // the span, which is created to track work that happens outside of the // request lifecycle entirely. const span = tracer.startSpan('client.js:main()'); - tracer.withSpan(span, () => { + api.context.with(api.setActiveSpan(api.context.active(), span), () => { console.log('Client traceId ', span.context().traceId); const client = new services.GreeterClient( `localhost:${PORT}`, diff --git a/examples/grpc-js/server.js b/examples/grpc-js/server.js index 1d71833ff1..3c1aec9e55 100644 --- a/examples/grpc-js/server.js +++ b/examples/grpc-js/server.js @@ -1,5 +1,6 @@ 'use strict'; +const api = require('@opentelemetry/api'); const tracer = require('./tracer')(('example-grpc-server')); // eslint-disable-next-line import/order const grpc = require('@grpc/grpc-js'); @@ -21,11 +22,10 @@ function startServer() { } function sayHello(call, callback) { - const currentSpan = tracer.getCurrentSpan(); + const currentSpan = api.getActiveSpan(api.context.active()); // display traceid in the terminal console.log(`traceid: ${currentSpan.context().traceId}`); const span = tracer.startSpan('server.js:sayHello()', { - parent: currentSpan, kind: 1, // server attributes: { key: 'value' }, }); diff --git a/examples/grpc/client.js b/examples/grpc/client.js index 5541113af7..587292f19d 100644 --- a/examples/grpc/client.js +++ b/examples/grpc/client.js @@ -1,5 +1,6 @@ 'use strict'; +const api = require('@opentelemetry/api'); const tracer = require('./tracer')('example-grpc-client'); // eslint-disable-next-line import/order const grpc = require('grpc'); @@ -14,7 +15,7 @@ function main() { // the span, which is created to track work that happens outside of the // request lifecycle entirely. const span = tracer.startSpan('client.js:main()'); - tracer.withSpan(span, () => { + api.context.with(api.setActiveSpan(api.context.active(), span), () => { console.log('Client traceId ', span.context().traceId); const client = new services.GreeterClient( `localhost:${PORT}`, diff --git a/examples/grpc/server.js b/examples/grpc/server.js index 1b9d533172..0270955e9c 100644 --- a/examples/grpc/server.js +++ b/examples/grpc/server.js @@ -1,5 +1,6 @@ 'use strict'; +const api = require('@opentelemetry/api'); const tracer = require('./tracer')(('example-grpc-server')); // eslint-disable-next-line import/order const grpc = require('grpc'); @@ -20,7 +21,7 @@ function startServer() { } function sayHello(call, callback) { - const currentSpan = tracer.getCurrentSpan(); + const currentSpan = api.getActiveSpan(api.context.active()); // display traceid in the terminal console.log(`traceid: ${currentSpan.context().traceId}`); const span = tracer.startSpan('server.js:sayHello()', { diff --git a/examples/http/client.js b/examples/http/client.js index 5a88497f66..b1ed45993a 100644 --- a/examples/http/client.js +++ b/examples/http/client.js @@ -1,5 +1,6 @@ 'use strict'; +const api = require('@opentelemetry/api'); const tracer = require('./tracer')('example-http-client'); // eslint-disable-next-line import/order const http = require('http'); @@ -10,7 +11,7 @@ function makeRequest() { // the span, which is created to track work that happens outside of the // request lifecycle entirely. const span = tracer.startSpan('makeRequest'); - tracer.withSpan(span, () => { + api.context.with(api.setActiveSpan(api.context.active(), span), () => { http.get({ host: 'localhost', port: 8080, diff --git a/examples/http/server.js b/examples/http/server.js index d142badf83..7c5f12e575 100644 --- a/examples/http/server.js +++ b/examples/http/server.js @@ -1,5 +1,6 @@ 'use strict'; +const api = require('@opentelemetry/api'); const tracer = require('./tracer')('example-http-server'); // eslint-disable-next-line import/order const http = require('http'); @@ -19,11 +20,10 @@ function startServer(port) { /** A function which handles requests and send response. */ function handleRequest(request, response) { - const currentSpan = tracer.getCurrentSpan(); + const currentSpan = api.getActiveSpan(api.context.active()); // display traceid in the terminal console.log(`traceid: ${currentSpan.context().traceId}`); const span = tracer.startSpan('handleRequest', { - parent: currentSpan, kind: 1, // server attributes: { key: 'value' }, }); diff --git a/examples/https/client.js b/examples/https/client.js index e5b1825163..4b56bdbe8c 100644 --- a/examples/https/client.js +++ b/examples/https/client.js @@ -1,5 +1,6 @@ 'use strict'; +const api = require('@opentelemetry/api'); const tracer = require('./tracer')('example-https-client'); // eslint-disable-next-line import/order const https = require('https'); @@ -10,7 +11,7 @@ function makeRequest() { // the span, which is created to track work that happens outside of the // request lifecycle entirely. const span = tracer.startSpan('makeRequest'); - tracer.withSpan(span, () => { + api.context.with(api.setActiveSpan(api.context.active(), span), () => { https.get({ host: 'localhost', port: 443, diff --git a/examples/https/server.js b/examples/https/server.js index 105005fea8..65764e8835 100644 --- a/examples/https/server.js +++ b/examples/https/server.js @@ -1,5 +1,6 @@ 'use strict'; +const api = require('@opentelemetry/api'); // eslint-disable-next-line import/order const tracer = require('./tracer')('example-https-server'); const fs = require('fs'); @@ -24,11 +25,10 @@ function startServer(port) { /** A function which handles requests and send response. */ function handleRequest(request, response) { - const currentSpan = tracer.getCurrentSpan(); + const currentSpan = api.getActiveSpan(api.context.active()); // display traceid in the terminal console.log(`traceid: ${currentSpan.context().traceId}`); const span = tracer.startSpan('handleRequest', { - parent: currentSpan, kind: 1, // server attributes: { key: 'value' }, }); diff --git a/examples/tracer-web/examples/document-load/index.js b/examples/tracer-web/examples/document-load/index.js index fe72746a5e..739ac5a53b 100644 --- a/examples/tracer-web/examples/document-load/index.js +++ b/examples/tracer-web/examples/document-load/index.js @@ -1,3 +1,4 @@ +import { context, getActiveSpan, setActiveSpan } from '@opentelemetry/api'; import { ConsoleSpanExporter, SimpleSpanProcessor } from '@opentelemetry/tracing'; import { WebTracerProvider } from '@opentelemetry/web'; import { DocumentLoad } from '@opentelemetry/plugin-document-load'; @@ -52,31 +53,29 @@ const prepareClickEvent = () => { } const mainSpan = tracer.startSpan('click button'); - tracer.withSpan(mainSpan, () => { - const span1 = tracer.startSpan('files-series-info-1', { - parent: tracer.getCurrentSpan(), - }); + context.with(setActiveSpan(context.active(), mainSpan), () => { + const span1 = tracer.startSpan('files-series-info-1'); - const span2 = tracer.startSpan('files-series-info-2', { - parent: tracer.getCurrentSpan(), - }); + const span2 = tracer.startSpan('files-series-info-2'); - tracer.withSpan(span1, () => { + context.with(setActiveSpan(context.active(), span1), () => { getData(url1).then((data) => { - console.log('current span is span1', tracer.getCurrentSpan() === span1); + const curSpan = getActiveSpan(context.active()); + console.log('current span is span1', curSpan === span1); console.log('info from package.json', data.description, data.version); - tracer.getCurrentSpan().addEvent('fetching-span1-completed'); + curSpan.addEvent('fetching-span1-completed'); span1.end(); finish(); }); }); - tracer.withSpan(span2, () => { + context.with(setActiveSpan(context.active(), span2), () => { getData(url2).then((data) => { setTimeout(() => { - console.log('current span is span2', tracer.getCurrentSpan() === span2); + const curSpan = getActiveSpan(context.active()); + console.log('current span is span2', curSpan === span2); console.log('info from package.json', data.description, data.version); - tracer.getCurrentSpan().addEvent('fetching-span2-completed'); + curSpan.addEvent('fetching-span2-completed'); span2.end(); finish(); }, 100); diff --git a/examples/tracer-web/examples/fetch/index.js b/examples/tracer-web/examples/fetch/index.js index 6717136bee..32c923373b 100644 --- a/examples/tracer-web/examples/fetch/index.js +++ b/examples/tracer-web/examples/fetch/index.js @@ -1,5 +1,6 @@ 'use strict'; +import { context, getActiveSpan, setActiveSpan } from '@opentelemetry/api'; import { ConsoleSpanExporter, SimpleSpanProcessor } from '@opentelemetry/tracing'; import { CollectorTraceExporter } from '@opentelemetry/exporter-collector'; import { WebTracerProvider } from '@opentelemetry/web'; @@ -44,22 +45,18 @@ const prepareClickEvent = () => { const element = document.getElementById('button1'); const onClick = () => { - const singleSpan = webTracerWithZone.startSpan(`files-series-info`, { - parent: webTracerWithZone.getCurrentSpan(), - }); - webTracerWithZone.withSpan(singleSpan, () => { + const singleSpan = webTracerWithZone.startSpan(`files-series-info`); + context.with(setActiveSpan(context.active(), singleSpan), () => { getData(url).then((_data) => { - webTracerWithZone.getCurrentSpan().addEvent('fetching-single-span-completed'); + getActiveSpan(context.active()).addEvent('fetching-single-span-completed'); singleSpan.end(); }); }); for (let i = 0, j = 5; i < j; i += 1) { - const span = webTracerWithZone.startSpan(`files-series-info-${i}`, { - parent: webTracerWithZone.getCurrentSpan(), - }); - webTracerWithZone.withSpan(span, () => { + const span = webTracerWithZone.startSpan(`files-series-info-${i}`); + context.with(setActiveSpan(context.active(), span), () => { getData(url).then((_data) => { - webTracerWithZone.getCurrentSpan().addEvent(`fetching-span-${i}-completed`); + getActiveSpan(context.active()).addEvent(`fetching-span-${i}-completed`); span.end(); }); }); diff --git a/examples/tracer-web/examples/xml-http-request/index.js b/examples/tracer-web/examples/xml-http-request/index.js index 2532037bc9..fd06bc19cc 100644 --- a/examples/tracer-web/examples/xml-http-request/index.js +++ b/examples/tracer-web/examples/xml-http-request/index.js @@ -1,3 +1,4 @@ +import { context, getActiveSpan, setActiveSpan } from '@opentelemetry/api'; import { ConsoleSpanExporter, SimpleSpanProcessor } from '@opentelemetry/tracing'; import { WebTracerProvider } from '@opentelemetry/web'; import { XMLHttpRequestInstrumentation } from '@opentelemetry/instrumentation-xml-http-request'; @@ -49,15 +50,13 @@ const prepareClickEvent = () => { const onClick = () => { for (let i = 0, j = 5; i < j; i += 1) { - const span1 = webTracerWithZone.startSpan(`files-series-info-${i}`, { - parent: webTracerWithZone.getCurrentSpan(), - }); - webTracerWithZone.withSpan(span1, () => { + const span1 = webTracerWithZone.startSpan(`files-series-info-${i}`); + context.with(setActiveSpan(context.active(), span1), () => { getData(url1).then((_data) => { - webTracerWithZone.getCurrentSpan().addEvent('fetching-span1-completed'); + getActiveSpan(context.active()).addEvent('fetching-span1-completed'); span1.end(); }, ()=> { - webTracerWithZone.getCurrentSpan().addEvent('fetching-error'); + getActiveSpan(context.active()).addEvent('fetching-error'); span1.end(); }); }); diff --git a/packages/opentelemetry-context-zone-peer-dep/README.md b/packages/opentelemetry-context-zone-peer-dep/README.md index 9314211b8d..db6bdf45d9 100644 --- a/packages/opentelemetry-context-zone-peer-dep/README.md +++ b/packages/opentelemetry-context-zone-peer-dep/README.md @@ -22,7 +22,7 @@ npm install --save @opentelemetry/context-zone-peer-dep ## Usage ```js -import { context } from '@opentelemetry/api'; +import { context, getActiveSpan, setActiveSpan } from '@opentelemetry/api'; import { ConsoleSpanExporter, SimpleSpanProcessor } from '@opentelemetry/tracing'; import { WebTracerProvider } from '@opentelemetry/web'; import { ZoneContextManager } from '@opentelemetry/context-zone-peer-dep'; @@ -37,20 +37,20 @@ providerWithZone.register({ const webTracerWithZone = providerWithZone.getTracer('default'); const span1 = webTracerWithZone.startSpan('foo1'); context.with(setActiveSpan(context.active(), span1, () => { - console.log('Current span is span1', webTracerWithZone.getCurrentSpan() === span1); + console.log('Current span is span1', getActiveSpan(context.active()) === span1); setTimeout(() => { const span2 = webTracerWithZone.startSpan('foo2'); - console.log('Current span is span1', webTracerWithZone.getCurrentSpan() === span1); + console.log('Current span is span1', getActiveSpan(context.active()) === span1); context.with(setActiveSpan(context.active(), span2, () => { - console.log('Current span is span2', webTracerWithZone.getCurrentSpan() === span2); + console.log('Current span is span2', getActiveSpan(context.active()) === span2); setTimeout(() => { - console.log('Current span is span2', webTracerWithZone.getCurrentSpan() === span2); + console.log('Current span is span2', getActiveSpan(context.active()) === span2); }, 500); }); // there is a timeout which still keeps span2 active - console.log('Current span is span2', webTracerWithZone.getCurrentSpan() === span2); + console.log('Current span is span2', getActiveSpan(context.active()) === span2); }, 500); - console.log('Current span is span1', webTracerWithZone.getCurrentSpan() === span1); + console.log('Current span is span1', getActiveSpan(context.active()) === span1); }); ``` diff --git a/packages/opentelemetry-context-zone/README.md b/packages/opentelemetry-context-zone/README.md index 4793647925..bfc06e4f44 100644 --- a/packages/opentelemetry-context-zone/README.md +++ b/packages/opentelemetry-context-zone/README.md @@ -19,7 +19,7 @@ npm install --save @opentelemetry/context-zone ## Usage ```js -import { context } from '@opentelemetry/api'; +import { context, getActiveSpan, setActiveSpan } from '@opentelemetry/api'; import { ConsoleSpanExporter, SimpleSpanProcessor } from '@opentelemetry/tracing'; import { WebTracerProvider } from '@opentelemetry/web'; import { ZoneContextManager } from '@opentelemetry/context-zone'; @@ -35,20 +35,20 @@ const webTracerWithZone = providerWithZone.getTracer('default'); const span1 = webTracerWithZone.startSpan('foo1'); context.with(setActiveSpan(context.active(), span1), () => { - console.log('Current span is span1', webTracerWithZone.getCurrentSpan() === span1); + console.log('Current span is span1', getActiveSpan(context.active()) === span1); setTimeout(() => { const span2 = webTracerWithZone.startSpan('foo2'); - console.log('Current span is span1', webTracerWithZone.getCurrentSpan() === span1); + console.log('Current span is span1', getActiveSpan(context.active()) === span1); context.with(setActiveSpan(context.active(), span2), () => { - console.log('Current span is span2', webTracerWithZone.getCurrentSpan() === span2); + console.log('Current span is span2', getActiveSpan(context.active()) === span2); setTimeout(() => { - console.log('Current span is span2', webTracerWithZone.getCurrentSpan() === span2); + console.log('Current span is span2', getActiveSpan(context.active()) === span2); }, 500); }); // there is a timeout which still keeps span2 active - console.log('Current span is span2', webTracerWithZone.getCurrentSpan() === span2); + console.log('Current span is span2', getActiveSpan(context.active()) === span2); }, 500); - console.log('Current span is span1', webTracerWithZone.getCurrentSpan() === span1); + console.log('Current span is span1', getActiveSpan(context.active()) === span1); }); ``` From 241618198235f5e936ad75b176374e293590dab0 Mon Sep 17 00:00:00 2001 From: Gerhard Stoebich <18708370+Flarna@users.noreply.github.com> Date: Mon, 21 Dec 2020 16:04:38 +0100 Subject: [PATCH 08/10] chore: increment API version --- packages/opentelemetry-api/src/api/global-utils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/opentelemetry-api/src/api/global-utils.ts b/packages/opentelemetry-api/src/api/global-utils.ts index 297836e009..5d6ad7de3e 100644 --- a/packages/opentelemetry-api/src/api/global-utils.ts +++ b/packages/opentelemetry-api/src/api/global-utils.ts @@ -65,4 +65,4 @@ export function makeGetter( * version. If the global API is not compatible with the API package * attempting to get it, a NOOP API implementation will be returned. */ -export const API_BACKWARDS_COMPATIBILITY_VERSION = 2; +export const API_BACKWARDS_COMPATIBILITY_VERSION = 3; From 29f76cf534e0a250f47a39aaf7d670ea7dfe296c Mon Sep 17 00:00:00 2001 From: Gerhard Stoebich <18708370+Flarna@users.noreply.github.com> Date: Mon, 21 Dec 2020 17:18:13 +0100 Subject: [PATCH 09/10] fixup! update after merge from master --- examples/basic-tracer-node/index.js | 2 +- examples/collector-exporter-node/tracing.js | 2 +- examples/grpc-js/client.js | 2 +- examples/grpc-js/server.js | 2 +- examples/grpc/client.js | 2 +- examples/grpc/server.js | 2 +- examples/http/client.js | 2 +- examples/http/server.js | 2 +- examples/https/client.js | 2 +- examples/https/server.js | 2 +- .../examples/document-load/index.js | 12 ++-- examples/tracer-web/examples/fetch/index.js | 10 +-- .../examples/xml-http-request/index.js | 8 +-- .../validation-server.js | 4 +- .../test/grpcUtils.test.ts | 12 ++-- .../src/http.ts | 6 +- .../test/functionals/http-enable.test.ts | 69 +++++++++---------- .../test/functionals/https-enable.test.ts | 69 +++++++++---------- .../src/xhr.ts | 4 +- .../test/xhr.test.ts | 57 ++++++++------- .../test/NodeTracerProvider.test.ts | 24 +++---- .../opentelemetry-plugin-fetch/src/fetch.ts | 2 +- .../test/fetch.test.ts | 2 +- .../src/client/utils.ts | 4 +- .../src/server/patchServer.ts | 4 +- .../opentelemetry-plugin-grpc/src/grpc.ts | 6 +- .../opentelemetry-plugin-http/src/http.ts | 6 +- .../test/functionals/http-enable.test.ts | 69 +++++++++---------- .../test/functionals/https-enable.test.ts | 69 +++++++++---------- .../test/BasicTracerProvider.test.ts | 8 +-- .../test/WebTracerProvider.test.ts | 14 ++-- 31 files changed, 232 insertions(+), 247 deletions(-) diff --git a/examples/basic-tracer-node/index.js b/examples/basic-tracer-node/index.js index bd4f3db1db..fd046c0d45 100644 --- a/examples/basic-tracer-node/index.js +++ b/examples/basic-tracer-node/index.js @@ -37,7 +37,7 @@ exporter.shutdown(); function doWork(parent) { // Start another span. In this example, the main method already started a // span, so that'll be the parent span, and this will be a child span. - const ctx = opentelemetry.setActiveSpan(opentelemetry.context.active(), parent); + const ctx = opentelemetry.setSpan(opentelemetry.context.active(), parent); const span = tracer.startSpan('doWork', undefined, ctx); // simulate some random work. diff --git a/examples/collector-exporter-node/tracing.js b/examples/collector-exporter-node/tracing.js index 0cd39074f3..af9b617b04 100644 --- a/examples/collector-exporter-node/tracing.js +++ b/examples/collector-exporter-node/tracing.js @@ -39,7 +39,7 @@ setTimeout(() => { function doWork(parent) { // Start another span. In this example, the main method already started a // span, so that'll be the parent span, and this will be a child span. - const ctx = opentelemetry.setActiveSpan(opentelemetry.context.active(), parent); + const ctx = opentelemetry.setSpan(opentelemetry.context.active(), parent); const span = tracer.startSpan('doWork', undefined, ctx); // simulate some random work. diff --git a/examples/grpc-js/client.js b/examples/grpc-js/client.js index e0e53d0b1b..958f29ef11 100644 --- a/examples/grpc-js/client.js +++ b/examples/grpc-js/client.js @@ -15,7 +15,7 @@ function main() { // the span, which is created to track work that happens outside of the // request lifecycle entirely. const span = tracer.startSpan('client.js:main()'); - api.context.with(api.setActiveSpan(api.context.active(), span), () => { + api.context.with(api.setSpan(api.context.active(), span), () => { console.log('Client traceId ', span.context().traceId); const client = new services.GreeterClient( `localhost:${PORT}`, diff --git a/examples/grpc-js/server.js b/examples/grpc-js/server.js index 3c1aec9e55..6bd451b918 100644 --- a/examples/grpc-js/server.js +++ b/examples/grpc-js/server.js @@ -22,7 +22,7 @@ function startServer() { } function sayHello(call, callback) { - const currentSpan = api.getActiveSpan(api.context.active()); + const currentSpan = api.getSpan(api.context.active()); // display traceid in the terminal console.log(`traceid: ${currentSpan.context().traceId}`); const span = tracer.startSpan('server.js:sayHello()', { diff --git a/examples/grpc/client.js b/examples/grpc/client.js index 587292f19d..5bb4b630aa 100644 --- a/examples/grpc/client.js +++ b/examples/grpc/client.js @@ -15,7 +15,7 @@ function main() { // the span, which is created to track work that happens outside of the // request lifecycle entirely. const span = tracer.startSpan('client.js:main()'); - api.context.with(api.setActiveSpan(api.context.active(), span), () => { + api.context.with(api.setSpan(api.context.active(), span), () => { console.log('Client traceId ', span.context().traceId); const client = new services.GreeterClient( `localhost:${PORT}`, diff --git a/examples/grpc/server.js b/examples/grpc/server.js index 0270955e9c..40db771365 100644 --- a/examples/grpc/server.js +++ b/examples/grpc/server.js @@ -21,7 +21,7 @@ function startServer() { } function sayHello(call, callback) { - const currentSpan = api.getActiveSpan(api.context.active()); + const currentSpan = api.getSpan(api.context.active()); // display traceid in the terminal console.log(`traceid: ${currentSpan.context().traceId}`); const span = tracer.startSpan('server.js:sayHello()', { diff --git a/examples/http/client.js b/examples/http/client.js index b1ed45993a..a27ba0355e 100644 --- a/examples/http/client.js +++ b/examples/http/client.js @@ -11,7 +11,7 @@ function makeRequest() { // the span, which is created to track work that happens outside of the // request lifecycle entirely. const span = tracer.startSpan('makeRequest'); - api.context.with(api.setActiveSpan(api.context.active(), span), () => { + api.context.with(api.setSpan(api.context.active(), span), () => { http.get({ host: 'localhost', port: 8080, diff --git a/examples/http/server.js b/examples/http/server.js index 7c5f12e575..d7a90310fb 100644 --- a/examples/http/server.js +++ b/examples/http/server.js @@ -20,7 +20,7 @@ function startServer(port) { /** A function which handles requests and send response. */ function handleRequest(request, response) { - const currentSpan = api.getActiveSpan(api.context.active()); + const currentSpan = api.getSpan(api.context.active()); // display traceid in the terminal console.log(`traceid: ${currentSpan.context().traceId}`); const span = tracer.startSpan('handleRequest', { diff --git a/examples/https/client.js b/examples/https/client.js index 4b56bdbe8c..d842becef3 100644 --- a/examples/https/client.js +++ b/examples/https/client.js @@ -11,7 +11,7 @@ function makeRequest() { // the span, which is created to track work that happens outside of the // request lifecycle entirely. const span = tracer.startSpan('makeRequest'); - api.context.with(api.setActiveSpan(api.context.active(), span), () => { + api.context.with(api.setSpan(api.context.active(), span), () => { https.get({ host: 'localhost', port: 443, diff --git a/examples/https/server.js b/examples/https/server.js index 65764e8835..a3d480f568 100644 --- a/examples/https/server.js +++ b/examples/https/server.js @@ -25,7 +25,7 @@ function startServer(port) { /** A function which handles requests and send response. */ function handleRequest(request, response) { - const currentSpan = api.getActiveSpan(api.context.active()); + const currentSpan = api.getSpan(api.context.active()); // display traceid in the terminal console.log(`traceid: ${currentSpan.context().traceId}`); const span = tracer.startSpan('handleRequest', { diff --git a/examples/tracer-web/examples/document-load/index.js b/examples/tracer-web/examples/document-load/index.js index 739ac5a53b..148bbe6c64 100644 --- a/examples/tracer-web/examples/document-load/index.js +++ b/examples/tracer-web/examples/document-load/index.js @@ -1,4 +1,4 @@ -import { context, getActiveSpan, setActiveSpan } from '@opentelemetry/api'; +import { context, getSpan, setSpan } from '@opentelemetry/api'; import { ConsoleSpanExporter, SimpleSpanProcessor } from '@opentelemetry/tracing'; import { WebTracerProvider } from '@opentelemetry/web'; import { DocumentLoad } from '@opentelemetry/plugin-document-load'; @@ -53,14 +53,14 @@ const prepareClickEvent = () => { } const mainSpan = tracer.startSpan('click button'); - context.with(setActiveSpan(context.active(), mainSpan), () => { + context.with(setSpan(context.active(), mainSpan), () => { const span1 = tracer.startSpan('files-series-info-1'); const span2 = tracer.startSpan('files-series-info-2'); - context.with(setActiveSpan(context.active(), span1), () => { + context.with(setSpan(context.active(), span1), () => { getData(url1).then((data) => { - const curSpan = getActiveSpan(context.active()); + const curSpan = getSpan(context.active()); console.log('current span is span1', curSpan === span1); console.log('info from package.json', data.description, data.version); curSpan.addEvent('fetching-span1-completed'); @@ -69,10 +69,10 @@ const prepareClickEvent = () => { }); }); - context.with(setActiveSpan(context.active(), span2), () => { + context.with(setSpan(context.active(), span2), () => { getData(url2).then((data) => { setTimeout(() => { - const curSpan = getActiveSpan(context.active()); + const curSpan = getSpan(context.active()); console.log('current span is span2', curSpan === span2); console.log('info from package.json', data.description, data.version); curSpan.addEvent('fetching-span2-completed'); diff --git a/examples/tracer-web/examples/fetch/index.js b/examples/tracer-web/examples/fetch/index.js index 32c923373b..3ee96052b6 100644 --- a/examples/tracer-web/examples/fetch/index.js +++ b/examples/tracer-web/examples/fetch/index.js @@ -1,6 +1,6 @@ 'use strict'; -import { context, getActiveSpan, setActiveSpan } from '@opentelemetry/api'; +import { context, getSpan, setSpan } from '@opentelemetry/api'; import { ConsoleSpanExporter, SimpleSpanProcessor } from '@opentelemetry/tracing'; import { CollectorTraceExporter } from '@opentelemetry/exporter-collector'; import { WebTracerProvider } from '@opentelemetry/web'; @@ -46,17 +46,17 @@ const prepareClickEvent = () => { const onClick = () => { const singleSpan = webTracerWithZone.startSpan(`files-series-info`); - context.with(setActiveSpan(context.active(), singleSpan), () => { + context.with(setSpan(context.active(), singleSpan), () => { getData(url).then((_data) => { - getActiveSpan(context.active()).addEvent('fetching-single-span-completed'); + getSpan(context.active()).addEvent('fetching-single-span-completed'); singleSpan.end(); }); }); for (let i = 0, j = 5; i < j; i += 1) { const span = webTracerWithZone.startSpan(`files-series-info-${i}`); - context.with(setActiveSpan(context.active(), span), () => { + context.with(setSpan(context.active(), span), () => { getData(url).then((_data) => { - getActiveSpan(context.active()).addEvent(`fetching-span-${i}-completed`); + getSpan(context.active()).addEvent(`fetching-span-${i}-completed`); span.end(); }); }); diff --git a/examples/tracer-web/examples/xml-http-request/index.js b/examples/tracer-web/examples/xml-http-request/index.js index fd06bc19cc..cc8a8a4839 100644 --- a/examples/tracer-web/examples/xml-http-request/index.js +++ b/examples/tracer-web/examples/xml-http-request/index.js @@ -1,4 +1,4 @@ -import { context, getActiveSpan, setActiveSpan } from '@opentelemetry/api'; +import { context, getSpan, setSpan } from '@opentelemetry/api'; import { ConsoleSpanExporter, SimpleSpanProcessor } from '@opentelemetry/tracing'; import { WebTracerProvider } from '@opentelemetry/web'; import { XMLHttpRequestInstrumentation } from '@opentelemetry/instrumentation-xml-http-request'; @@ -51,12 +51,12 @@ const prepareClickEvent = () => { const onClick = () => { for (let i = 0, j = 5; i < j; i += 1) { const span1 = webTracerWithZone.startSpan(`files-series-info-${i}`); - context.with(setActiveSpan(context.active(), span1), () => { + context.with(setSpan(context.active(), span1), () => { getData(url1).then((_data) => { - getActiveSpan(context.active()).addEvent('fetching-span1-completed'); + getSpan(context.active()).addEvent('fetching-span1-completed'); span1.end(); }, ()=> { - getActiveSpan(context.active()).addEvent('fetching-error'); + getSpan(context.active()).addEvent('fetching-error'); span1.end(); }); }); diff --git a/integration-tests/propagation-validation-server/validation-server.js b/integration-tests/propagation-validation-server/validation-server.js index a3f8c997fd..badcddb769 100644 --- a/integration-tests/propagation-validation-server/validation-server.js +++ b/integration-tests/propagation-validation-server/validation-server.js @@ -1,7 +1,7 @@ const axios = require("axios"); const { HttpTraceContext } = require("@opentelemetry/core"); const { BasicTracerProvider } = require("@opentelemetry/tracing"); -const { context, propagation, setActiveSpan, trace, ROOT_CONTEXT } = require("@opentelemetry/api"); +const { context, propagation, setSpan, trace, ROOT_CONTEXT } = require("@opentelemetry/api"); const { AsyncHooksContextManager, } = require("@opentelemetry/context-async-hooks"); @@ -36,7 +36,7 @@ app.post("/verify-tracecontext", (req, res) => { req.body.map((action) => { const span = tracer.startSpan("propagate-w3c"); let promise; - context.with(setActiveSpan(context.active(), span), () => { + context.with(setSpan(context.active(), span), () => { const headers = {}; propagation.inject(context.active(), headers); promise = axios diff --git a/packages/opentelemetry-grpc-utils/test/grpcUtils.test.ts b/packages/opentelemetry-grpc-utils/test/grpcUtils.test.ts index c694c83852..ffb857088d 100644 --- a/packages/opentelemetry-grpc-utils/test/grpcUtils.test.ts +++ b/packages/opentelemetry-grpc-utils/test/grpcUtils.test.ts @@ -19,8 +19,8 @@ import { NoopTracerProvider, SpanKind, propagation, - getActiveSpan, - setActiveSpan, + getSpan, + setSpan, } from '@opentelemetry/api'; import { NoopLogger, @@ -529,8 +529,8 @@ export const runTests = ( const span = provider .getTracer('default') .startSpan('TestSpan', { kind: SpanKind.PRODUCER }); - return context.with(setActiveSpan(context.active(), span), async () => { - const rootSpan = getActiveSpan(context.active()); + return context.with(setSpan(context.active(), span), async () => { + const rootSpan = getSpan(context.active()); if (!rootSpan) { return assert.ok(false); } @@ -625,8 +625,8 @@ export const runTests = ( const span = provider .getTracer('default') .startSpan('TestSpan', { kind: SpanKind.PRODUCER }); - return context.with(setActiveSpan(context.active(), span), async () => { - const rootSpan = getActiveSpan(context.active()); + return context.with(setSpan(context.active(), span), async () => { + const rootSpan = getSpan(context.active()); if (!rootSpan) { return assert.ok(false); } diff --git a/packages/opentelemetry-instrumentation-http/src/http.ts b/packages/opentelemetry-instrumentation-http/src/http.ts index 89b9831078..7e97214387 100644 --- a/packages/opentelemetry-instrumentation-http/src/http.ts +++ b/packages/opentelemetry-instrumentation-http/src/http.ts @@ -25,7 +25,7 @@ import { SpanContext, TraceFlags, ROOT_CONTEXT, - getActiveSpan, + getSpan, } from '@opentelemetry/api'; import { NoRecordingSpan } from '@opentelemetry/core'; import type * as http from 'http'; @@ -411,7 +411,7 @@ export class HttpInstrumentation extends InstrumentationBase { spanOptions ); - return context.with(setActiveSpan(context.active(), span), () => { + return context.with(setSpan(context.active(), span), () => { context.bind(request); context.bind(response); @@ -581,7 +581,7 @@ export class HttpInstrumentation extends InstrumentationBase { : this._getConfig().requireParentforIncomingSpans; let span: Span; - const currentSpan = getActiveSpan(context.active()); + const currentSpan = getSpan(context.active()); if (requireParent === true && currentSpan === undefined) { // TODO: Refactor this when a solution is found in diff --git a/packages/opentelemetry-instrumentation-http/test/functionals/http-enable.test.ts b/packages/opentelemetry-instrumentation-http/test/functionals/http-enable.test.ts index e8ddbfdd23..95627f134c 100644 --- a/packages/opentelemetry-instrumentation-http/test/functionals/http-enable.test.ts +++ b/packages/opentelemetry-instrumentation-http/test/functionals/http-enable.test.ts @@ -322,7 +322,7 @@ describe('HttpInstrumentation', () => { doNock(hostname, testPath, 200, 'Ok'); const name = 'TestRootSpan'; const span = provider.getTracer('default').startSpan(name); - return context.with(setActiveSpan(context.active(), span), async () => { + return context.with(setSpan(context.active(), span), async () => { const result = await httpRequest.get( `${protocol}://${hostname}${testPath}` ); @@ -365,39 +365,36 @@ describe('HttpInstrumentation', () => { ); const name = 'TestRootSpan'; const span = provider.getTracer('default').startSpan(name); - return context.with( - setActiveSpan(context.active(), span), - async () => { - const result = await httpRequest.get( - `${protocol}://${hostname}${testPath}` - ); - span.end(); - const spans = memoryExporter.getFinishedSpans(); - const [reqSpan, localSpan] = spans; - const validations = { - hostname, - httpStatusCode: result.statusCode!, - httpMethod: 'GET', - pathname: testPath, - resHeaders: result.resHeaders, - reqHeaders: result.reqHeaders, - component: 'http', - }; - - assert.ok(localSpan.name.indexOf('TestRootSpan') >= 0); - assert.strictEqual(spans.length, 2); - assert.strictEqual(reqSpan.name, 'HTTP GET'); - assert.strictEqual( - localSpan.spanContext.traceId, - reqSpan.spanContext.traceId - ); - assertSpan(reqSpan, SpanKind.CLIENT, validations); - assert.notStrictEqual( - localSpan.spanContext.spanId, - reqSpan.spanContext.spanId - ); - } - ); + return context.with(setSpan(context.active(), span), async () => { + const result = await httpRequest.get( + `${protocol}://${hostname}${testPath}` + ); + span.end(); + const spans = memoryExporter.getFinishedSpans(); + const [reqSpan, localSpan] = spans; + const validations = { + hostname, + httpStatusCode: result.statusCode!, + httpMethod: 'GET', + pathname: testPath, + resHeaders: result.resHeaders, + reqHeaders: result.reqHeaders, + component: 'http', + }; + + assert.ok(localSpan.name.indexOf('TestRootSpan') >= 0); + assert.strictEqual(spans.length, 2); + assert.strictEqual(reqSpan.name, 'HTTP GET'); + assert.strictEqual( + localSpan.spanContext.traceId, + reqSpan.spanContext.traceId + ); + assertSpan(reqSpan, SpanKind.CLIENT, validations); + assert.notStrictEqual( + localSpan.spanContext.spanId, + reqSpan.spanContext.spanId + ); + }); }); } @@ -407,7 +404,7 @@ describe('HttpInstrumentation', () => { doNock(hostname, testPath, 200, 'Ok', num); const name = 'TestRootSpan'; const span = provider.getTracer('default').startSpan(name); - await context.with(setActiveSpan(context.active(), span), async () => { + await context.with(setSpan(context.active(), span), async () => { for (let i = 0; i < num; i++) { await httpRequest.get(`${protocol}://${hostname}${testPath}`); const spans = memoryExporter.getFinishedSpans(); @@ -798,7 +795,7 @@ describe('HttpInstrumentation', () => { const span = tracer.startSpan('parentSpan', { kind: SpanKind.INTERNAL, }); - context.with(setActiveSpan(context.active(), span), () => { + context.with(setSpan(context.active(), span), () => { httpRequest .get(`${protocol}://${hostname}:${serverPort}${testPath}`) .then(result => { diff --git a/packages/opentelemetry-instrumentation-http/test/functionals/https-enable.test.ts b/packages/opentelemetry-instrumentation-http/test/functionals/https-enable.test.ts index 671879bf15..9c4ba49fd2 100644 --- a/packages/opentelemetry-instrumentation-http/test/functionals/https-enable.test.ts +++ b/packages/opentelemetry-instrumentation-http/test/functionals/https-enable.test.ts @@ -20,7 +20,7 @@ import { propagation, Span as ISpan, SpanKind, - setActiveSpan, + setSpan, } from '@opentelemetry/api'; import { NoopLogger } from '@opentelemetry/core'; import { AsyncHooksContextManager } from '@opentelemetry/context-async-hooks'; @@ -309,7 +309,7 @@ describe('HttpsInstrumentation', () => { doNock(hostname, testPath, 200, 'Ok'); const name = 'TestRootSpan'; const span = tracer.startSpan(name); - return context.with(setActiveSpan(context.active(), span), async () => { + return context.with(setSpan(context.active(), span), async () => { const result = await httpsRequest.get( `${protocol}://${hostname}${testPath}` ); @@ -352,39 +352,36 @@ describe('HttpsInstrumentation', () => { ); const name = 'TestRootSpan'; const span = tracer.startSpan(name); - return context.with( - setActiveSpan(context.active(), span), - async () => { - const result = await httpsRequest.get( - `${protocol}://${hostname}${testPath}` - ); - span.end(); - const spans = memoryExporter.getFinishedSpans(); - const [reqSpan, localSpan] = spans; - const validations = { - hostname, - httpStatusCode: result.statusCode!, - httpMethod: 'GET', - pathname: testPath, - resHeaders: result.resHeaders, - reqHeaders: result.reqHeaders, - component: 'https', - }; - - assert.ok(localSpan.name.indexOf('TestRootSpan') >= 0); - assert.strictEqual(spans.length, 2); - assert.strictEqual(reqSpan.name, 'HTTPS GET'); - assert.strictEqual( - localSpan.spanContext.traceId, - reqSpan.spanContext.traceId - ); - assertSpan(reqSpan, SpanKind.CLIENT, validations); - assert.notStrictEqual( - localSpan.spanContext.spanId, - reqSpan.spanContext.spanId - ); - } - ); + return context.with(setSpan(context.active(), span), async () => { + const result = await httpsRequest.get( + `${protocol}://${hostname}${testPath}` + ); + span.end(); + const spans = memoryExporter.getFinishedSpans(); + const [reqSpan, localSpan] = spans; + const validations = { + hostname, + httpStatusCode: result.statusCode!, + httpMethod: 'GET', + pathname: testPath, + resHeaders: result.resHeaders, + reqHeaders: result.reqHeaders, + component: 'https', + }; + + assert.ok(localSpan.name.indexOf('TestRootSpan') >= 0); + assert.strictEqual(spans.length, 2); + assert.strictEqual(reqSpan.name, 'HTTPS GET'); + assert.strictEqual( + localSpan.spanContext.traceId, + reqSpan.spanContext.traceId + ); + assertSpan(reqSpan, SpanKind.CLIENT, validations); + assert.notStrictEqual( + localSpan.spanContext.spanId, + reqSpan.spanContext.spanId + ); + }); }); } @@ -394,7 +391,7 @@ describe('HttpsInstrumentation', () => { doNock(hostname, testPath, 200, 'Ok', num); const name = 'TestRootSpan'; const span = tracer.startSpan(name); - await context.with(setActiveSpan(context.active(), span), async () => { + await context.with(setSpan(context.active(), span), async () => { for (let i = 0; i < num; i++) { await httpsRequest.get(`${protocol}://${hostname}${testPath}`); const spans = memoryExporter.getFinishedSpans(); diff --git a/packages/opentelemetry-instrumentation-xml-http-request/src/xhr.ts b/packages/opentelemetry-instrumentation-xml-http-request/src/xhr.ts index 596fdb2e57..b3f96e7f43 100644 --- a/packages/opentelemetry-instrumentation-xml-http-request/src/xhr.ts +++ b/packages/opentelemetry-instrumentation-xml-http-request/src/xhr.ts @@ -125,7 +125,7 @@ export class XMLHttpRequestInstrumentation extends InstrumentationBase { + api.context.with(api.setSpan(api.context.active(), span), () => { const childSpan = this.tracer.startSpan('CORS Preflight', { startTime: corsPreFlightRequest[PTN.FETCH_START], }); @@ -438,7 +438,7 @@ export class XMLHttpRequestInstrumentation extends InstrumentationBase { plugin._tasksCount++; xhrMem.sendStartTime = hrTime(); diff --git a/packages/opentelemetry-instrumentation-xml-http-request/test/xhr.test.ts b/packages/opentelemetry-instrumentation-xml-http-request/test/xhr.test.ts index 5a3f234463..f5acb4ebf8 100644 --- a/packages/opentelemetry-instrumentation-xml-http-request/test/xhr.test.ts +++ b/packages/opentelemetry-instrumentation-xml-http-request/test/xhr.test.ts @@ -213,30 +213,27 @@ describe('xhr', () => { ); rootSpan = webTracerWithZone.startSpan('root'); - api.context.with( - api.setActiveSpan(api.context.active(), rootSpan), - () => { - getData( - new XMLHttpRequest(), - fileUrl, - () => { - fakeNow = 100; - }, - testAsync - ).then(() => { - fakeNow = 0; - sandbox.clock.tick(1000); - done(); - }); - assert.strictEqual(requests.length, 1, 'request not called'); - - requests[0].respond( - 200, - { 'Content-Type': 'application/json' }, - '{"foo":"bar"}' - ); - } - ); + api.context.with(api.setSpan(api.context.active(), rootSpan), () => { + getData( + new XMLHttpRequest(), + fileUrl, + () => { + fakeNow = 100; + }, + testAsync + ).then(() => { + fakeNow = 0; + sandbox.clock.tick(1000); + done(); + }); + assert.strictEqual(requests.length, 1, 'request not called'); + + requests[0].respond( + 200, + { 'Content-Type': 'application/json' }, + '{"foo":"bar"}' + ); + }); }; beforeEach(done => { @@ -630,7 +627,7 @@ describe('xhr', () => { ); const reusableReq = new XMLHttpRequest(); api.context.with( - api.setActiveSpan(api.context.active(), rootSpan), + api.setSpan(api.context.active(), rootSpan), () => { getData( reusableReq, @@ -647,7 +644,7 @@ describe('xhr', () => { ); api.context.with( - api.setActiveSpan(api.context.active(), rootSpan), + api.setSpan(api.context.active(), rootSpan), () => { getData( reusableReq, @@ -748,7 +745,7 @@ describe('xhr', () => { describe('when request loads and receives an error code', () => { beforeEach(done => { api.context.with( - api.setActiveSpan(api.context.active(), rootSpan), + api.setSpan(api.context.active(), rootSpan), () => { getData( new XMLHttpRequest(), @@ -885,7 +882,7 @@ describe('xhr', () => { describe('when request encounters a network error', () => { beforeEach(done => { api.context.with( - api.setActiveSpan(api.context.active(), rootSpan), + api.setSpan(api.context.active(), rootSpan), () => { getData(new XMLHttpRequest(), url, () => {}, testAsync).then( () => { @@ -977,7 +974,7 @@ describe('xhr', () => { beforeEach(done => { api.context.with( - api.setActiveSpan(api.context.active(), rootSpan), + api.setSpan(api.context.active(), rootSpan), () => { getData(new XMLHttpRequest(), url, () => {}, testAsync).then( () => { @@ -1069,7 +1066,7 @@ describe('xhr', () => { beforeEach(done => { api.context.with( - api.setActiveSpan(api.context.active(), rootSpan), + api.setSpan(api.context.active(), rootSpan), () => { getData( new XMLHttpRequest(), diff --git a/packages/opentelemetry-node/test/NodeTracerProvider.test.ts b/packages/opentelemetry-node/test/NodeTracerProvider.test.ts index 8af245c7e2..185c5d1613 100644 --- a/packages/opentelemetry-node/test/NodeTracerProvider.test.ts +++ b/packages/opentelemetry-node/test/NodeTracerProvider.test.ts @@ -208,23 +208,23 @@ describe('NodeTracerProvider', () => { it('should run context with AsyncHooksContextManager context manager', done => { provider = new NodeTracerProvider({}); const span = provider.getTracer('default').startSpan('my-span'); - context.with(setActiveSpan(context.active(), span), () => { - assert.deepStrictEqual(getActiveSpan(context.active()), span); + context.with(setSpan(context.active(), span), () => { + assert.deepStrictEqual(getSpan(context.active()), span); return done(); }); - assert.deepStrictEqual(getActiveSpan(context.active()), undefined); + assert.deepStrictEqual(getSpan(context.active()), undefined); }); it('should run context with AsyncHooksContextManager context manager with multiple spans', done => { provider = new NodeTracerProvider({}); const span = provider.getTracer('default').startSpan('my-span'); - context.with(setActiveSpan(context.active(), span), () => { - assert.deepStrictEqual(getActiveSpan(context.active()), span); + context.with(setSpan(context.active(), span), () => { + assert.deepStrictEqual(getSpan(context.active()), span); const span1 = provider.getTracer('default').startSpan('my-span1'); - context.with(setActiveSpan(context.active(), span1), () => { - assert.deepStrictEqual(getActiveSpan(context.active()), span1); + context.with(setSpan(context.active(), span1), () => { + assert.deepStrictEqual(getSpan(context.active()), span1); assert.deepStrictEqual( span1.context().traceId, span.context().traceId @@ -234,20 +234,20 @@ describe('NodeTracerProvider', () => { }); // when span ended. // @todo: below check is not running. - assert.deepStrictEqual(getActiveSpan(context.active()), undefined); + assert.deepStrictEqual(getSpan(context.active()), undefined); }); it('should find correct context with promises', async () => { provider = new NodeTracerProvider(); const span = provider.getTracer('default').startSpan('my-span'); - await context.with(setActiveSpan(context.active(), span), async () => { + await context.with(setSpan(context.active(), span), async () => { for (let i = 0; i < 3; i++) { await sleep(5).then(() => { - assert.deepStrictEqual(getActiveSpan(context.active()), span); + assert.deepStrictEqual(getSpan(context.active()), span); }); } }); - assert.deepStrictEqual(getActiveSpan(context.active()), undefined); + assert.deepStrictEqual(getSpan(context.active()), undefined); }); }); @@ -256,7 +256,7 @@ describe('NodeTracerProvider', () => { const provider = new NodeTracerProvider({}); const span = provider.getTracer('default').startSpan('my-span'); const fn = () => { - assert.deepStrictEqual(getActiveSpan(context.active()), span); + assert.deepStrictEqual(getSpan(context.active()), span); return done(); }; const patchedFn = context.bind(fn, setSpan(context.active(), span)); diff --git a/packages/opentelemetry-plugin-fetch/src/fetch.ts b/packages/opentelemetry-plugin-fetch/src/fetch.ts index 9fa96b07b4..419a80cb40 100644 --- a/packages/opentelemetry-plugin-fetch/src/fetch.ts +++ b/packages/opentelemetry-plugin-fetch/src/fetch.ts @@ -300,7 +300,7 @@ export class FetchPlugin extends core.BasePlugin> { return new Promise((resolve, reject) => { return api.context.with( - api.setActiveSpan(api.context.active(), span), + api.setSpan(api.context.active(), span), () => { plugin._addHeaders(options, url); plugin._tasksCount++; diff --git a/packages/opentelemetry-plugin-fetch/test/fetch.test.ts b/packages/opentelemetry-plugin-fetch/test/fetch.test.ts index fecd33bdc2..80c3000b1f 100644 --- a/packages/opentelemetry-plugin-fetch/test/fetch.test.ts +++ b/packages/opentelemetry-plugin-fetch/test/fetch.test.ts @@ -178,7 +178,7 @@ describe('fetch', () => { ); rootSpan = webTracerWithZone.startSpan('root'); - api.context.with(api.setActiveSpan(api.context.active(), rootSpan), () => { + api.context.with(api.setSpan(api.context.active(), rootSpan), () => { fakeNow = 0; getData(fileUrl, method).then( response => { diff --git a/packages/opentelemetry-plugin-grpc-js/src/client/utils.ts b/packages/opentelemetry-plugin-grpc-js/src/client/utils.ts index ea8598d56f..70632b6ac8 100644 --- a/packages/opentelemetry-plugin-grpc-js/src/client/utils.ts +++ b/packages/opentelemetry-plugin-grpc-js/src/client/utils.ts @@ -23,7 +23,7 @@ import { Status, propagation, context, - setActiveSpan, + setSpan, } from '@opentelemetry/api'; import { RpcAttribute } from '@opentelemetry/semantic-conventions'; import type * as grpcJs from '@grpc/grpc-js'; @@ -81,7 +81,7 @@ export function getPatchedClientMethods( const span = plugin.tracer.startSpan(name, { kind: SpanKind.CLIENT, }); - return context.with(setActiveSpan(context.active(), span), () => + return context.with(setSpan(context.active(), span), () => makeGrpcClientRemoteCall(original, args, metadata, this)(span) ); }; diff --git a/packages/opentelemetry-plugin-grpc-js/src/server/patchServer.ts b/packages/opentelemetry-plugin-grpc-js/src/server/patchServer.ts index e72b8e3271..efad948e9c 100644 --- a/packages/opentelemetry-plugin-grpc-js/src/server/patchServer.ts +++ b/packages/opentelemetry-plugin-grpc-js/src/server/patchServer.ts @@ -30,7 +30,7 @@ import { propagation, Span, ROOT_CONTEXT, - setActiveSpan, + setSpan, } from '@opentelemetry/api'; import { RpcAttribute } from '@opentelemetry/semantic-conventions'; import { clientStreamAndUnaryHandler } from './clientStreamAndUnary'; @@ -114,7 +114,7 @@ export function patchServer( [RpcAttribute.GRPC_KIND]: spanOptions.kind, }); - context.with(setActiveSpan(context.active(), span), () => { + context.with(setSpan(context.active(), span), () => { handleServerFunction.call( self, plugin, diff --git a/packages/opentelemetry-plugin-grpc/src/grpc.ts b/packages/opentelemetry-plugin-grpc/src/grpc.ts index fdee46cab5..a53941c9d9 100644 --- a/packages/opentelemetry-plugin-grpc/src/grpc.ts +++ b/packages/opentelemetry-plugin-grpc/src/grpc.ts @@ -23,7 +23,7 @@ import { SpanOptions, Status, ROOT_CONTEXT, - setActiveSpan, + setSpan, } from '@opentelemetry/api'; import { RpcAttribute } from '@opentelemetry/semantic-conventions'; import { BasePlugin } from '@opentelemetry/core'; @@ -195,7 +195,7 @@ export class GrpcPlugin extends BasePlugin { [RpcAttribute.GRPC_KIND]: spanOptions.kind, }); - context.with(setActiveSpan(context.active(), span), () => { + context.with(setSpan(context.active(), span), () => { switch (type) { case 'unary': case 'client_stream': @@ -393,7 +393,7 @@ export class GrpcPlugin extends BasePlugin { const span = plugin._tracer.startSpan(name, { kind: SpanKind.CLIENT, }); - return context.with(setActiveSpan(context.active(), span), () => + return context.with(setSpan(context.active(), span), () => plugin._makeGrpcClientRemoteCall( original, args, diff --git a/packages/opentelemetry-plugin-http/src/http.ts b/packages/opentelemetry-plugin-http/src/http.ts index ee9bbf36a3..c4eecfb3b1 100644 --- a/packages/opentelemetry-plugin-http/src/http.ts +++ b/packages/opentelemetry-plugin-http/src/http.ts @@ -25,7 +25,7 @@ import { TraceFlags, setSpan, ROOT_CONTEXT, - getActiveSpan, + getSpan, } from '@opentelemetry/api'; import { BasePlugin, NoRecordingSpan } from '@opentelemetry/core'; import type { @@ -311,7 +311,7 @@ export class HttpPlugin extends BasePlugin { return context.with(propagation.extract(ROOT_CONTEXT, headers), () => { const span = plugin._startHttpSpan(`HTTP ${method}`, spanOptions); - return context.with(setActiveSpan(context.active(), span), () => { + return context.with(setSpan(context.active(), span), () => { context.bind(request); context.bind(response); @@ -443,7 +443,7 @@ export class HttpPlugin extends BasePlugin { : this._config.requireParentforIncomingSpans; let span: Span; - const currentSpan = getActiveSpan(context.active()); + const currentSpan = getSpan(context.active()); if (requireParent === true && currentSpan === undefined) { // TODO: Refactor this when a solution is found in diff --git a/packages/opentelemetry-plugin-http/test/functionals/http-enable.test.ts b/packages/opentelemetry-plugin-http/test/functionals/http-enable.test.ts index dfa0c4d2f3..bbfcbefa88 100644 --- a/packages/opentelemetry-plugin-http/test/functionals/http-enable.test.ts +++ b/packages/opentelemetry-plugin-http/test/functionals/http-enable.test.ts @@ -339,7 +339,7 @@ describe('HttpPlugin', () => { doNock(hostname, testPath, 200, 'Ok'); const name = 'TestRootSpan'; const span = provider.getTracer('default').startSpan(name); - return context.with(setActiveSpan(context.active(), span), async () => { + return context.with(setSpan(context.active(), span), async () => { const result = await httpRequest.get( `${protocol}://${hostname}${testPath}` ); @@ -382,39 +382,36 @@ describe('HttpPlugin', () => { ); const name = 'TestRootSpan'; const span = provider.getTracer('default').startSpan(name); - return context.with( - setActiveSpan(context.active(), span), - async () => { - const result = await httpRequest.get( - `${protocol}://${hostname}${testPath}` - ); - span.end(); - const spans = memoryExporter.getFinishedSpans(); - const [reqSpan, localSpan] = spans; - const validations = { - hostname, - httpStatusCode: result.statusCode!, - httpMethod: 'GET', - pathname: testPath, - resHeaders: result.resHeaders, - reqHeaders: result.reqHeaders, - component: plugin.component, - }; - - assert.ok(localSpan.name.indexOf('TestRootSpan') >= 0); - assert.strictEqual(spans.length, 2); - assert.strictEqual(reqSpan.name, 'HTTP GET'); - assert.strictEqual( - localSpan.spanContext.traceId, - reqSpan.spanContext.traceId - ); - assertSpan(reqSpan, SpanKind.CLIENT, validations); - assert.notStrictEqual( - localSpan.spanContext.spanId, - reqSpan.spanContext.spanId - ); - } - ); + return context.with(setSpan(context.active(), span), async () => { + const result = await httpRequest.get( + `${protocol}://${hostname}${testPath}` + ); + span.end(); + const spans = memoryExporter.getFinishedSpans(); + const [reqSpan, localSpan] = spans; + const validations = { + hostname, + httpStatusCode: result.statusCode!, + httpMethod: 'GET', + pathname: testPath, + resHeaders: result.resHeaders, + reqHeaders: result.reqHeaders, + component: plugin.component, + }; + + assert.ok(localSpan.name.indexOf('TestRootSpan') >= 0); + assert.strictEqual(spans.length, 2); + assert.strictEqual(reqSpan.name, 'HTTP GET'); + assert.strictEqual( + localSpan.spanContext.traceId, + reqSpan.spanContext.traceId + ); + assertSpan(reqSpan, SpanKind.CLIENT, validations); + assert.notStrictEqual( + localSpan.spanContext.spanId, + reqSpan.spanContext.spanId + ); + }); }); } @@ -424,7 +421,7 @@ describe('HttpPlugin', () => { doNock(hostname, testPath, 200, 'Ok', num); const name = 'TestRootSpan'; const span = provider.getTracer('default').startSpan(name); - await context.with(setActiveSpan(context.active(), span), async () => { + await context.with(setSpan(context.active(), span), async () => { for (let i = 0; i < num; i++) { await httpRequest.get(`${protocol}://${hostname}${testPath}`); const spans = memoryExporter.getFinishedSpans(); @@ -814,7 +811,7 @@ describe('HttpPlugin', () => { const span = tracer.startSpan('parentSpan', { kind: SpanKind.INTERNAL, }); - context.with(setActiveSpan(context.active(), span), () => { + context.with(setSpan(context.active(), span), () => { httpRequest .get(`${protocol}://${hostname}:${serverPort}${testPath}`) .then(result => { diff --git a/packages/opentelemetry-plugin-https/test/functionals/https-enable.test.ts b/packages/opentelemetry-plugin-https/test/functionals/https-enable.test.ts index 7c54627731..cc9f66d2fe 100644 --- a/packages/opentelemetry-plugin-https/test/functionals/https-enable.test.ts +++ b/packages/opentelemetry-plugin-https/test/functionals/https-enable.test.ts @@ -20,7 +20,7 @@ import { propagation, Span as ISpan, SpanKind, - setActiveSpan, + setSpan, } from '@opentelemetry/api'; import { NoopLogger } from '@opentelemetry/core'; import { NodeTracerProvider } from '@opentelemetry/node'; @@ -336,7 +336,7 @@ describe('HttpsPlugin', () => { doNock(hostname, testPath, 200, 'Ok'); const name = 'TestRootSpan'; const span = tracer.startSpan(name); - return context.with(setActiveSpan(context.active(), span), async () => { + return context.with(setSpan(context.active(), span), async () => { const result = await httpsRequest.get( `${protocol}://${hostname}${testPath}` ); @@ -379,39 +379,36 @@ describe('HttpsPlugin', () => { ); const name = 'TestRootSpan'; const span = tracer.startSpan(name); - return context.with( - setActiveSpan(context.active(), span), - async () => { - const result = await httpsRequest.get( - `${protocol}://${hostname}${testPath}` - ); - span.end(); - const spans = memoryExporter.getFinishedSpans(); - const [reqSpan, localSpan] = spans; - const validations = { - hostname, - httpStatusCode: result.statusCode!, - httpMethod: 'GET', - pathname: testPath, - resHeaders: result.resHeaders, - reqHeaders: result.reqHeaders, - component: plugin.component, - }; - - assert.ok(localSpan.name.indexOf('TestRootSpan') >= 0); - assert.strictEqual(spans.length, 2); - assert.strictEqual(reqSpan.name, 'HTTP GET'); - assert.strictEqual( - localSpan.spanContext.traceId, - reqSpan.spanContext.traceId - ); - assertSpan(reqSpan, SpanKind.CLIENT, validations); - assert.notStrictEqual( - localSpan.spanContext.spanId, - reqSpan.spanContext.spanId - ); - } - ); + return context.with(setSpan(context.active(), span), async () => { + const result = await httpsRequest.get( + `${protocol}://${hostname}${testPath}` + ); + span.end(); + const spans = memoryExporter.getFinishedSpans(); + const [reqSpan, localSpan] = spans; + const validations = { + hostname, + httpStatusCode: result.statusCode!, + httpMethod: 'GET', + pathname: testPath, + resHeaders: result.resHeaders, + reqHeaders: result.reqHeaders, + component: plugin.component, + }; + + assert.ok(localSpan.name.indexOf('TestRootSpan') >= 0); + assert.strictEqual(spans.length, 2); + assert.strictEqual(reqSpan.name, 'HTTP GET'); + assert.strictEqual( + localSpan.spanContext.traceId, + reqSpan.spanContext.traceId + ); + assertSpan(reqSpan, SpanKind.CLIENT, validations); + assert.notStrictEqual( + localSpan.spanContext.spanId, + reqSpan.spanContext.spanId + ); + }); }); } @@ -421,7 +418,7 @@ describe('HttpsPlugin', () => { doNock(hostname, testPath, 200, 'Ok', num); const name = 'TestRootSpan'; const span = tracer.startSpan(name); - await context.with(setActiveSpan(context.active(), span), async () => { + await context.with(setSpan(context.active(), span), async () => { for (let i = 0; i < num; i++) { await httpsRequest.get(`${protocol}://${hostname}${testPath}`); const spans = memoryExporter.getFinishedSpans(); diff --git a/packages/opentelemetry-tracing/test/BasicTracerProvider.test.ts b/packages/opentelemetry-tracing/test/BasicTracerProvider.test.ts index 3d87974004..ccce863e18 100644 --- a/packages/opentelemetry-tracing/test/BasicTracerProvider.test.ts +++ b/packages/opentelemetry-tracing/test/BasicTracerProvider.test.ts @@ -295,8 +295,8 @@ describe('BasicTracerProvider', () => { it('should run context with NoopContextManager context manager', done => { const tracer = new BasicTracerProvider().getTracer('default'); const span = tracer.startSpan('my-span'); - context.with(setActiveSpan(context.active(), span), () => { - assert.deepStrictEqual(getActiveSpan(context.active()), undefined); + context.with(setSpan(context.active(), span), () => { + assert.deepStrictEqual(getSpan(context.active()), undefined); return done(); }); }); @@ -307,10 +307,10 @@ describe('BasicTracerProvider', () => { const tracer = new BasicTracerProvider().getTracer('default'); const span = tracer.startSpan('my-span'); const fn = () => { - assert.deepStrictEqual(getActiveSpan(context.active()), undefined); + assert.deepStrictEqual(getSpan(context.active()), undefined); return done(); }; - const patchedFn = context.bind(fn, setActiveSpan(context.active(), span)); + const patchedFn = context.bind(fn, setSpan(context.active(), span)); return patchedFn(); }); }); diff --git a/packages/opentelemetry-web/test/WebTracerProvider.test.ts b/packages/opentelemetry-web/test/WebTracerProvider.test.ts index f68e1cc49d..65c918193c 100644 --- a/packages/opentelemetry-web/test/WebTracerProvider.test.ts +++ b/packages/opentelemetry-web/test/WebTracerProvider.test.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { context, getActiveSpan, setActiveSpan } from '@opentelemetry/api'; +import { context, getSpan, setSpan } from '@opentelemetry/api'; import { ContextManager } from '@opentelemetry/context-base'; import { ZoneContextManager } from '@opentelemetry/context-zone'; import { BasePlugin, NoopLogger } from '@opentelemetry/core'; @@ -133,9 +133,9 @@ describe('WebTracerProvider', () => { const rootSpan = webTracerWithZone.startSpan('rootSpan'); - context.with(setActiveSpan(context.active(), rootSpan), () => { + context.with(setSpan(context.active(), rootSpan), () => { assert.ok( - getActiveSpan(context.active()) === rootSpan, + getSpan(context.active()) === rootSpan, 'Current span is rootSpan' ); const concurrentSpan1 = webTracerWithZone.startSpan( @@ -145,19 +145,19 @@ describe('WebTracerProvider', () => { 'concurrentSpan2' ); - context.with(setActiveSpan(context.active(), concurrentSpan1), () => { + context.with(setSpan(context.active(), concurrentSpan1), () => { setTimeout(() => { assert.ok( - getActiveSpan(context.active()) === concurrentSpan1, + getSpan(context.active()) === concurrentSpan1, 'Current span is concurrentSpan1' ); }, 10); }); - context.with(setActiveSpan(context.active(), concurrentSpan2), () => { + context.with(setSpan(context.active(), concurrentSpan2), () => { setTimeout(() => { assert.ok( - getActiveSpan(context.active()) === concurrentSpan2, + getSpan(context.active()) === concurrentSpan2, 'Current span is concurrentSpan2' ); done(); From 50356076aab688053f550161c6d2834c9dc93adf Mon Sep 17 00:00:00 2001 From: Gerhard Stoebich <18708370+Flarna@users.noreply.github.com> Date: Mon, 21 Dec 2020 17:50:38 +0100 Subject: [PATCH 10/10] fixup! update readme --- README.md | 4 ++-- .../README.md | 18 +++++++++--------- packages/opentelemetry-context-zone/README.md | 18 +++++++++--------- 3 files changed, 20 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index 07f12de3dd..4f55cd5259 100644 --- a/README.md +++ b/README.md @@ -231,8 +231,8 @@ To request automatic tracing support for a module not on this list, please [file [PR-1764](https://github.com/open-telemetry/opentelemetry-js/pull/1764) removed some APIs from `Tracer`: -- `Tracer.getCurrentSpan()`: use `api.getActiveSpan(api.context.active())` -- `Tracer.withSpan(span)`: use `api.context.with(api.setActiveSpan(api.context.active(), span))` +- `Tracer.getCurrentSpan()`: use `api.getSpan(api.context.active())` +- `Tracer.withSpan(span)`: use `api.context.with(api.setSpan(api.context.active(), span))` - `Tracer.bind(target)`: use `api.context.bind(target)` ## Useful links diff --git a/packages/opentelemetry-context-zone-peer-dep/README.md b/packages/opentelemetry-context-zone-peer-dep/README.md index db6bdf45d9..421fa937a2 100644 --- a/packages/opentelemetry-context-zone-peer-dep/README.md +++ b/packages/opentelemetry-context-zone-peer-dep/README.md @@ -22,7 +22,7 @@ npm install --save @opentelemetry/context-zone-peer-dep ## Usage ```js -import { context, getActiveSpan, setActiveSpan } from '@opentelemetry/api'; +import { context, getSpan, setSpan } from '@opentelemetry/api'; import { ConsoleSpanExporter, SimpleSpanProcessor } from '@opentelemetry/tracing'; import { WebTracerProvider } from '@opentelemetry/web'; import { ZoneContextManager } from '@opentelemetry/context-zone-peer-dep'; @@ -36,21 +36,21 @@ providerWithZone.register({ // Example how the ZoneContextManager keeps the reference to the correct context during async operations const webTracerWithZone = providerWithZone.getTracer('default'); const span1 = webTracerWithZone.startSpan('foo1'); -context.with(setActiveSpan(context.active(), span1, () => { - console.log('Current span is span1', getActiveSpan(context.active()) === span1); +context.with(setSpan(context.active(), span1, () => { + console.log('Current span is span1', getSpan(context.active()) === span1); setTimeout(() => { const span2 = webTracerWithZone.startSpan('foo2'); - console.log('Current span is span1', getActiveSpan(context.active()) === span1); - context.with(setActiveSpan(context.active(), span2, () => { - console.log('Current span is span2', getActiveSpan(context.active()) === span2); + console.log('Current span is span1', getSpan(context.active()) === span1); + context.with(setSpan(context.active(), span2, () => { + console.log('Current span is span2', getSpan(context.active()) === span2); setTimeout(() => { - console.log('Current span is span2', getActiveSpan(context.active()) === span2); + console.log('Current span is span2', getSpan(context.active()) === span2); }, 500); }); // there is a timeout which still keeps span2 active - console.log('Current span is span2', getActiveSpan(context.active()) === span2); + console.log('Current span is span2', getSpan(context.active()) === span2); }, 500); - console.log('Current span is span1', getActiveSpan(context.active()) === span1); + console.log('Current span is span1', getSpan(context.active()) === span1); }); ``` diff --git a/packages/opentelemetry-context-zone/README.md b/packages/opentelemetry-context-zone/README.md index bfc06e4f44..e2c3ae72e1 100644 --- a/packages/opentelemetry-context-zone/README.md +++ b/packages/opentelemetry-context-zone/README.md @@ -19,7 +19,7 @@ npm install --save @opentelemetry/context-zone ## Usage ```js -import { context, getActiveSpan, setActiveSpan } from '@opentelemetry/api'; +import { context, getSpan, setSpan } from '@opentelemetry/api'; import { ConsoleSpanExporter, SimpleSpanProcessor } from '@opentelemetry/tracing'; import { WebTracerProvider } from '@opentelemetry/web'; import { ZoneContextManager } from '@opentelemetry/context-zone'; @@ -34,21 +34,21 @@ provider.register({ const webTracerWithZone = providerWithZone.getTracer('default'); const span1 = webTracerWithZone.startSpan('foo1'); -context.with(setActiveSpan(context.active(), span1), () => { - console.log('Current span is span1', getActiveSpan(context.active()) === span1); +context.with(setSpan(context.active(), span1), () => { + console.log('Current span is span1', getSpan(context.active()) === span1); setTimeout(() => { const span2 = webTracerWithZone.startSpan('foo2'); - console.log('Current span is span1', getActiveSpan(context.active()) === span1); - context.with(setActiveSpan(context.active(), span2), () => { - console.log('Current span is span2', getActiveSpan(context.active()) === span2); + console.log('Current span is span1', getSpan(context.active()) === span1); + context.with(setSpan(context.active(), span2), () => { + console.log('Current span is span2', getSpan(context.active()) === span2); setTimeout(() => { - console.log('Current span is span2', getActiveSpan(context.active()) === span2); + console.log('Current span is span2', getSpan(context.active()) === span2); }, 500); }); // there is a timeout which still keeps span2 active - console.log('Current span is span2', getActiveSpan(context.active()) === span2); + console.log('Current span is span2', getSpan(context.active()) === span2); }, 500); - console.log('Current span is span1', getActiveSpan(context.active()) === span1); + console.log('Current span is span1', getSpan(context.active()) === span1); }); ```