@mecanizou/telemetry-hub 1.0.2 → 1.0.5

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 (72) 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 +36 -14
  5. package/DOCS_GUIDE.md +151 -151
  6. package/README.md +248 -248
  7. package/dist/core/__tests__/logger-types.test.js +1 -1
  8. package/dist/core/__tests__/logger.test.js +1 -1
  9. package/dist/core/__tests__/tracer.test.js +1 -1
  10. package/dist/core/index.js +1 -1
  11. package/dist/core/logger-types.js +1 -1
  12. package/dist/core/logger.js +1 -1
  13. package/dist/core/tracer-types.js +1 -1
  14. package/dist/core/tracer.js +1 -1
  15. package/dist/index.js +1 -1
  16. package/dist/sst/__tests__/telemetry.test.js +1 -1
  17. package/dist/sst/index.js +1 -1
  18. package/dist/sst/middy/index.js +1 -1
  19. package/dist/sst/middy/middleware.js +1 -1
  20. package/dist/sst/telemetry.js +1 -1
  21. package/dist/tsed/__tests__/config.test.js +1 -1
  22. package/dist/tsed/__tests__/service.test.js +1 -1
  23. package/dist/tsed/config.js +1 -1
  24. package/dist/tsed/index.js +1 -1
  25. package/dist/tsed/log-telemetry.js +1 -1
  26. package/dist/tsed/service.js +1 -1
  27. package/dist/tsed/sync-log-record-processor.js +1 -1
  28. package/package.json +72 -72
  29. package/release.config.js +23 -23
  30. package/vitest.config.ts +22 -22
  31. package/dist/telemetry/core/__tests__/logger-types.test.d.ts +0 -1
  32. package/dist/telemetry/core/__tests__/logger-types.test.js +0 -325
  33. package/dist/telemetry/core/__tests__/logger.test.d.ts +0 -1
  34. package/dist/telemetry/core/__tests__/logger.test.js +0 -337
  35. package/dist/telemetry/core/__tests__/tracer.test.d.ts +0 -1
  36. package/dist/telemetry/core/__tests__/tracer.test.js +0 -330
  37. package/dist/telemetry/core/index.d.ts +0 -4
  38. package/dist/telemetry/core/index.js +0 -8
  39. package/dist/telemetry/core/logger-types.d.ts +0 -43
  40. package/dist/telemetry/core/logger-types.js +0 -3
  41. package/dist/telemetry/core/logger.d.ts +0 -13
  42. package/dist/telemetry/core/logger.js +0 -123
  43. package/dist/telemetry/core/tracer-types.d.ts +0 -50
  44. package/dist/telemetry/core/tracer-types.js +0 -3
  45. package/dist/telemetry/core/tracer.d.ts +0 -10
  46. package/dist/telemetry/core/tracer.js +0 -114
  47. package/dist/telemetry/index.d.ts +0 -3
  48. package/dist/telemetry/index.js +0 -20
  49. package/dist/telemetry/sst/__tests__/telemetry.test.d.ts +0 -1
  50. package/dist/telemetry/sst/__tests__/telemetry.test.js +0 -138
  51. package/dist/telemetry/sst/index.d.ts +0 -1
  52. package/dist/telemetry/sst/index.js +0 -18
  53. package/dist/telemetry/sst/middy/index.d.ts +0 -1
  54. package/dist/telemetry/sst/middy/index.js +0 -18
  55. package/dist/telemetry/sst/middy/middleware.d.ts +0 -5
  56. package/dist/telemetry/sst/middy/middleware.js +0 -157
  57. package/dist/telemetry/sst/telemetry.d.ts +0 -4
  58. package/dist/telemetry/sst/telemetry.js +0 -121
  59. package/dist/telemetry/tsed/__tests__/config.test.d.ts +0 -1
  60. package/dist/telemetry/tsed/__tests__/config.test.js +0 -146
  61. package/dist/telemetry/tsed/__tests__/service.test.d.ts +0 -1
  62. package/dist/telemetry/tsed/__tests__/service.test.js +0 -63
  63. package/dist/telemetry/tsed/config.d.ts +0 -26
  64. package/dist/telemetry/tsed/config.js +0 -166
  65. package/dist/telemetry/tsed/index.d.ts +0 -4
  66. package/dist/telemetry/tsed/index.js +0 -21
  67. package/dist/telemetry/tsed/log-telemetry.d.ts +0 -1
  68. package/dist/telemetry/tsed/log-telemetry.js +0 -196
  69. package/dist/telemetry/tsed/service.d.ts +0 -26
  70. package/dist/telemetry/tsed/service.js +0 -150
  71. package/dist/telemetry/tsed/sync-log-record-processor.d.ts +0 -11
  72. package/dist/telemetry/tsed/sync-log-record-processor.js +0 -74
@@ -1,196 +0,0 @@
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nLXRlbGVtZXRyeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZWxlbWV0cnkvdHNlZC9sb2ctdGVsZW1ldHJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBZ0JBLDRDQXdQQztBQTVQRCx1Q0FBaUQ7QUFDakQsNENBQXdEO0FBQ3hELDJDQUF5QztBQUV6QyxTQUFnQixnQkFBZ0I7SUFDOUIsT0FBTyxVQUNMLE9BQVksRUFDWixZQUFvQixFQUNwQixVQUE4QjtRQUU5QixNQUFNLGNBQWMsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDO1FBQ3hDLE1BQU0sVUFBVSxHQUFHLFlBQVksQ0FBQztRQUVoQyxVQUFVLENBQUMsS0FBSyxHQUFHLFVBQTJCLEdBQUcsSUFBVzs7O2dCQUMxRCxNQUFNLFNBQVMsR0FBRyx3QkFBVyxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUdwQyxNQUFNLElBQUksR0FBc0IsSUFBSSxDQUFDLElBQUksQ0FDdkMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUEsR0FBRyxhQUFILEdBQUcsdUJBQUgsR0FBRyxDQUFFLE9BQU8sTUFBSSxHQUFHLGFBQUgsR0FBRyx1QkFBSCxHQUFHLENBQUUsUUFBUSxDQUFBLENBQ3ZDLENBQUM7Z0JBR0YsSUFBSSxjQUFjLEdBQUcsbUJBQW1CLENBQUM7Z0JBQ3pDLElBQUksQ0FBQSxNQUFBLElBQUksYUFBSixJQUFJLHVCQUFKLElBQUksQ0FBRSxXQUFXLDBDQUFFLElBQUksS0FBSSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztvQkFDbEUsY0FBYyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDO2dCQUN6QyxDQUFDO2dCQUVELElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztvQkFDVixPQUFPLENBQUMsSUFBSSxDQUNWLG1FQUFtRSxDQUNwRSxDQUFDO29CQUNGLE9BQU8sTUFBTSxjQUFj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RUFBRSxFQUNsQixZQUFZLEVBQUUsTUFBQSxJQUFJLENBQUMsT0FBTywwQ0FBRSxZQUFZLEVBQ3hDLFFBQVEsRUFBRSxPQUFPLENBQUMsR0FBRyxFQUNyQixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU0sRUFDdEIsVUFBVSxFQUFFLGNBQWMsRUFDMUIsZ0JBQWdCLEVBQUUsVUFBVSxJQUM1QixDQUFDO29CQUdILElBQUksVUFBVSxFQUFFLENBQUM7d0JBQ2YsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDO29CQUNuQixDQUFDO29CQUNELE1BQU8sZ0JBQXdCLENBQUMsaUJBQWlCLENBQUMsVUFBVSxFQUFFLENBQUM7b0JBRS9ELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLENBQUM7b0JBRzVDLE1BQU0sS0FBSyxDQUFDO2dCQUNkLENBQUM7WUFDSCxDQUFDO1NBQUEsQ0FBQztRQUVGLE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogRGVjb3JhdG9yIHF1ZSBjYXB0dXJhIGVycm9zIGF1dG9tYXRpY2FtZW50ZSwgY3JpYSBzcGFucyBlIGVudmlhIHBhcmEgdGVsZW1ldHJpYVxyXG4gKiBBbGluaGFkbyBjb20gYSBpbXBsZW1lbnRhw6fDo28gZG8gU1NUIG1pZGRsZXdhcmUgcGFyYSBnYXJhbnRpciBjb25zaXN0w6puY2lhXHJcbiAqXHJcbiAqIFVzbyBubyBjb250cm9sbGVyOlxyXG4gKlxyXG4gKiBAVHNlZExvZ1RlbGVtZXRyeSgpXHJcbiAqIGFzeW5jIGdldENoZWNrb3V0KEBDb250ZXh0KCkgJGN0eDogU2VydmVybGVzc0NvbnRleHQsIC4uLikge1xyXG4gKiAgIHJldHVybiBhd2FpdCB0aGlzLnNlcnZpY2UuZXhlY3V0ZShwYXJhbXMpO1xyXG4gKiB9XHJcbiAqL1xyXG5pbXBvcnQgeyBTZXJ2ZXJsZXNzQ29udGV4dCB9IGZyb20gJ0B0c2VkL3BsYXRmb3JtLXNlcnZlcmxlc3MnO1xyXG5pbXBvcnQgeyBUc2VkVGVsZW1ldHJ5U2VydmljZSB9IGZyb20gJy4vc2VydmljZSc7XHJcbmltcG9ydCB7IG1ldHJpY3MsIFZhbHVlVHlwZSB9IGZyb20gJ0BvcGVudGVsZW1ldHJ5L2FwaSc7XHJcbmltcG9ydCB7IHBlcmZvcm1hbmNlIH0gZnJvbSAncGVyZl9ob29rcyc7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gVHNlZExvZ1RlbGVtZXRyeSgpIHtcclxuICByZXR1cm4gZnVuY3Rpb24gKFxyXG4gICAgX3RhcmdldDogYW55LFxyXG4gICAgX3Byb3BlcnR5S2V5OiBzdHJpbmcsXHJcbiAgICBkZXNjcmlwdG9yOiBQcm9wZXJ0eURlc2NyaXB0b3JcclxuICApIHtcclxuICAgIGNvbnN0IG9yaWdpbmFsTWV0aG9kID0gZGVzY3JpcHRvci52YWx1ZTtcclxuICAgIGNvbnN0IG1ldGhvZE5hbWUgPSBfcHJvcGVydHlLZXk7XHJcblxyXG4gICAgZGVzY3JpcHRvci52YWx1ZSA9IGFzeW5jIGZ1bmN0aW9uICh0aGlzOiBhbnksIC4uLmFyZ3M6IGFueVtdKSB7XHJcbiAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IHBlcmZvcm1hbmNlLm5vdygpO1xyXG5cclxuICAgICAgLy8gRW5jb250cmFyIG8gY29udGV4dG9cclxuICAgICAgY29uc3QgJGN0eDogU2VydmVybGVzc0NvbnRleHQgPSBhcmdzLmZpbmQoXHJcbiAgICAgICAgKGFyZykgPT4gYXJnPy5yZXF1ZXN0ICYmIGFyZz8ucmVzcG9uc2VcclxuICAgICAgKTtcclxuXHJcbiAgICAgIC8vIENhcHR1cmFyIG8gbm9tZSBkbyBjb250cm9sbGVyXHJcbiAgICAgIGxldCBjb250cm9sbGVyTmFtZSA9ICdVbmtub3duQ29udHJvbGxlcic7XHJcbiAgICAgIGlmICh0aGlzPy5jb25zdHJ1Y3Rvcj8ubmFtZSAmJiB0aGlzLmNvbnN0cnVjdG9yLm5hbWUgIT09ICdPYmplY3QnKSB7XHJcbiAgICAgICAgY29udHJvbGxlck5hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghJGN0eCkge1xyXG4gICAgICAgIGNvbnNvbGUud2FybihcclxuICAgICAgICAgICdbVHNlZExvZ1RlbGVtZXRyeV0gQ29udGV4dCBub3QgZm91bmQsIGV4ZWN1dGluZyB3aXRob3V0IHRlbGVtZXRyeSdcclxuICAgICAgICApO1xyXG4gICAgICAgIHJldHVybiBhd2FpdCBvcmlnaW5hbE1ldGhvZC5hcHBseSh0aGlzLCBhcmdzKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gQnVzY2FyIG8gVGVsZW1ldHJ5U2VydmljZSBkbyBpbmplY3RvclxyXG4gICAgICBsZXQgdGVsZW1ldHJ5U2VydmljZTogVHNlZFRlbGVtZXRyeVNlcnZpY2UgfCB1bmRlZmluZWQ7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgaWYgKCRjdHguaW5qZWN0b3IpIHtcclxuICAgICAgICAgIHRlbGVtZXRyeVNlcnZpY2UgPSAkY3R4LmluamVjdG9yLmdldChcclxuICAgICAgICAgICAgVHNlZFRlbGVtZXRyeVNlcnZpY2VcclxuICAgICAgICAgICkgYXMgVHNlZFRlbGVtZXRyeVNlcnZpY2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICRjdHgubG9nZ2VyPy53YXJuKHtcclxuICAgICAgICAgICdUc2VkTG9nVGVsZW1ldHJ5IC0gRmFpbGVkIHRvIGdldCBUZWxlbWV0cnlTZXJ2aWNlIGZyb20gaW5qZWN0b3InOlxyXG4gICAgICAgICAgICBlcnJvcixcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCF0ZWxlbWV0cnlTZXJ2aWNlKSB7XHJcbiAgICAgICAgJGN0eC5sb2dnZXI/Lndhcm4oXHJcbiAgICAgICAgICAnW1RzZWRMb2dUZWxlbWV0cnldIFRlbGVtZXRyeVNlcnZpY2Ugbm90IGF2YWlsYWJsZSwgZXhlY3V0aW5nIHdpdGhvdXQgdGVsZW1ldHJ5J1xyXG4gICAgICAgICk7XHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IG9yaWdpbmFsTWV0aG9kLmFwcGx5KHRoaXMsIGFyZ3MpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBFeHRyYWlyIGluZm9ybWHDp8O1ZXMgYsOhc2ljYXNcclxuICAgICAgY29uc3QgcmVxdWVzdCA9ICRjdHgucmVxdWVzdDtcclxuICAgICAgY29uc3Qgc2VydmljZU5hbWUgPSBwcm9jZXNzLmVudi5TRVJWSUNFX05BTUUgfHwgJ3RzZWQtc2VydmljZSc7XHJcbiAgICAgIGxldCBzdGFnZSA9IHByb2Nlc3MuZW52LlNUQUdFIHx8ICdkZXZlbG9wbWVudCc7XHJcbiAgICAgIGlmIChzdGFnZSA9PT0gJ3Byb2QnKSBzdGFnZSA9ICdwcm9kdWN0aW9uJztcclxuXHJcbiAgICAgIGNvbnN0IHF1ZXJ5U3RyaW5nUGFyYW1ldGVycyA9IHJlcXVlc3QucXVlcnkgfHwge307XHJcbiAgICAgIGNvbnN0IG9yaWdpbiA9IHF1ZXJ5U3RyaW5nUGFyYW1ldGVycy5vcmlnaW4gfHwgJ3dlYic7XHJcblxyXG4gICAgICAvLyBDcmlhciBzcGFuIHVzYW5kbyBTdGFuZGFyZFRyYWNlciAoc2ltaWxhciBhbyBTU1QgbWlkZGxld2FyZSlcclxuICAgICAgY29uc3QgdHJhY2VyID0gKHRlbGVtZXRyeVNlcnZpY2UgYXMgYW55KS5nZXRUcmFjZXIoKTtcclxuICAgICAgbGV0IHNwYW5SZXN1bHQ6IGFueSA9IG51bGw7XHJcblxyXG4gICAgICBpZiAodHJhY2VyKSB7XHJcbiAgICAgICAgc3BhblJlc3VsdCA9IHRyYWNlci5zdGFydFNwYW4oe1xyXG4gICAgICAgICAgc3Bhbk5hbWU6IGAke2NvbnRyb2xsZXJOYW1lfS4ke21ldGhvZE5hbWV9YCxcclxuICAgICAgICAgIHNlcnZpY2VOYW1lLFxyXG4gICAgICAgICAgZW52aXJvbm1lbnQ6IHN0YWdlLFxyXG4gICAgICAgICAgZXhlY3V0aW9uOiB7XHJcbiAgICAgICAgICAgIGNvbnRyb2xsZXI6IGNvbnRyb2xsZXJOYW1lLFxyXG4gICAgICAgICAgICBjb250cm9sbGVyTWV0aG9kOiBtZXRob2ROYW1lLFxyXG4gICAgICAgICAgICByZXF1ZXN0SWQ6ICRjdHguaWQsXHJcbiAgICAgICAgICAgIGF3c1JlcXVlc3RJZDogJGN0eC5jb250ZXh0Py5hd3NSZXF1ZXN0SWQsXHJcbiAgICAgICAgICAgIG9yaWdpbixcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBodHRwOiB7XHJcbiAgICAgICAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXHJcbiAgICAgICAgICAgIHVybDogcmVxdWVzdC51cmwsXHJcbiAgICAgICAgICAgIGVuZHBvaW50OiByZXF1ZXN0LnVybCxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIENyaWFyIG3DqXRyaWNhcyAoc2ltaWxhciBhbyBTU1QgbWlkZGxld2FyZSlcclxuICAgICAgY29uc3QgbWV0ZXIgPSBtZXRyaWNzLmdldE1ldGVyKG9yaWdpbik7XHJcbiAgICAgIGNvbnN0IGV4ZWN1dGlvblRpbWVIaXN0b2dyYW0gPSBtZXRlci5jcmVhdGVIaXN0b2dyYW0oXHJcbiAgICAgICAgJ3RzZWRfZXhlY3V0aW9uX2R1cmF0aW9uJyxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RlbXBvIHRvdGFsIGRlIGV4ZWN1w6fDo28gZG8gbcOpdG9kbyBUc2VkIGVtIG1zJyxcclxuICAgICAgICAgIHVuaXQ6ICdtcycsXHJcbiAgICAgICAgICB2YWx1ZVR5cGU6IFZhbHVlVHlwZS5ET1VCTEUsXHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgICBjb25zdCBzdWNjZXNzQ291bnRlciA9IG1ldGVyLmNyZWF0ZUNvdW50ZXIoJ3RzZWRfc3VjY2Vzc2Z1bF9yZXF1ZXN0cycsIHtcclxuICAgICAgICBkZXNjcmlwdGlvbjogJ1RvdGFsIGRlIHJlcXVpc2nDp8O1ZXMgYmVtLXN1Y2VkaWRhcycsXHJcbiAgICAgIH0pO1xyXG4gICAgICBjb25zdCBmYWlsdXJlQ291bnRlciA9IG1ldGVyLmNyZWF0ZUNvdW50ZXIoJ3RzZWRfZmFpbGVkX3JlcXVlc3RzJywge1xyXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnVG90YWwgZGUgcmVxdWlzacOnw7VlcyBjb20gZmFsaGEnLFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgb3JpZ2luYWxNZXRob2QuYXBwbHkodGhpcywgYXJncyk7XHJcblxyXG4gICAgICAgIC8vIFNVQ0VTU08gLSBTaW1pbGFyIGFvICdhZnRlcicgZG8gU1NUIG1pZGRsZXdhcmVcclxuICAgICAgICBjb25zdCBkdXJhdGlvbk1zID0gcGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydFRpbWU7XHJcblxyXG4gICAgICAgIC8vIE1hcmNhciBzcGFuIGNvbW8gc3VjZXNzb1xyXG4gICAgICAgIGlmIChzcGFuUmVzdWx0KSB7XHJcbiAgICAgICAgICBzcGFuUmVzdWx0LnNldFN1Y2Nlc3ModHJ1ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBNw6l0cmljYXMgZGUgc3VjZXNzb1xyXG4gICAgICAgIHN1Y2Nlc3NDb3VudGVyLmFkZCgxLCB7XHJcbiAgICAgICAgICBvcmlnaW4sXHJcbiAgICAgICAgICBjb250cm9sbGVyOiBjb250cm9sbGVyTmFtZSxcclxuICAgICAgICAgIG1ldGhvZDogbWV0aG9kTmFtZSxcclxuICAgICAgICAgICdzZXJ2aWNlLm5hbWUnOiBzZXJ2aWNlTmFtZSxcclxuICAgICAgICAgICdkZXBsb3ltZW50LmVudmlyb25tZW50Lm5hbWUnOiBzdGFnZSxcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZXhlY3V0aW9uVGltZUhpc3RvZ3JhbS5yZWNvcmQoZHVyYXRpb25Ncywge1xyXG4gICAgICAgICAgb3JpZ2luLFxyXG4gICAgICAgICAgc3RhdHVzOiAnc3VjY2VzcycsXHJcbiAgICAgICAgICBjb250cm9sbGVyOiBjb250cm9sbGVyTmFtZSxcclxuICAgICAgICAgIG1ldGhvZDogbWV0aG9kTmFtZSxcclxuICAgICAgICAgICdzZXJ2aWNlLm5hbWUnOiBzZXJ2aWNlTmFtZSxcclxuICAgICAgICAgICdkZXBsb3ltZW50LmVudmlyb25tZW50Lm5hbWUnOiBzdGFnZSxcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gTG9nIGRlIHN1Y2Vzc28gKHNpbWlsYXIgYW8gU1NUKVxyXG4gICAgICAgIGNvbnN0IGxvZ2dlciA9ICh0ZWxlbWV0cnlTZXJ2aWNlIGFzIGFueSkuZ2V0TG9nZ2VyKCk7XHJcbiAgICAgICAgaWYgKGxvZ2dlcikge1xyXG4gICAgICAgICAgYXdhaXQgbG9nZ2VyLmxvZ0luZm8oe1xyXG4gICAgICAgICAgICBtZXNzYWdlOiAnUmVxdWVzdCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5JyxcclxuICAgICAgICAgICAgc2VydmljZU5hbWUsXHJcbiAgICAgICAgICAgIGVudmlyb25tZW50OiBzdGFnZSxcclxuICAgICAgICAgICAgZXhlY3V0aW9uOiB7XHJcbiAgICAgICAgICAgICAgY29udHJvbGxlcjogY29udHJvbGxlck5hbWUsXHJcbiAgICAgICAgICAgICAgY29udHJvbGxlck1ldGhvZDogbWV0aG9kTmFtZSxcclxuICAgICAgICAgICAgICByZXF1ZXN0SWQ6ICRjdHguaWQsXHJcbiAgICAgICAgICAgICAgYXdzUmVxdWVzdElkOiAkY3R4LmNvbnRleHQ/LmF3c1JlcXVlc3RJZCxcclxuICAgICAgICAgICAgICBvcmlnaW4sXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGh0dHA6IHtcclxuICAgICAgICAgICAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxyXG4gICAgICAgICAgICAgIHVybDogcmVxdWVzdC51cmwsXHJcbiAgICAgICAgICAgICAgZW5kcG9pbnQ6IHJlcXVlc3QudXJsLFxyXG4gICAgICAgICAgICAgIHN0YXR1c0NvZGU6ICRjdHgucmVzcG9uc2U/LnN0YXR1c0NvZGUgfHwgMjAwLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBwZXJmb3JtYW5jZToge1xyXG4gICAgICAgICAgICAgIGR1cmF0aW9uTXMsXHJcbiAgICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gRmluYWxpemFyIHNwYW4gZSBmb3JjZSBmbHVzaFxyXG4gICAgICAgIGlmIChzcGFuUmVzdWx0KSB7XHJcbiAgICAgICAgICBzcGFuUmVzdWx0LmVuZCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBhd2FpdCAodGVsZW1ldHJ5U2VydmljZSBhcyBhbnkpLnRlbGVtZXRyeVByb3ZpZGVyLmZvcmNlRmx1c2goKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xyXG4gICAgICAgIC8vIEVSUk8gLSBTaW1pbGFyIGFvICdvbkVycm9yJyBkbyBTU1QgbWlkZGxld2FyZVxyXG4gICAgICAgIGNvbnN0IGR1cmF0aW9uTXMgPSBwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0VGltZTtcclxuXHJcbiAgICAgICAgJGN0eC5sb2dnZXI/LmluZm8oJ0Vycm9yIGNhdWdodCwgc2VuZGluZyB0byB0ZWxlbWV0cnknKTtcclxuXHJcbiAgICAgICAgLy8gTWFyY2FyIHNwYW4gY29tbyBlcnJvXHJcbiAgICAgICAgaWYgKHNwYW5SZXN1bHQpIHtcclxuICAgICAgICAgIHNwYW5SZXN1bHQuc2V0RXJyb3IoZXJyb3IpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gTcOpdHJpY2FzIGRlIGVycm9cclxuICAgICAgICBmYWlsdXJlQ291bnRlci5hZGQoMSwge1xyXG4gICAgICAgICAgb3JpZ2luLFxyXG4gICAgICAgICAgZXJyb3JfdHlwZTogZXJyb3I/LmNvbnN0cnVjdG9yPy5uYW1lIHx8ICdVbmtub3duRXJyb3InLFxyXG4gICAgICAgICAgY29udHJvbGxlcjogY29udHJvbGxlck5hbWUsXHJcbiAgICAgICAgICBtZXRob2Q6IG1ldGhvZE5hbWUsXHJcbiAgICAgICAgICAnc2VydmljZS5uYW1lJzogc2VydmljZU5hbWUsXHJcbiAgICAgICAgICAnZGVwbG95bWVudC5lbnZpcm9ubWVudC5uYW1lJzogc3RhZ2UsXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGV4ZWN1dGlvblRpbWVIaXN0b2dyYW0ucmVjb3JkKGR1cmF0aW9uTXMsIHtcclxuICAgICAgICAgIG9yaWdpbixcclxuICAgICAgICAgIHN0YXR1czogJ2Vycm9yJyxcclxuICAgICAgICAgIGNvbnRyb2xsZXI6IGNvbnRyb2xsZXJOYW1lLFxyXG4gICAgICAgICAgbWV0aG9kOiBtZXRob2ROYW1lLFxyXG4gICAgICAgICAgJ3NlcnZpY2UubmFtZSc6IHNlcnZpY2VOYW1lLFxyXG4gICAgICAgICAgJ2RlcGxveW1lbnQuZW52aXJvbm1lbnQubmFtZSc6IHN0YWdlLFxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBFeHRyYWlyIGluZm9ybWHDp8O1ZXMgZG8gdXN1w6FyaW9cclxuICAgICAgICBsZXQgdXNlckluZm86IGFueSA9IHt9O1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAvLyBAdHMtaWdub3JlIC0gTG9nZ2VkVXNlcklkZW50aWZpZXIgw6kgZXNwZWPDrWZpY28gZGEgYXBsaWNhw6fDo29cclxuICAgICAgICAgIGlmICh0eXBlb2YgTG9nZ2VkVXNlcklkZW50aWZpZXIgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICAgICAgY29uc3QgeyBsb2dnZWRVc2VyIH0gPSBMb2dnZWRVc2VySWRlbnRpZmllci51c2UoJGN0eCk7XHJcbiAgICAgICAgICAgIHVzZXJJbmZvID0ge1xyXG4gICAgICAgICAgICAgIGFjY291bnRVc2VyVWlkOiBsb2dnZWRVc2VyPy51aWQsXHJcbiAgICAgICAgICAgICAgYWNjb3VudFVpZDogbG9nZ2VkVXNlcj8uYWNjb3VudD8udWlkLFxyXG4gICAgICAgICAgICAgIGFwcGxpY2F0aW9uVWlkOiBsb2dnZWRVc2VyPy5hcHBsaWNhdGlvbj8udWlkLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgIC8vIExvZ2dlZFVzZXJJZGVudGlmaWVyIG7Do28gZXN0w6EgZGlzcG9uw612ZWxcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIExvZyBkZSBlcnJvIChzaW1pbGFyIGFvIFNTVClcclxuICAgICAgICBhd2FpdCB0ZWxlbWV0cnlTZXJ2aWNlLmxvZ0Vycm9yKHtcclxuICAgICAgICAgIGVycm9yOiBlcnJvcixcclxuICAgICAgICAgIGNvbnRleHQ6IHtcclxuICAgICAgICAgICAgc3RhdHVzQ29kZTogZXJyb3Iuc3RhdHVzIHx8IDUwMCxcclxuICAgICAgICAgICAgdXJsOiByZXF1ZXN0LnVybCxcclxuICAgICAgICAgICAgaGVhZGVyczogcmVxdWVzdC5oZWFkZXJzLFxyXG4gICAgICAgICAgICBib2R5OiByZXF1ZXN0LmJvZHksXHJcbiAgICAgICAgICAgIHBhcmFtczogcmVxdWVzdC5wYXJhbXMsXHJcbiAgICAgICAgICAgIHF1ZXJ5OiByZXF1ZXN0LnF1ZXJ5LFxyXG4gICAgICAgICAgICBlcnJvclR5cGU6IGVycm9yPy5jb25zdHJ1Y3Rvcj8ubmFtZSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICAuLi51c2VySW5mbyxcclxuICAgICAgICAgIHJlcXVlc3RJZDogJGN0eC5pZCxcclxuICAgICAgICAgIGF3c1JlcXVlc3RJZDogJGN0eC5jb250ZXh0Py5hd3NSZXF1ZXN0SWQsXHJcbiAgICAgICAgICBlbmRwb2ludDogcmVxdWVzdC51cmwsXHJcbiAgICAgICAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxyXG4gICAgICAgICAgY29udHJvbGxlcjogY29udHJvbGxlck5hbWUsXHJcbiAgICAgICAgICBjb250cm9sbGVyTWV0aG9kOiBtZXRob2ROYW1lLFxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBGaW5hbGl6YXIgc3BhbiBlIGZvcmNlIGZsdXNoXHJcbiAgICAgICAgaWYgKHNwYW5SZXN1bHQpIHtcclxuICAgICAgICAgIHNwYW5SZXN1bHQuZW5kKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGF3YWl0ICh0ZWxlbWV0cnlTZXJ2aWNlIGFzIGFueSkudGVsZW1ldHJ5UHJvdmlkZXIuZm9yY2VGbHVzaCgpO1xyXG5cclxuICAgICAgICAkY3R4LmxvZ2dlci5pbmZvKCdFcnJvciBzZW50IHRvIHRlbGVtZXRyeScpO1xyXG5cclxuICAgICAgICAvLyBSZS10aHJvdyBwYXJhIG1hbnRlciBvIGNvbXBvcnRhbWVudG8gbm9ybWFsIGRlIGVycm9cclxuICAgICAgICB0aHJvdyBlcnJvcjtcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gZGVzY3JpcHRvcjtcclxuICB9O1xyXG59XHJcbiJdfQ==
@@ -1,26 +0,0 @@
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
- }
@@ -1,150 +0,0 @@
1
- "use strict";
2
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
- return c > 3 && r && Object.defineProperty(target, key, r), r;
7
- };
8
- var __metadata = (this && this.__metadata) || function (k, v) {
9
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
- };
11
- var __param = (this && this.__param) || function (paramIndex, decorator) {
12
- return function (target, key) { decorator(target, key, paramIndex); }
13
- };
14
- 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZWxlbWV0cnkvdHNlZC9zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGlDQUE2RDtBQUM3RCxtRUFBOEQ7QUFDOUQscUNBQWlEO0FBQ2pELGtDQUF5RDtBQUN6RCw0Q0FBb0Q7QUFpQjdDLElBQU0sb0JBQW9CLEdBQTFCLE1BQU0sb0JBQW9CO0lBSy9CLFlBRUUsaUJBQXlEO1FBQXhDLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBdUI7UUFMbkQsbUJBQWMsR0FBMEIsSUFBSSxDQUFDO1FBQzdDLG1CQUFjLEdBQTBCLElBQUksQ0FBQztJQUtsRCxDQUFDO0lBRUksU0FBUzs7UUFDZixJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUM7WUFDNUMsTUFBQSxJQUFJLENBQUMsSUFBSSwwQ0FBRSxNQUFNLENBQUMsSUFBSSxDQUNwQixxREFBcUQsQ0FDdEQsQ0FBQztZQUNGLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDekIsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDbEUsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUNwQixPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7WUFFRCxNQUFNLFVBQVUsR0FBRyxjQUFjLENBQUMsU0FBUyxDQUN6QyxxQkFBcUIsRUFDckIsT0FBTyxDQUNSLENBQUM7WUFHRixNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksSUFBSSxjQUFjLENBQUM7WUFDL0QsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLHFCQUFjLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ3BF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O0lBT1IsV0FBQSxJQUFBLFdBQU0sR0FBRSxDQUFBO3FDQUMyQiw4QkFBcUI7R0FQaEQsb0JBQW9CLENBdUloQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIEluamVjdCwgSW5qZWN0Q29udGV4dCB9IGZyb20gJ0B0c2VkL2RpJztcclxuaW1wb3J0IHsgU2VydmVybGVzc0NvbnRleHQgfSBmcm9tICdAdHNlZC9wbGF0Zm9ybS1zZXJ2ZXJsZXNzJztcclxuaW1wb3J0IHsgVHNlZFRlbGVtZXRyeVByb3ZpZGVyIH0gZnJvbSAnLi9jb25maWcnO1xyXG5pbXBvcnQgeyBTdGFuZGFyZExvZ2dlciwgU3RhbmRhcmRUcmFjZXIgfSBmcm9tICcuLi9jb3JlJztcclxuaW1wb3J0IHsgdHJhY2UsIG1ldHJpY3MgfSBmcm9tICdAb3BlbnRlbGVtZXRyeS9hcGknO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBFcnJvckxvZ0RhdGEge1xyXG4gIGVycm9yOiBFcnJvcjtcclxuICBjb250ZXh0PzogUmVjb3JkPHN0cmluZywgYW55PjtcclxuICBhY2NvdW50VXNlclVpZD86IHN0cmluZztcclxuICBhY2NvdW50VWlkPzogc3RyaW5nO1xyXG4gIHJlcXVlc3RJZD86IHN0cmluZztcclxuICBlbmRwb2ludD86IHN0cmluZztcclxuICBtZXRob2Q/OiBzdHJpbmc7XHJcbiAgY29udHJvbGxlcj86IHN0cmluZztcclxuICBjb250cm9sbGVyTWV0aG9kPzogc3RyaW5nO1xyXG4gIGFwcGxpY2F0aW9uVWlkPzogc3RyaW5nO1xyXG4gIGF3c1JlcXVlc3RJZD86IHN0cmluZztcclxufVxyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgVHNlZFRlbGVtZXRyeVNlcnZpY2Uge1xyXG4gIEBJbmplY3RDb250ZXh0KCkgcHJvdGVjdGVkICRjdHg6IFNlcnZlcmxlc3NDb250ZXh0O1xyXG4gIHByaXZhdGUgc3RhbmRhcmRMb2dnZXI6IFN0YW5kYXJkTG9nZ2VyIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBzdGFuZGFyZFRyYWNlcjogU3RhbmRhcmRUcmFjZXIgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBASW5qZWN0KClcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgdGVsZW1ldHJ5UHJvdmlkZXI6IFRzZWRUZWxlbWV0cnlQcm92aWRlclxyXG4gICkge31cclxuXHJcbiAgcHJpdmF0ZSBnZXRMb2dnZXIoKTogU3RhbmRhcmRMb2dnZXIgfCBudWxsIHtcclxuICAgIGlmICghdGhpcy50ZWxlbWV0cnlQcm92aWRlci5pc0luaXRpYWxpemVkKCkpIHtcclxuICAgICAgdGhpcy4kY3R4Py5sb2dnZXIud2FybihcclxuICAgICAgICAnW1RlbGVtZXRyeV0gVGVsZW1ldHJ5IG5vdCBpbml0aWFsaXplZCwgc2tpcHBpbmcgbG9nJ1xyXG4gICAgICApO1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuc3RhbmRhcmRMb2dnZXIpIHtcclxuICAgICAgY29uc3QgbG9nZ2VyUHJvdmlkZXIgPSB0aGlzLnRlbGVtZXRyeVByb3ZpZGVyLmdldExvZ2dlclByb3ZpZGVyKCk7XHJcbiAgICAgIGlmICghbG9nZ2VyUHJvdmlkZXIpIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3Qgb3RlbExvZ2dlciA9IGxvZ2dlclByb3ZpZGVyLmdldExvZ2dlcihcclxuICAgICAgICAndHNlZC1zZXJ2aWNlLWxvZ2dlcicsXHJcbiAgICAgICAgJzEuMC4wJ1xyXG4gICAgICApO1xyXG5cclxuICAgICAgLy8gUGVnYSBvIHNlcnZpY2UgbmFtZSBkbyBhbWJpZW50ZSBvdSB1c2EgZGVmYXVsdFxyXG4gICAgICBjb25zdCBzZXJ2aWNlTmFtZSA9IHByb2Nlc3MuZW52LlNFUlZJQ0VfTkFNRSB8fCAndHNlZC1zZXJ2aWNlJztcclxuICAgICAgdGhpcy5zdGFuZGFyZExvZ2dlciA9IG5ldyBTdGFuZGFyZExvZ2dlcihvdGVsTG9nZ2VyLCBzZXJ2aWNlTmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuc3RhbmRhcmRMb2dnZXI7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFRyYWNlcigpOiBTdGFuZGFyZFRyYWNlciB8IG51bGwge1xyXG4gICAgaWYgKCF0aGlzLnRlbGVtZXRyeVByb3ZpZGVyLmlzSW5pdGlhbGl6ZWQoKSkge1xyXG4gICAgICB0aGlzLiRjdHg/LmxvZ2dlci53YXJuKFxyXG4gICAgICAgICdbVGVsZW1ldHJ5XSBUZWxlbWV0cnkgbm90IGluaXRpYWxpemVkLCBza2lwcGluZyB0cmFjZSdcclxuICAgICAgKTtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLnN0YW5kYXJkVHJhY2VyKSB7XHJcbiAgICAgIGNvbnN0IHRyYWNlclByb3ZpZGVyID0gdGhpcy50ZWxlbWV0cnlQcm92aWRlci5nZXRUcmFjZXJQcm92aWRlcigpO1xyXG4gICAgICBpZiAoIXRyYWNlclByb3ZpZGVyKSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IHNlcnZpY2VOYW1lID0gcHJvY2Vzcy5lbnYuU0VSVklDRV9OQU1FIHx8ICd0c2VkLXNlcnZpY2UnO1xyXG4gICAgICBjb25zdCBvdGVsVHJhY2VyID0gdHJhY2UuZ2V0VHJhY2VyKHNlcnZpY2VOYW1lLCAnMS4wLjAnKTtcclxuICAgICAgdGhpcy5zdGFuZGFyZFRyYWNlciA9IG5ldyBTdGFuZGFyZFRyYWNlcihvdGVsVHJhY2VyLCBzZXJ2aWNlTmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuc3RhbmRhcmRUcmFjZXI7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgbG9nRXJyb3IoZGF0YTogRXJyb3JMb2dEYXRhKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBsb2dnZXIgPSB0aGlzLmdldExvZ2dlcigpO1xyXG4gICAgaWYgKCFsb2dnZXIpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGxldCBzdGFnZSA9IHByb2Nlc3MuZW52LlNUQUdFIHx8ICdkZXZlbG9wbWVudCc7XHJcbiAgICAgIGlmIChzdGFnZSA9PT0gJ3Byb2QnKSBzdGFnZSA9ICdwcm9kdWN0aW9uJztcclxuXHJcbiAgICAgIHRoaXMuJGN0eD8ubG9nZ2VyLmluZm8oJ1tUZWxlbWV0cnldIExvZ2dpbmcgZXJyb3IuLi4nKTtcclxuXHJcbiAgICAgIGF3YWl0IGxvZ2dlci5sb2dFcnJvcih7XHJcbiAgICAgICAgbWVzc2FnZTogZGF0YS5lcnJvci5tZXNzYWdlLFxyXG4gICAgICAgIGVycm9yOiBkYXRhLmVycm9yLFxyXG4gICAgICAgIHNlcnZpY2VOYW1lOiBwcm9jZXNzLmVudi5TRVJWSUNFX05BTUUgfHwgJ3RzZWQtc2VydmljZScsXHJcbiAgICAgICAgZW52aXJvbm1lbnQ6IHN0YWdlLFxyXG4gICAgICAgIGh0dHA6IHtcclxuICAgICAgICAgIGVuZHBvaW50OiBkYXRhLmVuZHBvaW50LFxyXG4gICAgICAgICAgbWV0aG9kOiBkYXRhLm1ldGhvZCxcclxuICAgICAgICAgIHN0YXR1c0NvZGU6IChkYXRhLmVycm9yIGFzIGFueSkuc3RhdHVzIHx8IDUwMCxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHVzZXI6IHtcclxuICAgICAgICAgIGFjY291bnRVc2VyVWlkOiBkYXRhLmFjY291bnRVc2VyVWlkLFxyXG4gICAgICAgICAgYWNjb3VudFVpZDogZGF0YS5hY2NvdW50VWlkLFxyXG4gICAgICAgICAgYXBwbGljYXRpb25VaWQ6IGRhdGEuYXBwbGljYXRpb25VaWQsXHJcbiAgICAgICAgfSxcclxuICAgICAgICBleGVjdXRpb246IHtcclxuICAgICAgICAgIHJlcXVlc3RJZDogZGF0YS5yZXF1ZXN0SWQsXHJcbiAgICAgICAgICBhd3NSZXF1ZXN0SWQ6IGRhdGEuYXdzUmVxdWVzdElkLFxyXG4gICAgICAgICAgY29udHJvbGxlcjogZGF0YS5jb250cm9sbGVyLFxyXG4gICAgICAgICAgY29udHJvbGxlck1ldGhvZDogZGF0YS5jb250cm9sbGVyTWV0aG9kLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY29udGV4dDogZGF0YS5jb250ZXh0LFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIC8vIENSSVRJQ0FMOiBGb3JjZSBmbHVzaCB0byBlbnN1cmUgbG9nIGlzIHNlbnQgYmVmb3JlIExhbWJkYSBmcmVlemVzXHJcbiAgICAgIHRoaXMuJGN0eD8ubG9nZ2VyLmluZm8oJ1tUZWxlbWV0cnldIEZvcmNpbmcgZmx1c2guLi4nKTtcclxuICAgICAgY29uc3QgZmx1c2hTdGFydFRpbWUgPSBEYXRlLm5vdygpO1xyXG5cclxuICAgICAgYXdhaXQgdGhpcy50ZWxlbWV0cnlQcm92aWRlci5mb3JjZUZsdXNoKCk7XHJcblxyXG4gICAgICBjb25zdCBmbHVzaER1cmF0aW9uID0gRGF0ZS5ub3coKSAtIGZsdXNoU3RhcnRUaW1lO1xyXG5cclxuICAgICAgdGhpcy4kY3R4Py5sb2dnZXIuaW5mbyh7XHJcbiAgICAgICAgJ1RlbGVtZXRyeSAtIExvZyBzZW50IHN1Y2Nlc3NmdWxseSc6IHtcclxuICAgICAgICAgIGVycm9yVHlwZTogZGF0YS5lcnJvci5uYW1lLFxyXG4gICAgICAgICAgbWVzc2FnZTogZGF0YS5lcnJvci5tZXNzYWdlLFxyXG4gICAgICAgICAgZW5kcG9pbnQ6IGRhdGEuZW5kcG9pbnQsXHJcbiAgICAgICAgICBjb250cm9sbGVyOiBkYXRhLmNvbnRyb2xsZXIsXHJcbiAgICAgICAgICBtZXRob2Q6IGRhdGEuY29udHJvbGxlck1ldGhvZCxcclxuICAgICAgICAgIGZsdXNoRHVyYXRpb25NczogZmx1c2hEdXJhdGlvbixcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHRoaXMuJGN0eD8ubG9nZ2VyLmVycm9yKHtcclxuICAgICAgICAnVGVsZW1ldHJ5IC0gQ1JJVElDQUwgRVJST1IgLSBGYWlsZWQgdG8gbG9nIGVycm9yJzoge1xyXG4gICAgICAgICAgb3JpZ2luYWxFcnJvcjogZGF0YS5lcnJvci5tZXNzYWdlLFxyXG4gICAgICAgICAgdGVsZW1ldHJ5RXJyb3I6XHJcbiAgICAgICAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcclxuICAgICAgICAgIHN0YWNrOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3Iuc3RhY2sgOiB1bmRlZmluZWQsXHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcbiAgICAgIC8vIERvbid0IHJlLXRocm93IHRvIGF2b2lkIGJyZWFraW5nIHRoZSBhcHBsaWNhdGlvbiBmbG93XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgbG9nRXhjZXB0aW9uKFxyXG4gICAgZXJyb3I6IEVycm9yLFxyXG4gICAgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIGFueT5cclxuICApOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGF3YWl0IHRoaXMubG9nRXJyb3Ioe1xyXG4gICAgICBlcnJvcixcclxuICAgICAgY29udGV4dCxcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4iXX0=
@@ -1,11 +0,0 @@
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
- }
@@ -1,74 +0,0 @@
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1sb2ctcmVjb3JkLXByb2Nlc3Nvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZWxlbWV0cnkvdHNlZC9zeW5jLWxvZy1yZWNvcmQtcHJvY2Vzc29yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQVlBLE1BQWEsMEJBQTBCO0lBSXJDLFlBQVksUUFBeUI7UUFGcEIsbUJBQWMsR0FBb0IsRUFBRSxDQUFDO1FBR3BELElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0lBQzNCLENBQUM7SUFFRCxNQUFNLENBQUMsU0FBNEIsRUFBRSxRQUFrQjtRQUlyRCxNQUFNLGFBQWEsR0FBRyxJQUFJLE9BQU8sQ0FBTyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUMxRCxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUU7Z0JBQzNDLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDdEIsT0FBTyxFQUFFLENBQUM7Z0JBQ1osQ0FBQztxQkFBTSxDQUFDO29CQUNOLE9BQU8sQ0FBQyxLQUFLLENBQ1gseUNBQXlDLEVBQ3pDLE1BQU0sQ0FBQyxLQUFLLENBQ2IsQ0FBQztvQkFDRixNQUFNLENBQ0osTUFBTSxDQUFDLEtBQUssWUFBWSxLQUFLO3dCQUMzQixDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUs7d0JBQ2QsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FDcEMsQ0FBQztnQkFDSixDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUM7YUFDQyxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ1QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDekQsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDZixJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdkMsQ0FBQztRQUNILENBQUMsQ0FBQzthQUNELEtBQUssQ0FBQyxDQUFDLEtBQWMsRUFBRSxFQUFFO1lBQ3hCLE9BQU8sQ0FBQyxLQUFLLENBQUMsd0NBQXdDLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDL0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDekQsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDZixJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdkMsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUwsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVLLFVBQVU7O1lBQ2QsT0FBTyxDQUFDLEdBQUcsQ0FDVCxtREFBbUQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLGtCQUFrQixDQUNoRyxDQUFDO1lBRUYsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDckMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxzREFBc0QsQ0FBQyxDQUFDO2dCQUNwRSxPQUFPO1lBQ1QsQ0FBQztZQUVELElBQUksQ0FBQztnQkFFSCxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO2dCQUN2QyxPQUFPLENBQUMsR0FBRyxDQUFDLHdEQUF3RCxDQUFDLENBQUM7WUFDeEUsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyxtREFBbUQsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDMUUsTUFBTSxLQUFLLENBQUM7WUFDZCxDQUFDO1FBQ0gsQ0FBQztLQUFBO0lBRUssUUFBUTs7WUFDWixPQUFPLENBQUMsR0FBRyxDQUFDLDJDQUEyQyxDQUFDLENBQUM7WUFDekQsTUFBTSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDeEIsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQy9CLE9BQU8sQ0FBQyxHQUFHLENBQUMsNENBQTRDLENBQUMsQ0FBQztRQUM1RCxDQUFDO0tBQUE7Q0FDRjtBQXhFRCxnRUF3RUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBMb2dSZWNvcmRQcm9jZXNzb3IsIFJlYWRhYmxlTG9nUmVjb3JkIH0gZnJvbSAnQG9wZW50ZWxlbWV0cnkvc2RrLWxvZ3MnO1xyXG5pbXBvcnQgeyBPVExQTG9nRXhwb3J0ZXIgfSBmcm9tICdAb3BlbnRlbGVtZXRyeS9leHBvcnRlci1sb2dzLW90bHAtaHR0cCc7XHJcbmltcG9ydCB7IENvbnRleHQgfSBmcm9tICdAb3BlbnRlbGVtZXRyeS9hcGknO1xyXG5cclxuLyoqXHJcbiAqIEN1c3RvbSBMb2dSZWNvcmRQcm9jZXNzb3IgdGhhdCBlbnN1cmVzIHN5bmNocm9ub3VzIGV4cG9ydCBmb3IgQVdTIExhbWJkYVxyXG4gKlxyXG4gKiBUaGlzIHByb2Nlc3NvciB3cmFwcyB0aGUgT1RMUCBleHBvcnRlciBhbmQgZW5zdXJlcyB0aGF0IGxvZ3MgYXJlIGFjdHVhbGx5XHJcbiAqIGV4cG9ydGVkIHN5bmNocm9ub3VzbHkgYnkgaW1tZWRpYXRlbHkgY2FsbGluZyBleHBvcnQoKSBhbmQgd2FpdGluZyBmb3IgaXRcclxuICogdG8gY29tcGxldGUsIHJhdGhlciB0aGFuIHJlbHlpbmcgb24gU2ltcGxlTG9nUmVjb3JkUHJvY2Vzc29yIHdoaWNoIG1heSBub3RcclxuICogcHJvcGVybHkgYXdhaXQgdGhlIGFzeW5jIEhUVFAgcmVxdWVzdCBpbiBMYW1iZGEgZW52aXJvbm1lbnRzLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFRzZWRTeW5jTG9nUmVjb3JkUHJvY2Vzc29yIGltcGxlbWVudHMgTG9nUmVjb3JkUHJvY2Vzc29yIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGV4cG9ydGVyOiBPVExQTG9nRXhwb3J0ZXI7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBwZW5kaW5nRXhwb3J0czogUHJvbWlzZTx2b2lkPltdID0gW107XHJcblxyXG4gIGNvbnN0cnVjdG9yKGV4cG9ydGVyOiBPVExQTG9nRXhwb3J0ZXIpIHtcclxuICAgIHRoaXMuZXhwb3J0ZXIgPSBleHBvcnRlcjtcclxuICB9XHJcblxyXG4gIG9uRW1pdChsb2dSZWNvcmQ6IFJlYWRhYmxlTG9nUmVjb3JkLCBfY29udGV4dD86IENvbnRleHQpOiB2b2lkIHtcclxuICAgIC8vIEV4cG9ydCBpbW1lZGlhdGVseSBhbmQgdHJhY2sgdGhlIHByb21pc2VcclxuICAgIC8vIFRoZSBleHBvcnQgbWV0aG9kIHJldHVybnMgdm9pZCwgYnV0IGludGVybmFsbHkgdHJpZ2dlcnMgYXN5bmMgSFRUUCByZXF1ZXN0XHJcbiAgICAvLyBXZSBuZWVkIHRvIHdyYXAgaXQgdG8gdHJhY2sgY29tcGxldGlvblxyXG4gICAgY29uc3QgZXhwb3J0UHJvbWlzZSA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgdGhpcy5leHBvcnRlci5leHBvcnQoW2xvZ1JlY29yZF0sIChyZXN1bHQpID0+IHtcclxuICAgICAgICBpZiAocmVzdWx0LmNvZGUgPT09IDApIHtcclxuICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcihcclxuICAgICAgICAgICAgJ1tTeW5jTG9nUmVjb3JkUHJvY2Vzc29yXSBFeHBvcnQgZmFpbGVkOicsXHJcbiAgICAgICAgICAgIHJlc3VsdC5lcnJvclxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHJlamVjdChcclxuICAgICAgICAgICAgcmVzdWx0LmVycm9yIGluc3RhbmNlb2YgRXJyb3JcclxuICAgICAgICAgICAgICA/IHJlc3VsdC5lcnJvclxyXG4gICAgICAgICAgICAgIDogbmV3IEVycm9yKFN0cmluZyhyZXN1bHQuZXJyb3IpKVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSlcclxuICAgICAgLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5wZW5kaW5nRXhwb3J0cy5pbmRleE9mKGV4cG9ydFByb21pc2UpO1xyXG4gICAgICAgIGlmIChpbmRleCA+IC0xKSB7XHJcbiAgICAgICAgICB0aGlzLnBlbmRpbmdFeHBvcnRzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgICAuY2F0Y2goKGVycm9yOiB1bmtub3duKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignW1N5bmNMb2dSZWNvcmRQcm9jZXNzb3JdIEV4cG9ydCBlcnJvcjonLCBlcnJvcik7XHJcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnBlbmRpbmdFeHBvcnRzLmluZGV4T2YoZXhwb3J0UHJvbWlzZSk7XHJcbiAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcclxuICAgICAgICAgIHRoaXMucGVuZGluZ0V4cG9ydHMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIHRoaXMucGVuZGluZ0V4cG9ydHMucHVzaChleHBvcnRQcm9taXNlKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGZvcmNlRmx1c2goKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zb2xlLmxvZyhcclxuICAgICAgYFtTeW5jTG9nUmVjb3JkUHJvY2Vzc29yXSBmb3JjZUZsdXNoIGNhbGxlZCB3aXRoICR7dGhpcy5wZW5kaW5nRXhwb3J0cy5sZW5ndGh9IHBlbmRpbmcgZXhwb3J0c2BcclxuICAgICk7XHJcblxyXG4gICAgaWYgKHRoaXMucGVuZGluZ0V4cG9ydHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdbU3luY0xvZ1JlY29yZFByb2Nlc3Nvcl0gTm8gcGVuZGluZyBleHBvcnRzIHRvIGZsdXNoJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0cnkge1xyXG4gICAgICAvLyBXYWl0IGZvciBhbGwgcGVuZGluZyBleHBvcnRzIHRvIGNvbXBsZXRlXHJcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKHRoaXMucGVuZGluZ0V4cG9ydHMpO1xyXG4gICAgICBjb25zb2xlLmxvZygnW1N5bmNMb2dSZWNvcmRQcm9jZXNzb3JdIEFsbCBwZW5kaW5nIGV4cG9ydHMgY29tcGxldGVkJyk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdbU3luY0xvZ1JlY29yZFByb2Nlc3Nvcl0gRXJyb3IgZHVyaW5nIGZvcmNlRmx1c2g6JywgZXJyb3IpO1xyXG4gICAgICB0aHJvdyBlcnJvcjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIHNodXRkb3duKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc29sZS5sb2coJ1tTeW5jTG9nUmVjb3JkUHJvY2Vzc29yXSBTaHV0dGluZyBkb3duLi4uJyk7XHJcbiAgICBhd2FpdCB0aGlzLmZvcmNlRmx1c2goKTtcclxuICAgIGF3YWl0IHRoaXMuZXhwb3J0ZXIuc2h1dGRvd24oKTtcclxuICAgIGNvbnNvbGUubG9nKCdbU3luY0xvZ1JlY29yZFByb2Nlc3Nvcl0gU2h1dGRvd24gY29tcGxldGUnKTtcclxuICB9XHJcbn1cclxuIl19