@rsdk/core 5.0.0-next.2 → 5.0.0-next.4

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.
Files changed (134) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/config/metadata/decorators/inject-property.decorator.d.ts +1 -1
  3. package/dist/config/metadata/decorators/property.decorator.d.ts +1 -1
  4. package/dist/config/parsers/url/exception.d.ts +0 -1
  5. package/dist/config/parsers/url/url.parser.d.ts +0 -1
  6. package/dist/config/reload/config-reload.events.d.ts +0 -1
  7. package/dist/exceptions.handling/global-exceptions.filter.d.ts +1 -1
  8. package/dist/exceptions.handling/global-exceptions.filter.js +2 -5
  9. package/dist/exceptions.handling/global-exceptions.filter.js.map +1 -1
  10. package/dist/health/indicators.abstract/ping.indicator.d.ts +0 -1
  11. package/dist/index.d.ts +2 -3
  12. package/dist/index.js +4 -7
  13. package/dist/index.js.map +1 -1
  14. package/dist/logging/logger-initializing.module.d.ts +1 -1
  15. package/dist/logging/logger-initializing.module.js +1 -1
  16. package/dist/logging/logger-initializing.module.js.map +1 -1
  17. package/dist/metrics/metadata/decorators/metric.decorator.js +1 -2
  18. package/dist/metrics/metadata/decorators/metric.decorator.js.map +1 -1
  19. package/dist/metrics/metric-initializing.module.d.ts +1 -1
  20. package/dist/metrics/metric-initializing.module.js +1 -1
  21. package/dist/metrics/metric-initializing.module.js.map +1 -1
  22. package/dist/platform.context.d.ts +5 -5
  23. package/dist/platform.context.js +28 -24
  24. package/dist/platform.context.js.map +1 -1
  25. package/dist/platform.module.d.ts +1 -1
  26. package/dist/platform.module.js +10 -9
  27. package/dist/platform.module.js.map +1 -1
  28. package/dist/tracing/constants.d.ts +12 -9
  29. package/dist/tracing/constants.js +13 -11
  30. package/dist/tracing/constants.js.map +1 -1
  31. package/dist/tracing/index.d.ts +3 -3
  32. package/dist/tracing/index.js +3 -3
  33. package/dist/tracing/index.js.map +1 -1
  34. package/dist/tracing/opentelemetry/decorators/index.js.map +1 -0
  35. package/dist/tracing/{decorators → opentelemetry/decorators}/no-span.decorator.d.ts +1 -1
  36. package/dist/tracing/{decorators → opentelemetry/decorators}/no-span.decorator.js +3 -3
  37. package/dist/tracing/opentelemetry/decorators/no-span.decorator.js.map +1 -0
  38. package/dist/tracing/{decorators → opentelemetry/decorators}/span.decorator.js +5 -4
  39. package/dist/tracing/opentelemetry/decorators/span.decorator.js.map +1 -0
  40. package/dist/tracing/opentelemetry/index.d.ts +1 -0
  41. package/dist/tracing/{services → opentelemetry}/index.js +1 -1
  42. package/dist/tracing/opentelemetry/index.js.map +1 -0
  43. package/dist/tracing/opentelemetry/opentelemetry.helpers.d.ts +28 -0
  44. package/dist/tracing/opentelemetry/opentelemetry.helpers.js +77 -0
  45. package/dist/tracing/opentelemetry/opentelemetry.helpers.js.map +1 -0
  46. package/dist/tracing/opentelemetry/opentelemetry.metadata.d.ts +7 -0
  47. package/dist/tracing/opentelemetry/opentelemetry.metadata.js +27 -0
  48. package/dist/tracing/opentelemetry/opentelemetry.metadata.js.map +1 -0
  49. package/dist/tracing/opentelemetry/opentelemetry.wrapper.d.ts +6 -0
  50. package/dist/tracing/opentelemetry/opentelemetry.wrapper.js +71 -0
  51. package/dist/tracing/opentelemetry/opentelemetry.wrapper.js.map +1 -0
  52. package/dist/tracing/tracing.actx.d.ts +1 -0
  53. package/dist/tracing/tracing.actx.js +9 -0
  54. package/dist/tracing/tracing.actx.js.map +1 -0
  55. package/dist/tracing/tracing.interceptor.d.ts +20 -4
  56. package/dist/tracing/tracing.interceptor.js +59 -9
  57. package/dist/tracing/tracing.interceptor.js.map +1 -1
  58. package/dist/tracing/tracing.module.d.ts +10 -4
  59. package/dist/tracing/tracing.module.js +63 -21
  60. package/dist/tracing/tracing.module.js.map +1 -1
  61. package/dist/tracing/types.d.ts +9 -11
  62. package/dist/tracing/types.js +0 -20
  63. package/dist/tracing/types.js.map +1 -1
  64. package/dist/transport/protocol.detector.d.ts +13 -1
  65. package/dist/transport/protocol.detector.js +17 -24
  66. package/dist/transport/protocol.detector.js.map +1 -1
  67. package/dist/types/index.d.ts +0 -1
  68. package/dist/types/index.js +1 -4
  69. package/dist/types/index.js.map +1 -1
  70. package/dist/types/options.d.ts +2 -0
  71. package/dist/types/plugins.d.ts +8 -3
  72. package/dist/types/plugins.js.map +1 -1
  73. package/dist/types/transports.d.ts +19 -9
  74. package/dist/types/transports.js +3 -1
  75. package/dist/types/transports.js.map +1 -1
  76. package/package.json +9 -4
  77. package/src/exceptions.handling/global-exceptions.filter.ts +5 -6
  78. package/src/index.ts +3 -3
  79. package/src/logging/logger-initializing.module.ts +2 -2
  80. package/src/metrics/metric-initializing.module.ts +2 -2
  81. package/src/platform.context.ts +41 -32
  82. package/src/platform.module.ts +9 -8
  83. package/src/tracing/constants.ts +15 -9
  84. package/src/tracing/index.ts +3 -3
  85. package/src/tracing/opentelemetry/decorators/no-span.decorator.ts +10 -0
  86. package/src/tracing/{decorators → opentelemetry/decorators}/span.decorator.ts +8 -4
  87. package/src/tracing/opentelemetry/index.ts +1 -0
  88. package/src/tracing/opentelemetry/opentelemetry.helpers.ts +89 -0
  89. package/src/tracing/opentelemetry/opentelemetry.metadata.ts +24 -0
  90. package/src/tracing/opentelemetry/opentelemetry.wrapper.ts +90 -0
  91. package/src/tracing/tracing.actx.ts +8 -0
  92. package/src/tracing/tracing.interceptor.ts +65 -8
  93. package/src/tracing/tracing.module.ts +64 -23
  94. package/src/tracing/types.ts +9 -28
  95. package/src/transport/protocol.detector.ts +19 -25
  96. package/src/types/index.ts +0 -2
  97. package/src/types/options.ts +3 -0
  98. package/src/types/plugins.ts +9 -2
  99. package/src/types/transports.ts +27 -11
  100. package/dist/tracing/decorators/index.js.map +0 -1
  101. package/dist/tracing/decorators/no-span.decorator.js.map +0 -1
  102. package/dist/tracing/decorators/span.decorator.js.map +0 -1
  103. package/dist/tracing/request-metadata.module.d.ts +0 -5
  104. package/dist/tracing/request-metadata.module.js +0 -21
  105. package/dist/tracing/request-metadata.module.js.map +0 -1
  106. package/dist/tracing/services/index.d.ts +0 -1
  107. package/dist/tracing/services/index.js.map +0 -1
  108. package/dist/tracing/services/trace.injector.d.ts +0 -12
  109. package/dist/tracing/services/trace.injector.js +0 -154
  110. package/dist/tracing/services/trace.injector.js.map +0 -1
  111. package/dist/tracing/tracing.config.d.ts +0 -6
  112. package/dist/tracing/tracing.config.js +0 -39
  113. package/dist/tracing/tracing.config.js.map +0 -1
  114. package/dist/tracing/utils/create-span.d.ts +0 -10
  115. package/dist/tracing/utils/create-span.js +0 -20
  116. package/dist/tracing/utils/create-span.js.map +0 -1
  117. package/dist/transport/get-transport-id.d.ts +0 -5
  118. package/dist/transport/get-transport-id.js +0 -14
  119. package/dist/transport/get-transport-id.js.map +0 -1
  120. package/dist/types/tracing.headers-extractor.d.ts +0 -15
  121. package/dist/types/tracing.headers-extractor.js +0 -67
  122. package/dist/types/tracing.headers-extractor.js.map +0 -1
  123. package/src/tracing/decorators/no-span.decorator.ts +0 -10
  124. package/src/tracing/request-metadata.module.ts +0 -8
  125. package/src/tracing/services/index.ts +0 -1
  126. package/src/tracing/services/trace.injector.ts +0 -190
  127. package/src/tracing/tracing.config.ts +0 -25
  128. package/src/tracing/utils/create-span.ts +0 -20
  129. package/src/transport/get-transport-id.ts +0 -20
  130. package/src/types/tracing.headers-extractor.ts +0 -51
  131. /package/dist/tracing/{decorators → opentelemetry/decorators}/index.d.ts +0 -0
  132. /package/dist/tracing/{decorators → opentelemetry/decorators}/index.js +0 -0
  133. /package/dist/tracing/{decorators → opentelemetry/decorators}/span.decorator.d.ts +0 -0
  134. /package/src/tracing/{decorators → opentelemetry/decorators}/index.ts +0 -0
@@ -1,21 +0,0 @@
1
- "use strict";
2
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
- return c > 3 && r && Object.defineProperty(target, key, r), r;
7
- };
8
- Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.RequestMetadataModule = void 0;
10
- const common_1 = require("@nestjs/common");
11
- /**
12
- * Модуль для хранения и получения данных из аскин локал стораджа
13
- */
14
- let RequestMetadataModule = class RequestMetadataModule {
15
- };
16
- exports.RequestMetadataModule = RequestMetadataModule;
17
- exports.RequestMetadataModule = RequestMetadataModule = __decorate([
18
- (0, common_1.Global)(),
19
- (0, common_1.Module)({})
20
- ], RequestMetadataModule);
21
- //# sourceMappingURL=request-metadata.module.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"request-metadata.module.js","sourceRoot":"","sources":["../../src/tracing/request-metadata.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAgD;AAEhD;;GAEG;AAGI,IAAM,qBAAqB,GAA3B,MAAM,qBAAqB;CAAG,CAAA;AAAxB,sDAAqB;gCAArB,qBAAqB;IAFjC,IAAA,eAAM,GAAE;IACR,IAAA,eAAM,EAAC,EAAE,CAAC;GACE,qBAAqB,CAAG"}
@@ -1 +0,0 @@
1
- export * from './trace.injector';
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tracing/services/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,mDAAiC"}
@@ -1,12 +0,0 @@
1
- import type { AttributeValue, Span } from '@opentelemetry/api';
2
- export declare class TraceInjector {
3
- static wrap(cls: any, original: Function, descriptor?: TypedPropertyDescriptor<any>): void;
4
- static toAttribute(data: unknown): AttributeValue;
5
- static enrich(span: Span, data: unknown): unknown;
6
- static createSpanName(className: string, methodName: string): string;
7
- static recordAndRethrow(error: unknown, span: Span): void;
8
- private static isWrapped;
9
- private static nowSpan;
10
- private static setWrapped;
11
- private static createWrapper;
12
- }
@@ -1,154 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.TraceInjector = void 0;
7
- const api_1 = require("@opentelemetry/api");
8
- const common_1 = require("@rsdk/common");
9
- const decorators_1 = require("@rsdk/decorators");
10
- const logging_1 = require("@rsdk/logging");
11
- const node_assert_1 = __importDefault(require("node:assert"));
12
- const rxjs_1 = require("rxjs");
13
- const constants_1 = require("../constants");
14
- const logger = logging_1.LoggerFactory.create('TraceInjector');
15
- class TraceInjector {
16
- // eslint-disable-next-line @typescript-eslint/ban-types
17
- static wrap(cls,
18
- // eslint-disable-next-line @typescript-eslint/ban-types
19
- original, descriptor) {
20
- /**
21
- * Означает, что данный метод уже обёрнут
22
- */
23
- if (TraceInjector.isWrapped(original) || TraceInjector.nowSpan(original)) {
24
- return;
25
- }
26
- logger.trace(`Wrapping method: ${cls.constructor.name}.${original.name}()`);
27
- const spanName = TraceInjector.createSpanName(cls.constructor.name, original.name);
28
- const wrapped = TraceInjector.createWrapper(original, spanName);
29
- (0, decorators_1.redecorate)(original, wrapped);
30
- if (descriptor) {
31
- descriptor.value = wrapped;
32
- }
33
- else {
34
- cls[original.name] = wrapped;
35
- }
36
- /**
37
- * Отмечает метод, как обёрнутый (чтобы избежать повторного оборачивания)
38
- */
39
- TraceInjector.setWrapped(wrapped);
40
- }
41
- // TODO: Maybe move to standalone function, because it's
42
- // the only public function except for the main one
43
- static toAttribute(data) {
44
- if ((0, common_1.isPrimitive)(data)) {
45
- return data;
46
- }
47
- if ((0, common_1.isRecord)(data) || Array.isArray(data)) {
48
- const serialized = JSON.stringify((0, common_1.normalizer)()(data));
49
- return serialized.length <= constants_1.MAX_BYTES.bytes()
50
- ? serialized
51
- : `data exceeds limit of ${constants_1.MAX_BYTES.bytes()} bytes`;
52
- }
53
- return 'data is undefined';
54
- }
55
- static enrich(span, data) {
56
- span.setAttribute('result', TraceInjector.toAttribute(data));
57
- span.setStatus({ code: api_1.SpanStatusCode.OK });
58
- return data;
59
- }
60
- static createSpanName(className, methodName) {
61
- /**
62
- * Всего лишь правила формирования имени спана (не более того), для новой логики нужен был именно такой код
63
- */
64
- return `${className} -> ${methodName}`;
65
- }
66
- static recordAndRethrow(error, span) {
67
- span.recordException(error);
68
- span.setStatus({
69
- code: api_1.SpanStatusCode.ERROR,
70
- message: error.message,
71
- });
72
- throw error;
73
- }
74
- static isWrapped(prototype) {
75
- node_assert_1.default.ok(prototype);
76
- return Reflect.hasMetadata(constants_1.Constants.TRACE_METADATA_ACTIVE, prototype);
77
- }
78
- static nowSpan(prototype) {
79
- node_assert_1.default.ok(prototype);
80
- return Reflect.hasMetadata(constants_1.Constants.NO_SPAN_METADATA, prototype);
81
- }
82
- static setWrapped(prototype) {
83
- node_assert_1.default.ok(prototype);
84
- // Value doesn't matter
85
- const NOOP = 1;
86
- Reflect.defineMetadata(constants_1.Constants.TRACE_METADATA_ACTIVE, NOOP, prototype);
87
- }
88
- static createWrapper(original, spanName) {
89
- return {
90
- [original.name](...args) {
91
- const tracer = api_1.trace.getTracer('@rsdk/open-telemetry', '1.0.0');
92
- return tracer.startActiveSpan(spanName, (span) => {
93
- try {
94
- /**
95
- * При запуске функции обернутой в опентелеметрию мы выводим и трейсИд и спанИд
96
- * чтобы в ручную по логам отсмотреть порядок запусков, в случаи если нет доступа до борды графаны и на руках есть только файл с логами
97
- */
98
- logger.trace(`Wrapped function invoked: ${original.name}, traceId: ${span.spanContext().traceId}, spanId: ${span.spanContext().spanId}`);
99
- span.setAttribute('args', TraceInjector.toAttribute(args));
100
- const result = original.apply(this, args);
101
- /**
102
- * Если метод асинхронный - обрабтываем его и фиксируем успешное или не успешное завершение метода и зарываем спан,
103
- * чтобы зафиксировать время запроса и видеть его в графане
104
- */
105
- if (result instanceof Promise) {
106
- return result
107
- .then(async (result) => {
108
- TraceInjector.enrich(span, result);
109
- span.end();
110
- return result;
111
- })
112
- .catch(async (error) => {
113
- TraceInjector.recordAndRethrow(error, span);
114
- span.end();
115
- throw error;
116
- });
117
- }
118
- /**
119
- * Если метод обзервабл - обрабтываем его и фиксируем успешное или не успешное завершение метода и зарываем спан,
120
- * чтобы зафиксировать время запроса и видеть его в графане
121
- */
122
- if (result instanceof rxjs_1.Observable) {
123
- return result.pipe((0, rxjs_1.mergeMap)((result) => {
124
- TraceInjector.enrich(span, result);
125
- span.end();
126
- return (0, rxjs_1.of)(result);
127
- }), (0, rxjs_1.catchError)((error) => {
128
- TraceInjector.recordAndRethrow(error, span);
129
- span.end();
130
- return (0, rxjs_1.throwError)(() => error);
131
- }));
132
- }
133
- /**
134
- * Если метод вернул статичное значение - фиксируем успешное или не успешное завершение метода и зарываем спан,
135
- * чтобы зафиксировать время запроса и видеть его в графане
136
- */
137
- TraceInjector.enrich(span, result);
138
- span.end();
139
- return result;
140
- }
141
- catch (error) {
142
- /**
143
- * Обрабатываем ошибку и закрываем спан при попытке получения статичного результата или любую иную ошибку
144
- */
145
- TraceInjector.recordAndRethrow(error, span);
146
- span.end();
147
- }
148
- });
149
- },
150
- }[original.name];
151
- }
152
- }
153
- exports.TraceInjector = TraceInjector;
154
- //# sourceMappingURL=trace.injector.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"trace.injector.js","sourceRoot":"","sources":["../../../src/tracing/services/trace.injector.ts"],"names":[],"mappings":"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"}
@@ -1,6 +0,0 @@
1
- /// <reference types="node" />
2
- import { Config } from '../config';
3
- export declare class TracingModuleConfig extends Config {
4
- enabled: boolean;
5
- collectorUrl: URL;
6
- }
@@ -1,39 +0,0 @@
1
- "use strict";
2
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
- return c > 3 && r && Object.defineProperty(target, key, r), r;
7
- };
8
- var __metadata = (this && this.__metadata) || function (k, v) {
9
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
- };
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.TracingModuleConfig = void 0;
13
- const config_1 = require("../config");
14
- const config_const_1 = require("../config/config.const");
15
- let TracingModuleConfig = class TracingModuleConfig extends config_1.Config {
16
- enabled;
17
- collectorUrl;
18
- };
19
- exports.TracingModuleConfig = TracingModuleConfig;
20
- __decorate([
21
- (0, config_1.Property)('TRACING_ENABLED', new config_1.BoolParser(), {
22
- defaultValue: false,
23
- description: 'Enable application tracing',
24
- }),
25
- __metadata("design:type", Boolean)
26
- ], TracingModuleConfig.prototype, "enabled", void 0);
27
- __decorate([
28
- (0, config_1.Property)('TRACING_COLLECTOR_URL', new config_1.UrlParser(), {
29
- defaultValue: new URL('http://localhost:4318/v1/traces'),
30
- description: 'Url to jaeger/zipkin/otlp collector etc.',
31
- }),
32
- __metadata("design:type", URL)
33
- ], TracingModuleConfig.prototype, "collectorUrl", void 0);
34
- exports.TracingModuleConfig = TracingModuleConfig = __decorate([
35
- (0, config_1.ConfigSection)({
36
- tags: [config_const_1.ConfigTag.infrastructure, config_const_1.ConfigTag.tracing],
37
- })
38
- ], TracingModuleConfig);
39
- //# sourceMappingURL=tracing.config.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tracing.config.js","sourceRoot":"","sources":["../../src/tracing/tracing.config.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,sCAMmB;AACnB,yDAAmD;AAK5C,IAAM,mBAAmB,GAAzB,MAAM,mBAAoB,SAAQ,eAAM;IAK7C,OAAO,CAAW;IAMlB,YAAY,CAAO;CACpB,CAAA;AAZY,kDAAmB;AAK9B;IAJC,IAAA,iBAAQ,EAAC,iBAAiB,EAAE,IAAI,mBAAU,EAAE,EAAE;QAC7C,YAAY,EAAE,KAAK;QACnB,WAAW,EAAE,4BAA4B;KAC1C,CAAC;;oDACgB;AAMlB;IAJC,IAAA,iBAAQ,EAAC,uBAAuB,EAAE,IAAI,kBAAS,EAAE,EAAE;QAClD,YAAY,EAAE,IAAI,GAAG,CAAC,iCAAiC,CAAC;QACxD,WAAW,EAAE,0CAA0C;KACxD,CAAC;8BACa,GAAG;yDAAC;8BAXR,mBAAmB;IAH/B,IAAA,sBAAa,EAAC;QACb,IAAI,EAAE,CAAC,wBAAS,CAAC,cAAc,EAAE,wBAAS,CAAC,OAAO,CAAC;KACpD,CAAC;GACW,mBAAmB,CAY/B"}
@@ -1,10 +0,0 @@
1
- /**
2
- * Функция для генерации корректного рандомного traceId и spanId
3
- * алгоритм взят из: https://github.com/openzipkin/zipkin-js/blob/ec89188cf6a07e184ab886c1dfb6c9dc276ddfa4/packages/zipkin/src/tracer/randomTraceId.js
4
- * спецификация по traceId: https://www.w3.org/TR/trace-context/#considerations-for-trace-id-field-generation
5
- * @returns {traceId, spanId}
6
- */
7
- export declare function createSpan(): {
8
- traceId: string;
9
- spanId: string;
10
- };
@@ -1,20 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createSpan = void 0;
4
- const common_1 = require("@rsdk/common");
5
- /**
6
- * Функция для генерации корректного рандомного traceId и spanId
7
- * алгоритм взят из: https://github.com/openzipkin/zipkin-js/blob/ec89188cf6a07e184ab886c1dfb6c9dc276ddfa4/packages/zipkin/src/tracer/randomTraceId.js
8
- * спецификация по traceId: https://www.w3.org/TR/trace-context/#considerations-for-trace-id-field-generation
9
- * @returns {traceId, spanId}
10
- */
11
- function createSpan() {
12
- const rootSpanId = (0, common_1.getRandomBytes)(16);
13
- const traceId = (0, common_1.getRandomBytes)(16) + rootSpanId;
14
- return {
15
- traceId,
16
- spanId: rootSpanId,
17
- };
18
- }
19
- exports.createSpan = createSpan;
20
- //# sourceMappingURL=create-span.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"create-span.js","sourceRoot":"","sources":["../../../src/tracing/utils/create-span.ts"],"names":[],"mappings":";;;AAAA,yCAA8C;AAE9C;;;;;GAKG;AACH,SAAgB,UAAU;IAIxB,MAAM,UAAU,GAAG,IAAA,uBAAc,EAAC,EAAE,CAAC,CAAC;IACtC,MAAM,OAAO,GAAG,IAAA,uBAAc,EAAC,EAAE,CAAC,GAAG,UAAU,CAAC;IAEhD,OAAO;QACL,OAAO;QACP,MAAM,EAAE,UAAU;KACnB,CAAC;AACJ,CAAC;AAXD,gCAWC"}
@@ -1,5 +0,0 @@
1
- import type { ExecutionContext } from '@nestjs/common';
2
- import type { ExecutionContextHost } from '@nestjs/core/helpers/execution-context-host';
3
- import type { Transport } from '@nestjs/microservices';
4
- export declare const TransportId: (...dataOrPipes: unknown[]) => ParameterDecorator;
5
- export declare function getTransportId(context: ExecutionContext | ExecutionContextHost): Transport;
@@ -1,14 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getTransportId = exports.TransportId = void 0;
4
- const common_1 = require("@nestjs/common");
5
- const constants_1 = require("@nestjs/microservices/constants");
6
- exports.TransportId = (0, common_1.createParamDecorator)((_data, ctx) => {
7
- return getTransportId(ctx);
8
- });
9
- function getTransportId(context) {
10
- return (Reflect.getMetadata(constants_1.TRANSPORT_METADATA, context.getHandler()) ??
11
- Reflect.getMetadata(constants_1.TRANSPORT_METADATA, context.getClass()));
12
- }
13
- exports.getTransportId = getTransportId;
14
- //# sourceMappingURL=get-transport-id.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"get-transport-id.js","sourceRoot":"","sources":["../../src/transport/get-transport-id.ts"],"names":[],"mappings":";;;AACA,2CAAsD;AAGtD,+DAAqE;AAExD,QAAA,WAAW,GAAG,IAAA,6BAAoB,EAC7C,CAAC,KAAc,EAAE,GAA4C,EAAE,EAAE;IAC/D,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC;AAC7B,CAAC,CACF,CAAC;AAEF,SAAgB,cAAc,CAC5B,OAAgD;IAEhD,OAAO,CACL,OAAO,CAAC,WAAW,CAAC,8BAAkB,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC;QAC7D,OAAO,CAAC,WAAW,CAAC,8BAAkB,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAC5D,CAAC;AACJ,CAAC;AAPD,wCAOC"}
@@ -1,15 +0,0 @@
1
- import { type ExecutionContext } from '@nestjs/common';
2
- import { ILogger } from '@rsdk/logging';
3
- import { TracingHeaders } from '../tracing/types';
4
- import { ProtocolDetector } from '../transport/protocol.detector';
5
- import type { PlatformAppPlugin } from './plugins';
6
- import type { ITransport } from './transports';
7
- export declare class TracingHeadersExtractor {
8
- private plugins;
9
- private transports;
10
- private protocolDetector;
11
- private logger;
12
- constructor(plugins: Set<PlatformAppPlugin>, transports: Set<ITransport>, protocolDetector: ProtocolDetector, logger: ILogger);
13
- extract(ctx: ExecutionContext): TracingHeaders;
14
- private extractors;
15
- }
@@ -1,67 +0,0 @@
1
- "use strict";
2
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
- return c > 3 && r && Object.defineProperty(target, key, r), r;
7
- };
8
- var __metadata = (this && this.__metadata) || function (k, v) {
9
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
- };
11
- var __param = (this && this.__param) || function (paramIndex, decorator) {
12
- return function (target, key) { decorator(target, key, paramIndex); }
13
- };
14
- Object.defineProperty(exports, "__esModule", { value: true });
15
- exports.TracingHeadersExtractor = void 0;
16
- const common_1 = require("@nestjs/common");
17
- const logging_1 = require("../logging");
18
- const types_1 = require("../tracing/types");
19
- const protocol_detector_1 = require("../transport/protocol.detector");
20
- const constants_1 = require("./constants");
21
- let TracingHeadersExtractor = class TracingHeadersExtractor {
22
- plugins;
23
- transports;
24
- protocolDetector;
25
- logger;
26
- constructor(plugins, transports, protocolDetector, logger) {
27
- this.plugins = plugins;
28
- this.transports = transports;
29
- this.protocolDetector = protocolDetector;
30
- this.logger = logger;
31
- this.extractors = new Map();
32
- for (const transport of this.transports) {
33
- const e = transport.getHeaderExtractor();
34
- if (e) {
35
- this.extractors.set(transport.getProtocol(), e);
36
- }
37
- }
38
- for (const plugin of this.plugins) {
39
- for (const x of plugin.tracingHeadersExtractors?.() ?? []) {
40
- this.extractors.set(x.protocol, x.extractor);
41
- }
42
- }
43
- }
44
- extract(ctx) {
45
- const protocol = this.protocolDetector.getProtocol(ctx) ?? ctx.getType();
46
- const extracted = this.extractors.get(protocol)?.extract(ctx);
47
- if (extracted) {
48
- this.logger.trace('Extracted TraceHeaders', extracted.getHeaders());
49
- }
50
- else {
51
- this.logger.warn('Unable to extract Tracing headers, return empty');
52
- }
53
- return extracted ?? new types_1.TracingHeaders({});
54
- }
55
- extractors;
56
- };
57
- exports.TracingHeadersExtractor = TracingHeadersExtractor;
58
- exports.TracingHeadersExtractor = TracingHeadersExtractor = __decorate([
59
- (0, common_1.Injectable)(),
60
- __param(0, (0, common_1.Inject)(constants_1.APP_PLUGINS)),
61
- __param(1, (0, common_1.Inject)(constants_1.APP_TRANSPORTS)),
62
- __param(3, (0, logging_1.InjectLogger)(TracingHeadersExtractor)),
63
- __metadata("design:paramtypes", [Set,
64
- Set,
65
- protocol_detector_1.ProtocolDetector, Object])
66
- ], TracingHeadersExtractor);
67
- //# sourceMappingURL=tracing.headers-extractor.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tracing.headers-extractor.js","sourceRoot":"","sources":["../../src/types/tracing.headers-extractor.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAA2E;AAG3E,wCAA0C;AAC1C,4CAAkD;AAClD,sEAAkE;AAElE,2CAA0D;AAKnD,IAAM,uBAAuB,GAA7B,MAAM,uBAAuB;IAGxB;IAEA;IACA;IACuC;IANjD,YAEU,OAA+B,EAE/B,UAA2B,EAC3B,gBAAkC,EACK,MAAe;QAJtD,YAAO,GAAP,OAAO,CAAwB;QAE/B,eAAU,GAAV,UAAU,CAAiB;QAC3B,qBAAgB,GAAhB,gBAAgB,CAAkB;QACK,WAAM,GAAN,MAAM,CAAS;QAE9D,IAAI,CAAC,UAAU,GAAG,IAAI,GAAG,EAA2C,CAAC;QACrE,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACxC,MAAM,CAAC,GAAG,SAAS,CAAC,kBAAkB,EAAE,CAAC;YACzC,IAAI,CAAC,EAAE,CAAC;gBACN,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC;YAClD,CAAC;QACH,CAAC;QACD,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAClC,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,wBAAwB,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC;gBAC1D,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAqB;QAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;QAEzE,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;QAE9D,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE,SAAS,CAAC,UAAU,EAAE,CAAC,CAAC;QACtE,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;QACtE,CAAC;QAED,OAAO,SAAS,IAAI,IAAI,sBAAc,CAAC,EAAE,CAAC,CAAC;IAC7C,CAAC;IAEO,UAAU,CAA+C;CAClE,CAAA;AAtCY,0DAAuB;kCAAvB,uBAAuB;IADnC,IAAA,mBAAU,GAAE;IAGR,WAAA,IAAA,eAAM,EAAC,uBAAW,CAAC,CAAA;IAEnB,WAAA,IAAA,eAAM,EAAC,0BAAc,CAAC,CAAA;IAGtB,WAAA,IAAA,sBAAY,EAAC,uBAAuB,CAAC,CAAA;qCAJrB,GAAG;QAEA,GAAG;QACG,oCAAgB;GANjC,uBAAuB,CAsCnC"}
@@ -1,10 +0,0 @@
1
- import { SetMetadata } from '@nestjs/common';
2
-
3
- import { Constants } from '../constants';
4
-
5
- /**
6
- * TraceInjector will ignore classes and methods annotated with
7
- * this decorator.
8
- */
9
- export const NoSpan = (): MethodDecorator =>
10
- SetMetadata(Constants.NO_SPAN_METADATA, true);
@@ -1,8 +0,0 @@
1
- import { Global, Module } from '@nestjs/common';
2
-
3
- /**
4
- * Модуль для хранения и получения данных из аскин локал стораджа
5
- */
6
- @Global()
7
- @Module({})
8
- export class RequestMetadataModule {}
@@ -1 +0,0 @@
1
- export * from './trace.injector';
@@ -1,190 +0,0 @@
1
- import type { AttributeValue, Span } from '@opentelemetry/api';
2
- import { SpanStatusCode, trace } from '@opentelemetry/api';
3
- import type { ErrorLike } from '@rsdk/common';
4
- import { isPrimitive, isRecord, normalizer } from '@rsdk/common';
5
- import { redecorate } from '@rsdk/decorators';
6
- import { LoggerFactory } from '@rsdk/logging';
7
- import assert from 'node:assert';
8
- import { catchError, mergeMap, Observable, of, throwError } from 'rxjs';
9
-
10
- import { Constants, MAX_BYTES } from '../constants';
11
-
12
- const logger = LoggerFactory.create('TraceInjector');
13
-
14
- export class TraceInjector {
15
- // eslint-disable-next-line @typescript-eslint/ban-types
16
- static wrap(
17
- cls: any,
18
- // eslint-disable-next-line @typescript-eslint/ban-types
19
- original: Function,
20
- descriptor?: TypedPropertyDescriptor<any>,
21
- ): void {
22
- /**
23
- * Означает, что данный метод уже обёрнут
24
- */
25
- if (TraceInjector.isWrapped(original) || TraceInjector.nowSpan(original)) {
26
- return;
27
- }
28
-
29
- logger.trace(`Wrapping method: ${cls.constructor.name}.${original.name}()`);
30
-
31
- const spanName = TraceInjector.createSpanName(
32
- cls.constructor.name,
33
- original.name,
34
- );
35
- const wrapped = TraceInjector.createWrapper(original, spanName);
36
-
37
- redecorate(original, wrapped);
38
-
39
- if (descriptor) {
40
- descriptor.value = wrapped;
41
- } else {
42
- cls[original.name] = wrapped;
43
- }
44
-
45
- /**
46
- * Отмечает метод, как обёрнутый (чтобы избежать повторного оборачивания)
47
- */
48
- TraceInjector.setWrapped(wrapped);
49
- }
50
-
51
- // TODO: Maybe move to standalone function, because it's
52
- // the only public function except for the main one
53
- static toAttribute(data: unknown): AttributeValue {
54
- if (isPrimitive(data)) {
55
- return data;
56
- }
57
-
58
- if (isRecord(data) || Array.isArray(data)) {
59
- const serialized = JSON.stringify(normalizer()(data));
60
-
61
- return serialized.length <= MAX_BYTES.bytes()
62
- ? serialized
63
- : `data exceeds limit of ${MAX_BYTES.bytes()} bytes`;
64
- }
65
-
66
- return 'data is undefined';
67
- }
68
-
69
- static enrich(span: Span, data: unknown): unknown {
70
- span.setAttribute('result', TraceInjector.toAttribute(data));
71
- span.setStatus({ code: SpanStatusCode.OK });
72
-
73
- return data;
74
- }
75
-
76
- static createSpanName(className: string, methodName: string): string {
77
- /**
78
- * Всего лишь правила формирования имени спана (не более того), для новой логики нужен был именно такой код
79
- */
80
- return `${className} -> ${methodName}`;
81
- }
82
-
83
- static recordAndRethrow(error: unknown, span: Span): void {
84
- span.recordException(error as ErrorLike);
85
- span.setStatus({
86
- code: SpanStatusCode.ERROR,
87
- message: (error as ErrorLike).message,
88
- });
89
-
90
- throw error;
91
- }
92
-
93
- private static isWrapped(prototype: object): boolean {
94
- assert.ok(prototype);
95
-
96
- return Reflect.hasMetadata(Constants.TRACE_METADATA_ACTIVE, prototype);
97
- }
98
-
99
- private static nowSpan(prototype: object): boolean {
100
- assert.ok(prototype);
101
-
102
- return Reflect.hasMetadata(Constants.NO_SPAN_METADATA, prototype);
103
- }
104
-
105
- private static setWrapped(prototype: object): void {
106
- assert.ok(prototype);
107
-
108
- // Value doesn't matter
109
- const NOOP = 1;
110
-
111
- Reflect.defineMetadata(Constants.TRACE_METADATA_ACTIVE, NOOP, prototype);
112
- }
113
-
114
- private static createWrapper(original: any, spanName: string): any {
115
- return {
116
- [original.name](...args: any[]): any {
117
- const tracer = trace.getTracer('@rsdk/open-telemetry', '1.0.0');
118
-
119
- return tracer.startActiveSpan(spanName, (span) => {
120
- try {
121
- /**
122
- * При запуске функции обернутой в опентелеметрию мы выводим и трейсИд и спанИд
123
- * чтобы в ручную по логам отсмотреть порядок запусков, в случаи если нет доступа до борды графаны и на руках есть только файл с логами
124
- */
125
- logger.trace(
126
- `Wrapped function invoked: ${original.name}, traceId: ${
127
- span.spanContext().traceId
128
- }, spanId: ${span.spanContext().spanId}`,
129
- );
130
-
131
- span.setAttribute('args', TraceInjector.toAttribute(args));
132
- const result = original.apply(this, args);
133
-
134
- /**
135
- * Если метод асинхронный - обрабтываем его и фиксируем успешное или не успешное завершение метода и зарываем спан,
136
- * чтобы зафиксировать время запроса и видеть его в графане
137
- */
138
- if (result instanceof Promise) {
139
- return result
140
- .then(async (result) => {
141
- TraceInjector.enrich(span, result);
142
- span.end();
143
- return result;
144
- })
145
- .catch(async (error) => {
146
- TraceInjector.recordAndRethrow(error, span);
147
- span.end();
148
- throw error;
149
- });
150
- }
151
-
152
- /**
153
- * Если метод обзервабл - обрабтываем его и фиксируем успешное или не успешное завершение метода и зарываем спан,
154
- * чтобы зафиксировать время запроса и видеть его в графане
155
- */
156
- if (result instanceof Observable) {
157
- return result.pipe(
158
- mergeMap((result) => {
159
- TraceInjector.enrich(span, result);
160
- span.end();
161
- return of(result);
162
- }),
163
- catchError((error) => {
164
- TraceInjector.recordAndRethrow(error, span);
165
- span.end();
166
- return throwError(() => error);
167
- }),
168
- );
169
- }
170
-
171
- /**
172
- * Если метод вернул статичное значение - фиксируем успешное или не успешное завершение метода и зарываем спан,
173
- * чтобы зафиксировать время запроса и видеть его в графане
174
- */
175
- TraceInjector.enrich(span, result);
176
- span.end();
177
-
178
- return result;
179
- } catch (error) {
180
- /**
181
- * Обрабатываем ошибку и закрываем спан при попытке получения статичного результата или любую иную ошибку
182
- */
183
- TraceInjector.recordAndRethrow(error, span);
184
- span.end();
185
- }
186
- });
187
- },
188
- }[original.name];
189
- }
190
- }