@rsdk/core 4.0.0-next.12 → 4.0.0-next.14

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 (70) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/index.d.ts +4 -1
  3. package/dist/index.js +16 -2
  4. package/dist/index.js.map +1 -1
  5. package/dist/tracing/active-span.module.d.ts +5 -0
  6. package/dist/tracing/active-span.module.js +25 -0
  7. package/dist/tracing/active-span.module.js.map +1 -0
  8. package/dist/tracing/constants.d.ts +7 -1
  9. package/dist/tracing/constants.js +8 -2
  10. package/dist/tracing/constants.js.map +1 -1
  11. package/dist/tracing/decorators/span.decorator.d.ts +1 -1
  12. package/dist/tracing/decorators/span.decorator.js +13 -1
  13. package/dist/tracing/decorators/span.decorator.js.map +1 -1
  14. package/dist/tracing/index.d.ts +7 -0
  15. package/dist/tracing/index.js +7 -0
  16. package/dist/tracing/index.js.map +1 -1
  17. package/dist/tracing/request-metadata.module.d.ts +5 -0
  18. package/dist/tracing/request-metadata.module.js +25 -0
  19. package/dist/tracing/request-metadata.module.js.map +1 -0
  20. package/dist/tracing/services/active-span.storage.d.ts +17 -0
  21. package/dist/tracing/services/active-span.storage.js +46 -0
  22. package/dist/tracing/services/active-span.storage.js.map +1 -0
  23. package/dist/tracing/services/index.d.ts +0 -1
  24. package/dist/tracing/services/index.js +0 -1
  25. package/dist/tracing/services/index.js.map +1 -1
  26. package/dist/tracing/services/instrumentation.service.d.ts +2 -8
  27. package/dist/tracing/services/instrumentation.service.js +9 -114
  28. package/dist/tracing/services/instrumentation.service.js.map +1 -1
  29. package/dist/tracing/services/request-metadata.injector.d.ts +6 -0
  30. package/dist/tracing/services/request-metadata.injector.js +122 -0
  31. package/dist/tracing/services/request-metadata.injector.js.map +1 -0
  32. package/dist/tracing/services/request-metadata.storage.d.ts +32 -0
  33. package/dist/tracing/services/request-metadata.storage.js +64 -0
  34. package/dist/tracing/services/request-metadata.storage.js.map +1 -0
  35. package/dist/tracing/services/trace.injector.d.ts +1 -1
  36. package/dist/tracing/services/trace.injector.js +213 -18
  37. package/dist/tracing/services/trace.injector.js.map +1 -1
  38. package/dist/tracing/tracing.interceptor.d.ts +9 -0
  39. package/dist/tracing/tracing.interceptor.js +24 -0
  40. package/dist/tracing/tracing.interceptor.js.map +1 -0
  41. package/dist/tracing/tracing.module.d.ts +1 -1
  42. package/dist/tracing/tracing.module.js +15 -16
  43. package/dist/tracing/tracing.module.js.map +1 -1
  44. package/dist/tracing/utils/create-span.d.ts +10 -0
  45. package/dist/tracing/utils/create-span.js +20 -0
  46. package/dist/tracing/utils/create-span.js.map +1 -0
  47. package/dist/tracing/utils/save-async-hooks-context.d.ts +19 -0
  48. package/dist/tracing/utils/save-async-hooks-context.js +59 -0
  49. package/dist/tracing/utils/save-async-hooks-context.js.map +1 -0
  50. package/package.json +10 -10
  51. package/src/index.ts +20 -1
  52. package/src/tracing/active-span.module.ts +13 -0
  53. package/src/tracing/constants.ts +8 -1
  54. package/src/tracing/decorators/span.decorator.ts +18 -5
  55. package/src/tracing/index.ts +7 -0
  56. package/src/tracing/request-metadata.module.ts +13 -0
  57. package/src/tracing/services/active-span.storage.ts +32 -0
  58. package/src/tracing/services/index.ts +0 -1
  59. package/src/tracing/services/instrumentation.service.ts +16 -130
  60. package/src/tracing/services/request-metadata.injector.ts +153 -0
  61. package/src/tracing/services/request-metadata.storage.ts +69 -0
  62. package/src/tracing/services/trace.injector.ts +268 -19
  63. package/src/tracing/tracing.interceptor.ts +18 -0
  64. package/src/tracing/tracing.module.ts +14 -14
  65. package/src/tracing/utils/create-span.ts +20 -0
  66. package/src/tracing/utils/save-async-hooks-context.ts +62 -0
  67. package/dist/tracing/services/metadata.scanner.d.ts +0 -11
  68. package/dist/tracing/services/metadata.scanner.js +0 -50
  69. package/dist/tracing/services/metadata.scanner.js.map +0 -1
  70. package/src/tracing/services/metadata.scanner.ts +0 -40
@@ -0,0 +1,20 @@
1
+ import { getRandomBytes } from '@rsdk/common';
2
+
3
+ /**
4
+ * Функция для генерации корректного рандомного traceId и spanId
5
+ * алгоритм взят из: https://github.com/openzipkin/zipkin-js/blob/ec89188cf6a07e184ab886c1dfb6c9dc276ddfa4/packages/zipkin/src/tracer/randomTraceId.js
6
+ * спецификация по traceId: https://www.w3.org/TR/trace-context/#considerations-for-trace-id-field-generation
7
+ * @returns {traceId, spanId}
8
+ */
9
+ export function createSpan(): {
10
+ traceId: string;
11
+ spanId: string;
12
+ } {
13
+ const rootSpanId = getRandomBytes(16);
14
+ const traceId = getRandomBytes(16) + rootSpanId;
15
+
16
+ return {
17
+ traceId,
18
+ spanId: rootSpanId,
19
+ };
20
+ }
@@ -0,0 +1,62 @@
1
+ import { SpanStatusCode } from '@opentelemetry/api';
2
+ import { api } from '@opentelemetry/sdk-node';
3
+ import type { ErrorLike } from '@rsdk/common';
4
+
5
+ import { TraceInjector } from '../services';
6
+ import { ActiveSpanStorage } from '../services/active-span.storage';
7
+
8
+ /**
9
+ * Проблема: при передаче управления в rxjs теряется контекст асинк локал стораджа
10
+ *
11
+ * Решение: Утилита для проброса инфы из асинк локал стораджа в тело пайпа rxjs
12
+ * поиском "observableToAsyncIterable" можно найти тесты в которых есть пример использования
13
+ *
14
+ * Тут есть часть логик трейсер декоратора, суть простая:
15
+ * мы - находясь в контексте с актуальным асинк Metadata запускаем создание боди для пайпа rx и тем самым мы передаем контекст работы туда
16
+ * ```
17
+ * return this.booksStream.pipe(
18
+ * concatMap(
19
+ * saveAsyncHooksContext(async (book) => {
20
+ * return { book: { ...book, pages: request.limit } };
21
+ * }),
22
+ * ),
23
+ * );
24
+ * ```
25
+ */
26
+ export function saveAsyncHooksContext<T>(
27
+ fn: (...args: any[]) => Promise<T>,
28
+ ): (...args: any[]) => Promise<T> {
29
+ const span = ActiveSpanStorage.getInstance()?.getActiveSpan();
30
+
31
+ return async function (...args): Promise<T> {
32
+ const activeSpan = ActiveSpanStorage.getInstance()?.getActiveSpan();
33
+ if (activeSpan) {
34
+ Object.assign(activeSpan.spanContext(), span?.spanContext());
35
+ return fn(...args);
36
+ } else {
37
+ if (!span) {
38
+ return fn(...args);
39
+ }
40
+ const spanContext = api.trace.setSpan(api.context.active(), span);
41
+
42
+ return api.context.with(spanContext, async () =>
43
+ fn(...args)
44
+ .then(async (result) => {
45
+ span.setAttribute('response', TraceInjector.toAttribute(result));
46
+ span.setStatus({ code: SpanStatusCode.OK });
47
+ span.end();
48
+ return result;
49
+ })
50
+ .catch(async (error) => {
51
+ span.recordException(error as ErrorLike);
52
+ span.setStatus({
53
+ code: SpanStatusCode.ERROR,
54
+ message: (error as ErrorLike).message,
55
+ });
56
+ span.end();
57
+ throw error;
58
+ }),
59
+ );
60
+ }
61
+ };
62
+ }
@@ -1,11 +0,0 @@
1
- import type { Controller, Injectable as Provider } from '@nestjs/common/interfaces';
2
- import { ModulesContainer } from '@nestjs/core';
3
- import type { InstanceWrapper } from '@nestjs/core/injector/instance-wrapper';
4
- export declare class ExtendedMetadataScanner {
5
- private readonly modules;
6
- private readonly scanner;
7
- constructor(modules: ModulesContainer);
8
- getControllers(): Generator<InstanceWrapper<Controller>>;
9
- getProviders(): Generator<InstanceWrapper<Provider>>;
10
- getMethods(prototype: any): Generator<string>;
11
- }
@@ -1,50 +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.ExtendedMetadataScanner = void 0;
13
- const common_1 = require("@nestjs/common");
14
- const core_1 = require("@nestjs/core");
15
- let ExtendedMetadataScanner = class ExtendedMetadataScanner {
16
- modules;
17
- scanner = new core_1.MetadataScanner();
18
- constructor(modules) {
19
- this.modules = modules;
20
- }
21
- *getControllers() {
22
- for (const module of this.modules.values()) {
23
- for (const controller of module.controllers.values()) {
24
- if (controller && controller.metatype?.prototype) {
25
- yield controller;
26
- }
27
- }
28
- }
29
- }
30
- *getProviders() {
31
- for (const module of this.modules.values()) {
32
- for (const provider of module.providers.values()) {
33
- if (provider && provider.metatype?.prototype) {
34
- yield provider;
35
- }
36
- }
37
- }
38
- }
39
- *getMethods(prototype) {
40
- for (const name of this.scanner.getAllFilteredMethodNames(prototype)) {
41
- yield name;
42
- }
43
- }
44
- };
45
- exports.ExtendedMetadataScanner = ExtendedMetadataScanner;
46
- exports.ExtendedMetadataScanner = ExtendedMetadataScanner = __decorate([
47
- (0, common_1.Injectable)(),
48
- __metadata("design:paramtypes", [core_1.ModulesContainer])
49
- ], ExtendedMetadataScanner);
50
- //# sourceMappingURL=metadata.scanner.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"metadata.scanner.js","sourceRoot":"","sources":["../../../src/tracing/services/metadata.scanner.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAK5C,uCAAiE;AAI1D,IAAM,uBAAuB,GAA7B,MAAM,uBAAuB;IAGL;IAFZ,OAAO,GAAG,IAAI,sBAAe,EAAE,CAAC;IAEjD,YAA6B,OAAyB;QAAzB,YAAO,GAAP,OAAO,CAAkB;IAAG,CAAC;IAE1D,CAAC,cAAc;QACb,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE;YAC1C,KAAK,MAAM,UAAU,IAAI,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE;gBACpD,IAAI,UAAU,IAAI,UAAU,CAAC,QAAQ,EAAE,SAAS,EAAE;oBAChD,MAAM,UAAU,CAAC;iBAClB;aACF;SACF;IACH,CAAC;IAED,CAAC,YAAY;QACX,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE;YAC1C,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE;gBAChD,IAAI,QAAQ,IAAI,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE;oBAC5C,MAAM,QAAQ,CAAC;iBAChB;aACF;SACF;IACH,CAAC;IAED,CAAC,UAAU,CAAC,SAAc;QACxB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,yBAAyB,CAAC,SAAS,CAAC,EAAE;YACpE,MAAM,IAAI,CAAC;SACZ;IACH,CAAC;CACF,CAAA;AA9BY,0DAAuB;kCAAvB,uBAAuB;IADnC,IAAA,mBAAU,GAAE;qCAI2B,uBAAgB;GAH3C,uBAAuB,CA8BnC"}
@@ -1,40 +0,0 @@
1
- import { Injectable } from '@nestjs/common';
2
- import type {
3
- Controller,
4
- Injectable as Provider,
5
- } from '@nestjs/common/interfaces';
6
- import { MetadataScanner, ModulesContainer } from '@nestjs/core';
7
- import type { InstanceWrapper } from '@nestjs/core/injector/instance-wrapper';
8
-
9
- @Injectable()
10
- export class ExtendedMetadataScanner {
11
- private readonly scanner = new MetadataScanner();
12
-
13
- constructor(private readonly modules: ModulesContainer) {}
14
-
15
- *getControllers(): Generator<InstanceWrapper<Controller>> {
16
- for (const module of this.modules.values()) {
17
- for (const controller of module.controllers.values()) {
18
- if (controller && controller.metatype?.prototype) {
19
- yield controller;
20
- }
21
- }
22
- }
23
- }
24
-
25
- *getProviders(): Generator<InstanceWrapper<Provider>> {
26
- for (const module of this.modules.values()) {
27
- for (const provider of module.providers.values()) {
28
- if (provider && provider.metatype?.prototype) {
29
- yield provider;
30
- }
31
- }
32
- }
33
- }
34
-
35
- *getMethods(prototype: any): Generator<string> {
36
- for (const name of this.scanner.getAllFilteredMethodNames(prototype)) {
37
- yield name;
38
- }
39
- }
40
- }