{"id":15282727,"url":"https://github.com/jufab/opentelemetry-angular-interceptor","last_synced_at":"2025-04-04T21:06:25.715Z","repository":{"id":37938834,"uuid":"266439412","full_name":"jufab/opentelemetry-angular-interceptor","owner":"jufab","description":"An Angular Module for easely deploying OpenTelemetry","archived":false,"fork":false,"pushed_at":"2025-03-19T20:56:24.000Z","size":9793,"stargazers_count":38,"open_issues_count":11,"forks_count":24,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-03-28T20:06:25.849Z","etag":null,"topics":["angular","observability","opentelemetry","tracing"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jufab.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-05-23T23:55:33.000Z","updated_at":"2025-03-20T02:22:09.000Z","dependencies_parsed_at":"2023-02-08T05:31:34.285Z","dependency_job_id":"3a655c7b-ef66-435f-b194-946bb9f0c972","html_url":"https://github.com/jufab/opentelemetry-angular-interceptor","commit_stats":{"total_commits":349,"total_committers":9,"mean_commits":38.77777777777778,"dds":"0.18338108882521487","last_synced_commit":"0c948568d2155b943f9ad55437b14b15fcaeb67a"},"previous_names":[],"tags_count":60,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jufab%2Fopentelemetry-angular-interceptor","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jufab%2Fopentelemetry-angular-interceptor/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jufab%2Fopentelemetry-angular-interceptor/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jufab%2Fopentelemetry-angular-interceptor/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jufab","download_url":"https://codeload.github.com/jufab/opentelemetry-angular-interceptor/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247249524,"owners_count":20908212,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["angular","observability","opentelemetry","tracing"],"created_at":"2024-09-30T14:37:05.941Z","updated_at":"2025-04-04T21:06:25.692Z","avatar_url":"https://github.com/jufab.png","language":"TypeScript","readme":"# OpenTelemetry Angular Interceptor\n\n@jufab/opentelemetry-angular-interceptor is an Angular Library to deploy [OpenTelemetry](https://opentelemetry.io/) in your Angular application\n\nThis library uses [opentelemetry-js package](https://github.com/open-telemetry/opentelemetry-js)\n\n**Use Angular \u003e= 13.0.0**\n\nMore info : https://jufab.github.io/opentelemetry-angular-interceptor/\n\n[![npm version](https://badge.fury.io/js/%40jufab%2Fopentelemetry-angular-interceptor.svg)](https://badge.fury.io/js/%40jufab%2Fopentelemetry-angular-interceptor)\n[![codecov](https://codecov.io/gh/jufab/opentelemetry-angular-interceptor/branch/master/graph/badge.svg)](https://codecov.io/gh/jufab/opentelemetry-angular-interceptor)\n\n## Table of contents\n\n- [OpenTelemetry Angular Interceptor](#opentelemetry-angular-interceptor)\n  - [Table of contents](#table-of-contents)\n  - [Getting started](#getting-started)\n    - [Content](#content)\n    - [Installation](#installation)\n    - [Configuration](#configuration)\n      - [Example global Configuration](#example-global-configuration)\n      - [Common Configuration](#common-configuration)\n      - [BatchSpanProcessor Configuration](#batchspanprocessor-configuration)\n      - [OpenTelemetry-collector Configuration](#opentelemetry-collector-configuration)\n      - [Jaeger Propagator Configuration](#jaeger-propagator-configuration)\n      - [Zipkin Exporter Configuration](#zipkin-exporter-configuration)\n      - [B3 Propagator Configuration](#b3-propagator-configuration)\n      - [Ignore URL Configuration](#ignore-url-configuration)\n      - [External Configuration](#external-configuration)\n    - [Angular module](#angular-module)\n      - [Commons Module](#commons-module)\n        - [Exporter module](#exporter-module)\n        - [Propagator module](#propagator-module)\n      - [Interceptor Module](#interceptor-module)\n      - [Instrumentation Module](#instrumentation-module)\n      - [Interceptor Module And Instrumentation Module](#interceptor-module-and-instrumentation-module)\n      - [Injection token](#injection-token)\n    - [(Optional) Logging in OtelColExporterModule](#optional-logging-in-otelcolexportermodule)\n      - [NGXLogger](#ngxlogger)\n    - [(Optional) Add span attributes during interception](#optional-add-span-attributes-during-interception)\n  - [How it works](#how-it-works)\n  - [Example](#example)\n    - [Run](#run)\n      - [Interceptor](#interceptor)\n      - [Instrumentation](#instrumentation)\n    - [\\[Optional\\] Result in OpenTelemetry-collector](#optional-result-in-opentelemetry-collector)\n  - [Troubleshoot](#troubleshoot)\n    - [Angular 10 Warning](#angular-10-warning)\n    - [Other](#other)\n\n## Getting started\n\n### Content\n\nThis library offers two possibilities to use it in Angular App : \n- **Interceptor** : catch every external call with the HttpClient from angular\n- **Instrumentation** : use instrumentation from opentelemetry-js with web plugins _(You need to install and configure it)_ like : \n  - [@opentelemetry/instrumentation-document-load](hhttps://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/plugins/web/opentelemetry-instrumentation-document-load)\n  - [@opentelemetry/instrumentation-fetch](https://github.com/open-telemetry/opentelemetry-js/tree/main/experimental/packages/opentelemetry-instrumentation-fetch)\n  - [@opentelemetry/instrumentation-xml-http-request](https://github.com/open-telemetry/opentelemetry-js/tree/main/experimental/packages/opentelemetry-instrumentation-xml-http-request)\n  - ...\n  \n\n### Installation\n\nWith npm :\n\n```\nnpm i @jufab/opentelemetry-angular-interceptor\n```\n\n### Configuration\n\nUse the \"OpentelemetryConfig\" interface to configure the Tracer\n\n```typescript\nexport interface OpenTelemetryConfig {\n  commonConfig: CommonCollectorConfig;\n  batchSpanProcessorConfig?: BatchSpanProcessorConfig;\n  otelcolConfig?: OtelCollectorConfig;\n  jaegerPropagatorConfig?: JaegerPropagatorConfig;\n  zipkinConfig?: ZipkinCollectorConfig;\n  b3PropagatorConfig?: B3PropagatorConfig;\n  ignoreUrls?: IgnoreUrlsConfig;\n}\n```\n\n#### Example global Configuration\n\n_From the interceptor-example_\n\n```typescript\nopentelemetryConfig: {\n    commonConfig: {\n      console: true, //(boolean) Display trace on console\n      production: false, //(boolean) Send trace with BatchSpanProcessor (true) or SimpleSpanProcessor (false)\n      logBody: true, //(boolean) true add body in a log, nothing otherwise\n      serviceName: 'interceptor-example', //Service name send in trace\n      resourceAttributes: { // extra resource attributes like service.namespace\n        [ATTR_SERVICE_NAMESPACE]: 'namespace'\n      },\n      probabilitySampler: '0.7', //Samples a configurable percentage of traces, string value between '0' to '1'\n      logLevel:DiagLogLevel.ALL //(Enum) DiagLogLevel is an Enum from @opentelemetry/api\n    },\n    batchSpanProcessorConfig: { //Only if production = true in commonConfig\n      maxQueueSize: '2048', // The maximum queue size. After the size is reached spans are dropped.\n      maxExportBatchSize: '512', // The maximum batch size of every export. It must be smaller or equal to maxQueueSize.\n      scheduledDelayMillis: '5000', // The interval between two consecutive exports\n      exportTimeoutMillis: '30000', // How long the export can run before it is cancelled\n    },\n    otelcolConfig: {\n      url: 'http://localhost:4318/v1/traces', //URL of opentelemetry collector\n    },\n    jaegerPropagatorConfig: {\n      customHeader: 'custom-header',\n    }\n  }\n```\n\n_From the instrumentation-example_\n\n```typescript\nbackendApp.get('/api/config', (req,res) =\u003e {\n  return res.status(200).send({\n    commonConfig: {\n      console: true, // Display trace on console\n      production: true, // Send Trace with BatchSpanProcessor (true) or SimpleSpanProcessor (false)\n      serviceName: 'instrumentation-example', // Service name send in trace\n      resourceAttributes: { // extra resource attributes like service.namespace\n        'service.namespace': 'namespace'\n      },\n      probabilitySampler: '0.75', // 75% sampling\n      logLevel: 99 //ALL Log, DiagLogLevel is an Enum from @opentelemetry/api\n    },\n    otelcolConfig: {\n      url: 'http://localhost:4318/v1/traces', // URL of opentelemetry collector\n    }\n  });\n})\n\n```\n\n#### Common Configuration\n \n * console: (boolean) Display trace on console if true\n * production: (boolean)Send trace via BatchSpanProcessor (Async) or SimpleSpanProcessor (Sync) : It's recommend to use BatchSpanProcessor on Production.\n * serviceName: (string) Service name in your trace\n * resourceAttributes: list of extra resource attributes\n * probabilitySampler: (string) Samples a configurable percentage of traces, value between 0 to 1\n * logBody: (boolean) true add body in a log, nothing otherwise\n * logLevel: (DiagLogLevel) log level\n\n#### BatchSpanProcessor Configuration\n\n_This configuration applies if production is true in commonConfig._\n\n* maxQueueSize: (string) The maximum queue size. After the size is reached spans are dropped.\n* maxExportBatchSize: (string) The maximum batch size of every export. It must be smaller or equal to maxQueueSize.\n* scheduledDelayMillis: (string) The interval between two consecutive exports\n* exportTimeoutMillis: (string) How long the export can run before it is cancelled\n\n#### OpenTelemetry-collector Configuration\n\n* url: (string) url of opentelemetry collector (default : http://localhost:4318/v1/traces)\n* headers: list of custom header (more info: https://github.com/open-telemetry/opentelemetry-js/tree/main/experimental/packages/exporter-trace-otlp-http)\n* concurrencyLimit (string) : An optional limit on pending requests (more info : https://github.com/open-telemetry/opentelemetry-js/tree/main/experimental/packages/exporter-trace-otlp-http)\n* timeoutMillis (string): Maximum time the OTLP exporter will wait for each batch export. The default value is 10000ms (more info : https://github.com/open-telemetry/opentelemetry-js/tree/main/experimental/packages/exporter-trace-otlp-http)\n\n#### Jaeger Propagator Configuration\n\n* customHeader: (string) custom header (more info : https://github.com/open-telemetry/opentelemetry-js/tree/main/packages/opentelemetry-propagator-jaeger)\n\n#### Zipkin Exporter Configuration\n\n* url: (string) url of zipkin collector (default : http://localhost:9411/api/v2/spans)\n* headers: list of custom header (more info : https://github.com/open-telemetry/opentelemetry-js/tree/main/packages/opentelemetry-exporter-zipkin)\n\n#### B3 Propagator Configuration\n\n* multiHeader : (string) Single or Multi Header for b3propagator (default: multi). Value : 'O' (single), '1' (multi) (more info: https://github.com/open-telemetry/opentelemetry-js/tree/main/packages/opentelemetry-propagator-b3)\n\n#### Ignore URL Configuration\n\n* urls : (Array\u003cstring | RegExp\u003e) URLs that partially match any regex in ignoreUrls will not be traced. In addition, URLs that are _exact matches_ of strings in ignoreUrls will also not be traced\n\n#### External Configuration\n\nInstrumentation example project have an external configuration to show how you can do it.\n\n\n### Angular module\n\nYou need 3 modules to add to your application.\n\n- [Exporter Module](#exporter-module) : to define type and export of traces.\n- [Propagator Module](#propagator-module) : to define propagation in your HTTP header.\n- Last Module, 2 choices :  \n  - [OpenTelemetryInterceptorModule](#interceptor-module) : to activate interceptor in all your http call.\n  - [OtelWebTracerModule](#instrumentation-module) : to activate instrumentation (you need a component to activate it, see [Component otel-instrumentation](#component-otel-instrumentation)).\n\n#### Commons Module\n\nYou add this modules in your application module (generally app.module.ts)\n\n##### Exporter module\n\nThere is 4 exporters:\n\n* NoopSpanExporterModule : This a fake exporter\n* OtelColExporterModule : OpenTelemetry exporter (more info : https://github.com/open-telemetry/opentelemetry-js/tree/main/experimental/packages/opentelemetry-exporter-trace-otlp-http)\n* ConsoleSpanExporterModule : Console Exporter\n* ZipkinExporterModule : Zipkin Exporter (more info : https://github.com/open-telemetry/opentelemetry-js/tree/main/packages/opentelemetry-exporter-zipkin)\n\n##### Propagator module\n\nthere is 6 propagators (more info about propagator: https://github.com/open-telemetry/opentelemetry-js/tree/main/packages/opentelemetry-core)\n* NoopHttpTextPropagatorModule : This is a fake propagator\n* B3PropagatorModule : Use B3 propagator\n* W3CTraceContextPropagatorModule : Use W3CTraceContext propagator\n* JaegerHttpTracePropagatorModule : Use JaegerHttpPropagator (more info about this one: https://github.com/open-telemetry/opentelemetry-js/tree/main/packages/opentelemetry-propagator-jaeger)\n* AwsXrayPropagatorModule : Use AWS X-Ray propagator\n* CompositePropagatorModule : use all of the propagator\n\n\n#### Interceptor Module\n\nJust add OpenTelemetryInterceptorModule to insert Interceptor\n\n```typescript\nimport { NgModule } from '@angular/core';\n...\nimport { AppComponent } from './app.component';\nimport { HttpClientModule } from '@angular/common/http';\nimport { OpenTelemetryInterceptorModule, OtelColExporterModule, CompositePropagatorModule } from '@jufab/opentelemetry-angular-interceptor';\nimport { environment } from '../environments/environment';\n...\n\n@NgModule({\n  declarations: [AppComponent, ...],\n  imports: [\n    ...\n    HttpClientModule,\n    //Insert module OpenTelemetryInterceptorModule with configuration, HttpClientModule is used for interceptor\n    OpenTelemetryInterceptorModule.forRoot(environment.opentelemetryConfig),\n    //Insert OtelCol exporter module\n    OtelColExporterModule,\n    //Insert propagator module\n    CompositePropagatorModule,\n    ...\n  ],\n  providers: [],\n  bootstrap: [AppComponent],\n})\nexport class AppModule {}\n```\n\n#### Instrumentation Module\n\nDeclare this OtelWebTracerModule to configure instrumentation.\n\nYou need to provide Web instrumentation on the `OTEL_INSTRUMENTATION_PLUGINS` token in providers section of NgModule\n\n_Example in instrumentation-example project_\n\n```typescript\n...\nimport { OtelColExporterModule, CompositePropagatorModule, OtelWebTracerModule } from 'projects/opentelemetry-interceptor/src/public-api';\n...\n\n@NgModule({\n  declarations: [AppComponent, ...],\n  imports: [\n    ...\n    // OtelCol Exporter Module\n    OtelColExporterModule,\n    // Composite Propagator Module\n    CompositePropagatorModule,\n    // OtelWebTracerModule to configure instrumentation component.\n    OtelWebTracerModule.forRoot(environment.openTelemetryConfig),\n    ...\n  ],\n  providers: [\n    {provide: OTEL_INSTRUMENTATION_PLUGINS, useValue: [new XMLHttpRequestInstrumentation()]}\n  ],\n  bootstrap: [AppComponent],\n})\nexport class AppModule { }\n\n```\n\n*This module uses APP_INITIALIZER token to load instrumentation (multi:true). No component needs now*\n\n\n#### Interceptor Module And Instrumentation Module\n\n`Don't use them at the same time : you're going to have the same trace twice.`\n\n#### Injection token\n\nThis library exposes injection token.\nYou can use them to override or customize. \n\n* OTEL_EXPORTER : token to inject an implementation of `IExporter`\n* OTEL_PROPAGATOR : token to inject an implementation of `IPropagator`\n* OTEL_CONFIG : token to inject an `OpenTelemetryConfig`\n* OTEL_INSTRUMENTATION_PLUGINS : token to inject an `InstrumentationOption` array\n* OTEL_LOGGER : more info in [(Optional) Logging in OtelColExporterModule](#optional-logging-in-otelcolexportermodule)\n* OTEL_CUSTOM_SPAN : more infor in [(Optional) Add span attributes during interception](#optional-add-span-attributes-during-interception)\n\n\n### (Optional) Logging in OtelColExporterModule\n\nYou can add a logger to the [OtelColExporterModule](projects/opentelemetry-interceptor/src/lib/services/exporter/otelcol/otelcol-exporter.module.ts) with the [OTEL_LOGGER](projects/opentelemetry-interceptor/src/lib/configuration/opentelemetry-config.ts) token.\n\nYou can use a custom logger which implements the [DiagLogger](https://open-telemetry.github.io/opentelemetry-js-api/enums/diagloglevel.html) in @opentelemetry/api.\n\nOr, you can use an existing logger which implements the same functions (error, warn, info, debug) like [ngx-logger](https://www.npmjs.com/package/ngx-logger).\n\n#### NGXLogger\n\nYou can use [ngx-logger](https://www.npmjs.com/package/ngx-logger).\n\nIn your [appModule](projects/example-app/src/app/app.module.ts), insert LoggerModule and configure it\n\n```typescript\n@NgModule({\n  ...\n  imports: [\n    LoggerModule.forRoot(environment.loggerConfig),\n  ]\n  ...\n```\nAnd use OTEL_LOGGER token to inject NGXLogger\n```typescript\n@NgModule({\n  ...\n  providers: [\n    ...\n    { provide: OTEL_LOGGER, useExisting: NGXLogger }\n    ...\n  ]\n```\n\nDon't forget to set \"logLevel\" in [Common Configuration](#common-configuration) (Level must be the same between NGXLogger and common configuration)\n\n\u003e You can see an example in the [interceptor-example](#example).\n\n### (Optional) Add span attributes during interception\n\n_This option is only available for Interceptor Module_\n\nImplement a [`CustomSpan`](projects/opentelemetry-interceptor/src/lib/interceptor/custom-span.interface.ts) and the method `add(span: Span, request: HttpRequest\u003cunknown\u003e, response: HttpResponse\u003cunknown\u003e | HttpErrorResponse): Span`\n\n- span : Current span, you can set or get attributes\n- request : Current request in interceptor\n- response : Current response in interceptor \n\n\nImplement CustomSpan class like : \n\n```typescript\nclass CustomSpanImpl implements CustomSpan {\n  add(span: Span, request: HttpRequest\u003cunknown\u003e, response: HttpResponse\u003cunknown\u003e | HttpErrorResponse): Span {\n    span.setAttribute('mycustom.key', request.params + \";\" + response.status);\n    return span;\n  }\n}\n```\n\nInject it in you App module with `OTEL_CUSTOM_SPAN` :\n\n```typescript\n@NgModule({\n  ...\n  providers: [\n    ...\n    { provide: OTEL_CUSTOM_SPAN, useClass: CustomSpanImpl }\n    ...\n  ]\n```\n\n\u003e You can see an example in the [interceptor-example](#example).\n\n## How it works\n\nThis library is based on [HttpClientModule](https://angular.io/api/common/http/HttpClientModule) and the [HTTP_INTERCEPTORS](https://angular.io/api/common/http/HTTP_INTERCEPTORS)\n\nOpenTelemetryInterceptor implement an [HttpInterceptor](https://angular.io/api/common/http/HttpInterceptor) and the intercept method.\n\nThis implementation initialise a [WebTracerProvider](https://github.com/open-telemetry/opentelemetry-js/blob/main/packages/opentelemetry-web/src/WebTracerProvider.ts), create a [Span](https://open-telemetry.github.io/opentelemetry-js/interfaces/span.html) and add [header propagation](https://open-telemetry.github.io/opentelemetry-js/interfaces/textmappropagator.html) in the current call.\n\n\u003e The response body is adding by an event in span.\n\n## Example\n\nThis project has two example Angular Application:\n\n- [projects/interceptor-example](projects/interceptor-example)\n- [projects/instrumentation-example](projects/instrumentation-example)\n\n\nYou can see how configure and insert all modules.\n\nYou can althought test __opentelemetry-angular-interceptor__ with this two applications.\n\n### Run\n\n#### Interceptor\n\nTo start this Interceptor example application, run command :\n\n```\nnpm run start:complete-interceptor-example\n```\n\nand open the application at http://localhost:4200\n\n#### Instrumentation\n\nTo start this Instrumentation example application, run command :\n\n```\nnpm run start:complete-instrumentation-example\n```\n\nand open the application at http://localhost:4200\n\n### [Optional] Result in OpenTelemetry-collector\n\nIf you want to see the result in a collector *, there's a docker-compose available in this project.\n\nYou can start it with this command :\n\n```\ndocker-compose -f collector/docker-compose.yaml up -d\n```\n\nGo to the jaeger application (http://localhost:16686) to see result.\n\nMore info about the collector here : https://github.com/open-telemetry/opentelemetry-collector\n\n\u003e _* without an Agent or a Collector you can see an error in your browser about sending a \"trace\"._\n\n\n## Troubleshoot\n\n### Angular 10 Warning\n\n```shell\nWARNING in xxx/fesm2015/jufab-opentelemetry-angular-interceptor.js depends on '@opentelemetry/web'. CommonJS or AMD dependencies can cause optimization bailouts.\nFor more info see: https://angular.io/guide/build#configuring-commonjs-dependencies\n\nWARNING in xxx/fesm2015/jufab-opentelemetry-angular-interceptor.js depends on '@opentelemetry/core'. CommonJS or AMD dependencies can cause optimization bailouts.\nFor more info see: https://angular.io/guide/build#configuring-commonjs-dependencies\n\nWARNING in xxx/fesm2015/jufab-opentelemetry-angular-interceptor.js depends on '@opentelemetry/tracing'. CommonJS or AMD dependencies can cause optimization bailouts.\nFor more info see: https://angular.io/guide/build#configuring-commonjs-dependencies\n\nWARNING in xxx/fesm2015/jufab-opentelemetry-angular-interceptor.js depends on '@opentelemetry/api'. CommonJS or AMD dependencies can cause optimization bailouts.\nFor more info see: https://angular.io/guide/build#configuring-commonjs-dependencies\n\nWARNING in xxx/fesm2015/jufab-opentelemetry-angular-interceptor.js depends on '@opentelemetry/exporter-collector/build/src/platform/browser'. CommonJS or AMD dependencies can cause optimization bailouts.\nFor more info see: https://angular.io/guide/build#configuring-commonjs-dependencies\n```\n\nAdd to your angular.json\n\n```json\n\"options\": {\n  \"allowedCommonJsDependencies\": [\n    \"@opentelemetry/api\",\n    \"@opentelemetry/exporter-collector\",\n    \"@opentelemetry/exporter-zipkin\",\n    \"@opentelemetry/tracing\",\n    \"@opentelemetry/web\",\n    \"@opentelemetry/core\",\n    \"@opentelemetry/propagator-jaeger\",\n    \"@opentelemetry/propagator-b3\",\n    \"@opentelemetry/instrumentation\",\n    \"@opentelemetry/instrumentation-xml-http-request\",\n    \"@opentelemetry/instrumentation-document-load\",\n    \"@opentelemetry/instrumentation-fetch\",\n    \"@opentelemetry/context-zone-peer-dep\"\n  ],\n```\n\n### Other\n\n|Error|Fix|\n|-----|---|\n|error TS2694: Namespace 'NodeJS' has no exported member 'Timeout'.|Need dependence @type/node \u003e= 12.0.2|\n|error TS1086: An accessor cannot be declared in an ambient context.|Need dependence typescript \u003e= 3.6.0|\n","funding_links":[],"categories":["Recently Updated","Development Utilities"],"sub_categories":["[Mar 20, 2025](/content/2025/03/20/README.md)","Analytics"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjufab%2Fopentelemetry-angular-interceptor","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjufab%2Fopentelemetry-angular-interceptor","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjufab%2Fopentelemetry-angular-interceptor/lists"}