@mecanizou/telemetry-hub 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/pull_request.yml +32 -32
- package/.github/workflows/release.yml +129 -129
- package/.prettierignore +4 -4
- package/DOCS_GUIDE.md +151 -0
- package/README.md +248 -0
- package/dist/check-if-is-working.js +1 -1
- package/dist/core/index.d.ts +2 -0
- package/dist/core/index.js +6 -0
- package/dist/core/logger.d.ts +13 -0
- package/dist/core/logger.js +123 -0
- package/dist/core/types.d.ts +43 -0
- package/dist/core/types.js +3 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +2 -2
- package/dist/services/index.d.ts +1 -0
- package/dist/services/index.js +18 -0
- package/dist/services/telemetry/config.d.ts +20 -0
- package/dist/services/telemetry/config.js +113 -0
- package/dist/services/telemetry/external-service.d.ts +20 -0
- package/dist/services/telemetry/external-service.js +69 -0
- package/dist/services/telemetry/index.d.ts +3 -0
- package/dist/services/telemetry/index.js +20 -0
- package/dist/services/telemetry/sync-log-record-processor.d.ts +11 -0
- package/dist/services/telemetry/sync-log-record-processor.js +74 -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 +172 -0
- package/dist/sst/telemetry.d.ts +3 -0
- package/dist/sst/telemetry.js +111 -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/telemetry.d.ts +1 -0
- package/dist/telemetry.js +81 -0
- package/dist/tsed/config.d.ts +20 -0
- package/dist/tsed/config.js +113 -0
- package/dist/tsed/index.d.ts +3 -0
- package/dist/tsed/index.js +20 -0
- package/dist/tsed/log-telemetry.d.ts +1 -0
- package/dist/tsed/log-telemetry.js +81 -0
- package/dist/tsed/service.d.ts +24 -0
- package/dist/tsed/service.js +131 -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
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.TelemetryProvider = void 0;
|
|
13
|
+
const sdk_logs_1 = require("@opentelemetry/sdk-logs");
|
|
14
|
+
const exporter_logs_otlp_http_1 = require("@opentelemetry/exporter-logs-otlp-http");
|
|
15
|
+
const resources_1 = require("@opentelemetry/resources");
|
|
16
|
+
const semantic_conventions_1 = require("@opentelemetry/semantic-conventions");
|
|
17
|
+
const sync_log_record_processor_1 = require("./sync-log-record-processor");
|
|
18
|
+
class TelemetryProvider {
|
|
19
|
+
constructor() {
|
|
20
|
+
this.loggerProvider = null;
|
|
21
|
+
this.initialized = false;
|
|
22
|
+
if (!this.initialized && process.env.OTEL_EXPORTER_OTLP_ENDPOINT) {
|
|
23
|
+
const serviceName = process.env.SERVICE_NAME || 'unknown-service';
|
|
24
|
+
const serviceStage = process.env.STAGE;
|
|
25
|
+
this.initialize({
|
|
26
|
+
endpoint: process.env.OTEL_EXPORTER_OTLP_ENDPOINT || '',
|
|
27
|
+
username: process.env.OTEL_EXPORTER_OTLP_USER || '',
|
|
28
|
+
password: process.env.OTEL_EXPORTER_OTLP_PASS || '',
|
|
29
|
+
serviceName: `${serviceName}-${serviceStage}`,
|
|
30
|
+
serviceVersion: process.env.npm_package_version || '1.0.0',
|
|
31
|
+
enabled: process.env.OTEL_ENABLED !== 'false',
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
initialize(config) {
|
|
36
|
+
if (this.initialized) {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
if (config.enabled === false) {
|
|
40
|
+
console.log('[Telemetry] OpenTelemetry is disabled');
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
if (!config.endpoint || !config.username || !config.password) {
|
|
44
|
+
if (process.env.NODE_ENV !== 'test' &&
|
|
45
|
+
process.env.OTEL_EXPORTER_OTLP_ENDPOINT) {
|
|
46
|
+
console.error('[Telemetry] Missing required configuration');
|
|
47
|
+
}
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
try {
|
|
51
|
+
const resource = (0, resources_1.resourceFromAttributes)({
|
|
52
|
+
[semantic_conventions_1.ATTR_SERVICE_NAME]: config.serviceName || 'unknown-service',
|
|
53
|
+
[semantic_conventions_1.ATTR_SERVICE_VERSION]: config.serviceVersion || '1.0.0',
|
|
54
|
+
});
|
|
55
|
+
const logExporter = new exporter_logs_otlp_http_1.OTLPLogExporter({
|
|
56
|
+
url: `${config.endpoint}/v1/logs`,
|
|
57
|
+
headers: {
|
|
58
|
+
Authorization: `Basic ${Buffer.from(`${config.username}:${config.password}`).toString('base64')}`,
|
|
59
|
+
},
|
|
60
|
+
timeoutMillis: 5000,
|
|
61
|
+
concurrencyLimit: 1,
|
|
62
|
+
});
|
|
63
|
+
const syncProcessor = new sync_log_record_processor_1.SyncLogRecordProcessor(logExporter);
|
|
64
|
+
this.loggerProvider = new sdk_logs_1.LoggerProvider({
|
|
65
|
+
resource,
|
|
66
|
+
processors: [syncProcessor],
|
|
67
|
+
});
|
|
68
|
+
this.initialized = true;
|
|
69
|
+
console.log('[Telemetry] OpenTelemetry initialized successfully');
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
console.error('[Telemetry] Failed to initialize OpenTelemetry:', error);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
getLoggerProvider() {
|
|
76
|
+
return this.loggerProvider;
|
|
77
|
+
}
|
|
78
|
+
isInitialized() {
|
|
79
|
+
return this.initialized;
|
|
80
|
+
}
|
|
81
|
+
forceFlush() {
|
|
82
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
83
|
+
if (!this.loggerProvider) {
|
|
84
|
+
console.warn('[Telemetry] forceFlush called but loggerProvider is null');
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
try {
|
|
88
|
+
const startTime = Date.now();
|
|
89
|
+
console.log('[Telemetry] Starting forceFlush...');
|
|
90
|
+
yield this.loggerProvider.forceFlush();
|
|
91
|
+
const duration = Date.now() - startTime;
|
|
92
|
+
console.log(`[Telemetry] forceFlush completed successfully in ${duration}ms`);
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
console.error('[Telemetry] Failed to force flush logs:', error);
|
|
96
|
+
throw error;
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
shutdown() {
|
|
101
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
102
|
+
if (this.loggerProvider) {
|
|
103
|
+
yield this.loggerProvider.shutdown();
|
|
104
|
+
this.initialized = false;
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
$onDestroy() {
|
|
109
|
+
return this.shutdown();
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
exports.TelemetryProvider = TelemetryProvider;
|
|
113
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcnZpY2VzL3RlbGVtZXRyeS9jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUEsc0RBQXlEO0FBQ3pELG9GQUF5RTtBQUN6RSx3REFBa0U7QUFDbEUsOEVBRzZDO0FBQzdDLDJFQUFxRTtBQVdyRSxNQUFhLGlCQUFpQjtJQUk1QjtRQUhRLG1CQUFjLEdBQTBCLElBQUksQ0FBQztRQUM3QyxnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUkxQixJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLDJCQUEyQixFQUFFLENBQUM7WUFDakUsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLElBQUksaUJBQWlCLENBQUM7WUFDbEUsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7WUFDdkMsSUFBSSxDQUFDLFVBQVUsQ0FBQztnQkFDZCxRQUFRLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsSUFBSSxFQUFFO2dCQUN2RCxRQUFRLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsSUFBSSxFQUFFO2dCQUNuRCxRQUFRLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsSUFBSSxFQUFFO2dCQUNuRCxXQUFXLEVBQUUsR0FBRyxXQUFXLElBQUksWUFBWSxFQUFFO2dCQUM3QyxjQUFjLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsSUFBSSxPQUFPO2dCQUMxRCxPQUFPLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLEtBQUssT0FBTzthQUM5QyxDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztJQUVNLFVBQVUsQ0FBQyxNQUF1QjtRQUN2QyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNy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O0tBQUE7SUFFWSxRQUFROztZQUNuQixJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDeEIsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNyQyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztZQUMzQixDQUFDO1FBQ0gsQ0FBQztLQUFBO0lBRUQsVUFBVTtRQUNSLE9BQU8sSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3pCLENBQUM7Q0FDRjtBQTFIRCw4Q0EwSEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBMb2dnZXJQcm92aWRlciB9IGZyb20gJ0BvcGVudGVsZW1ldHJ5L3Nkay1sb2dzJztcclxuaW1wb3J0IHsgT1RMUExvZ0V4cG9ydGVyIH0gZnJvbSAnQG9wZW50ZWxlbWV0cnkvZXhwb3J0ZXItbG9ncy1vdGxwLWh0dHAnO1xyXG5pbXBvcnQgeyByZXNvdXJjZUZyb21BdHRyaWJ1dGVzIH0gZnJvbSAnQG9wZW50ZWxlbWV0cnkvcmVzb3VyY2VzJztcclxuaW1wb3J0IHtcclxuICBBVFRSX1NFUlZJQ0VfTkFNRSxcclxuICBBVFRSX1NFUlZJQ0VfVkVSU0lPTixcclxufSBmcm9tICdAb3BlbnRlbGVtZXRyeS9zZW1hbnRpYy1jb252ZW50aW9ucyc7XHJcbmltcG9ydCB7IFN5bmNMb2dSZWNvcmRQcm9jZXNzb3IgfSBmcm9tICcuL3N5bmMtbG9nLXJlY29yZC1wcm9jZXNzb3InO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBUZWxlbWV0cnlDb25maWcge1xyXG4gIGVuZHBvaW50OiBzdHJpbmc7XHJcbiAgdXNlcm5hbWU6IHN0cmluZztcclxuICBwYXNzd29yZDogc3RyaW5nO1xyXG4gIHNlcnZpY2VOYW1lPzogc3RyaW5nO1xyXG4gIHNlcnZpY2VWZXJzaW9uPzogc3RyaW5nO1xyXG4gIGVuYWJsZWQ/OiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgVGVsZW1ldHJ5UHJvdmlkZXIge1xyXG4gIHByaXZhdGUgbG9nZ2VyUHJvdmlkZXI6IExvZ2dlclByb3ZpZGVyIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBpbml0aWFsaXplZCA9IGZhbHNlO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIC8vIEF1dG8taW5pdGlhbGl6ZSBzeW5jaHJvbm91c2x5IHdpdGggZW52aXJvbm1lbnQgdmFyaWFibGVzXHJcbiAgICBpZiAoIXRoaXMuaW5pdGlhbGl6ZWQgJiYgcHJvY2Vzcy5lbnYuT1RFTF9FWFBPUlRFUl9PVExQX0VORFBPSU5UKSB7XHJcbiAgICAgIGNvbnN0IHNlcnZpY2VOYW1lID0gcHJvY2Vzcy5lbnYuU0VSVklDRV9OQU1FIHx8ICd1bmtub3duLXNlcnZpY2UnO1xyXG4gICAgICBjb25zdCBzZXJ2aWNlU3RhZ2UgPSBwcm9jZXNzLmVudi5TVEFHRTtcclxuICAgICAgdGhpcy5pbml0aWFsaXplKHtcclxuICAgICAgICBlbmRwb2ludDogcHJvY2Vzcy5lbnYuT1RFTF9FWFBPUlRFUl9PVExQX0VORFBPSU5UIHx8ICcnLFxyXG4gICAgICAgIHVzZXJuYW1lOiBwcm9jZXNzLmVudi5PVEVMX0VYUE9SVEVSX09UTFBfVVNFUiB8fCAnJyxcclxuICAgICAgICBwYXNzd29yZDogcHJvY2Vzcy5lbnYuT1RFTF9FWFBPUlRFUl9PVExQX1BBU1MgfHwgJycsXHJcbiAgICAgICAgc2VydmljZU5hbWU6IGAke3NlcnZpY2VOYW1lfS0ke3NlcnZpY2VTdGFnZX1gLFxyXG4gICAgICAgIHNlcnZpY2VWZXJzaW9uOiBwcm9jZXNzLmVudi5ucG1fcGFja2FnZV92ZXJzaW9uIHx8ICcxLjAuMCcsXHJcbiAgICAgICAgZW5hYmxlZDogcHJvY2Vzcy5lbnYuT1RFTF9FTkFCTEVEICE9PSAnZmFsc2UnLFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBpbml0aWFsaXplKGNvbmZpZzogVGVsZW1ldHJ5Q29uZmlnKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5pbml0aWFsaXplZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNvbmZpZy5lbmFibGVkID09PSBmYWxzZSkge1xyXG4gICAgICBjb25zb2xlLmxvZygnW1RlbGVtZXRyeV0gT3BlblRlbGVtZXRyeSBpcyBkaXNhYmxlZCcpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFjb25maWcuZW5kcG9pbnQgfHwgIWNvbmZpZy51c2VybmFtZSB8fCAhY29uZmlnLnBhc3N3b3JkKSB7XHJcbiAgICAgIC8vIE7Do28gbG9nYXIgZXJybyBzZSBlc3RpdmVybW9zIGVtIG1vZG8gZGUgYnVpbGRcclxuICAgICAgaWYgKFxyXG4gICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAndGVzdCcgJiZcclxuICAgICAgICBwcm9jZXNzLmVudi5PVEVMX0VYUE9SVEVSX09UTFBfRU5EUE9JTlRcclxuICAgICAgKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignW1RlbGVtZXRyeV0gTWlzc2luZyByZXF1aXJlZCBjb25maWd1cmF0aW9uJyk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIC8vIENyZWF0ZSByZXNvdXJjZSB3aXRoIHNlcnZpY2UgaW5mb3JtYXRpb25cclxuICAgICAgY29uc3QgcmVzb3VyY2UgPSByZXNvdXJjZUZyb21BdHRyaWJ1dGVzKHtcclxuICAgICAgICBbQVRUUl9TRVJWSUNFX05BTUVdOiBjb25maWcuc2VydmljZU5hbWUgfHwgJ3Vua25vd24tc2VydmljZScsXHJcbiAgICAgICAgW0FUVFJfU0VSVklDRV9WRVJTSU9OXTogY29uZmlnLnNlcnZpY2VWZXJzaW9uIHx8ICcxLjAuMCcsXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgLy8gQ3JlYXRlIE9UTFAgZXhwb3J0ZXIgd2l0aCBhdXRoZW50aWNhdGlvbiBhbmQgdGltZW91dCBjb25maWd1cmF0aW9uXHJcbiAgICAgIGNvbnN0IGxvZ0V4cG9ydGVyID0gbmV3IE9UTFBMb2dFeHBvcnRlcih7XHJcbiAgICAgICAgdXJsOiBgJHtjb25maWcuZW5kcG9pbnR9L3YxL2xvZ3NgLFxyXG4gICAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAgIEF1dGhvcml6YXRpb246IGBCYXNpYyAke0J1ZmZlci5mcm9tKGAke2NvbmZpZy51c2VybmFtZX06JHtjb25maWcucGFzc3dvcmR9YCkudG9TdHJpbmcoJ2Jhc2U2NCcpfWAsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB0aW1lb3V0TWlsbGlzOiA1MDAwLCAvLyA1IHNlY29uZCB0aW1lb3V0IGZvciBleHBvcnRzXHJcbiAgICAgICAgY29uY3VycmVuY3lMaW1pdDogMSwgLy8gUHJvY2VzcyBvbmUgZXhwb3J0IGF0IGEgdGltZVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIC8vIFVzZSBjdXN0b20gU3luY0xvZ1JlY29yZFByb2Nlc3NvciBpbnN0ZWFkIG9mIFNpbXBsZUxvZ1JlY29yZFByb2Nlc3NvclxyXG4gICAgICAvLyBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgYXN5bmMgSFRUUCBleHBvcnQgaXMgcHJvcGVybHkgYXdhaXRlZCBpbiBMYW1iZGFcclxuICAgICAgLy8gZW52aXJvbm1lbnRzIHdoZXJlIGV4ZWN1dGlvbiBjb250ZXh0IGZyZWV6ZXMgYWZ0ZXIgaGFuZGxlciByZXR1cm5zXHJcbiAgICAgIGNvbnN0IHN5bmNQcm9jZXNzb3IgPSBuZXcgU3luY0xvZ1JlY29yZFByb2Nlc3Nvcihsb2dFeHBvcnRlcik7XHJcblxyXG4gICAgICAvLyBDcmVhdGUgbG9nZ2VyIHByb3ZpZGVyIHdpdGggcmVzb3VyY2UgYW5kIHByb2Nlc3NvcnNcclxuICAgICAgdGhpcy5sb2dnZXJQcm92aWRlciA9IG5ldyBMb2dnZXJQcm92aWRlcih7XHJcbiAgICAgICAgcmVzb3VyY2UsXHJcbiAgICAgICAgcHJvY2Vzc29yczogW3N5bmNQcm9jZXNzb3JdLFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgICBjb25zb2xlLmxvZygnW1RlbGVtZXRyeV0gT3BlblRlbGVtZXRyeSBpbml0aWFsaXplZCBzdWNjZXNzZnVsbHknKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tUZWxlbWV0cnldIEZhaWxlZCB0byBpbml0aWFsaXplIE9wZW5UZWxlbWV0cnk6JywgZXJyb3IpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldExvZ2dlclByb3ZpZGVyKCk6IExvZ2dlclByb3ZpZGVyIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5sb2dnZXJQcm92aWRlcjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc0luaXRpYWxpemVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaW5pdGlhbGl6ZWQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGb3JjZSBmbHVzaCBhbGwgcGVuZGluZyBsb2dzIHRvIGVuc3VyZSB0aGV5IGFyZSBzZW50IGJlZm9yZSBMYW1iZGEgZnJlZXplc1xyXG4gICAqIFRoaXMgaXMgY3JpdGljYWwgaW4gQVdTIExhbWJkYSBlbnZpcm9ubWVudHMgd2hlcmUgZXhlY3V0aW9uIGNvbnRleHQgZnJlZXplc1xyXG4gICAqIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBoYW5kbGVyIHJldHVybnMsIHBvdGVudGlhbGx5IGJlZm9yZSBhc3luYyBIVFRQIHJlcXVlc3RzIGNvbXBsZXRlXHJcbiAgICovXHJcbiAgcHVibGljIGFzeW5jIGZvcmNlRmx1c2goKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoIXRoaXMubG9nZ2VyUHJvdmlkZXIpIHtcclxuICAgICAgY29uc29sZS53YXJuKCdbVGVsZW1ldHJ5XSBmb3JjZUZsdXNoIGNhbGxlZCBidXQgbG9nZ2VyUHJvdmlkZXIgaXMgbnVsbCcpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcclxuICAgICAgY29uc29sZS5sb2coJ1tUZWxlbWV0cnldIFN0YXJ0aW5nIGZvcmNlRmx1c2guLi4nKTtcclxuXHJcbiAgICAgIC8vIGZvcmNlRmx1c2ggZW5zdXJlcyBhbGwgcGVuZGluZyBsb2dzIGFyZSBleHBvcnRlZCBpbW1lZGlhdGVseVxyXG4gICAgICBhd2FpdCB0aGlzLmxvZ2dlclByb3ZpZGVyLmZvcmNlRmx1c2goKTtcclxuXHJcbiAgICAgIGNvbnN0IGR1cmF0aW9uID0gRGF0ZS5ub3coKSAtIHN0YXJ0VGltZTtcclxuICAgICAgY29uc29sZS5sb2coXHJcbiAgICAgICAgYFtUZWxlbWV0cnldIGZvcmNlRmx1c2ggY29tcGxldGVkIHN1Y2Nlc3NmdWxseSBpbiAke2R1cmF0aW9ufW1zYFxyXG4gICAgICApO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5lcnJvcignW1RlbGVtZXRyeV0gRmFpbGVkIHRvIGZvcmNlIGZsdXNoIGxvZ3M6JywgZXJyb3IpO1xyXG4gICAgICB0aHJvdyBlcnJvcjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBzaHV0ZG93bigpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh0aGlzLmxvZ2dlclByb3ZpZGVyKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMubG9nZ2VyUHJvdmlkZXIuc2h1dGRvd24oKTtcclxuICAgICAgdGhpcy5pbml0aWFsaXplZCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJG9uRGVzdHJveSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHJldHVybiB0aGlzLnNodXRkb3duKCk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { TelemetryProvider } from './config';
|
|
2
|
+
export interface ErrorLogData {
|
|
3
|
+
error: Error;
|
|
4
|
+
context?: Record<string, any>;
|
|
5
|
+
accountUserUid?: string;
|
|
6
|
+
accountUid?: string;
|
|
7
|
+
requestId?: string;
|
|
8
|
+
endpoint?: string;
|
|
9
|
+
method?: string;
|
|
10
|
+
controller?: string;
|
|
11
|
+
controllerMethod?: string;
|
|
12
|
+
applicationUid?: string;
|
|
13
|
+
awsRequestId?: string;
|
|
14
|
+
}
|
|
15
|
+
export declare class TelemetryService {
|
|
16
|
+
private readonly telemetryProvider;
|
|
17
|
+
constructor(telemetryProvider: TelemetryProvider);
|
|
18
|
+
logError(data: ErrorLogData): Promise<void>;
|
|
19
|
+
logException(error: Error, context?: Record<string, any>): Promise<void>;
|
|
20
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
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.TelemetryService = void 0;
|
|
13
|
+
const api_logs_1 = require("@opentelemetry/api-logs");
|
|
14
|
+
class TelemetryService {
|
|
15
|
+
constructor(telemetryProvider) {
|
|
16
|
+
this.telemetryProvider = telemetryProvider;
|
|
17
|
+
}
|
|
18
|
+
logError(data) {
|
|
19
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
20
|
+
if (!this.telemetryProvider.isInitialized()) {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
const loggerProvider = this.telemetryProvider.getLoggerProvider();
|
|
24
|
+
if (!loggerProvider) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
try {
|
|
28
|
+
const logger = loggerProvider.getLogger('cart-service-error-logger', '1.0.0');
|
|
29
|
+
const logRecord = {
|
|
30
|
+
severityNumber: api_logs_1.SeverityNumber.ERROR,
|
|
31
|
+
severityText: 'ERROR',
|
|
32
|
+
body: data.error.message,
|
|
33
|
+
attributes: {
|
|
34
|
+
'error.type': data.error.name,
|
|
35
|
+
'error.message': data.error.message,
|
|
36
|
+
'error.stack': data.error.stack || '',
|
|
37
|
+
'service.name': 'cart-service',
|
|
38
|
+
'accountUser.uid': data.accountUserUid || 'not provided',
|
|
39
|
+
'account.uid': data.accountUid || 'not provided',
|
|
40
|
+
'application.uid': data.applicationUid || 'not provided',
|
|
41
|
+
'request.id': data.requestId || 'not provided',
|
|
42
|
+
'aws.request.id': data.awsRequestId || 'not provided',
|
|
43
|
+
'http.endpoint': data.endpoint || 'not provided',
|
|
44
|
+
'http.method': data.method || 'not provided',
|
|
45
|
+
'controller.name': data.controller || 'not provided',
|
|
46
|
+
'controller.method': data.controllerMethod || 'not provided',
|
|
47
|
+
'error.context': JSON.stringify(data.context) || 'not provided',
|
|
48
|
+
timestamp: new Date().toISOString(),
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
logger.emit(logRecord);
|
|
52
|
+
yield this.telemetryProvider.forceFlush();
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
console.error('[TelemetryService] Failed to log error:', error);
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
logException(error, context) {
|
|
60
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
61
|
+
yield this.logError({
|
|
62
|
+
error,
|
|
63
|
+
context,
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
exports.TelemetryService = TelemetryService;
|
|
69
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXh0ZXJuYWwtc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXJ2aWNlcy90ZWxlbWV0cnkvZXh0ZXJuYWwtc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQSxzREFBeUQ7QUFpQnpELE1BQWEsZ0JBQWdCO0lBQzNCLFlBQTZCLGlCQUFvQztRQUFwQyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO0lBQUcsQ0FBQztJQUV4RCxRQUFRLENBQUMsSUFBa0I7O1lBQ3RDLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQztnQkFDNUMsT0FBTztZQUNULENBQUM7WUFFRCxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUNsRSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3BCLE9BQU87WUFDVCxDQUFDO1lBRUQsSUFBSSxDQUFDO2dCQUNILE1BQU0sTUFBTSxHQUFHLGNBQWMsQ0FBQyxTQUFTLENBQ3JDLDJCQUEyQixFQUMzQixPQUFPLENBQ1IsQ0FBQztnQkFFRixNQUFNLFNBQVMsR0FBRztvQkFDaEIsY0FBYyxFQUFFLHlCQUFjLENBQUMsS0FBSztvQkFDcEMsWUFBWSxFQUFFLE9BQU87b0JBQ3JCLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU87b0JBQ3hCLFVBQVUsRUFBRTt3QkFDVixZQUFZLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJO3dCQUM3QixlQUFlLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPO3dCQUNuQyxhQUFhLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLElBQUksRUFBRTt3QkFDckMsY0FBYyxFQUFFLGNBQWM7d0JBQzlCLGlCQUFpQixFQUFFLElBQUksQ0FBQyxjQUFjLElBQUksY0FBYzt3QkFDeEQsYUFBYSxFQUFFLElBQUksQ0FBQyxVQUFVLElBQUksY0FBYzt3QkFDaEQsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLGNBQWMsSUFBSSxjQUFjO3dCQUN4RCxZQUFZLEVBQUUsSUFBSSxDQUFDLFNBQVMsSUFBSSxjQUFjO3dCQUM5QyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsWUFBWSxJQUFJLGNBQWM7d0JBQ3JELGVBQWUsRUFBRSxJQUFJLENBQUMsUUFBUSxJQUFJLGNBQWM7d0JBQ2hELGFBQWEsRUFBRSxJQUFJLENBQUMsTUFBTSxJQUFJLGNBQWM7d0JBQzVDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxVQUFVLElBQUksY0FBYzt3QkFDcEQsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixJQUFJLGNBQWM7d0JBQzVELGVBQWUsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxjQUFjO3dCQUMvRCxTQUFTLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7cUJBQ3BDO2lCQUNGLENBQUM7Z0JBRUYsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFLdkIsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDNUMsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyx5Q0FBeUMsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUVsRSxDQUFDO1FBQ0gsQ0FBQztLQUFBO0lBRVksWUFBWSxDQUN2QixLQUFZLEVBQ1osT0FBNkI7O1lBRTdCLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQztnQkFDbEIsS0FBSztnQkFDTCxPQUFPO2FBQ1IsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztLQUFBO0NBQ0Y7QUEvREQsNENBK0RDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2V2ZXJpdHlOdW1iZXIgfSBmcm9tICdAb3BlbnRlbGVtZXRyeS9hcGktbG9ncyc7XHJcbmltcG9ydCB7IFRlbGVtZXRyeVByb3ZpZGVyIH0gZnJvbSAnLi9jb25maWcnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBFcnJvckxvZ0RhdGEge1xyXG4gIGVycm9yOiBFcnJvcjtcclxuICBjb250ZXh0PzogUmVjb3JkPHN0cmluZywgYW55PjtcclxuICBhY2NvdW50VXNlclVpZD86IHN0cmluZztcclxuICBhY2NvdW50VWlkPzogc3RyaW5nO1xyXG4gIHJlcXVlc3RJZD86IHN0cmluZztcclxuICBlbmRwb2ludD86IHN0cmluZztcclxuICBtZXRob2Q/OiBzdHJpbmc7XHJcbiAgY29udHJvbGxlcj86IHN0cmluZztcclxuICBjb250cm9sbGVyTWV0aG9kPzogc3RyaW5nO1xyXG4gIGFwcGxpY2F0aW9uVWlkPzogc3RyaW5nO1xyXG4gIGF3c1JlcXVlc3RJZD86IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFRlbGVtZXRyeVNlcnZpY2Uge1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgdGVsZW1ldHJ5UHJvdmlkZXI6IFRlbGVtZXRyeVByb3ZpZGVyKSB7fVxyXG5cclxuICBwdWJsaWMgYXN5bmMgbG9nRXJyb3IoZGF0YTogRXJyb3JMb2dEYXRhKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoIXRoaXMudGVsZW1ldHJ5UHJvdmlkZXIuaXNJbml0aWFsaXplZCgpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBsb2dnZXJQcm92aWRlciA9IHRoaXMudGVsZW1ldHJ5UHJvdmlkZXIuZ2V0TG9nZ2VyUHJvdmlkZXIoKTtcclxuICAgIGlmICghbG9nZ2VyUHJvdmlkZXIpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IGxvZ2dlciA9IGxvZ2dlclByb3ZpZGVyLmdldExvZ2dlcihcclxuICAgICAgICAnY2FydC1zZXJ2aWNlLWVycm9yLWxvZ2dlcicsXHJcbiAgICAgICAgJzEuMC4wJ1xyXG4gICAgICApO1xyXG5cclxuICAgICAgY29uc3QgbG9nUmVjb3JkID0ge1xyXG4gICAgICAgIHNldmVyaXR5TnVtYmVyOiBTZXZlcml0eU51bWJlci5FUlJPUixcclxuICAgICAgICBzZXZlcml0eVRleHQ6ICdFUlJPUicsXHJcbiAgICAgICAgYm9keTogZGF0YS5lcnJvci5tZXNzYWdlLFxyXG4gICAgICAgIGF0dHJpYnV0ZXM6IHtcclxuICAgICAgICAgICdlcnJvci50eXBlJzogZGF0YS5lcnJvci5uYW1lLFxyXG4gICAgICAgICAgJ2Vycm9yLm1lc3NhZ2UnOiBkYXRhLmVycm9yLm1lc3NhZ2UsXHJcbiAgICAgICAgICAnZXJyb3Iuc3RhY2snOiBkYXRhLmVycm9yLnN0YWNrIHx8ICcnLFxyXG4gICAgICAgICAgJ3NlcnZpY2UubmFtZSc6ICdjYXJ0LXNlcnZpY2UnLFxyXG4gICAgICAgICAgJ2FjY291bnRVc2VyLnVpZCc6IGRhdGEuYWNjb3VudFVzZXJVaWQgfHwgJ25vdCBwcm92aWRlZCcsXHJcbiAgICAgICAgICAnYWNjb3VudC51aWQnOiBkYXRhLmFjY291bnRVaWQgfHwgJ25vdCBwcm92aWRlZCcsXHJcbiAgICAgICAgICAnYXBwbGljYXRpb24udWlkJzogZGF0YS5hcHBsaWNhdGlvblVpZCB8fCAnbm90IHByb3ZpZGVkJyxcclxuICAgICAgICAgICdyZXF1ZXN0LmlkJzogZGF0YS5yZXF1ZXN0SWQgfHwgJ25vdCBwcm92aWRlZCcsXHJcbiAgICAgICAgICAnYXdzLnJlcXVlc3QuaWQnOiBkYXRhLmF3c1JlcXVlc3RJZCB8fCAnbm90IHByb3ZpZGVkJyxcclxuICAgICAgICAgICdodHRwLmVuZHBvaW50JzogZGF0YS5lbmRwb2ludCB8fCAnbm90IHByb3ZpZGVkJyxcclxuICAgICAgICAgICdodHRwLm1ldGhvZCc6IGRhdGEubWV0aG9kIHx8ICdub3QgcHJvdmlkZWQnLFxyXG4gICAgICAgICAgJ2NvbnRyb2xsZXIubmFtZSc6IGRhdGEuY29udHJvbGxlciB8fCAnbm90IHByb3ZpZGVkJyxcclxuICAgICAgICAgICdjb250cm9sbGVyLm1ldGhvZCc6IGRhdGEuY29udHJvbGxlck1ldGhvZCB8fCAnbm90IHByb3ZpZGVkJyxcclxuICAgICAgICAgICdlcnJvci5jb250ZXh0JzogSlNPTi5zdHJpbmdpZnkoZGF0YS5jb250ZXh0KSB8fCAnbm90IHByb3ZpZGVkJyxcclxuICAgICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBsb2dnZXIuZW1pdChsb2dSZWNvcmQpO1xyXG5cclxuICAgICAgLy8gQ1JJVElDQUw6IEZvcmNlIGZsdXNoIHRvIGVuc3VyZSBsb2cgaXMgc2VudCBiZWZvcmUgTGFtYmRhIGZyZWV6ZXNcclxuICAgICAgLy8gV2l0aG91dCB0aGlzLCB0aGUgYXN5bmMgSFRUUCByZXF1ZXN0IG1heSBub3QgY29tcGxldGUgYmVmb3JlXHJcbiAgICAgIC8vIHRoZSBMYW1iZGEgZXhlY3V0aW9uIGNvbnRleHQgZnJlZXplc1xyXG4gICAgICBhd2FpdCB0aGlzLnRlbGVtZXRyeVByb3ZpZGVyLmZvcmNlRmx1c2goKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tUZWxlbWV0cnlTZXJ2aWNlXSBGYWlsZWQgdG8gbG9nIGVycm9yOicsIGVycm9yKTtcclxuICAgICAgLy8gRG9uJ3QgcmUtdGhyb3cgdG8gYXZvaWQgYnJlYWtpbmcgdGhlIGFwcGxpY2F0aW9uIGZsb3dcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBsb2dFeGNlcHRpb24oXHJcbiAgICBlcnJvcjogRXJyb3IsXHJcbiAgICBjb250ZXh0PzogUmVjb3JkPHN0cmluZywgYW55PlxyXG4gICk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5sb2dFcnJvcih7XHJcbiAgICAgIGVycm9yLFxyXG4gICAgICBjb250ZXh0LFxyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./config"), exports);
|
|
18
|
+
__exportStar(require("./external-service"), exports);
|
|
19
|
+
__exportStar(require("../../telemetry"), exports);
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvdGVsZW1ldHJ5L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwyQ0FBeUI7QUFDekIscURBQW1DO0FBQ25DLGtEQUFnQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vY29uZmlnJztcclxuZXhwb3J0ICogZnJvbSAnLi9leHRlcm5hbC1zZXJ2aWNlJztcclxuZXhwb3J0ICogZnJvbSAnLi4vLi4vdGVsZW1ldHJ5JztcclxuIl19
|
|
@@ -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 SyncLogRecordProcessor 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.SyncLogRecordProcessor = void 0;
|
|
13
|
+
class SyncLogRecordProcessor {
|
|
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.SyncLogRecordProcessor = SyncLogRecordProcessor;
|
|
74
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1sb2ctcmVjb3JkLXByb2Nlc3Nvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXJ2aWNlcy90ZWxlbWV0cnkvc3luYy1sb2ctcmVjb3JkLXByb2Nlc3Nvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFZQSxNQUFhLHNCQUFzQjtJQUlqQyxZQUFZLFFBQXlCO1FBRnBCLG1CQUFjLEdBQW9CLEVBQUUsQ0FBQztRQUdwRCxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztJQUMzQixDQUFDO0lBRUQsTUFBTSxDQUFDLFNBQTRCLEVBQUUsUUFBa0I7UUFJckQsTUFBTSxhQUFhLEdBQUcsSUFBSSxPQUFPLENBQU8sQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDMUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFO2dCQUMzQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFLENBQUM7b0JBQ3RCLE9BQU8sRUFBRSxDQUFDO2dCQUNaLENBQUM7cUJBQU0sQ0FBQztvQkFDTixPQUFPLENBQUMsS0FBSyxDQUNYLHlDQUF5QyxFQUN6QyxNQUFNLENBQUMsS0FBSyxDQUNiLENBQUM7b0JBQ0YsTUFBTSxDQUNKLE1BQU0sQ0FBQyxLQUFLLFlBQVksS0FBSzt3QkFDM0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLO3dCQUNkLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQ3BDLENBQUM7Z0JBQ0osQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDO2FBQ0MsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNULE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3pELElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ2YsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3ZDLENBQUM7UUFDSCxDQUFDLENBQUM7YUFDRCxLQUFLLENBQUMsQ0FBQyxLQUFjLEVBQUUsRUFBRTtZQUN4QixPQUFPLENBQUMsS0FBSyxDQUFDLHdDQUF3QyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQy9ELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3pELElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ2YsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3ZDLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVMLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFSyxVQUFVOztZQUNkLE9BQU8sQ0FBQyxHQUFHLENBQ1QsbURBQW1ELElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxrQkFBa0IsQ0FDaEcsQ0FBQztZQUVGLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3JDLE9BQU8sQ0FBQyxHQUFHLENBQUMsc0RBQXNELENBQUMsQ0FBQztnQkFDcEUsT0FBTztZQUNULENBQUM7WUFFRCxJQUFJLENBQUM7Z0JBRUgsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDdkMsT0FBTyxDQUFDLEdBQUcsQ0FBQyx3REFBd0QsQ0FBQyxDQUFDO1lBQ3hFLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMsbURBQW1ELEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQzFFLE1BQU0sS0FBSyxDQUFDO1lBQ2QsQ0FBQztRQUNILENBQUM7S0FBQTtJQUVLLFFBQVE7O1lBQ1osT0FBTyxDQUFDLEdBQUcsQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1lBQ3pELE1BQU0sSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3hCLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUMvQixPQUFPLENBQUMsR0FBRyxDQUFDLDRDQUE0QyxDQUFDLENBQUM7UUFDNUQsQ0FBQztLQUFBO0NBQ0Y7QUF4RUQsd0RBd0VDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTG9nUmVjb3JkUHJvY2Vzc29yLCBSZWFkYWJsZUxvZ1JlY29yZCB9IGZyb20gJ0BvcGVudGVsZW1ldHJ5L3Nkay1sb2dzJztcclxuaW1wb3J0IHsgT1RMUExvZ0V4cG9ydGVyIH0gZnJvbSAnQG9wZW50ZWxlbWV0cnkvZXhwb3J0ZXItbG9ncy1vdGxwLWh0dHAnO1xyXG5pbXBvcnQgeyBDb250ZXh0IH0gZnJvbSAnQG9wZW50ZWxlbWV0cnkvYXBpJztcclxuXHJcbi8qKlxyXG4gKiBDdXN0b20gTG9nUmVjb3JkUHJvY2Vzc29yIHRoYXQgZW5zdXJlcyBzeW5jaHJvbm91cyBleHBvcnQgZm9yIEFXUyBMYW1iZGFcclxuICpcclxuICogVGhpcyBwcm9jZXNzb3Igd3JhcHMgdGhlIE9UTFAgZXhwb3J0ZXIgYW5kIGVuc3VyZXMgdGhhdCBsb2dzIGFyZSBhY3R1YWxseVxyXG4gKiBleHBvcnRlZCBzeW5jaHJvbm91c2x5IGJ5IGltbWVkaWF0ZWx5IGNhbGxpbmcgZXhwb3J0KCkgYW5kIHdhaXRpbmcgZm9yIGl0XHJcbiAqIHRvIGNvbXBsZXRlLCByYXRoZXIgdGhhbiByZWx5aW5nIG9uIFNpbXBsZUxvZ1JlY29yZFByb2Nlc3NvciB3aGljaCBtYXkgbm90XHJcbiAqIHByb3Blcmx5IGF3YWl0IHRoZSBhc3luYyBIVFRQIHJlcXVlc3QgaW4gTGFtYmRhIGVudmlyb25tZW50cy5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBTeW5jTG9nUmVjb3JkUHJvY2Vzc29yIGltcGxlbWVudHMgTG9nUmVjb3JkUHJvY2Vzc29yIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGV4cG9ydGVyOiBPVExQTG9nRXhwb3J0ZXI7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBwZW5kaW5nRXhwb3J0czogUHJvbWlzZTx2b2lkPltdID0gW107XHJcblxyXG4gIGNvbnN0cnVjdG9yKGV4cG9ydGVyOiBPVExQTG9nRXhwb3J0ZXIpIHtcclxuICAgIHRoaXMuZXhwb3J0ZXIgPSBleHBvcnRlcjtcclxuICB9XHJcblxyXG4gIG9uRW1pdChsb2dSZWNvcmQ6IFJlYWRhYmxlTG9nUmVjb3JkLCBfY29udGV4dD86IENvbnRleHQpOiB2b2lkIHtcclxuICAgIC8vIEV4cG9ydCBpbW1lZGlhdGVseSBhbmQgdHJhY2sgdGhlIHByb21pc2VcclxuICAgIC8vIFRoZSBleHBvcnQgbWV0aG9kIHJldHVybnMgdm9pZCwgYnV0IGludGVybmFsbHkgdHJpZ2dlcnMgYXN5bmMgSFRUUCByZXF1ZXN0XHJcbiAgICAvLyBXZSBuZWVkIHRvIHdyYXAgaXQgdG8gdHJhY2sgY29tcGxldGlvblxyXG4gICAgY29uc3QgZXhwb3J0UHJvbWlzZSA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgdGhpcy5leHBvcnRlci5leHBvcnQoW2xvZ1JlY29yZF0sIChyZXN1bHQpID0+IHtcclxuICAgICAgICBpZiAocmVzdWx0LmNvZGUgPT09IDApIHtcclxuICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcihcclxuICAgICAgICAgICAgJ1tTeW5jTG9nUmVjb3JkUHJvY2Vzc29yXSBFeHBvcnQgZmFpbGVkOicsXHJcbiAgICAgICAgICAgIHJlc3VsdC5lcnJvclxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHJlamVjdChcclxuICAgICAgICAgICAgcmVzdWx0LmVycm9yIGluc3RhbmNlb2YgRXJyb3JcclxuICAgICAgICAgICAgICA/IHJlc3VsdC5lcnJvclxyXG4gICAgICAgICAgICAgIDogbmV3IEVycm9yKFN0cmluZyhyZXN1bHQuZXJyb3IpKVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSlcclxuICAgICAgLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5wZW5kaW5nRXhwb3J0cy5pbmRleE9mKGV4cG9ydFByb21pc2UpO1xyXG4gICAgICAgIGlmIChpbmRleCA+IC0xKSB7XHJcbiAgICAgICAgICB0aGlzLnBlbmRpbmdFeHBvcnRzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgICAuY2F0Y2goKGVycm9yOiB1bmtub3duKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignW1N5bmNMb2dSZWNvcmRQcm9jZXNzb3JdIEV4cG9ydCBlcnJvcjonLCBlcnJvcik7XHJcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnBlbmRpbmdFeHBvcnRzLmluZGV4T2YoZXhwb3J0UHJvbWlzZSk7XHJcbiAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcclxuICAgICAgICAgIHRoaXMucGVuZGluZ0V4cG9ydHMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIHRoaXMucGVuZGluZ0V4cG9ydHMucHVzaChleHBvcnRQcm9taXNlKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGZvcmNlRmx1c2goKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zb2xlLmxvZyhcclxuICAgICAgYFtTeW5jTG9nUmVjb3JkUHJvY2Vzc29yXSBmb3JjZUZsdXNoIGNhbGxlZCB3aXRoICR7dGhpcy5wZW5kaW5nRXhwb3J0cy5sZW5ndGh9IHBlbmRpbmcgZXhwb3J0c2BcclxuICAgICk7XHJcblxyXG4gICAgaWYgKHRoaXMucGVuZGluZ0V4cG9ydHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdbU3luY0xvZ1JlY29yZFByb2Nlc3Nvcl0gTm8gcGVuZGluZyBleHBvcnRzIHRvIGZsdXNoJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0cnkge1xyXG4gICAgICAvLyBXYWl0IGZvciBhbGwgcGVuZGluZyBleHBvcnRzIHRvIGNvbXBsZXRlXHJcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKHRoaXMucGVuZGluZ0V4cG9ydHMpO1xyXG4gICAgICBjb25zb2xlLmxvZygnW1N5bmNMb2dSZWNvcmRQcm9jZXNzb3JdIEFsbCBwZW5kaW5nIGV4cG9ydHMgY29tcGxldGVkJyk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdbU3luY0xvZ1JlY29yZFByb2Nlc3Nvcl0gRXJyb3IgZHVyaW5nIGZvcmNlRmx1c2g6JywgZXJyb3IpO1xyXG4gICAgICB0aHJvdyBlcnJvcjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIHNodXRkb3duKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc29sZS5sb2coJ1tTeW5jTG9nUmVjb3JkUHJvY2Vzc29yXSBTaHV0dGluZyBkb3duLi4uJyk7XHJcbiAgICBhd2FpdCB0aGlzLmZvcmNlRmx1c2goKTtcclxuICAgIGF3YWl0IHRoaXMuZXhwb3J0ZXIuc2h1dGRvd24oKTtcclxuICAgIGNvbnNvbGUubG9nKCdbU3luY0xvZ1JlY29yZFByb2Nlc3Nvcl0gU2h1dGRvd24gY29tcGxldGUnKTtcclxuICB9XHJcbn1cclxuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './middy';
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./middy"), exports);
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVsZW1ldHJ5L3NzdC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMENBQXdCIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9taWRkeSc7XHJcbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './middleware';
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./middleware"), exports);
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGVsZW1ldHJ5L3NzdC9taWRkeS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsK0NBQTZCIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9taWRkbGV3YXJlJztcclxuIl19
|
|
@@ -0,0 +1,172 @@
|
|
|
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.middyMiddleware = void 0;
|
|
13
|
+
const api_1 = require("@opentelemetry/api");
|
|
14
|
+
const telemetry_1 = require("../telemetry");
|
|
15
|
+
const perf_hooks_1 = require("perf_hooks");
|
|
16
|
+
const middyMiddleware = (options) => ({
|
|
17
|
+
before: (request) => __awaiter(void 0, void 0, void 0, function* () {
|
|
18
|
+
const startTime = perf_hooks_1.performance.now();
|
|
19
|
+
const { context: lambdaContext } = request;
|
|
20
|
+
const functionName = lambdaContext.functionName;
|
|
21
|
+
const invocationId = lambdaContext.awsRequestId;
|
|
22
|
+
const serviceName = process.env.SERVICE_NAME || 'search-engine';
|
|
23
|
+
const event = request.event;
|
|
24
|
+
const queryStringParameters = (event === null || event === void 0 ? void 0 : event.queryStringParameters) || {};
|
|
25
|
+
const origin = queryStringParameters.origin || 'unknown';
|
|
26
|
+
let stage = process.env.STAGE || 'development';
|
|
27
|
+
if (stage === 'prod')
|
|
28
|
+
stage = 'production';
|
|
29
|
+
const tracer = api_1.trace.getTracer(serviceName);
|
|
30
|
+
const meter = api_1.metrics.getMeter(origin);
|
|
31
|
+
const span = tracer.startSpan(functionName, {
|
|
32
|
+
kind: 1,
|
|
33
|
+
attributes: {
|
|
34
|
+
'faas.name': functionName,
|
|
35
|
+
'faas.invocation_id': invocationId,
|
|
36
|
+
origin,
|
|
37
|
+
'service.name': serviceName,
|
|
38
|
+
'deployment.environment.name': stage,
|
|
39
|
+
},
|
|
40
|
+
});
|
|
41
|
+
const executionTimeHistogram = meter.createHistogram('lambda_execution_duration', {
|
|
42
|
+
description: 'Tempo total de execução do Lambda em ms',
|
|
43
|
+
unit: 'ms',
|
|
44
|
+
valueType: api_1.ValueType.DOUBLE,
|
|
45
|
+
});
|
|
46
|
+
const successCounter = meter.createCounter('total_successful_purchases', {
|
|
47
|
+
description: 'Total de compras bem-sucedidas',
|
|
48
|
+
});
|
|
49
|
+
const failureCounter = meter.createCounter('total_failed_purchases', {
|
|
50
|
+
description: 'Total de compras com falha',
|
|
51
|
+
});
|
|
52
|
+
request.context.otel = {
|
|
53
|
+
span,
|
|
54
|
+
meter,
|
|
55
|
+
executionTimeHistogram,
|
|
56
|
+
successCounter,
|
|
57
|
+
failureCounter,
|
|
58
|
+
startTime,
|
|
59
|
+
};
|
|
60
|
+
}),
|
|
61
|
+
after: (request) => __awaiter(void 0, void 0, void 0, function* () {
|
|
62
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
|
|
63
|
+
const otelData = request.context.otel;
|
|
64
|
+
if (!otelData)
|
|
65
|
+
return;
|
|
66
|
+
const event = request.event;
|
|
67
|
+
const queryStringParameters = (event === null || event === void 0 ? void 0 : event.queryStringParameters) || {};
|
|
68
|
+
const origin = queryStringParameters.origin || 'unknown';
|
|
69
|
+
const { span, successCounter, executionTimeHistogram, startTime } = otelData;
|
|
70
|
+
span.setStatus({ code: api_1.SpanStatusCode.OK });
|
|
71
|
+
span.setAttribute('execution.success', true);
|
|
72
|
+
successCounter.add(1, {
|
|
73
|
+
origin,
|
|
74
|
+
'faas.name': ((_a = span.attributes) === null || _a === void 0 ? void 0 : _a['faas.name']) || 'unknown',
|
|
75
|
+
'service.name': ((_b = span.attributes) === null || _b === void 0 ? void 0 : _b['service.name']) || 'search-engine',
|
|
76
|
+
'deployment.environment.name': (_c = span.attributes) === null || _c === void 0 ? void 0 : _c['deployment.environment.name'],
|
|
77
|
+
});
|
|
78
|
+
const durationMs = perf_hooks_1.performance.now() - startTime;
|
|
79
|
+
executionTimeHistogram.record(durationMs, {
|
|
80
|
+
origin: ((_d = span.attributes) === null || _d === void 0 ? void 0 : _d['origin']) || 'unknown',
|
|
81
|
+
status: 'success',
|
|
82
|
+
'faas.name': ((_e = span.attributes) === null || _e === void 0 ? void 0 : _e['faas.name']) || 'unknown',
|
|
83
|
+
'service.name': ((_f = span.attributes) === null || _f === void 0 ? void 0 : _f['service.name']) || 'search-engine',
|
|
84
|
+
'deployment.environment.name': (_g = span.attributes) === null || _g === void 0 ? void 0 : _g['deployment.environment.name'],
|
|
85
|
+
});
|
|
86
|
+
const standardLogger = (0, telemetry_1.getStandardLogger)();
|
|
87
|
+
let stage = process.env.STAGE || 'development';
|
|
88
|
+
if (stage === 'prod')
|
|
89
|
+
stage = 'production';
|
|
90
|
+
yield standardLogger.logInfo({
|
|
91
|
+
message: 'Request completed successfully',
|
|
92
|
+
serviceName: ((_h = span.attributes) === null || _h === void 0 ? void 0 : _h['service.name']) || 'sst-service',
|
|
93
|
+
environment: stage,
|
|
94
|
+
execution: {
|
|
95
|
+
functionName: (_j = span.attributes) === null || _j === void 0 ? void 0 : _j['faas.name'],
|
|
96
|
+
invocationId: (_k = span.attributes) === null || _k === void 0 ? void 0 : _k['faas.invocation_id'],
|
|
97
|
+
origin,
|
|
98
|
+
},
|
|
99
|
+
performance: {
|
|
100
|
+
durationMs,
|
|
101
|
+
success: true,
|
|
102
|
+
},
|
|
103
|
+
});
|
|
104
|
+
span.end();
|
|
105
|
+
yield (0, telemetry_1.forceFlush)();
|
|
106
|
+
}),
|
|
107
|
+
onError: (request) => __awaiter(void 0, void 0, void 0, function* () {
|
|
108
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s;
|
|
109
|
+
const otelData = request.context.otel;
|
|
110
|
+
if (!otelData)
|
|
111
|
+
return;
|
|
112
|
+
const event = request.event;
|
|
113
|
+
const queryStringParameters = (event === null || event === void 0 ? void 0 : event.queryStringParameters) || {};
|
|
114
|
+
const origin = queryStringParameters.origin || 'unknown';
|
|
115
|
+
const { span, failureCounter, executionTimeHistogram, startTime } = otelData;
|
|
116
|
+
const error = request.error;
|
|
117
|
+
span.recordException(error);
|
|
118
|
+
span.setStatus({
|
|
119
|
+
code: api_1.SpanStatusCode.ERROR,
|
|
120
|
+
message: (error === null || error === void 0 ? void 0 : error.message) || 'Unknown error',
|
|
121
|
+
});
|
|
122
|
+
span.setAttribute('execution.success', false);
|
|
123
|
+
span.setAttribute('error.type', ((_a = error === null || error === void 0 ? void 0 : error.constructor) === null || _a === void 0 ? void 0 : _a.name) || 'UnknownError');
|
|
124
|
+
span.setAttribute('deployment.environment.name', ((_b = span.attributes) === null || _b === void 0 ? void 0 : _b['deployment.environment.name']) || 'development');
|
|
125
|
+
span.setAttribute('service.name', ((_c = span.attributes) === null || _c === void 0 ? void 0 : _c['service.name']) || 'providers-purchase-integrator');
|
|
126
|
+
span.setAttribute('faas.name', ((_d = span.attributes) === null || _d === void 0 ? void 0 : _d['faas.name']) || 'unknown');
|
|
127
|
+
span.setAttribute('origin', origin);
|
|
128
|
+
span.setAttribute('faas.invocation_id', (_e = span.attributes) === null || _e === void 0 ? void 0 : _e['faas.invocation_id']);
|
|
129
|
+
failureCounter.add(1, {
|
|
130
|
+
origin,
|
|
131
|
+
error_type: ((_f = error === null || error === void 0 ? void 0 : error.constructor) === null || _f === void 0 ? void 0 : _f.name) || 'UnknownError',
|
|
132
|
+
'faas.name': ((_g = span.attributes) === null || _g === void 0 ? void 0 : _g['faas.name']) || 'unknown',
|
|
133
|
+
'service.name': ((_h = span.attributes) === null || _h === void 0 ? void 0 : _h['service.name']) || 'search-engine',
|
|
134
|
+
'deployment.environment.name': (_j = span.attributes) === null || _j === void 0 ? void 0 : _j['deployment.environment.name'],
|
|
135
|
+
});
|
|
136
|
+
const durationMs = perf_hooks_1.performance.now() - startTime;
|
|
137
|
+
executionTimeHistogram.record(durationMs, {
|
|
138
|
+
origin: ((_k = span.attributes) === null || _k === void 0 ? void 0 : _k['origin']) || 'unknown',
|
|
139
|
+
status: 'error',
|
|
140
|
+
'faas.name': ((_l = span.attributes) === null || _l === void 0 ? void 0 : _l['faas.name']) || 'unknown',
|
|
141
|
+
'service.name': ((_m = span.attributes) === null || _m === void 0 ? void 0 : _m['service.name']) || 'search-engine',
|
|
142
|
+
'deployment.environment.name': (_o = span.attributes) === null || _o === void 0 ? void 0 : _o['deployment.environment.name'],
|
|
143
|
+
});
|
|
144
|
+
const standardLogger = (0, telemetry_1.getStandardLogger)();
|
|
145
|
+
let stage = process.env.STAGE || 'development';
|
|
146
|
+
if (stage === 'prod')
|
|
147
|
+
stage = 'production';
|
|
148
|
+
yield standardLogger.logError({
|
|
149
|
+
message: (error === null || error === void 0 ? void 0 : error.message) || 'Unknown error occurred',
|
|
150
|
+
error: error || undefined,
|
|
151
|
+
serviceName: ((_p = span.attributes) === null || _p === void 0 ? void 0 : _p['service.name']) || 'sst-service',
|
|
152
|
+
environment: stage,
|
|
153
|
+
execution: {
|
|
154
|
+
functionName: (_q = span.attributes) === null || _q === void 0 ? void 0 : _q['faas.name'],
|
|
155
|
+
invocationId: (_r = span.attributes) === null || _r === void 0 ? void 0 : _r['faas.invocation_id'],
|
|
156
|
+
awsRequestId: (_s = span.attributes) === null || _s === void 0 ? void 0 : _s['faas.invocation_id'],
|
|
157
|
+
origin,
|
|
158
|
+
},
|
|
159
|
+
performance: {
|
|
160
|
+
durationMs,
|
|
161
|
+
success: false,
|
|
162
|
+
},
|
|
163
|
+
context: {
|
|
164
|
+
queryStringParameters,
|
|
165
|
+
},
|
|
166
|
+
});
|
|
167
|
+
span.end();
|
|
168
|
+
yield (0, telemetry_1.forceFlush)();
|
|
169
|
+
}),
|
|
170
|
+
});
|
|
171
|
+
exports.middyMiddleware = middyMiddleware;
|
|
172
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlkZGxld2FyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZWxlbWV0cnkvc3N0L21pZGR5L21pZGRsZXdhcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQ0EsNENBQStFO0FBQy9FLDRDQUE2RDtBQUM3RCwyQ0FBeUM7QUFJbEMsTUFBTSxlQUFlLEdBQUcsQ0FDN0IsT0FBZ0MsRUFDWCxFQUFFLENBQUMsQ0FBQztJQUN6QixNQUFNLEVBQUUsQ0FBTyxPQUFPLEVBQUUsRUFBRTtRQUN4QixNQUFNLFNBQVMsR0FBRyx3QkFBVyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBRXBDLE1BQU0sRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLEdBQUcsT0FBTyxDQUFDO1FBQzNDLE1BQU0sWUFBWSxHQUFHLGFBQWEsQ0FBQyxZQUFZLENBQUM7UUFDaEQsTUFBTSxZQUFZLEdBQUcsYUFBYSxDQUFDLFlBQVksQ0FBQztRQUNoRCxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksSUFBSSxlQUFlLENBQUM7UUFDaEUsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQVksQ0FBQztRQUNuQyxNQUFNLHFCQUFxQixHQUFHLENBQUEsS0FBSyxhQUFMLEtBQUssdUJBQUwsS0FBSyxDQUFFLHFCQUFxQixLQUFJLEVBQUUsQ0FBQztRQUNqRSxNQUFNLE1BQU0sR0FBRyxxQkFBcUIsQ0FBQyxNQUFNLElBQUksU0FBUyxDQUFDO1FBQ3pELElBQUksS0FBSyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLGFBQWEsQ0FBQztRQUMvQyxJQUFJLEtBQUssS0FBSyxNQUFNO1lBQUUsS0FBSyxHQUFHLFlBQVksQ0FBQztRQUUzQyxNQUFNLE1BQU0sR0FBRyxXQUFLLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzVDLE1BQU0sS0FBSyxHQUFHLGFBQU8sQ0FBQyxRQUFRLENBQUMs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QUUsQ0FBQSxLQUFLLGFBQUwsS0FBSyx1QkFBTCxLQUFLLENBQUUsT0FBTyxLQUFJLHdCQUF3QjtZQUNuRCxLQUFLLEVBQUUsS0FBSyxJQUFJLFNBQVM7WUFDekIsV0FBVyxFQUNULENBQUMsTUFBQSxJQUFJLENBQUMsVUFBVSwwQ0FBRyxjQUFjLENBQVksS0FBSSxhQUFhO1lBQ2hFLFdBQVcsRUFBRSxLQUFLO1lBQ2xCLFNBQVMsRUFBRTtnQkFDVCxZQUFZLEVBQUUsTUFBQSxJQUFJLENBQUMsVUFBVSwwQ0FBRyxXQUFXLENBQVc7Z0JBQ3RELFlBQVksRUFBRSxNQUFBLElBQUksQ0FBQyxVQUFVLDBDQUFHLG9CQUFvQixDQUFXO2dCQUMvRCxZQUFZLEVBQUUsTUFBQSxJQUFJLENBQUMsVUFBVSwwQ0FBRyxvQkFBb0IsQ0FBVztnQkFDL0QsTUFBTTthQUNQO1lBQ0QsV0FBVyxFQUFFO2dCQUNYLFVBQVU7Z0JBQ1YsT0FBTyxFQUFFLEtBQUs7YUFDZjtZQUNELE9BQU8sRUFBRTtnQkFDUCxxQkFBcUI7YUFDdEI7U0FDRixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDWCxNQUFNLElBQUEsc0JBQVUsR0FBRSxDQUFDO0lBQ3JCLENBQUMsQ0FBQTtDQUNGLENBQUMsQ0FBQztBQW5NVSxRQUFBLGVBQWUsbUJBbU16QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBtaWRkeSBmcm9tICdAbWlkZHkvY29yZSc7XHJcbmltcG9ydCB7IHRyYWNlLCBTcGFuU3RhdHVzQ29kZSwgbWV0cmljcywgVmFsdWVUeXBlIH0gZnJvbSAnQG9wZW50ZWxlbWV0cnkvYXBpJztcclxuaW1wb3J0IHsgZm9yY2VGbHVzaCwgZ2V0U3RhbmRhcmRMb2dnZXIgfSBmcm9tICcuLi90ZWxlbWV0cnknO1xyXG5pbXBvcnQgeyBwZXJmb3JtYW5jZSB9IGZyb20gJ3BlcmZfaG9va3MnO1xyXG5cclxuaW50ZXJmYWNlIE1pZGR5TWlkZGxld2FyZU9wdGlvbnMge31cclxuXHJcbmV4cG9ydCBjb25zdCBtaWRkeU1pZGRsZXdhcmUgPSAoXHJcbiAgb3B0aW9ucz86IE1pZGR5TWlkZGxld2FyZU9wdGlvbnNcclxuKTogbWlkZHkuTWlkZGxld2FyZU9iaiA9PiAoe1xyXG4gIGJlZm9yZTogYXN5bmMgKHJlcXVlc3QpID0+IHtcclxuICAgIGNvbnN0IHN0YXJ0VGltZSA9IHBlcmZvcm1hbmNlLm5vdygpO1xyXG5cclxuICAgIGNvbnN0IHsgY29udGV4dDogbGFtYmRhQ29udGV4dCB9ID0gcmVxdWVzdDtcclxuICAgIGNvbnN0IGZ1bmN0aW9uTmFtZSA9IGxhbWJkYUNvbnRleHQuZnVuY3Rpb25OYW1lO1xyXG4gICAgY29uc3QgaW52b2NhdGlvbklkID0gbGFtYmRhQ29udGV4dC5hd3NSZXF1ZXN0SWQ7XHJcbiAgICBjb25zdCBzZXJ2aWNlTmFtZSA9IHByb2Nlc3MuZW52LlNFUlZJQ0VfTkFNRSB8fCAnc2VhcmNoLWVuZ2luZSc7XHJcbiAgICBjb25zdCBldmVudCA9IHJlcXVlc3QuZXZlbnQgYXMgYW55O1xyXG4gICAgY29uc3QgcXVlcnlTdHJpbmdQYXJhbWV0ZXJzID0gZXZlbnQ/LnF1ZXJ5U3RyaW5nUGFyYW1ldGVycyB8fCB7fTtcclxuICAgIGNvbnN0IG9yaWdpbiA9IHF1ZXJ5U3RyaW5nUGFyYW1ldGVycy5vcmlnaW4gfHwgJ3Vua25vd24nO1xyXG4gICAgbGV0IHN0YWdlID0gcHJvY2Vzcy5lbnYuU1RBR0UgfHwgJ2RldmVsb3BtZW50JztcclxuICAgIGlmIChzdGFnZSA9PT0gJ3Byb2QnKSBzdGFnZSA9ICdwcm9kdWN0aW9uJztcclxuXHJcbiAgICBjb25zdCB0cmFjZXIgPSB0cmFjZS5nZXRUcmFjZXIoc2VydmljZU5hbWUpO1xyXG4gICAgY29uc3QgbWV0ZXIgPSBtZXRyaWNzLmdldE1ldGVyKG9yaWdpbik7XHJcblxyXG4gICAgY29uc3Qgc3BhbiA9IHRyYWNlci5zdGFydFNwYW4oZnVuY3Rpb25OYW1lLCB7XHJcbiAgICAgIGtpbmQ6IDEsXHJcbiAgICAgIGF0dHJpYnV0ZXM6IHtcclxuICAgICAgICAnZmFhcy5uYW1lJzogZnVuY3Rpb25OYW1lLFxyXG4gICAgICAgICdmYWFzLmludm9jYXRpb25faWQnOiBpbnZvY2F0aW9uSWQsXHJcbiAgICAgICAgb3JpZ2luLFxyXG4gICAgICAgICdzZXJ2aWNlLm5hbWUnOiBzZXJ2aWNlTmFtZSxcclxuICAgICAgICAnZGVwbG95bWVudC5lbnZpcm9ubWVudC5uYW1lJzogc3RhZ2UsXHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBleGVjdXRpb25UaW1lSGlzdG9ncmFtID0gbWV0ZXIuY3JlYXRlSGlzdG9ncmFtKFxyXG4gICAgICAnbGFtYmRhX2V4ZWN1dGlvbl9kdXJhdGlvbicsXHJcbiAgICAgIHtcclxuICAgICAgICBkZXNjcmlwdGlvbjogJ1RlbXBvIHRvdGFsIGRlIGV4ZWN1w6fDo28gZG8gTGFtYmRhIGVtIG1zJyxcclxuICAgICAgICB1bml0OiAnbXMnLFxyXG4gICAgICAgIHZhbHVlVHlwZTogVmFsdWVUeXBlLkRPVUJMRSxcclxuICAgICAgfVxyXG4gICAgKTtcclxuICAgIGNvbnN0IHN1Y2Nlc3NDb3VudGVyID0gbWV0ZXIuY3JlYXRlQ291bnRlcigndG90YWxfc3VjY2Vzc2Z1bF9wdXJjaGFzZXMnLCB7XHJcbiAgICAgIGRlc2NyaXB0aW9uOiAnVG90YWwgZGUgY29tcHJhcyBiZW0tc3VjZWRpZGFzJyxcclxuICAgIH0pO1xyXG4gICAgY29uc3QgZmFpbHVyZUNvdW50ZXIgPSBtZXRlci5jcmVhdGVDb3VudGVyKCd0b3RhbF9mYWlsZWRfcHVyY2hhc2VzJywge1xyXG4gICAgICBkZXNjcmlwdGlvbjogJ1RvdGFsIGRlIGNvbXByYXMgY29tIGZhbGhhJyxcclxuICAgIH0pO1xyXG5cclxuICAgIChyZXF1ZXN0LmNvbnRleHQgYXMgYW55KS5vdGVsID0ge1xyXG4gICAgICBzcGFuLFxyXG4gICAgICBtZXRlcixcclxuICAgICAgZXhlY3V0aW9uVGltZUhpc3RvZ3JhbSxcclxuICAgICAgc3VjY2Vzc0NvdW50ZXIsXHJcbiAgICAgIGZhaWx1cmVDb3VudGVyLFxyXG4gICAgICBzdGFydFRpbWUsXHJcbiAgICB9O1xyXG4gIH0sXHJcblxyXG4gIGFmdGVyOiBhc3luYyAocmVxdWVzdCkgPT4ge1xyXG4gICAgY29uc3Qgb3RlbERhdGEgPSAocmVxdWVzdC5jb250ZXh0IGFzIGFueSkub3RlbDtcclxuICAgIGlmICghb3RlbERhdGEpIHJldHVybjtcclxuICAgIGNvbnN0IGV2ZW50ID0gcmVxdWVzdC5ldmVudCBhcyBhbnk7XHJcblxyXG4gICAgY29uc3QgcXVlcnlTdHJpbmdQYXJhbWV0ZXJzID0gZXZlbnQ/LnF1ZXJ5U3RyaW5nUGFyYW1ldGVycyB8fCB7fTtcclxuICAgIGNvbnN0IG9yaWdpbiA9IHF1ZXJ5U3RyaW5nUGFyYW1ldGVycy5vcmlnaW4gfHwgJ3Vua25vd24nO1xyXG5cclxuICAgIGNvbnN0IHsgc3Bhbiwgc3VjY2Vzc0NvdW50ZXIsIGV4ZWN1dGlvblRpbWVIaXN0b2dyYW0sIHN0YXJ0VGltZSB9ID1cclxuICAgICAgb3RlbERhdGE7XHJcblxyXG4gICAgc3Bhbi5zZXRTdGF0dXMoeyBjb2RlOiBTcGFuU3RhdHVzQ29kZS5PSyB9KTtcclxuICAgIHNwYW4uc2V0QXR0cmlidXRlKCdleGVjdXRpb24uc3VjY2VzcycsIHRydWUpO1xyXG4gICAgc3VjY2Vzc0NvdW50ZXIuYWRkKDEsIHtcclxuICAgICAgb3JpZ2luLFxyXG4gICAgICAnZmFhcy5uYW1lJzogc3Bhbi5hdHRyaWJ1dGVzPy5bJ2ZhYXMubmFtZSddIHx8ICd1bmtub3duJyxcclxuICAgICAgJ3NlcnZpY2UubmFtZSc6IHNwYW4uYXR0cmlidXRlcz8uWydzZXJ2aWNlLm5hbWUnXSB8fCAnc2VhcmNoLWVuZ2luZScsXHJcbiAgICAgICdkZXBsb3ltZW50LmVudmlyb25tZW50Lm5hbWUnOlxyXG4gICAgICAgIHNwYW4uYXR0cmlidXRlcz8uWydkZXBsb3ltZW50LmVudmlyb25tZW50Lm5hbWUnXSxcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IGR1cmF0aW9uTXMgPSBwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0VGltZTtcclxuXHJcbiAgICBleGVjdXRpb25UaW1lSGlzdG9ncmFtLnJlY29yZChkdXJhdGlvbk1zLCB7XHJcbiAgICAgIG9yaWdpbjogc3Bhbi5hdHRyaWJ1dGVzPy5bJ29yaWdpbiddIHx8ICd1bmtub3duJyxcclxuICAgICAgc3RhdHVzOiAnc3VjY2VzcycsXHJcbiAgICAgICdmYWFzLm5hbWUnOiBzcGFuLmF0dHJpYnV0ZXM/LlsnZmFhcy5uYW1lJ10gfHwgJ3Vua25vd24nLFxyXG4gICAgICAnc2VydmljZS5uYW1lJzogc3Bhbi5hdHRyaWJ1dGVzPy5bJ3NlcnZpY2UubmFtZSddIHx8ICdzZWFyY2gtZW5naW5lJyxcclxuICAgICAgJ2RlcGxveW1lbnQuZW52aXJvbm1lbnQubmFtZSc6XHJcbiAgICAgICAgc3Bhbi5hdHRyaWJ1dGVzPy5bJ2RlcGxveW1lbnQuZW52aXJvbm1lbnQubmFtZSddLFxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gTG9nIGVzdHJ1dHVyYWRvIGRlIHN1Y2Vzc29cclxuICAgIGNvbnN0IHN0YW5kYXJkTG9nZ2VyID0gZ2V0U3RhbmRhcmRMb2dnZXIoKTtcclxuICAgIGxldCBzdGFnZSA9IHByb2Nlc3MuZW52LlNUQUdFIHx8ICdkZXZlbG9wbWVudCc7XHJcbiAgICBpZiAoc3RhZ2UgPT09ICdwcm9kJykgc3RhZ2UgPSAncHJvZHVjdGlvbic7XHJcblxyXG4gICAgYXdhaXQgc3RhbmRhcmRMb2dnZXIubG9nSW5mbyh7XHJcbiAgICAgIG1lc3NhZ2U6ICdSZXF1ZXN0IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHknLFxyXG4gICAgICBzZXJ2aWNlTmFtZTpcclxuICAgICAgICAoc3Bhbi5hdHRyaWJ1dGVzPy5bJ3NlcnZpY2UubmFtZSddIGFzIHN0cmluZykgfHwgJ3NzdC1zZXJ2aWNlJyxcclxuICAgICAgZW52aXJvbm1lbnQ6IHN0YWdlLFxyXG4gICAgICBleGVjdXRpb246IHtcclxuICAgICAgICBmdW5jdGlvbk5hbWU6IHNwYW4uYXR0cmlidXRlcz8uWydmYWFzLm5hbWUnXSBhcyBzdHJpbmcsXHJcbiAgICAgICAgaW52b2NhdGlvbklkOiBzcGFuLmF0dHJpYnV0ZXM/LlsnZmFhcy5pbnZvY2F0aW9uX2lkJ10gYXMgc3RyaW5nLFxyXG4gICAgICAgIG9yaWdpbixcclxuICAgICAgfSxcclxuICAgICAgcGVyZm9ybWFuY2U6IHtcclxuICAgICAgICBkdXJhdGlvbk1zLFxyXG4gICAgICAgIHN1Y2Nlc3M6IHRydWUsXHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuXHJcbiAgICBzcGFuLmVuZCgpO1xyXG4gICAgYXdhaXQgZm9yY2VGbHVzaCgpO1xyXG4gIH0sXHJcblxyXG4gIG9uRXJyb3I6IGFzeW5jIChyZXF1ZXN0KSA9PiB7XHJcbiAgICBjb25zdCBvdGVsRGF0YSA9IChyZXF1ZXN0LmNvbnRleHQgYXMgYW55KS5vdGVsO1xyXG4gICAgaWYgKCFvdGVsRGF0YSkgcmV0dXJuO1xyXG4gICAgY29uc3QgZXZlbnQgPSByZXF1ZXN0LmV2ZW50IGFzIGFueTtcclxuXHJcbiAgICBjb25zdCBxdWVyeVN0cmluZ1BhcmFtZXRlcnMgPSBldmVudD8ucXVlcnlTdHJpbmdQYXJhbWV0ZXJzIHx8IHt9O1xyXG4gICAgY29uc3Qgb3JpZ2luID0gcXVlcnlTdHJpbmdQYXJhbWV0ZXJzLm9yaWdpbiB8fCAndW5rbm93bic7XHJcblxyXG4gICAgY29uc3QgeyBzcGFuLCBmYWlsdXJlQ291bnRlciwgZXhlY3V0aW9uVGltZUhpc3RvZ3JhbSwgc3RhcnRUaW1lIH0gPVxyXG4gICAgICBvdGVsRGF0YTtcclxuICAgIGNvbnN0IGVycm9yID0gcmVxdWVzdC5lcnJvcjtcclxuXHJcbiAgICBzcGFuLnJlY29yZEV4Y2VwdGlvbihlcnJvcik7XHJcbiAgICBzcGFuLnNldFN0YXR1cyh7XHJcbiAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxyXG4gICAgICBtZXNzYWdlOiBlcnJvcj8ubWVzc2FnZSB8fCAnVW5rbm93biBlcnJvcicsXHJcbiAgICB9KTtcclxuICAgIHNwYW4uc2V0QXR0cmlidXRlKCdleGVjdXRpb24uc3VjY2VzcycsIGZhbHNlKTtcclxuICAgIHNwYW4uc2V0QXR0cmlidXRlKCdlcnJvci50eXBlJywgZXJyb3I/LmNvbnN0cnVjdG9yPy5uYW1lIHx8ICdVbmtub3duRXJyb3InKTtcclxuICAgIHNwYW4uc2V0QXR0cmlidXRlKFxyXG4gICAgICAnZGVwbG95bWVudC5lbnZpcm9ubWVudC5uYW1lJyxcclxuICAgICAgc3Bhbi5hdHRyaWJ1dGVzPy5bJ2RlcGxveW1lbnQuZW52aXJvbm1lbnQubmFtZSddIHx8ICdkZXZlbG9wbWVudCdcclxuICAgICk7XHJcbiAgICBzcGFuLnNldEF0dHJpYnV0ZShcclxuICAgICAgJ3NlcnZpY2UubmFtZScsXHJcbiAgICAgIHNwYW4uYXR0cmlidXRlcz8uWydzZXJ2aWNlLm5hbWUnXSB8fCAncHJvdmlkZXJzLXB1cmNoYXNlLWludGVncmF0b3InXHJcbiAgICApO1xyXG4gICAgc3Bhbi5zZXRBdHRyaWJ1dGUoJ2ZhYXMubmFtZScsIHNwYW4uYXR0cmlidXRlcz8uWydmYWFzLm5hbWUnXSB8fCAndW5rbm93bicpO1xyXG4gICAgc3Bhbi5zZXRBdHRyaWJ1dGUoJ29yaWdpbicsIG9yaWdpbik7XHJcbiAgICBzcGFuLnNldEF0dHJpYnV0ZShcclxuICAgICAgJ2ZhYXMuaW52b2NhdGlvbl9pZCcsXHJcbiAgICAgIHNwYW4uYXR0cmlidXRlcz8uWydmYWFzLmludm9jYXRpb25faWQnXVxyXG4gICAgKTtcclxuXHJcbiAgICBmYWlsdXJlQ291bnRlci5hZGQoMSwge1xyXG4gICAgICBvcmlnaW4sXHJcbiAgICAgIGVycm9yX3R5cGU6IGVycm9yPy5jb25zdHJ1Y3Rvcj8ubmFtZSB8fCAnVW5rbm93bkVycm9yJyxcclxuICAgICAgJ2ZhYXMubmFtZSc6IHNwYW4uYXR0cmlidXRlcz8uWydmYWFzLm5hbWUnXSB8fCAndW5rbm93bicsXHJcbiAgICAgICdzZXJ2aWNlLm5hbWUnOiBzcGFuLmF0dHJpYnV0ZXM/Llsnc2VydmljZS5uYW1lJ10gfHwgJ3NlYXJjaC1lbmdpbmUnLFxyXG4gICAgICAnZGVwbG95bWVudC5lbnZpcm9ubWVudC5uYW1lJzpcclxuICAgICAgICBzcGFuLmF0dHJpYnV0ZXM/LlsnZGVwbG95bWVudC5lbnZpcm9ubWVudC5uYW1lJ10sXHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBkdXJhdGlvbk1zID0gcGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydFRpbWU7XHJcblxyXG4gICAgZXhlY3V0aW9uVGltZUhpc3RvZ3JhbS5yZWNvcmQoZHVyYXRpb25Ncywge1xyXG4gICAgICBvcmlnaW46IHNwYW4uYXR0cmlidXRlcz8uWydvcmlnaW4nXSB8fCAndW5rbm93bicsXHJcbiAgICAgIHN0YXR1czogJ2Vycm9yJyxcclxuICAgICAgJ2ZhYXMubmFtZSc6IHNwYW4uYXR0cmlidXRlcz8uWydmYWFzLm5hbWUnXSB8fCAndW5rbm93bicsXHJcbiAgICAgICdzZXJ2aWNlLm5hbWUnOiBzcGFuLmF0dHJpYnV0ZXM/Llsnc2VydmljZS5uYW1lJ10gfHwgJ3NlYXJjaC1lbmdpbmUnLFxyXG4gICAgICAnZGVwbG95bWVudC5lbnZpcm9ubWVudC5uYW1lJzpcclxuICAgICAgICBzcGFuLmF0dHJpYnV0ZXM/LlsnZGVwbG95bWVudC5lbnZpcm9ubWVudC5uYW1lJ10sXHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBMb2cgZXN0cnV0dXJhZG8gZGUgZXJyb1xyXG4gICAgY29uc3Qgc3RhbmRhcmRMb2dnZXIgPSBnZXRTdGFuZGFyZExvZ2dlcigpO1xyXG4gICAgbGV0IHN0YWdlID0gcHJvY2Vzcy5lbnYuU1RBR0UgfHwgJ2RldmVsb3BtZW50JztcclxuICAgIGlmIChzdGFnZSA9PT0gJ3Byb2QnKSBzdGFnZSA9ICdwcm9kdWN0aW9uJztcclxuXHJcbiAgICBhd2FpdCBzdGFuZGFyZExvZ2dlci5sb2dFcnJvcih7XHJcbiAgICAgIG1lc3NhZ2U6IGVycm9yPy5tZXNzYWdlIHx8ICdVbmtub3duIGVycm9yIG9jY3VycmVkJyxcclxuICAgICAgZXJyb3I6IGVycm9yIHx8IHVuZGVmaW5lZCxcclxuICAgICAgc2VydmljZU5hbWU6XHJcbiAgICAgICAgKHNwYW4uYXR0cmlidXRlcz8uWydzZXJ2aWNlLm5hbWUnXSBhcyBzdHJpbmcpIHx8ICdzc3Qtc2VydmljZScsXHJcbiAgICAgIGVudmlyb25tZW50OiBzdGFnZSxcclxuICAgICAgZXhlY3V0aW9uOiB7XHJcbiAgICAgICAgZnVuY3Rpb25OYW1lOiBzcGFuLmF0dHJpYnV0ZXM/LlsnZmFhcy5uYW1lJ10gYXMgc3RyaW5nLFxyXG4gICAgICAgIGludm9jYXRpb25JZDogc3Bhbi5hdHRyaWJ1dGVzPy5bJ2ZhYXMuaW52b2NhdGlvbl9pZCddIGFzIHN0cmluZyxcclxuICAgICAgICBhd3NSZXF1ZXN0SWQ6IHNwYW4uYXR0cmlidXRlcz8uWydmYWFzLmludm9jYXRpb25faWQnXSBhcyBzdHJpbmcsXHJcbiAgICAgICAgb3JpZ2luLFxyXG4gICAgICB9LFxyXG4gICAgICBwZXJmb3JtYW5jZToge1xyXG4gICAgICAgIGR1cmF0aW9uTXMsXHJcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXHJcbiAgICAgIH0sXHJcbiAgICAgIGNvbnRleHQ6IHtcclxuICAgICAgICBxdWVyeVN0cmluZ1BhcmFtZXRlcnMsXHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuXHJcbiAgICBzcGFuLmVuZCgpO1xyXG4gICAgYXdhaXQgZm9yY2VGbHVzaCgpO1xyXG4gIH0sXHJcbn0pO1xyXG4iXX0=
|