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