From 49b78c85736583a920cdb596f18b5355143debf5 Mon Sep 17 00:00:00 2001 From: Daniel Dyla Date: Thu, 20 Feb 2020 15:58:50 -0500 Subject: [PATCH] chore: add propagation API --- .../opentelemetry-api/src/api/propagation.ts | 71 +++++++++++++++++++ packages/opentelemetry-api/src/index.ts | 5 ++ 2 files changed, 76 insertions(+) create mode 100644 packages/opentelemetry-api/src/api/propagation.ts diff --git a/packages/opentelemetry-api/src/api/propagation.ts b/packages/opentelemetry-api/src/api/propagation.ts new file mode 100644 index 0000000000..6466b02f1b --- /dev/null +++ b/packages/opentelemetry-api/src/api/propagation.ts @@ -0,0 +1,71 @@ +/*! + * Copyright 2020, OpenTelemetry Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { Context } from '@opentelemetry/scope-base'; +import { Carrier } from '../context/propagation/carrier'; +import { HttpTextFormat } from '../context/propagation/HttpTextFormat'; +import { NOOP_HTTP_TEXT_FORMAT } from '../context/propagation/NoopHttpTextFormat'; +import { ContextAPI } from './context'; + +const contextApi = ContextAPI.getInstance(); + +/** + * Singleton object which represents the entry point to the OpenTelemetry Propagation API + */ +export class PropagationAPI { + private static _instance?: PropagationAPI; + private _propagator: HttpTextFormat = NOOP_HTTP_TEXT_FORMAT; + + /** Empty private constructor prevents end users from constructing a new instance of the API */ + private constructor() {} + + /** Get the singleton instance of the Propagator API */ + public static getInstance(): PropagationAPI { + if (!this._instance) { + this._instance = new PropagationAPI(); + } + + return this._instance; + } + + /** + * Set the current propagator. Returns the initialized propagator + */ + public initGlobalPropagator(propagator: HttpTextFormat): HttpTextFormat { + this._propagator = propagator; + return propagator; + } + + /** + * Inject context into a carrier to be propagated inter-process + * + * @param carrier carrier to inject context into + * @param context Context carrying tracing data to inject. Defaults to the currently active context. + */ + inject(carrier: Carrier, context = contextApi.active()): void { + return this._propagator.inject(context, carrier); + } + + /** + * Extract context from a carrier + * + * @param carrier Carrier to extract context from + * @param context Context which the newly created context will inherit from. Defaults to the currently active context. + */ + extract(carrier: Carrier, context = contextApi.active()): Context { + return this._propagator.extract(context, carrier); + } +} diff --git a/packages/opentelemetry-api/src/index.ts b/packages/opentelemetry-api/src/index.ts index eba1f2df12..3b4e33c146 100644 --- a/packages/opentelemetry-api/src/index.ts +++ b/packages/opentelemetry-api/src/index.ts @@ -60,8 +60,13 @@ import { MetricsAPI } from './api/metrics'; /** Entrypoint for metrics API */ export const metrics = MetricsAPI.getInstance(); +import { PropagationAPI } from './api/propagation'; +/** Entrypoint for propagation API */ +export const propagation = PropagationAPI.getInstance(); + export default { trace, metrics, context, + propagation, };