@mecanizou/telemetry-hub 1.0.0 → 1.0.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 (89) hide show
  1. package/.github/workflows/pull_request.yml +32 -32
  2. package/.github/workflows/release.yml +129 -129
  3. package/.prettierignore +4 -4
  4. package/DOCS_GUIDE.md +151 -0
  5. package/README.md +248 -0
  6. package/dist/check-if-is-working.js +1 -1
  7. package/dist/core/index.d.ts +2 -0
  8. package/dist/core/index.js +6 -0
  9. package/dist/core/logger.d.ts +13 -0
  10. package/dist/core/logger.js +123 -0
  11. package/dist/core/types.d.ts +43 -0
  12. package/dist/core/types.js +3 -0
  13. package/dist/index.d.ts +1 -1
  14. package/dist/index.js +2 -2
  15. package/dist/services/index.d.ts +1 -0
  16. package/dist/services/index.js +18 -0
  17. package/dist/services/telemetry/config.d.ts +20 -0
  18. package/dist/services/telemetry/config.js +113 -0
  19. package/dist/services/telemetry/external-service.d.ts +20 -0
  20. package/dist/services/telemetry/external-service.js +69 -0
  21. package/dist/services/telemetry/index.d.ts +3 -0
  22. package/dist/services/telemetry/index.js +20 -0
  23. package/dist/services/telemetry/sync-log-record-processor.d.ts +11 -0
  24. package/dist/services/telemetry/sync-log-record-processor.js +74 -0
  25. package/dist/sst/index.d.ts +1 -0
  26. package/dist/sst/index.js +18 -0
  27. package/dist/sst/middy/index.d.ts +1 -0
  28. package/dist/sst/middy/index.js +18 -0
  29. package/dist/sst/middy/middleware.d.ts +5 -0
  30. package/dist/sst/middy/middleware.js +172 -0
  31. package/dist/sst/telemetry.d.ts +3 -0
  32. package/dist/sst/telemetry.js +111 -0
  33. package/dist/telemetry/core/__tests__/logger-types.test.d.ts +1 -0
  34. package/dist/telemetry/core/__tests__/logger-types.test.js +325 -0
  35. package/dist/telemetry/core/__tests__/logger.test.d.ts +1 -0
  36. package/dist/telemetry/core/__tests__/logger.test.js +337 -0
  37. package/dist/telemetry/core/__tests__/tracer.test.d.ts +1 -0
  38. package/dist/telemetry/core/__tests__/tracer.test.js +330 -0
  39. package/dist/telemetry/core/index.d.ts +4 -0
  40. package/dist/telemetry/core/index.js +8 -0
  41. package/dist/telemetry/core/logger-types.d.ts +43 -0
  42. package/dist/telemetry/core/logger-types.js +3 -0
  43. package/dist/telemetry/core/logger.d.ts +13 -0
  44. package/dist/telemetry/core/logger.js +123 -0
  45. package/dist/telemetry/core/tracer-types.d.ts +50 -0
  46. package/dist/telemetry/core/tracer-types.js +3 -0
  47. package/dist/telemetry/core/tracer.d.ts +10 -0
  48. package/dist/telemetry/core/tracer.js +114 -0
  49. package/dist/telemetry/index.d.ts +3 -0
  50. package/dist/telemetry/index.js +20 -0
  51. package/dist/telemetry/sst/__tests__/telemetry.test.d.ts +1 -0
  52. package/dist/telemetry/sst/__tests__/telemetry.test.js +138 -0
  53. package/dist/telemetry/sst/index.d.ts +1 -0
  54. package/dist/telemetry/sst/index.js +18 -0
  55. package/dist/telemetry/sst/middy/index.d.ts +1 -0
  56. package/dist/telemetry/sst/middy/index.js +18 -0
  57. package/dist/telemetry/sst/middy/middleware.d.ts +5 -0
  58. package/dist/telemetry/sst/middy/middleware.js +157 -0
  59. package/dist/telemetry/sst/telemetry.d.ts +4 -0
  60. package/dist/telemetry/sst/telemetry.js +121 -0
  61. package/dist/telemetry/tsed/__tests__/config.test.d.ts +1 -0
  62. package/dist/telemetry/tsed/__tests__/config.test.js +146 -0
  63. package/dist/telemetry/tsed/__tests__/service.test.d.ts +1 -0
  64. package/dist/telemetry/tsed/__tests__/service.test.js +63 -0
  65. package/dist/telemetry/tsed/config.d.ts +26 -0
  66. package/dist/telemetry/tsed/config.js +166 -0
  67. package/dist/telemetry/tsed/index.d.ts +4 -0
  68. package/dist/telemetry/tsed/index.js +21 -0
  69. package/dist/telemetry/tsed/log-telemetry.d.ts +1 -0
  70. package/dist/telemetry/tsed/log-telemetry.js +196 -0
  71. package/dist/telemetry/tsed/service.d.ts +26 -0
  72. package/dist/telemetry/tsed/service.js +150 -0
  73. package/dist/telemetry/tsed/sync-log-record-processor.d.ts +11 -0
  74. package/dist/telemetry/tsed/sync-log-record-processor.js +74 -0
  75. package/dist/telemetry.d.ts +1 -0
  76. package/dist/telemetry.js +81 -0
  77. package/dist/tsed/config.d.ts +20 -0
  78. package/dist/tsed/config.js +113 -0
  79. package/dist/tsed/index.d.ts +3 -0
  80. package/dist/tsed/index.js +20 -0
  81. package/dist/tsed/log-telemetry.d.ts +1 -0
  82. package/dist/tsed/log-telemetry.js +81 -0
  83. package/dist/tsed/service.d.ts +24 -0
  84. package/dist/tsed/service.js +131 -0
  85. package/dist/tsed/sync-log-record-processor.d.ts +11 -0
  86. package/dist/tsed/sync-log-record-processor.js +74 -0
  87. package/package.json +72 -56
  88. package/release.config.js +23 -23
  89. package/vitest.config.ts +22 -0
@@ -0,0 +1,20 @@
1
+ import { LoggerProvider } from '@opentelemetry/sdk-logs';
2
+ export interface TsedTelemetryConfig {
3
+ endpoint: string;
4
+ username: string;
5
+ password: string;
6
+ serviceName?: string;
7
+ serviceVersion?: string;
8
+ enabled?: boolean;
9
+ }
10
+ export declare class TsedTelemetryProvider {
11
+ private loggerProvider;
12
+ private initialized;
13
+ constructor();
14
+ initialize(config: TsedTelemetryConfig): void;
15
+ getLoggerProvider(): LoggerProvider | null;
16
+ isInitialized(): boolean;
17
+ forceFlush(): Promise<void>;
18
+ shutdown(): Promise<void>;
19
+ $onDestroy(): Promise<void>;
20
+ }
@@ -0,0 +1,113 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.TsedTelemetryProvider = void 0;
13
+ const sdk_logs_1 = require("@opentelemetry/sdk-logs");
14
+ const exporter_logs_otlp_http_1 = require("@opentelemetry/exporter-logs-otlp-http");
15
+ const resources_1 = require("@opentelemetry/resources");
16
+ const semantic_conventions_1 = require("@opentelemetry/semantic-conventions");
17
+ const sync_log_record_processor_1 = require("./sync-log-record-processor");
18
+ class TsedTelemetryProvider {
19
+ constructor() {
20
+ this.loggerProvider = null;
21
+ this.initialized = false;
22
+ if (!this.initialized && process.env.OTEL_EXPORTER_OTLP_ENDPOINT) {
23
+ const serviceName = process.env.SERVICE_NAME || 'unknown-service';
24
+ const serviceStage = process.env.STAGE;
25
+ this.initialize({
26
+ endpoint: process.env.OTEL_EXPORTER_OTLP_ENDPOINT || '',
27
+ username: process.env.OTEL_EXPORTER_OTLP_USER || '',
28
+ password: process.env.OTEL_EXPORTER_OTLP_PASS || '',
29
+ serviceName: `${serviceName}-${serviceStage}`,
30
+ serviceVersion: process.env.npm_package_version || '1.0.0',
31
+ enabled: process.env.OTEL_ENABLED !== 'false',
32
+ });
33
+ }
34
+ }
35
+ initialize(config) {
36
+ if (this.initialized) {
37
+ return;
38
+ }
39
+ if (config.enabled === false) {
40
+ console.log('[Telemetry] OpenTelemetry is disabled');
41
+ return;
42
+ }
43
+ if (!config.endpoint || !config.username || !config.password) {
44
+ if (process.env.NODE_ENV !== 'test' &&
45
+ process.env.OTEL_EXPORTER_OTLP_ENDPOINT) {
46
+ console.error('[Telemetry] Missing required configuration');
47
+ }
48
+ return;
49
+ }
50
+ try {
51
+ const resource = new resources_1.Resource({
52
+ [semantic_conventions_1.ATTR_SERVICE_NAME]: config.serviceName || 'unknown-service',
53
+ [semantic_conventions_1.ATTR_SERVICE_VERSION]: config.serviceVersion || '1.0.0',
54
+ });
55
+ const logExporter = new exporter_logs_otlp_http_1.OTLPLogExporter({
56
+ url: `${config.endpoint}/v1/logs`,
57
+ headers: {
58
+ Authorization: `Basic ${Buffer.from(`${config.username}:${config.password}`).toString('base64')}`,
59
+ },
60
+ timeoutMillis: 5000,
61
+ concurrencyLimit: 1,
62
+ });
63
+ const syncProcessor = new sync_log_record_processor_1.TsedSyncLogRecordProcessor(logExporter);
64
+ this.loggerProvider = new sdk_logs_1.LoggerProvider({
65
+ resource,
66
+ });
67
+ this.loggerProvider.addLogRecordProcessor(syncProcessor);
68
+ this.initialized = true;
69
+ console.log('[Telemetry] OpenTelemetry initialized successfully');
70
+ }
71
+ catch (error) {
72
+ console.error('[Telemetry] Failed to initialize OpenTelemetry:', error);
73
+ }
74
+ }
75
+ getLoggerProvider() {
76
+ return this.loggerProvider;
77
+ }
78
+ isInitialized() {
79
+ return this.initialized;
80
+ }
81
+ forceFlush() {
82
+ return __awaiter(this, void 0, void 0, function* () {
83
+ if (!this.loggerProvider) {
84
+ console.warn('[Telemetry] forceFlush called but loggerProvider is null');
85
+ return;
86
+ }
87
+ try {
88
+ const startTime = Date.now();
89
+ console.log('[Telemetry] Starting forceFlush...');
90
+ yield this.loggerProvider.forceFlush();
91
+ const duration = Date.now() - startTime;
92
+ console.log(`[Telemetry] forceFlush completed successfully in ${duration}ms`);
93
+ }
94
+ catch (error) {
95
+ console.error('[Telemetry] Failed to force flush logs:', error);
96
+ throw error;
97
+ }
98
+ });
99
+ }
100
+ shutdown() {
101
+ return __awaiter(this, void 0, void 0, function* () {
102
+ if (this.loggerProvider) {
103
+ yield this.loggerProvider.shutdown();
104
+ this.initialized = false;
105
+ }
106
+ });
107
+ }
108
+ $onDestroy() {
109
+ return this.shutdown();
110
+ }
111
+ }
112
+ exports.TsedTelemetryProvider = TsedTelemetryProvider;
113
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3RlbGVtZXRyeS90c2VkL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQSxzREFBeUQ7QUFDekQsb0ZBQXlFO0FBQ3pFLHdEQUFvRDtBQUNwRCw4RUFHNkM7QUFDN0MsMkVBQXlFO0FBV3pFLE1BQWEscUJBQXFCO0lBSWhDO1FBSFEsbUJBQWMsR0FBMEIsSUFBSSxDQUFDO1FBQzdDLGdCQUFXLEdBQUcsS0FBSyxDQUFDO1FBSTFCLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztZQUNqRSxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksSUFBSSxpQkFBaUIsQ0FBQztZQUNsRSxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQztZQUN2QyxJQUFJLENBQUMsVUFBVSxDQUFDO2dCQUNkLFFBQVEsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLDJCQUEyQixJQUFJLEVBQUU7Z0JBQ3ZELFFBQVEsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLHVCQUF1QixJQUFJLEVBQUU7Z0JBQ25ELFFBQVEsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLHVCQUF1QixJQUFJLEVBQUU7Z0JBQ25ELFdBQVcsRUFBRSxHQUFHLFdBQVcsSUFBSSxZQUFZLEVBQUU7Z0JBQzdDLGNBQWMsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixJQUFJLE9BQU87Z0JBQzFELE9BQU8sRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksS0FBSyxPQUFPO2FBQzlDLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO0lBRU0sVUFBVSxDQUFDLE1BQTJCO1FBQzNDLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3JCLE9BQU87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QUFDO1FBQ0gsQ0FBQztLQUFBO0lBRVksUUFBUTs7WUFDbkIsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3hCLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDckMsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7WUFDM0IsQ0FBQztRQUNILENBQUM7S0FBQTtJQUVELFVBQVU7UUFDUixPQUFPLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUN6QixDQUFDO0NBQ0Y7QUE1SEQsc0RBNEhDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTG9nZ2VyUHJvdmlkZXIgfSBmcm9tICdAb3BlbnRlbGVtZXRyeS9zZGstbG9ncyc7XHJcbmltcG9ydCB7IE9UTFBMb2dFeHBvcnRlciB9IGZyb20gJ0BvcGVudGVsZW1ldHJ5L2V4cG9ydGVyLWxvZ3Mtb3RscC1odHRwJztcclxuaW1wb3J0IHsgUmVzb3VyY2UgfSBmcm9tICdAb3BlbnRlbGVtZXRyeS9yZXNvdXJjZXMnO1xyXG5pbXBvcnQge1xyXG4gIEFUVFJfU0VSVklDRV9OQU1FLFxyXG4gIEFUVFJfU0VSVklDRV9WRVJTSU9OLFxyXG59IGZyb20gJ0BvcGVudGVsZW1ldHJ5L3NlbWFudGljLWNvbnZlbnRpb25zJztcclxuaW1wb3J0IHsgVHNlZFN5bmNMb2dSZWNvcmRQcm9jZXNzb3IgfSBmcm9tICcuL3N5bmMtbG9nLXJlY29yZC1wcm9jZXNzb3InO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBUc2VkVGVsZW1ldHJ5Q29uZmlnIHtcclxuICBlbmRwb2ludDogc3RyaW5nO1xyXG4gIHVzZXJuYW1lOiBzdHJpbmc7XHJcbiAgcGFzc3dvcmQ6IHN0cmluZztcclxuICBzZXJ2aWNlTmFtZT86IHN0cmluZztcclxuICBzZXJ2aWNlVmVyc2lvbj86IHN0cmluZztcclxuICBlbmFibGVkPzogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFRzZWRUZWxlbWV0cnlQcm92aWRlciB7XHJcbiAgcHJpdmF0ZSBsb2dnZXJQcm92aWRlcjogTG9nZ2VyUHJvdmlkZXIgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIGluaXRpYWxpemVkID0gZmFsc2U7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgLy8gQXV0by1pbml0aWFsaXplIHN5bmNocm9ub3VzbHkgd2l0aCBlbnZpcm9ubWVudCB2YXJpYWJsZXNcclxuICAgIGlmICghdGhpcy5pbml0aWFsaXplZCAmJiBwcm9jZXNzLmVudi5PVEVMX0VYUE9SVEVSX09UTFBfRU5EUE9JTlQpIHtcclxuICAgICAgY29uc3Qgc2VydmljZU5hbWUgPSBwcm9jZXNzLmVudi5TRVJWSUNFX05BTUUgfHwgJ3Vua25vd24tc2VydmljZSc7XHJcbiAgICAgIGNvbnN0IHNlcnZpY2VTdGFnZSA9IHByb2Nlc3MuZW52LlNUQUdFO1xyXG4gICAgICB0aGlzLmluaXRpYWxpemUoe1xyXG4gICAgICAgIGVuZHBvaW50OiBwcm9jZXNzLmVudi5PVEVMX0VYUE9SVEVSX09UTFBfRU5EUE9JTlQgfHwgJycsXHJcbiAgICAgICAgdXNlcm5hbWU6IHByb2Nlc3MuZW52Lk9URUxfRVhQT1JURVJfT1RMUF9VU0VSIHx8ICcnLFxyXG4gICAgICAgIHBhc3N3b3JkOiBwcm9jZXNzLmVudi5PVEVMX0VYUE9SVEVSX09UTFBfUEFTUyB8fCAnJyxcclxuICAgICAgICBzZXJ2aWNlTmFtZTogYCR7c2VydmljZU5hbWV9LSR7c2VydmljZVN0YWdlfWAsXHJcbiAgICAgICAgc2VydmljZVZlcnNpb246IHByb2Nlc3MuZW52Lm5wbV9wYWNrYWdlX3ZlcnNpb24gfHwgJzEuMC4wJyxcclxuICAgICAgICBlbmFibGVkOiBwcm9jZXNzLmVudi5PVEVMX0VOQUJMRUQgIT09ICdmYWxzZScsXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGluaXRpYWxpemUoY29uZmlnOiBUc2VkVGVsZW1ldHJ5Q29uZmlnKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5pbml0aWFsaXplZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNvbmZpZy5lbmFibGVkID09PSBmYWxzZSkge1xyXG4gICAgICBjb25zb2xlLmxvZygnW1RlbGVtZXRyeV0gT3BlblRlbGVtZXRyeSBpcyBkaXNhYmxlZCcpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFjb25maWcuZW5kcG9pbnQgfHwgIWNvbmZpZy51c2VybmFtZSB8fCAhY29uZmlnLnBhc3N3b3JkKSB7XHJcbiAgICAgIC8vIE7Do28gbG9nYXIgZXJybyBzZSBlc3RpdmVybW9zIGVtIG1vZG8gZGUgYnVpbGRcclxuICAgICAgaWYgKFxyXG4gICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAndGVzdCcgJiZcclxuICAgICAgICBwcm9jZXNzLmVudi5PVEVMX0VYUE9SVEVSX09UTFBfRU5EUE9JTlRcclxuICAgICAgKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignW1RlbGVtZXRyeV0gTWlzc2luZyByZXF1aXJlZCBjb25maWd1cmF0aW9uJyk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIC8vIENyZWF0ZSByZXNvdXJjZSB3aXRoIHNlcnZpY2UgaW5mb3JtYXRpb25cclxuICAgICAgY29uc3QgcmVzb3VyY2UgPSBuZXcgUmVzb3VyY2Uoe1xyXG4gICAgICAgIFtBVFRSX1NFUlZJQ0VfTkFNRV06IGNvbmZpZy5zZXJ2aWNlTmFtZSB8fCAndW5rbm93bi1zZXJ2aWNlJyxcclxuICAgICAgICBbQVRUUl9TRVJWSUNFX1ZFUlNJT05dOiBjb25maWcuc2VydmljZVZlcnNpb24gfHwgJzEuMC4wJyxcclxuICAgICAgfSk7XHJcblxyXG4gICAgICAvLyBDcmVhdGUgT1RMUCBleHBvcnRlciB3aXRoIGF1dGhlbnRpY2F0aW9uIGFuZCB0aW1lb3V0IGNvbmZpZ3VyYXRpb25cclxuICAgICAgY29uc3QgbG9nRXhwb3J0ZXIgPSBuZXcgT1RMUExvZ0V4cG9ydGVyKHtcclxuICAgICAgICB1cmw6IGAke2NvbmZpZy5lbmRwb2ludH0vdjEvbG9nc2AsXHJcbiAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgQXV0aG9yaXphdGlvbjogYEJhc2ljICR7QnVmZmVyLmZyb20oYCR7Y29uZmlnLnVzZXJuYW1lfToke2NvbmZpZy5wYXNzd29yZH1gKS50b1N0cmluZygnYmFzZTY0Jyl9YCxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHRpbWVvdXRNaWxsaXM6IDUwMDAsIC8vIDUgc2Vjb25kIHRpbWVvdXQgZm9yIGV4cG9ydHNcclxuICAgICAgICBjb25jdXJyZW5jeUxpbWl0OiAxLCAvLyBQcm9jZXNzIG9uZSBleHBvcnQgYXQgYSB0aW1lXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgLy8gVXNlIGN1c3RvbSBTeW5jTG9nUmVjb3JkUHJvY2Vzc29yIGluc3RlYWQgb2YgU2ltcGxlTG9nUmVjb3JkUHJvY2Vzc29yXHJcbiAgICAgIC8vIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBhc3luYyBIVFRQIGV4cG9ydCBpcyBwcm9wZXJseSBhd2FpdGVkIGluIExhbWJkYVxyXG4gICAgICAvLyBlbnZpcm9ubWVudHMgd2hlcmUgZXhlY3V0aW9uIGNvbnRleHQgZnJlZXplcyBhZnRlciBoYW5kbGVyIHJldHVybnNcclxuICAgICAgY29uc3Qgc3luY1Byb2Nlc3NvciA9IG5ldyBUc2VkU3luY0xvZ1JlY29yZFByb2Nlc3Nvcihsb2dFeHBvcnRlcik7XHJcblxyXG4gICAgICAvLyBDcmVhdGUgbG9nZ2VyIHByb3ZpZGVyIHdpdGggcmVzb3VyY2UgYW5kIHByb2Nlc3NvcnNcclxuICAgICAgdGhpcy5sb2dnZXJQcm92aWRlciA9IG5ldyBMb2dnZXJQcm92aWRlcih7XHJcbiAgICAgICAgcmVzb3VyY2UsXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgLy8gQWRkIHByb2Nlc3NvciBhZnRlciBjcmVhdGlvblxyXG4gICAgICB0aGlzLmxvZ2dlclByb3ZpZGVyLmFkZExvZ1JlY29yZFByb2Nlc3NvcihzeW5jUHJvY2Vzc29yKTtcclxuXHJcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgICBjb25zb2xlLmxvZygnW1RlbGVtZXRyeV0gT3BlblRlbGVtZXRyeSBpbml0aWFsaXplZCBzdWNjZXNzZnVsbHknKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tUZWxlbWV0cnldIEZhaWxlZCB0byBpbml0aWFsaXplIE9wZW5UZWxlbWV0cnk6JywgZXJyb3IpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldExvZ2dlclByb3ZpZGVyKCk6IExvZ2dlclByb3ZpZGVyIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5sb2dnZXJQcm92aWRlcjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc0luaXRpYWxpemVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaW5pdGlhbGl6ZWQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGb3JjZSBmbHVzaCBhbGwgcGVuZGluZyBsb2dzIHRvIGVuc3VyZSB0aGV5IGFyZSBzZW50IGJlZm9yZSBMYW1iZGEgZnJlZXplc1xyXG4gICAqIFRoaXMgaXMgY3JpdGljYWwgaW4gQVdTIExhbWJkYSBlbnZpcm9ubWVudHMgd2hlcmUgZXhlY3V0aW9uIGNvbnRleHQgZnJlZXplc1xyXG4gICAqIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBoYW5kbGVyIHJldHVybnMsIHBvdGVudGlhbGx5IGJlZm9yZSBhc3luYyBIVFRQIHJlcXVlc3RzIGNvbXBsZXRlXHJcbiAgICovXHJcbiAgcHVibGljIGFzeW5jIGZvcmNlRmx1c2goKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoIXRoaXMubG9nZ2VyUHJvdmlkZXIpIHtcclxuICAgICAgY29uc29sZS53YXJuKCdbVGVsZW1ldHJ5XSBmb3JjZUZsdXNoIGNhbGxlZCBidXQgbG9nZ2VyUHJvdmlkZXIgaXMgbnVsbCcpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcclxuICAgICAgY29uc29sZS5sb2coJ1tUZWxlbWV0cnldIFN0YXJ0aW5nIGZvcmNlRmx1c2guLi4nKTtcclxuXHJcbiAgICAgIC8vIGZvcmNlRmx1c2ggZW5zdXJlcyBhbGwgcGVuZGluZyBsb2dzIGFyZSBleHBvcnRlZCBpbW1lZGlhdGVseVxyXG4gICAgICBhd2FpdCB0aGlzLmxvZ2dlclByb3ZpZGVyLmZvcmNlRmx1c2goKTtcclxuXHJcbiAgICAgIGNvbnN0IGR1cmF0aW9uID0gRGF0ZS5ub3coKSAtIHN0YXJ0VGltZTtcclxuICAgICAgY29uc29sZS5sb2coXHJcbiAgICAgICAgYFtUZWxlbWV0cnldIGZvcmNlRmx1c2ggY29tcGxldGVkIHN1Y2Nlc3NmdWxseSBpbiAke2R1cmF0aW9ufW1zYFxyXG4gICAgICApO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5lcnJvcignW1RlbGVtZXRyeV0gRmFpbGVkIHRvIGZvcmNlIGZsdXNoIGxvZ3M6JywgZXJyb3IpO1xyXG4gICAgICB0aHJvdyBlcnJvcjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBzaHV0ZG93bigpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh0aGlzLmxvZ2dlclByb3ZpZGVyKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMubG9nZ2VyUHJvdmlkZXIuc2h1dGRvd24oKTtcclxuICAgICAgdGhpcy5pbml0aWFsaXplZCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJG9uRGVzdHJveSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHJldHVybiB0aGlzLnNodXRkb3duKCk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
@@ -0,0 +1,3 @@
1
+ export * from './config';
2
+ export * from './service';
3
+ export * from './log-telemetry';
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./config"), exports);
18
+ __exportStar(require("./service"), exports);
19
+ __exportStar(require("./log-telemetry"), exports);
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVsZW1ldHJ5L3RzZWQvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDJDQUF5QjtBQUN6Qiw0Q0FBMEI7QUFDMUIsa0RBQWdDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9jb25maWcnO1xyXG5leHBvcnQgKiBmcm9tICcuL3NlcnZpY2UnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xvZy10ZWxlbWV0cnknO1xyXG4iXX0=
@@ -0,0 +1 @@
1
+ export declare function TsedLogTelemetry(): (_target: any, _propertyKey: string, descriptor: PropertyDescriptor) => PropertyDescriptor;
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.TsedLogTelemetry = TsedLogTelemetry;
13
+ const service_1 = require("./service");
14
+ function TsedLogTelemetry() {
15
+ return function (_target, _propertyKey, descriptor) {
16
+ const originalMethod = descriptor.value;
17
+ const methodName = _propertyKey;
18
+ descriptor.value = function (...args) {
19
+ return __awaiter(this, void 0, void 0, function* () {
20
+ var _a, _b, _c, _d, _e, _f, _g;
21
+ const $ctx = args.find((arg) => (arg === null || arg === void 0 ? void 0 : arg.request) && (arg === null || arg === void 0 ? void 0 : arg.response));
22
+ let controllerName = 'UnknownController';
23
+ if (((_a = this === null || this === void 0 ? void 0 : this.constructor) === null || _a === void 0 ? void 0 : _a.name) && this.constructor.name !== 'Object') {
24
+ controllerName = this.constructor.name;
25
+ }
26
+ if (!$ctx) {
27
+ console.warn('[LogTelemetry] Context not found, executing without telemetry');
28
+ return yield originalMethod.apply(this, args);
29
+ }
30
+ let telemetryService;
31
+ try {
32
+ if ($ctx.injector) {
33
+ telemetryService = $ctx.injector.get(service_1.TsedTelemetryService);
34
+ }
35
+ }
36
+ catch (error) {
37
+ (_b = $ctx.logger) === null || _b === void 0 ? void 0 : _b.warn({
38
+ 'LogTelemetry - Failed to get TelemetryService from injector': error,
39
+ });
40
+ }
41
+ if (!telemetryService) {
42
+ (_c = $ctx.logger) === null || _c === void 0 ? void 0 : _c.warn('[LogTelemetry] TelemetryService not available, executing without telemetry');
43
+ return yield originalMethod.apply(this, args);
44
+ }
45
+ try {
46
+ const result = yield originalMethod.apply(this, args);
47
+ return result;
48
+ }
49
+ catch (error) {
50
+ (_d = $ctx.logger) === null || _d === void 0 ? void 0 : _d.info('Error caught, sending to telemetry');
51
+ const request = $ctx.request;
52
+ let userInfo = {};
53
+ try {
54
+ if (typeof LoggedUserIdentifier !== 'undefined') {
55
+ const { loggedUser } = LoggedUserIdentifier.use($ctx);
56
+ userInfo = {
57
+ accountUserUid: loggedUser === null || loggedUser === void 0 ? void 0 : loggedUser.uid,
58
+ accountUid: (_e = loggedUser === null || loggedUser === void 0 ? void 0 : loggedUser.account) === null || _e === void 0 ? void 0 : _e.uid,
59
+ applicationUid: (_f = loggedUser === null || loggedUser === void 0 ? void 0 : loggedUser.application) === null || _f === void 0 ? void 0 : _f.uid,
60
+ };
61
+ }
62
+ }
63
+ catch (e) {
64
+ }
65
+ yield telemetryService.logError(Object.assign(Object.assign({ error: error, context: {
66
+ statusCode: error.status || 500,
67
+ url: request.url,
68
+ headers: request.headers,
69
+ body: request.body,
70
+ params: request.params,
71
+ query: request.query,
72
+ } }, userInfo), { requestId: $ctx.id, awsRequestId: (_g = $ctx.context) === null || _g === void 0 ? void 0 : _g.awsRequestId, endpoint: request.url, method: request.method, controller: controllerName, controllerMethod: methodName }));
73
+ $ctx.logger.info('Error sent to telemetry');
74
+ throw error;
75
+ }
76
+ });
77
+ };
78
+ return descriptor;
79
+ };
80
+ }
81
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nLXRlbGVtZXRyeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZWxlbWV0cnkvdHNlZC9sb2ctdGVsZW1ldHJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBWUEsNENBdUdDO0FBekdELHVDQUFpRDtBQUVqRCxTQUFnQixnQkFBZ0I7SUFDOUIsT0FBTyxVQUNMLE9BQVksRUFDWixZQUFvQixFQUNwQixVQUE4QjtRQUU5QixNQUFNLGNBQWMsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDO1FBQ3hDLE1BQU0sVUFBVSxHQUFHLFlBQVksQ0FBQztRQUVoQyxVQUFVLENBQUMsS0FBSyxHQUFHLFVBQTJCLEdBQUcsSUFBVzs7O2dCQUUxRCxNQUFNLElBQUksR0FBc0IsSUFBSSxDQUFDLElBQUksQ0FDdkMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUEsR0FBRyxhQUFILEdBQUcsdUJBQUgsR0FBRyxDQUFFLE9BQU8sTUFBSSxHQUFHLGFBQUgsR0FBRyx1QkFBSCxHQUFHLENBQUUsUUFBUSxDQUFBLENBQ3ZDLENBQUM7Z0JBR0YsSUFBSSxjQUFjLEdBQUcsbUJBQW1CLENBQUM7Z0JBRXpDLElBQUksQ0FBQSxNQUFBLElBQUksYUFBSixJQUFJLHVCQUFKLElBQUksQ0FBRSxXQUFXLDBDQUFFLElBQUksS0FBSSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztvQkFDbEUsY0FBYyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDO2dCQUN6QyxDQUFDO2dCQUVELElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztvQkFDVixPQUFPLENBQUMsSUFBSSxDQUNWLCtEQUErRCxDQUNoRSxDQUFDO29CQUNGLE9BQU8sTUFBTSxjQUFjLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDaEQsQ0FBQztnQkFHRCxJQUFJLGdCQUFrRCxDQUFDO2dC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b3MgYXV0b21hdGljYW1lbnRlIGUgZW52aWEgcGFyYSB0ZWxlbWV0cmlhXHJcbiAqIFVzbyBubyBjb250cm9sbGVyOlxyXG4gKlxyXG4gKiBATG9nVGVsZW1ldHJ5KClcclxuICogYXN5bmMgZ2V0Q2hlY2tvdXQoQENvbnRleHQoKSAkY3R4OiBTZXJ2ZXJsZXNzQ29udGV4dCwgLi4uKSB7XHJcbiAqICAgcmV0dXJuIGF3YWl0IHRoaXMuc2VydmljZS5leGVjdXRlKHBhcmFtcyk7XHJcbiAqIH1cclxuICovXHJcbmltcG9ydCB7IFNlcnZlcmxlc3NDb250ZXh0IH0gZnJvbSAnQHRzZWQvcGxhdGZvcm0tc2VydmVybGVzcyc7XHJcbmltcG9ydCB7IFRzZWRUZWxlbWV0cnlTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlJztcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBUc2VkTG9nVGVsZW1ldHJ5KCkge1xyXG4gIHJldHVybiBmdW5jdGlvbiAoXHJcbiAgICBfdGFyZ2V0OiBhbnksXHJcbiAgICBfcHJvcGVydHlLZXk6IHN0cmluZyxcclxuICAgIGRlc2NyaXB0b3I6IFByb3BlcnR5RGVzY3JpcHRvclxyXG4gICkge1xyXG4gICAgY29uc3Qgb3JpZ2luYWxNZXRob2QgPSBkZXNjcmlwdG9yLnZhbHVlO1xyXG4gICAgY29uc3QgbWV0aG9kTmFtZSA9IF9wcm9wZXJ0eUtleTtcclxuXHJcbiAgICBkZXNjcmlwdG9yLnZhbHVlID0gYXN5bmMgZnVuY3Rpb24gKHRoaXM6IGFueSwgLi4uYXJnczogYW55W10pIHtcclxuICAgICAgLy8gRW5jb250cmFyIG8gY29udGV4dG9cclxuICAgICAgY29uc3QgJGN0eDogU2VydmVybGVzc0NvbnRleHQgPSBhcmdzLmZpbmQoXHJcbiAgICAgICAgKGFyZykgPT4gYXJnPy5yZXF1ZXN0ICYmIGFyZz8ucmVzcG9uc2VcclxuICAgICAgKTtcclxuXHJcbiAgICAgIC8vIENhcHR1cmFyIG8gbm9tZSBkbyBjb250cm9sbGVyIC0gdGVudGFyIHbDoXJpYXMgZm9udGVzXHJcbiAgICAgIGxldCBjb250cm9sbGVyTmFtZSA9ICdVbmtub3duQ29udHJvbGxlcic7XHJcblxyXG4gICAgICBpZiAodGhpcz8uY29uc3RydWN0b3I/Lm5hbWUgJiYgdGhpcy5jb25zdHJ1Y3Rvci5uYW1lICE9PSAnT2JqZWN0Jykge1xyXG4gICAgICAgIGNvbnRyb2xsZXJOYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoISRjdHgpIHtcclxuICAgICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgICAnW0xvZ1RlbGVtZXRyeV0gQ29udGV4dCBub3QgZm91bmQsIGV4ZWN1dGluZyB3aXRob3V0IHRlbGVtZXRyeSdcclxuICAgICAgICApO1xyXG4gICAgICAgIHJldHVybiBhd2FpdCBvcmlnaW5hbE1ldGhvZC5hcHBseSh0aGlzLCBhcmdzKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gQnVzY2FyIG8gVGVsZW1ldHJ5U2VydmljZSBkbyBJbmplY3RvclNlcnZpY2UgZG8gY29udGV4dG9cclxuICAgICAgbGV0IHRlbGVtZXRyeVNlcnZpY2U6IFRzZWRUZWxlbWV0cnlTZXJ2aWNlIHwgdW5kZWZpbmVkO1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGlmICgkY3R4LmluamVjdG9yKSB7XHJcbiAgICAgICAgICB0ZWxlbWV0cnlTZXJ2aWNlID0gJGN0eC5pbmplY3Rvci5nZXQoXHJcbiAgICAgICAgICAgIFRzZWRUZWxlbWV0cnlTZXJ2aWNlXHJcbiAgICAgICAgICApIGFzIFRzZWRUZWxlbWV0cnlTZXJ2aWNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAkY3R4LmxvZ2dlcj8ud2Fybih7XHJcbiAgICAgICAgICAnTG9nVGVsZW1ldHJ5IC0gRmFpbGVkIHRvIGdldCBUZWxlbWV0cnlTZXJ2aWNlIGZyb20gaW5qZWN0b3InOiBlcnJvcixcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCF0ZWxlbWV0cnlTZXJ2aWNlKSB7XHJcbiAgICAgICAgJGN0eC5sb2dnZXI/Lndhcm4oXHJcbiAgICAgICAgICAnW0xvZ1RlbGVtZXRyeV0gVGVsZW1ldHJ5U2VydmljZSBub3QgYXZhaWxhYmxlLCBleGVjdXRpbmcgd2l0aG91dCB0ZWxlbWV0cnknXHJcbiAgICAgICAgKTtcclxuICAgICAgICByZXR1cm4gYXdhaXQgb3JpZ2luYWxNZXRob2QuYXBwbHkodGhpcywgYXJncyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgb3JpZ2luYWxNZXRob2QuYXBwbHkodGhpcywgYXJncyk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xyXG4gICAgICAgICRjdHgubG9nZ2VyPy5pbmZvKCdFcnJvciBjYXVnaHQsIHNlbmRpbmcgdG8gdGVsZW1ldHJ5Jyk7XHJcbiAgICAgICAgLy8gRXh0cmFpciBpbmZvcm1hw6fDtWVzIGRvIHVzdcOhcmlvXHJcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9ICRjdHgucmVxdWVzdDtcclxuXHJcbiAgICAgICAgLy8gVGVudGFyIGV4dHJhaXIgZGFkb3MgZG8gdXN1w6FyaW8gc2UgZGlzcG9uw612ZWxcclxuICAgICAgICAvLyBMb2dnZWRVc2VySWRlbnRpZmllciBkZXZlIHNlciBmb3JuZWNpZG8gcGVsYSBhcGxpY2HDp8Ojb1xyXG4gICAgICAgIGxldCB1c2VySW5mbzogYW55ID0ge307XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIC8vIEB0cy1pZ25vcmUgLSBMb2dnZWRVc2VySWRlbnRpZmllciDDqSBlc3BlY8OtZmljbyBkYSBhcGxpY2HDp8Ojb1xyXG4gICAgICAgICAgaWYgKHR5cGVvZiBMb2dnZWRVc2VySWRlbnRpZmllciAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICBjb25zdCB7IGxvZ2dlZFVzZXIgfSA9IExvZ2dlZFVzZXJJZGVudGlmaWVyLnVzZSgkY3R4KTtcclxuICAgICAgICAgICAgdXNlckluZm8gPSB7XHJcbiAgICAgICAgICAgICAgYWNjb3VudFVzZXJVaWQ6IGxvZ2dlZFVzZXI/LnVpZCxcclxuICAgICAgICAgICAgICBhY2NvdW50VWlkOiBsb2dnZWRVc2VyPy5hY2NvdW50Py51aWQsXHJcbiAgICAgICAgICAgICAgYXBwbGljYXRpb25VaWQ6IGxvZ2dlZFVzZXI/LmFwcGxpY2F0aW9uPy51aWQsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgLy8gTG9nZ2VkVXNlcklkZW50aWZpZXIgbsOjbyBlc3TDoSBkaXNwb27DrXZlbCwgY29udGludWFyIHNlbSB1c2VyIGluZm9cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGF3YWl0IHRlbGVtZXRyeVNlcnZpY2UubG9nRXJyb3Ioe1xyXG4gICAgICAgICAgZXJyb3I6IGVycm9yLFxyXG4gICAgICAgICAgY29udGV4dDoge1xyXG4gICAgICAgICAgICBzdGF0dXNDb2RlOiBlcnJvci5zdGF0dXMgfHwgNTAwLFxyXG4gICAgICAgICAgICB1cmw6IHJlcXVlc3QudXJsLFxyXG4gICAgICAgICAgICBoZWFkZXJzOiByZXF1ZXN0LmhlYWRlcnMsXHJcbiAgICAgICAgICAgIGJvZHk6IHJlcXVlc3QuYm9keSxcclxuICAgICAgICAgICAgcGFyYW1zOiByZXF1ZXN0LnBhcmFtcyxcclxuICAgICAgICAgICAgcXVlcnk6IHJlcXVlc3QucXVlcnksXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgLi4udXNlckluZm8sXHJcbiAgICAgICAgICByZXF1ZXN0SWQ6ICRjdHguaWQsXHJcbiAgICAgICAgICBhd3NSZXF1ZXN0SWQ6ICRjdHguY29udGV4dD8uYXdzUmVxdWVzdElkLFxyXG4gICAgICAgICAgZW5kcG9pbnQ6IHJlcXVlc3QudXJsLFxyXG4gICAgICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcclxuICAgICAgICAgIGNvbnRyb2xsZXI6IGNvbnRyb2xsZXJOYW1lLFxyXG4gICAgICAgICAgY29udHJvbGxlck1ldGhvZDogbWV0aG9kTmFtZSxcclxuICAgICAgICB9KTtcclxuICAgICAgICAkY3R4LmxvZ2dlci5pbmZvKCdFcnJvciBzZW50IHRvIHRlbGVtZXRyeScpO1xyXG5cclxuICAgICAgICAvLyBSZS10aHJvdyBwYXJhIG1hbnRlciBvIGNvbXBvcnRhbWVudG8gbm9ybWFsIGRlIGVycm9cclxuICAgICAgICB0aHJvdyBlcnJvcjtcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gZGVzY3JpcHRvcjtcclxuICB9O1xyXG59XHJcbiJdfQ==
@@ -0,0 +1,24 @@
1
+ import { ServerlessContext } from '@tsed/platform-serverless';
2
+ import { TsedTelemetryProvider } from './config';
3
+ export interface ErrorLogData {
4
+ error: Error;
5
+ context?: Record<string, any>;
6
+ accountUserUid?: string;
7
+ accountUid?: string;
8
+ requestId?: string;
9
+ endpoint?: string;
10
+ method?: string;
11
+ controller?: string;
12
+ controllerMethod?: string;
13
+ applicationUid?: string;
14
+ awsRequestId?: string;
15
+ }
16
+ export declare class TsedTelemetryService {
17
+ private readonly telemetryProvider;
18
+ protected $ctx: ServerlessContext;
19
+ private standardLogger;
20
+ constructor(telemetryProvider: TsedTelemetryProvider);
21
+ private getLogger;
22
+ logError(data: ErrorLogData): Promise<void>;
23
+ logException(error: Error, context?: Record<string, any>): Promise<void>;
24
+ }
@@ -0,0 +1,131 @@
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
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
15
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
16
+ return new (P || (P = Promise))(function (resolve, reject) {
17
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
18
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
19
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
20
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
21
+ });
22
+ };
23
+ Object.defineProperty(exports, "__esModule", { value: true });
24
+ exports.TsedTelemetryService = void 0;
25
+ const di_1 = require("@tsed/di");
26
+ const platform_serverless_1 = require("@tsed/platform-serverless");
27
+ const config_1 = require("./config");
28
+ const core_1 = require("../core");
29
+ let TsedTelemetryService = class TsedTelemetryService {
30
+ constructor(telemetryProvider) {
31
+ this.telemetryProvider = telemetryProvider;
32
+ this.standardLogger = null;
33
+ }
34
+ getLogger() {
35
+ var _a;
36
+ if (!this.telemetryProvider.isInitialized()) {
37
+ (_a = this.$ctx) === null || _a === void 0 ? void 0 : _a.logger.warn('[Telemetry] Telemetry not initialized, skipping log');
38
+ return null;
39
+ }
40
+ if (!this.standardLogger) {
41
+ const loggerProvider = this.telemetryProvider.getLoggerProvider();
42
+ if (!loggerProvider) {
43
+ return null;
44
+ }
45
+ const otelLogger = loggerProvider.getLogger('tsed-service-logger', '1.0.0');
46
+ const serviceName = process.env.SERVICE_NAME || 'tsed-service';
47
+ this.standardLogger = new core_1.StandardLogger(otelLogger, serviceName);
48
+ }
49
+ return this.standardLogger;
50
+ }
51
+ logError(data) {
52
+ return __awaiter(this, void 0, void 0, function* () {
53
+ var _a, _b, _c, _d;
54
+ const logger = this.getLogger();
55
+ if (!logger) {
56
+ return;
57
+ }
58
+ try {
59
+ let stage = process.env.STAGE || 'development';
60
+ if (stage === 'prod')
61
+ stage = 'production';
62
+ (_a = this.$ctx) === null || _a === void 0 ? void 0 : _a.logger.info('[Telemetry] Logging error...');
63
+ yield logger.logError({
64
+ message: data.error.message,
65
+ error: data.error,
66
+ serviceName: process.env.SERVICE_NAME || 'tsed-service',
67
+ environment: stage,
68
+ http: {
69
+ endpoint: data.endpoint,
70
+ method: data.method,
71
+ statusCode: data.error.status || 500,
72
+ },
73
+ user: {
74
+ accountUserUid: data.accountUserUid,
75
+ accountUid: data.accountUid,
76
+ applicationUid: data.applicationUid,
77
+ },
78
+ execution: {
79
+ requestId: data.requestId,
80
+ awsRequestId: data.awsRequestId,
81
+ controller: data.controller,
82
+ controllerMethod: data.controllerMethod,
83
+ },
84
+ context: data.context,
85
+ });
86
+ (_b = this.$ctx) === null || _b === void 0 ? void 0 : _b.logger.info('[Telemetry] Forcing flush...');
87
+ const flushStartTime = Date.now();
88
+ yield this.telemetryProvider.forceFlush();
89
+ const flushDuration = Date.now() - flushStartTime;
90
+ (_c = this.$ctx) === null || _c === void 0 ? void 0 : _c.logger.info({
91
+ 'Telemetry - Log sent successfully': {
92
+ errorType: data.error.name,
93
+ message: data.error.message,
94
+ endpoint: data.endpoint,
95
+ controller: data.controller,
96
+ method: data.controllerMethod,
97
+ flushDurationMs: flushDuration,
98
+ },
99
+ });
100
+ }
101
+ catch (error) {
102
+ (_d = this.$ctx) === null || _d === void 0 ? void 0 : _d.logger.error({
103
+ 'Telemetry - CRITICAL ERROR - Failed to log error': {
104
+ originalError: data.error.message,
105
+ telemetryError: error instanceof Error ? error.message : String(error),
106
+ stack: error instanceof Error ? error.stack : undefined,
107
+ },
108
+ });
109
+ }
110
+ });
111
+ }
112
+ logException(error, context) {
113
+ return __awaiter(this, void 0, void 0, function* () {
114
+ yield this.logError({
115
+ error,
116
+ context,
117
+ });
118
+ });
119
+ }
120
+ };
121
+ exports.TsedTelemetryService = TsedTelemetryService;
122
+ __decorate([
123
+ (0, di_1.InjectContext)(),
124
+ __metadata("design:type", platform_serverless_1.ServerlessContext)
125
+ ], TsedTelemetryService.prototype, "$ctx", void 0);
126
+ exports.TsedTelemetryService = TsedTelemetryService = __decorate([
127
+ (0, di_1.Injectable)(),
128
+ __param(0, (0, di_1.Inject)()),
129
+ __metadata("design:paramtypes", [config_1.TsedTelemetryProvider])
130
+ ], TsedTelemetryService);
131
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZWxlbWV0cnkvdHNlZC9zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGlDQUE2RDtBQUM3RCxtRUFBOEQ7QUFDOUQscUNBQWlEO0FBQ2pELGtDQUF5QztBQWlCbEMsSUFBTSxvQkFBb0IsR0FBMUIsTUFBTSxvQkFBb0I7SUFJL0IsWUFFRSxpQkFBeUQ7UUFBeEMsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUF1QjtRQUpuRCxtQkFBYyxHQUEwQixJQUFJLENBQUM7SUFLbEQsQ0FBQztJQUVJLFNBQVM7O1FBQ2YsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDO1lBQzVDLE1BQUEsSUFBSSxDQUFDLElBQUksMENBQUUsTUFBTSxDQUFDLElBQUksQ0FDcEIscURBQXFELENBQ3RELENBQUM7WUFDRixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3pCLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQ2xFLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDcEIsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1lBRUQsTUFBTSxVQUFVLEdBQUcsY0FBYyxDQUFDLFNBQVMsQ0FDekMscUJBQXFCLEVBQ3JCLE9BQU8sQ0FDUixDQUFDO1lBR0YsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLElBQUksY0FBYyxDQUFDO1lBQy9ELElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxxQkFBYyxDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUNwRSxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQzdCLENB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Q0FBQyxTQUFTO3FCQUN4RDtpQkFDRixDQUFDLENBQUM7WUFFTCxDQUFDO1FBQ0gsQ0FBQztLQUFBO0lBRVksWUFBWSxDQUN2QixLQUFZLEVBQ1osT0FBNkI7O1lBRTdCLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQztnQkFDbEIsS0FBSztnQkFDTCxPQUFPO2FBQ1IsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztLQUFBO0NBQ0YsQ0FBQTtBQWhIWSxvREFBb0I7QUFDSjtJQUExQixJQUFBLGtCQUFhLEdBQUU7OEJBQWlCLHVDQUFpQjtrREFBQzsrQkFEeEMsb0JBQW9CO0lBRGhDLElBQUEsZUFBVSxHQUFFO0lBTVIsV0FBQSxJQUFBLFdBQU0sR0FBRSxDQUFBO3FDQUMyQiw4QkFBcUI7R0FOaEQsb0JBQW9CLENBZ0hoQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIEluamVjdCwgSW5qZWN0Q29udGV4dCB9IGZyb20gJ0B0c2VkL2RpJztcclxuaW1wb3J0IHsgU2VydmVybGVzc0NvbnRleHQgfSBmcm9tICdAdHNlZC9wbGF0Zm9ybS1zZXJ2ZXJsZXNzJztcclxuaW1wb3J0IHsgVHNlZFRlbGVtZXRyeVByb3ZpZGVyIH0gZnJvbSAnLi9jb25maWcnO1xyXG5pbXBvcnQgeyBTdGFuZGFyZExvZ2dlciB9IGZyb20gJy4uL2NvcmUnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBFcnJvckxvZ0RhdGEge1xyXG4gIGVycm9yOiBFcnJvcjtcclxuICBjb250ZXh0PzogUmVjb3JkPHN0cmluZywgYW55PjtcclxuICBhY2NvdW50VXNlclVpZD86IHN0cmluZztcclxuICBhY2NvdW50VWlkPzogc3RyaW5nO1xyXG4gIHJlcXVlc3RJZD86IHN0cmluZztcclxuICBlbmRwb2ludD86IHN0cmluZztcclxuICBtZXRob2Q/OiBzdHJpbmc7XHJcbiAgY29udHJvbGxlcj86IHN0cmluZztcclxuICBjb250cm9sbGVyTWV0aG9kPzogc3RyaW5nO1xyXG4gIGFwcGxpY2F0aW9uVWlkPzogc3RyaW5nO1xyXG4gIGF3c1JlcXVlc3RJZD86IHN0cmluZztcclxufVxyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgVHNlZFRlbGVtZXRyeVNlcnZpY2Uge1xyXG4gIEBJbmplY3RDb250ZXh0KCkgcHJvdGVjdGVkICRjdHg6IFNlcnZlcmxlc3NDb250ZXh0O1xyXG4gIHByaXZhdGUgc3RhbmRhcmRMb2dnZXI6IFN0YW5kYXJkTG9nZ2VyIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgQEluamVjdCgpXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRlbGVtZXRyeVByb3ZpZGVyOiBUc2VkVGVsZW1ldHJ5UHJvdmlkZXJcclxuICApIHt9XHJcblxyXG4gIHByaXZhdGUgZ2V0TG9nZ2VyKCk6IFN0YW5kYXJkTG9nZ2VyIHwgbnVsbCB7XHJcbiAgICBpZiAoIXRoaXMudGVsZW1ldHJ5UHJvdmlkZXIuaXNJbml0aWFsaXplZCgpKSB7XHJcbiAgICAgIHRoaXMuJGN0eD8ubG9nZ2VyLndhcm4oXHJcbiAgICAgICAgJ1tUZWxlbWV0cnldIFRlbGVtZXRyeSBub3QgaW5pdGlhbGl6ZWQsIHNraXBwaW5nIGxvZydcclxuICAgICAgKTtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLnN0YW5kYXJkTG9nZ2VyKSB7XHJcbiAgICAgIGNvbnN0IGxvZ2dlclByb3ZpZGVyID0gdGhpcy50ZWxlbWV0cnlQcm92aWRlci5nZXRMb2dnZXJQcm92aWRlcigpO1xyXG4gICAgICBpZiAoIWxvZ2dlclByb3ZpZGVyKSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IG90ZWxMb2dnZXIgPSBsb2dnZXJQcm92aWRlci5nZXRMb2dnZXIoXHJcbiAgICAgICAgJ3RzZWQtc2VydmljZS1sb2dnZXInLFxyXG4gICAgICAgICcxLjAuMCdcclxuICAgICAgKTtcclxuXHJcbiAgICAgIC8vIFBlZ2EgbyBzZXJ2aWNlIG5hbWUgZG8gYW1iaWVudGUgb3UgdXNhIGRlZmF1bHRcclxuICAgICAgY29uc3Qgc2VydmljZU5hbWUgPSBwcm9jZXNzLmVudi5TRVJWSUNFX05BTUUgfHwgJ3RzZWQtc2VydmljZSc7XHJcbiAgICAgIHRoaXMuc3RhbmRhcmRMb2dnZXIgPSBuZXcgU3RhbmRhcmRMb2dnZXIob3RlbExvZ2dlciwgc2VydmljZU5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLnN0YW5kYXJkTG9nZ2VyO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGxvZ0Vycm9yKGRhdGE6IEVycm9yTG9nRGF0YSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgbG9nZ2VyID0gdGhpcy5nZXRMb2dnZXIoKTtcclxuICAgIGlmICghbG9nZ2VyKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBsZXQgc3RhZ2UgPSBwcm9jZXNzLmVudi5TVEFHRSB8fCAnZGV2ZWxvcG1lbnQnO1xyXG4gICAgICBpZiAoc3RhZ2UgPT09ICdwcm9kJykgc3RhZ2UgPSAncHJvZHVjdGlvbic7XHJcblxyXG4gICAgICB0aGlzLiRjdHg/LmxvZ2dlci5pbmZvKCdbVGVsZW1ldHJ5XSBMb2dnaW5nIGVycm9yLi4uJyk7XHJcblxyXG4gICAgICBhd2FpdCBsb2dnZXIubG9nRXJyb3Ioe1xyXG4gICAgICAgIG1lc3NhZ2U6IGRhdGEuZXJyb3IubWVzc2FnZSxcclxuICAgICAgICBlcnJvcjogZGF0YS5lcnJvcixcclxuICAgICAgICBzZXJ2aWNlTmFtZTogcHJvY2Vzcy5lbnYuU0VSVklDRV9OQU1FIHx8ICd0c2VkLXNlcnZpY2UnLFxyXG4gICAgICAgIGVudmlyb25tZW50OiBzdGFnZSxcclxuICAgICAgICBodHRwOiB7XHJcbiAgICAgICAgICBlbmRwb2ludDogZGF0YS5lbmRwb2ludCxcclxuICAgICAgICAgIG1ldGhvZDogZGF0YS5tZXRob2QsXHJcbiAgICAgICAgICBzdGF0dXNDb2RlOiAoZGF0YS5lcnJvciBhcyBhbnkpLnN0YXR1cyB8fCA1MDAsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB1c2VyOiB7XHJcbiAgICAgICAgICBhY2NvdW50VXNlclVpZDogZGF0YS5hY2NvdW50VXNlclVpZCxcclxuICAgICAgICAgIGFjY291bnRVaWQ6IGRhdGEuYWNjb3VudFVpZCxcclxuICAgICAgICAgIGFwcGxpY2F0aW9uVWlkOiBkYXRhLmFwcGxpY2F0aW9uVWlkLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXhlY3V0aW9uOiB7XHJcbiAgICAgICAgICByZXF1ZXN0SWQ6IGRhdGEucmVxdWVzdElkLFxyXG4gICAgICAgICAgYXdzUmVxdWVzdElkOiBkYXRhLmF3c1JlcXVlc3RJZCxcclxuICAgICAgICAgIGNvbnRyb2xsZXI6IGRhdGEuY29udHJvbGxlcixcclxuICAgICAgICAgIGNvbnRyb2xsZXJNZXRob2Q6IGRhdGEuY29udHJvbGxlck1ldGhvZCxcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNvbnRleHQ6IGRhdGEuY29udGV4dCxcclxuICAgICAgfSk7XHJcblxyXG4gICAgICAvLyBDUklUSUNBTDogRm9yY2UgZmx1c2ggdG8gZW5zdXJlIGxvZyBpcyBzZW50IGJlZm9yZSBMYW1iZGEgZnJlZXplc1xyXG4gICAgICB0aGlzLiRjdHg/LmxvZ2dlci5pbmZvKCdbVGVsZW1ldHJ5XSBGb3JjaW5nIGZsdXNoLi4uJyk7XHJcbiAgICAgIGNvbnN0IGZsdXNoU3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcclxuXHJcbiAgICAgIGF3YWl0IHRoaXMudGVsZW1ldHJ5UHJvdmlkZXIuZm9yY2VGbHVzaCgpO1xyXG5cclxuICAgICAgY29uc3QgZmx1c2hEdXJhdGlvbiA9IERhdGUubm93KCkgLSBmbHVzaFN0YXJ0VGltZTtcclxuXHJcbiAgICAgIHRoaXMuJGN0eD8ubG9nZ2VyLmluZm8oe1xyXG4gICAgICAgICdUZWxlbWV0cnkgLSBMb2cgc2VudCBzdWNjZXNzZnVsbHknOiB7XHJcbiAgICAgICAgICBlcnJvclR5cGU6IGRhdGEuZXJyb3IubmFtZSxcclxuICAgICAgICAgIG1lc3NhZ2U6IGRhdGEuZXJyb3IubWVzc2FnZSxcclxuICAgICAgICAgIGVuZHBvaW50OiBkYXRhLmVuZHBvaW50LFxyXG4gICAgICAgICAgY29udHJvbGxlcjogZGF0YS5jb250cm9sbGVyLFxyXG4gICAgICAgICAgbWV0aG9kOiBkYXRhLmNvbnRyb2xsZXJNZXRob2QsXHJcbiAgICAgICAgICBmbHVzaER1cmF0aW9uTXM6IGZsdXNoRHVyYXRpb24sXHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICB0aGlzLiRjdHg/LmxvZ2dlci5lcnJvcih7XHJcbiAgICAgICAgJ1RlbGVtZXRyeSAtIENSSVRJQ0FMIEVSUk9SIC0gRmFpbGVkIHRvIGxvZyBlcnJvcic6IHtcclxuICAgICAgICAgIG9yaWdpbmFsRXJyb3I6IGRhdGEuZXJyb3IubWVzc2FnZSxcclxuICAgICAgICAgIHRlbGVtZXRyeUVycm9yOlxyXG4gICAgICAgICAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXHJcbiAgICAgICAgICBzdGFjazogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLnN0YWNrIDogdW5kZWZpbmVkLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gICAgICAvLyBEb24ndCByZS10aHJvdyB0byBhdm9pZCBicmVha2luZyB0aGUgYXBwbGljYXRpb24gZmxvd1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGxvZ0V4Y2VwdGlvbihcclxuICAgIGVycm9yOiBFcnJvcixcclxuICAgIGNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+XHJcbiAgKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBhd2FpdCB0aGlzLmxvZ0Vycm9yKHtcclxuICAgICAgZXJyb3IsXHJcbiAgICAgIGNvbnRleHQsXHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuIl19
@@ -0,0 +1,11 @@
1
+ import { LogRecordProcessor, ReadableLogRecord } from '@opentelemetry/sdk-logs';
2
+ import { OTLPLogExporter } from '@opentelemetry/exporter-logs-otlp-http';
3
+ import { Context } from '@opentelemetry/api';
4
+ export declare class TsedSyncLogRecordProcessor implements LogRecordProcessor {
5
+ private readonly exporter;
6
+ private readonly pendingExports;
7
+ constructor(exporter: OTLPLogExporter);
8
+ onEmit(logRecord: ReadableLogRecord, _context?: Context): void;
9
+ forceFlush(): Promise<void>;
10
+ shutdown(): Promise<void>;
11
+ }
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.TsedSyncLogRecordProcessor = void 0;
13
+ class TsedSyncLogRecordProcessor {
14
+ constructor(exporter) {
15
+ this.pendingExports = [];
16
+ this.exporter = exporter;
17
+ }
18
+ onEmit(logRecord, _context) {
19
+ const exportPromise = new Promise((resolve, reject) => {
20
+ this.exporter.export([logRecord], (result) => {
21
+ if (result.code === 0) {
22
+ resolve();
23
+ }
24
+ else {
25
+ console.error('[SyncLogRecordProcessor] Export failed:', result.error);
26
+ reject(result.error instanceof Error
27
+ ? result.error
28
+ : new Error(String(result.error)));
29
+ }
30
+ });
31
+ })
32
+ .then(() => {
33
+ const index = this.pendingExports.indexOf(exportPromise);
34
+ if (index > -1) {
35
+ this.pendingExports.splice(index, 1);
36
+ }
37
+ })
38
+ .catch((error) => {
39
+ console.error('[SyncLogRecordProcessor] Export error:', error);
40
+ const index = this.pendingExports.indexOf(exportPromise);
41
+ if (index > -1) {
42
+ this.pendingExports.splice(index, 1);
43
+ }
44
+ });
45
+ this.pendingExports.push(exportPromise);
46
+ }
47
+ forceFlush() {
48
+ return __awaiter(this, void 0, void 0, function* () {
49
+ console.log(`[SyncLogRecordProcessor] forceFlush called with ${this.pendingExports.length} pending exports`);
50
+ if (this.pendingExports.length === 0) {
51
+ console.log('[SyncLogRecordProcessor] No pending exports to flush');
52
+ return;
53
+ }
54
+ try {
55
+ yield Promise.all(this.pendingExports);
56
+ console.log('[SyncLogRecordProcessor] All pending exports completed');
57
+ }
58
+ catch (error) {
59
+ console.error('[SyncLogRecordProcessor] Error during forceFlush:', error);
60
+ throw error;
61
+ }
62
+ });
63
+ }
64
+ shutdown() {
65
+ return __awaiter(this, void 0, void 0, function* () {
66
+ console.log('[SyncLogRecordProcessor] Shutting down...');
67
+ yield this.forceFlush();
68
+ yield this.exporter.shutdown();
69
+ console.log('[SyncLogRecordProcessor] Shutdown complete');
70
+ });
71
+ }
72
+ }
73
+ exports.TsedSyncLogRecordProcessor = TsedSyncLogRecordProcessor;
74
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1sb2ctcmVjb3JkLXByb2Nlc3Nvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZWxlbWV0cnkvdHNlZC9zeW5jLWxvZy1yZWNvcmQtcHJvY2Vzc29yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQVlBLE1BQWEsMEJBQTBCO0lBSXJDLFlBQVksUUFBeUI7UUFGcEIsbUJBQWMsR0FBb0IsRUFBRSxDQUFDO1FBR3BELElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0lBQzNCLENBQUM7SUFFRCxNQUFNLENBQUMsU0FBNEIsRUFBRSxRQUFrQjtRQUlyRCxNQUFNLGFBQWEsR0FBRyxJQUFJLE9BQU8sQ0FBTyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUMxRCxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUU7Z0JBQzNDLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDdEIsT0FBTyxFQUFFLENBQUM7Z0JBQ1osQ0FBQztxQkFBTSxDQUFDO29CQUNOLE9BQU8sQ0FBQyxLQUFLLENBQ1gseUNBQXlDLEVBQ3pDLE1BQU0sQ0FBQyxLQUFLLENBQ2IsQ0FBQztvQkFDRixNQUFNLENBQ0osTUFBTSxDQUFDLEtBQUssWUFBWSxLQUFLO3dCQUMzQixDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUs7d0JBQ2QsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FDcEMsQ0FBQztnQkFDSixDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUM7YUFDQyxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ1QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDekQsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDZixJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdkMsQ0FBQztRQUNILENBQUMsQ0FBQzthQUNELEtBQUssQ0FBQyxDQUFDLEtBQWMsRUFBRSxFQUFFO1lBQ3hCLE9BQU8sQ0FBQyxLQUFLLENBQUMsd0NBQXdDLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDL0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDekQsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDZixJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdkMsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUwsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVLLFVBQVU7O1lBQ2QsT0FBTyxDQUFDLEdBQUcsQ0FDVCxtREFBbUQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLGtCQUFrQixDQUNoRyxDQUFDO1lBRUYsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDckMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxzREFBc0QsQ0FBQyxDQUFDO2dCQUNwRSxPQUFPO1lBQ1QsQ0FBQztZQUVELElBQUksQ0FBQztnQkFFSCxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO2dCQUN2QyxPQUFPLENBQUMsR0FBRyxDQUFDLHdEQUF3RCxDQUFDLENBQUM7WUFDeEUsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyxtREFBbUQsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDMUUsTUFBTSxLQUFLLENBQUM7WUFDZCxDQUFDO1FBQ0gsQ0FBQztLQUFBO0lBRUssUUFBUTs7WUFDWixPQUFPLENBQUMsR0FBRyxDQUFDLDJDQUEyQyxDQUFDLENBQUM7WUFDekQsTUFBTSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDeEIsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQy9CLE9BQU8sQ0FBQyxHQUFHLENBQUMsNENBQTRDLENBQUMsQ0FBQztRQUM1RCxDQUFDO0tBQUE7Q0FDRjtBQXhFRCxnRUF3RUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBMb2dSZWNvcmRQcm9jZXNzb3IsIFJlYWRhYmxlTG9nUmVjb3JkIH0gZnJvbSAnQG9wZW50ZWxlbWV0cnkvc2RrLWxvZ3MnO1xyXG5pbXBvcnQgeyBPVExQTG9nRXhwb3J0ZXIgfSBmcm9tICdAb3BlbnRlbGVtZXRyeS9leHBvcnRlci1sb2dzLW90bHAtaHR0cCc7XHJcbmltcG9ydCB7IENvbnRleHQgfSBmcm9tICdAb3BlbnRlbGVtZXRyeS9hcGknO1xyXG5cclxuLyoqXHJcbiAqIEN1c3RvbSBMb2dSZWNvcmRQcm9jZXNzb3IgdGhhdCBlbnN1cmVzIHN5bmNocm9ub3VzIGV4cG9ydCBmb3IgQVdTIExhbWJkYVxyXG4gKlxyXG4gKiBUaGlzIHByb2Nlc3NvciB3cmFwcyB0aGUgT1RMUCBleHBvcnRlciBhbmQgZW5zdXJlcyB0aGF0IGxvZ3MgYXJlIGFjdHVhbGx5XHJcbiAqIGV4cG9ydGVkIHN5bmNocm9ub3VzbHkgYnkgaW1tZWRpYXRlbHkgY2FsbGluZyBleHBvcnQoKSBhbmQgd2FpdGluZyBmb3IgaXRcclxuICogdG8gY29tcGxldGUsIHJhdGhlciB0aGFuIHJlbHlpbmcgb24gU2ltcGxlTG9nUmVjb3JkUHJvY2Vzc29yIHdoaWNoIG1heSBub3RcclxuICogcHJvcGVybHkgYXdhaXQgdGhlIGFzeW5jIEhUVFAgcmVxdWVzdCBpbiBMYW1iZGEgZW52aXJvbm1lbnRzLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFRzZWRTeW5jTG9nUmVjb3JkUHJvY2Vzc29yIGltcGxlbWVudHMgTG9nUmVjb3JkUHJvY2Vzc29yIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGV4cG9ydGVyOiBPVExQTG9nRXhwb3J0ZXI7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBwZW5kaW5nRXhwb3J0czogUHJvbWlzZTx2b2lkPltdID0gW107XHJcblxyXG4gIGNvbnN0cnVjdG9yKGV4cG9ydGVyOiBPVExQTG9nRXhwb3J0ZXIpIHtcclxuICAgIHRoaXMuZXhwb3J0ZXIgPSBleHBvcnRlcjtcclxuICB9XHJcblxyXG4gIG9uRW1pdChsb2dSZWNvcmQ6IFJlYWRhYmxlTG9nUmVjb3JkLCBfY29udGV4dD86IENvbnRleHQpOiB2b2lkIHtcclxuICAgIC8vIEV4cG9ydCBpbW1lZGlhdGVseSBhbmQgdHJhY2sgdGhlIHByb21pc2VcclxuICAgIC8vIFRoZSBleHBvcnQgbWV0aG9kIHJldHVybnMgdm9pZCwgYnV0IGludGVybmFsbHkgdHJpZ2dlcnMgYXN5bmMgSFRUUCByZXF1ZXN0XHJcbiAgICAvLyBXZSBuZWVkIHRvIHdyYXAgaXQgdG8gdHJhY2sgY29tcGxldGlvblxyXG4gICAgY29uc3QgZXhwb3J0UHJvbWlzZSA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgdGhpcy5leHBvcnRlci5leHBvcnQoW2xvZ1JlY29yZF0sIChyZXN1bHQpID0+IHtcclxuICAgICAgICBpZiAocmVzdWx0LmNvZGUgPT09IDApIHtcclxuICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcihcclxuICAgICAgICAgICAgJ1tTeW5jTG9nUmVjb3JkUHJvY2Vzc29yXSBFeHBvcnQgZmFpbGVkOicsXHJcbiAgICAgICAgICAgIHJlc3VsdC5lcnJvclxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHJlamVjdChcclxuICAgICAgICAgICAgcmVzdWx0LmVycm9yIGluc3RhbmNlb2YgRXJyb3JcclxuICAgICAgICAgICAgICA/IHJlc3VsdC5lcnJvclxyXG4gICAgICAgICAgICAgIDogbmV3IEVycm9yKFN0cmluZyhyZXN1bHQuZXJyb3IpKVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSlcclxuICAgICAgLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5wZW5kaW5nRXhwb3J0cy5pbmRleE9mKGV4cG9ydFByb21pc2UpO1xyXG4gICAgICAgIGlmIChpbmRleCA+IC0xKSB7XHJcbiAgICAgICAgICB0aGlzLnBlbmRpbmdFeHBvcnRzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgICAuY2F0Y2goKGVycm9yOiB1bmtub3duKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignW1N5bmNMb2dSZWNvcmRQcm9jZXNzb3JdIEV4cG9ydCBlcnJvcjonLCBlcnJvcik7XHJcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnBlbmRpbmdFeHBvcnRzLmluZGV4T2YoZXhwb3J0UHJvbWlzZSk7XHJcbiAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcclxuICAgICAgICAgIHRoaXMucGVuZGluZ0V4cG9ydHMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIHRoaXMucGVuZGluZ0V4cG9ydHMucHVzaChleHBvcnRQcm9taXNlKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGZvcmNlRmx1c2goKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zb2xlLmxvZyhcclxuICAgICAgYFtTeW5jTG9nUmVjb3JkUHJvY2Vzc29yXSBmb3JjZUZsdXNoIGNhbGxlZCB3aXRoICR7dGhpcy5wZW5kaW5nRXhwb3J0cy5sZW5ndGh9IHBlbmRpbmcgZXhwb3J0c2BcclxuICAgICk7XHJcblxyXG4gICAgaWYgKHRoaXMucGVuZGluZ0V4cG9ydHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdbU3luY0xvZ1JlY29yZFByb2Nlc3Nvcl0gTm8gcGVuZGluZyBleHBvcnRzIHRvIGZsdXNoJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0cnkge1xyXG4gICAgICAvLyBXYWl0IGZvciBhbGwgcGVuZGluZyBleHBvcnRzIHRvIGNvbXBsZXRlXHJcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKHRoaXMucGVuZGluZ0V4cG9ydHMpO1xyXG4gICAgICBjb25zb2xlLmxvZygnW1N5bmNMb2dSZWNvcmRQcm9jZXNzb3JdIEFsbCBwZW5kaW5nIGV4cG9ydHMgY29tcGxldGVkJyk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdbU3luY0xvZ1JlY29yZFByb2Nlc3Nvcl0gRXJyb3IgZHVyaW5nIGZvcmNlRmx1c2g6JywgZXJyb3IpO1xyXG4gICAgICB0aHJvdyBlcnJvcjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIHNodXRkb3duKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc29sZS5sb2coJ1tTeW5jTG9nUmVjb3JkUHJvY2Vzc29yXSBTaHV0dGluZyBkb3duLi4uJyk7XHJcbiAgICBhd2FpdCB0aGlzLmZvcmNlRmx1c2goKTtcclxuICAgIGF3YWl0IHRoaXMuZXhwb3J0ZXIuc2h1dGRvd24oKTtcclxuICAgIGNvbnNvbGUubG9nKCdbU3luY0xvZ1JlY29yZFByb2Nlc3Nvcl0gU2h1dGRvd24gY29tcGxldGUnKTtcclxuICB9XHJcbn1cclxuIl19