@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.
- package/.github/workflows/pull_request.yml +32 -32
- package/.github/workflows/release.yml +129 -129
- package/.prettierignore +4 -4
- package/CHANGELOG.md +36 -14
- package/DOCS_GUIDE.md +151 -151
- package/README.md +248 -248
- package/dist/core/__tests__/logger-types.test.js +1 -1
- package/dist/core/__tests__/logger.test.js +1 -1
- package/dist/core/__tests__/tracer.test.js +1 -1
- package/dist/core/index.js +1 -1
- package/dist/core/logger-types.js +1 -1
- package/dist/core/logger.js +1 -1
- package/dist/core/tracer-types.js +1 -1
- package/dist/core/tracer.js +1 -1
- package/dist/index.js +1 -1
- package/dist/sst/__tests__/telemetry.test.js +1 -1
- package/dist/sst/index.js +1 -1
- package/dist/sst/middy/index.js +1 -1
- package/dist/sst/middy/middleware.js +1 -1
- package/dist/sst/telemetry.js +1 -1
- package/dist/tsed/__tests__/config.test.js +1 -1
- package/dist/tsed/__tests__/service.test.js +1 -1
- package/dist/tsed/config.js +1 -1
- package/dist/tsed/index.js +1 -1
- package/dist/tsed/log-telemetry.js +1 -1
- package/dist/tsed/service.js +1 -1
- package/dist/tsed/sync-log-record-processor.js +1 -1
- package/package.json +72 -72
- package/release.config.js +23 -23
- package/vitest.config.ts +22 -22
- package/dist/telemetry/core/__tests__/logger-types.test.d.ts +0 -1
- package/dist/telemetry/core/__tests__/logger-types.test.js +0 -325
- package/dist/telemetry/core/__tests__/logger.test.d.ts +0 -1
- package/dist/telemetry/core/__tests__/logger.test.js +0 -337
- package/dist/telemetry/core/__tests__/tracer.test.d.ts +0 -1
- package/dist/telemetry/core/__tests__/tracer.test.js +0 -330
- package/dist/telemetry/core/index.d.ts +0 -4
- package/dist/telemetry/core/index.js +0 -8
- package/dist/telemetry/core/logger-types.d.ts +0 -43
- package/dist/telemetry/core/logger-types.js +0 -3
- package/dist/telemetry/core/logger.d.ts +0 -13
- package/dist/telemetry/core/logger.js +0 -123
- package/dist/telemetry/core/tracer-types.d.ts +0 -50
- package/dist/telemetry/core/tracer-types.js +0 -3
- package/dist/telemetry/core/tracer.d.ts +0 -10
- package/dist/telemetry/core/tracer.js +0 -114
- package/dist/telemetry/index.d.ts +0 -3
- package/dist/telemetry/index.js +0 -20
- package/dist/telemetry/sst/__tests__/telemetry.test.d.ts +0 -1
- package/dist/telemetry/sst/__tests__/telemetry.test.js +0 -138
- package/dist/telemetry/sst/index.d.ts +0 -1
- package/dist/telemetry/sst/index.js +0 -18
- package/dist/telemetry/sst/middy/index.d.ts +0 -1
- package/dist/telemetry/sst/middy/index.js +0 -18
- package/dist/telemetry/sst/middy/middleware.d.ts +0 -5
- package/dist/telemetry/sst/middy/middleware.js +0 -157
- package/dist/telemetry/sst/telemetry.d.ts +0 -4
- package/dist/telemetry/sst/telemetry.js +0 -121
- package/dist/telemetry/tsed/__tests__/config.test.d.ts +0 -1
- package/dist/telemetry/tsed/__tests__/config.test.js +0 -146
- package/dist/telemetry/tsed/__tests__/service.test.d.ts +0 -1
- package/dist/telemetry/tsed/__tests__/service.test.js +0 -63
- package/dist/telemetry/tsed/config.d.ts +0 -26
- package/dist/telemetry/tsed/config.js +0 -166
- package/dist/telemetry/tsed/index.d.ts +0 -4
- package/dist/telemetry/tsed/index.js +0 -21
- package/dist/telemetry/tsed/log-telemetry.d.ts +0 -1
- package/dist/telemetry/tsed/log-telemetry.js +0 -196
- package/dist/telemetry/tsed/service.d.ts +0 -26
- package/dist/telemetry/tsed/service.js +0 -150
- package/dist/telemetry/tsed/sync-log-record-processor.d.ts +0 -11
- 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
|