@rsdk/core 4.2.0-next.0 → 4.2.0-next.1

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 (59) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/index.d.ts +2 -1
  3. package/dist/index.js +3 -2
  4. package/dist/index.js.map +1 -1
  5. package/dist/platform.module.js +6 -1
  6. package/dist/platform.module.js.map +1 -1
  7. package/dist/tracing/auto-instrumentations.config.js +2 -3
  8. package/dist/tracing/auto-instrumentations.config.js.map +1 -1
  9. package/dist/tracing/grpc.headers.d.ts +11 -0
  10. package/dist/tracing/grpc.headers.js +24 -0
  11. package/dist/tracing/grpc.headers.js.map +1 -0
  12. package/dist/tracing/http.headers.d.ts +11 -0
  13. package/dist/tracing/http.headers.js +22 -0
  14. package/dist/tracing/http.headers.js.map +1 -0
  15. package/dist/tracing/index.d.ts +0 -1
  16. package/dist/tracing/index.js +0 -1
  17. package/dist/tracing/index.js.map +1 -1
  18. package/dist/tracing/open-telemetry.interceptor.d.ts +5 -0
  19. package/dist/tracing/open-telemetry.interceptor.js +83 -0
  20. package/dist/tracing/open-telemetry.interceptor.js.map +1 -0
  21. package/dist/tracing/request-metadata.module.js +1 -5
  22. package/dist/tracing/request-metadata.module.js.map +1 -1
  23. package/dist/tracing/services/instrumentation.service.d.ts +0 -1
  24. package/dist/tracing/services/instrumentation.service.js +0 -7
  25. package/dist/tracing/services/instrumentation.service.js.map +1 -1
  26. package/dist/tracing/services/request-id.provider.d.ts +11 -0
  27. package/dist/tracing/services/request-id.provider.js +13 -0
  28. package/dist/tracing/services/request-id.provider.js.map +1 -0
  29. package/dist/tracing/services/trace.injector.d.ts +4 -4
  30. package/dist/tracing/services/trace.injector.js +1 -132
  31. package/dist/tracing/services/trace.injector.js.map +1 -1
  32. package/dist/tracing/tracing.interceptor.d.ts +6 -5
  33. package/dist/tracing/tracing.interceptor.js +92 -7
  34. package/dist/tracing/tracing.interceptor.js.map +1 -1
  35. package/dist/tracing/tracing.module.d.ts +2 -2
  36. package/dist/tracing/tracing.module.js +8 -9
  37. package/dist/tracing/tracing.module.js.map +1 -1
  38. package/package.json +11 -10
  39. package/src/index.ts +1 -3
  40. package/src/platform.module.ts +7 -1
  41. package/src/tracing/auto-instrumentations.config.ts +2 -3
  42. package/src/tracing/grpc.headers.ts +29 -0
  43. package/src/tracing/http.headers.ts +32 -0
  44. package/src/tracing/index.ts +0 -1
  45. package/src/tracing/open-telemetry.interceptor.ts +114 -0
  46. package/src/tracing/request-metadata.module.ts +1 -6
  47. package/src/tracing/services/instrumentation.service.ts +0 -11
  48. package/src/tracing/services/request-id.provider.ts +21 -0
  49. package/src/tracing/services/trace.injector.ts +4 -170
  50. package/src/tracing/tracing.interceptor.ts +131 -5
  51. package/src/tracing/tracing.module.ts +10 -12
  52. package/dist/tracing/services/request-metadata.injector.d.ts +0 -6
  53. package/dist/tracing/services/request-metadata.injector.js +0 -123
  54. package/dist/tracing/services/request-metadata.injector.js.map +0 -1
  55. package/dist/tracing/services/request-metadata.storage.d.ts +0 -32
  56. package/dist/tracing/services/request-metadata.storage.js +0 -64
  57. package/dist/tracing/services/request-metadata.storage.js.map +0 -1
  58. package/src/tracing/services/request-metadata.injector.ts +0 -157
  59. package/src/tracing/services/request-metadata.storage.ts +0 -69
package/CHANGELOG.md CHANGED
@@ -3,6 +3,12 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [4.2.0-next.1](https://github.com/R-Vision/rsdk/compare/v4.2.0-next.0...v4.2.0-next.1) (2024-02-02)
7
+
8
+ ### Features
9
+
10
+ * rework work with async context ([#201](https://github.com/R-Vision/rsdk/issues/201)) ([26de1a8](https://github.com/R-Vision/rsdk/commit/26de1a814692bcd082c2f1aaedad1215ec0df1a0))
11
+
6
12
  ## [4.2.0-next.0](https://github.com/R-Vision/rsdk/compare/v4.1.0...v4.2.0-next.0) (2024-02-02)
7
13
 
8
14
  ### Features
package/dist/index.d.ts CHANGED
@@ -3,7 +3,7 @@ export { APP_SCOPE } from './app-metadata/app-metadata.const';
3
3
  export { Manifest } from './manifest/manifest';
4
4
  export { ProtocolDetector } from './transport/protocol.detector';
5
5
  export { X_REQUEST_ID } from './tracing/constants';
6
- export { RequestMetadata, RequestMetadataStorage, TracingModule, saveAsyncHooksContext, createSpan, ActiveSpanModule, ActiveSpanStorage, Span, } from './tracing';
6
+ export { TracingModule, saveAsyncHooksContext, createSpan, ActiveSpanModule, ActiveSpanStorage, Span, } from './tracing';
7
7
  export { FileSystemCheckOptions, FileSystemIndicator, PingCheckOptions, PingIndicator, } from './health/indicators.abstract';
8
8
  export { HealthChecksService } from './health/health.service';
9
9
  export { CheckSummary } from './health/types';
@@ -24,3 +24,4 @@ export * from './app-metadata/decorators';
24
24
  export * from './app-metadata/app-metadata.const';
25
25
  export { getTransportId } from './transport/get-transport-id';
26
26
  export { X_B3_PARENT_SPAN_ID, X_B3_SPAN_ID, X_B3_TRACE_ID, } from '@opentelemetry/propagator-b3';
27
+ export { RequestIdProvider } from './tracing/services/request-id.provider';
package/dist/index.js CHANGED
@@ -14,7 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.X_B3_TRACE_ID = exports.X_B3_SPAN_ID = exports.X_B3_PARENT_SPAN_ID = exports.getTransportId = exports.PlatformApp = exports.register = exports.Summary = exports.MetricsModule = exports.Metric = exports.Histogram = exports.Gauge = exports.Counter = exports.InjectLogger = exports.PlatformContext = exports.ConfigTag = exports.CheckResult = exports.Indicator = exports.getLoggerToken = exports.HealthChecksService = exports.PingIndicator = exports.FileSystemIndicator = exports.Span = exports.ActiveSpanStorage = exports.ActiveSpanModule = exports.createSpan = exports.saveAsyncHooksContext = exports.TracingModule = exports.RequestMetadataStorage = exports.X_REQUEST_ID = exports.ProtocolDetector = exports.Manifest = exports.APP_SCOPE = void 0;
17
+ exports.RequestIdProvider = exports.X_B3_TRACE_ID = exports.X_B3_SPAN_ID = exports.X_B3_PARENT_SPAN_ID = exports.getTransportId = exports.PlatformApp = exports.register = exports.Summary = exports.MetricsModule = exports.Metric = exports.Histogram = exports.Gauge = exports.Counter = exports.InjectLogger = exports.PlatformContext = exports.ConfigTag = exports.CheckResult = exports.Indicator = exports.getLoggerToken = exports.HealthChecksService = exports.PingIndicator = exports.FileSystemIndicator = exports.Span = exports.ActiveSpanStorage = exports.ActiveSpanModule = exports.createSpan = exports.saveAsyncHooksContext = exports.TracingModule = exports.X_REQUEST_ID = exports.ProtocolDetector = exports.Manifest = exports.APP_SCOPE = void 0;
18
18
  require("./unhandled-rejection.handler");
19
19
  var app_metadata_const_1 = require("./app-metadata/app-metadata.const");
20
20
  Object.defineProperty(exports, "APP_SCOPE", { enumerable: true, get: function () { return app_metadata_const_1.APP_SCOPE; } });
@@ -25,7 +25,6 @@ Object.defineProperty(exports, "ProtocolDetector", { enumerable: true, get: func
25
25
  var constants_1 = require("./tracing/constants");
26
26
  Object.defineProperty(exports, "X_REQUEST_ID", { enumerable: true, get: function () { return constants_1.X_REQUEST_ID; } });
27
27
  var tracing_1 = require("./tracing");
28
- Object.defineProperty(exports, "RequestMetadataStorage", { enumerable: true, get: function () { return tracing_1.RequestMetadataStorage; } });
29
28
  Object.defineProperty(exports, "TracingModule", { enumerable: true, get: function () { return tracing_1.TracingModule; } });
30
29
  Object.defineProperty(exports, "saveAsyncHooksContext", { enumerable: true, get: function () { return tracing_1.saveAsyncHooksContext; } });
31
30
  Object.defineProperty(exports, "createSpan", { enumerable: true, get: function () { return tracing_1.createSpan; } });
@@ -71,4 +70,6 @@ var propagator_b3_1 = require("@opentelemetry/propagator-b3");
71
70
  Object.defineProperty(exports, "X_B3_PARENT_SPAN_ID", { enumerable: true, get: function () { return propagator_b3_1.X_B3_PARENT_SPAN_ID; } });
72
71
  Object.defineProperty(exports, "X_B3_SPAN_ID", { enumerable: true, get: function () { return propagator_b3_1.X_B3_SPAN_ID; } });
73
72
  Object.defineProperty(exports, "X_B3_TRACE_ID", { enumerable: true, get: function () { return propagator_b3_1.X_B3_TRACE_ID; } });
73
+ var request_id_provider_1 = require("./tracing/services/request-id.provider");
74
+ Object.defineProperty(exports, "RequestIdProvider", { enumerable: true, get: function () { return request_id_provider_1.RequestIdProvider; } });
74
75
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,yCAAuC;AAEvC,wEAA8D;AAArD,+GAAA,SAAS,OAAA;AAElB,gDAA+C;AAAtC,oGAAA,QAAQ,OAAA;AAEjB,mEAAiE;AAAxD,qHAAA,gBAAgB,OAAA;AAEzB,iDAAmD;AAA1C,yGAAA,YAAY,OAAA;AAErB,qCASmB;AAPjB,iHAAA,sBAAsB,OAAA;AACtB,wGAAA,aAAa,OAAA;AACb,gHAAA,qBAAqB,OAAA;AACrB,qGAAA,UAAU,OAAA;AACV,2GAAA,gBAAgB,OAAA;AAChB,4GAAA,iBAAiB,OAAA;AACjB,+FAAA,IAAI,OAAA;AAGN,oEAKsC;AAHpC,0HAAA,mBAAmB,OAAA;AAEnB,oHAAA,aAAa,OAAA;AAGf,0DAA8D;AAArD,qHAAA,mBAAmB,OAAA;AAI5B,6CAAmD;AAA1C,yGAAA,cAAc,OAAA;AAEvB,6EAAkE;AAAzD,gHAAA,SAAS,OAAA;AAIlB,4CAA+C;AAAtC,sGAAA,WAAW,OAAA;AAEpB,sDAAkD;AAAzC,yGAAA,SAAS,OAAA;AAElB,uDAAqD;AAA5C,mHAAA,eAAe,OAAA;AAExB,2CAAyB;AAEzB,+CAA6B;AAE7B,wDAAsC;AAEtC,qCAAyC;AAAhC,uGAAA,YAAY,OAAA;AAErB,qCASmB;AAPjB,kGAAA,OAAO,OAAA;AACP,gGAAA,KAAK,OAAA;AACL,oGAAA,SAAS,OAAA;AACT,iGAAA,MAAM,OAAA;AACN,wGAAA,aAAa,OAAA;AACb,kGAAA,OAAO,OAAA;AACP,mGAAA,QAAQ,OAAA;AAGV,mDAAiD;AAAxC,2GAAA,WAAW,OAAA;AAEpB,0CAAwB;AAExB,4DAA0C;AAE1C,oEAAkD;AAClD,iEAA8D;AAArD,kHAAA,cAAc,OAAA;AAEvB,8DAIsC;AAHpC,oHAAA,mBAAmB,OAAA;AACnB,6GAAA,YAAY,OAAA;AACZ,8GAAA,aAAa,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,yCAAuC;AAEvC,wEAA8D;AAArD,+GAAA,SAAS,OAAA;AAElB,gDAA+C;AAAtC,oGAAA,QAAQ,OAAA;AAEjB,mEAAiE;AAAxD,qHAAA,gBAAgB,OAAA;AAEzB,iDAAmD;AAA1C,yGAAA,YAAY,OAAA;AACrB,qCAOmB;AANjB,wGAAA,aAAa,OAAA;AACb,gHAAA,qBAAqB,OAAA;AACrB,qGAAA,UAAU,OAAA;AACV,2GAAA,gBAAgB,OAAA;AAChB,4GAAA,iBAAiB,OAAA;AACjB,+FAAA,IAAI,OAAA;AAGN,oEAKsC;AAHpC,0HAAA,mBAAmB,OAAA;AAEnB,oHAAA,aAAa,OAAA;AAGf,0DAA8D;AAArD,qHAAA,mBAAmB,OAAA;AAI5B,6CAAmD;AAA1C,yGAAA,cAAc,OAAA;AAEvB,6EAAkE;AAAzD,gHAAA,SAAS,OAAA;AAIlB,4CAA+C;AAAtC,sGAAA,WAAW,OAAA;AAEpB,sDAAkD;AAAzC,yGAAA,SAAS,OAAA;AAElB,uDAAqD;AAA5C,mHAAA,eAAe,OAAA;AAExB,2CAAyB;AAEzB,+CAA6B;AAE7B,wDAAsC;AAEtC,qCAAyC;AAAhC,uGAAA,YAAY,OAAA;AAErB,qCASmB;AAPjB,kGAAA,OAAO,OAAA;AACP,gGAAA,KAAK,OAAA;AACL,oGAAA,SAAS,OAAA;AACT,iGAAA,MAAM,OAAA;AACN,wGAAA,aAAa,OAAA;AACb,kGAAA,OAAO,OAAA;AACP,mGAAA,QAAQ,OAAA;AAGV,mDAAiD;AAAxC,2GAAA,WAAW,OAAA;AAEpB,0CAAwB;AAExB,4DAA0C;AAE1C,oEAAkD;AAClD,iEAA8D;AAArD,kHAAA,cAAc,OAAA;AAEvB,8DAIsC;AAHpC,oHAAA,mBAAmB,OAAA;AACnB,6GAAA,YAAY,OAAA;AACZ,8GAAA,aAAa,OAAA;AAEf,8EAA2E;AAAlE,wHAAA,iBAAiB,OAAA"}
@@ -15,6 +15,7 @@ var PlatformModule_1;
15
15
  Object.defineProperty(exports, "__esModule", { value: true });
16
16
  exports.PlatformModule = void 0;
17
17
  const common_1 = require("@nestjs/common");
18
+ const actx_1 = require("@rsdk/actx");
18
19
  const plugin_module_1 = require("./plugin/plugin.module");
19
20
  const transport_module_1 = require("./transport/transport.module");
20
21
  const app_metadata_1 = require("./app-metadata");
@@ -29,12 +30,16 @@ let PlatformModule = PlatformModule_1 = class PlatformModule {
29
30
  }
30
31
  static forRoot(options) {
31
32
  const imports = [
33
+ /**
34
+ * Последовательность принципиально важна так как в этом модуле происходит инициализация глобального асинхронного контекста (AsyncLocalStorage)
35
+ */
36
+ actx_1.AsyncContextModule,
37
+ tracing_1.TracingModule.forRoot({ appName: options.name, processing: 'simple' }),
32
38
  // Plugins
33
39
  plugin_module_1.PlatformPluginModule.forOptions(options),
34
40
  // Infrastructure
35
41
  app_metadata_1.AppMetadataModule.forRoot(options),
36
42
  config_1.PlatformConfigModule.forRoot(options),
37
- tracing_1.TracingModule.forRoot({ appName: options.name, processing: 'simple' }),
38
43
  logging_1.LoggerInitializingModule,
39
44
  ...(options.modules ?? []),
40
45
  ];
@@ -1 +1 @@
1
- {"version":3,"file":"platform.module.js","sourceRoot":"","sources":["../src/platform.module.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AACA,2CAAwC;AAIxC,0DAA8D;AAC9D,mEAAuE;AACvE,iDAAmD;AACnD,qCAAgD;AAChD,6CAAiD;AACjD,uCAAqD;AACrD,uCAA0C;AAG1C,IAAa,cAAc,sBAA3B,MAAa,cAAc;IAEoB;IAD7C,YAC6C,OAAgC;QAAhC,YAAO,GAAP,OAAO,CAAyB;IAC1E,CAAC;IAEJ,MAAM,CAAC,OAAO,CAAC,OAAgC;QAC7C,MAAM,OAAO,GAAoC;YAC/C,UAAU;YACV,oCAAoB,CAAC,UAAU,CAAC,OAAO,CAAC;YAExC,iBAAiB;YACjB,gCAAiB,CAAC,OAAO,CAAC,OAAO,CAAC;YAClC,6BAAoB,CAAC,OAAO,CAAC,OAAO,CAAC;YACrC,uBAAa,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;YACtE,kCAAwB;YACxB,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;SAC3B,CAAC;QAEF,oCAAoC;QACpC,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;YACvB,OAAO,CAAC,IAAI,CAAC,0CAAuB,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;QAC5D,CAAC;QAED,OAAO;YACL,MAAM,EAAE,gBAAc;YACtB,OAAO;YACP,SAAS,EAAE;gBACT;oBACE,OAAO,EAAE,yBAAyB;oBAClC,QAAQ,EAAE,OAAO;iBAClB;aACF;YACD,OAAO,EAAE,CAAC,yBAAyB,CAAC;SACrC,CAAC;IACJ,CAAC;IAED,SAAS,CAAC,QAA4B;QACpC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,MAAM,IAAI,8BAAiB,CACzB,mEAAmE,CACpE,CAAC;QACJ,CAAC;QAED,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;YAChD,MAAM,EAAE,mBAAmB,EAAE,CAAC,QAAQ,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;CACF,CAAA;AA/CY,wCAAc;yBAAd,cAAc;IAEtB,WAAA,IAAA,eAAM,EAAC,yBAAyB,CAAC,CAAA;;GAFzB,cAAc,CA+C1B"}
1
+ {"version":3,"file":"platform.module.js","sourceRoot":"","sources":["../src/platform.module.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AACA,2CAAwC;AAExC,qCAAgD;AAGhD,0DAA8D;AAC9D,mEAAuE;AACvE,iDAAmD;AACnD,qCAAgD;AAChD,6CAAiD;AACjD,uCAAqD;AACrD,uCAA0C;AAG1C,IAAa,cAAc,sBAA3B,MAAa,cAAc;IAEoB;IAD7C,YAC6C,OAAgC;QAAhC,YAAO,GAAP,OAAO,CAAyB;IAC1E,CAAC;IAEJ,MAAM,CAAC,OAAO,CAAC,OAAgC;QAC7C,MAAM,OAAO,GAAoC;YAC/C;;eAEG;YACH,yBAAkB;YAClB,uBAAa,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;YAEtE,UAAU;YACV,oCAAoB,CAAC,UAAU,CAAC,OAAO,CAAC;YAExC,iBAAiB;YACjB,gCAAiB,CAAC,OAAO,CAAC,OAAO,CAAC;YAClC,6BAAoB,CAAC,OAAO,CAAC,OAAO,CAAC;YACrC,kCAAwB;YACxB,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;SAC3B,CAAC;QAEF,oCAAoC;QACpC,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;YACvB,OAAO,CAAC,IAAI,CAAC,0CAAuB,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;QAC5D,CAAC;QAED,OAAO;YACL,MAAM,EAAE,gBAAc;YACtB,OAAO;YACP,SAAS,EAAE;gBACT;oBACE,OAAO,EAAE,yBAAyB;oBAClC,QAAQ,EAAE,OAAO;iBAClB;aACF;YACD,OAAO,EAAE,CAAC,yBAAyB,CAAC;SACrC,CAAC;IACJ,CAAC;IAED,SAAS,CAAC,QAA4B;QACpC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,MAAM,IAAI,8BAAiB,CACzB,mEAAmE,CACpE,CAAC;QACJ,CAAC;QAED,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;YAChD,MAAM,EAAE,mBAAmB,EAAE,CAAC,QAAQ,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;CACF,CAAA;AApDY,wCAAc;yBAAd,cAAc;IAEtB,WAAA,IAAA,eAAM,EAAC,yBAAyB,CAAC,CAAA;;GAFzB,cAAc,CAoD1B"}
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.autoInstumentationOptions = void 0;
4
4
  const auto_instrumentations_node_1 = require("@opentelemetry/auto-instrumentations-node");
5
5
  const node_http_1 = require("node:http");
6
- const request_metadata_storage_1 = require("./services/request-metadata.storage");
6
+ const request_id_provider_1 = require("./services/request-id.provider");
7
7
  exports.autoInstumentationOptions = (0, auto_instrumentations_node_1.getNodeAutoInstrumentations)({
8
8
  '@opentelemetry/instrumentation-aws-sdk': {
9
9
  responseHook: (span, { response }) => {
@@ -35,8 +35,7 @@ exports.autoInstumentationOptions = (0, auto_instrumentations_node_1.getNodeAuto
35
35
  '@opentelemetry/instrumentation-pino': {
36
36
  enabled: true,
37
37
  logHook: (_span, record) => {
38
- record['request_id'] =
39
- request_metadata_storage_1.RequestMetadataStorage.getInstance()?.getRequestMetadata().requestId;
38
+ record['request_id'] = request_id_provider_1.RequestIdProvider.get();
40
39
  },
41
40
  },
42
41
  });
@@ -1 +1 @@
1
- {"version":3,"file":"auto-instrumentations.config.js","sourceRoot":"","sources":["../../src/tracing/auto-instrumentations.config.ts"],"names":[],"mappings":";;;AAAA,0FAAwF;AACxF,yCAA2D;AAE3D,kFAA6E;AAEhE,QAAA,yBAAyB,GAAU,IAAA,wDAA2B,EAAC;IAC1E,wCAAwC,EAAE;QACxC,YAAY,EAAE,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;YACnC,IAAI,QAAQ,CAAC,OAAO,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC;gBAC1C,IAAI,CAAC,YAAY,CACf,gBAAgB,EAChB,QAAQ,CAAC,OAAO,CAAC,YAAY,EAAE,MAAM,CACtC,CAAC;YACJ,CAAC;QACH,CAAC;KACF;IACD,wCAAwC,EAAE;QACxC,WAAW,EAAE,IAAI;KAClB;IACD,qCAAqC,EAAE;QACrC,WAAW,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE;YAC7B,IAAI,OAAO,YAAY,2BAAe,EAAE,CAAC;gBACvC,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;oBAClC,IAAI,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;gBACtD,CAAC;YACH,CAAC;iBAAM,IACL,OAAO,YAAY,yBAAa;gBAChC,OAAO,CAAC,GAAG,CAAC,MAAM;gBAClB,OAAO,CAAC,GAAG,CAAC,GAAG,EACf,CAAC;gBACD,IAAI,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC;KACF;IACD,mCAAmC,EAAE;QACnC,yBAAyB,EAAE,IAAI;KAChC;IACD,qCAAqC,EAAE;QACrC,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;YACzB,MAAM,CAAC,YAAY,CAAC;gBAClB,iDAAsB,CAAC,WAAW,EAAE,EAAE,kBAAkB,EAAE,CAAC,SAAS,CAAC;QACzE,CAAC;KACF;CACF,CAAC,CAAC"}
1
+ {"version":3,"file":"auto-instrumentations.config.js","sourceRoot":"","sources":["../../src/tracing/auto-instrumentations.config.ts"],"names":[],"mappings":";;;AAAA,0FAAwF;AACxF,yCAA2D;AAE3D,wEAAmE;AAEtD,QAAA,yBAAyB,GAAU,IAAA,wDAA2B,EAAC;IAC1E,wCAAwC,EAAE;QACxC,YAAY,EAAE,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;YACnC,IAAI,QAAQ,CAAC,OAAO,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC;gBAC1C,IAAI,CAAC,YAAY,CACf,gBAAgB,EAChB,QAAQ,CAAC,OAAO,CAAC,YAAY,EAAE,MAAM,CACtC,CAAC;YACJ,CAAC;QACH,CAAC;KACF;IACD,wCAAwC,EAAE;QACxC,WAAW,EAAE,IAAI;KAClB;IACD,qCAAqC,EAAE;QACrC,WAAW,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE;YAC7B,IAAI,OAAO,YAAY,2BAAe,EAAE,CAAC;gBACvC,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;oBAClC,IAAI,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;gBACtD,CAAC;YACH,CAAC;iBAAM,IACL,OAAO,YAAY,yBAAa;gBAChC,OAAO,CAAC,GAAG,CAAC,MAAM;gBAClB,OAAO,CAAC,GAAG,CAAC,GAAG,EACf,CAAC;gBACD,IAAI,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC;KACF;IACD,mCAAmC,EAAE;QACnC,yBAAyB,EAAE,IAAI;KAChC;IACD,qCAAqC,EAAE;QACrC,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;YACzB,MAAM,CAAC,YAAY,CAAC,GAAG,uCAAiB,CAAC,GAAG,EAAE,CAAC;QACjD,CAAC;KACF;CACF,CAAC,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { Metadata } from '@grpc/grpc-js';
2
+ import type { MaybeReadonlyArray } from '@rsdk/common.node';
3
+ /**
4
+ * @description хелпер для нормализованного извлечения заголовков из grpc запроса
5
+ */
6
+ export declare class GrpcHeaders {
7
+ private metadata;
8
+ constructor(metadata: Metadata);
9
+ get<K extends string>(key: MaybeReadonlyArray<K>): Record<K, string | undefined>;
10
+ get(key: string): string | undefined;
11
+ }
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GrpcHeaders = void 0;
4
+ /**
5
+ * @description хелпер для нормализованного извлечения заголовков из grpc запроса
6
+ */
7
+ class GrpcHeaders {
8
+ metadata;
9
+ constructor(metadata) {
10
+ this.metadata = metadata;
11
+ }
12
+ get(key) {
13
+ if (Array.isArray(key)) {
14
+ return Object.fromEntries(key.map((k) => [k, this.get(k)]));
15
+ }
16
+ const requestIdMetadata = this.metadata.get(key);
17
+ if (requestIdMetadata.length > 0) {
18
+ return requestIdMetadata[0].toString();
19
+ }
20
+ return undefined;
21
+ }
22
+ }
23
+ exports.GrpcHeaders = GrpcHeaders;
24
+ //# sourceMappingURL=grpc.headers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grpc.headers.js","sourceRoot":"","sources":["../../src/tracing/grpc.headers.ts"],"names":[],"mappings":";;;AAGA;;GAEG;AACH,MAAa,WAAW;IACF;IAApB,YAAoB,QAAkB;QAAlB,aAAQ,GAAR,QAAQ,CAAU;IAAG,CAAC;IAM1C,GAAG,CACD,GAAwC;QAExC,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,OAAO,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAGzD,CAAC;QACJ,CAAC;QACD,MAAM,iBAAiB,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAa,CAAC,CAAC;QAC3D,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjC,OAAO,iBAAiB,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QACzC,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;CACF;AAtBD,kCAsBC"}
@@ -0,0 +1,11 @@
1
+ import type { MaybeReadonlyArray } from '@rsdk/common.node';
2
+ /**
3
+ * @description хелпер для нормализованного извлечения заголовков из http запроса
4
+ */
5
+ export declare class HttpHeaders {
6
+ private headers;
7
+ constructor(headers: Record<string, string>);
8
+ get<K extends string>(key: MaybeReadonlyArray<K>): Record<K, string | undefined>;
9
+ get(key: string): string | undefined;
10
+ private normalizedHeaders;
11
+ }
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HttpHeaders = void 0;
4
+ /**
5
+ * @description хелпер для нормализованного извлечения заголовков из http запроса
6
+ */
7
+ class HttpHeaders {
8
+ headers;
9
+ constructor(headers) {
10
+ this.headers = headers;
11
+ this.normalizedHeaders = Object.fromEntries(Object.entries(headers).map(([k, v]) => [k.toLowerCase(), v]));
12
+ }
13
+ get(key) {
14
+ if (Array.isArray(key)) {
15
+ return Object.fromEntries(key.map((k) => [k, this.get(k)]));
16
+ }
17
+ return this.normalizedHeaders[key.toLowerCase()];
18
+ }
19
+ normalizedHeaders;
20
+ }
21
+ exports.HttpHeaders = HttpHeaders;
22
+ //# sourceMappingURL=http.headers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.headers.js","sourceRoot":"","sources":["../../src/tracing/http.headers.ts"],"names":[],"mappings":";;;AAEA;;GAEG;AACH,MAAa,WAAW;IACF;IAApB,YAAoB,OAA+B;QAA/B,YAAO,GAAP,OAAO,CAAwB;QACjD,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,WAAW,CACzC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC,CAC9D,CAAC;IACJ,CAAC;IAQD,GAAG,CACD,GAAwC;QAExC,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,OAAO,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAGzD,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC,iBAAiB,CAAE,GAAc,CAAC,WAAW,EAAE,CAAC,CAAC;IAC/D,CAAC;IAEO,iBAAiB,CAAyB;CACnD;AA1BD,kCA0BC"}
@@ -1,7 +1,6 @@
1
1
  export * from './active-span.module';
2
2
  export * from './request-metadata.module';
3
3
  export * from './services/active-span.storage';
4
- export * from './services/request-metadata.storage';
5
4
  export * from './tracing.module';
6
5
  export * from './utils/create-span';
7
6
  export * from './utils/save-async-hooks-context';
@@ -17,7 +17,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./active-span.module"), exports);
18
18
  __exportStar(require("./request-metadata.module"), exports);
19
19
  __exportStar(require("./services/active-span.storage"), exports);
20
- __exportStar(require("./services/request-metadata.storage"), exports);
21
20
  __exportStar(require("./tracing.module"), exports);
22
21
  __exportStar(require("./utils/create-span"), exports);
23
22
  __exportStar(require("./utils/save-async-hooks-context"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tracing/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,uDAAqC;AACrC,4DAA0C;AAC1C,iEAA+C;AAC/C,sEAAoD;AACpD,mDAAiC;AACjC,sDAAoC;AACpC,mEAAiD;AACjD,+CAA6B"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tracing/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,uDAAqC;AACrC,4DAA0C;AAC1C,iEAA+C;AAC/C,mDAAiC;AACjC,sDAAoC;AACpC,mEAAiD;AACjD,+CAA6B"}
@@ -0,0 +1,5 @@
1
+ import type { CallHandler, ExecutionContext, NestInterceptor } from '@nestjs/common';
2
+ import { Observable } from 'rxjs';
3
+ export declare class OpenTelemetryInterceptor implements NestInterceptor {
4
+ intercept(_context: ExecutionContext, next: CallHandler<any>): Observable<any> | Promise<Observable<any>>;
5
+ }
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OpenTelemetryInterceptor = void 0;
4
+ const api_1 = require("@opentelemetry/api");
5
+ const propagator_b3_1 = require("@opentelemetry/propagator-b3");
6
+ const sdk_node_1 = require("@opentelemetry/sdk-node");
7
+ const semantic_conventions_1 = require("@opentelemetry/semantic-conventions");
8
+ const rxjs_1 = require("rxjs");
9
+ const request_id_provider_1 = require("./services/request-id.provider");
10
+ const services_1 = require("./services");
11
+ class OpenTelemetryInterceptor {
12
+ intercept(_context, next) {
13
+ const tracer = api_1.trace.getTracer('@rsdk/open-telemetry', '1.0.0');
14
+ const spanName = services_1.TraceInjector.createSpanName(OpenTelemetryInterceptor.name, 'intercept');
15
+ /**
16
+ * Создаем новый спан
17
+ */
18
+ const span = tracer.startSpan(spanName, {});
19
+ const openTelemetryValues = request_id_provider_1.OpenTelemetryProvider.getOrThrow();
20
+ const parentSpanId = openTelemetryValues[propagator_b3_1.X_B3_PARENT_SPAN_ID];
21
+ if (parentSpanId) {
22
+ span.parentSpanId = parentSpanId;
23
+ }
24
+ const spanId = openTelemetryValues[propagator_b3_1.X_B3_SPAN_ID];
25
+ /**
26
+ * После создания контекста ранее при входе в приложение, у нас новый спан ид
27
+ * мы перетираем значением которе получили через заголовок
28
+ * в рамках приложения он корректный, но при переходе из одного приложения в другой - слетает
29
+ * и чтобы 100% все было норм, мы всегда патчим его
30
+ */
31
+ if (spanId) {
32
+ span.spanContext().spanId = spanId;
33
+ }
34
+ const traceId = openTelemetryValues[propagator_b3_1.X_B3_TRACE_ID];
35
+ /**
36
+ * Патчим трайс ид, причина выше
37
+ */
38
+ if (traceId) {
39
+ span.spanContext().traceId = traceId;
40
+ }
41
+ /**
42
+ * Обычно самая первая точка входа это фронтовый запрос, который содержит некие заголовки хттп
43
+ * мы их кладем в рутовый спан
44
+ */
45
+ if (openTelemetryValues.http) {
46
+ span.setAttribute(semantic_conventions_1.SemanticAttributes.HTTP_METHOD, openTelemetryValues.http.httpMethod);
47
+ span.setAttribute(semantic_conventions_1.SemanticAttributes.HTTP_URL, openTelemetryValues.http.httpUrl);
48
+ span.setAttribute(semantic_conventions_1.SemanticAttributes.HTTP_ROUTE, openTelemetryValues.http.httpRoute);
49
+ }
50
+ /**
51
+ * Чтобы пробросить пропатченный спан нужно запустить две строчки ниже:
52
+ * 1) создаем контекст в котором активный спан перебиваем новым
53
+ * 2) созданный контекст ставим основным и в нем запускаем под процесс
54
+ */
55
+ const spanContext = sdk_node_1.api.trace.setSpan(sdk_node_1.api.context.active(), span);
56
+ return new rxjs_1.Observable((observer) => {
57
+ sdk_node_1.api.context.with(spanContext, () => {
58
+ next
59
+ .handle()
60
+ .pipe((0, rxjs_1.mergeMap)((result) => {
61
+ services_1.TraceInjector.enrich(span, result);
62
+ span.end();
63
+ return (0, rxjs_1.of)(result);
64
+ }), (0, rxjs_1.catchError)((error) => {
65
+ services_1.TraceInjector.recordAndRethrow(error, span);
66
+ span.end();
67
+ return (0, rxjs_1.throwError)(() => error);
68
+ }))
69
+ .subscribe({
70
+ complete: () => {
71
+ observer.complete();
72
+ },
73
+ error: (error) => {
74
+ observer.error(error);
75
+ },
76
+ next: (res) => observer.next(res),
77
+ });
78
+ });
79
+ });
80
+ }
81
+ }
82
+ exports.OpenTelemetryInterceptor = OpenTelemetryInterceptor;
83
+ //# sourceMappingURL=open-telemetry.interceptor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open-telemetry.interceptor.js","sourceRoot":"","sources":["../../src/tracing/open-telemetry.interceptor.ts"],"names":[],"mappings":"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"}
@@ -8,7 +8,6 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
9
  exports.RequestMetadataModule = void 0;
10
10
  const common_1 = require("@nestjs/common");
11
- const request_metadata_storage_1 = require("./services/request-metadata.storage");
12
11
  /**
13
12
  * Модуль для хранения и получения данных из аскин локал стораджа
14
13
  */
@@ -17,9 +16,6 @@ let RequestMetadataModule = class RequestMetadataModule {
17
16
  exports.RequestMetadataModule = RequestMetadataModule;
18
17
  exports.RequestMetadataModule = RequestMetadataModule = __decorate([
19
18
  (0, common_1.Global)(),
20
- (0, common_1.Module)({
21
- providers: [request_metadata_storage_1.RequestMetadataStorage],
22
- exports: [request_metadata_storage_1.RequestMetadataStorage],
23
- })
19
+ (0, common_1.Module)({})
24
20
  ], RequestMetadataModule);
25
21
  //# sourceMappingURL=request-metadata.module.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"request-metadata.module.js","sourceRoot":"","sources":["../../src/tracing/request-metadata.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAgD;AAEhD,kFAA6E;AAE7E;;GAEG;AAMI,IAAM,qBAAqB,GAA3B,MAAM,qBAAqB;CAAG,CAAA;AAAxB,sDAAqB;gCAArB,qBAAqB;IALjC,IAAA,eAAM,GAAE;IACR,IAAA,eAAM,EAAC;QACN,SAAS,EAAE,CAAC,iDAAsB,CAAC;QACnC,OAAO,EAAE,CAAC,iDAAsB,CAAC;KAClC,CAAC;GACW,qBAAqB,CAAG"}
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,4 +1,3 @@
1
1
  export declare class InstrumentationService {
2
- injectWrapRequestMetadataInjector(): void;
3
2
  injectWrapTraceInjector(): void;
4
3
  }
@@ -9,15 +9,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
9
9
  exports.InstrumentationService = void 0;
10
10
  const common_1 = require("@nestjs/common");
11
11
  const tracing_interceptor_1 = require("../tracing.interceptor");
12
- const request_metadata_injector_1 = require("./request-metadata.injector");
13
12
  const trace_injector_1 = require("./trace.injector");
14
13
  let InstrumentationService = class InstrumentationService {
15
- injectWrapRequestMetadataInjector() {
16
- /**
17
- * Оборачиваем интерцептор в логику которая несет с собою асинк локал сторадж с requestId
18
- */
19
- request_metadata_injector_1.RequestMetadataInjector.wrap(tracing_interceptor_1.TracingInterceptor.prototype, tracing_interceptor_1.TracingInterceptor.prototype['intercept']);
20
- }
21
14
  injectWrapTraceInjector() {
22
15
  /**
23
16
  * Оборачиваем интерцептор в логику которая несет с собою асинк локал сторадж с traceId, spanId
@@ -1 +1 @@
1
- {"version":3,"file":"instrumentation.service.js","sourceRoot":"","sources":["../../../src/tracing/services/instrumentation.service.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAA4C;AAE5C,gEAA4D;AAE5D,2EAAsE;AACtE,qDAAiD;AAG1C,IAAM,sBAAsB,GAA5B,MAAM,sBAAsB;IAC1B,iCAAiC;QACtC;;WAEG;QACH,mDAAuB,CAAC,IAAI,CAC1B,wCAAkB,CAAC,SAAS,EAC5B,wCAAkB,CAAC,SAAS,CAAC,WAAW,CAAC,CAC1C,CAAC;IACJ,CAAC;IAEM,uBAAuB;QAC5B;;WAEG;QACH,8BAAa,CAAC,IAAI,CAChB,wCAAkB,CAAC,SAAS,EAC5B,wCAAkB,CAAC,SAAS,CAAC,WAAW,CAAC,EACzC,SAAS,EACT,IAAI,CACL,CAAC;IACJ,CAAC;CACF,CAAA;AAtBY,wDAAsB;iCAAtB,sBAAsB;IADlC,IAAA,mBAAU,GAAE;GACA,sBAAsB,CAsBlC"}
1
+ {"version":3,"file":"instrumentation.service.js","sourceRoot":"","sources":["../../../src/tracing/services/instrumentation.service.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAA4C;AAE5C,gEAA4D;AAE5D,qDAAiD;AAG1C,IAAM,sBAAsB,GAA5B,MAAM,sBAAsB;IAC1B,uBAAuB;QAC5B;;WAEG;QACH,8BAAa,CAAC,IAAI,CAChB,wCAAkB,CAAC,SAAS,EAC5B,wCAAkB,CAAC,SAAS,CAAC,WAAW,CAAC,EACzC,SAAS,EACT,IAAI,CACL,CAAC;IACJ,CAAC;CACF,CAAA;AAZY,wDAAsB;iCAAtB,sBAAsB;IADlC,IAAA,mBAAU,GAAE;GACA,sBAAsB,CAYlC"}
@@ -0,0 +1,11 @@
1
+ export declare const RequestIdProvider: import("@rsdk/actx").AsyncContextProvider<string>;
2
+ export declare const OpenTelemetryProvider: import("@rsdk/actx").AsyncContextProvider<{
3
+ http?: {
4
+ httpMethod: string;
5
+ httpUrl: string;
6
+ httpRoute: string;
7
+ };
8
+ "x-b3-spanid"?: string;
9
+ "x-b3-traceid"?: string;
10
+ "x-b3-parentspanid"?: string;
11
+ }>;
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OpenTelemetryProvider = exports.RequestIdProvider = void 0;
4
+ const actx_1 = require("@rsdk/actx");
5
+ exports.RequestIdProvider = (0, actx_1.createAsyncContextProvider)({
6
+ name: 'RequestId',
7
+ rewritable: false,
8
+ });
9
+ exports.OpenTelemetryProvider = (0, actx_1.createAsyncContextProvider)({
10
+ name: 'OpenTelemetryPropagation',
11
+ rewritable: false,
12
+ });
13
+ //# sourceMappingURL=request-id.provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-id.provider.js","sourceRoot":"","sources":["../../../src/tracing/services/request-id.provider.ts"],"names":[],"mappings":";;;AAKA,qCAAwD;AAE3C,QAAA,iBAAiB,GAAG,IAAA,iCAA0B,EAAS;IAClE,IAAI,EAAE,WAAW;IACjB,UAAU,EAAE,KAAK;CAClB,CAAC,CAAC;AAEU,QAAA,qBAAqB,GAAG,IAAA,iCAA0B,EAK5D;IACD,IAAI,EAAE,0BAA0B;IAChC,UAAU,EAAE,KAAK;CAClB,CAAC,CAAC"}
@@ -1,12 +1,12 @@
1
- import type { AttributeValue } from '@opentelemetry/api';
1
+ import type { AttributeValue, Span } from '@opentelemetry/api';
2
2
  export declare class TraceInjector {
3
3
  static wrap(cls: any, original: Function, descriptor?: TypedPropertyDescriptor<any>, isTracingInterceptor?: boolean): void;
4
4
  static toAttribute(data: unknown): AttributeValue;
5
5
  private static createWrapper;
6
- private static createSpanName;
6
+ static createSpanName(className: string, methodName: string): string;
7
7
  private static isWrapped;
8
8
  private static nowSpan;
9
9
  private static setWrapped;
10
- private static recordAndRethrow;
11
- private static enrich;
10
+ static recordAndRethrow(error: unknown, span: Span): void;
11
+ static enrich(span: Span, data: unknown): unknown;
12
12
  }
@@ -5,9 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.TraceInjector = void 0;
7
7
  const api_1 = require("@opentelemetry/api");
8
- const propagator_b3_1 = require("@opentelemetry/propagator-b3");
9
8
  const sdk_node_1 = require("@opentelemetry/sdk-node");
10
- const semantic_conventions_1 = require("@opentelemetry/semantic-conventions");
11
9
  const common_1 = require("@rsdk/common");
12
10
  const decorators_1 = require("@rsdk/decorators");
13
11
  const logging_1 = require("@rsdk/logging");
@@ -55,139 +53,19 @@ class TraceInjector {
55
53
  }
56
54
  return 'data is undefined';
57
55
  }
58
- static createWrapper(original, spanName, isTracingInterceptor) {
56
+ static createWrapper(original, spanName, _isTracingInterceptor) {
59
57
  return {
60
58
  [original.name](...args) {
61
59
  const tracer = api_1.trace.getTracer('@rsdk/open-telemetry', '1.0.0');
62
- const executionContext = args[0];
63
60
  /**
64
61
  * Переменный для хранения значений которые получаем для опен телеметрии
65
62
  */
66
63
  let traceId;
67
64
  let spanId;
68
- let parentSpanId;
69
- /**
70
- * Этот флаг нужен для детекта первого входа и старта трейсинга, логика использования ниже в контексте
71
- */
72
- let hasParentSpanId = false;
73
- /**
74
- * Переменная для хранения Request/виртуального рекRequestвеста
75
- */
76
- let req;
77
- /**
78
- * Первый вход обычно происходит в глобальном интерцепторе
79
- * он оборачивается в некий свой интернал тип спана который и передает этот флаг isTracingInterceptor=true
80
- */
81
- if (isTracingInterceptor) {
82
- if (executionContext.getType() === 'rpc') {
83
- const metadata = executionContext.switchToRpc().getContext();
84
- /**
85
- * Если мы пришли в GRPC и у нас есть методы для работы с Metadata
86
- * то мы конвертируем Metadata в некий виртуальный request с заголовками (заголовки выбраны как общий стандарт проброса мета информации)
87
- */
88
- if (metadata?.get) {
89
- req = {
90
- headers: {
91
- /**
92
- * Пробрасываем текущий трейс ид запроса
93
- */
94
- ...(metadata.get(propagator_b3_1.X_B3_TRACE_ID).length > 0
95
- ? {
96
- [propagator_b3_1.X_B3_TRACE_ID]: metadata.get(propagator_b3_1.X_B3_TRACE_ID)[0],
97
- }
98
- : {}),
99
- /**
100
- * Пробрасываем текущий спан ид, он нужен чтобы установить цепочку с парентами и могли видеть правильную вложенность в графане
101
- */
102
- ...(metadata.get(propagator_b3_1.X_B3_SPAN_ID).length > 0
103
- ? {
104
- [propagator_b3_1.X_B3_SPAN_ID]: metadata.get(propagator_b3_1.X_B3_SPAN_ID)[0],
105
- }
106
- : {}),
107
- /**
108
- * Вот это не обычная переменная, она нужна для определения общего входа и детекта рутового спан ид,
109
- * эта переменная нужна для работы флага hasParentSpanId
110
- */
111
- ...(metadata.get(propagator_b3_1.X_B3_PARENT_SPAN_ID).length > 0
112
- ? {
113
- [propagator_b3_1.X_B3_PARENT_SPAN_ID]: metadata.get(propagator_b3_1.X_B3_PARENT_SPAN_ID)[0],
114
- }
115
- : {}),
116
- },
117
- };
118
- }
119
- }
120
- if (executionContext.getType() === 'http') {
121
- req = executionContext.switchToHttp().getRequest();
122
- }
123
- if (executionContext.getType() === 'graphql') {
124
- req = executionContext.getArgs()[2]?.req; // аналог GqlExecutionContext.create(executionContext).getContext().req
125
- if (req.connectionInitReceived) {
126
- /**
127
- * При работе с сабскрипшен через веб сокет, заголовки передаются в опции подключения к сабскрипшен в переменную connectionParams
128
- * и мы перегоняем эти данные в request заголовки
129
- */
130
- req.headers = {
131
- ...req?.headers,
132
- ...Object.entries(req?.connectionParams?.headers || {}).reduce((acc, [key, value]) => {
133
- acc[key] = value;
134
- return acc;
135
- }, {}),
136
- };
137
- }
138
- }
139
- }
140
- if (req?.headers) {
141
- /**
142
- * Мы приводим все ключи заголовков к одному **lower_case** регистру, так как у разных транспортов разные регистры в именовании ключей для заголовков
143
- */
144
- req.headers = {
145
- ...Object.entries(req.headers).reduce((acc, [key, value]) => {
146
- acc[key.toLowerCase()] =
147
- req.headers[key.toLowerCase()] || value;
148
- return acc;
149
- }, {}),
150
- };
151
- /**
152
- * Трейс ид - входящий рутовый идентификатор, он по всем цепочкам идет
153
- */
154
- traceId = req.headers[propagator_b3_1.X_B3_TRACE_ID];
155
- /**
156
- * Спан ид - идентификатор который нужен для построения цепочки вызовов
157
- */
158
- spanId = req.headers[propagator_b3_1.X_B3_SPAN_ID];
159
- /**
160
- * Флаг определяет находимся ли мы на рутовой позиции (самая первая точка входа)
161
- * определяется просто - если с клиента не передали заголовок X_B3_PARENT_SPAN_ID то значит мы в точке входа,
162
- * иначе мы являемся частью другой общей цепочки
163
- */
164
- hasParentSpanId = !!Object.getOwnPropertyDescriptor(req.headers, propagator_b3_1.X_B3_PARENT_SPAN_ID);
165
- /**
166
- * Идентификатор родительского спана - больше нужен для определения рутового состояния в различных кодах по опен телеметрии
167
- */
168
- parentSpanId = req.headers[propagator_b3_1.X_B3_PARENT_SPAN_ID];
169
- }
170
- if (isTracingInterceptor) {
171
- /**
172
- * Когда мы находимся в интерцепторе, то названием спана является название класса + метод интерцептора
173
- * мы перебиваем на название класса + метод который трекаем
174
- */
175
- spanName = TraceInjector.createSpanName(executionContext.getClass().name, executionContext.getHandler().name);
176
- }
177
65
  /**
178
66
  * Создаем новый спан
179
67
  */
180
68
  const span = tracer.startSpan(spanName, {});
181
- // path parentSpanId for correct link to parent span
182
- if (isTracingInterceptor && hasParentSpanId && parentSpanId) {
183
- /**
184
- * Так как опентелеметрия ставит свой некий парент спан ид, то наш слетает
185
- * если мы работаем в рамках монолита то ничего не слетает
186
- * как только мы перемещаемся между приложениями - он слетает
187
- * чтобы иметь корректный парент спан ид - мы патчим его жестко (из коробки нельзя это сделать)
188
- */
189
- span.parentSpanId = parentSpanId;
190
- }
191
69
  /**
192
70
  * После создания контекста ранее при входе в приложение, у нас новый спан ид
193
71
  * мы перетираем значением которе получили через заголовок
@@ -203,15 +81,6 @@ class TraceInjector {
203
81
  if (traceId) {
204
82
  span.spanContext().traceId = traceId;
205
83
  }
206
- if (req?.headers) {
207
- /**
208
- * Обычно самая первая точка входа это фронтовый запрос, который содержит некие заголовки хттп
209
- * мы их кладем в рутовый спан
210
- */
211
- span.setAttribute(semantic_conventions_1.SemanticAttributes.HTTP_METHOD, req.method);
212
- span.setAttribute(semantic_conventions_1.SemanticAttributes.HTTP_URL, req.originalUrl || req.url);
213
- span.setAttribute(semantic_conventions_1.SemanticAttributes.HTTP_ROUTE, req.route?.path || req.routeOptions?.url || req.routerPath);
214
- }
215
84
  /**
216
85
  * Чтобы пробросить пропатченный спан нужно запустить две строчки ниже:
217
86
  * 1) создаем контекст в котором активный спан перебиваем новым