@mecanizou/telemetry-hub 1.0.0 → 1.0.2

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 (95) 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/CHANGELOG.md +14 -0
  5. package/DOCS_GUIDE.md +151 -0
  6. package/README.md +248 -0
  7. package/dist/core/__tests__/logger-types.test.d.ts +1 -0
  8. package/dist/core/__tests__/logger-types.test.js +325 -0
  9. package/dist/core/__tests__/logger.test.d.ts +1 -0
  10. package/dist/core/__tests__/logger.test.js +337 -0
  11. package/dist/core/__tests__/tracer.test.d.ts +1 -0
  12. package/dist/core/__tests__/tracer.test.js +330 -0
  13. package/dist/core/index.d.ts +4 -0
  14. package/dist/core/index.js +8 -0
  15. package/dist/core/logger-types.d.ts +43 -0
  16. package/dist/core/logger-types.js +3 -0
  17. package/dist/core/logger.d.ts +13 -0
  18. package/dist/core/logger.js +123 -0
  19. package/dist/core/tracer-types.d.ts +50 -0
  20. package/dist/core/tracer-types.js +3 -0
  21. package/dist/core/tracer.d.ts +10 -0
  22. package/dist/core/tracer.js +114 -0
  23. package/dist/index.d.ts +3 -1
  24. package/dist/index.js +4 -2
  25. package/dist/sst/__tests__/telemetry.test.d.ts +1 -0
  26. package/dist/sst/__tests__/telemetry.test.js +138 -0
  27. package/dist/sst/index.d.ts +1 -0
  28. package/dist/sst/index.js +18 -0
  29. package/dist/sst/middy/index.d.ts +1 -0
  30. package/dist/sst/middy/index.js +18 -0
  31. package/dist/sst/middy/middleware.d.ts +5 -0
  32. package/dist/sst/middy/middleware.js +157 -0
  33. package/dist/sst/telemetry.d.ts +4 -0
  34. package/dist/sst/telemetry.js +121 -0
  35. package/dist/telemetry/core/__tests__/logger-types.test.d.ts +1 -0
  36. package/dist/telemetry/core/__tests__/logger-types.test.js +325 -0
  37. package/dist/telemetry/core/__tests__/logger.test.d.ts +1 -0
  38. package/dist/telemetry/core/__tests__/logger.test.js +337 -0
  39. package/dist/telemetry/core/__tests__/tracer.test.d.ts +1 -0
  40. package/dist/telemetry/core/__tests__/tracer.test.js +330 -0
  41. package/dist/telemetry/core/index.d.ts +4 -0
  42. package/dist/telemetry/core/index.js +8 -0
  43. package/dist/telemetry/core/logger-types.d.ts +43 -0
  44. package/dist/telemetry/core/logger-types.js +3 -0
  45. package/dist/telemetry/core/logger.d.ts +13 -0
  46. package/dist/telemetry/core/logger.js +123 -0
  47. package/dist/telemetry/core/tracer-types.d.ts +50 -0
  48. package/dist/telemetry/core/tracer-types.js +3 -0
  49. package/dist/telemetry/core/tracer.d.ts +10 -0
  50. package/dist/telemetry/core/tracer.js +114 -0
  51. package/dist/telemetry/index.d.ts +3 -0
  52. package/dist/telemetry/index.js +20 -0
  53. package/dist/telemetry/sst/__tests__/telemetry.test.d.ts +1 -0
  54. package/dist/telemetry/sst/__tests__/telemetry.test.js +138 -0
  55. package/dist/telemetry/sst/index.d.ts +1 -0
  56. package/dist/telemetry/sst/index.js +18 -0
  57. package/dist/telemetry/sst/middy/index.d.ts +1 -0
  58. package/dist/telemetry/sst/middy/index.js +18 -0
  59. package/dist/telemetry/sst/middy/middleware.d.ts +5 -0
  60. package/dist/telemetry/sst/middy/middleware.js +157 -0
  61. package/dist/telemetry/sst/telemetry.d.ts +4 -0
  62. package/dist/telemetry/sst/telemetry.js +121 -0
  63. package/dist/telemetry/tsed/__tests__/config.test.d.ts +1 -0
  64. package/dist/telemetry/tsed/__tests__/config.test.js +146 -0
  65. package/dist/telemetry/tsed/__tests__/service.test.d.ts +1 -0
  66. package/dist/telemetry/tsed/__tests__/service.test.js +63 -0
  67. package/dist/telemetry/tsed/config.d.ts +26 -0
  68. package/dist/telemetry/tsed/config.js +166 -0
  69. package/dist/telemetry/tsed/index.d.ts +4 -0
  70. package/dist/telemetry/tsed/index.js +21 -0
  71. package/dist/telemetry/tsed/log-telemetry.d.ts +1 -0
  72. package/dist/telemetry/tsed/log-telemetry.js +196 -0
  73. package/dist/telemetry/tsed/service.d.ts +26 -0
  74. package/dist/telemetry/tsed/service.js +150 -0
  75. package/dist/telemetry/tsed/sync-log-record-processor.d.ts +11 -0
  76. package/dist/telemetry/tsed/sync-log-record-processor.js +74 -0
  77. package/dist/tsed/__tests__/config.test.d.ts +1 -0
  78. package/dist/tsed/__tests__/config.test.js +146 -0
  79. package/dist/tsed/__tests__/service.test.d.ts +1 -0
  80. package/dist/tsed/__tests__/service.test.js +63 -0
  81. package/dist/tsed/config.d.ts +26 -0
  82. package/dist/tsed/config.js +166 -0
  83. package/dist/tsed/index.d.ts +4 -0
  84. package/dist/tsed/index.js +21 -0
  85. package/dist/tsed/log-telemetry.d.ts +1 -0
  86. package/dist/tsed/log-telemetry.js +196 -0
  87. package/dist/tsed/service.d.ts +26 -0
  88. package/dist/tsed/service.js +150 -0
  89. package/dist/tsed/sync-log-record-processor.d.ts +11 -0
  90. package/dist/tsed/sync-log-record-processor.js +74 -0
  91. package/package.json +72 -56
  92. package/release.config.js +23 -23
  93. package/vitest.config.ts +22 -0
  94. package/dist/check-if-is-working.d.ts +0 -1
  95. package/dist/check-if-is-working.js +0 -8
@@ -0,0 +1,196 @@
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
+ const api_1 = require("@opentelemetry/api");
15
+ const perf_hooks_1 = require("perf_hooks");
16
+ function TsedLogTelemetry() {
17
+ return function (_target, _propertyKey, descriptor) {
18
+ const originalMethod = descriptor.value;
19
+ const methodName = _propertyKey;
20
+ descriptor.value = function (...args) {
21
+ return __awaiter(this, void 0, void 0, function* () {
22
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
23
+ const startTime = perf_hooks_1.performance.now();
24
+ const $ctx = args.find((arg) => (arg === null || arg === void 0 ? void 0 : arg.request) && (arg === null || arg === void 0 ? void 0 : arg.response));
25
+ let controllerName = 'UnknownController';
26
+ if (((_a = this === null || this === void 0 ? void 0 : this.constructor) === null || _a === void 0 ? void 0 : _a.name) && this.constructor.name !== 'Object') {
27
+ controllerName = this.constructor.name;
28
+ }
29
+ if (!$ctx) {
30
+ console.warn('[TsedLogTelemetry] Context not found, executing without telemetry');
31
+ return yield originalMethod.apply(this, args);
32
+ }
33
+ let telemetryService;
34
+ try {
35
+ if ($ctx.injector) {
36
+ telemetryService = $ctx.injector.get(service_1.TsedTelemetryService);
37
+ }
38
+ }
39
+ catch (error) {
40
+ (_b = $ctx.logger) === null || _b === void 0 ? void 0 : _b.warn({
41
+ 'TsedLogTelemetry - Failed to get TelemetryService from injector': error,
42
+ });
43
+ }
44
+ if (!telemetryService) {
45
+ (_c = $ctx.logger) === null || _c === void 0 ? void 0 : _c.warn('[TsedLogTelemetry] TelemetryService not available, executing without telemetry');
46
+ return yield originalMethod.apply(this, args);
47
+ }
48
+ const request = $ctx.request;
49
+ const serviceName = process.env.SERVICE_NAME || 'tsed-service';
50
+ let stage = process.env.STAGE || 'development';
51
+ if (stage === 'prod')
52
+ stage = 'production';
53
+ const queryStringParameters = request.query || {};
54
+ const origin = queryStringParameters.origin || 'web';
55
+ const tracer = telemetryService.getTracer();
56
+ let spanResult = null;
57
+ if (tracer) {
58
+ spanResult = tracer.startSpan({
59
+ spanName: `${controllerName}.${methodName}`,
60
+ serviceName,
61
+ environment: stage,
62
+ execution: {
63
+ controller: controllerName,
64
+ controllerMethod: methodName,
65
+ requestId: $ctx.id,
66
+ awsRequestId: (_d = $ctx.context) === null || _d === void 0 ? void 0 : _d.awsRequestId,
67
+ origin,
68
+ },
69
+ http: {
70
+ method: request.method,
71
+ url: request.url,
72
+ endpoint: request.url,
73
+ },
74
+ });
75
+ }
76
+ const meter = api_1.metrics.getMeter(origin);
77
+ const executionTimeHistogram = meter.createHistogram('tsed_execution_duration', {
78
+ description: 'Tempo total de execução do método Tsed em ms',
79
+ unit: 'ms',
80
+ valueType: api_1.ValueType.DOUBLE,
81
+ });
82
+ const successCounter = meter.createCounter('tsed_successful_requests', {
83
+ description: 'Total de requisições bem-sucedidas',
84
+ });
85
+ const failureCounter = meter.createCounter('tsed_failed_requests', {
86
+ description: 'Total de requisições com falha',
87
+ });
88
+ try {
89
+ const result = yield originalMethod.apply(this, args);
90
+ const durationMs = perf_hooks_1.performance.now() - startTime;
91
+ if (spanResult) {
92
+ spanResult.setSuccess(true);
93
+ }
94
+ successCounter.add(1, {
95
+ origin,
96
+ controller: controllerName,
97
+ method: methodName,
98
+ 'service.name': serviceName,
99
+ 'deployment.environment.name': stage,
100
+ });
101
+ executionTimeHistogram.record(durationMs, {
102
+ origin,
103
+ status: 'success',
104
+ controller: controllerName,
105
+ method: methodName,
106
+ 'service.name': serviceName,
107
+ 'deployment.environment.name': stage,
108
+ });
109
+ const logger = telemetryService.getLogger();
110
+ if (logger) {
111
+ yield logger.logInfo({
112
+ message: 'Request completed successfully',
113
+ serviceName,
114
+ environment: stage,
115
+ execution: {
116
+ controller: controllerName,
117
+ controllerMethod: methodName,
118
+ requestId: $ctx.id,
119
+ awsRequestId: (_e = $ctx.context) === null || _e === void 0 ? void 0 : _e.awsRequestId,
120
+ origin,
121
+ },
122
+ http: {
123
+ method: request.method,
124
+ url: request.url,
125
+ endpoint: request.url,
126
+ statusCode: ((_f = $ctx.response) === null || _f === void 0 ? void 0 : _f.statusCode) || 200,
127
+ },
128
+ performance: {
129
+ durationMs,
130
+ success: true,
131
+ },
132
+ });
133
+ }
134
+ if (spanResult) {
135
+ spanResult.end();
136
+ }
137
+ yield telemetryService.telemetryProvider.forceFlush();
138
+ return result;
139
+ }
140
+ catch (error) {
141
+ const durationMs = perf_hooks_1.performance.now() - startTime;
142
+ (_g = $ctx.logger) === null || _g === void 0 ? void 0 : _g.info('Error caught, sending to telemetry');
143
+ if (spanResult) {
144
+ spanResult.setError(error);
145
+ }
146
+ failureCounter.add(1, {
147
+ origin,
148
+ error_type: ((_h = error === null || error === void 0 ? void 0 : error.constructor) === null || _h === void 0 ? void 0 : _h.name) || 'UnknownError',
149
+ controller: controllerName,
150
+ method: methodName,
151
+ 'service.name': serviceName,
152
+ 'deployment.environment.name': stage,
153
+ });
154
+ executionTimeHistogram.record(durationMs, {
155
+ origin,
156
+ status: 'error',
157
+ controller: controllerName,
158
+ method: methodName,
159
+ 'service.name': serviceName,
160
+ 'deployment.environment.name': stage,
161
+ });
162
+ let userInfo = {};
163
+ try {
164
+ if (typeof LoggedUserIdentifier !== 'undefined') {
165
+ const { loggedUser } = LoggedUserIdentifier.use($ctx);
166
+ userInfo = {
167
+ accountUserUid: loggedUser === null || loggedUser === void 0 ? void 0 : loggedUser.uid,
168
+ accountUid: (_j = loggedUser === null || loggedUser === void 0 ? void 0 : loggedUser.account) === null || _j === void 0 ? void 0 : _j.uid,
169
+ applicationUid: (_k = loggedUser === null || loggedUser === void 0 ? void 0 : loggedUser.application) === null || _k === void 0 ? void 0 : _k.uid,
170
+ };
171
+ }
172
+ }
173
+ catch (e) {
174
+ }
175
+ yield telemetryService.logError(Object.assign(Object.assign({ error: error, context: {
176
+ statusCode: error.status || 500,
177
+ url: request.url,
178
+ headers: request.headers,
179
+ body: request.body,
180
+ params: request.params,
181
+ query: request.query,
182
+ errorType: (_l = error === null || error === void 0 ? void 0 : error.constructor) === null || _l === void 0 ? void 0 : _l.name,
183
+ } }, userInfo), { requestId: $ctx.id, awsRequestId: (_m = $ctx.context) === null || _m === void 0 ? void 0 : _m.awsRequestId, endpoint: request.url, method: request.method, controller: controllerName, controllerMethod: methodName }));
184
+ if (spanResult) {
185
+ spanResult.end();
186
+ }
187
+ yield telemetryService.telemetryProvider.forceFlush();
188
+ $ctx.logger.info('Error sent to telemetry');
189
+ throw error;
190
+ }
191
+ });
192
+ };
193
+ return descriptor;
194
+ };
195
+ }
196
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nLXRlbGVtZXRyeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90c2VkL2xvZy10ZWxlbWV0cnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFnQkEsNENBd1BDO0FBNVBELHVDQUFpRDtBQUNqRCw0Q0FBd0Q7QUFDeEQsMkNBQXlDO0FBRXpDLFNBQWdCLGdCQUFnQjtJQUM5QixPQUFPLFVBQ0wsT0FBWSxFQUNaLFlBQW9CLEVBQ3BCLFVBQThCO1FBRTlCLE1BQU0sY0FBYyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUM7UUFDeEMsTUFBTSxVQUFVLEdBQUcsWUFBWSxDQUFDO1FBRWhDLFVBQVUsQ0FBQyxLQUFLLEdBQUcsVUFBMkIsR0FBRyxJQUFXOzs7Z0JBQzFELE1BQU0sU0FBUyxHQUFHLHdCQUFXLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBR3BDLE1BQU0sSUFBSSxHQUFzQixJQUFJLENBQUMsSUFBSSxDQUN2QyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQSxHQUFHLGFBQUgsR0FBRyx1QkFBSCxHQUFHLENBQUUsT0FBTyxNQUFJLEdBQUcsYUFBSCxHQUFHLHVCQUFILEdBQUcsQ0FBRSxRQUFRLENBQUEsQ0FDdkMsQ0FBQztnQkFHRixJQUFJLGNBQWMsR0FBRyxtQkFBbUIsQ0FBQztnQkFDekMsSUFBSSxDQUFBLE1BQUEsSUFBSSxhQUFKLElBQUksdUJBQUosSUFBSSxDQUFFLFdBQVcsMENBQUUsSUFBSSxLQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO29CQUNsRSxjQUFjLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7Z0JBQ3pDLENBQUM7Z0JBRUQsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO29CQUNWLE9BQU8sQ0FBQyxJQUFJLENBQ1YsbUVBQW1FLENBQ3BFLENBQUM7b0JBQ0YsT0FBTyxNQUFNLGNBQWMsQ0FBQyxLQUFLLENB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QVksRUFBRSxNQUFBLElBQUksQ0FBQyxPQUFPLDBDQUFFLFlBQVksRUFDeEMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxHQUFHLEVBQ3JCLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTSxFQUN0QixVQUFVLEVBQUUsY0FBYyxFQUMxQixnQkFBZ0IsRUFBRSxVQUFVLElBQzVCLENBQUM7b0JBR0gsSUFBSSxVQUFVLEVBQUUsQ0FBQzt3QkFDZixVQUFVLENBQUMsR0FBRyxFQUFFLENBQUM7b0JBQ25CLENBQUM7b0JBQ0QsTUFBTyxnQkFBd0IsQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLEVBQUUsQ0FBQztvQkFFL0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsQ0FBQztvQkFHNUMsTUFBTSxLQUFLLENBQUM7Z0JBQ2QsQ0FBQztZQUNILENBQUM7U0FBQSxDQUFDO1FBRUYsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBEZWNvcmF0b3IgcXVlIGNhcHR1cmEgZXJyb3MgYXV0b21hdGljYW1lbnRlLCBjcmlhIHNwYW5zIGUgZW52aWEgcGFyYSB0ZWxlbWV0cmlhXHJcbiAqIEFsaW5oYWRvIGNvbSBhIGltcGxlbWVudGHDp8OjbyBkbyBTU1QgbWlkZGxld2FyZSBwYXJhIGdhcmFudGlyIGNvbnNpc3TDqm5jaWFcclxuICpcclxuICogVXNvIG5vIGNvbnRyb2xsZXI6XHJcbiAqXHJcbiAqIEBUc2VkTG9nVGVsZW1ldHJ5KClcclxuICogYXN5bmMgZ2V0Q2hlY2tvdXQoQENvbnRleHQoKSAkY3R4OiBTZXJ2ZXJsZXNzQ29udGV4dCwgLi4uKSB7XHJcbiAqICAgcmV0dXJuIGF3YWl0IHRoaXMuc2VydmljZS5leGVjdXRlKHBhcmFtcyk7XHJcbiAqIH1cclxuICovXHJcbmltcG9ydCB7IFNlcnZlcmxlc3NDb250ZXh0IH0gZnJvbSAnQHRzZWQvcGxhdGZvcm0tc2VydmVybGVzcyc7XHJcbmltcG9ydCB7IFRzZWRUZWxlbWV0cnlTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlJztcclxuaW1wb3J0IHsgbWV0cmljcywgVmFsdWVUeXBlIH0gZnJvbSAnQG9wZW50ZWxlbWV0cnkvYXBpJztcclxuaW1wb3J0IHsgcGVyZm9ybWFuY2UgfSBmcm9tICdwZXJmX2hvb2tzJztcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBUc2VkTG9nVGVsZW1ldHJ5KCkge1xyXG4gIHJldHVybiBmdW5jdGlvbiAoXHJcbiAgICBfdGFyZ2V0OiBhbnksXHJcbiAgICBfcHJvcGVydHlLZXk6IHN0cmluZyxcclxuICAgIGRlc2NyaXB0b3I6IFByb3BlcnR5RGVzY3JpcHRvclxyXG4gICkge1xyXG4gICAgY29uc3Qgb3JpZ2luYWxNZXRob2QgPSBkZXNjcmlwdG9yLnZhbHVlO1xyXG4gICAgY29uc3QgbWV0aG9kTmFtZSA9IF9wcm9wZXJ0eUtleTtcclxuXHJcbiAgICBkZXNjcmlwdG9yLnZhbHVlID0gYXN5bmMgZnVuY3Rpb24gKHRoaXM6IGFueSwgLi4uYXJnczogYW55W10pIHtcclxuICAgICAgY29uc3Qgc3RhcnRUaW1lID0gcGVyZm9ybWFuY2Uubm93KCk7XHJcblxyXG4gICAgICAvLyBFbmNvbnRyYXIgbyBjb250ZXh0b1xyXG4gICAgICBjb25zdCAkY3R4OiBTZXJ2ZXJsZXNzQ29udGV4dCA9IGFyZ3MuZmluZChcclxuICAgICAgICAoYXJnKSA9PiBhcmc/LnJlcXVlc3QgJiYgYXJnPy5yZXNwb25zZVxyXG4gICAgICApO1xyXG5cclxuICAgICAgLy8gQ2FwdHVyYXIgbyBub21lIGRvIGNvbnRyb2xsZXJcclxuICAgICAgbGV0IGNvbnRyb2xsZXJOYW1lID0gJ1Vua25vd25Db250cm9sbGVyJztcclxuICAgICAgaWYgKHRoaXM/LmNvbnN0cnVjdG9yPy5uYW1lICYmIHRoaXMuY29uc3RydWN0b3IubmFtZSAhPT0gJ09iamVjdCcpIHtcclxuICAgICAgICBjb250cm9sbGVyTmFtZSA9IHRoaXMuY29uc3RydWN0b3IubmFtZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCEkY3R4KSB7XHJcbiAgICAgICAgY29uc29sZS53YXJuKFxyXG4gICAgICAgICAgJ1tUc2VkTG9nVGVsZW1ldHJ5XSBDb250ZXh0IG5vdCBmb3VuZCwgZXhlY3V0aW5nIHdpdGhvdXQgdGVsZW1ldHJ5J1xyXG4gICAgICAgICk7XHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IG9yaWdpbmFsTWV0aG9kLmFwcGx5KHRoaXMsIGFyZ3MpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBCdXNjYXIgbyBUZWxlbWV0cnlTZXJ2aWNlIGRvIGluamVjdG9yXHJcbiAgICAgIGxldCB0ZWxlbWV0cnlTZXJ2aWNlOiBUc2VkVGVsZW1ldHJ5U2VydmljZSB8IHVuZGVmaW5lZDtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBpZiAoJGN0eC5pbmplY3Rvcikge1xyXG4gICAgICAgICAgdGVsZW1ldHJ5U2VydmljZSA9ICRjdHguaW5qZWN0b3IuZ2V0KFxyXG4gICAgICAgICAgICBUc2VkVGVsZW1ldHJ5U2VydmljZVxyXG4gICAgICAgICAgKSBhcyBUc2VkVGVsZW1ldHJ5U2VydmljZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgJGN0eC5sb2dnZXI/Lndhcm4oe1xyXG4gICAgICAgICAgJ1RzZWRMb2dUZWxlbWV0cnkgLSBGYWlsZWQgdG8gZ2V0IFRlbGVtZXRyeVNlcnZpY2UgZnJvbSBpbmplY3Rvcic6XHJcbiAgICAgICAgICAgIGVycm9yLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoIXRlbGVtZXRyeVNlcnZpY2UpIHtcclxuICAgICAgICAkY3R4LmxvZ2dlcj8ud2FybihcclxuICAgICAgICAgICdbVHNlZExvZ1RlbGVtZXRyeV0gVGVsZW1ldHJ5U2VydmljZSBub3QgYXZhaWxhYmxlLCBleGVjdXRpbmcgd2l0aG91dCB0ZWxlbWV0cnknXHJcbiAgICAgICAgKTtcclxuICAgICAgICByZXR1cm4gYXdhaXQgb3JpZ2luYWxNZXRob2QuYXBwbHkodGhpcywgYXJncyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIEV4dHJhaXIgaW5mb3JtYcOnw7VlcyBiw6FzaWNhc1xyXG4gICAgICBjb25zdCByZXF1ZXN0ID0gJGN0eC5yZXF1ZXN0O1xyXG4gICAgICBjb25zdCBzZXJ2aWNlTmFtZSA9IHByb2Nlc3MuZW52LlNFUlZJQ0VfTkFNRSB8fCAndHNlZC1zZXJ2aWNlJztcclxuICAgICAgbGV0IHN0YWdlID0gcHJvY2Vzcy5lbnYuU1RBR0UgfHwgJ2RldmVsb3BtZW50JztcclxuICAgICAgaWYgKHN0YWdlID09PSAncHJvZCcpIHN0YWdlID0gJ3Byb2R1Y3Rpb24nO1xyXG5cclxuICAgICAgY29uc3QgcXVlcnlTdHJpbmdQYXJhbWV0ZXJzID0gcmVxdWVzdC5xdWVyeSB8fCB7fTtcclxuICAgICAgY29uc3Qgb3JpZ2luID0gcXVlcnlTdHJpbmdQYXJhbWV0ZXJzLm9yaWdpbiB8fCAnd2ViJztcclxuXHJcbiAgICAgIC8vIENyaWFyIHNwYW4gdXNhbmRvIFN0YW5kYXJkVHJhY2VyIChzaW1pbGFyIGFvIFNTVCBtaWRkbGV3YXJlKVxyXG4gICAgICBjb25zdCB0cmFjZXIgPSAodGVsZW1ldHJ5U2VydmljZSBhcyBhbnkpLmdldFRyYWNlcigpO1xyXG4gICAgICBsZXQgc3BhblJlc3VsdDogYW55ID0gbnVsbDtcclxuXHJcbiAgICAgIGlmICh0cmFjZXIpIHtcclxuICAgICAgICBzcGFuUmVzdWx0ID0gdHJhY2VyLnN0YXJ0U3Bhbih7XHJcbiAgICAgICAgICBzcGFuTmFtZTogYCR7Y29udHJvbGxlck5hbWV9LiR7bWV0aG9kTmFtZX1gLFxyXG4gICAgICAgICAgc2VydmljZU5hbWUsXHJcbiAgICAgICAgICBlbnZpcm9ubWVudDogc3RhZ2UsXHJcbiAgICAgICAgICBleGVjdXRpb246IHtcclxuICAgICAgICAgICAgY29udHJvbGxlcjogY29udHJvbGxlck5hbWUsXHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXJNZXRob2Q6IG1ldGhvZE5hbWUsXHJcbiAgICAgICAgICAgIHJlcXVlc3RJZDogJGN0eC5pZCxcclxuICAgICAgICAgICAgYXdzUmVxdWVzdElkOiAkY3R4LmNvbnRleHQ/LmF3c1JlcXVlc3RJZCxcclxuICAgICAgICAgICAgb3JpZ2luLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGh0dHA6IHtcclxuICAgICAgICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcclxuICAgICAgICAgICAgdXJsOiByZXF1ZXN0LnVybCxcclxuICAgICAgICAgICAgZW5kcG9pbnQ6IHJlcXVlc3QudXJsLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gQ3JpYXIgbcOpdHJpY2FzIChzaW1pbGFyIGFvIFNTVCBtaWRkbGV3YXJlKVxyXG4gICAgICBjb25zdCBtZXRlciA9IG1ldHJpY3MuZ2V0TWV0ZXIob3JpZ2luKTtcclxuICAgICAgY29uc3QgZXhlY3V0aW9uVGltZUhpc3RvZ3JhbSA9IG1ldGVyLmNyZWF0ZUhpc3RvZ3JhbShcclxuICAgICAgICAndHNlZF9leGVjdXRpb25fZHVyYXRpb24nLFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGVtcG8gdG90YWwgZGUgZXhlY3XDp8OjbyBkbyBtw6l0b2RvIFRzZWQgZW0gbXMnLFxyXG4gICAgICAgICAgdW5pdDogJ21zJyxcclxuICAgICAgICAgIHZhbHVlVHlwZTogVmFsdWVUeXBlLkRPVUJMRSxcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgICAgIGNvbnN0IHN1Y2Nlc3NDb3VudGVyID0gbWV0ZXIuY3JlYXRlQ291bnRlcigndHNlZF9zdWNjZXNzZnVsX3JlcXVlc3RzJywge1xyXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnVG90YWwgZGUgcmVxdWlzacOnw7VlcyBiZW0tc3VjZWRpZGFzJyxcclxuICAgICAgfSk7XHJcbiAgICAgIGNvbnN0IGZhaWx1cmVDb3VudGVyID0gbWV0ZXIuY3JlYXRlQ291bnRlcigndHNlZF9mYWlsZWRfcmVxdWVzdHMnLCB7XHJcbiAgICAgICAgZGVzY3JpcHRpb246ICdUb3RhbCBkZSByZXF1aXNpw6fDtWVzIGNvbSBmYWxoYScsXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBvcmlnaW5hbE1ldGhvZC5hcHBseSh0aGlzLCBhcmdzKTtcclxuXHJcbiAgICAgICAgLy8gU1VDRVNTTyAtIFNpbWlsYXIgYW8gJ2FmdGVyJyBkbyBTU1QgbWlkZGxld2FyZVxyXG4gICAgICAgIGNvbnN0IGR1cmF0aW9uTXMgPSBwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0VGltZTtcclxuXHJcbiAgICAgICAgLy8gTWFyY2FyIHNwYW4gY29tbyBzdWNlc3NvXHJcbiAgICAgICAgaWYgKHNwYW5SZXN1bHQpIHtcclxuICAgICAgICAgIHNwYW5SZXN1bHQuc2V0U3VjY2Vzcyh0cnVlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIE3DqXRyaWNhcyBkZSBzdWNlc3NvXHJcbiAgICAgICAgc3VjY2Vzc0NvdW50ZXIuYWRkKDEsIHtcclxuICAgICAgICAgIG9yaWdpbixcclxuICAgICAgICAgIGNvbnRyb2xsZXI6IGNvbnRyb2xsZXJOYW1lLFxyXG4gICAgICAgICAgbWV0aG9kOiBtZXRob2ROYW1lLFxyXG4gICAgICAgICAgJ3NlcnZpY2UubmFtZSc6IHNlcnZpY2VOYW1lLFxyXG4gICAgICAgICAgJ2RlcGxveW1lbnQuZW52aXJvbm1lbnQubmFtZSc6IHN0YWdlLFxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBleGVjdXRpb25UaW1lSGlzdG9ncmFtLnJlY29yZChkdXJhdGlvbk1zLCB7XHJcbiAgICAgICAgICBvcmlnaW4sXHJcbiAgICAgICAgICBzdGF0dXM6ICdzdWNjZXNzJyxcclxuICAgICAgICAgIGNvbnRyb2xsZXI6IGNvbnRyb2xsZXJOYW1lLFxyXG4gICAgICAgICAgbWV0aG9kOiBtZXRob2ROYW1lLFxyXG4gICAgICAgICAgJ3NlcnZpY2UubmFtZSc6IHNlcnZpY2VOYW1lLFxyXG4gICAgICAgICAgJ2RlcGxveW1lbnQuZW52aXJvbm1lbnQubmFtZSc6IHN0YWdlLFxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBMb2cgZGUgc3VjZXNzbyAoc2ltaWxhciBhbyBTU1QpXHJcbiAgICAgICAgY29uc3QgbG9nZ2VyID0gKHRlbGVtZXRyeVNlcnZpY2UgYXMgYW55KS5nZXRMb2dnZXIoKTtcclxuICAgICAgICBpZiAobG9nZ2VyKSB7XHJcbiAgICAgICAgICBhd2FpdCBsb2dnZXIubG9nSW5mbyh7XHJcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdSZXF1ZXN0IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHknLFxyXG4gICAgICAgICAgICBzZXJ2aWNlTmFtZSxcclxuICAgICAgICAgICAgZW52aXJvbm1lbnQ6IHN0YWdlLFxyXG4gICAgICAgICAgICBleGVjdXRpb246IHtcclxuICAgICAgICAgICAgICBjb250cm9sbGVyOiBjb250cm9sbGVyTmFtZSxcclxuICAgICAgICAgICAgICBjb250cm9sbGVyTWV0aG9kOiBtZXRob2ROYW1lLFxyXG4gICAgICAgICAgICAgIHJlcXVlc3RJZDogJGN0eC5pZCxcclxuICAgICAgICAgICAgICBhd3NSZXF1ZXN0SWQ6ICRjdHguY29udGV4dD8uYXdzUmVxdWVzdElkLFxyXG4gICAgICAgICAgICAgIG9yaWdpbixcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgaHR0cDoge1xyXG4gICAgICAgICAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXHJcbiAgICAgICAgICAgICAgdXJsOiByZXF1ZXN0LnVybCxcclxuICAgICAgICAgICAgICBlbmRwb2ludDogcmVxdWVzdC51cmwsXHJcbiAgICAgICAgICAgICAgc3RhdHVzQ29kZTogJGN0eC5yZXNwb25zZT8uc3RhdHVzQ29kZSB8fCAyMDAsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHBlcmZvcm1hbmNlOiB7XHJcbiAgICAgICAgICAgICAgZHVyYXRpb25NcyxcclxuICAgICAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBGaW5hbGl6YXIgc3BhbiBlIGZvcmNlIGZsdXNoXHJcbiAgICAgICAgaWYgKHNwYW5SZXN1bHQpIHtcclxuICAgICAgICAgIHNwYW5SZXN1bHQuZW5kKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGF3YWl0ICh0ZWxlbWV0cnlTZXJ2aWNlIGFzIGFueSkudGVsZW1ldHJ5UHJvdmlkZXIuZm9yY2VGbHVzaCgpO1xyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XHJcbiAgICAgICAgLy8gRVJSTyAtIFNpbWlsYXIgYW8gJ29uRXJyb3InIGRvIFNTVCBtaWRkbGV3YXJlXHJcbiAgICAgICAgY29uc3QgZHVyYXRpb25NcyA9IHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnRUaW1lO1xyXG5cclxuICAgICAgICAkY3R4LmxvZ2dlcj8uaW5mbygnRXJyb3IgY2F1Z2h0LCBzZW5kaW5nIHRvIHRlbGVtZXRyeScpO1xyXG5cclxuICAgICAgICAvLyBNYXJjYXIgc3BhbiBjb21vIGVycm9cclxuICAgICAgICBpZiAoc3BhblJlc3VsdCkge1xyXG4gICAgICAgICAgc3BhblJlc3VsdC5zZXRFcnJvcihlcnJvcik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBNw6l0cmljYXMgZGUgZXJyb1xyXG4gICAgICAgIGZhaWx1cmVDb3VudGVyLmFkZCgxLCB7XHJcbiAgICAgICAgICBvcmlnaW4sXHJcbiAgICAgICAgICBlcnJvcl90eXBlOiBlcnJvcj8uY29uc3RydWN0b3I/Lm5hbWUgfHwgJ1Vua25vd25FcnJvcicsXHJcbiAgICAgICAgICBjb250cm9sbGVyOiBjb250cm9sbGVyTmFtZSxcclxuICAgICAgICAgIG1ldGhvZDogbWV0aG9kTmFtZSxcclxuICAgICAgICAgICdzZXJ2aWNlLm5hbWUnOiBzZXJ2aWNlTmFtZSxcclxuICAgICAgICAgICdkZXBsb3ltZW50LmVudmlyb25tZW50Lm5hbWUnOiBzdGFnZSxcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZXhlY3V0aW9uVGltZUhpc3RvZ3JhbS5yZWNvcmQoZHVyYXRpb25Ncywge1xyXG4gICAgICAgICAgb3JpZ2luLFxyXG4gICAgICAgICAgc3RhdHVzOiAnZXJyb3InLFxyXG4gICAgICAgICAgY29udHJvbGxlcjogY29udHJvbGxlck5hbWUsXHJcbiAgICAgICAgICBtZXRob2Q6IG1ldGhvZE5hbWUsXHJcbiAgICAgICAgICAnc2VydmljZS5uYW1lJzogc2VydmljZU5hbWUsXHJcbiAgICAgICAgICAnZGVwbG95bWVudC5lbnZpcm9ubWVudC5uYW1lJzogc3RhZ2UsXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIEV4dHJhaXIgaW5mb3JtYcOnw7VlcyBkbyB1c3XDoXJpb1xyXG4gICAgICAgIGxldCB1c2VySW5mbzogYW55ID0ge307XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIC8vIEB0cy1pZ25vcmUgLSBMb2dnZWRVc2VySWRlbnRpZmllciDDqSBlc3BlY8OtZmljbyBkYSBhcGxpY2HDp8Ojb1xyXG4gICAgICAgICAgaWYgKHR5cGVvZiBMb2dnZWRVc2VySWRlbnRpZmllciAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICBjb25zdCB7IGxvZ2dlZFVzZXIgfSA9IExvZ2dlZFVzZXJJZGVudGlmaWVyLnVzZSgkY3R4KTtcclxuICAgICAgICAgICAgdXNlckluZm8gPSB7XHJcbiAgICAgICAgICAgICAgYWNjb3VudFVzZXJVaWQ6IGxvZ2dlZFVzZXI/LnVpZCxcclxuICAgICAgICAgICAgICBhY2NvdW50VWlkOiBsb2dnZWRVc2VyPy5hY2NvdW50Py51aWQsXHJcbiAgICAgICAgICAgICAgYXBwbGljYXRpb25VaWQ6IGxvZ2dlZFVzZXI/LmFwcGxpY2F0aW9uPy51aWQsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgLy8gTG9nZ2VkVXNlcklkZW50aWZpZXIgbsOjbyBlc3TDoSBkaXNwb27DrXZlbFxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gTG9nIGRlIGVycm8gKHNpbWlsYXIgYW8gU1NUKVxyXG4gICAgICAgIGF3YWl0IHRlbGVtZXRyeVNlcnZpY2UubG9nRXJyb3Ioe1xyXG4gICAgICAgICAgZXJyb3I6IGVycm9yLFxyXG4gICAgICAgICAgY29udGV4dDoge1xyXG4gICAgICAgICAgICBzdGF0dXNDb2RlOiBlcnJvci5zdGF0dXMgfHwgNTAwLFxyXG4gICAgICAgICAgICB1cmw6IHJlcXVlc3QudXJsLFxyXG4gICAgICAgICAgICBoZWFkZXJzOiByZXF1ZXN0LmhlYWRlcnMsXHJcbiAgICAgICAgICAgIGJvZHk6IHJlcXVlc3QuYm9keSxcclxuICAgICAgICAgICAgcGFyYW1zOiByZXF1ZXN0LnBhcmFtcyxcclxuICAgICAgICAgICAgcXVlcnk6IHJlcXVlc3QucXVlcnksXHJcbiAgICAgICAgICAgIGVycm9yVHlwZTogZXJyb3I/LmNvbnN0cnVjdG9yPy5uYW1lLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIC4uLnVzZXJJbmZvLFxyXG4gICAgICAgICAgcmVxdWVzdElkOiAkY3R4LmlkLFxyXG4gICAgICAgICAgYXdzUmVxdWVzdElkOiAkY3R4LmNvbnRleHQ/LmF3c1JlcXVlc3RJZCxcclxuICAgICAgICAgIGVuZHBvaW50OiByZXF1ZXN0LnVybCxcclxuICAgICAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXHJcbiAgICAgICAgICBjb250cm9sbGVyOiBjb250cm9sbGVyTmFtZSxcclxuICAgICAgICAgIGNvbnRyb2xsZXJNZXRob2Q6IG1ldGhvZE5hbWUsXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIEZpbmFsaXphciBzcGFuIGUgZm9yY2UgZmx1c2hcclxuICAgICAgICBpZiAoc3BhblJlc3VsdCkge1xyXG4gICAgICAgICAgc3BhblJlc3VsdC5lbmQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYXdhaXQgKHRlbGVtZXRyeVNlcnZpY2UgYXMgYW55KS50ZWxlbWV0cnlQcm92aWRlci5mb3JjZUZsdXNoKCk7XHJcblxyXG4gICAgICAgICRjdHgubG9nZ2VyLmluZm8oJ0Vycm9yIHNlbnQgdG8gdGVsZW1ldHJ5Jyk7XHJcblxyXG4gICAgICAgIC8vIFJlLXRocm93IHBhcmEgbWFudGVyIG8gY29tcG9ydGFtZW50byBub3JtYWwgZGUgZXJyb1xyXG4gICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiBkZXNjcmlwdG9yO1xyXG4gIH07XHJcbn1cclxuIl19
@@ -0,0 +1,26 @@
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
+ private standardTracer;
21
+ constructor(telemetryProvider: TsedTelemetryProvider);
22
+ private getLogger;
23
+ private getTracer;
24
+ logError(data: ErrorLogData): Promise<void>;
25
+ logException(error: Error, context?: Record<string, any>): Promise<void>;
26
+ }
@@ -0,0 +1,150 @@
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
+ const api_1 = require("@opentelemetry/api");
30
+ let TsedTelemetryService = class TsedTelemetryService {
31
+ constructor(telemetryProvider) {
32
+ this.telemetryProvider = telemetryProvider;
33
+ this.standardLogger = null;
34
+ this.standardTracer = null;
35
+ }
36
+ getLogger() {
37
+ var _a;
38
+ if (!this.telemetryProvider.isInitialized()) {
39
+ (_a = this.$ctx) === null || _a === void 0 ? void 0 : _a.logger.warn('[Telemetry] Telemetry not initialized, skipping log');
40
+ return null;
41
+ }
42
+ if (!this.standardLogger) {
43
+ const loggerProvider = this.telemetryProvider.getLoggerProvider();
44
+ if (!loggerProvider) {
45
+ return null;
46
+ }
47
+ const otelLogger = loggerProvider.getLogger('tsed-service-logger', '1.0.0');
48
+ const serviceName = process.env.SERVICE_NAME || 'tsed-service';
49
+ this.standardLogger = new core_1.StandardLogger(otelLogger, serviceName);
50
+ }
51
+ return this.standardLogger;
52
+ }
53
+ getTracer() {
54
+ var _a;
55
+ if (!this.telemetryProvider.isInitialized()) {
56
+ (_a = this.$ctx) === null || _a === void 0 ? void 0 : _a.logger.warn('[Telemetry] Telemetry not initialized, skipping trace');
57
+ return null;
58
+ }
59
+ if (!this.standardTracer) {
60
+ const tracerProvider = this.telemetryProvider.getTracerProvider();
61
+ if (!tracerProvider) {
62
+ return null;
63
+ }
64
+ const serviceName = process.env.SERVICE_NAME || 'tsed-service';
65
+ const otelTracer = api_1.trace.getTracer(serviceName, '1.0.0');
66
+ this.standardTracer = new core_1.StandardTracer(otelTracer, serviceName);
67
+ }
68
+ return this.standardTracer;
69
+ }
70
+ logError(data) {
71
+ return __awaiter(this, void 0, void 0, function* () {
72
+ var _a, _b, _c, _d;
73
+ const logger = this.getLogger();
74
+ if (!logger) {
75
+ return;
76
+ }
77
+ try {
78
+ let stage = process.env.STAGE || 'development';
79
+ if (stage === 'prod')
80
+ stage = 'production';
81
+ (_a = this.$ctx) === null || _a === void 0 ? void 0 : _a.logger.info('[Telemetry] Logging error...');
82
+ yield logger.logError({
83
+ message: data.error.message,
84
+ error: data.error,
85
+ serviceName: process.env.SERVICE_NAME || 'tsed-service',
86
+ environment: stage,
87
+ http: {
88
+ endpoint: data.endpoint,
89
+ method: data.method,
90
+ statusCode: data.error.status || 500,
91
+ },
92
+ user: {
93
+ accountUserUid: data.accountUserUid,
94
+ accountUid: data.accountUid,
95
+ applicationUid: data.applicationUid,
96
+ },
97
+ execution: {
98
+ requestId: data.requestId,
99
+ awsRequestId: data.awsRequestId,
100
+ controller: data.controller,
101
+ controllerMethod: data.controllerMethod,
102
+ },
103
+ context: data.context,
104
+ });
105
+ (_b = this.$ctx) === null || _b === void 0 ? void 0 : _b.logger.info('[Telemetry] Forcing flush...');
106
+ const flushStartTime = Date.now();
107
+ yield this.telemetryProvider.forceFlush();
108
+ const flushDuration = Date.now() - flushStartTime;
109
+ (_c = this.$ctx) === null || _c === void 0 ? void 0 : _c.logger.info({
110
+ 'Telemetry - Log sent successfully': {
111
+ errorType: data.error.name,
112
+ message: data.error.message,
113
+ endpoint: data.endpoint,
114
+ controller: data.controller,
115
+ method: data.controllerMethod,
116
+ flushDurationMs: flushDuration,
117
+ },
118
+ });
119
+ }
120
+ catch (error) {
121
+ (_d = this.$ctx) === null || _d === void 0 ? void 0 : _d.logger.error({
122
+ 'Telemetry - CRITICAL ERROR - Failed to log error': {
123
+ originalError: data.error.message,
124
+ telemetryError: error instanceof Error ? error.message : String(error),
125
+ stack: error instanceof Error ? error.stack : undefined,
126
+ },
127
+ });
128
+ }
129
+ });
130
+ }
131
+ logException(error, context) {
132
+ return __awaiter(this, void 0, void 0, function* () {
133
+ yield this.logError({
134
+ error,
135
+ context,
136
+ });
137
+ });
138
+ }
139
+ };
140
+ exports.TsedTelemetryService = TsedTelemetryService;
141
+ __decorate([
142
+ (0, di_1.InjectContext)(),
143
+ __metadata("design:type", platform_serverless_1.ServerlessContext)
144
+ ], TsedTelemetryService.prototype, "$ctx", void 0);
145
+ exports.TsedTelemetryService = TsedTelemetryService = __decorate([
146
+ (0, di_1.Injectable)(),
147
+ __param(0, (0, di_1.Inject)()),
148
+ __metadata("design:paramtypes", [config_1.TsedTelemetryProvider])
149
+ ], TsedTelemetryService);
150
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90c2VkL3NlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsaUNBQTZEO0FBQzdELG1FQUE4RDtBQUM5RCxxQ0FBaUQ7QUFDakQsa0NBQXlEO0FBQ3pELDRDQUFvRDtBQWlCN0MsSUFBTSxvQkFBb0IsR0FBMUIsTUFBTSxvQkFBb0I7SUFLL0IsWUFFRSxpQkFBeUQ7UUFBeEMsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUF1QjtRQUxuRCxtQkFBYyxHQUEwQixJQUFJLENBQUM7UUFDN0MsbUJBQWMsR0FBMEIsSUFBSSxDQUFDO0lBS2xELENBQUM7SUFFSSxTQUFTOztRQUNmLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQztZQUM1QyxNQUFBLElBQUksQ0FBQyxJQUFJLDBDQUFFLE1BQU0sQ0FBQyxJQUFJLENBQ3BCLHFEQUFxRCxDQUN0RCxDQUFDO1lBQ0YsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN6QixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUNsRSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3BCLE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztZQUVELE1BQU0sVUFBVSxHQUFHLGNBQWMsQ0FBQyxTQUFTLENBQ3pDLHFCQUFxQixFQUNyQixPQUFPLENBQ1IsQ0FBQztZQUdGLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxJQUFJLGNBQWMsQ0FBQztZQUMvRCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUkscUJBQWMsQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDcEUsQ0FBQztRQUVELE9B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QUEsV0FBTSxHQUFFLENBQUE7cUNBQzJCLDhCQUFxQjtHQVBoRCxvQkFBb0IsQ0F1SWhDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0LCBJbmplY3RDb250ZXh0IH0gZnJvbSAnQHRzZWQvZGknO1xyXG5pbXBvcnQgeyBTZXJ2ZXJsZXNzQ29udGV4dCB9IGZyb20gJ0B0c2VkL3BsYXRmb3JtLXNlcnZlcmxlc3MnO1xyXG5pbXBvcnQgeyBUc2VkVGVsZW1ldHJ5UHJvdmlkZXIgfSBmcm9tICcuL2NvbmZpZyc7XHJcbmltcG9ydCB7IFN0YW5kYXJkTG9nZ2VyLCBTdGFuZGFyZFRyYWNlciB9IGZyb20gJy4uL2NvcmUnO1xyXG5pbXBvcnQgeyB0cmFjZSwgbWV0cmljcyB9IGZyb20gJ0BvcGVudGVsZW1ldHJ5L2FwaSc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEVycm9yTG9nRGF0YSB7XHJcbiAgZXJyb3I6IEVycm9yO1xyXG4gIGNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xyXG4gIGFjY291bnRVc2VyVWlkPzogc3RyaW5nO1xyXG4gIGFjY291bnRVaWQ/OiBzdHJpbmc7XHJcbiAgcmVxdWVzdElkPzogc3RyaW5nO1xyXG4gIGVuZHBvaW50Pzogc3RyaW5nO1xyXG4gIG1ldGhvZD86IHN0cmluZztcclxuICBjb250cm9sbGVyPzogc3RyaW5nO1xyXG4gIGNvbnRyb2xsZXJNZXRob2Q/OiBzdHJpbmc7XHJcbiAgYXBwbGljYXRpb25VaWQ/OiBzdHJpbmc7XHJcbiAgYXdzUmVxdWVzdElkPzogc3RyaW5nO1xyXG59XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBUc2VkVGVsZW1ldHJ5U2VydmljZSB7XHJcbiAgQEluamVjdENvbnRleHQoKSBwcm90ZWN0ZWQgJGN0eDogU2VydmVybGVzc0NvbnRleHQ7XHJcbiAgcHJpdmF0ZSBzdGFuZGFyZExvZ2dlcjogU3RhbmRhcmRMb2dnZXIgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIHN0YW5kYXJkVHJhY2VyOiBTdGFuZGFyZFRyYWNlciB8IG51bGwgPSBudWxsO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIEBJbmplY3QoKVxyXG4gICAgcHJpdmF0ZSByZWFkb25seSB0ZWxlbWV0cnlQcm92aWRlcjogVHNlZFRlbGVtZXRyeVByb3ZpZGVyXHJcbiAgKSB7fVxyXG5cclxuICBwcml2YXRlIGdldExvZ2dlcigpOiBTdGFuZGFyZExvZ2dlciB8IG51bGwge1xyXG4gICAgaWYgKCF0aGlzLnRlbGVtZXRyeVByb3ZpZGVyLmlzSW5pdGlhbGl6ZWQoKSkge1xyXG4gICAgICB0aGlzLiRjdHg/LmxvZ2dlci53YXJuKFxyXG4gICAgICAgICdbVGVsZW1ldHJ5XSBUZWxlbWV0cnkgbm90IGluaXRpYWxpemVkLCBza2lwcGluZyBsb2cnXHJcbiAgICAgICk7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy5zdGFuZGFyZExvZ2dlcikge1xyXG4gICAgICBjb25zdCBsb2dnZXJQcm92aWRlciA9IHRoaXMudGVsZW1ldHJ5UHJvdmlkZXIuZ2V0TG9nZ2VyUHJvdmlkZXIoKTtcclxuICAgICAgaWYgKCFsb2dnZXJQcm92aWRlcikge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBvdGVsTG9nZ2VyID0gbG9nZ2VyUHJvdmlkZXIuZ2V0TG9nZ2VyKFxyXG4gICAgICAgICd0c2VkLXNlcnZpY2UtbG9nZ2VyJyxcclxuICAgICAgICAnMS4wLjAnXHJcbiAgICAgICk7XHJcblxyXG4gICAgICAvLyBQZWdhIG8gc2VydmljZSBuYW1lIGRvIGFtYmllbnRlIG91IHVzYSBkZWZhdWx0XHJcbiAgICAgIGNvbnN0IHNlcnZpY2VOYW1lID0gcHJvY2Vzcy5lbnYuU0VSVklDRV9OQU1FIHx8ICd0c2VkLXNlcnZpY2UnO1xyXG4gICAgICB0aGlzLnN0YW5kYXJkTG9nZ2VyID0gbmV3IFN0YW5kYXJkTG9nZ2VyKG90ZWxMb2dnZXIsIHNlcnZpY2VOYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5zdGFuZGFyZExvZ2dlcjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0VHJhY2VyKCk6IFN0YW5kYXJkVHJhY2VyIHwgbnVsbCB7XHJcbiAgICBpZiAoIXRoaXMudGVsZW1ldHJ5UHJvdmlkZXIuaXNJbml0aWFsaXplZCgpKSB7XHJcbiAgICAgIHRoaXMuJGN0eD8ubG9nZ2VyLndhcm4oXHJcbiAgICAgICAgJ1tUZWxlbWV0cnldIFRlbGVtZXRyeSBub3QgaW5pdGlhbGl6ZWQsIHNraXBwaW5nIHRyYWNlJ1xyXG4gICAgICApO1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuc3RhbmRhcmRUcmFjZXIpIHtcclxuICAgICAgY29uc3QgdHJhY2VyUHJvdmlkZXIgPSB0aGlzLnRlbGVtZXRyeVByb3ZpZGVyLmdldFRyYWNlclByb3ZpZGVyKCk7XHJcbiAgICAgIGlmICghdHJhY2VyUHJvdmlkZXIpIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3Qgc2VydmljZU5hbWUgPSBwcm9jZXNzLmVudi5TRVJWSUNFX05BTUUgfHwgJ3RzZWQtc2VydmljZSc7XHJcbiAgICAgIGNvbnN0IG90ZWxUcmFjZXIgPSB0cmFjZS5nZXRUcmFjZXIoc2VydmljZU5hbWUsICcxLjAuMCcpO1xyXG4gICAgICB0aGlzLnN0YW5kYXJkVHJhY2VyID0gbmV3IFN0YW5kYXJkVHJhY2VyKG90ZWxUcmFjZXIsIHNlcnZpY2VOYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5zdGFuZGFyZFRyYWNlcjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBsb2dFcnJvcihkYXRhOiBFcnJvckxvZ0RhdGEpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IGxvZ2dlciA9IHRoaXMuZ2V0TG9nZ2VyKCk7XHJcbiAgICBpZiAoIWxvZ2dlcikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgbGV0IHN0YWdlID0gcHJvY2Vzcy5lbnYuU1RBR0UgfHwgJ2RldmVsb3BtZW50JztcclxuICAgICAgaWYgKHN0YWdlID09PSAncHJvZCcpIHN0YWdlID0gJ3Byb2R1Y3Rpb24nO1xyXG5cclxuICAgICAgdGhpcy4kY3R4Py5sb2dnZXIuaW5mbygnW1RlbGVtZXRyeV0gTG9nZ2luZyBlcnJvci4uLicpO1xyXG5cclxuICAgICAgYXdhaXQgbG9nZ2VyLmxvZ0Vycm9yKHtcclxuICAgICAgICBtZXNzYWdlOiBkYXRhLmVycm9yLm1lc3NhZ2UsXHJcbiAgICAgICAgZXJyb3I6IGRhdGEuZXJyb3IsXHJcbiAgICAgICAgc2VydmljZU5hbWU6IHByb2Nlc3MuZW52LlNFUlZJQ0VfTkFNRSB8fCAndHNlZC1zZXJ2aWNlJyxcclxuICAgICAgICBlbnZpcm9ubWVudDogc3RhZ2UsXHJcbiAgICAgICAgaHR0cDoge1xyXG4gICAgICAgICAgZW5kcG9pbnQ6IGRhdGEuZW5kcG9pbnQsXHJcbiAgICAgICAgICBtZXRob2Q6IGRhdGEubWV0aG9kLFxyXG4gICAgICAgICAgc3RhdHVzQ29kZTogKGRhdGEuZXJyb3IgYXMgYW55KS5zdGF0dXMgfHwgNTAwLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgdXNlcjoge1xyXG4gICAgICAgICAgYWNjb3VudFVzZXJVaWQ6IGRhdGEuYWNjb3VudFVzZXJVaWQsXHJcbiAgICAgICAgICBhY2NvdW50VWlkOiBkYXRhLmFjY291bnRVaWQsXHJcbiAgICAgICAgICBhcHBsaWNhdGlvblVpZDogZGF0YS5hcHBsaWNhdGlvblVpZCxcclxuICAgICAgICB9LFxyXG4gICAgICAgIGV4ZWN1dGlvbjoge1xyXG4gICAgICAgICAgcmVxdWVzdElkOiBkYXRhLnJlcXVlc3RJZCxcclxuICAgICAgICAgIGF3c1JlcXVlc3RJZDogZGF0YS5hd3NSZXF1ZXN0SWQsXHJcbiAgICAgICAgICBjb250cm9sbGVyOiBkYXRhLmNvbnRyb2xsZXIsXHJcbiAgICAgICAgICBjb250cm9sbGVyTWV0aG9kOiBkYXRhLmNvbnRyb2xsZXJNZXRob2QsXHJcbiAgICAgICAgfSxcclxuICAgICAgICBjb250ZXh0OiBkYXRhLmNvbnRleHQsXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgLy8gQ1JJVElDQUw6IEZvcmNlIGZsdXNoIHRvIGVuc3VyZSBsb2cgaXMgc2VudCBiZWZvcmUgTGFtYmRhIGZyZWV6ZXNcclxuICAgICAgdGhpcy4kY3R4Py5sb2dnZXIuaW5mbygnW1RlbGVtZXRyeV0gRm9yY2luZyBmbHVzaC4uLicpO1xyXG4gICAgICBjb25zdCBmbHVzaFN0YXJ0VGltZSA9IERhdGUubm93KCk7XHJcblxyXG4gICAgICBhd2FpdCB0aGlzLnRlbGVtZXRyeVByb3ZpZGVyLmZvcmNlRmx1c2goKTtcclxuXHJcbiAgICAgIGNvbnN0IGZsdXNoRHVyYXRpb24gPSBEYXRlLm5vdygpIC0gZmx1c2hTdGFydFRpbWU7XHJcblxyXG4gICAgICB0aGlzLiRjdHg/LmxvZ2dlci5pbmZvKHtcclxuICAgICAgICAnVGVsZW1ldHJ5IC0gTG9nIHNlbnQgc3VjY2Vzc2Z1bGx5Jzoge1xyXG4gICAgICAgICAgZXJyb3JUeXBlOiBkYXRhLmVycm9yLm5hbWUsXHJcbiAgICAgICAgICBtZXNzYWdlOiBkYXRhLmVycm9yLm1lc3NhZ2UsXHJcbiAgICAgICAgICBlbmRwb2ludDogZGF0YS5lbmRwb2ludCxcclxuICAgICAgICAgIGNvbnRyb2xsZXI6IGRhdGEuY29udHJvbGxlcixcclxuICAgICAgICAgIG1ldGhvZDogZGF0YS5jb250cm9sbGVyTWV0aG9kLFxyXG4gICAgICAgICAgZmx1c2hEdXJhdGlvbk1zOiBmbHVzaER1cmF0aW9uLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgdGhpcy4kY3R4Py5sb2dnZXIuZXJyb3Ioe1xyXG4gICAgICAgICdUZWxlbWV0cnkgLSBDUklUSUNBTCBFUlJPUiAtIEZhaWxlZCB0byBsb2cgZXJyb3InOiB7XHJcbiAgICAgICAgICBvcmlnaW5hbEVycm9yOiBkYXRhLmVycm9yLm1lc3NhZ2UsXHJcbiAgICAgICAgICB0ZWxlbWV0cnlFcnJvcjpcclxuICAgICAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxyXG4gICAgICAgICAgc3RhY2s6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5zdGFjayA6IHVuZGVmaW5lZCxcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuICAgICAgLy8gRG9uJ3QgcmUtdGhyb3cgdG8gYXZvaWQgYnJlYWtpbmcgdGhlIGFwcGxpY2F0aW9uIGZsb3dcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBsb2dFeGNlcHRpb24oXHJcbiAgICBlcnJvcjogRXJyb3IsXHJcbiAgICBjb250ZXh0PzogUmVjb3JkPHN0cmluZywgYW55PlxyXG4gICk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5sb2dFcnJvcih7XHJcbiAgICAgIGVycm9yLFxyXG4gICAgICBjb250ZXh0LFxyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1sb2ctcmVjb3JkLXByb2Nlc3Nvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90c2VkL3N5bmMtbG9nLXJlY29yZC1wcm9jZXNzb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBWUEsTUFBYSwwQkFBMEI7SUFJckMsWUFBWSxRQUF5QjtRQUZwQixtQkFBYyxHQUFvQixFQUFFLENBQUM7UUFHcEQsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7SUFDM0IsQ0FBQztJQUVELE1BQU0sQ0FBQyxTQUE0QixFQUFFLFFBQWtCO1FBSXJELE1BQU0sYUFBYSxHQUFHLElBQUksT0FBTyxDQUFPLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQzFELElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRTtnQkFDM0MsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUN0QixPQUFPLEVBQUUsQ0FBQztnQkFDWixDQUFDO3FCQUFNLENBQUM7b0JBQ04sT0FBTyxDQUFDLEtBQUssQ0FDWCx5Q0FBeUMsRUFDekMsTUFBTSxDQUFDLEtBQUssQ0FDYixDQUFDO29CQUNGLE1BQU0sQ0FDSixNQUFNLENBQUMsS0FBSyxZQUFZLEtBQUs7d0JBQzNCLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSzt3QkFDZCxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUNwQyxDQUFDO2dCQUNKLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQzthQUNDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDVCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUN6RCxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNmLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN2QyxDQUFDO1FBQ0gsQ0FBQyxDQUFDO2FBQ0QsS0FBSyxDQUFDLENBQUMsS0FBYyxFQUFFLEVBQUU7WUFDeEIsT0FBTyxDQUFDLEtBQUssQ0FBQyx3Q0FBd0MsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUMvRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUN6RCxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNmLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN2QyxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFTCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUssVUFBVTs7WUFDZCxPQUFPLENBQUMsR0FBRyxDQUNULG1EQUFtRCxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sa0JBQWtCLENBQ2hHLENBQUM7WUFFRixJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUNyQyxPQUFPLENBQUMsR0FBRyxDQUFDLHNEQUFzRCxDQUFDLENBQUM7Z0JBQ3BFLE9BQU87WUFDVCxDQUFDO1lBRUQsSUFBSSxDQUFDO2dCQUVILE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7Z0JBQ3ZDLE9BQU8sQ0FBQyxHQUFHLENBQUMsd0RBQXdELENBQUMsQ0FBQztZQUN4RSxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixPQUFPLENBQUMsS0FBSyxDQUFDLG1EQUFtRCxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUMxRSxNQUFNLEtBQUssQ0FBQztZQUNkLENBQUM7UUFDSCxDQUFDO0tBQUE7SUFFSyxRQUFROztZQUNaLE9BQU8sQ0FBQyxHQUFHLENBQUMsMkNBQTJDLENBQUMsQ0FBQztZQUN6RCxNQUFNLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUN4QixNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDL0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO1FBQzVELENBQUM7S0FBQTtDQUNGO0FBeEVELGdFQXdFQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IExvZ1JlY29yZFByb2Nlc3NvciwgUmVhZGFibGVMb2dSZWNvcmQgfSBmcm9tICdAb3BlbnRlbGVtZXRyeS9zZGstbG9ncyc7XHJcbmltcG9ydCB7IE9UTFBMb2dFeHBvcnRlciB9IGZyb20gJ0BvcGVudGVsZW1ldHJ5L2V4cG9ydGVyLWxvZ3Mtb3RscC1odHRwJztcclxuaW1wb3J0IHsgQ29udGV4dCB9IGZyb20gJ0BvcGVudGVsZW1ldHJ5L2FwaSc7XHJcblxyXG4vKipcclxuICogQ3VzdG9tIExvZ1JlY29yZFByb2Nlc3NvciB0aGF0IGVuc3VyZXMgc3luY2hyb25vdXMgZXhwb3J0IGZvciBBV1MgTGFtYmRhXHJcbiAqXHJcbiAqIFRoaXMgcHJvY2Vzc29yIHdyYXBzIHRoZSBPVExQIGV4cG9ydGVyIGFuZCBlbnN1cmVzIHRoYXQgbG9ncyBhcmUgYWN0dWFsbHlcclxuICogZXhwb3J0ZWQgc3luY2hyb25vdXNseSBieSBpbW1lZGlhdGVseSBjYWxsaW5nIGV4cG9ydCgpIGFuZCB3YWl0aW5nIGZvciBpdFxyXG4gKiB0byBjb21wbGV0ZSwgcmF0aGVyIHRoYW4gcmVseWluZyBvbiBTaW1wbGVMb2dSZWNvcmRQcm9jZXNzb3Igd2hpY2ggbWF5IG5vdFxyXG4gKiBwcm9wZXJseSBhd2FpdCB0aGUgYXN5bmMgSFRUUCByZXF1ZXN0IGluIExhbWJkYSBlbnZpcm9ubWVudHMuXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgVHNlZFN5bmNMb2dSZWNvcmRQcm9jZXNzb3IgaW1wbGVtZW50cyBMb2dSZWNvcmRQcm9jZXNzb3Ige1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZXhwb3J0ZXI6IE9UTFBMb2dFeHBvcnRlcjtcclxuICBwcml2YXRlIHJlYWRvbmx5IHBlbmRpbmdFeHBvcnRzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcclxuXHJcbiAgY29uc3RydWN0b3IoZXhwb3J0ZXI6IE9UTFBMb2dFeHBvcnRlcikge1xyXG4gICAgdGhpcy5leHBvcnRlciA9IGV4cG9ydGVyO1xyXG4gIH1cclxuXHJcbiAgb25FbWl0KGxvZ1JlY29yZDogUmVhZGFibGVMb2dSZWNvcmQsIF9jb250ZXh0PzogQ29udGV4dCk6IHZvaWQge1xyXG4gICAgLy8gRXhwb3J0IGltbWVkaWF0ZWx5IGFuZCB0cmFjayB0aGUgcHJvbWlzZVxyXG4gICAgLy8gVGhlIGV4cG9ydCBtZXRob2QgcmV0dXJucyB2b2lkLCBidXQgaW50ZXJuYWxseSB0cmlnZ2VycyBhc3luYyBIVFRQIHJlcXVlc3RcclxuICAgIC8vIFdlIG5lZWQgdG8gd3JhcCBpdCB0byB0cmFjayBjb21wbGV0aW9uXHJcbiAgICBjb25zdCBleHBvcnRQcm9taXNlID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICB0aGlzLmV4cG9ydGVyLmV4cG9ydChbbG9nUmVjb3JkXSwgKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgIGlmIChyZXN1bHQuY29kZSA9PT0gMCkge1xyXG4gICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxyXG4gICAgICAgICAgICAnW1N5bmNMb2dSZWNvcmRQcm9jZXNzb3JdIEV4cG9ydCBmYWlsZWQ6JyxcclxuICAgICAgICAgICAgcmVzdWx0LmVycm9yXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgcmVqZWN0KFxyXG4gICAgICAgICAgICByZXN1bHQuZXJyb3IgaW5zdGFuY2VvZiBFcnJvclxyXG4gICAgICAgICAgICAgID8gcmVzdWx0LmVycm9yXHJcbiAgICAgICAgICAgICAgOiBuZXcgRXJyb3IoU3RyaW5nKHJlc3VsdC5lcnJvcikpXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9KVxyXG4gICAgICAudGhlbigoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnBlbmRpbmdFeHBvcnRzLmluZGV4T2YoZXhwb3J0UHJvbWlzZSk7XHJcbiAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcclxuICAgICAgICAgIHRoaXMucGVuZGluZ0V4cG9ydHMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICAgIC5jYXRjaCgoZXJyb3I6IHVua25vd24pID0+IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdbU3luY0xvZ1JlY29yZFByb2Nlc3Nvcl0gRXhwb3J0IGVycm9yOicsIGVycm9yKTtcclxuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMucGVuZGluZ0V4cG9ydHMuaW5kZXhPZihleHBvcnRQcm9taXNlKTtcclxuICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xyXG4gICAgICAgICAgdGhpcy5wZW5kaW5nRXhwb3J0cy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgdGhpcy5wZW5kaW5nRXhwb3J0cy5wdXNoKGV4cG9ydFByb21pc2UpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZm9yY2VGbHVzaCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnNvbGUubG9nKFxyXG4gICAgICBgW1N5bmNMb2dSZWNvcmRQcm9jZXNzb3JdIGZvcmNlRmx1c2ggY2FsbGVkIHdpdGggJHt0aGlzLnBlbmRpbmdFeHBvcnRzLmxlbmd0aH0gcGVuZGluZyBleHBvcnRzYFxyXG4gICAgKTtcclxuXHJcbiAgICBpZiAodGhpcy5wZW5kaW5nRXhwb3J0cy5sZW5ndGggPT09IDApIHtcclxuICAgICAgY29uc29sZS5sb2coJ1tTeW5jTG9nUmVjb3JkUHJvY2Vzc29yXSBObyBwZW5kaW5nIGV4cG9ydHMgdG8gZmx1c2gnKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIC8vIFdhaXQgZm9yIGFsbCBwZW5kaW5nIGV4cG9ydHMgdG8gY29tcGxldGVcclxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwodGhpcy5wZW5kaW5nRXhwb3J0cyk7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdbU3luY0xvZ1JlY29yZFByb2Nlc3Nvcl0gQWxsIHBlbmRpbmcgZXhwb3J0cyBjb21wbGV0ZWQnKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tTeW5jTG9nUmVjb3JkUHJvY2Vzc29yXSBFcnJvciBkdXJpbmcgZm9yY2VGbHVzaDonLCBlcnJvcik7XHJcbiAgICAgIHRocm93IGVycm9yO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgc2h1dGRvd24oKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zb2xlLmxvZygnW1N5bmNMb2dSZWNvcmRQcm9jZXNzb3JdIFNodXR0aW5nIGRvd24uLi4nKTtcclxuICAgIGF3YWl0IHRoaXMuZm9yY2VGbHVzaCgpO1xyXG4gICAgYXdhaXQgdGhpcy5leHBvcnRlci5zaHV0ZG93bigpO1xyXG4gICAgY29uc29sZS5sb2coJ1tTeW5jTG9nUmVjb3JkUHJvY2Vzc29yXSBTaHV0ZG93biBjb21wbGV0ZScpO1xyXG4gIH1cclxufVxyXG4iXX0=