@jufab/opentelemetry-angular-interceptor
Version:
@jufab/opentelemetry-angular-interceptor is an Angular Library to deploy [OpenTelemetry](https://opentelemetry.io/) in your Angular application
1 lines • 69.9 kB
Source Map (JSON)
{"version":3,"file":"jufab-opentelemetry-angular-interceptor.mjs","sources":["../../../projects/opentelemetry-interceptor/src/lib/configuration/opentelemetry-config.ts","../../../projects/opentelemetry-interceptor/src/lib/services/exporter/exporter.interface.ts","../../../projects/opentelemetry-interceptor/src/lib/services/propagator/propagator.interface.ts","../../../projects/opentelemetry-interceptor/src/lib/interceptor/opentelemetry-http.interceptor.ts","../../../projects/opentelemetry-interceptor/src/lib/opentelemetry-interceptor.module.ts","../../../projects/opentelemetry-interceptor/src/lib/services/exporter/otelcol/otelcol-exporter.service.ts","../../../projects/opentelemetry-interceptor/src/lib/services/exporter/otelcol/otelcol-exporter.module.ts","../../../projects/opentelemetry-interceptor/src/lib/services/exporter/console/console-span-exporter.service.ts","../../../projects/opentelemetry-interceptor/src/lib/services/exporter/console/console-span-exporter.module.ts","../../../projects/opentelemetry-interceptor/src/lib/services/exporter/zipkin/zipkin-exporter.service.ts","../../../projects/opentelemetry-interceptor/src/lib/services/exporter/zipkin/zipkin-exporter.module.ts","../../../projects/opentelemetry-interceptor/src/lib/services/exporter/noop-exporter/noop-span-exporter.service.ts","../../../projects/opentelemetry-interceptor/src/lib/services/exporter/noop-exporter/noop-span-exporter.module.ts","../../../projects/opentelemetry-interceptor/src/lib/services/propagator/b3-propagator/b3-propagator.service.ts","../../../projects/opentelemetry-interceptor/src/lib/services/propagator/b3-propagator/b3-propagator.module.ts","../../../projects/opentelemetry-interceptor/src/lib/services/propagator/w3c-trace-context-propagator/w3c-trace-context-propagator.service.ts","../../../projects/opentelemetry-interceptor/src/lib/services/propagator/jaeger-http-trace-propagator/jaeger-http-trace-propagator.service.ts","../../../projects/opentelemetry-interceptor/src/lib/services/propagator/aws-xray-propagator/aws-xray-propagator.service.ts","../../../projects/opentelemetry-interceptor/src/lib/services/propagator/composite-propagator/composite-propagator.service.ts","../../../projects/opentelemetry-interceptor/src/lib/services/propagator/composite-propagator/composite-propagator.module.ts","../../../projects/opentelemetry-interceptor/src/lib/services/propagator/aws-xray-propagator/aws-xray-propagator.module.ts","../../../projects/opentelemetry-interceptor/src/lib/services/propagator/w3c-trace-context-propagator/w3c-trace-context-propagator.module.ts","../../../projects/opentelemetry-interceptor/src/lib/services/propagator/jaeger-http-trace-propagator/jaeger-http-trace-propagator.module.ts","../../../projects/opentelemetry-interceptor/src/lib/services/propagator/noop-http-text-propagator/noop-text-map-propagator.service.ts","../../../projects/opentelemetry-interceptor/src/lib/services/propagator/noop-http-text-propagator/noop-text-map-propagator.module.ts","../../../projects/opentelemetry-interceptor/src/lib/services/instrumentation/instrumentation.service.ts","../../../projects/opentelemetry-interceptor/src/lib/otel-webtracer.module.ts","../../../projects/opentelemetry-interceptor/src/public-api.ts","../../../projects/opentelemetry-interceptor/src/jufab-opentelemetry-angular-interceptor.ts"],"sourcesContent":["import { ClassProvider, ConstructorProvider, ExistingProvider, FactoryProvider, InjectionToken, ValueProvider } from '@angular/core';\nimport { AttributeValue, DiagLogger, DiagLogLevel } from '@opentelemetry/api';\nimport { Instrumentation } from '@opentelemetry/instrumentation';\nimport { CustomSpan } from '../interceptor/custom-span.interface';\n\n/**\n * Common configuration\n */\nexport interface CommonCollectorConfig {\n /** serviceName : Name of service in trace */\n serviceName: string;\n /** resourceAttributes: Extra resource attribute like service.namespace ...*/\n resourceAttributes?: Partial<Record<string, AttributeValue>>;\n /** console : boolean to trace in console */\n console?: boolean;\n /** production : boolean to use a BatchSpanExporter(async) or SimpleSpanExporter(sync) */\n production?: boolean;\n /** probabilitySampler */\n probabilitySampler?: string;\n /** log or not body response in span */\n logBody?: boolean;\n /** log level for opentelemetry */\n logLevel?: DiagLogLevel;\n}\n\n/**\n * BatchSpanExporter Configuration\n */\nexport interface BatchSpanProcessorConfig {\n /** The maximum queue size. After the size is reached spans are dropped. */\n maxQueueSize?: string;\n /** The maximum batch size of every export. It must be smaller or equal to maxQueueSize. */\n maxExportBatchSize?: string;\n /** The interval between two consecutive exports */\n scheduledDelayMillis?: string;\n /** How long the export can run before it is cancelled */\n exportTimeoutMillis?: string;\n}\n\n/**\n * OpenTelemetry Collector configuration\n */\nexport interface OtelCollectorConfig {\n /**\n * An url (Default value: http://localhost:4318/v1/trace)\n */\n url?: string;\n /**\n * custom headers\n */\n headers?: Record<string, string>;\n /**\n * An optional limit on pending requests\n */\n concurrencyLimit?: string;\n /**\n * Maximum time the OTLP exporter will wait for each batch export.\n * The default value is 10000ms.\n * */\n timeoutMillis?: string;\n}\n\n/**\n * Configuration for Zipkin\n */\nexport interface ZipkinCollectorConfig {\n /**\n * An url (Default value: http://localhost:9411/api/v2/spans)\n */\n url?: string;\n /**\n * custom headers\n */\n headers?: {\n [key: string]: string;\n };\n}\n\n/**\n * Configuration for JaegerPropagatorConfig\n */\nexport interface JaegerPropagatorConfig {\n /**\n * A custom Header for the propagator\n */\n customHeader?: string;\n}\n\n/**\n * Configuration for B3PropagatorConfig\n */\nexport interface B3PropagatorConfig {\n /**\n * Single or Multi Header for b3propagator (default: multi)\n * Value : 'O' (single), '1' (multi)\n */\n multiHeader?: string;\n}\n\n/**\n * Configuration for IgnoreUrlsConfig\n */\nexport interface IgnoreUrlsConfig {\n /**\n * URLs that partially match any regex in ignoreUrls will not be traced.\n * In addition, URLs that are _exact matches_ of strings in ignoreUrls will\n * also not be traced.\n */\n urls?: Array<string | RegExp>;\n}\n\n/**\n * OpenTelemetryConfig\n */\nexport interface OpenTelemetryConfig {\n /** commonConfig */\n commonConfig: CommonCollectorConfig;\n /** batchSpanProcessorConfig */\n batchSpanProcessorConfig?: BatchSpanProcessorConfig;\n /** otelcolConfig */\n otelcolConfig?: OtelCollectorConfig;\n /** zipkinConfig */\n zipkinConfig?: ZipkinCollectorConfig;\n /** jaegerPropagatorConfig */\n jaegerPropagatorConfig?: JaegerPropagatorConfig;\n /** b3PropagatorConfig */\n b3PropagatorConfig?: B3PropagatorConfig;\n /** ignoreUrls */\n ignoreUrls?: IgnoreUrlsConfig;\n}\n\n/** OTEL_CONFIG : Config injection */\nexport const OTEL_CONFIG = new InjectionToken<OpenTelemetryConfig>('opentelemetry.config');\n\n/** Logger : injection for a logger compatible */\nexport const OTEL_LOGGER = new InjectionToken<DiagLogger>('otelcol.logger');\n\n/** custom span */\nexport const OTEL_CUSTOM_SPAN = new InjectionToken<CustomSpan>('otelcol.custom-span');\n\nexport const OTEL_INSTRUMENTATION_PLUGINS = new InjectionToken<Instrumentation[]>('otelcol.instrumentation.plugins');\n\nexport const defineConfigProvider = (\n config: OpenTelemetryConfig | null | undefined,\n configProvider: ValueProvider | ClassProvider | ConstructorProvider | ExistingProvider | FactoryProvider\n): ValueProvider | ClassProvider | ConstructorProvider | ExistingProvider | FactoryProvider => {\n if (config) {\n configProvider = { provide: OTEL_CONFIG, useValue: config };\n } else {\n if (configProvider) {\n if (configProvider.provide !== OTEL_CONFIG) {\n throw new Error(`Configuration error. token must be : ${OTEL_CONFIG} , your token value is : ${configProvider.provide}`);\n }\n } else {\n throw new Error(`Configuration error. you must specify a configuration in config or configProvider`);\n }\n }\n return configProvider;\n};\n","import { InjectionToken } from '@angular/core';\nimport { SpanExporter } from '@opentelemetry/sdk-trace-base';\n\n/**\n * Exporter interface to define a default exporter\n */\nexport interface IExporter {\n /**\n * give an inmplementation of SpanExporter\n *\n * @return SpanExporter\n */\n getExporter(): SpanExporter;\n}\n\n/** injection for a Exporter */\nexport const OTEL_EXPORTER = new InjectionToken<IExporter>('otelcol.exporter');\n","import { InjectionToken } from '@angular/core';\nimport { TextMapPropagator } from '@opentelemetry/api';\n\n/**\n * Interface to define propagator\n */\nexport interface IPropagator {\n /**\n * give an implementation of a propagator\n *\n * @return HttpTextPropagator\n */\n getPropagator(): TextMapPropagator;\n}\n\n/** injection for a propagator */\nexport const OTEL_PROPAGATOR = new InjectionToken<IPropagator>('otelcol.propagator');\n","import { Injectable, Inject, Optional } from '@angular/core';\nimport {\n HttpRequest,\n HttpHandler,\n HttpEvent,\n HttpInterceptor,\n HttpResponse,\n HttpErrorResponse\n} from '@angular/common/http';\nimport { PlatformLocation } from '@angular/common';\nimport { Observable } from 'rxjs';\nimport * as api from '@opentelemetry/api';\nimport { Span, SpanStatusCode, DiagLogger, SpanKind } from '@opentelemetry/api';\nimport { WebTracerProvider, StackContextManager } from '@opentelemetry/sdk-trace-web';\nimport {\n SimpleSpanProcessor,\n ConsoleSpanExporter,\n BatchSpanProcessor,\n NoopSpanProcessor,\n AlwaysOnSampler,\n AlwaysOffSampler,\n TraceIdRatioBasedSampler,\n ParentBasedSampler,\n Sampler,\n BufferConfig\n} from '@opentelemetry/sdk-trace-base';\nimport {\n isUrlIgnored\n} from '@opentelemetry/core';\nimport {\n ATTR_USER_AGENT_ORIGINAL,\n ATTR_URL_PATH,\n ATTR_URL_QUERY,\n ATTR_HTTP_RESPONSE_STATUS_CODE,\n ATTR_ERROR_TYPE,\n ATTR_SERVICE_NAME,\n ATTR_HTTP_REQUEST_METHOD,\n ATTR_URL_FULL,\n ATTR_URL_SCHEME,\n ATTR_SERVER_ADDRESS,\n ATTR_SERVER_PORT,\n // ATTR_HTTP_REQUEST_HEADER,\n //SEMATTRS_ERROR_TYPE\n} from '@opentelemetry/semantic-conventions';\nimport { Resource, resourceFromAttributes } from '@opentelemetry/resources';\nimport { tap, finalize } from 'rxjs/operators';\nimport {\n CommonCollectorConfig,\n OpenTelemetryConfig,\n OTEL_CONFIG,\n} from '../configuration/opentelemetry-config';\nimport infoLibrary from '../../version.json';\nimport { OTEL_EXPORTER, IExporter } from '../services/exporter/exporter.interface';\nimport { OTEL_PROPAGATOR, IPropagator } from '../services/propagator/propagator.interface';\nimport { OTEL_LOGGER, OTEL_CUSTOM_SPAN } from '../configuration/opentelemetry-config';\nimport { CustomSpan } from './custom-span.interface';\n\n/**\n * OpenTelemetryInterceptor class\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class OpenTelemetryHttpInterceptor implements HttpInterceptor {\n /**\n * tracer\n */\n tracer: WebTracerProvider;\n /**\n * context manager\n */\n contextManager: StackContextManager;\n /**\n * Log or not body\n */\n logBody = false;\n\n /**\n * constructor\n *\n * @param config configuration\n * @param exporterService service exporter injected\n * @param propagatorService propagator injected\n * @param logger define logger\n * @param customSpan a customSpan interface to add attributes\n * @param platformLocation encapsulates all calls to DOM APIs\n */\n constructor(\n @Inject(OTEL_CONFIG) private config: OpenTelemetryConfig,\n @Inject(OTEL_EXPORTER)\n private exporterService: IExporter,\n @Inject(OTEL_PROPAGATOR)\n private propagatorService: IPropagator,\n @Optional() @Inject(OTEL_LOGGER)\n private logger: DiagLogger,\n @Optional() @Inject(OTEL_CUSTOM_SPAN)\n private customSpan: CustomSpan,\n private platformLocation: PlatformLocation\n ) {\n this.tracer = new WebTracerProvider({\n sampler: this.defineProbabilitySampler(this.convertStringToNumber(config.commonConfig.probabilitySampler)),\n resource: this.loadResourceAttributes(this.config.commonConfig),\n spanProcessors: this.insertOrNotSpanExporter()\n });\n this.contextManager = new StackContextManager();\n this.tracer.register({\n propagator: this.propagatorService.getPropagator(),\n contextManager: this.contextManager\n });\n this.logBody = config.commonConfig.logBody;\n api.diag.setLogger(logger, config.commonConfig.logLevel);\n }\n\n /**\n * Overide method\n * Interceptor from HttpInterceptor Angular\n *\n * @param request the current request\n * @param next next\n */\n intercept(\n request: HttpRequest<unknown>,\n next: HttpHandler\n ): Observable<HttpEvent<unknown>> {\n if (isUrlIgnored(request.url, this.config.ignoreUrls?.urls)) {\n return next.handle(request);\n }\n this.contextManager.disable(); //FIX - reinit contextManager for each http call\n this.contextManager.enable();\n const span: Span = this.initSpan(request);\n const tracedReq = this.injectContextAndHeader(request);\n return next.handle(tracedReq).pipe(\n tap(\n (event: HttpResponse<any>) => {\n span.setAttributes(\n {\n [ATTR_HTTP_RESPONSE_STATUS_CODE]: event.status,\n }\n );\n if (this.logBody && event.body != null) {\n span.addEvent('response', { body: JSON.stringify(event.body) });\n }\n span.setStatus({\n code: SpanStatusCode.UNSET\n });\n this.setCustomSpan(span, request, event);\n },\n (event: HttpErrorResponse) => {\n span.setAttributes(\n {\n [ATTR_HTTP_RESPONSE_STATUS_CODE]: event.status,\n [ATTR_ERROR_TYPE] : event.name,\n }\n );\n span.recordException({\n name: event.name,\n message: event.message,\n stack: event.error\n });\n span.setStatus({\n code: SpanStatusCode.ERROR\n });\n this.setCustomSpan(span, request, event);\n }\n ),\n finalize(() => {\n span.end();\n this.contextManager.disable();\n })\n );\n }\n\n /**\n * Get current scheme, hostname and port\n */\n private getURL() {\n return this.platformLocation.href;\n }\n\n /**\n * Generate Resource Attributes\n */\n private loadResourceAttributes(\n commonConfig: CommonCollectorConfig\n ): Resource {\n return resourceFromAttributes({\n [ATTR_SERVICE_NAME]: commonConfig?.serviceName,\n ...commonConfig?.resourceAttributes,\n });\n }\n /**\n * Initialise a span for a request intercepted\n *\n * @param request request\n */\n private initSpan(request: HttpRequest<unknown>): Span {\n const urlRequest = (request.urlWithParams.startsWith('http')) ? new URL(request.urlWithParams) : new URL(this.getURL());\n const span = this.tracer\n .getTracer(infoLibrary.name, infoLibrary.version)\n .startSpan(\n `${request.method.toUpperCase()}`,\n {\n attributes: {\n [ATTR_HTTP_REQUEST_METHOD]: request.method,\n [ATTR_SERVER_ADDRESS]: urlRequest.host,\n [ATTR_SERVER_PORT]: urlRequest.port,\n [ATTR_URL_FULL]: request.urlWithParams,\n [ATTR_URL_SCHEME]: urlRequest.protocol.replace(':', ''),\n [ATTR_URL_QUERY]: urlRequest.search,\n [ATTR_USER_AGENT_ORIGINAL]: window.navigator.userAgent\n },\n kind: SpanKind.CLIENT,\n },\n this.contextManager.active()\n );\n /*eslint no-underscore-dangle: [\"error\", { \"allow\": [\"_currentContext\"] }]*/\n this.contextManager._currentContext = api.trace.setSpan(\n this.contextManager.active(),\n span\n );\n return span;\n }\n\n /**\n * Add header propagator in request and conserve original header\n *\n * @param request request\n */\n private injectContextAndHeader(\n request: HttpRequest<unknown>\n ) {\n const carrier = {};\n api.propagation.inject(\n this.contextManager.active(),\n carrier,\n api.defaultTextMapSetter\n );\n request.headers.keys().map(key => {\n carrier[key] = request.headers.get(key);\n });\n return request.clone({\n setHeaders: carrier,\n });\n }\n\n /**\n * Verify to insert or not a Span Exporter\n */\n private insertOrNotSpanExporter() {\n\n if (this.exporterService.getExporter() !== undefined) {\n return Array.of(this.insertSpanProcessorProductionMode(), this.insertConsoleSpanExporter());\n } else {\n return Array.of(new NoopSpanProcessor());\n }\n }\n\n /**\n * Insert in tracer the console span if config is true\n */\n private insertConsoleSpanExporter() {\n if (this.config.commonConfig.console) {\n return new SimpleSpanProcessor(new ConsoleSpanExporter());\n }\n }\n\n /**\n * Insert BatchSpanProcessor in production mode\n * SimpleSpanProcessor otherwise\n */\n private insertSpanProcessorProductionMode() {\n const bufferConfig: BufferConfig = {\n maxExportBatchSize: this.convertStringToNumber(this.config.batchSpanProcessorConfig?.maxExportBatchSize),\n scheduledDelayMillis: this.convertStringToNumber(this.config.batchSpanProcessorConfig?.scheduledDelayMillis),\n exportTimeoutMillis: this.convertStringToNumber(this.config.batchSpanProcessorConfig?.exportTimeoutMillis),\n maxQueueSize: this.convertStringToNumber(this.config.batchSpanProcessorConfig?.maxQueueSize)\n };\n return this.config.commonConfig.production\n ? new BatchSpanProcessor(this.exporterService.getExporter(), bufferConfig)\n : new SimpleSpanProcessor(this.exporterService.getExporter());\n }\n\n /**\n * define the Probability Sampler\n * By Default, it's always (or 1)\n *\n * @param sampleConfig the sample configuration\n */\n private defineProbabilitySampler(sampleConfig: number): Sampler {\n if (sampleConfig >= 1) {\n return new ParentBasedSampler({ root: new AlwaysOnSampler() });\n }\n else if (sampleConfig <= 0 || sampleConfig === undefined) {\n return new ParentBasedSampler({ root: new AlwaysOffSampler() });\n } else {\n return new ParentBasedSampler({ root: new TraceIdRatioBasedSampler(sampleConfig) });\n }\n }\n\n /**\n * convert String to Number (or undefined)\n *\n * @param value\n * @returns number or undefined\n */\n private convertStringToNumber(value: string): number {\n return value !== undefined ? Number(value) : undefined;\n }\n\n /**\n * Set custom attributes in span with a CustomSpan\n *\n * @param span\n * @param request\n * @param response\n * @returns Span\n */\n private setCustomSpan(span: Span, request: HttpRequest<unknown>, response: HttpResponse<unknown> | HttpErrorResponse): Span {\n return this.customSpan != null ? this.customSpan.add(span, request, response) : span;\n }\n}\n","import {\n NgModule,\n ModuleWithProviders,\n Optional,\n SkipSelf,\n ValueProvider,\n ClassProvider,\n ConstructorProvider,\n ExistingProvider,\n FactoryProvider,\n} from '@angular/core';\nimport {\n defineConfigProvider,\n OpenTelemetryConfig,\n} from './configuration/opentelemetry-config';\nimport { HTTP_INTERCEPTORS, HttpClientModule } from '@angular/common/http';\nimport { OpenTelemetryHttpInterceptor } from './interceptor/opentelemetry-http.interceptor';\n\n\n@NgModule({\n declarations: [],\n imports: [HttpClientModule],\n exports: [],\n})\nexport class OpenTelemetryInterceptorModule {\n constructor(\n @Optional() @SkipSelf() parentModule?: OpenTelemetryInterceptorModule\n ) {\n if (parentModule) {\n throw new Error(\n 'OpentelemetryInterceptorModule is already loaded. Import it in the AppModule only'\n );\n }\n }\n\n public static forRoot(\n config: OpenTelemetryConfig | null | undefined,\n configProvider?: ValueProvider | ClassProvider | ConstructorProvider | ExistingProvider | FactoryProvider\n ): ModuleWithProviders<OpenTelemetryInterceptorModule> {\n\n //Interceptor\n const interceptorProvider = {\n provide: HTTP_INTERCEPTORS,\n useClass: OpenTelemetryHttpInterceptor,\n multi: true,\n };\n\n configProvider = defineConfigProvider(config,configProvider);\n\n return {\n ngModule: OpenTelemetryInterceptorModule,\n providers: [\n configProvider,\n interceptorProvider,\n ],\n };\n }\n\n}\n","import { Injectable, Inject, Optional } from '@angular/core';\nimport { IExporter } from '../exporter.interface';\nimport { SpanExporter } from '@opentelemetry/sdk-trace-base';\nimport {\n OpenTelemetryConfig,\n OTEL_CONFIG\n} from '../../../configuration/opentelemetry-config';\nimport { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';\nimport { OTLPExporterConfigBase } from '@opentelemetry/otlp-exporter-base';\n\n/**\n * OtelcolExporterService class\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class OtelcolExporterService implements IExporter {\n /**\n * CollectorExporterConfigBase\n */\n private otelcolConfig: OTLPExporterConfigBase;\n\n /**\n * constructor\n *\n * @param config OpenTelemetryConfig\n */\n constructor(\n @Inject(OTEL_CONFIG) config: OpenTelemetryConfig\n ) {\n this.otelcolConfig = {\n url: config.otelcolConfig?.url,\n headers: config.otelcolConfig?.headers,\n // eslint-disable-next-line max-len\n concurrencyLimit: Number(config.otelcolConfig?.concurrencyLimit ?? 0) <= 0 ? undefined : Number(config.otelcolConfig?.concurrencyLimit),\n timeoutMillis: Number(config.otelcolConfig?.timeoutMillis ?? 0) <= 0 ? undefined : Number(config.otelcolConfig?.timeoutMillis)\n };\n }\n\n /**\n * Return a CollectorExporter with the configuration\n *\n * @return a CollectorExporter\n */\n getExporter(): SpanExporter {\n return new OTLPTraceExporter(this.otelcolConfig);\n }\n}\n","import { NgModule } from '@angular/core';\nimport { OtelcolExporterService } from './otelcol-exporter.service';\nimport { OTEL_EXPORTER } from '../exporter.interface';\n\n\n@NgModule({\n declarations: [],\n imports: [],\n providers: [\n { provide: OTEL_EXPORTER, useClass: OtelcolExporterService },\n ]\n})\nexport class OtelColExporterModule {\n}\n","import { Injectable } from '@angular/core';\nimport { IExporter } from '../exporter.interface';\nimport { SpanExporter, ConsoleSpanExporter } from '@opentelemetry/sdk-trace-base';\n\n/**\n * ConsoleSpanExporterService\n * A default span exporter\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class ConsoleSpanExporterService implements IExporter {\n /**\n * Return a ConsoleSpanExporter\n *\n * @return SpanExporter\n */\n getExporter(): SpanExporter {\n return new ConsoleSpanExporter();\n }\n}\n","import { NgModule } from '@angular/core';\nimport { ConsoleSpanExporterService } from './console-span-exporter.service';\nimport { OTEL_EXPORTER } from '../exporter.interface';\n\n\n\n@NgModule({\n declarations: [],\n imports: [],\n providers: [\n { provide: OTEL_EXPORTER, useClass: ConsoleSpanExporterService }\n ]\n})\nexport class ConsoleSpanExporterModule {\n}\n","import { Injectable, Inject } from '@angular/core';\nimport { IExporter } from '../exporter.interface';\nimport { SpanExporter } from '@opentelemetry/sdk-trace-base';\nimport { OpenTelemetryConfig, OTEL_CONFIG } from '../../../configuration/opentelemetry-config';\nimport { ZipkinExporter, ExporterConfig } from '@opentelemetry/exporter-zipkin';\n\n/**\n * ZipkinExporterService class\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class ZipkinExporterService implements IExporter {\n /**\n * zipkinConfig\n */\n private zipkinConfig: ExporterConfig;\n\n /**\n * constructor\n *\n * @param config OpenTelemetryConfig\n */\n constructor(@Inject(OTEL_CONFIG) config: OpenTelemetryConfig) {\n this.zipkinConfig = {\n url: config.zipkinConfig?.url,\n headers: config.zipkinConfig?.headers\n };\n }\n\n /**\n * Return a ZipkinExporter configured with zipkinConfig field\n *\n * @return SpanExporter\n */\n getExporter(): SpanExporter {\n return new ZipkinExporter(this.zipkinConfig);\n }\n}\n","import { NgModule } from '@angular/core';\nimport { OTEL_EXPORTER } from '../exporter.interface';\nimport { ZipkinExporterService } from './zipkin-exporter.service';\n\n\n\n@NgModule({\n declarations: [],\n imports: [],\n providers: [\n { provide: OTEL_EXPORTER, useClass: ZipkinExporterService }\n ]\n})\nexport class ZipkinExporterModule {\n}\n","import { Injectable } from '@angular/core';\nimport { IExporter } from '../exporter.interface';\nimport { SpanExporter } from '@opentelemetry/sdk-trace-base';\n\n/**\n * NoopSpanExporterService\n * A No-op span exporter\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class NoopSpanExporterService implements IExporter {\n /**\n * Return undefined\n *\n * @return SpanExporter\n */\n getExporter(): SpanExporter {\n return undefined;\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { NoopSpanExporterService } from './noop-span-exporter.service';\nimport { OTEL_EXPORTER } from '../exporter.interface';\n\n\n\n@NgModule({\n declarations: [],\n imports: [\n CommonModule\n ],\n providers: [\n { provide: OTEL_EXPORTER, useClass: NoopSpanExporterService }\n ]\n})\nexport class NoopSpanExporterModule {\n}\n","import { Injectable, Inject } from '@angular/core';\nimport { IPropagator } from '../propagator.interface';\nimport { TextMapPropagator } from '@opentelemetry/api';\nimport { B3Propagator, B3PropagatorConfig, B3InjectEncoding } from '@opentelemetry/propagator-b3';\nimport {\n OpenTelemetryConfig,\n OTEL_CONFIG,\n} from '../../../configuration/opentelemetry-config';\n\n/**\n * B3PropagatorService\n *\n * Can be a single or multi header.\n *\n * See Configuration for more information\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class B3PropagatorService implements IPropagator {\n /**\n * B3PropagatorConfig\n */\n private b3PropagatorConfig: B3PropagatorConfig;\n\n /**\n * Constructor\n *\n * @param config OpenTelemetryConfig\n */\n constructor(@Inject(OTEL_CONFIG) config: OpenTelemetryConfig) {\n this.b3PropagatorConfig = {\n injectEncoding: B3PropagatorService.defineB3Encoding(config.b3PropagatorConfig?.multiHeader)\n };\n }\n\n /**\n * Define if it's a single or multi header\n *\n * @param value string (0 => single header, 1 => Multi Header)\n * @return B3InjectEncoding\n */\n private static defineB3Encoding(value: string): B3InjectEncoding {\n if (value && '0' === value) {\n return B3InjectEncoding.SINGLE_HEADER;\n }\n return B3InjectEncoding.MULTI_HEADER;\n }\n\n /**\n * Return an B3Propagator\n *\n * @return TextMapPropagator as B3Propagator\n */\n getPropagator(): TextMapPropagator {\n return new B3Propagator(this.b3PropagatorConfig);\n }\n}\n","import { NgModule } from '@angular/core';\nimport { B3PropagatorService } from './b3-propagator.service';\nimport { OTEL_PROPAGATOR } from '../propagator.interface';\n\n\n\n@NgModule({\n declarations: [],\n imports: [],\n providers: [\n { provide: OTEL_PROPAGATOR, useClass: B3PropagatorService }\n ]\n})\nexport class B3PropagatorModule {\n}\n","import { Injectable } from '@angular/core';\nimport { IPropagator } from '../propagator.interface';\nimport { TextMapPropagator } from '@opentelemetry/api';\nimport { W3CTraceContextPropagator } from '@opentelemetry/core';\n\n/**\n * W3CTraceContextPropagatorService\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class W3CTraceContextPropagatorService implements IPropagator {\n /**\n * Return an W3CTraceContextPropagatorService\n *\n * @return TextMapPropagator as W3CTraceContextPropagatorService\n */\n getPropagator(): TextMapPropagator {\n return new W3CTraceContextPropagator();\n }\n}\n","import { Injectable, Inject } from '@angular/core';\nimport { IPropagator } from '../propagator.interface';\nimport { TextMapPropagator } from '@opentelemetry/api';\nimport { JaegerPropagator } from '@opentelemetry/propagator-jaeger';\nimport { OTEL_CONFIG } from '../../../configuration/opentelemetry-config';\nimport { OpenTelemetryConfig } from '../../../../public-api';\n\n/**\n * JaegerHttpTracePropagatorService\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class JaegerHttpTracePropagatorService implements IPropagator {\n /**\n * custom Header\n */\n private customHeader: string;\n /**\n * Constructor\n *\n * @param config OpenTelemetryConfig\n */\n constructor(@Inject(OTEL_CONFIG) config: OpenTelemetryConfig) {\n this.customHeader = config.jaegerPropagatorConfig?.customHeader;\n }\n\n /**\n * Return an JaegerPropagator\n *\n * @return TextMapPropagator as JaegerPropagator\n */\n getPropagator(): TextMapPropagator {\n return new JaegerPropagator(this.customHeader);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { IPropagator } from '../propagator.interface';\nimport { TextMapPropagator } from '@opentelemetry/api';\nimport { AWSXRayPropagator } from '@opentelemetry/propagator-aws-xray';\n/**\n * AwsXrayPropagatorService\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class AwsXrayPropagatorService implements IPropagator {\n /**\n * Return an AwsXrayPropagator\n *\n * @return TextMapPropagator as AwsXrayPropagator\n */\n getPropagator(): TextMapPropagator {\n return new AWSXRayPropagator();\n }\n}\n","import { Injectable, Inject } from '@angular/core';\nimport { IPropagator } from '../propagator.interface';\nimport { TextMapPropagator } from '@opentelemetry/api';\nimport { CompositePropagator } from '@opentelemetry/core';\nimport { B3PropagatorService } from '../b3-propagator/b3-propagator.service';\nimport { W3CTraceContextPropagatorService } from '../w3c-trace-context-propagator/w3c-trace-context-propagator.service';\nimport { JaegerHttpTracePropagatorService } from '../jaeger-http-trace-propagator/jaeger-http-trace-propagator.service';\nimport { AwsXrayPropagatorService } from '../aws-xray-propagator/aws-xray-propagator.service';\n/**\n * CompositePropagatorService\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class CompositePropagatorService implements IPropagator {\n /**\n * Constructor\n */\n constructor(\n @Inject(B3PropagatorService)\n private b3PropagatorService: B3PropagatorService,\n @Inject(W3CTraceContextPropagatorService)\n private w3cTraceContextPropagatorService: W3CTraceContextPropagatorService,\n @Inject(JaegerHttpTracePropagatorService)\n private jaegerHttpTracePropagatorService: JaegerHttpTracePropagatorService,\n @Inject(AwsXrayPropagatorService)\n private awsXrayPropagatorService: AwsXrayPropagatorService\n ) {}\n\n /**\n * Return an CompositePropagator\n *\n * @return TextMapPropagator as CompositePropagator\n */\n getPropagator(): TextMapPropagator {\n return new CompositePropagator({\n propagators: [\n this.b3PropagatorService.getPropagator(),\n this.w3cTraceContextPropagatorService.getPropagator(),\n this.jaegerHttpTracePropagatorService.getPropagator(),\n this.awsXrayPropagatorService.getPropagator()\n ],\n });\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CompositePropagatorService } from './composite-propagator.service';\nimport { OTEL_PROPAGATOR } from '../propagator.interface';\n\n\n\n@NgModule({\n declarations: [],\n imports: [],\n providers: [\n { provide: OTEL_PROPAGATOR, useClass: CompositePropagatorService }\n ]\n})\nexport class CompositePropagatorModule {\n}\n","import { NgModule } from '@angular/core';\nimport { OTEL_PROPAGATOR } from '../propagator.interface';\nimport { AwsXrayPropagatorService } from './aws-xray-propagator.service';\n\n\n\n@NgModule({\n declarations: [],\n imports: [],\n providers: [\n { provide: OTEL_PROPAGATOR, useClass: AwsXrayPropagatorService }\n ]\n})\nexport class AwsXrayPropagatorModule {\n}\n","import { NgModule } from '@angular/core';\nimport { W3CTraceContextPropagatorService } from './w3c-trace-context-propagator.service';\nimport { OTEL_PROPAGATOR } from '../propagator.interface';\n\n\n\n@NgModule({\n declarations: [],\n imports: [],\n providers: [\n { provide: OTEL_PROPAGATOR, useClass: W3CTraceContextPropagatorService }\n ]\n})\nexport class W3CTraceContextPropagatorModule {\n}\n","import { NgModule } from '@angular/core';\nimport { JaegerHttpTracePropagatorService } from './jaeger-http-trace-propagator.service';\nimport { OTEL_PROPAGATOR } from '../propagator.interface';\n\n\n\n@NgModule({\n declarations: [],\n imports: [],\n providers: [\n { provide: OTEL_PROPAGATOR, useClass: JaegerHttpTracePropagatorService }\n ]\n})\nexport class JaegerHttpTracePropagatorModule {\n}\n","import { Injectable } from '@angular/core';\nimport { IPropagator } from '../propagator.interface';\nimport { TextMapPropagator } from '@opentelemetry/api';\n/**\n * NoopHttpTextPropagatorService\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class NoopTextMapPropagatorService implements IPropagator {\n /**\n * Return null\n *\n * @return TextMapPropagator as null\n */\n getPropagator(): TextMapPropagator {\n return null;\n }\n}\n\n","import { NgModule } from '@angular/core';\nimport { NoopTextMapPropagatorService } from './noop-text-map-propagator.service';\nimport { OTEL_PROPAGATOR } from '../propagator.interface';\n\n\n\n@NgModule({\n declarations: [],\n imports: [],\n providers: [\n { provide: OTEL_PROPAGATOR, useClass: NoopTextMapPropagatorService }\n ]\n})\nexport class NoopTextMapPropagatorModule {\n}\n","import { Inject, Injectable } from '@angular/core';\nimport { ZoneContextManager } from '@opentelemetry/context-zone-peer-dep';\nimport { ATTR_SERVICE_NAME } from '@opentelemetry/semantic-conventions';\nimport { Instrumentation, registerInstrumentations } from '@opentelemetry/instrumentation';\nimport {\n AlwaysOffSampler,\n AlwaysOnSampler,\n ParentBasedSampler,\n Sampler,\n TraceIdRatioBasedSampler,\n WebTracerProvider\n} from '@opentelemetry/sdk-trace-web';\nimport {\n ConsoleSpanExporter,\n SimpleSpanProcessor,\n BatchSpanProcessor,\n NoopSpanProcessor,\n SpanProcessor\n} from '@opentelemetry/sdk-trace-base';\n// eslint-disable-next-line max-len\nimport { OTEL_CONFIG, OpenTelemetryConfig, OTEL_INSTRUMENTATION_PLUGINS, CommonCollectorConfig } from '../../configuration/opentelemetry-config';\nimport { OTEL_EXPORTER, IExporter } from '../exporter/exporter.interface';\nimport { OTEL_PROPAGATOR, IPropagator } from '../propagator/propagator.interface';\nimport { Resource, resourceFromAttributes } from '@opentelemetry/resources';\n\n/**\n * InstrumentationService.\n * Service for component to add instrumentation.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class InstrumentationService {\n\n /**\n * tracerProvider\n */\n private tracerProvider: WebTracerProvider;\n\n /**\n * contextManager\n */\n private contextManager = new ZoneContextManager();\n\n /**\n * Constructor\n *\n * @param config\n * @param exporterService\n * @param propagatorService\n */\n constructor(@Inject(OTEL_CONFIG) private config: OpenTelemetryConfig,\n @Inject(OTEL_EXPORTER)\n private exporterService: IExporter,\n @Inject(OTEL_PROPAGATOR)\n private propagatorService: IPropagator,\n @Inject(OTEL_INSTRUMENTATION_PLUGINS)\n private instrumentation: Instrumentation[]) {\n this.tracerProvider = new WebTracerProvider({\n sampler: this.defineProbabilitySampler(this.convertStringToNumber(this.config.commonConfig.probabilitySampler)),\n resource: this.loadResourceAttributes(this.config.commonConfig),\n spanProcessors: this.insertOrNotSpanExporter(this.config.commonConfig.production,\n this.exporterService, this.config.commonConfig.console),\n });\n }\n\n /**\n * Init instrumentation on init\n */\n public initInstrumentation() {\n this.tracerProvider.register({\n contextManager: this.contextManager,\n propagator: this.propagatorService.getPropagator(),\n });\n\n registerInstrumentations({\n instrumentations: this.instrumentation,\n tracerProvider: this.tracerProvider,\n });\n }\n\n /**\n * Generate Resource Attributes\n * @param commonConfig common configuration\n * @returns Resource\n */\n private loadResourceAttributes(\n commonConfig: CommonCollectorConfig\n ): Resource {\n return resourceFromAttributes({\n [ATTR_SERVICE_NAME]: commonConfig?.serviceName,\n ...commonConfig?.resourceAttributes,\n });\n }\n\n /**\n * Verify to insert or not a Span Exporter\n * @param console config to insert console span\n * @param production production mode\n * @param exporter exporter\n * @returns Array of SpanProcessor\n */\n private insertOrNotSpanExporter(production: boolean, exporter: IExporter, console: boolean): Array<SpanProcessor> {\n if (this.exporterService.getExporter() !== undefined) {\n return Array.of(this.insertSpanProcessorProductionMode(production, exporter),\n this.insertConsoleSpanExporter(console));\n } else {\n return Array.of(new NoopSpanProcessor());\n }\n }\n\n /**\n * Insert in tracer the console span if config is true\n *\n * @param console config to insert console span\n * @returns SpanProcessor\n */\n private insertConsoleSpanExporter(console: boolean): SpanProcessor {\n if (console) {\n return new SimpleSpanProcessor(new ConsoleSpanExporter());\n }\n }\n\n /**\n * Insert BatchSpanProcessor in production mode\n * SimpleSpanProcessor otherwise\n *\n * @param boolean production\n * @param IExporter exporter\n * @returns SpanProcessor\n */\n private insertSpanProcessorProductionMode(\n production: boolean,\n exporter: IExporter\n ): SpanProcessor {\n return production\n ? new BatchSpanProcessor(exporter.getExporter())\n : new SimpleSpanProcessor(exporter.getExporter());\n }\n\n /**\n * convert String to Number (or undefined)\n *\n * @param value\n * @returns number or undefined\n */\n private convertStringToNumber(value: string): number {\n return value !== undefined ? Number(value) : undefined;\n }\n\n /**\n * define the Probability Sampler\n * By Default, it's always (or 1)\n *\n * @param sampleConfig the sample configuration\n * @returns Sampler\n */\n private defineProbabilitySampler(sampleConfig: number): Sampler {\n if (sampleConfig >= 1) {\n return new ParentBasedSampler({ root: new AlwaysOnSampler() });\n }\n else if (sampleConfig <= 0 || sampleConfig === undefined) {\n return new ParentBasedSampler({ root: new AlwaysOffSampler() });\n } else {\n return new ParentBasedSampler({ root: new TraceIdRatioBasedSampler(sampleConfig) });\n }\n }\n}\n","import {\n APP_INITIALIZER,\n ClassProvider,\n ConstructorProvider,\n ExistingProvider,\n FactoryProvider,\n ModuleWithProviders,\n NgModule,\n Optional,\n SkipSelf,\n ValueProvider,\n} from '@angular/core';\nimport {\n defineConfigProvider,\n OpenTelemetryConfig,\n} from './configuration/opentelemetry-config';\nimport { InstrumentationService } from './services/instrumentation/instrumentation.service';\n\nexport const instruServiceLoader = (instrumentationService: InstrumentationService) => {\n const loader = () => instrumentationService.initInstrumentation();\n return loader;\n};\n\n\n@NgModule()\nexport class OtelWebTracerModule {\n\n constructor(\n @Optional() @SkipSelf() parentModule?: OtelWebTracerModule\n ) {\n if (parentModule) {\n throw new Error(\n 'OtelWebTracerModule is already loaded. Import it in the AppModule only'\n );\n }\n }\n\n public static forRoot(\n config: OpenTelemetryConfig | null | undefined,\n configProvider?: ValueProvider | ClassProvider | ConstructorProvider | ExistingProvider | FactoryProvider\n ): ModuleWithProviders<OtelWebTracerModule> {\n\n configProvider = defineConfigProvider(config, configProvider);\n\n return {\n ngModule: OtelWebTracerModule,\n providers: [\n configProvider,\n InstrumentationService,\n {\n provide: APP_INITIALIZER,\n useFactory: instruServiceLoader,\n deps: [InstrumentationService],\n multi: true\n }\n ],\n };\n }\n}\n","/*\n * Public API Surface of opentelemetry-interceptor\n */\n// Interceptor\nexport { OpenTelemetryInterceptorModule } from './lib/opentelemetry-interceptor.module';\nexport { OpenTelemetryHttpInterceptor } from './lib/interceptor/opentelemetry-http.interceptor';\n// Exporter\nexport { OtelColExporterModule } from './lib/services/exporter/otelcol/otelcol-exporter.module';\nexport { OtelcolExporterService } from './lib/services/exporter/otelcol/otelcol-exporter.service';\nexport { ConsoleSpanExporterModule } from './lib/services/exporter/console/console-span-exporter.module';\nexport { ConsoleSpanExporterService } from './lib/services/exporter/console/console-span-exporter.service';\nexport { ZipkinExporterModule } from './lib/services/exporter/zipkin/zipkin-exporter.module';\nexport { ZipkinExporterService } from './lib/services/exporter/zipkin/zipkin-exporter.service';\nexport { NoopSpanExporterModule } from './lib/services/exporter/noop-exporter/noop-span-exporter.module';\nexport { NoopSpanExporterService } from './lib/services/exporter/noop-exporter/noop-span-exporter.service';\n// Propagator\nexport { B3PropagatorModule } from './lib/services/propagator/b3-propagator/b3-propagator.module';\nexport { CompositePropagatorModule } from './lib/services/propagator/composite-propagator/composite-propagator.module';\nexport { AwsXrayPropagatorModule } from './lib/services/propagator/aws-xray-propagator/aws-xray-propagator.module';\n/* eslint-disable max-len */\nexport { W3CTraceContextPropagatorModule } from './lib/services/propagator/w3c-trace-context-propagator/w3c-trace-context-propagator.module';\nexport { JaegerHttpTracePropagatorModule } from './lib/services/propagator/jaeger-http-trace-propagator/jaeger-http-trace-propagator.module';\n/* eslint-enable max-len */\nexport { NoopTextMapPropagatorModule } from './lib/services/propagator/noop-http-text-propagator/noop-text-map-propagator.module';\n//Component\nexport { OtelWebTracerModule } from './lib/otel-webtracer.module';\n\n//Interface\nexport { CustomSpan } from './lib/interceptor/custom-span.interface';\nexport { OTEL_EXPORTER, IExporter } from './lib/services/exporter/exporter.interface';\nexport { OTEL_PROPAGATOR, IPropagator } from './lib/services/propagator/propagator.interface';\n\n// Configuration\nexport {\n CommonCollectorConfig,\n BatchSpanProcessorConfig,\n OtelCollectorConfig,\n OpenTelemetryConfig,\n OTEL_CONFIG,\n ZipkinCollectorConfig,\n JaegerPropagatorConfig,\n B3PropagatorConfig,\n IgnoreUrlsConfig,\n OTEL_LOGGER,\n OTEL_CUSTOM_SPAN,\n OTEL_INSTRUMENTATION_PLUGINS\n} from './lib/configuration/opentelemetry-config';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["ParentBasedSampler","AlwaysOnSampler","AlwaysOffSampler","TraceIdRatioBasedSampler"],"mappings":"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