@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
JavaScript
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