@tramvai/module-opentelemetry 7.28.1 → 7.29.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.d.ts CHANGED
@@ -1,4 +1,6 @@
1
1
  export * from './tokens';
2
+ export { generateTraceId, generateSpanId } from './generateIds';
3
+ export { BrowserTracer } from './tracer/tracer.browser';
2
4
  export declare const extractTraceparentHeader: () => string | undefined;
3
5
  export declare class OpenTelemetryModule {
4
6
  }
package/lib/browser.js CHANGED
@@ -1,8 +1,13 @@
1
1
  import { __decorate } from 'tslib';
2
- import { Module } from '@tramvai/core';
2
+ import { Module, provide } from '@tramvai/core';
3
3
  import once from '@tinkoff/utils/function/once';
4
4
  import { providers } from './instrumentation/logs.browser.browser.js';
5
+ import { providers as providers$1 } from './instrumentation/httpClient.browser.browser.js';
6
+ import { BrowserTracer } from './tracer/tracer.browser.browser.js';
7
+ export { BrowserTracer } from './tracer/tracer.browser.browser.js';
8
+ import { OPENTELEMETRY_TRACER_TOKEN } from './tokens.browser.js';
5
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.browser.js';
10
+ export { generateSpanId, generateTraceId } from './generateIds.browser.js';
6
11
 
7
12
  const extractTraceparentHeader = once(() => {
8
13
  if (typeof window !== 'undefined') {
@@ -19,7 +24,14 @@ let OpenTelemetryModule = class OpenTelemetryModule {
19
24
  OpenTelemetryModule = __decorate([
20
25
  Module({
21
26
  imports: [],
22
- providers: [...providers],
27
+ providers: [
28
+ ...providers,
29
+ ...providers$1,
30
+ provide({
31
+ provide: OPENTELEMETRY_TRACER_TOKEN,
32
+ useFactory: () => new BrowserTracer(),
33
+ }),
34
+ ],
23
35
  })
24
36
  ], OpenTelemetryModule);
25
37
  // todo declareModule!
@@ -0,0 +1,11 @@
1
+ function randomHex(length) {
2
+ return Array.from(crypto.getRandomValues(new Uint8Array(length)), (b) => b.toString(16).padStart(2, '0')).join('');
3
+ }
4
+ function generateTraceId() {
5
+ return randomHex(16);
6
+ }
7
+ function generateSpanId() {
8
+ return randomHex(8);
9
+ }
10
+
11
+ export { generateSpanId, generateTraceId };
@@ -0,0 +1,3 @@
1
+ export declare function generateTraceId(): string;
2
+ export declare function generateSpanId(): string;
3
+ //# sourceMappingURL=generateIds.d.ts.map
@@ -0,0 +1,41 @@
1
+ import { provide } from '@tramvai/core';
2
+ import { DEFAULT_HTTP_CLIENT_INTERCEPTORS } from '@tramvai/tokens-http-client';
3
+ import { getUrlFromRequest } from '@tramvai/module-http-client';
4
+ import { OPENTELEMETRY_TRACER_TOKEN, OPENTELEMETRY_HTTP_CLIENT_BROWSER_HEADERS_INCLUDE_TOKEN } from '../tokens.browser.js';
5
+
6
+ const providers = [
7
+ provide({
8
+ provide: DEFAULT_HTTP_CLIENT_INTERCEPTORS,
9
+ useFactory: ({ tracer, includeHeaders }) => {
10
+ return (request, next) => {
11
+ // avoid wrapping the request if the traceparent header has already been passed
12
+ if (request.headers?.traceparent) {
13
+ return next(request);
14
+ }
15
+ if (includeHeaders && !includeHeaders(getUrlFromRequest(request))) {
16
+ return next(request);
17
+ }
18
+ const method = request.method ?? 'GET';
19
+ const serviceName = request.baseUrlEnv ?? 'unknown';
20
+ return tracer.trace(`${method} ${serviceName}`, (span) => {
21
+ if (!request.headers) {
22
+ request.headers = {};
23
+ }
24
+ // TODO: Enrich the span with the same attributes as the server tracer once the client SDK is integrated
25
+ const { traceId, spanId } = span.spanContext();
26
+ request.headers.traceparent = `00-${traceId}-${spanId}-01`;
27
+ return next(request);
28
+ });
29
+ };
30
+ },
31
+ deps: {
32
+ tracer: OPENTELEMETRY_TRACER_TOKEN,
33
+ includeHeaders: {
34
+ token: OPENTELEMETRY_HTTP_CLIENT_BROWSER_HEADERS_INCLUDE_TOKEN,
35
+ optional: true,
36
+ },
37
+ },
38
+ }),
39
+ ];
40
+
41
+ export { providers };
@@ -0,0 +1,14 @@
1
+ export declare const providers: import("@tramvai/core").Provider<{
2
+ tracer: import("../tokens").TramvaiTracer & {
3
+ __type?: "base token" | undefined;
4
+ };
5
+ includeHeaders: {
6
+ token: ((url: string) => boolean) & {
7
+ __type?: "base token" | undefined;
8
+ };
9
+ optional: boolean;
10
+ };
11
+ }, import("@tramvai/module-http-client").HttpClientInterceptor & {
12
+ __type?: "multi token" | undefined;
13
+ }>[];
14
+ //# sourceMappingURL=httpClient.browser.d.ts.map
@@ -5,7 +5,7 @@ export declare const providers: import("@tramvai/core").Provider<{
5
5
  metricsServicesRegistry: import("@tramvai/tokens-metrics").MetricsServicesRegistryInterface & {
6
6
  __type?: "base token" | undefined;
7
7
  };
8
- }, import("@tramvai/http-client").HttpClientInterceptor & {
8
+ }, import("@tramvai/module-http-client").HttpClientInterceptor & {
9
9
  __type?: "multi token" | undefined;
10
10
  }>[];
11
11
  //# sourceMappingURL=httpClient.d.ts.map
@@ -3,6 +3,7 @@ import { DEFAULT_HTTP_CLIENT_INTERCEPTORS } from '@tramvai/tokens-http-client';
3
3
  import { METRICS_SERVICES_REGISTRY_TOKEN } from '@tramvai/tokens-metrics';
4
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
+ import { getUrlFromRequest } from '@tramvai/module-http-client';
6
7
  import { OPENTELEMETRY_TRACER_TOKEN } from '../tokens.es.js';
7
8
 
8
9
  const providers = [
@@ -10,9 +11,7 @@ const providers = [
10
11
  provide: DEFAULT_HTTP_CLIENT_INTERCEPTORS,
11
12
  useFactory: ({ tracer, metricsServicesRegistry }) => {
12
13
  return (request, next) => {
13
- const url = request.url ??
14
- // todo add leading slash before path if needed
15
- (request.baseUrl ? `${request.baseUrl}${request.path}` : (request.path ?? ''));
14
+ const url = getUrlFromRequest(request);
16
15
  const parsedUrl = new URL(request.query ? `${url}?${new URLSearchParams(request.query).toString()}` : url);
17
16
  const serviceName = metricsServicesRegistry.getServiceName(url, request) ?? 'unknown';
18
17
  const method = request.method ?? 'GET';
@@ -7,6 +7,7 @@ var tokensHttpClient = require('@tramvai/tokens-http-client');
7
7
  var tokensMetrics = require('@tramvai/tokens-metrics');
8
8
  var api = require('@opentelemetry/api');
9
9
  var semanticConventions = require('@opentelemetry/semantic-conventions');
10
+ var moduleHttpClient = require('@tramvai/module-http-client');
10
11
  var tokens = require('../tokens.js');
11
12
 
12
13
  const providers = [
@@ -14,9 +15,7 @@ const providers = [
14
15
  provide: tokensHttpClient.DEFAULT_HTTP_CLIENT_INTERCEPTORS,
15
16
  useFactory: ({ tracer, metricsServicesRegistry }) => {
16
17
  return (request, next) => {
17
- const url = request.url ??
18
- // todo add leading slash before path if needed
19
- (request.baseUrl ? `${request.baseUrl}${request.path}` : (request.path ?? ''));
18
+ const url = moduleHttpClient.getUrlFromRequest(request);
20
19
  const parsedUrl = new URL(request.query ? `${url}?${new URLSearchParams(request.query).toString()}` : url);
21
20
  const serviceName = metricsServicesRegistry.getServiceName(url, request) ?? 'unknown';
22
21
  const method = request.method ?? 'GET';
@@ -6,7 +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
- // TODO: not used for now, wait for TCORE-5381
10
9
  const OPENTELEMETRY_HTTP_CLIENT_BROWSER_HEADERS_INCLUDE_TOKEN = createToken('tramvai opentelemetry http client browser headers filter');
11
10
 
12
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.es.js CHANGED
@@ -6,7 +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
- // TODO: not used for now, wait for TCORE-5381
10
9
  const OPENTELEMETRY_HTTP_CLIENT_BROWSER_HEADERS_INCLUDE_TOKEN = createToken('tramvai opentelemetry http client browser headers filter');
11
10
 
12
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,6 @@ 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
- // TODO: not used for now, wait for TCORE-5381
14
13
  const OPENTELEMETRY_HTTP_CLIENT_BROWSER_HEADERS_INCLUDE_TOKEN = dippy.createToken('tramvai opentelemetry http client browser headers filter');
15
14
 
16
15
  exports.OPENTELEMETRY_HTTP_CLIENT_BROWSER_HEADERS_INCLUDE_TOKEN = OPENTELEMETRY_HTTP_CLIENT_BROWSER_HEADERS_INCLUDE_TOKEN;
@@ -0,0 +1,103 @@
1
+ import isPromise from '@tinkoff/utils/is/promise';
2
+ import { generateTraceId, generateSpanId } from '../generateIds.browser.js';
3
+
4
+ /* eslint-disable prefer-destructuring */
5
+ class BrowserSpan {
6
+ traceIdValue;
7
+ spanIdValue;
8
+ nameValue;
9
+ endedValue = false;
10
+ constructor(name) {
11
+ this.nameValue = name;
12
+ this.traceIdValue = generateTraceId();
13
+ this.spanIdValue = generateSpanId();
14
+ }
15
+ spanContext() {
16
+ return {
17
+ traceId: this.traceIdValue,
18
+ spanId: this.spanIdValue,
19
+ traceFlags: 1,
20
+ };
21
+ }
22
+ setAttribute(key, value) {
23
+ return this;
24
+ }
25
+ setAttributes(attributes) {
26
+ return this;
27
+ }
28
+ addEvent(name, attributesOrStartTime, startTime) {
29
+ return this;
30
+ }
31
+ addLink(link) {
32
+ return this;
33
+ }
34
+ addLinks(links) {
35
+ return this;
36
+ }
37
+ setStatus(status) {
38
+ return this;
39
+ }
40
+ updateName(name) {
41
+ this.nameValue = name;
42
+ return this;
43
+ }
44
+ end(endTime) {
45
+ this.endedValue = true;
46
+ }
47
+ isRecording() {
48
+ return !this.endedValue;
49
+ }
50
+ recordException(exception, time) { }
51
+ }
52
+ class BrowserTracer {
53
+ startSpan(name, options, context) {
54
+ return new BrowserSpan(name);
55
+ }
56
+ startActiveSpan(...args) {
57
+ const name = args[0];
58
+ const fn = args[args.length - 1];
59
+ const options = args.length > 2 ? args[1] : {};
60
+ const span = this.startSpan(name, options);
61
+ return fn(span);
62
+ }
63
+ getActiveSpan() {
64
+ return undefined;
65
+ }
66
+ trace(...args) {
67
+ const name = args[0];
68
+ let fn;
69
+ let options;
70
+ if (args.length === 2 || (args.length === 3 && typeof args[2] === 'object')) {
71
+ fn = args[1];
72
+ options = {};
73
+ }
74
+ else {
75
+ options = args[1] ?? {};
76
+ fn = args[2];
77
+ }
78
+ const span = this.startSpan(name, options);
79
+ try {
80
+ const result = fn(span);
81
+ if (isPromise(result)) {
82
+ return result.then((res) => {
83
+ span.end();
84
+ return res;
85
+ }, (error) => {
86
+ span.end();
87
+ throw error;
88
+ });
89
+ }
90
+ span.end();
91
+ return result;
92
+ }
93
+ catch (error) {
94
+ span.end();
95
+ throw error;
96
+ }
97
+ }
98
+ propagateContext(carrier) {
99
+ return carrier ?? {};
100
+ }
101
+ }
102
+
103
+ export { BrowserTracer };
@@ -0,0 +1,15 @@
1
+ import type { Context, Span, SpanOptions } from '@opentelemetry/api';
2
+ import type { PropagationCarrier, TraceParams, TramvaiTracer } from '../tokens';
3
+ export declare class BrowserTracer implements TramvaiTracer {
4
+ startSpan(name: string, options?: SpanOptions, context?: Context): Span;
5
+ startActiveSpan<F extends (span: Span) => unknown>(name: string, fn: F): ReturnType<F>;
6
+ startActiveSpan<F extends (span: Span) => unknown>(name: string, options: SpanOptions, fn: F): ReturnType<F>;
7
+ startActiveSpan<F extends (span: Span) => unknown>(name: string, options: SpanOptions, context: Context, fn: F): ReturnType<F>;
8
+ getActiveSpan(): Span | undefined;
9
+ trace<T>(name: string, fn: (span: Span) => Promise<T>, params?: TraceParams): Promise<T>;
10
+ trace<T>(name: string, fn: (span: Span) => T, params?: TraceParams): T;
11
+ trace<T>(name: string, options: SpanOptions, fn: (span: Span) => Promise<T>, params?: TraceParams): Promise<T>;
12
+ trace<T>(name: string, options: SpanOptions, fn: (span: Span) => T, params?: TraceParams): T;
13
+ propagateContext(carrier?: PropagationCarrier): PropagationCarrier;
14
+ }
15
+ //# sourceMappingURL=tracer.browser.d.ts.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tramvai/module-opentelemetry",
3
- "version": "7.28.1",
3
+ "version": "7.29.0",
4
4
  "description": "Интеграция OpenTelemetry",
5
5
  "browser": "lib/browser.js",
6
6
  "main": "lib/server.js",
@@ -29,19 +29,20 @@
29
29
  "@opentelemetry/semantic-conventions": "^1.28.0",
30
30
  "@tinkoff/errors": "0.8.1",
31
31
  "@tinkoff/utils": "^2.1.2",
32
- "@tramvai/tokens-child-app": "7.28.1",
33
- "@tramvai/tokens-common": "7.28.1",
34
- "@tramvai/tokens-http-client": "7.28.1",
35
- "@tramvai/tokens-metrics": "7.28.1",
36
- "@tramvai/tokens-render": "7.28.1",
37
- "@tramvai/tokens-router": "7.28.1",
38
- "@tramvai/tokens-server": "7.28.1",
39
- "@tramvai/tokens-server-private": "7.28.1",
32
+ "@tramvai/module-http-client": "7.29.0",
33
+ "@tramvai/tokens-child-app": "7.29.0",
34
+ "@tramvai/tokens-common": "7.29.0",
35
+ "@tramvai/tokens-http-client": "7.29.0",
36
+ "@tramvai/tokens-metrics": "7.29.0",
37
+ "@tramvai/tokens-render": "7.29.0",
38
+ "@tramvai/tokens-router": "7.29.0",
39
+ "@tramvai/tokens-server": "7.29.0",
40
+ "@tramvai/tokens-server-private": "7.29.0",
40
41
  "path-to-regexp": "^0.1.12"
41
42
  },
42
43
  "peerDependencies": {
43
44
  "@tinkoff/dippy": "^1.0.0",
44
- "@tramvai/core": "7.28.1",
45
+ "@tramvai/core": "7.29.0",
45
46
  "tslib": "^2.4.0"
46
47
  }
47
48
  }