@tramvai/module-opentelemetry 5.49.1 → 6.59.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/browser.js CHANGED
@@ -1,13 +1,50 @@
1
1
  import { __decorate } from 'tslib';
2
- import { Module } from '@tramvai/core';
3
- export { OPENTELEMETRY_PROVIDER_CONFIG_TOKEN, OPENTELEMETRY_PROVIDER_RESOURCE_ATTRIBUTES_TOKEN, OPENTELEMETRY_PROVIDER_RESOURCE_TOKEN, OPENTELEMETRY_PROVIDER_SPAN_PROCESSOR_TOKEN, OPENTELEMETRY_PROVIDER_TOKEN, OPENTELEMETRY_TRACER_TOKEN } from './tokens.browser.js';
2
+ import { Module, provide } from '@tramvai/core';
3
+ import once from '@tinkoff/utils/function/once';
4
+ import { DEFAULT_HTTP_CLIENT_INTERCEPTORS } from '@tramvai/tokens-http-client';
5
+ import { OPENTELEMETRY_HTTP_CLIENT_BROWSER_HEADERS_INCLUDE_TOKEN } from './tokens.browser.js';
6
+ export { OPENTELEMETRY_HTTP_CLIENT_BROWSER_HEADERS_INCLUDE_TOKEN, OPENTELEMETRY_PROVIDER_CONFIG_TOKEN, OPENTELEMETRY_PROVIDER_RESOURCE_ATTRIBUTES_TOKEN, OPENTELEMETRY_PROVIDER_RESOURCE_TOKEN, OPENTELEMETRY_PROVIDER_SPAN_PROCESSOR_TOKEN, OPENTELEMETRY_PROVIDER_TOKEN, OPENTELEMETRY_TRACER_TOKEN } from './tokens.browser.js';
4
7
 
8
+ const extractTraceparentHeader = once(() => {
9
+ if (typeof window !== 'undefined') {
10
+ const traceparentMeta = Array.from(document.getElementsByTagName('meta')).filter((element) => element.name === 'traceparent');
11
+ if (traceparentMeta.length !== 1) {
12
+ return undefined;
13
+ }
14
+ return traceparentMeta[0].content;
15
+ }
16
+ return undefined;
17
+ });
5
18
  let OpenTelemetryModule = class OpenTelemetryModule {
6
19
  };
7
20
  OpenTelemetryModule = __decorate([
8
21
  Module({
9
22
  imports: [],
10
- providers: [],
23
+ providers: [
24
+ provide({
25
+ provide: DEFAULT_HTTP_CLIENT_INTERCEPTORS,
26
+ useFactory: ({ headerInclude }) => (req, next) => {
27
+ const url = req.url ?? (req.baseUrl ? `${req.baseUrl}${req.path}` : (req.path ?? ''));
28
+ if (!headerInclude(url)) {
29
+ return next(req);
30
+ }
31
+ return next({
32
+ ...req,
33
+ headers: {
34
+ traceparent: extractTraceparentHeader(),
35
+ ...req.headers,
36
+ },
37
+ });
38
+ },
39
+ deps: {
40
+ headerInclude: OPENTELEMETRY_HTTP_CLIENT_BROWSER_HEADERS_INCLUDE_TOKEN,
41
+ },
42
+ }),
43
+ provide({
44
+ provide: OPENTELEMETRY_HTTP_CLIENT_BROWSER_HEADERS_INCLUDE_TOKEN,
45
+ useValue: () => true,
46
+ }),
47
+ ],
11
48
  })
12
49
  ], OpenTelemetryModule);
13
50
  // todo declareModule!
@@ -0,0 +1,9 @@
1
+ import { type ChildAppConfigResolutionPlugin } from '@tramvai/tokens-child-app';
2
+ export declare const providers: import("@tinkoff/dippy").Provider<{
3
+ tracer: import("../../tokens").TramvaiTracer & {
4
+ __type?: "base token" | undefined;
5
+ };
6
+ }, ChildAppConfigResolutionPlugin & {
7
+ __type?: "multi token" | undefined;
8
+ }>[];
9
+ //# sourceMappingURL=configResolution.d.ts.map
@@ -0,0 +1,31 @@
1
+ import { provide } from '@tinkoff/dippy';
2
+ import { SpanKind } from '@opentelemetry/api';
3
+ import { CHILD_APP_CONFIG_RESOLUTION_PLUGIN } from '@tramvai/tokens-child-app';
4
+ import { OPENTELEMETRY_TRACER_TOKEN } from '../../tokens.es.js';
5
+
6
+ class ChildAppConfigResolutionOpenTelemetryPlugin {
7
+ tracer;
8
+ constructor({ tracer }) {
9
+ this.tracer = tracer;
10
+ }
11
+ apply(hooks) {
12
+ hooks.fetchConfig.wrap(async (_, payload, next) => {
13
+ return this.tracer.trace('child app fetch config', { kind: SpanKind.SERVER }, async (span) => {
14
+ span.setAttribute('tramvai.scope', 'child_app.fetch_config');
15
+ const configs = await next(payload);
16
+ return configs;
17
+ });
18
+ });
19
+ }
20
+ }
21
+ const providers = [
22
+ provide({
23
+ provide: CHILD_APP_CONFIG_RESOLUTION_PLUGIN,
24
+ useClass: ChildAppConfigResolutionOpenTelemetryPlugin,
25
+ deps: {
26
+ tracer: OPENTELEMETRY_TRACER_TOKEN,
27
+ },
28
+ }),
29
+ ];
30
+
31
+ export { providers };
@@ -0,0 +1,35 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var dippy = require('@tinkoff/dippy');
6
+ var api = require('@opentelemetry/api');
7
+ var tokensChildApp = require('@tramvai/tokens-child-app');
8
+ var tokens = require('../../tokens.js');
9
+
10
+ class ChildAppConfigResolutionOpenTelemetryPlugin {
11
+ tracer;
12
+ constructor({ tracer }) {
13
+ this.tracer = tracer;
14
+ }
15
+ apply(hooks) {
16
+ hooks.fetchConfig.wrap(async (_, payload, next) => {
17
+ return this.tracer.trace('child app fetch config', { kind: api.SpanKind.SERVER }, async (span) => {
18
+ span.setAttribute('tramvai.scope', 'child_app.fetch_config');
19
+ const configs = await next(payload);
20
+ return configs;
21
+ });
22
+ });
23
+ }
24
+ }
25
+ const providers = [
26
+ dippy.provide({
27
+ provide: tokensChildApp.CHILD_APP_CONFIG_RESOLUTION_PLUGIN,
28
+ useClass: ChildAppConfigResolutionOpenTelemetryPlugin,
29
+ deps: {
30
+ tracer: tokens.OPENTELEMETRY_TRACER_TOKEN,
31
+ },
32
+ }),
33
+ ];
34
+
35
+ exports.providers = providers;
@@ -0,0 +1,9 @@
1
+ import { type ChildAppLoaderPlugin } from '@tramvai/tokens-child-app';
2
+ export declare const providers: import("@tinkoff/dippy").Provider<{
3
+ tracer: import("../../tokens").TramvaiTracer & {
4
+ __type?: "base token" | undefined;
5
+ };
6
+ }, ChildAppLoaderPlugin & {
7
+ __type?: "multi token" | undefined;
8
+ }>[];
9
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1,39 @@
1
+ import { provide, Scope } from '@tinkoff/dippy';
2
+ import { SpanKind } from '@opentelemetry/api';
3
+ import { CHILD_APP_LOADER_PLUGIN } from '@tramvai/tokens-child-app';
4
+ import { OPENTELEMETRY_TRACER_TOKEN } from '../../tokens.es.js';
5
+
6
+ class ChildAppLoaderOpenTelemetryPlugin {
7
+ tracer;
8
+ constructor({ tracer }) {
9
+ this.tracer = tracer;
10
+ }
11
+ apply(hooks) {
12
+ hooks.loadModule.wrap(async (_, payload, next) => {
13
+ return this.tracer.trace('child app load', { kind: SpanKind.SERVER }, async (span) => {
14
+ span.setAttribute('tramvai.scope', 'child_app');
15
+ span.setAttribute('tramvai.child_app.name', payload.config.name);
16
+ span.setAttribute('tramvai.child_app.version', payload.config.version);
17
+ span.setAttribute('tramvai.child_app.tag', payload.config.tag);
18
+ span.setAttribute('tramvai.child_app.client.baseUrl', payload.config.client.baseUrl);
19
+ span.setAttribute('tramvai.child_app.client.entry', payload.config.client.entry);
20
+ span.setAttribute('tramvai.child_app.client.stats', payload.config.client.stats);
21
+ span.setAttribute('tramvai.child_app.client.statsLoadable', payload.config.client.statsLoadable);
22
+ const childApp = await next(payload);
23
+ return childApp;
24
+ });
25
+ });
26
+ }
27
+ }
28
+ const providers = [
29
+ provide({
30
+ scope: Scope.SINGLETON,
31
+ provide: CHILD_APP_LOADER_PLUGIN,
32
+ useClass: ChildAppLoaderOpenTelemetryPlugin,
33
+ deps: {
34
+ tracer: OPENTELEMETRY_TRACER_TOKEN,
35
+ },
36
+ }),
37
+ ];
38
+
39
+ export { providers };
@@ -0,0 +1,43 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var dippy = require('@tinkoff/dippy');
6
+ var api = require('@opentelemetry/api');
7
+ var tokensChildApp = require('@tramvai/tokens-child-app');
8
+ var tokens = require('../../tokens.js');
9
+
10
+ class ChildAppLoaderOpenTelemetryPlugin {
11
+ tracer;
12
+ constructor({ tracer }) {
13
+ this.tracer = tracer;
14
+ }
15
+ apply(hooks) {
16
+ hooks.loadModule.wrap(async (_, payload, next) => {
17
+ return this.tracer.trace('child app load', { kind: api.SpanKind.SERVER }, async (span) => {
18
+ span.setAttribute('tramvai.scope', 'child_app');
19
+ span.setAttribute('tramvai.child_app.name', payload.config.name);
20
+ span.setAttribute('tramvai.child_app.version', payload.config.version);
21
+ span.setAttribute('tramvai.child_app.tag', payload.config.tag);
22
+ span.setAttribute('tramvai.child_app.client.baseUrl', payload.config.client.baseUrl);
23
+ span.setAttribute('tramvai.child_app.client.entry', payload.config.client.entry);
24
+ span.setAttribute('tramvai.child_app.client.stats', payload.config.client.stats);
25
+ span.setAttribute('tramvai.child_app.client.statsLoadable', payload.config.client.statsLoadable);
26
+ const childApp = await next(payload);
27
+ return childApp;
28
+ });
29
+ });
30
+ }
31
+ }
32
+ const providers = [
33
+ dippy.provide({
34
+ scope: dippy.Scope.SINGLETON,
35
+ provide: tokensChildApp.CHILD_APP_LOADER_PLUGIN,
36
+ useClass: ChildAppLoaderOpenTelemetryPlugin,
37
+ deps: {
38
+ tracer: tokens.OPENTELEMETRY_TRACER_TOKEN,
39
+ },
40
+ }),
41
+ ];
42
+
43
+ exports.providers = providers;
@@ -0,0 +1,9 @@
1
+ import { type ChildAppPreloadManagerPlugin } from '@tramvai/tokens-child-app';
2
+ export declare const providers: import("@tinkoff/dippy").Provider<{
3
+ tracer: import("../../tokens").TramvaiTracer & {
4
+ __type?: "base token" | undefined;
5
+ };
6
+ }, ChildAppPreloadManagerPlugin & {
7
+ __type?: "multi token" | undefined;
8
+ }>[];
9
+ //# sourceMappingURL=preload.d.ts.map
@@ -0,0 +1,44 @@
1
+ import { provide } from '@tinkoff/dippy';
2
+ import { SpanKind } from '@opentelemetry/api';
3
+ import { CHILD_APP_PRELOAD_MANAGER_PLUGIN } from '@tramvai/tokens-child-app';
4
+ import { OPENTELEMETRY_TRACER_TOKEN } from '../../tokens.es.js';
5
+
6
+ class ChildAppPreloadManagerOpenTelemetryPlugin {
7
+ tracer;
8
+ constructor({ tracer }) {
9
+ this.tracer = tracer;
10
+ }
11
+ apply(hooks) {
12
+ hooks.preloadChildApp.wrap(async (_, payload, next) => {
13
+ return this.tracer.trace('child app preload', { kind: SpanKind.SERVER }, async (span) => {
14
+ span.setAttribute('tramvai.scope', 'child_app');
15
+ span.setAttribute('tramvai.child_app.name', payload.config.name);
16
+ span.setAttribute('tramvai.child_app.version', payload.config.version);
17
+ span.setAttribute('tramvai.child_app.tag', payload.config.tag);
18
+ await next(payload);
19
+ });
20
+ });
21
+ hooks.runChildAppCommandLine.wrap(async (_, payload, next) => {
22
+ return this.tracer.trace('child app run command line', { kind: SpanKind.SERVER }, async (span) => {
23
+ span.setAttribute('tramvai.scope', 'child_app');
24
+ span.setAttribute('tramvai.child_app.name', payload.config.name);
25
+ span.setAttribute('tramvai.child_app.version', payload.config.version);
26
+ span.setAttribute('tramvai.child_app.tag', payload.config.tag);
27
+ span.setAttribute('tramvai.child_app.line', payload.line);
28
+ span.setAttribute('tramvai.child_app.status', payload.status);
29
+ await next(payload);
30
+ });
31
+ });
32
+ }
33
+ }
34
+ const providers = [
35
+ provide({
36
+ provide: CHILD_APP_PRELOAD_MANAGER_PLUGIN,
37
+ useClass: ChildAppPreloadManagerOpenTelemetryPlugin,
38
+ deps: {
39
+ tracer: OPENTELEMETRY_TRACER_TOKEN,
40
+ },
41
+ }),
42
+ ];
43
+
44
+ export { providers };
@@ -0,0 +1,48 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var dippy = require('@tinkoff/dippy');
6
+ var api = require('@opentelemetry/api');
7
+ var tokensChildApp = require('@tramvai/tokens-child-app');
8
+ var tokens = require('../../tokens.js');
9
+
10
+ class ChildAppPreloadManagerOpenTelemetryPlugin {
11
+ tracer;
12
+ constructor({ tracer }) {
13
+ this.tracer = tracer;
14
+ }
15
+ apply(hooks) {
16
+ hooks.preloadChildApp.wrap(async (_, payload, next) => {
17
+ return this.tracer.trace('child app preload', { kind: api.SpanKind.SERVER }, async (span) => {
18
+ span.setAttribute('tramvai.scope', 'child_app');
19
+ span.setAttribute('tramvai.child_app.name', payload.config.name);
20
+ span.setAttribute('tramvai.child_app.version', payload.config.version);
21
+ span.setAttribute('tramvai.child_app.tag', payload.config.tag);
22
+ await next(payload);
23
+ });
24
+ });
25
+ hooks.runChildAppCommandLine.wrap(async (_, payload, next) => {
26
+ return this.tracer.trace('child app run command line', { kind: api.SpanKind.SERVER }, async (span) => {
27
+ span.setAttribute('tramvai.scope', 'child_app');
28
+ span.setAttribute('tramvai.child_app.name', payload.config.name);
29
+ span.setAttribute('tramvai.child_app.version', payload.config.version);
30
+ span.setAttribute('tramvai.child_app.tag', payload.config.tag);
31
+ span.setAttribute('tramvai.child_app.line', payload.line);
32
+ span.setAttribute('tramvai.child_app.status', payload.status);
33
+ await next(payload);
34
+ });
35
+ });
36
+ }
37
+ }
38
+ const providers = [
39
+ dippy.provide({
40
+ provide: tokensChildApp.CHILD_APP_PRELOAD_MANAGER_PLUGIN,
41
+ useClass: ChildAppPreloadManagerOpenTelemetryPlugin,
42
+ deps: {
43
+ tracer: tokens.OPENTELEMETRY_TRACER_TOKEN,
44
+ },
45
+ }),
46
+ ];
47
+
48
+ exports.providers = providers;
@@ -4,6 +4,7 @@ import { SpanKind } from '@opentelemetry/api';
4
4
  import { OPENTELEMETRY_TRACER_TOKEN } from '../tokens.es.js';
5
5
 
6
6
  class CommandLineRunnerOpenTelemetryPlugin {
7
+ tracer;
7
8
  constructor({ tracer }) {
8
9
  this.tracer = tracer;
9
10
  }
@@ -8,6 +8,7 @@ var api = require('@opentelemetry/api');
8
8
  var tokens = require('../tokens.js');
9
9
 
10
10
  class CommandLineRunnerOpenTelemetryPlugin {
11
+ tracer;
11
12
  constructor({ tracer }) {
12
13
  this.tracer = tracer;
13
14
  }
@@ -1,7 +1,7 @@
1
1
  import { provide } from '@tramvai/core';
2
2
  import { DEFAULT_HTTP_CLIENT_INTERCEPTORS } from '@tramvai/tokens-http-client';
3
3
  import { METRICS_SERVICES_REGISTRY_TOKEN } from '@tramvai/tokens-metrics';
4
- import { propagation, context, SpanKind } from '@opentelemetry/api';
4
+ import { SpanKind } from '@opentelemetry/api';
5
5
  import { ATTR_HTTP_REQUEST_METHOD, ATTR_SERVER_ADDRESS, ATTR_URL_PATH, ATTR_URL_QUERY, ATTR_URL_SCHEME, ATTR_URL_FULL, ATTR_HTTP_RESPONSE_STATUS_CODE } from '@opentelemetry/semantic-conventions';
6
6
  import { OPENTELEMETRY_TRACER_TOKEN } from '../tokens.es.js';
7
7
 
@@ -16,21 +16,18 @@ const providers = [
16
16
  const parsedUrl = new URL(request.query ? `${url}?${new URLSearchParams(request.query).toString()}` : url);
17
17
  const serviceName = metricsServicesRegistry.getServiceName(url, request) ?? 'unknown';
18
18
  const method = request.method ?? 'GET';
19
- // propagate context from outgoing request
20
- // https://opentelemetry.io/docs/languages/js/propagation/#manual-context-propagation
21
- const output = {};
22
- propagation.inject(context.active(), output);
23
- if (output.traceparent) {
19
+ const { traceparent, tracestate } = tracer.propagateContext();
20
+ if (traceparent !== undefined) {
24
21
  if (!request.headers) {
25
22
  request.headers = {};
26
23
  }
27
- request.headers.traceparent = output.traceparent;
24
+ request.headers.traceparent = traceparent;
28
25
  }
29
- if (output.tracestate) {
26
+ if (tracestate !== undefined) {
30
27
  if (!request.headers) {
31
28
  request.headers = {};
32
29
  }
33
- request.headers.tracestate = output.tracestate;
30
+ request.headers.tracestate = tracestate;
34
31
  }
35
32
  // https://github.com/open-telemetry/semantic-conventions/blob/main/docs/http/http-spans.md#http-client
36
33
  return tracer.trace(`${method} ${serviceName}`, { kind: SpanKind.CLIENT }, (span) => {
@@ -20,21 +20,18 @@ const providers = [
20
20
  const parsedUrl = new URL(request.query ? `${url}?${new URLSearchParams(request.query).toString()}` : url);
21
21
  const serviceName = metricsServicesRegistry.getServiceName(url, request) ?? 'unknown';
22
22
  const method = request.method ?? 'GET';
23
- // propagate context from outgoing request
24
- // https://opentelemetry.io/docs/languages/js/propagation/#manual-context-propagation
25
- const output = {};
26
- api.propagation.inject(api.context.active(), output);
27
- if (output.traceparent) {
23
+ const { traceparent, tracestate } = tracer.propagateContext();
24
+ if (traceparent !== undefined) {
28
25
  if (!request.headers) {
29
26
  request.headers = {};
30
27
  }
31
- request.headers.traceparent = output.traceparent;
28
+ request.headers.traceparent = traceparent;
32
29
  }
33
- if (output.tracestate) {
30
+ if (tracestate !== undefined) {
34
31
  if (!request.headers) {
35
32
  request.headers = {};
36
33
  }
37
- request.headers.tracestate = output.tracestate;
34
+ request.headers.tracestate = tracestate;
38
35
  }
39
36
  // https://github.com/open-telemetry/semantic-conventions/blob/main/docs/http/http-spans.md#http-client
40
37
  return tracer.trace(`${method} ${serviceName}`, { kind: api.SpanKind.CLIENT }, (span) => {
@@ -11,6 +11,8 @@ function skipError(error) {
11
11
  return isRedirectFoundError(error) || isNotFoundError(error);
12
12
  }
13
13
  class OpentelemetryRouterPlugin {
14
+ tracer;
15
+ request;
14
16
  constructor({ tracer, request }) {
15
17
  this.tracer = tracer;
16
18
  this.request = request;
@@ -15,6 +15,8 @@ function skipError(error) {
15
15
  return errors.isRedirectFoundError(error) || errors.isNotFoundError(error);
16
16
  }
17
17
  class OpentelemetryRouterPlugin {
18
+ tracer;
19
+ request;
18
20
  constructor({ tracer, request }) {
19
21
  this.tracer = tracer;
20
22
  this.request = request;
package/lib/server.es.js CHANGED
@@ -4,14 +4,19 @@ import { NodeTracerProvider, SimpleSpanProcessor, ConsoleSpanExporter } from '@o
4
4
  import { Resource } from '@opentelemetry/resources';
5
5
  import { ATTR_SERVICE_NAME, ATTR_SERVICE_VERSION } from '@opentelemetry/semantic-conventions';
6
6
  import { LOGGER_TOKEN, ENV_MANAGER_TOKEN } from '@tramvai/tokens-common';
7
- import { OPENTELEMETRY_PROVIDER_TOKEN, OPENTELEMETRY_PROVIDER_CONFIG_TOKEN, OPENTELEMETRY_PROVIDER_RESOURCE_TOKEN, OPENTELEMETRY_PROVIDER_SPAN_PROCESSOR_TOKEN, OPENTELEMETRY_PROVIDER_RESOURCE_ATTRIBUTES_TOKEN, OPENTELEMETRY_TRACER_TOKEN } from './tokens.es.js';
8
- export { OPENTELEMETRY_PROVIDER_CONFIG_TOKEN, OPENTELEMETRY_PROVIDER_RESOURCE_ATTRIBUTES_TOKEN, OPENTELEMETRY_PROVIDER_RESOURCE_TOKEN, OPENTELEMETRY_PROVIDER_SPAN_PROCESSOR_TOKEN, OPENTELEMETRY_PROVIDER_TOKEN, OPENTELEMETRY_TRACER_TOKEN } from './tokens.es.js';
7
+ import { ResourceSlot, ResourceType, RESOURCES_REGISTRY } from '@tramvai/tokens-render';
8
+ import { OPENTELEMETRY_PROVIDER_TOKEN, OPENTELEMETRY_TRACER_TOKEN, OPENTELEMETRY_PROVIDER_CONFIG_TOKEN, OPENTELEMETRY_PROVIDER_RESOURCE_TOKEN, OPENTELEMETRY_PROVIDER_SPAN_PROCESSOR_TOKEN, OPENTELEMETRY_PROVIDER_RESOURCE_ATTRIBUTES_TOKEN } from './tokens.es.js';
9
+ export { OPENTELEMETRY_HTTP_CLIENT_BROWSER_HEADERS_INCLUDE_TOKEN, OPENTELEMETRY_PROVIDER_CONFIG_TOKEN, OPENTELEMETRY_PROVIDER_RESOURCE_ATTRIBUTES_TOKEN, OPENTELEMETRY_PROVIDER_RESOURCE_TOKEN, OPENTELEMETRY_PROVIDER_SPAN_PROCESSOR_TOKEN, OPENTELEMETRY_PROVIDER_TOKEN, OPENTELEMETRY_TRACER_TOKEN } from './tokens.es.js';
9
10
  import { TramvaiTracerImpl } from './tracer/tracer.es.js';
10
- import { providers } from './instrumentation/server.es.js';
11
- import { providers as providers$1 } from './instrumentation/httpClient.es.js';
12
- import { providers as providers$2 } from './instrumentation/logs.es.js';
13
- import { providers as providers$3 } from './instrumentation/commandLineRunner.es.js';
14
- import { providers as providers$4 } from './instrumentation/router.es.js';
11
+ import { providers as providers$3 } from './instrumentation/server.es.js';
12
+ import { providers as providers$4 } from './instrumentation/httpClient.es.js';
13
+ import { providers as providers$5 } from './instrumentation/logs.es.js';
14
+ import { providers as providers$6 } from './instrumentation/commandLineRunner.es.js';
15
+ import { providers as providers$7 } from './instrumentation/router.es.js';
16
+ import { providers } from './instrumentation/childApp/configResolution.es.js';
17
+ import { providers as providers$1 } from './instrumentation/childApp/loader.es.js';
18
+ import { providers as providers$2 } from './instrumentation/childApp/preload.es.js';
19
+ import { getTraceparentHeader } from './tracer/get-traceparent-header.es.js';
15
20
 
16
21
  let OpenTelemetryModule = class OpenTelemetryModule {
17
22
  };
@@ -24,6 +29,9 @@ OpenTelemetryModule = __decorate([
24
29
  ...providers$2,
25
30
  ...providers$3,
26
31
  ...providers$4,
32
+ ...providers$5,
33
+ ...providers$6,
34
+ ...providers$7,
27
35
  provide({
28
36
  provide: commandLineListTokens.init,
29
37
  useFactory: ({ provider }) => {
@@ -53,6 +61,25 @@ OpenTelemetryModule = __decorate([
53
61
  logger: LOGGER_TOKEN,
54
62
  },
55
63
  }),
64
+ provide({
65
+ provide: commandLineListTokens.customerStart,
66
+ useFactory: ({ tracer, resourcesRegistry }) => {
67
+ return function insertTraceIdToResourcesRegistry() {
68
+ const traceparent = getTraceparentHeader(tracer);
69
+ if (traceparent !== undefined) {
70
+ resourcesRegistry.register({
71
+ slot: ResourceSlot.HEAD_META,
72
+ type: ResourceType.meta,
73
+ payload: `<meta name="traceparent" content="${traceparent}">`,
74
+ });
75
+ }
76
+ };
77
+ },
78
+ deps: {
79
+ tracer: OPENTELEMETRY_TRACER_TOKEN,
80
+ resourcesRegistry: RESOURCES_REGISTRY,
81
+ },
82
+ }),
56
83
  provide({
57
84
  provide: OPENTELEMETRY_PROVIDER_TOKEN,
58
85
  useFactory: ({ config }) => {
package/lib/server.js CHANGED
@@ -8,6 +8,7 @@ var sdkTraceNode = require('@opentelemetry/sdk-trace-node');
8
8
  var resources = require('@opentelemetry/resources');
9
9
  var semanticConventions = require('@opentelemetry/semantic-conventions');
10
10
  var tokensCommon = require('@tramvai/tokens-common');
11
+ var tokensRender = require('@tramvai/tokens-render');
11
12
  var tokens = require('./tokens.js');
12
13
  var tracer = require('./tracer/tracer.js');
13
14
  var server = require('./instrumentation/server.js');
@@ -15,6 +16,10 @@ var httpClient = require('./instrumentation/httpClient.js');
15
16
  var logs = require('./instrumentation/logs.js');
16
17
  var commandLineRunner = require('./instrumentation/commandLineRunner.js');
17
18
  var router = require('./instrumentation/router.js');
19
+ var configResolution = require('./instrumentation/childApp/configResolution.js');
20
+ var loader = require('./instrumentation/childApp/loader.js');
21
+ var preload = require('./instrumentation/childApp/preload.js');
22
+ var getTraceparentHeader = require('./tracer/get-traceparent-header.js');
18
23
 
19
24
  exports.OpenTelemetryModule = class OpenTelemetryModule {
20
25
  };
@@ -22,6 +27,9 @@ exports.OpenTelemetryModule = tslib.__decorate([
22
27
  core.Module({
23
28
  imports: [],
24
29
  providers: [
30
+ ...configResolution.providers,
31
+ ...loader.providers,
32
+ ...preload.providers,
25
33
  ...server.providers,
26
34
  ...httpClient.providers,
27
35
  ...logs.providers,
@@ -56,6 +64,25 @@ exports.OpenTelemetryModule = tslib.__decorate([
56
64
  logger: tokensCommon.LOGGER_TOKEN,
57
65
  },
58
66
  }),
67
+ core.provide({
68
+ provide: core.commandLineListTokens.customerStart,
69
+ useFactory: ({ tracer, resourcesRegistry }) => {
70
+ return function insertTraceIdToResourcesRegistry() {
71
+ const traceparent = getTraceparentHeader.getTraceparentHeader(tracer);
72
+ if (traceparent !== undefined) {
73
+ resourcesRegistry.register({
74
+ slot: tokensRender.ResourceSlot.HEAD_META,
75
+ type: tokensRender.ResourceType.meta,
76
+ payload: `<meta name="traceparent" content="${traceparent}">`,
77
+ });
78
+ }
79
+ };
80
+ },
81
+ deps: {
82
+ tracer: tokens.OPENTELEMETRY_TRACER_TOKEN,
83
+ resourcesRegistry: tokensRender.RESOURCES_REGISTRY,
84
+ },
85
+ }),
59
86
  core.provide({
60
87
  provide: tokens.OPENTELEMETRY_PROVIDER_TOKEN,
61
88
  useFactory: ({ config }) => {
@@ -131,6 +158,7 @@ exports.OpenTelemetryModule = tslib.__decorate([
131
158
  ], exports.OpenTelemetryModule);
132
159
  // todo declareModule!
133
160
 
161
+ exports.OPENTELEMETRY_HTTP_CLIENT_BROWSER_HEADERS_INCLUDE_TOKEN = tokens.OPENTELEMETRY_HTTP_CLIENT_BROWSER_HEADERS_INCLUDE_TOKEN;
134
162
  exports.OPENTELEMETRY_PROVIDER_CONFIG_TOKEN = tokens.OPENTELEMETRY_PROVIDER_CONFIG_TOKEN;
135
163
  exports.OPENTELEMETRY_PROVIDER_RESOURCE_ATTRIBUTES_TOKEN = tokens.OPENTELEMETRY_PROVIDER_RESOURCE_ATTRIBUTES_TOKEN;
136
164
  exports.OPENTELEMETRY_PROVIDER_RESOURCE_TOKEN = tokens.OPENTELEMETRY_PROVIDER_RESOURCE_TOKEN;
@@ -6,5 +6,6 @@ const OPENTELEMETRY_PROVIDER_SPAN_PROCESSOR_TOKEN = createToken('tramvai opentel
6
6
  const OPENTELEMETRY_PROVIDER_RESOURCE_TOKEN = createToken('tramvai opentelemetry provider resource', { scope: Scope.SINGLETON });
7
7
  const OPENTELEMETRY_PROVIDER_RESOURCE_ATTRIBUTES_TOKEN = createToken('tramvai opentelemetry provider resource attributes', { multi: true, scope: Scope.SINGLETON });
8
8
  const OPENTELEMETRY_TRACER_TOKEN = createToken('tramvai opentelemetry tracer', { scope: Scope.SINGLETON });
9
+ const OPENTELEMETRY_HTTP_CLIENT_BROWSER_HEADERS_INCLUDE_TOKEN = createToken('tramvai opentelemetry http client browser traceparent header filter');
9
10
 
10
- export { OPENTELEMETRY_PROVIDER_CONFIG_TOKEN, OPENTELEMETRY_PROVIDER_RESOURCE_ATTRIBUTES_TOKEN, OPENTELEMETRY_PROVIDER_RESOURCE_TOKEN, OPENTELEMETRY_PROVIDER_SPAN_PROCESSOR_TOKEN, OPENTELEMETRY_PROVIDER_TOKEN, OPENTELEMETRY_TRACER_TOKEN };
11
+ export { OPENTELEMETRY_HTTP_CLIENT_BROWSER_HEADERS_INCLUDE_TOKEN, OPENTELEMETRY_PROVIDER_CONFIG_TOKEN, OPENTELEMETRY_PROVIDER_RESOURCE_ATTRIBUTES_TOKEN, OPENTELEMETRY_PROVIDER_RESOURCE_TOKEN, OPENTELEMETRY_PROVIDER_SPAN_PROCESSOR_TOKEN, OPENTELEMETRY_PROVIDER_TOKEN, OPENTELEMETRY_TRACER_TOKEN };
package/lib/tokens.d.ts CHANGED
@@ -4,6 +4,20 @@ import type { Resource } from '@opentelemetry/resources';
4
4
  export type TraceParams = {
5
5
  skipError?: (error: Error) => boolean;
6
6
  };
7
+ export type PropagationCarrier = {
8
+ /**
9
+ * Traceparent context appropriate W3C format:
10
+ * `version-traceId-spanId-sampled`.
11
+ *
12
+ * version – There is only `00` version at the moment.
13
+ * sampled – Was trace sampled. We are sampling all the traces currently.
14
+ *
15
+ * @see https://www.w3.org/TR/trace-context/#version
16
+ * @see https://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/plugins/web/opentelemetry-instrumentation-document-load#optional-send-a-trace-parent-from-your-server
17
+ */
18
+ traceparent?: string;
19
+ tracestate?: string;
20
+ };
7
21
  /**
8
22
  * API inspired by:
9
23
  * - https://github.com/DataDog/dd-trace-js/blob/59e9a2a75f4256755b4e6c9951a0bdf8d39b4015/index.d.ts#L9
@@ -19,6 +33,7 @@ export interface TramvaiTracer {
19
33
  trace<T>(name: string, fn: (span: Span) => T, params?: TraceParams): T;
20
34
  trace<T>(name: string, options: SpanOptions, fn: (span: Span) => Promise<T>, params?: TraceParams): Promise<T>;
21
35
  trace<T>(name: string, options: SpanOptions, fn: (span: Span) => T, params?: TraceParams): T;
36
+ propagateContext(carrier?: PropagationCarrier): PropagationCarrier;
22
37
  }
23
38
  export declare const OPENTELEMETRY_PROVIDER_TOKEN: BasicTracerProvider & {
24
39
  __type?: "base token" | undefined;
@@ -38,4 +53,7 @@ export declare const OPENTELEMETRY_PROVIDER_RESOURCE_ATTRIBUTES_TOKEN: import("@
38
53
  export declare const OPENTELEMETRY_TRACER_TOKEN: TramvaiTracer & {
39
54
  __type?: "base token" | undefined;
40
55
  };
56
+ export declare const OPENTELEMETRY_HTTP_CLIENT_BROWSER_HEADERS_INCLUDE_TOKEN: ((url: string) => boolean) & {
57
+ __type?: "base token" | undefined;
58
+ };
41
59
  //# sourceMappingURL=tokens.d.ts.map
package/lib/tokens.es.js CHANGED
@@ -6,5 +6,6 @@ const OPENTELEMETRY_PROVIDER_SPAN_PROCESSOR_TOKEN = createToken('tramvai opentel
6
6
  const OPENTELEMETRY_PROVIDER_RESOURCE_TOKEN = createToken('tramvai opentelemetry provider resource', { scope: Scope.SINGLETON });
7
7
  const OPENTELEMETRY_PROVIDER_RESOURCE_ATTRIBUTES_TOKEN = createToken('tramvai opentelemetry provider resource attributes', { multi: true, scope: Scope.SINGLETON });
8
8
  const OPENTELEMETRY_TRACER_TOKEN = createToken('tramvai opentelemetry tracer', { scope: Scope.SINGLETON });
9
+ const OPENTELEMETRY_HTTP_CLIENT_BROWSER_HEADERS_INCLUDE_TOKEN = createToken('tramvai opentelemetry http client browser traceparent header filter');
9
10
 
10
- export { OPENTELEMETRY_PROVIDER_CONFIG_TOKEN, OPENTELEMETRY_PROVIDER_RESOURCE_ATTRIBUTES_TOKEN, OPENTELEMETRY_PROVIDER_RESOURCE_TOKEN, OPENTELEMETRY_PROVIDER_SPAN_PROCESSOR_TOKEN, OPENTELEMETRY_PROVIDER_TOKEN, OPENTELEMETRY_TRACER_TOKEN };
11
+ export { OPENTELEMETRY_HTTP_CLIENT_BROWSER_HEADERS_INCLUDE_TOKEN, OPENTELEMETRY_PROVIDER_CONFIG_TOKEN, OPENTELEMETRY_PROVIDER_RESOURCE_ATTRIBUTES_TOKEN, OPENTELEMETRY_PROVIDER_RESOURCE_TOKEN, OPENTELEMETRY_PROVIDER_SPAN_PROCESSOR_TOKEN, OPENTELEMETRY_PROVIDER_TOKEN, OPENTELEMETRY_TRACER_TOKEN };
package/lib/tokens.js CHANGED
@@ -10,7 +10,9 @@ const OPENTELEMETRY_PROVIDER_SPAN_PROCESSOR_TOKEN = dippy.createToken('tramvai o
10
10
  const OPENTELEMETRY_PROVIDER_RESOURCE_TOKEN = dippy.createToken('tramvai opentelemetry provider resource', { scope: dippy.Scope.SINGLETON });
11
11
  const OPENTELEMETRY_PROVIDER_RESOURCE_ATTRIBUTES_TOKEN = dippy.createToken('tramvai opentelemetry provider resource attributes', { multi: true, scope: dippy.Scope.SINGLETON });
12
12
  const OPENTELEMETRY_TRACER_TOKEN = dippy.createToken('tramvai opentelemetry tracer', { scope: dippy.Scope.SINGLETON });
13
+ const OPENTELEMETRY_HTTP_CLIENT_BROWSER_HEADERS_INCLUDE_TOKEN = dippy.createToken('tramvai opentelemetry http client browser traceparent header filter');
13
14
 
15
+ exports.OPENTELEMETRY_HTTP_CLIENT_BROWSER_HEADERS_INCLUDE_TOKEN = OPENTELEMETRY_HTTP_CLIENT_BROWSER_HEADERS_INCLUDE_TOKEN;
14
16
  exports.OPENTELEMETRY_PROVIDER_CONFIG_TOKEN = OPENTELEMETRY_PROVIDER_CONFIG_TOKEN;
15
17
  exports.OPENTELEMETRY_PROVIDER_RESOURCE_ATTRIBUTES_TOKEN = OPENTELEMETRY_PROVIDER_RESOURCE_ATTRIBUTES_TOKEN;
16
18
  exports.OPENTELEMETRY_PROVIDER_RESOURCE_TOKEN = OPENTELEMETRY_PROVIDER_RESOURCE_TOKEN;
@@ -0,0 +1,3 @@
1
+ import { TramvaiTracer } from '../tokens';
2
+ export declare const getTraceparentHeader: (tracer: TramvaiTracer) => string | undefined;
3
+ //# sourceMappingURL=get-traceparent-header.d.ts.map
@@ -0,0 +1,3 @@
1
+ const getTraceparentHeader = (tracer) => tracer.propagateContext().traceparent;
2
+
3
+ export { getTraceparentHeader };
@@ -0,0 +1,7 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ const getTraceparentHeader = (tracer) => tracer.propagateContext().traceparent;
6
+
7
+ exports.getTraceparentHeader = getTraceparentHeader;
@@ -1,5 +1,5 @@
1
- import type { Context, Span, SpanOptions, Tracer } from '@opentelemetry/api';
2
- import type { TraceParams, TramvaiTracer } from '../tokens';
1
+ import { Context, Span, SpanOptions, Tracer } from '@opentelemetry/api';
2
+ import { PropagationCarrier, TraceParams, TramvaiTracer } from '../tokens';
3
3
  export declare class TramvaiTracerImpl implements TramvaiTracer {
4
4
  private tracer;
5
5
  constructor({ tracer }: {
@@ -14,5 +14,12 @@ export declare class TramvaiTracerImpl implements TramvaiTracer {
14
14
  trace<T>(name: string, fn: (span: Span) => T, params?: TraceParams): T;
15
15
  trace<T>(name: string, options: SpanOptions, fn: (span: Span) => Promise<T>, params?: TraceParams): Promise<T>;
16
16
  trace<T>(name: string, options: SpanOptions, fn: (span: Span, params?: TraceParams) => T): T;
17
+ /**
18
+ * Propagate context from outgoing request
19
+ * @param carrier
20
+ *
21
+ * @see https://opentelemetry.io/docs/languages/js/propagation/#manual-context-propagation
22
+ */
23
+ propagateContext(carrier?: PropagationCarrier): PropagationCarrier;
17
24
  }
18
25
  //# sourceMappingURL=tracer.d.ts.map
@@ -1,5 +1,5 @@
1
1
  import isPromise from '@tinkoff/utils/is/promise';
2
- import { trace, context, ROOT_CONTEXT, SpanStatusCode } from '@opentelemetry/api';
2
+ import { trace, context, ROOT_CONTEXT, propagation, SpanStatusCode } from '@opentelemetry/api';
3
3
  import { isSilentError } from '@tinkoff/errors';
4
4
 
5
5
  /* eslint-disable prefer-destructuring */
@@ -15,6 +15,7 @@ function recordAndThrowError(span, error, { skipError = () => false }) {
15
15
  throw error;
16
16
  }
17
17
  class TramvaiTracerImpl {
18
+ tracer;
18
19
  constructor({ tracer }) {
19
20
  this.tracer = tracer;
20
21
  }
@@ -70,6 +71,17 @@ class TramvaiTracerImpl {
70
71
  }
71
72
  });
72
73
  }
74
+ /**
75
+ * Propagate context from outgoing request
76
+ * @param carrier
77
+ *
78
+ * @see https://opentelemetry.io/docs/languages/js/propagation/#manual-context-propagation
79
+ */
80
+ propagateContext(carrier) {
81
+ const payload = carrier ?? {};
82
+ propagation.inject(context.active(), payload);
83
+ return payload;
84
+ }
73
85
  }
74
86
  /* eslint-enable prefer-destructuring */
75
87
 
@@ -23,6 +23,7 @@ function recordAndThrowError(span, error, { skipError = () => false }) {
23
23
  throw error;
24
24
  }
25
25
  class TramvaiTracerImpl {
26
+ tracer;
26
27
  constructor({ tracer }) {
27
28
  this.tracer = tracer;
28
29
  }
@@ -78,6 +79,17 @@ class TramvaiTracerImpl {
78
79
  }
79
80
  });
80
81
  }
82
+ /**
83
+ * Propagate context from outgoing request
84
+ * @param carrier
85
+ *
86
+ * @see https://opentelemetry.io/docs/languages/js/propagation/#manual-context-propagation
87
+ */
88
+ propagateContext(carrier) {
89
+ const payload = carrier ?? {};
90
+ api.propagation.inject(api.context.active(), payload);
91
+ return payload;
92
+ }
81
93
  }
82
94
  /* eslint-enable prefer-destructuring */
83
95
 
package/package.json CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "@tramvai/module-opentelemetry",
3
- "version": "5.49.1",
3
+ "version": "6.59.0",
4
4
  "description": "Интеграция OpenTelemetry",
5
5
  "browser": "lib/browser.js",
6
6
  "main": "lib/server.js",
7
7
  "module": "lib/server.es.js",
8
- "typings": "lib/server.d.d.ts",
8
+ "typings": "lib/server.d.ts",
9
9
  "files": [
10
10
  "lib"
11
11
  ],
@@ -27,20 +27,21 @@
27
27
  "@opentelemetry/resources": "^1.28.0",
28
28
  "@opentelemetry/sdk-trace-node": "^1.28.0",
29
29
  "@opentelemetry/semantic-conventions": "^1.28.0",
30
- "path-to-regexp": "0.1.7",
31
- "@tramvai/tokens-common": "5.49.1",
32
- "@tramvai/tokens-metrics": "5.49.1",
33
- "@tramvai/tokens-http-client": "5.49.1",
34
- "@tramvai/tokens-server": "5.49.1",
35
- "@tramvai/tokens-router": "5.49.1",
36
- "@tramvai/tokens-server-private": "5.49.1",
30
+ "@tinkoff/errors": "0.7.1",
37
31
  "@tinkoff/utils": "^2.1.2",
38
- "@tinkoff/errors": "0.6.2"
32
+ "@tramvai/tokens-child-app": "6.59.0",
33
+ "@tramvai/tokens-common": "6.59.0",
34
+ "@tramvai/tokens-http-client": "6.59.0",
35
+ "@tramvai/tokens-metrics": "6.59.0",
36
+ "@tramvai/tokens-render": "6.59.0",
37
+ "@tramvai/tokens-router": "6.59.0",
38
+ "@tramvai/tokens-server": "6.59.0",
39
+ "@tramvai/tokens-server-private": "6.59.0",
40
+ "path-to-regexp": "^0.1.12"
39
41
  },
40
- "devDependencies": {},
41
42
  "peerDependencies": {
42
- "@tinkoff/dippy": "0.11.4",
43
- "@tramvai/core": "5.49.1",
43
+ "@tinkoff/dippy": "0.12.3",
44
+ "@tramvai/core": "6.59.0",
44
45
  "tslib": "^2.4.0"
45
46
  }
46
47
  }