UNPKG

@jufab/opentelemetry-angular-interceptor

Version:

@jufab/opentelemetry-angular-interceptor is an Angular Library to deploy [OpenTelemetry](https://opentelemetry.io/) in your Angular application

1,026 lines (994 loc) 46.2 kB
import * as i0 from '@angular/core'; import { InjectionToken, Injectable, Inject, Optional, NgModule, SkipSelf, APP_INITIALIZER } from '@angular/core'; import { HTTP_INTERCEPTORS, HttpClientModule } from '@angular/common/http'; import * as i1 from '@angular/common'; import { CommonModule } from '@angular/common'; import * as api from '@opentelemetry/api'; import { SpanStatusCode, SpanKind } from '@opentelemetry/api'; import { WebTracerProvider, StackContextManager, ParentBasedSampler as ParentBasedSampler$1, AlwaysOnSampler as AlwaysOnSampler$1, AlwaysOffSampler as AlwaysOffSampler$1, TraceIdRatioBasedSampler as TraceIdRatioBasedSampler$1 } from '@opentelemetry/sdk-trace-web'; import { NoopSpanProcessor, SimpleSpanProcessor, ConsoleSpanExporter, BatchSpanProcessor, ParentBasedSampler, AlwaysOnSampler, AlwaysOffSampler, TraceIdRatioBasedSampler } from '@opentelemetry/sdk-trace-base'; import { isUrlIgnored, W3CTraceContextPropagator, CompositePropagator } from '@opentelemetry/core'; import { ATTR_HTTP_RESPONSE_STATUS_CODE, ATTR_ERROR_TYPE, ATTR_SERVICE_NAME, ATTR_HTTP_REQUEST_METHOD, ATTR_SERVER_ADDRESS, ATTR_SERVER_PORT, ATTR_URL_FULL, ATTR_URL_SCHEME, ATTR_URL_QUERY, ATTR_USER_AGENT_ORIGINAL } from '@opentelemetry/semantic-conventions'; import { resourceFromAttributes } from '@opentelemetry/resources'; import { tap, finalize } from 'rxjs/operators'; import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'; import { ZipkinExporter } from '@opentelemetry/exporter-zipkin'; import { B3InjectEncoding, B3Propagator } from '@opentelemetry/propagator-b3'; import { JaegerPropagator } from '@opentelemetry/propagator-jaeger'; import { AWSXRayPropagator } from '@opentelemetry/propagator-aws-xray'; import { ZoneContextManager } from '@opentelemetry/context-zone-peer-dep'; import { registerInstrumentations } from '@opentelemetry/instrumentation'; /** OTEL_CONFIG : Config injection */ const OTEL_CONFIG = new InjectionToken('opentelemetry.config'); /** Logger : injection for a logger compatible */ const OTEL_LOGGER = new InjectionToken('otelcol.logger'); /** custom span */ const OTEL_CUSTOM_SPAN = new InjectionToken('otelcol.custom-span'); const OTEL_INSTRUMENTATION_PLUGINS = new InjectionToken('otelcol.instrumentation.plugins'); const defineConfigProvider = (config, configProvider) => { if (config) { configProvider = { provide: OTEL_CONFIG, useValue: config }; } else { if (configProvider) { if (configProvider.provide !== OTEL_CONFIG) { throw new Error(`Configuration error. token must be : ${OTEL_CONFIG} , your token value is : ${configProvider.provide}`); } } else { throw new Error(`Configuration error. you must specify a configuration in config or configProvider`); } } return configProvider; }; var name = "@jufab/opentelemetry-angular-interceptor"; var version = "1.9.0-1"; var infoLibrary = { name: name, version: version }; /** injection for a Exporter */ const OTEL_EXPORTER = new InjectionToken('otelcol.exporter'); /** injection for a propagator */ const OTEL_PROPAGATOR = new InjectionToken('otelcol.propagator'); /** * OpenTelemetryInterceptor class */ class OpenTelemetryHttpInterceptor { /** * constructor * * @param config configuration * @param exporterService service exporter injected * @param propagatorService propagator injected * @param logger define logger * @param customSpan a customSpan interface to add attributes * @param platformLocation encapsulates all calls to DOM APIs */ constructor(config, exporterService, propagatorService, logger, customSpan, platformLocation) { this.config = config; this.exporterService = exporterService; this.propagatorService = propagatorService; this.logger = logger; this.customSpan = customSpan; this.platformLocation = platformLocation; /** * Log or not body */ this.logBody = false; this.tracer = new WebTracerProvider({ sampler: this.defineProbabilitySampler(this.convertStringToNumber(config.commonConfig.probabilitySampler)), resource: this.loadResourceAttributes(this.config.commonConfig), spanProcessors: this.insertOrNotSpanExporter() }); this.contextManager = new StackContextManager(); this.tracer.register({ propagator: this.propagatorService.getPropagator(), contextManager: this.contextManager }); this.logBody = config.commonConfig.logBody; api.diag.setLogger(logger, config.commonConfig.logLevel); } /** * Overide method * Interceptor from HttpInterceptor Angular * * @param request the current request * @param next next */ intercept(request, next) { if (isUrlIgnored(request.url, this.config.ignoreUrls?.urls)) { return next.handle(request); } this.contextManager.disable(); //FIX - reinit contextManager for each http call this.contextManager.enable(); const span = this.initSpan(request); const tracedReq = this.injectContextAndHeader(request); return next.handle(tracedReq).pipe(tap((event) => { span.setAttributes({ [ATTR_HTTP_RESPONSE_STATUS_CODE]: event.status, }); if (this.logBody && event.body != null) { span.addEvent('response', { body: JSON.stringify(event.body) }); } span.setStatus({ code: SpanStatusCode.UNSET }); this.setCustomSpan(span, request, event); }, (event) => { span.setAttributes({ [ATTR_HTTP_RESPONSE_STATUS_CODE]: event.status, [ATTR_ERROR_TYPE]: event.name, }); span.recordException({ name: event.name, message: event.message, stack: event.error }); span.setStatus({ code: SpanStatusCode.ERROR }); this.setCustomSpan(span, request, event); }), finalize(() => { span.end(); this.contextManager.disable(); })); } /** * Get current scheme, hostname and port */ getURL() { return this.platformLocation.href; } /** * Generate Resource Attributes */ loadResourceAttributes(commonConfig) { return resourceFromAttributes({ [ATTR_SERVICE_NAME]: commonConfig?.serviceName, ...commonConfig?.resourceAttributes, }); } /** * Initialise a span for a request intercepted * * @param request request */ initSpan(request) { const urlRequest = (request.urlWithParams.startsWith('http')) ? new URL(request.urlWithParams) : new URL(this.getURL()); const span = this.tracer .getTracer(infoLibrary.name, infoLibrary.version) .startSpan(`${request.method.toUpperCase()}`, { attributes: { [ATTR_HTTP_REQUEST_METHOD]: request.method, [ATTR_SERVER_ADDRESS]: urlRequest.host, [ATTR_SERVER_PORT]: urlRequest.port, [ATTR_URL_FULL]: request.urlWithParams, [ATTR_URL_SCHEME]: urlRequest.protocol.replace(':', ''), [ATTR_URL_QUERY]: urlRequest.search, [ATTR_USER_AGENT_ORIGINAL]: window.navigator.userAgent }, kind: SpanKind.CLIENT, }, this.contextManager.active()); /*eslint no-underscore-dangle: ["error", { "allow": ["_currentContext"] }]*/ this.contextManager._currentContext = api.trace.setSpan(this.contextManager.active(), span); return span; } /** * Add header propagator in request and conserve original header * * @param request request */ injectContextAndHeader(request) { const carrier = {}; api.propagation.inject(this.contextManager.active(), carrier, api.defaultTextMapSetter); request.headers.keys().map(key => { carrier[key] = request.headers.get(key); }); return request.clone({ setHeaders: carrier, }); } /** * Verify to insert or not a Span Exporter */ insertOrNotSpanExporter() { if (this.exporterService.getExporter() !== undefined) { return Array.of(this.insertSpanProcessorProductionMode(), this.insertConsoleSpanExporter()); } else { return Array.of(new NoopSpanProcessor()); } } /** * Insert in tracer the console span if config is true */ insertConsoleSpanExporter() { if (this.config.commonConfig.console) { return new SimpleSpanProcessor(new ConsoleSpanExporter()); } } /** * Insert BatchSpanProcessor in production mode * SimpleSpanProcessor otherwise */ insertSpanProcessorProductionMode() { const bufferConfig = { maxExportBatchSize: this.convertStringToNumber(this.config.batchSpanProcessorConfig?.maxExportBatchSize), scheduledDelayMillis: this.convertStringToNumber(this.config.batchSpanProcessorConfig?.scheduledDelayMillis), exportTimeoutMillis: this.convertStringToNumber(this.config.batchSpanProcessorConfig?.exportTimeoutMillis), maxQueueSize: this.convertStringToNumber(this.config.batchSpanProcessorConfig?.maxQueueSize) }; return this.config.commonConfig.production ? new BatchSpanProcessor(this.exporterService.getExporter(), bufferConfig) : new SimpleSpanProcessor(this.exporterService.getExporter()); } /** * define the Probability Sampler * By Default, it's always (or 1) * * @param sampleConfig the sample configuration */ defineProbabilitySampler(sampleConfig) { if (sampleConfig >= 1) { return new ParentBasedSampler({ root: new AlwaysOnSampler() }); } else if (sampleConfig <= 0 || sampleConfig === undefined) { return new ParentBasedSampler({ root: new AlwaysOffSampler() }); } else { return new ParentBasedSampler({ root: new TraceIdRatioBasedSampler(sampleConfig) }); } } /** * convert String to Number (or undefined) * * @param value * @returns number or undefined */ convertStringToNumber(value) { return value !== undefined ? Number(value) : undefined; } /** * Set custom attributes in span with a CustomSpan * * @param span * @param request * @param response * @returns Span */ setCustomSpan(span, request, response) { return this.customSpan != null ? this.customSpan.add(span, request, response) : span; } } OpenTelemetryHttpInterceptor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: OpenTelemetryHttpInterceptor, deps: [{ token: OTEL_CONFIG }, { token: OTEL_EXPORTER }, { token: OTEL_PROPAGATOR }, { token: OTEL_LOGGER, optional: true }, { token: OTEL_CUSTOM_SPAN, optional: true }, { token: i1.PlatformLocation }], target: i0.ɵɵFactoryTarget.Injectable }); OpenTelemetryHttpInterceptor.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: OpenTelemetryHttpInterceptor, providedIn: 'root' }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: OpenTelemetryHttpInterceptor, decorators: [{ type: Injectable, args: [{ providedIn: 'root', }] }], ctorParameters: function () { return [{ type: undefined, decorators: [{ type: Inject, args: [OTEL_CONFIG] }] }, { type: undefined, decorators: [{ type: Inject, args: [OTEL_EXPORTER] }] }, { type: undefined, decorators: [{ type: Inject, args: [OTEL_PROPAGATOR] }] }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [OTEL_LOGGER] }] }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [OTEL_CUSTOM_SPAN] }] }, { type: i1.PlatformLocation }]; } }); class OpenTelemetryInterceptorModule { constructor(parentModule) { if (parentModule) { throw new Error('OpentelemetryInterceptorModule is already loaded. Import it in the AppModule only'); } } static forRoot(config, configProvider) { //Interceptor const interceptorProvider = { provide: HTTP_INTERCEPTORS, useClass: OpenTelemetryHttpInterceptor, multi: true, }; configProvider = defineConfigProvider(config, configProvider); return { ngModule: OpenTelemetryInterceptorModule, providers: [ configProvider, interceptorProvider, ], }; } } OpenTelemetryInterceptorModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: OpenTelemetryInterceptorModule, deps: [{ token: OpenTelemetryInterceptorModule, optional: true, skipSelf: true }], target: i0.ɵɵFactoryTarget.NgModule }); OpenTelemetryInterceptorModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.3.0", ngImport: i0, type: OpenTelemetryInterceptorModule, imports: [HttpClientModule] }); OpenTelemetryInterceptorModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: OpenTelemetryInterceptorModule, imports: [HttpClientModule] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: OpenTelemetryInterceptorModule, decorators: [{ type: NgModule, args: [{ declarations: [], imports: [HttpClientModule], exports: [], }] }], ctorParameters: function () { return [{ type: OpenTelemetryInterceptorModule, decorators: [{ type: Optional }, { type: SkipSelf }] }]; } }); /** * OtelcolExporterService class */ class OtelcolExporterService { /** * constructor * * @param config OpenTelemetryConfig */ constructor(config) { this.otelcolConfig = { url: config.otelcolConfig?.url, headers: config.otelcolConfig?.headers, // eslint-disable-next-line max-len concurrencyLimit: Number(config.otelcolConfig?.concurrencyLimit ?? 0) <= 0 ? undefined : Number(config.otelcolConfig?.concurrencyLimit), timeoutMillis: Number(config.otelcolConfig?.timeoutMillis ?? 0) <= 0 ? undefined : Number(config.otelcolConfig?.timeoutMillis) }; } /** * Return a CollectorExporter with the configuration * * @return a CollectorExporter */ getExporter() { return new OTLPTraceExporter(this.otelcolConfig); } } OtelcolExporterService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: OtelcolExporterService, deps: [{ token: OTEL_CONFIG }], target: i0.ɵɵFactoryTarget.Injectable }); OtelcolExporterService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: OtelcolExporterService, providedIn: 'root' }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: OtelcolExporterService, decorators: [{ type: Injectable, args: [{ providedIn: 'root', }] }], ctorParameters: function () { return [{ type: undefined, decorators: [{ type: Inject, args: [OTEL_CONFIG] }] }]; } }); class OtelColExporterModule { } OtelColExporterModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: OtelColExporterModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); OtelColExporterModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.3.0", ngImport: i0, type: OtelColExporterModule }); OtelColExporterModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: OtelColExporterModule, providers: [ { provide: OTEL_EXPORTER, useClass: OtelcolExporterService }, ] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: OtelColExporterModule, decorators: [{ type: NgModule, args: [{ declarations: [], imports: [], providers: [ { provide: OTEL_EXPORTER, useClass: OtelcolExporterService }, ] }] }] }); /** * ConsoleSpanExporterService * A default span exporter */ class ConsoleSpanExporterService { /** * Return a ConsoleSpanExporter * * @return SpanExporter */ getExporter() { return new ConsoleSpanExporter(); } } ConsoleSpanExporterService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ConsoleSpanExporterService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); ConsoleSpanExporterService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ConsoleSpanExporterService, providedIn: 'root' }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ConsoleSpanExporterService, decorators: [{ type: Injectable, args: [{ providedIn: 'root', }] }] }); class ConsoleSpanExporterModule { } ConsoleSpanExporterModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ConsoleSpanExporterModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); ConsoleSpanExporterModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.3.0", ngImport: i0, type: ConsoleSpanExporterModule }); ConsoleSpanExporterModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ConsoleSpanExporterModule, providers: [ { provide: OTEL_EXPORTER, useClass: ConsoleSpanExporterService } ] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ConsoleSpanExporterModule, decorators: [{ type: NgModule, args: [{ declarations: [], imports: [], providers: [ { provide: OTEL_EXPORTER, useClass: ConsoleSpanExporterService } ] }] }] }); /** * ZipkinExporterService class */ class ZipkinExporterService { /** * constructor * * @param config OpenTelemetryConfig */ constructor(config) { this.zipkinConfig = { url: config.zipkinConfig?.url, headers: config.zipkinConfig?.headers }; } /** * Return a ZipkinExporter configured with zipkinConfig field * * @return SpanExporter */ getExporter() { return new ZipkinExporter(this.zipkinConfig); } } ZipkinExporterService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ZipkinExporterService, deps: [{ token: OTEL_CONFIG }], target: i0.ɵɵFactoryTarget.Injectable }); ZipkinExporterService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ZipkinExporterService, providedIn: 'root' }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ZipkinExporterService, decorators: [{ type: Injectable, args: [{ providedIn: 'root', }] }], ctorParameters: function () { return [{ type: undefined, decorators: [{ type: Inject, args: [OTEL_CONFIG] }] }]; } }); class ZipkinExporterModule { } ZipkinExporterModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ZipkinExporterModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); ZipkinExporterModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.3.0", ngImport: i0, type: ZipkinExporterModule }); ZipkinExporterModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ZipkinExporterModule, providers: [ { provide: OTEL_EXPORTER, useClass: ZipkinExporterService } ] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ZipkinExporterModule, decorators: [{ type: NgModule, args: [{ declarations: [], imports: [], providers: [ { provide: OTEL_EXPORTER, useClass: ZipkinExporterService } ] }] }] }); /** * NoopSpanExporterService * A No-op span exporter */ class NoopSpanExporterService { /** * Return undefined * * @return SpanExporter */ getExporter() { return undefined; } } NoopSpanExporterService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: NoopSpanExporterService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); NoopSpanExporterService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: NoopSpanExporterService, providedIn: 'root' }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: NoopSpanExporterService, decorators: [{ type: Injectable, args: [{ providedIn: 'root', }] }] }); class NoopSpanExporterModule { } NoopSpanExporterModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: NoopSpanExporterModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); NoopSpanExporterModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.3.0", ngImport: i0, type: NoopSpanExporterModule, imports: [CommonModule] }); NoopSpanExporterModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: NoopSpanExporterModule, providers: [ { provide: OTEL_EXPORTER, useClass: NoopSpanExporterService } ], imports: [CommonModule] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: NoopSpanExporterModule, decorators: [{ type: NgModule, args: [{ declarations: [], imports: [ CommonModule ], providers: [ { provide: OTEL_EXPORTER, useClass: NoopSpanExporterService } ] }] }] }); /** * B3PropagatorService * * Can be a single or multi header. * * See Configuration for more information */ class B3PropagatorService { /** * Constructor * * @param config OpenTelemetryConfig */ constructor(config) { this.b3PropagatorConfig = { injectEncoding: B3PropagatorService.defineB3Encoding(config.b3PropagatorConfig?.multiHeader) }; } /** * Define if it's a single or multi header * * @param value string (0 => single header, 1 => Multi Header) * @return B3InjectEncoding */ static defineB3Encoding(value) { if (value && '0' === value) { return B3InjectEncoding.SINGLE_HEADER; } return B3InjectEncoding.MULTI_HEADER; } /** * Return an B3Propagator * * @return TextMapPropagator as B3Propagator */ getPropagator() { return new B3Propagator(this.b3PropagatorConfig); } } B3PropagatorService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: B3PropagatorService, deps: [{ token: OTEL_CONFIG }], target: i0.ɵɵFactoryTarget.Injectable }); B3PropagatorService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: B3PropagatorService, providedIn: 'root' }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: B3PropagatorService, decorators: [{ type: Injectable, args: [{ providedIn: 'root', }] }], ctorParameters: function () { return [{ type: undefined, decorators: [{ type: Inject, args: [OTEL_CONFIG] }] }]; } }); class B3PropagatorModule { } B3PropagatorModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: B3PropagatorModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); B3PropagatorModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.3.0", ngImport: i0, type: B3PropagatorModule }); B3PropagatorModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: B3PropagatorModule, providers: [ { provide: OTEL_PROPAGATOR, useClass: B3PropagatorService } ] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: B3PropagatorModule, decorators: [{ type: NgModule, args: [{ declarations: [], imports: [], providers: [ { provide: OTEL_PROPAGATOR, useClass: B3PropagatorService } ] }] }] }); /** * W3CTraceContextPropagatorService */ class W3CTraceContextPropagatorService { /** * Return an W3CTraceContextPropagatorService * * @return TextMapPropagator as W3CTraceContextPropagatorService */ getPropagator() { return new W3CTraceContextPropagator(); } } W3CTraceContextPropagatorService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: W3CTraceContextPropagatorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); W3CTraceContextPropagatorService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: W3CTraceContextPropagatorService, providedIn: 'root' }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: W3CTraceContextPropagatorService, decorators: [{ type: Injectable, args: [{ providedIn: 'root', }] }] }); /** * JaegerHttpTracePropagatorService */ class JaegerHttpTracePropagatorService { /** * Constructor * * @param config OpenTelemetryConfig */ constructor(config) { this.customHeader = config.jaegerPropagatorConfig?.customHeader; } /** * Return an JaegerPropagator * * @return TextMapPropagator as JaegerPropagator */ getPropagator() { return new JaegerPropagator(this.customHeader); } } JaegerHttpTracePropagatorService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: JaegerHttpTracePropagatorService, deps: [{ token: OTEL_CONFIG }], target: i0.ɵɵFactoryTarget.Injectable }); JaegerHttpTracePropagatorService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: JaegerHttpTracePropagatorService, providedIn: 'root' }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: JaegerHttpTracePropagatorService, decorators: [{ type: Injectable, args: [{ providedIn: 'root', }] }], ctorParameters: function () { return [{ type: undefined, decorators: [{ type: Inject, args: [OTEL_CONFIG] }] }]; } }); /** * AwsXrayPropagatorService */ class AwsXrayPropagatorService { /** * Return an AwsXrayPropagator * * @return TextMapPropagator as AwsXrayPropagator */ getPropagator() { return new AWSXRayPropagator(); } } AwsXrayPropagatorService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: AwsXrayPropagatorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); AwsXrayPropagatorService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: AwsXrayPropagatorService, providedIn: 'root' }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: AwsXrayPropagatorService, decorators: [{ type: Injectable, args: [{ providedIn: 'root', }] }] }); /** * CompositePropagatorService */ class CompositePropagatorService { /** * Constructor */ constructor(b3PropagatorService, w3cTraceContextPropagatorService, jaegerHttpTracePropagatorService, awsXrayPropagatorService) { this.b3PropagatorService = b3PropagatorService; this.w3cTraceContextPropagatorService = w3cTraceContextPropagatorService; this.jaegerHttpTracePropagatorService = jaegerHttpTracePropagatorService; this.awsXrayPropagatorService = awsXrayPropagatorService; } /** * Return an CompositePropagator * * @return TextMapPropagator as CompositePropagator */ getPropagator() { return new CompositePropagator({ propagators: [ this.b3PropagatorService.getPropagator(), this.w3cTraceContextPropagatorService.getPropagator(), this.jaegerHttpTracePropagatorService.getPropagator(), this.awsXrayPropagatorService.getPropagator() ], }); } } CompositePropagatorService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: CompositePropagatorService, deps: [{ token: B3PropagatorService }, { token: W3CTraceContextPropagatorService }, { token: JaegerHttpTracePropagatorService }, { token: AwsXrayPropagatorService }], target: i0.ɵɵFactoryTarget.Injectable }); CompositePropagatorService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: CompositePropagatorService, providedIn: 'root' }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: CompositePropagatorService, decorators: [{ type: Injectable, args: [{ providedIn: 'root', }] }], ctorParameters: function () { return [{ type: B3PropagatorService, decorators: [{ type: Inject, args: [B3PropagatorService] }] }, { type: W3CTraceContextPropagatorService, decorators: [{ type: Inject, args: [W3CTraceContextPropagatorService] }] }, { type: JaegerHttpTracePropagatorService, decorators: [{ type: Inject, args: [JaegerHttpTracePropagatorService] }] }, { type: AwsXrayPropagatorService, decorators: [{ type: Inject, args: [AwsXrayPropagatorService] }] }]; } }); class CompositePropagatorModule { } CompositePropagatorModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: CompositePropagatorModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); CompositePropagatorModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.3.0", ngImport: i0, type: CompositePropagatorModule }); CompositePropagatorModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: CompositePropagatorModule, providers: [ { provide: OTEL_PROPAGATOR, useClass: CompositePropagatorService } ] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: CompositePropagatorModule, decorators: [{ type: NgModule, args: [{ declarations: [], imports: [], providers: [ { provide: OTEL_PROPAGATOR, useClass: CompositePropagatorService } ] }] }] }); class AwsXrayPropagatorModule { } AwsXrayPropagatorModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: AwsXrayPropagatorModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); AwsXrayPropagatorModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.3.0", ngImport: i0, type: AwsXrayPropagatorModule }); AwsXrayPropagatorModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: AwsXrayPropagatorModule, providers: [ { provide: OTEL_PROPAGATOR, useClass: AwsXrayPropagatorService } ] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: AwsXrayPropagatorModule, decorators: [{ type: NgModule, args: [{ declarations: [], imports: [], providers: [ { provide: OTEL_PROPAGATOR, useClass: AwsXrayPropagatorService } ] }] }] }); class W3CTraceContextPropagatorModule { } W3CTraceContextPropagatorModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: W3CTraceContextPropagatorModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); W3CTraceContextPropagatorModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.3.0", ngImport: i0, type: W3CTraceContextPropagatorModule }); W3CTraceContextPropagatorModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: W3CTraceContextPropagatorModule, providers: [ { provide: OTEL_PROPAGATOR, useClass: W3CTraceContextPropagatorService } ] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: W3CTraceContextPropagatorModule, decorators: [{ type: NgModule, args: [{ declarations: [], imports: [], providers: [ { provide: OTEL_PROPAGATOR, useClass: W3CTraceContextPropagatorService } ] }] }] }); class JaegerHttpTracePropagatorModule { } JaegerHttpTracePropagatorModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: JaegerHttpTracePropagatorModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); JaegerHttpTracePropagatorModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.3.0", ngImport: i0, type: JaegerHttpTracePropagatorModule }); JaegerHttpTracePropagatorModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: JaegerHttpTracePropagatorModule, providers: [ { provide: OTEL_PROPAGATOR, useClass: JaegerHttpTracePropagatorService } ] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: JaegerHttpTracePropagatorModule, decorators: [{ type: NgModule, args: [{ declarations: [], imports: [], providers: [ { provide: OTEL_PROPAGATOR, useClass: JaegerHttpTracePropagatorService } ] }] }] }); /** * NoopHttpTextPropagatorService */ class NoopTextMapPropagatorService { /** * Return null * * @return TextMapPropagator as null */ getPropagator() { return null; } } NoopTextMapPropagatorService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: NoopTextMapPropagatorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); NoopTextMapPropagatorService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: NoopTextMapPropagatorService, providedIn: 'root' }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: NoopTextMapPropagatorService, decorators: [{ type: Injectable, args: [{ providedIn: 'root', }] }] }); class NoopTextMapPropagatorModule { } NoopTextMapPropagatorModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: NoopTextMapPropagatorModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); NoopTextMapPropagatorModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.3.0", ngImport: i0, type: NoopTextMapPropagatorModule }); NoopTextMapPropagatorModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: NoopTextMapPropagatorModule, providers: [ { provide: OTEL_PROPAGATOR, useClass: NoopTextMapPropagatorService } ] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: NoopTextMapPropagatorModule, decorators: [{ type: NgModule, args: [{ declarations: [], imports: [], providers: [ { provide: OTEL_PROPAGATOR, useClass: NoopTextMapPropagatorService } ] }] }] }); /** * InstrumentationService. * Service for component to add instrumentation. */ class InstrumentationService { /** * Constructor * * @param config * @param exporterService * @param propagatorService */ constructor(config, exporterService, propagatorService, instrumentation) { this.config = config; this.exporterService = exporterService; this.propagatorService = propagatorService; this.instrumentation = instrumentation; /** * contextManager */ this.contextManager = new ZoneContextManager(); this.tracerProvider = new WebTracerProvider({ sampler: this.defineProbabilitySampler(this.convertStringToNumber(this.config.commonConfig.probabilitySampler)), resource: this.loadResourceAttributes(this.config.commonConfig), spanProcessors: this.insertOrNotSpanExporter(this.config.commonConfig.production, this.exporterService, this.config.commonConfig.console), }); } /** * Init instrumentation on init */ initInstrumentation() { this.tracerProvider.register({ contextManager: this.contextManager, propagator: this.propagatorService.getPropagator(), }); registerInstrumentations({ instrumentations: this.instrumentation, tracerProvider: this.tracerProvider, }); } /** * Generate Resource Attributes * @param commonConfig common configuration * @returns Resource */ loadResourceAttributes(commonConfig) { return resourceFromAttributes({ [ATTR_SERVICE_NAME]: commonConfig?.serviceName, ...commonConfig?.resourceAttributes, }); } /** * Verify to insert or not a Span Exporter * @param console config to insert console span * @param production production mode * @param exporter exporter * @returns Array of SpanProcessor */ insertOrNotSpanExporter(production, exporter, console) { if (this.exporterService.getExporter() !== undefined) { return Array.of(this.insertSpanProcessorProductionMode(production, exporter), this.insertConsoleSpanExporter(console)); } else { return Array.of(new NoopSpanProcessor()); } } /** * Insert in tracer the console span if config is true * * @param console config to insert console span * @returns SpanProcessor */ insertConsoleSpanExporter(console) { if (console) { return new SimpleSpanProcessor(new ConsoleSpanExporter()); } } /** * Insert BatchSpanProcessor in production mode * SimpleSpanProcessor otherwise * * @param boolean production * @param IExporter exporter * @returns SpanProcessor */ insertSpanProcessorProductionMode(production, exporter) { return production ? new BatchSpanProcessor(exporter.getExporter()) : new SimpleSpanProcessor(exporter.getExporter()); } /** * convert String to Number (or undefined) * * @param value * @returns number or undefined */ convertStringToNumber(value) { return value !== undefined ? Number(value) : undefined; } /** * define the Probability Sampler * By Default, it's always (or 1) * * @param sampleConfig the sample configuration * @returns Sampler */ defineProbabilitySampler(sampleConfig) { if (sampleConfig >= 1) { return new ParentBasedSampler$1({ root: new AlwaysOnSampler$1() }); } else if (sampleConfig <= 0 || sampleConfig === undefined) { return new ParentBasedSampler$1({ root: new AlwaysOffSampler$1() }); } else { return new ParentBasedSampler$1({ root: new TraceIdRatioBasedSampler$1(sampleConfig) }); } } } InstrumentationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: InstrumentationService, deps: [{ token: OTEL_CONFIG }, { token: OTEL_EXPORTER }, { token: OTEL_PROPAGATOR }, { token: OTEL_INSTRUMENTATION_PLUGINS }], target: i0.ɵɵFactoryTarget.Injectable }); InstrumentationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: InstrumentationService, providedIn: 'root' }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: InstrumentationService, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }], ctorParameters: function () { return [{ type: undefined, decorators: [{ type: Inject, args: [OTEL_CONFIG] }] }, { type: undefined, decorators: [{ type: Inject, args: [OTEL_EXPORTER] }] }, { type: undefined, decorators: [{ type: Inject, args: [OTEL_PROPAGATOR] }] }, { type: undefined, decorators: [{ type: Inject, args: [OTEL_INSTRUMENTATION_PLUGINS] }] }]; } }); const instruServiceLoader = (instrumentationService) => { const loader = () => instrumentationService.initInstrumentation(); return loader; }; class OtelWebTracerModule { constructor(parentModule) { if (parentModule) { throw new Error('OtelWebTracerModule is already loaded. Import it in the AppModule only'); } } static forRoot(config, configProvider) { configProvider = defineConfigProvider(config, configProvider); return { ngModule: OtelWebTracerModule, providers: [ configProvider, InstrumentationService, { provide: APP_INITIALIZER, useFactory: instruServiceLoader, deps: [InstrumentationService], multi: true } ], }; } } OtelWebTracerModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: OtelWebTracerModule, deps: [{ token: OtelWebTracerModule, optional: true, skipSelf: true }], target: i0.ɵɵFactoryTarget.NgModule }); OtelWebTracerModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.3.0", ngImport: i0, type: OtelWebTracerModule }); OtelWebTracerModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: OtelWebTracerModule }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: OtelWebTracerModule, decorators: [{ type: NgModule }], ctorParameters: function () { return [{ type: OtelWebTracerModule, decorators: [{ type: Optional }, { type: SkipSelf }] }]; } }); /* * Public API Surface of opentelemetry-interceptor */ /** * Generated bundle index. Do not edit. */ export { AwsXrayPropagatorModule, B3PropagatorModule, CompositePropagatorModule, ConsoleSpanExporterModule, ConsoleSpanExporterService, JaegerHttpTracePropagatorModule, NoopSpanExporterModule, NoopSpanExporterService, NoopTextMapPropagatorModule, OTEL_CONFIG, OTEL_CUSTOM_SPAN, OTEL_EXPORTER, OTEL_INSTRUMENTATION_PLUGINS, OTEL_LOGGER, OTEL_PROPAGATOR, OpenTelemetryHttpInterceptor, OpenTelemetryInterceptorModule, OtelColExporterModule, OtelWebTracerModule, OtelcolExporterService, W3CTraceContextPropagatorModule, ZipkinExporterModule, ZipkinExporterService }; //# sourceMappingURL=jufab-opentelemetry-angular-interceptor.mjs.map