@mecanizou/telemetry-hub 1.4.0 → 1.4.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/CHANGELOG.md +14 -0
- package/CLAUDE.md +78 -0
- package/dist/core/logger.js +4 -2
- package/dist/sst/extraction.js +3 -4
- package/docs/c4-container.md +123 -0
- package/docs/service-profile.md +179 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,17 @@
|
|
|
1
|
+
## [1.4.2](https://github.com/mecanizou-eco/telemetry-hub/compare/v1.4.1...v1.4.2) (2026-03-17)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Bug Fixes
|
|
5
|
+
|
|
6
|
+
* getEnvironmentStage on extractHttpAttributes ([1386a99](https://github.com/mecanizou-eco/telemetry-hub/commit/1386a99a14d6dff7d2cd57e23921cbac8f6ec165))
|
|
7
|
+
|
|
8
|
+
## [1.4.1](https://github.com/mecanizou-eco/telemetry-hub/compare/v1.4.0...v1.4.1) (2026-03-16)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Bug Fixes
|
|
12
|
+
|
|
13
|
+
* disableEmiter meme logic ([e5908cb](https://github.com/mecanizou-eco/telemetry-hub/commit/e5908cb2c6b5c0eeb993f281f4fcfa9dd18c9359))
|
|
14
|
+
|
|
1
15
|
# [1.4.0](https://github.com/mecanizou-eco/telemetry-hub/compare/v1.3.15...v1.4.0) (2026-01-30)
|
|
2
16
|
|
|
3
17
|
|
package/CLAUDE.md
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# CLAUDE.md
|
|
2
|
+
|
|
3
|
+
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
|
4
|
+
|
|
5
|
+
## What Is This
|
|
6
|
+
|
|
7
|
+
`@mecanizou/telemetry-hub` is a shared npm package that provides standardized OpenTelemetry-based logging, tracing, and metrics for Mecanizou services. It supports two framework integrations: **SST/Middy** (Lambda handlers) and **Ts.ED** (Express-based serverless). Published to npm via semantic-release on push to `master`.
|
|
8
|
+
|
|
9
|
+
## Commands
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
npm install # install dependencies
|
|
13
|
+
npm run build # compile TypeScript to dist/
|
|
14
|
+
npm test # run all tests (vitest, single run)
|
|
15
|
+
npm run test:watch # vitest in watch mode
|
|
16
|
+
npm run test:coverage # vitest with v8 coverage report
|
|
17
|
+
npm run test:tsc # type-check without emitting
|
|
18
|
+
npm run lint # eslint
|
|
19
|
+
npm run check # prettier check
|
|
20
|
+
npm run fix # prettier auto-fix
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Run a single test file:
|
|
24
|
+
```bash
|
|
25
|
+
npx vitest run src/core/__tests__/logger.test.ts
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Architecture
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
src/
|
|
32
|
+
├── index.ts # Package entry point — re-exports core + sst (tsed is commented out)
|
|
33
|
+
├── core/ # Framework-agnostic base classes
|
|
34
|
+
│ ├── logger.ts # StandardLogger — structured log emitter via OTel LoggerProvider
|
|
35
|
+
│ ├── logger-types.ts # StandardLogData interface, LogParams, IStandardLogger
|
|
36
|
+
│ ├── tracer.ts # StandardTracer — span lifecycle with standardized attributes
|
|
37
|
+
│ ├── tracer-types.ts # StandardTraceData, StandardSpanResult, IStandardTracer
|
|
38
|
+
│ └── environment.ts # getEnvironmentStage() — reads STAGE env var, normalizes "prod" → "production"
|
|
39
|
+
├── sst/ # SST/Middy integration (actively exported)
|
|
40
|
+
│ ├── telemetry.ts # Module-level OTel SDK init, singleton getStandardLogger/getStandardTracer, forceFlush
|
|
41
|
+
│ ├── extraction.ts # Extract HTTP attrs, logged user, default attrs from Lambda event/context
|
|
42
|
+
│ └── middy/
|
|
43
|
+
│ └── middleware.ts # middyTelemetryMiddleware — before/after/onError hooks with spans, metrics, structured logs
|
|
44
|
+
└── tsed/ # Ts.ED integration (exists but NOT exported from package entry — deployment issues)
|
|
45
|
+
├── config.ts # TsedTelemetryProvider — OTel provider lifecycle (init, flush, shutdown)
|
|
46
|
+
├── service.ts # TsedTelemetryService — @Injectable service wrapping StandardLogger
|
|
47
|
+
├── log-telemetry.ts # @TsedLogTelemetry decorator
|
|
48
|
+
└── sync-log-record-processor.ts # Custom sync processor for Lambda flush guarantees
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### Key Design Decisions
|
|
52
|
+
|
|
53
|
+
- **SST telemetry module initializes at import time** (`src/sst/telemetry.ts`): OTel SDK, exporters, and providers are created at module scope. Logger/tracer are singletons accessed via `getStandardLogger()`/`getStandardTracer()`.
|
|
54
|
+
- **Log emission is disabled in development**: `StandardLogger` checks `STAGE` env var and skips OTel emit when `environment === 'development'`, falling back to `console.log`.
|
|
55
|
+
- **forceFlush is critical**: Lambda environments freeze after handler return. Both SST middleware and Ts.ED service call `forceFlush()` after every request to ensure telemetry is exported before freeze.
|
|
56
|
+
- **Tsed integration is commented out** in `src/index.ts` due to deployment issues with `@tsed/di` and `@tsed/platform-serverless` in SST builds. The code exists and is tested but not shipped.
|
|
57
|
+
|
|
58
|
+
### Environment Variables
|
|
59
|
+
|
|
60
|
+
| Variable | Required | Description |
|
|
61
|
+
|---|---|---|
|
|
62
|
+
| `OTEL_EXPORTER_OTLP_ENDPOINT` | Yes | Base URL for OTel collector (appends `/alloy/v1`) |
|
|
63
|
+
| `OTEL_EXPORTER_OTLP_USER` | Yes | Basic auth username |
|
|
64
|
+
| `OTEL_EXPORTER_OTLP_PASS` | Yes | Basic auth password |
|
|
65
|
+
| `SERVICE_NAME` | No | Defaults to `sst-service` (SST) or `unknown-service` (core/Ts.ED) |
|
|
66
|
+
| `STAGE` | No | `prod`/`production`/`staging`/`development`. Defaults to `development` |
|
|
67
|
+
|
|
68
|
+
## Release Process
|
|
69
|
+
|
|
70
|
+
- Commits must follow [Conventional Commits](https://www.conventionalcommits.org/) (`feat:`, `fix:`, `chore:`, etc.) — enforced by commitlint.
|
|
71
|
+
- Pushing to `master`, `alpha`, or `beta` triggers semantic-release which bumps version, updates CHANGELOG.md, publishes to npm, and creates a GitHub release.
|
|
72
|
+
- CI runs build + tests on PRs to `master`/`staging`.
|
|
73
|
+
|
|
74
|
+
## Code Style
|
|
75
|
+
|
|
76
|
+
- ESLint + Prettier: single quotes, semicolons, unix line endings, `no-console` (error level — use OTel logger instead).
|
|
77
|
+
- `eqeqeq` strict, `prefer-const`, `no-var`.
|
|
78
|
+
- Documentation and code comments are in Portuguese (Brazilian).
|
package/dist/core/logger.js
CHANGED
|
@@ -26,7 +26,9 @@ class StandardLogger {
|
|
|
26
26
|
this.defineDefaultAttributes(scopeAttributes);
|
|
27
27
|
this.environment = (0, environment_1.getEnvironmentStage)();
|
|
28
28
|
this.disableEmitter =
|
|
29
|
-
disableEmitter
|
|
29
|
+
disableEmitter === false
|
|
30
|
+
? false
|
|
31
|
+
: disableEmitter || this.environment === 'development';
|
|
30
32
|
}
|
|
31
33
|
defineDefaultAttributes(scopeAttributes) {
|
|
32
34
|
var _a, _b, _c;
|
|
@@ -132,4 +134,4 @@ class StandardLogger {
|
|
|
132
134
|
}
|
|
133
135
|
}
|
|
134
136
|
exports.StandardLogger = StandardLogger;
|
|
135
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvcmUvbG9nZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUFBLHNEQUFpRTtBQUlqRSwrQ0FBb0Q7QUFNcEQsTUFBYSxjQUFjO0lBVXpCLFlBQ0UsTUFBYyxFQUNkLE1BQXVCLEVBQ3ZCLGVBQTRCLEVBQzVCLGNBQXdCO1FBYm5CLHNCQUFpQixHQUF3QixFQUFFLENBQUM7UUFPbEMsbUJBQWMsR0FBWSxLQUFLLENBQUM7UUFRL0MsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUVwRSxJQUFJLENBQUMsa0JBQWtCLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZO1lBQ2hELENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVk7WUFDMUIsQ0FBQyxDQUFDLGlCQUFpQixDQUFDO1FBRXRCLElBQUksQ0FBQyxlQUFlLEdBQUcsZUFBZSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUM5QyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUEsaUNBQW1CLEdBQUUsQ0FBQztRQUN6QyxJQUFJLENBQUMsY0FBYztZQUNqQixjQUFjLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxhQUFhLElBQUksS0FBSyxDQUFDO0lBQ2xFLENBQUM7SUFFTSx1QkFBdUIsQ0FBQyxlQUFxQjs7UUFDbEQsSUFBSSxDQUFDLGlCQUFpQixHQUFHO1lBQ3ZCLEtBQUssRUFBRTtnQkFDTCxFQUFFLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxPQUFPO2FBQzNDO1lBQ0Qs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QVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdkQsQ0FBQztRQUVELE1BQU0sT0FBTyxpREFDUixJQUFJLEdBQ0osSUFBSSxDQUFDLGlCQUFpQixHQUN0QixVQUFVLENBQ2QsQ0FBQztRQUVGLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQztRQUdwQixPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQ3ZCLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUM1QixDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLEtBQUssSUFBSSxDQUNyRCxDQUNGLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUE5S0Qsd0NBOEtDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2V2ZXJpdHlOdW1iZXIsIExvZ2dlciB9IGZyb20gJ0BvcGVudGVsZW1ldHJ5L2FwaS1sb2dzJztcbmltcG9ydCB7IElTdGFuZGFyZExvZ2dlciwgU3RhbmRhcmRMb2dEYXRhLCBMb2dQYXJhbXMgfSBmcm9tICcuL2xvZ2dlci10eXBlcyc7XG5pbXBvcnQgeyBJU3RhbmRhcmRUcmFjZXIgfSBmcm9tICcuL3RyYWNlci10eXBlcyc7XG5pbXBvcnQgeyBBdHRyaWJ1dGVzLCBTcGFuIH0gZnJvbSAnQG9wZW50ZWxlbWV0cnkvYXBpJztcbmltcG9ydCB7IGdldEVudmlyb25tZW50U3RhZ2UgfSBmcm9tICcuL2Vudmlyb25tZW50JztcblxuLyoqXG4gKiBMb2dnZXIgY29yZSBxdWUgaW1wbGVtZW50YSBvIHBhZHLDo28gZGUgbG9ncyBlc3RydXR1cmFkb3MuXG4gKiBSZWNlYmUgdW0gTG9nZ2VyUHJvdmlkZXIgZG8gT3BlblRlbGVtZXRyeSBwYXJhIGVtaXRpciBvcyBsb2dzLlxuICovXG5leHBvcnQgY2xhc3MgU3RhbmRhcmRMb2dnZXIgaW1wbGVtZW50cyBJU3RhbmRhcmRMb2dnZXIge1xuICBwdWJsaWMgZGVmYXVsdEF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgcHVibGljIHNjb3BlQXR0cmlidXRlcz86IEF0dHJpYnV0ZXM7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyOiBMb2dnZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgdHJhY2VyOiBJU3RhbmRhcmRUcmFjZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3BhbkNvbnRleHQ6IFNwYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgZW52aXJvbm1lbnQ6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBkZWZhdWx0U2VydmljZU5hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBkaXNhYmxlRW1pdHRlcjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGxvZ2dlcjogTG9nZ2VyLFxuICAgIHRyYWNlcjogSVN0YW5kYXJkVHJhY2VyLFxuICAgIHNjb3BlQXR0cmlidXRlcz86IEF0dHJpYnV0ZXMsXG4gICAgZGlzYWJsZUVtaXR0ZXI/OiBib29sZWFuXG4gICkge1xuICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyO1xuICAgIHRoaXMudHJhY2VyID0gdHJhY2VyO1xuICAgIHRoaXMuc3BhbkNvbnRleHQgPSB0aGlzLnRyYWNlci5nZXRUcmFjZXIoKS5zdGFydFNwYW4oJ2luaXQtbG9nZ2VyJyk7XG5cbiAgICB0aGlzLmRlZmF1bHRTZXJ2aWNlTmFtZSA9IHByb2Nlc3MuZW52LlNFUlZJQ0VfTkFNRVxuICAgICAgPyBwcm9jZXNzLmVudi5TRVJWSUNFX05BTUVcbiAgICAgIDogJ3Vua25vd24tc2VydmljZSc7XG5cbiAgICB0aGlzLnNjb3BlQXR0cmlidXRlcyA9IHNjb3BlQXR0cmlidXRlcztcbiAgICB0aGlzLmRlZmluZURlZmF1bHRBdHRyaWJ1dGVzKHNjb3BlQXR0cmlidXRlcyk7XG4gICAgdGhpcy5lbnZpcm9ubWVudCA9IGdldEVudmlyb25tZW50U3RhZ2UoKTtcbiAgICB0aGlzLmRpc2FibGVFbWl0dGVyID1cbiAgICAgIGRpc2FibGVFbWl0dGVyIHx8IHRoaXMuZW52aXJvbm1lbnQgPT09ICdkZXZlbG9wbWVudCcgfHwgZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgZGVmaW5lRGVmYXVsdEF0dHJpYnV0ZXMoc2NvcGVBdHRyaWJ1dGVzPzogYW55KSB7XG4gICAgdGhpcy5kZWZhdWx0QXR0cmlidXRlcyA9IHtcbiAgICAgIHRyYWNlOiB7XG4gICAgICAgIGlkOiB0aGlzLnNwYW5Db250ZXh0LnNwYW5Db250ZXh0KCkudHJhY2VJZCxcbiAgICAgIH0sXG4gICAgICBzcGFuOiB7XG4gICAgICAgIGlkOiB0aGlzLnNwYW5Db250ZXh0LnNwYW5Db250ZXh0KCkuc3BhbklkLFxuICAgICAgfSxcbiAgICAgIGZ1bmN0aW9uOiB7XG4gICAgICAgIG5hbWU6XG4gICAgICAgICAgc2NvcGVBdHRyaWJ1dGVzPy5bJ2Z1bmN0aW9uJ10/LlsnbmFtZSddIHx8XG4gICAgICAgICAgc2NvcGVBdHRyaWJ1dGVzPy5mdW5jdGlvbk5hbWUgfHxcbiAgICAgICAgICAndW5rbm93bicsXG4gICAgICAgIGludm9jYXRpb25JZDpcbiAgICAgICAgICBzY29wZUF0dHJpYnV0ZXM/LlsnZnVuY3Rpb24nXT8uWydpbnZvY2F0aW9uSWQnXSB8fFxuICAgICAgICAgIHNjb3BlQXR0cmlidXRlcz8uWydleGVjdXRpb24nXT8uWydhd3NSZXF1ZXN0SWQnXSB8fFxuICAgICAgICAgIHNjb3BlQXR0cmlidXRlcz8uaW52b2NhdGlvbklkIHx8XG4gICAgICAgICAgJ3Vua25vd24nLFxuICAgICAgfSxcbiAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgaWQ6XG4gICAgICAgICAgc2NvcGVBdHRyaWJ1dGVzPy5bJ3JlcXVlc3RJZCddIHx8XG4gICAgICAgICAgc2NvcGVBdHRyaWJ1dGVzPy5yZXF1ZXN0SWQgfHxcbiAgICAgICAgICAndW5rbm93bicsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBhc3luYyBsb2dFcnJvcihkYXRhOiBMb2dQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmxvZyh7XG4gICAgICAuLi5kYXRhLFxuICAgICAgc2V2ZXJpdHk6ICdFUlJPUicsXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBsb2dJbmZvKGRhdGE6IExvZ1BhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMubG9nKHtcbiAgICAgIC4uLmRhdGEsXG4gICAgICBzZXZlcml0eTogJ0lORk8nLFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgbG9nV2FybihkYXRhOiBMb2dQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmxvZyh7XG4gICAgICAuLi5kYXRhLFxuICAgICAgc2V2ZXJpdHk6ICdXQVJOJyxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGxvZ0RlYnVnKGRhdGE6IExvZ1BhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMubG9nKHtcbiAgICAgIC4uLmRhdGEsXG4gICAgICBzZXZlcml0eTogJ0RFQlVHJyxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGxvZyhcbiAgICBkYXRhOiBPbWl0PExvZ1BhcmFtcywgJ3RpbWVzdGFtcCcgfCAnZW52aXJvbm1lbnQnPiAmIHtcbiAgICAgIHNldmVyaXR5OiBTdGFuZGFyZExvZ0RhdGFbJ3NldmVyaXR5J107XG4gICAgfVxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBmdWxsRGF0YTogU3RhbmRhcmRMb2dEYXRhID0ge1xuICAgICAgLi4uZGF0YSxcbiAgICAgIHNlcnZpY2VOYW1lOiBkYXRhLnNlcnZpY2VOYW1lIHx8IHRoaXMuZGVmYXVsdFNlcnZpY2VOYW1lLFxuICAgICAgZW52aXJvbm1lbnQ6IHRoaXMuZW52aXJvbm1lbnQsXG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICB9O1xuXG4gICAgY29uc3Qgc2V2ZXJpdHlNYXAgPSB7XG4gICAgICBFUlJPUjogU2V2ZXJpdHlOdW1iZXIuRVJST1IsXG4gICAgICBXQVJOOiBTZXZlcml0eU51bWJlci5XQVJOLFxuICAgICAgSU5GTzogU2V2ZXJpdHlOdW1iZXIuSU5GTyxcbiAgICAgIERFQlVHOiBTZXZlcml0eU51bWJlci5ERUJVRyxcbiAgICB9O1xuXG4gICAgY29uc3QgbG9nUmVjb3JkID0ge1xuICAgICAgbWVzc2FnZTogZnVsbERhdGEubWVzc2FnZSB8fCAnJyxcbiAgICAgIHNldmVyaXR5TnVtYmVyOiBzZXZlcml0eU1hcFtmdWxsRGF0YS5zZXZlcml0eV0sXG4gICAgICBzZXZlcml0eVRleHQ6IGZ1bGxEYXRhLnNldmVyaXR5LFxuICAgICAgYm9keTogZnVsbERhdGEuYm9keSB8fCBmdWxsRGF0YS5tZXNzYWdlIHx8ICcnLFxuICAgICAgYXR0cmlidXRlczogdGhpcy5idWlsZEF0dHJpYnV0ZXMoZnVsbERhdGEpLFxuICAgIH07XG5cbiAgICBpZiAodGhpcy5kaXNhYmxlRW1pdHRlcikge1xuICAgICAgY29uc29sZS5sb2coJ1tUZWxlbWV0cnldIExvZyBlbWlzc2lvbiBkaXNhYmxlZC4gTG9nIHJlY29yZDonLCBsb2dSZWNvcmQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxvZ2dlci5lbWl0KGxvZ1JlY29yZCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBidWlsZEF0dHJpYnV0ZXMoZGF0YTogU3RhbmRhcmRMb2dEYXRhKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgY29uc3QgYXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgYW55PiA9IHtcbiAgICAgIGR1cmF0aW9uOiB7XG4gICAgICAgIHRpbWVzdGFtcDogZGF0YS50aW1lc3RhbXAsXG4gICAgICB9LFxuICAgICAgc2VydmljZToge1xuICAgICAgICBuYW1lOiBkYXRhLnNlcnZpY2VOYW1lIHx8IHRoaXMuZGVmYXVsdFNlcnZpY2VOYW1lLFxuICAgICAgfSxcbiAgICAgIGRlcGxveW1lbnQ6IHtcbiAgICAgICAgZW52aXJvbm1lbnROYW1lOiBkYXRhLmVudmlyb25tZW50LFxuICAgICAgfSxcbiAgICAgIGV4ZWN1dGlvbjoge1xuICAgICAgICAuLi5kYXRhLmV4ZWN1dGlvbixcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIC8vIEluZm9ybWHDp8O1ZXMgZG8gZXJyb1xuICAgIGlmIChkYXRhLmVycm9yKSB7XG4gICAgICBhdHRyaWJ1dGVzWydlcnJvciddID0ge1xuICAgICAgICB0eXBlOiBkYXRhLmVycm9yLm5hbWUgfHwgJycsXG4gICAgICAgIG1lc3NhZ2U6IGRhdGEuZXJyb3IubWVzc2FnZSB8fCAnJyxcbiAgICAgICAgc3RhY2s6IGRhdGEuZXJyb3Iuc3RhY2sgfHwgJycsXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIFBlcmZvcm1hbmNlXG4gICAgaWYgKGRhdGEucGVyZm9ybWFuY2UpIHtcbiAgICAgIGlmIChkYXRhLnBlcmZvcm1hbmNlLmR1cmF0aW9uTXMpXG4gICAgICAgIGF0dHJpYnV0ZXNbJ2R1cmF0aW9uJ11bJ21zJ10gPSBkYXRhLnBlcmZvcm1hbmNlLmR1cmF0aW9uTXM7XG4gICAgICBpZiAoZGF0YS5wZXJmb3JtYW5jZS5zdWNjZXNzICE9PSB1bmRlZmluZWQpXG4gICAgICAgIGF0dHJpYnV0ZXNbJ2V4ZWN1dGlvbiddWydzdWNjZXNzJ10gPSBkYXRhLnBlcmZvcm1hbmNlLnN1Y2Nlc3M7XG4gICAgfVxuXG4gICAgLy8gQ29udGV4dG8gYWRpY2lvbmFsXG4gICAgaWYgKGRhdGEuY29udGV4dCkge1xuICAgICAgYXR0cmlidXRlc1snY29udGV4dCddID0gSlNPTi5zdHJpbmdpZnkoZGF0YS5jb250ZXh0KTtcbiAgICB9XG5cbiAgICBjb25zdCBlbnRyaWVzID0ge1xuICAgICAgLi4uZGF0YSxcbiAgICAgIC4uLnRoaXMuZGVmYXVsdEF0dHJpYnV0ZXMsXG4gICAgICAuLi5hdHRyaWJ1dGVzLFxuICAgIH07XG5cbiAgICBkZWxldGUgZW50cmllcy5ib2R5O1xuXG4gICAgLy8gRmlsdHJhciB2YWxvcmVzIHVuZGVmaW5lZC9udWxsXG4gICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKGVudHJpZXMpLmZpbHRlcihcbiAgICAgICAgKFssIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbFxuICAgICAgKVxuICAgICk7XG4gIH1cbn1cbiJdfQ==
|
|
137
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvcmUvbG9nZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUFBLHNEQUFpRTtBQUlqRSwrQ0FBb0Q7QUFNcEQsTUFBYSxjQUFjO0lBVXpCLFlBQ0UsTUFBYyxFQUNkLE1BQXVCLEVBQ3ZCLGVBQTRCLEVBQzVCLGNBQXdCO1FBYm5CLHNCQUFpQixHQUF3QixFQUFFLENBQUM7UUFPbEMsbUJBQWMsR0FBWSxLQUFLLENBQUM7UUFRL0MsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUVwRSxJQUFJLENBQUMsa0JBQWtCLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZO1lBQ2hELENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVk7WUFDMUIsQ0FBQyxDQUFDLGlCQUFpQixDQUFDO1FBRXRCLElBQUksQ0FBQyxlQUFlLEdBQUcsZUFBZSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUM5QyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUEsaUNBQW1CLEdBQUUsQ0FBQztRQUN6QyxJQUFJLENBQUMsY0FBYztZQUNqQixjQUFjLEtBQUssS0FBSztnQkFDdEIsQ0FBQyxDQUFDLEtBQUs7Z0JBQ1AsQ0FBQyxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLGFBQWEsQ0FBQztJQUM3RCxDQUFDO0lBRU0sdUJBQXVCLENBQUMsZUFBcUI7O1FBQ2xELElBQUksQ0FBQyxpQkFBaUIsR0FBRztZQUN2QixLQUFLLEVBQUU7Z0JBQ0wsRUFBRSxFQUFFLElBQUksQ0FB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WUFDakIsVUFBVSxDQUFDLFNBQVMsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3ZELENBQUM7UUFFRCxNQUFNLE9BQU8saURBQ1IsSUFBSSxHQUNKLElBQUksQ0FBQyxpQkFBaUIsR0FDdEIsVUFBVSxDQUNkLENBQUM7UUFFRixPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFHcEIsT0FBTyxNQUFNLENBQUMsV0FBVyxDQUN2QixNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FDNUIsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxLQUFLLElBQUksQ0FDckQsQ0FDRixDQUFDO0lBQ0osQ0FBQztDQUNGO0FBaExELHdDQWdMQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNldmVyaXR5TnVtYmVyLCBMb2dnZXIgfSBmcm9tICdAb3BlbnRlbGVtZXRyeS9hcGktbG9ncyc7XG5pbXBvcnQgeyBJU3RhbmRhcmRMb2dnZXIsIFN0YW5kYXJkTG9nRGF0YSwgTG9nUGFyYW1zIH0gZnJvbSAnLi9sb2dnZXItdHlwZXMnO1xuaW1wb3J0IHsgSVN0YW5kYXJkVHJhY2VyIH0gZnJvbSAnLi90cmFjZXItdHlwZXMnO1xuaW1wb3J0IHsgQXR0cmlidXRlcywgU3BhbiB9IGZyb20gJ0BvcGVudGVsZW1ldHJ5L2FwaSc7XG5pbXBvcnQgeyBnZXRFbnZpcm9ubWVudFN0YWdlIH0gZnJvbSAnLi9lbnZpcm9ubWVudCc7XG5cbi8qKlxuICogTG9nZ2VyIGNvcmUgcXVlIGltcGxlbWVudGEgbyBwYWRyw6NvIGRlIGxvZ3MgZXN0cnV0dXJhZG9zLlxuICogUmVjZWJlIHVtIExvZ2dlclByb3ZpZGVyIGRvIE9wZW5UZWxlbWV0cnkgcGFyYSBlbWl0aXIgb3MgbG9ncy5cbiAqL1xuZXhwb3J0IGNsYXNzIFN0YW5kYXJkTG9nZ2VyIGltcGxlbWVudHMgSVN0YW5kYXJkTG9nZ2VyIHtcbiAgcHVibGljIGRlZmF1bHRBdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gIHB1YmxpYyBzY29wZUF0dHJpYnV0ZXM/OiBBdHRyaWJ1dGVzO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlcjogTG9nZ2VyO1xuICBwcml2YXRlIHJlYWRvbmx5IHRyYWNlcjogSVN0YW5kYXJkVHJhY2VyO1xuICBwcml2YXRlIHJlYWRvbmx5IHNwYW5Db250ZXh0OiBTcGFuO1xuICBwcml2YXRlIHJlYWRvbmx5IGVudmlyb25tZW50OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVmYXVsdFNlcnZpY2VOYW1lOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGlzYWJsZUVtaXR0ZXI6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBsb2dnZXI6IExvZ2dlcixcbiAgICB0cmFjZXI6IElTdGFuZGFyZFRyYWNlcixcbiAgICBzY29wZUF0dHJpYnV0ZXM/OiBBdHRyaWJ1dGVzLFxuICAgIGRpc2FibGVFbWl0dGVyPzogYm9vbGVhblxuICApIHtcbiAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlcjtcbiAgICB0aGlzLnRyYWNlciA9IHRyYWNlcjtcbiAgICB0aGlzLnNwYW5Db250ZXh0ID0gdGhpcy50cmFjZXIuZ2V0VHJhY2VyKCkuc3RhcnRTcGFuKCdpbml0LWxvZ2dlcicpO1xuXG4gICAgdGhpcy5kZWZhdWx0U2VydmljZU5hbWUgPSBwcm9jZXNzLmVudi5TRVJWSUNFX05BTUVcbiAgICAgID8gcHJvY2Vzcy5lbnYuU0VSVklDRV9OQU1FXG4gICAgICA6ICd1bmtub3duLXNlcnZpY2UnO1xuXG4gICAgdGhpcy5zY29wZUF0dHJpYnV0ZXMgPSBzY29wZUF0dHJpYnV0ZXM7XG4gICAgdGhpcy5kZWZpbmVEZWZhdWx0QXR0cmlidXRlcyhzY29wZUF0dHJpYnV0ZXMpO1xuICAgIHRoaXMuZW52aXJvbm1lbnQgPSBnZXRFbnZpcm9ubWVudFN0YWdlKCk7XG4gICAgdGhpcy5kaXNhYmxlRW1pdHRlciA9XG4gICAgICBkaXNhYmxlRW1pdHRlciA9PT0gZmFsc2VcbiAgICAgICAgPyBmYWxzZVxuICAgICAgICA6IGRpc2FibGVFbWl0dGVyIHx8IHRoaXMuZW52aXJvbm1lbnQgPT09ICdkZXZlbG9wbWVudCc7XG4gIH1cblxuICBwdWJsaWMgZGVmaW5lRGVmYXVsdEF0dHJpYnV0ZXMoc2NvcGVBdHRyaWJ1dGVzPzogYW55KSB7XG4gICAgdGhpcy5kZWZhdWx0QXR0cmlidXRlcyA9IHtcbiAgICAgIHRyYWNlOiB7XG4gICAgICAgIGlkOiB0aGlzLnNwYW5Db250ZXh0LnNwYW5Db250ZXh0KCkudHJhY2VJZCxcbiAgICAgIH0sXG4gICAgICBzcGFuOiB7XG4gICAgICAgIGlkOiB0aGlzLnNwYW5Db250ZXh0LnNwYW5Db250ZXh0KCkuc3BhbklkLFxuICAgICAgfSxcbiAgICAgIGZ1bmN0aW9uOiB7XG4gICAgICAgIG5hbWU6XG4gICAgICAgICAgc2NvcGVBdHRyaWJ1dGVzPy5bJ2Z1bmN0aW9uJ10/LlsnbmFtZSddIHx8XG4gICAgICAgICAgc2NvcGVBdHRyaWJ1dGVzPy5mdW5jdGlvbk5hbWUgfHxcbiAgICAgICAgICAndW5rbm93bicsXG4gICAgICAgIGludm9jYXRpb25JZDpcbiAgICAgICAgICBzY29wZUF0dHJpYnV0ZXM/LlsnZnVuY3Rpb24nXT8uWydpbnZvY2F0aW9uSWQnXSB8fFxuICAgICAgICAgIHNjb3BlQXR0cmlidXRlcz8uWydleGVjdXRpb24nXT8uWydhd3NSZXF1ZXN0SWQnXSB8fFxuICAgICAgICAgIHNjb3BlQXR0cmlidXRlcz8uaW52b2NhdGlvbklkIHx8XG4gICAgICAgICAgJ3Vua25vd24nLFxuICAgICAgfSxcbiAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgaWQ6XG4gICAgICAgICAgc2NvcGVBdHRyaWJ1dGVzPy5bJ3JlcXVlc3RJZCddIHx8XG4gICAgICAgICAgc2NvcGVBdHRyaWJ1dGVzPy5yZXF1ZXN0SWQgfHxcbiAgICAgICAgICAndW5rbm93bicsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBhc3luYyBsb2dFcnJvcihkYXRhOiBMb2dQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmxvZyh7XG4gICAgICAuLi5kYXRhLFxuICAgICAgc2V2ZXJpdHk6ICdFUlJPUicsXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBsb2dJbmZvKGRhdGE6IExvZ1BhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMubG9nKHtcbiAgICAgIC4uLmRhdGEsXG4gICAgICBzZXZlcml0eTogJ0lORk8nLFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgbG9nV2FybihkYXRhOiBMb2dQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmxvZyh7XG4gICAgICAuLi5kYXRhLFxuICAgICAgc2V2ZXJpdHk6ICdXQVJOJyxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGxvZ0RlYnVnKGRhdGE6IExvZ1BhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMubG9nKHtcbiAgICAgIC4uLmRhdGEsXG4gICAgICBzZXZlcml0eTogJ0RFQlVHJyxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGxvZyhcbiAgICBkYXRhOiBPbWl0PExvZ1BhcmFtcywgJ3RpbWVzdGFtcCcgfCAnZW52aXJvbm1lbnQnPiAmIHtcbiAgICAgIHNldmVyaXR5OiBTdGFuZGFyZExvZ0RhdGFbJ3NldmVyaXR5J107XG4gICAgfVxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBmdWxsRGF0YTogU3RhbmRhcmRMb2dEYXRhID0ge1xuICAgICAgLi4uZGF0YSxcbiAgICAgIHNlcnZpY2VOYW1lOiBkYXRhLnNlcnZpY2VOYW1lIHx8IHRoaXMuZGVmYXVsdFNlcnZpY2VOYW1lLFxuICAgICAgZW52aXJvbm1lbnQ6IHRoaXMuZW52aXJvbm1lbnQsXG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICB9O1xuXG4gICAgY29uc3Qgc2V2ZXJpdHlNYXAgPSB7XG4gICAgICBFUlJPUjogU2V2ZXJpdHlOdW1iZXIuRVJST1IsXG4gICAgICBXQVJOOiBTZXZlcml0eU51bWJlci5XQVJOLFxuICAgICAgSU5GTzogU2V2ZXJpdHlOdW1iZXIuSU5GTyxcbiAgICAgIERFQlVHOiBTZXZlcml0eU51bWJlci5ERUJVRyxcbiAgICB9O1xuXG4gICAgY29uc3QgbG9nUmVjb3JkID0ge1xuICAgICAgbWVzc2FnZTogZnVsbERhdGEubWVzc2FnZSB8fCAnJyxcbiAgICAgIHNldmVyaXR5TnVtYmVyOiBzZXZlcml0eU1hcFtmdWxsRGF0YS5zZXZlcml0eV0sXG4gICAgICBzZXZlcml0eVRleHQ6IGZ1bGxEYXRhLnNldmVyaXR5LFxuICAgICAgYm9keTogZnVsbERhdGEuYm9keSB8fCBmdWxsRGF0YS5tZXNzYWdlIHx8ICcnLFxuICAgICAgYXR0cmlidXRlczogdGhpcy5idWlsZEF0dHJpYnV0ZXMoZnVsbERhdGEpLFxuICAgIH07XG5cbiAgICBpZiAodGhpcy5kaXNhYmxlRW1pdHRlcikge1xuICAgICAgY29uc29sZS5sb2coJ1tUZWxlbWV0cnldIExvZyBlbWlzc2lvbiBkaXNhYmxlZC4gTG9nIHJlY29yZDonLCBsb2dSZWNvcmQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxvZ2dlci5lbWl0KGxvZ1JlY29yZCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBidWlsZEF0dHJpYnV0ZXMoZGF0YTogU3RhbmRhcmRMb2dEYXRhKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgY29uc3QgYXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgYW55PiA9IHtcbiAgICAgIGR1cmF0aW9uOiB7XG4gICAgICAgIHRpbWVzdGFtcDogZGF0YS50aW1lc3RhbXAsXG4gICAgICB9LFxuICAgICAgc2VydmljZToge1xuICAgICAgICBuYW1lOiBkYXRhLnNlcnZpY2VOYW1lIHx8IHRoaXMuZGVmYXVsdFNlcnZpY2VOYW1lLFxuICAgICAgfSxcbiAgICAgIGRlcGxveW1lbnQ6IHtcbiAgICAgICAgZW52aXJvbm1lbnROYW1lOiBkYXRhLmVudmlyb25tZW50LFxuICAgICAgfSxcbiAgICAgIGV4ZWN1dGlvbjoge1xuICAgICAgICAuLi5kYXRhLmV4ZWN1dGlvbixcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIC8vIEluZm9ybWHDp8O1ZXMgZG8gZXJyb1xuICAgIGlmIChkYXRhLmVycm9yKSB7XG4gICAgICBhdHRyaWJ1dGVzWydlcnJvciddID0ge1xuICAgICAgICB0eXBlOiBkYXRhLmVycm9yLm5hbWUgfHwgJycsXG4gICAgICAgIG1lc3NhZ2U6IGRhdGEuZXJyb3IubWVzc2FnZSB8fCAnJyxcbiAgICAgICAgc3RhY2s6IGRhdGEuZXJyb3Iuc3RhY2sgfHwgJycsXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIFBlcmZvcm1hbmNlXG4gICAgaWYgKGRhdGEucGVyZm9ybWFuY2UpIHtcbiAgICAgIGlmIChkYXRhLnBlcmZvcm1hbmNlLmR1cmF0aW9uTXMpXG4gICAgICAgIGF0dHJpYnV0ZXNbJ2R1cmF0aW9uJ11bJ21zJ10gPSBkYXRhLnBlcmZvcm1hbmNlLmR1cmF0aW9uTXM7XG4gICAgICBpZiAoZGF0YS5wZXJmb3JtYW5jZS5zdWNjZXNzICE9PSB1bmRlZmluZWQpXG4gICAgICAgIGF0dHJpYnV0ZXNbJ2V4ZWN1dGlvbiddWydzdWNjZXNzJ10gPSBkYXRhLnBlcmZvcm1hbmNlLnN1Y2Nlc3M7XG4gICAgfVxuXG4gICAgLy8gQ29udGV4dG8gYWRpY2lvbmFsXG4gICAgaWYgKGRhdGEuY29udGV4dCkge1xuICAgICAgYXR0cmlidXRlc1snY29udGV4dCddID0gSlNPTi5zdHJpbmdpZnkoZGF0YS5jb250ZXh0KTtcbiAgICB9XG5cbiAgICBjb25zdCBlbnRyaWVzID0ge1xuICAgICAgLi4uZGF0YSxcbiAgICAgIC4uLnRoaXMuZGVmYXVsdEF0dHJpYnV0ZXMsXG4gICAgICAuLi5hdHRyaWJ1dGVzLFxuICAgIH07XG5cbiAgICBkZWxldGUgZW50cmllcy5ib2R5O1xuXG4gICAgLy8gRmlsdHJhciB2YWxvcmVzIHVuZGVmaW5lZC9udWxsXG4gICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKGVudHJpZXMpLmZpbHRlcihcbiAgICAgICAgKFssIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbFxuICAgICAgKVxuICAgICk7XG4gIH1cbn1cbiJdfQ==
|
package/dist/sst/extraction.js
CHANGED
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.extractHttpAttributes = extractHttpAttributes;
|
|
4
4
|
exports.extractLoggedUser = extractLoggedUser;
|
|
5
5
|
exports.extractDefaultAttributes = extractDefaultAttributes;
|
|
6
|
+
const environment_1 = require("../core/environment");
|
|
6
7
|
function extractHttpAttributes(event) {
|
|
7
8
|
var _a, _b, _c, _d, _e, _f;
|
|
8
9
|
if (event === null || event === void 0 ? void 0 : event.requestContext) {
|
|
@@ -60,9 +61,7 @@ function extractDefaultAttributes(request) {
|
|
|
60
61
|
const routeKey = (event === null || event === void 0 ? void 0 : event.routeKey) || ((_a = event === null || event === void 0 ? void 0 : event.requestContext) === null || _a === void 0 ? void 0 : _a.routeKey) || 'unknown';
|
|
61
62
|
const requestId = (event === null || event === void 0 ? void 0 : event.requestId) || ((_b = event === null || event === void 0 ? void 0 : event.requestContext) === null || _b === void 0 ? void 0 : _b.requestId) || 'unknown';
|
|
62
63
|
const loggedUser = extractLoggedUser(event);
|
|
63
|
-
|
|
64
|
-
if (stage === 'prod')
|
|
65
|
-
stage = 'production';
|
|
64
|
+
const stage = (0, environment_1.getEnvironmentStage)();
|
|
66
65
|
return {
|
|
67
66
|
functionName,
|
|
68
67
|
invocationId,
|
|
@@ -90,4 +89,4 @@ function extractDefaultAttributes(request) {
|
|
|
90
89
|
};
|
|
91
90
|
}
|
|
92
91
|
}
|
|
93
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
92
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXh0cmFjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zc3QvZXh0cmFjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUVBLHNEQThCQztBQUVELDhDQXdCQztBQUVELDREQTBDQztBQXRHRCxxREFBMEQ7QUFFMUQsU0FBZ0IscUJBQXFCLENBQUMsS0FBVTs7SUFTOUMsSUFBSSxLQUFLLGFBQUwsS0FBSyx1QkFBTCxLQUFLLENBQUUsY0FBYyxFQUFFLENBQUM7UUFDMUIsT0FBTztZQUNMLE1BQU0sRUFBRSxDQUFBLE1BQUEsS0FBSyxDQUFDLGNBQWMsQ0FBQyxJQUFJLDBDQUFFLE1BQU0sS0FBSSxTQUFTO1lBQ3RELFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUSxLQUFJLE1BQUEsS0FBSyxDQUFDLGNBQWMsMENBQUUsUUFBUSxDQUFBLElBQUksU0FBUztZQUN2RSxHQUFHLEVBQUUsS0FBSyxDQUFDLGNBQWMsQ0FBQyxVQUFVLEtBQUksTUFBQSxLQUFLLENBQUMsY0FBYyxDQUFDLElBQUksMENBQUUsSUFBSSxDQUFBO1lBQ3ZFLFVBQVUsRUFBRSxDQUFBLE1BQUEsS0FBSyxDQUFDLE9BQU8sMENBQUcsWUFBWSxDQUFDLEtBQUksU0FBUztZQUN0RCxlQUFlLEVBQUUsS0FBSyxDQUFDLGNBQWMsSUFBSSxFQUFFO1lBQzNDLHVCQUF1QixFQUFFLEtBQUssQ0FBQyxxQkFBcUIsSUFBSSxFQUFFO1lBQzFELElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxJQUFJLEVBQUU7U0FDdkIsQ0FBQztJQUNKLENBQUM7SUFFRCxPQUFPO1FBQ0wsTUFBTSxFQUFFLENBQUEsS0FBSyxhQUFMLEtBQUssdUJBQUwsS0FBSyxDQUFFLFVBQVUsS0FBSSxTQUFTO1FBQ3RDLFFBQVEsRUFBRSxDQUFBLEtBQUssYUFBTCxLQUFLLHVCQUFMLEtBQUssQ0FBRSxRQUFRLE1BQUksTUFBQSxLQUFLLENBQUMsY0FBYywwQ0FBRSxRQUFRLENBQUEs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QUssQ0FBQyxDQUFDO1FBQzFDLE1BQU0sUUFBUSxHQUNaLENBQUEsS0FBSyxhQUFMLEtBQUssdUJBQUwsS0FBSyxDQUFFLFFBQVEsTUFBSSxNQUFBLEtBQUssYUFBTCxLQUFLLHVCQUFMLEtBQUssQ0FBRSxjQUFjLDBDQUFFLFFBQVEsQ0FBQSxJQUFJLFNBQVMsQ0FBQztRQUNsRSxNQUFNLFNBQVMsR0FDYixDQUFBLEtBQUssYUFBTCxLQUFLLHVCQUFMLEtBQUssQ0FBRSxTQUFTLE1BQUksTUFBQSxLQUFLLGFBQUwsS0FBSyx1QkFBTCxLQUFLLENBQUUsY0FBYywwQ0FBRSxTQUFTLENBQUEsSUFBSSxTQUFTLENBQUM7UUFDcEUsTUFBTSxVQUFVLEdBQUcsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUMsTUFBTSxLQUFLLEdBQUcsSUFBQSxpQ0FBbUIsR0FBRSxDQUFDO1FBRXBDLE9BQU87WUFDTCxZQUFZO1lBQ1osWUFBWTtZQUNaLFdBQVc7WUFDWCxNQUFNO1lBQ04sUUFBUTtZQUNSLFNBQVM7WUFDVCxLQUFLO1lBQ0wsSUFBSTtZQUNKLFVBQVU7U0FDWCxDQUFDO0lBQ0osQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixPQUFPLENBQUMsS0FBSyxDQUFDLGtEQUFrRCxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3pFLE9BQU87WUFDTCxZQUFZLEVBQUUsU0FBUztZQUN2QixZQUFZLEVBQUUsU0FBUztZQUN2QixXQUFXLEVBQUUsU0FBUztZQUN0QixNQUFNLEVBQUUsU0FBUztZQUNqQixRQUFRLEVBQUUsU0FBUztZQUNuQixTQUFTLEVBQUUsU0FBUztZQUNwQixLQUFLLEVBQUUsU0FBUztZQUNoQixJQUFJLEVBQUUsRUFBRTtZQUNSLFVBQVUsRUFBRSxTQUFTO1NBQ3RCLENBQUM7SUFDSixDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGdldEVudmlyb25tZW50U3RhZ2UgfSBmcm9tICcuLi9jb3JlL2Vudmlyb25tZW50JztcblxuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RIdHRwQXR0cmlidXRlcyhldmVudDogYW55KToge1xuICBtZXRob2Q6IHN0cmluZztcbiAgdXJsOiBzdHJpbmc7XG4gIHJvdXRlS2V5Pzogc3RyaW5nO1xuICB1c2VyX2FnZW50OiBzdHJpbmc7XG4gIHBhdGhfcGFyYW1ldGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgcXVlcnlfc3RyaW5nX3BhcmFtZXRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGJvZHk6IGFueTtcbn0ge1xuICBpZiAoZXZlbnQ/LnJlcXVlc3RDb250ZXh0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1ldGhvZDogZXZlbnQucmVxdWVzdENvbnRleHQuaHR0cD8ubWV0aG9kIHx8ICd1bmtub3duJyxcbiAgICAgIHJvdXRlS2V5OiBldmVudC5yb3V0ZUtleSB8fCBldmVudC5yZXF1ZXN0Q29udGV4dD8ucm91dGVLZXkgfHwgJ3Vua25vd24nLFxuICAgICAgdXJsOiBldmVudC5yZXF1ZXN0Q29udGV4dC5kb21haW5OYW1lICYmIGV2ZW50LnJlcXVlc3RDb250ZXh0Lmh0dHA/LnBhdGgsXG4gICAgICB1c2VyX2FnZW50OiBldmVudC5oZWFkZXJzPy5bJ3VzZXItYWdlbnQnXSB8fCAndW5rbm93bicsXG4gICAgICBwYXRoX3BhcmFtZXRlcnM6IGV2ZW50LnBhdGhQYXJhbWV0ZXJzIHx8IHt9LFxuICAgICAgcXVlcnlfc3RyaW5nX3BhcmFtZXRlcnM6IGV2ZW50LnF1ZXJ5U3RyaW5nUGFyYW1ldGVycyB8fCB7fSxcbiAgICAgIGJvZHk6IGV2ZW50LmJvZHkgfHwge30sXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbWV0aG9kOiBldmVudD8uaHR0cE1ldGhvZCB8fCAndW5rbm93bicsXG4gICAgcm91dGVLZXk6IGV2ZW50Py5yb3V0ZUtleSB8fCBldmVudC5yZXF1ZXN0Q29udGV4dD8ucm91dGVLZXkgfHwgJ3Vua25vd24nLFxuICAgIHVybDogZXZlbnQ/LnBhdGggfHwgJ3Vua25vd24nLFxuICAgIHVzZXJfYWdlbnQ6IGV2ZW50Py5oZWFkZXJzPy5bJ1VzZXItQWdlbnQnXSB8fCAndW5rbm93bicsXG4gICAgcGF0aF9wYXJhbWV0ZXJzOiBldmVudD8ucGF0aFBhcmFtZXRlcnMgfHwge30sXG4gICAgcXVlcnlfc3RyaW5nX3BhcmFtZXRlcnM6IGV2ZW50Py5xdWVyeVN0cmluZ1BhcmFtZXRlcnMgfHwge30sXG4gICAgYm9keTogZXZlbnQ/LmJvZHkgfHwge30sXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0TG9nZ2VkVXNlcihcbiAgZXZlbnQ6IGFueVxuKTogeyBlbWFpbD86IHN0cmluZzsgbmFtZT86IHN0cmluZzsgdWlkPzogc3RyaW5nIH0gfCB1bmRlZmluZWQge1xuICBsZXQgbG9nZ2VkVXNlciA9IGV2ZW50Py5yZXF1ZXN0Q29udGV4dD8uYXV0aG9yaXplcj8ubGFtYmRhPy5sb2dnZWRVc2VyO1xuXG4gIGlmIChsb2dnZWRVc2VyKSB7XG4gICAgbG9nZ2VkVXNlciA9XG4gICAgICB0eXBlb2YgbG9nZ2VkVXNlciA9PT0gJ3N0cmluZycgPyBKU09OLnBhcnNlKGxvZ2dlZFVzZXIpIDogbG9nZ2VkVXNlcjtcblxuICAgIGNvbnN0IGFjY291bnRVc2VyID0gbG9nZ2VkVXNlcj8udXNlcj8uYWNjb3VudF91c2VyO1xuICAgIGNvbnN0IGZpcnN0QWNjb3VudFVzZXIgPSBBcnJheS5pc0FycmF5KGFjY291bnRVc2VyKVxuICAgICAgPyBhY2NvdW50VXNlclswXVxuICAgICAgOiBhY2NvdW50VXNlcjtcblxuICAgIGlmIChsb2dnZWRVc2VyPy51c2VyICYmIGFjY291bnRVc2VyICYmIGZpcnN0QWNjb3VudFVzZXI/LmFjY291bnQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGVtYWlsOiBsb2dnZWRVc2VyLnVzZXIuZW1haWwsXG4gICAgICAgIHVpZDogZmlyc3RBY2NvdW50VXNlci5hY2NvdW50LnVpZCxcbiAgICAgICAgbmFtZTogZmlyc3RBY2NvdW50VXNlci5hY2NvdW50Lm5hbWUsXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0RGVmYXVsdEF0dHJpYnV0ZXMocmVxdWVzdDogYW55KTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgbGFtYmRhQ29udGV4dCA9IHJlcXVlc3Q/LmNvbnRleHQgfHwgcmVxdWVzdD8ubGFtYmRhQ29udGV4dDtcbiAgICBjb25zdCBmdW5jdGlvbk5hbWUgPSBsYW1iZGFDb250ZXh0Py5mdW5jdGlvbk5hbWUgfHwgJ3Vua25vd24nO1xuICAgIGNvbnN0IGludm9jYXRpb25JZCA9IGxhbWJkYUNvbnRleHQ/LmF3c1JlcXVlc3RJZCB8fCAndW5rbm93bic7XG4gICAgY29uc3Qgc2VydmljZU5hbWUgPSBwcm9jZXNzLmVudi5TRVJWSUNFX05BTUUgfHwgJ3NzdC1zZXJ2aWNlJztcbiAgICBjb25zdCBldmVudCA9IHJlcXVlc3Q/LmV2ZW50IHx8IHJlcXVlc3Q7XG4gICAgY29uc3QgcXVlcnlTdHJpbmdQYXJhbWV0ZXJzID0gZXZlbnQ/LnF1ZXJ5U3RyaW5nUGFyYW1ldGVycyB8fCB7fTtcbiAgICBjb25zdCBvcmlnaW4gPSBxdWVyeVN0cmluZ1BhcmFtZXRlcnMub3JpZ2luIHx8ICd1bmtub3duJztcbiAgICBjb25zdCBodHRwID0gZXh0cmFjdEh0dHBBdHRyaWJ1dGVzKGV2ZW50KTtcbiAgICBjb25zdCByb3V0ZUtleSA9XG4gICAgICBldmVudD8ucm91dGVLZXkgfHwgZXZlbnQ/LnJlcXVlc3RDb250ZXh0Py5yb3V0ZUtleSB8fCAndW5rbm93bic7XG4gICAgY29uc3QgcmVxdWVzdElkID1cbiAgICAgIGV2ZW50Py5yZXF1ZXN0SWQgfHwgZXZlbnQ/LnJlcXVlc3RDb250ZXh0Py5yZXF1ZXN0SWQgfHwgJ3Vua25vd24nO1xuICAgIGNvbnN0IGxvZ2dlZFVzZXIgPSBleHRyYWN0TG9nZ2VkVXNlcihldmVudCk7XG4gICAgY29uc3Qgc3RhZ2UgPSBnZXRFbnZpcm9ubWVudFN0YWdlKCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZnVuY3Rpb25OYW1lLFxuICAgICAgaW52b2NhdGlvbklkLFxuICAgICAgc2VydmljZU5hbWUsXG4gICAgICBvcmlnaW4sXG4gICAgICByb3V0ZUtleSxcbiAgICAgIHJlcXVlc3RJZCxcbiAgICAgIHN0YWdlLFxuICAgICAgaHR0cCxcbiAgICAgIGxvZ2dlZFVzZXIsXG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKCdbVGVsZW1ldHJ5XSBFcnJvciBleHRyYWN0aW5nIGRlZmF1bHQgYXR0cmlidXRlczonLCBlcnJvcik7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZ1bmN0aW9uTmFtZTogJ3Vua25vd24nLFxuICAgICAgaW52b2NhdGlvbklkOiAndW5rbm93bicsXG4gICAgICBzZXJ2aWNlTmFtZTogJ3Vua25vd24nLFxuICAgICAgb3JpZ2luOiAndW5rbm93bicsXG4gICAgICByb3V0ZUtleTogJ3Vua25vd24nLFxuICAgICAgcmVxdWVzdElkOiAndW5rbm93bicsXG4gICAgICBzdGFnZTogJ3Vua25vd24nLFxuICAgICAgaHR0cDoge30sXG4gICAgICBsb2dnZWRVc2VyOiB1bmRlZmluZWQsXG4gICAgfTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
# C4 Container Diagram — @mecanizou/telemetry-hub
|
|
2
|
+
|
|
3
|
+
## Descricao do Servico
|
|
4
|
+
|
|
5
|
+
`@mecanizou/telemetry-hub` e uma biblioteca npm compartilhada que fornece logging, tracing e metricas padronizados baseados em OpenTelemetry para todos os servicos Mecanizou. Suporta duas integracoes: **SST/Middy** (Lambda handlers — ativa) e **Ts.ED** (Express serverless — presente mas nao exportada). Nao e um servico deployado — e consumido como dependencia por servicos Lambda e Ts.ED, que enviam sinais de telemetria para o Grafana Alloy (OTel Collector).
|
|
6
|
+
|
|
7
|
+
## Diagrama C4 Container
|
|
8
|
+
|
|
9
|
+
```mermaid
|
|
10
|
+
C4Container
|
|
11
|
+
title C4 Container — @mecanizou/telemetry-hub
|
|
12
|
+
|
|
13
|
+
Person(developer, "Desenvolvedor", "Desenvolve e publica o pacote")
|
|
14
|
+
|
|
15
|
+
System_Boundary(telemetry_hub, "@mecanizou/telemetry-hub (Biblioteca npm)") {
|
|
16
|
+
|
|
17
|
+
Container(core_logger, "StandardLogger", "TypeScript, OTel API Logs", "Emite log records estruturados via OTel LoggerProvider. Desabilitado em development (fallback console.log)")
|
|
18
|
+
Container(core_tracer, "StandardTracer", "TypeScript, OTel API", "Gerencia ciclo de vida de spans com SpanKind.SERVER e atributos padronizados")
|
|
19
|
+
|
|
20
|
+
Container(sst_telemetry, "SST Telemetry Module", "TypeScript, OTel SDK Node", "Inicializa OTel SDK no import (module scope). Cria exporters OTLP HTTP para traces, metrics e logs. Singletons getStandardLogger/getStandardTracer. forceFlush apos cada request")
|
|
21
|
+
Container(middy_middleware, "middyTelemetryMiddleware", "TypeScript, Middy", "Middleware before/after/onError: cria span, registra metricas (duration histogram, success/failure counters), emite log estruturado, chama forceFlush")
|
|
22
|
+
|
|
23
|
+
Container(sst_extraction, "SST Extraction Utils", "TypeScript", "Extrai atributos HTTP, loggedUser e contexto Lambda de APIGatewayProxyEvent v1/v2")
|
|
24
|
+
|
|
25
|
+
Container(tsed_provider, "TsedTelemetryProvider", "TypeScript, OTel SDK, Ts.ED DI", "Gerencia lifecycle OTel para Ts.ED (init/flush/shutdown). Usa SyncLogRecordProcessor customizado para Lambda")
|
|
26
|
+
Container(tsed_service, "TsedTelemetryService", "TypeScript, Ts.ED @Injectable", "Servico DI que wrapa StandardLogger + StandardTracer para controllers Ts.ED")
|
|
27
|
+
Container(tsed_decorator, "@TsedLogTelemetry", "TypeScript, Ts.ED Decorator", "Method decorator: cria span, registra metricas tsed_*, emite log, forceFlush. Equivalente ao Middy middleware")
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
System_Boundary(consumers, "Servicos Consumidores Mecanizou") {
|
|
31
|
+
|
|
32
|
+
Container(sst_lambdas, "SST Lambda Services", "Node.js 18-20, SST v2, Middy", "order-service, quote-service, pricing-service, cart-service, catalog-service, payment-service, etc. Importam middyTelemetryMiddleware")
|
|
33
|
+
Container(tsed_services, "Ts.ED Services", "Node.js, Ts.ED, Express", "crm-service e outros. Usam TsedTelemetryProvider + @TsedLogTelemetry (integracao desabilitada no momento)")
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
System_Boundary(aws, "AWS Infrastructure") {
|
|
37
|
+
|
|
38
|
+
Container(api_gateway, "API Gateway", "AWS API Gateway v1/v2", "Recebe requests HTTP e invoca Lambda handlers. Injeta requestContext com authorizer data")
|
|
39
|
+
Container(authorizer, "mecanizou-authorizer", "AWS Lambda, Node.js", "Lambda Authorizer que valida JWT/Cognito e injeta loggedUser no requestContext")
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
System_Ext(grafana_alloy, "Grafana Alloy", "OTel Collector (OTLP HTTP)", "Recebe traces, metrics e logs via OTLP HTTP com Basic Auth. Endpoint: $OTEL_EXPORTER_OTLP_ENDPOINT/alloy/v1")
|
|
43
|
+
System_Ext(grafana_cloud, "Grafana Cloud", "Loki, Tempo, Mimir", "Backend de observabilidade: armazena e visualiza logs, traces e metricas")
|
|
44
|
+
System_Ext(npm_registry, "npm Registry", "registry.npmjs.org", "Hospeda o pacote @mecanizou/telemetry-hub publicado")
|
|
45
|
+
System_Ext(github, "GitHub", "GitHub Actions, Releases", "Repositorio de codigo, CI/CD (build, test, semantic-release), GitHub Releases")
|
|
46
|
+
System_Ext(slack, "Slack", "Webhook", "Recebe notificacoes de build/release via webhook")
|
|
47
|
+
|
|
48
|
+
Rel(developer, github, "Push commits / Cria PRs")
|
|
49
|
+
Rel(github, npm_registry, "Publica pacote via semantic-release", "npm publish")
|
|
50
|
+
Rel(github, slack, "Envia notificacao de build", "HTTPS Webhook")
|
|
51
|
+
|
|
52
|
+
Rel(sst_lambdas, middy_middleware, "Importa e usa como Middy middleware", "npm dependency")
|
|
53
|
+
Rel(tsed_services, tsed_decorator, "Importa e usa como decorator", "npm dependency (desabilitado)")
|
|
54
|
+
Rel(tsed_services, tsed_provider, "Injeta via Ts.ED DI", "npm dependency (desabilitado)")
|
|
55
|
+
|
|
56
|
+
Rel(middy_middleware, sst_telemetry, "Usa singletons e forceFlush")
|
|
57
|
+
Rel(middy_middleware, sst_extraction, "Extrai atributos do evento Lambda")
|
|
58
|
+
Rel(middy_middleware, core_logger, "Emite logs estruturados (INFO/ERROR)")
|
|
59
|
+
Rel(middy_middleware, core_tracer, "Cria e finaliza spans")
|
|
60
|
+
|
|
61
|
+
Rel(tsed_decorator, tsed_service, "Obtem logger/tracer via DI")
|
|
62
|
+
Rel(tsed_service, tsed_provider, "Obtem LoggerProvider/TracerProvider")
|
|
63
|
+
Rel(tsed_service, core_logger, "Emite logs estruturados")
|
|
64
|
+
Rel(tsed_service, core_tracer, "Cria e finaliza spans")
|
|
65
|
+
|
|
66
|
+
Rel(sst_telemetry, grafana_alloy, "Envia traces via OTLP HTTP", "POST /alloy/v1/traces (Basic Auth)")
|
|
67
|
+
Rel(sst_telemetry, grafana_alloy, "Envia metrics via OTLP HTTP", "POST /alloy/v1/metrics (Basic Auth)")
|
|
68
|
+
Rel(sst_telemetry, grafana_alloy, "Envia logs via OTLP HTTP", "POST /alloy/v1/logs (Basic Auth)")
|
|
69
|
+
Rel(tsed_provider, grafana_alloy, "Envia traces, metrics e logs via OTLP HTTP", "POST /alloy/v1/* (Basic Auth)")
|
|
70
|
+
|
|
71
|
+
Rel(grafana_alloy, grafana_cloud, "Encaminha sinais de telemetria", "Remote Write / OTLP")
|
|
72
|
+
|
|
73
|
+
Rel(api_gateway, authorizer, "Invoca antes de cada request autenticado", "Lambda Authorizer")
|
|
74
|
+
Rel(authorizer, api_gateway, "Retorna loggedUser no requestContext", "Authorizer Response")
|
|
75
|
+
Rel(api_gateway, sst_lambdas, "Invoca Lambda handler com evento enriquecido", "AWS Lambda Invoke")
|
|
76
|
+
Rel(sst_extraction, api_gateway, "Le requestContext.authorizer.lambda.loggedUser", "Dados do evento Lambda")
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## Tabela de Containers
|
|
80
|
+
|
|
81
|
+
| Container | Tecnologia | Responsabilidade | Owner |
|
|
82
|
+
|---|---|---|---|
|
|
83
|
+
| **StandardLogger** | TypeScript, `@opentelemetry/api-logs` | Emite log records estruturados (ERROR/WARN/INFO/DEBUG) via OTel LoggerProvider. Desabilitado em development (fallback `console.log`). Enriquece logs com trace ID, span ID, service name, HTTP context e user identity | telemetry-hub (core) |
|
|
84
|
+
| **StandardTracer** | TypeScript, `@opentelemetry/api` | Gerencia ciclo de vida de spans (`startSpan`/`end`/`setSuccess`/`setError`/`recordException`) com `SpanKind.SERVER` e atributos padronizados de servico, ambiente, execucao e performance | telemetry-hub (core) |
|
|
85
|
+
| **SST Telemetry Module** | TypeScript, `@opentelemetry/sdk-node`, OTLP HTTP Exporters | Inicializa OTel SDK no module scope (import time). Cria 3 exporters OTLP HTTP (traces, metrics, logs) com Basic Auth. Expoe singletons `getStandardLogger`/`getStandardTracer` e `forceFlush` para garantir envio antes do Lambda freeze | telemetry-hub (sst) |
|
|
86
|
+
| **middyTelemetryMiddleware** | TypeScript, `@middy/core` | Middleware Middy com hooks before/after/onError. Cria span por invocacao, registra metricas (`lambda_execution_duration` histogram, `total_successful`/`total_failed` counters), emite log estruturado e chama `forceFlush` | telemetry-hub (sst) |
|
|
87
|
+
| **SST Extraction Utils** | TypeScript | Extrai atributos HTTP (method, URL, route key, user agent, body, params, query), `loggedUser` do authorizer e atributos padrao (function name, AWS request ID, stage, service name) de eventos API Gateway v1/v2 | telemetry-hub (sst) |
|
|
88
|
+
| **TsedTelemetryProvider** | TypeScript, `@opentelemetry/sdk-*`, `@tsed/di` | Gerencia lifecycle completo OTel para Ts.ED: init, flush, shutdown. Usa `SyncLogRecordProcessor` customizado que rastreia promises de export para garantir flush em Lambda. **Nao exportado atualmente** | telemetry-hub (tsed) |
|
|
89
|
+
| **TsedTelemetryService** | TypeScript, `@tsed/di @Injectable` | Servico injetavel via DI que wrapa StandardLogger + StandardTracer. Expoe `logError`/`logException` com `forceFlush` automatico. **Nao exportado atualmente** | telemetry-hub (tsed) |
|
|
90
|
+
| **@TsedLogTelemetry** | TypeScript, Ts.ED Decorator | Method decorator que automatiza span creation, metricas (`tsed_execution_duration`, `tsed_successful_requests`, `tsed_failed_requests`), logging e flush. Equivalente funcional do middyTelemetryMiddleware para Ts.ED. **Nao exportado atualmente** | telemetry-hub (tsed) |
|
|
91
|
+
| **SST Lambda Services** | Node.js 18-20, SST v2, Middy | Servicos backend Mecanizou (order, quote, pricing, cart, catalog, payment, etc.) que importam `middyTelemetryMiddleware` como dependencia npm | Equipes de produto |
|
|
92
|
+
| **Ts.ED Services** | Node.js, Ts.ED, Express Serverless | Servicos como crm-service que usariam TsedTelemetryProvider + @TsedLogTelemetry (integracao desabilitada por conflito de build com SST) | Equipes de produto |
|
|
93
|
+
| **API Gateway** | AWS API Gateway v1/v2 | Recebe requests HTTP externos, executa Lambda Authorizer para autenticacao e invoca Lambda handlers com evento enriquecido (requestContext com loggedUser) | Infra |
|
|
94
|
+
| **mecanizou-authorizer** | AWS Lambda, Node.js, JWT/Cognito | Lambda Authorizer que valida tokens JWT (RS256) e Cognito, injeta `loggedUser` (email, uid, name, roles) no `requestContext.authorizer.lambda` | Auth |
|
|
95
|
+
| **Grafana Alloy** | OTel Collector, OTLP HTTP | Recebe sinais de telemetria (traces, metrics, logs) via OTLP HTTP com Basic Auth no endpoint `/alloy/v1/*`. Encaminha para backends Grafana Cloud | Observabilidade |
|
|
96
|
+
| **Grafana Cloud** | Loki (logs), Tempo (traces), Mimir (metrics) | Backend de observabilidade: armazena, indexa e visualiza logs, traces e metricas de todos os servicos Mecanizou | Observabilidade |
|
|
97
|
+
| **npm Registry** | registry.npmjs.org | Hospeda o pacote `@mecanizou/telemetry-hub` publicado. Autenticacao via `NPM_PUBLISH_TOKEN` | Externo |
|
|
98
|
+
| **GitHub** | GitHub Actions, Releases, semantic-release | Repositorio de codigo, CI/CD (build, test em PRs; semantic-release em push to master/alpha/beta), GitHub Releases automaticos | Externo |
|
|
99
|
+
| **Slack** | Webhook HTTPS | Recebe notificacoes de build/release do GitHub Actions via `SLACK_WEBHOOK_URL` | Externo |
|
|
100
|
+
|
|
101
|
+
## Sinais de Telemetria Emitidos
|
|
102
|
+
|
|
103
|
+
### Metricas (OTel Metrics)
|
|
104
|
+
|
|
105
|
+
| Metrica | Tipo | Framework | Labels |
|
|
106
|
+
|---|---|---|---|
|
|
107
|
+
| `lambda_execution_duration` | Histogram (ms) | SST/Middy | `origin`, `status`, `functionName`, `requestId`, `routeKey`, `serviceName`, `environmentName` |
|
|
108
|
+
| `total_successful` | Counter | SST/Middy | `origin`, `functionName`, `requestId`, `routeKey`, `serviceName`, `environmentName` |
|
|
109
|
+
| `total_failed` | Counter | SST/Middy | `origin`, `error_type`, `functionName`, `requestId`, `routeKey`, `serviceName`, `environmentName` |
|
|
110
|
+
| `tsed_execution_duration` | Histogram (ms) | Ts.ED | `origin`, `status`, `controller`, `method`, `serviceName`, `environmentName` |
|
|
111
|
+
| `tsed_successful_requests` | Counter | Ts.ED | `origin`, `controller`, `method`, `serviceName`, `environmentName` |
|
|
112
|
+
| `tsed_failed_requests` | Counter | Ts.ED | `origin`, `error_type`, `controller`, `method`, `serviceName`, `environmentName` |
|
|
113
|
+
|
|
114
|
+
### Variaveis de Ambiente
|
|
115
|
+
|
|
116
|
+
| Variavel | Obrigatoria | Default | Descricao |
|
|
117
|
+
|---|---|---|---|
|
|
118
|
+
| `OTEL_EXPORTER_OTLP_ENDPOINT` | Sim (prod) | — | URL base do OTel Collector (Grafana Alloy) |
|
|
119
|
+
| `OTEL_EXPORTER_OTLP_USER` | Sim (prod) | — | Username para Basic Auth do OTLP |
|
|
120
|
+
| `OTEL_EXPORTER_OTLP_PASS` | Sim (prod) | — | Password para Basic Auth do OTLP |
|
|
121
|
+
| `SERVICE_NAME` | Nao | `sst-service` / `unknown-service` | Nome do servico no OTel resource |
|
|
122
|
+
| `STAGE` | Nao | `development` | Ambiente (`prod` normalizado para `production`) |
|
|
123
|
+
| `OTEL_ENABLED` | Nao | `true` | Habilita/desabilita OTel (somente Ts.ED) |
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
# Service Profile: telemetry-hub
|
|
2
|
+
|
|
3
|
+
## 1. Nome e Propósito
|
|
4
|
+
|
|
5
|
+
**Nome:** `@mecanizou/telemetry-hub`
|
|
6
|
+
|
|
7
|
+
**Tipo:** Biblioteca npm compartilhada (não é um serviço deployado).
|
|
8
|
+
|
|
9
|
+
**Propósito:** Fornecer logging estruturado, tracing distribuído e métricas padronizadas via OpenTelemetry para os serviços da Mecanizou. Abstrai a configuração dos exporters OTLP e expõe classes/middlewares prontos para dois frameworks: SST/Middy (Lambdas) e Ts.ED (Express serverless).
|
|
10
|
+
|
|
11
|
+
## 2. Stack Tecnológica
|
|
12
|
+
|
|
13
|
+
| Camada | Tecnologia | Versão |
|
|
14
|
+
|---|---|---|
|
|
15
|
+
| Linguagem | TypeScript | ^5.9.3 |
|
|
16
|
+
| Runtime | Node.js | 24.x (CI release), 18.x (CI PR) |
|
|
17
|
+
| Módulo | CommonJS (target ES6) | |
|
|
18
|
+
| Testes | Vitest | ^4.0.13 |
|
|
19
|
+
| Cobertura | @vitest/coverage-v8 | ^4.0.15 |
|
|
20
|
+
| Linting | ESLint + Prettier | ^9.39 / ^3.6 |
|
|
21
|
+
| Release | semantic-release | ^25.0.2 |
|
|
22
|
+
| Commits | Conventional Commits (commitlint) | @commitlint/config-conventional ^20.0 |
|
|
23
|
+
|
|
24
|
+
### Dependências de Produção
|
|
25
|
+
|
|
26
|
+
| Pacote | Versão | Papel |
|
|
27
|
+
|---|---|---|
|
|
28
|
+
| `@opentelemetry/api` | ^1.9.0 | API de tracing e métricas |
|
|
29
|
+
| `@opentelemetry/api-logs` | ^0.56.0 | API de logs |
|
|
30
|
+
| `@opentelemetry/sdk-node` | ^0.56.0 | SDK Node.js OTel |
|
|
31
|
+
| `@opentelemetry/sdk-logs` | ^0.56.0 | LoggerProvider, BatchLogRecordProcessor |
|
|
32
|
+
| `@opentelemetry/sdk-metrics` | ^1.30.0 | MeterProvider, PeriodicExportingMetricReader |
|
|
33
|
+
| `@opentelemetry/exporter-logs-otlp-http` | ^0.56.0 | Exportador de logs via HTTP/OTLP |
|
|
34
|
+
| `@opentelemetry/exporter-trace-otlp-http` | ^0.56.0 | Exportador de traces via HTTP/OTLP |
|
|
35
|
+
| `@opentelemetry/exporter-metrics-otlp-http` | ^0.56.0 | Exportador de métricas via HTTP/OTLP |
|
|
36
|
+
| `@opentelemetry/resources` | ^1.30.0 | Definição de Resource (service.name) |
|
|
37
|
+
| `@opentelemetry/semantic-conventions` | ^1.30.0 | Constantes semânticas (ATTR_SERVICE_NAME) |
|
|
38
|
+
| `@middy/core` | ^6.4.5 | Framework de middleware para Lambda |
|
|
39
|
+
| `@tsed/di` | 8.19.5 | Injeção de dependência Ts.ED |
|
|
40
|
+
| `@tsed/platform-serverless` | 8.19.5 | Plataforma serverless Ts.ED |
|
|
41
|
+
| `find-my-way` | 8.1.0 | Router HTTP (dependência declarada) |
|
|
42
|
+
|
|
43
|
+
## 3. Endpoints/Rotas Expostos
|
|
44
|
+
|
|
45
|
+
**Nenhum.** Este repositório é uma biblioteca npm, não um serviço HTTP. Não possui rotas, handlers Lambda, ou endpoints próprios.
|
|
46
|
+
|
|
47
|
+
O que ele expõe são **middlewares e decorators** para serem usados por outros serviços:
|
|
48
|
+
|
|
49
|
+
| Export | Tipo | Usado por |
|
|
50
|
+
|---|---|---|
|
|
51
|
+
| `middyTelemetryMiddleware()` | Middleware Middy (before/after/onError) | Serviços SST/Lambda |
|
|
52
|
+
| `TsedTelemetryProvider` | Classe de configuração OTel | Serviços Ts.ED |
|
|
53
|
+
| `TsedTelemetryService` | Serviço injetável `@Injectable()` | Serviços Ts.ED |
|
|
54
|
+
| `@TsedLogTelemetry()` | Decorator de método | Controllers Ts.ED |
|
|
55
|
+
|
|
56
|
+
**Nota:** As exportações Ts.ED estão comentadas em `src/index.ts` e não são incluídas no pacote publicado atualmente, devido a problemas de compatibilidade com deploy SST.
|
|
57
|
+
|
|
58
|
+
## 4. Dependências Externas
|
|
59
|
+
|
|
60
|
+
### 4.1. Coletor OpenTelemetry (OTLP HTTP)
|
|
61
|
+
|
|
62
|
+
A biblioteca faz requisições HTTP para um coletor OpenTelemetry compatível. As URLs são construídas a partir da variável de ambiente base:
|
|
63
|
+
|
|
64
|
+
| Variável | Obrigatória | Descrição |
|
|
65
|
+
|---|---|---|
|
|
66
|
+
| `OTEL_EXPORTER_OTLP_ENDPOINT` | Sim | URL base do coletor (ex: `https://seu-endpoint-otel.com`) |
|
|
67
|
+
| `OTEL_EXPORTER_OTLP_USER` | Sim | Usuário para autenticação Basic Auth |
|
|
68
|
+
| `OTEL_EXPORTER_OTLP_PASS` | Sim | Senha para autenticação Basic Auth |
|
|
69
|
+
|
|
70
|
+
**Endpoints construídos:**
|
|
71
|
+
|
|
72
|
+
- **SST** (`src/sst/telemetry.ts`):
|
|
73
|
+
- `{OTEL_EXPORTER_OTLP_ENDPOINT}/alloy/v1/traces`
|
|
74
|
+
- `{OTEL_EXPORTER_OTLP_ENDPOINT}/alloy/v1/metrics`
|
|
75
|
+
- `{OTEL_EXPORTER_OTLP_ENDPOINT}/alloy/v1/logs`
|
|
76
|
+
|
|
77
|
+
- **Ts.ED** (`src/tsed/config.ts`):
|
|
78
|
+
- `{OTEL_EXPORTER_OTLP_ENDPOINT}/alloy/v1/v1/traces`
|
|
79
|
+
- `{OTEL_EXPORTER_OTLP_ENDPOINT}/alloy/v1/v1/metrics`
|
|
80
|
+
- `{OTEL_EXPORTER_OTLP_ENDPOINT}/alloy/v1/v1/logs`
|
|
81
|
+
|
|
82
|
+
> **Observação:** Na implementação Ts.ED, o endpoint recebe o sufixo `/alloy/v1` no construtor do `TsedTelemetryProvider` e depois `/v1/logs` etc. no exporter, resultando em `/alloy/v1/v1/...`. Isso diverge do padrão SST que usa `/alloy/v1/...`. Pode ser intencional ou um bug.
|
|
83
|
+
|
|
84
|
+
**Autenticação:** Basic Auth via header `Authorization: Basic <base64(user:password)>`.
|
|
85
|
+
|
|
86
|
+
### 4.2. Variáveis de Ambiente Adicionais
|
|
87
|
+
|
|
88
|
+
| Variável | Obrigatória | Default | Uso |
|
|
89
|
+
|---|---|---|---|
|
|
90
|
+
| `SERVICE_NAME` | Não | `sst-service` (SST), `unknown-service` (core/Ts.ED) | Atributo `service.name` nos sinais OTel |
|
|
91
|
+
| `STAGE` | Não | `development` | Ambiente de execução. `prod` é normalizado para `production` |
|
|
92
|
+
| `OTEL_ENABLED` | Não | `true` | Apenas Ts.ED: `false` desabilita a inicialização OTel |
|
|
93
|
+
| `NPM_PUBLISH_TOKEN` | Sim (CI) | — | Token de autenticação para publicar no registry npm |
|
|
94
|
+
|
|
95
|
+
### 4.3. Bancos de Dados
|
|
96
|
+
|
|
97
|
+
**Nenhum.** A biblioteca não acessa bancos de dados diretamente.
|
|
98
|
+
|
|
99
|
+
### 4.4. Filas / Mensageria
|
|
100
|
+
|
|
101
|
+
**Nenhum.** Não há produção ou consumo de mensagens SQS, SNS ou EventBridge.
|
|
102
|
+
|
|
103
|
+
### 4.5. APIs Externas / Outros Serviços Internos
|
|
104
|
+
|
|
105
|
+
Nenhuma chamada direta a APIs externas ou serviços internos. A única comunicação de rede é com o coletor OTLP descrito acima.
|
|
106
|
+
|
|
107
|
+
## 5. Mecanismos de Autenticação/Autorização
|
|
108
|
+
|
|
109
|
+
A biblioteca **não implementa** autenticação ou autorização própria.
|
|
110
|
+
|
|
111
|
+
No entanto, o módulo de extração SST (`src/sst/extraction.ts`) **lê** dados do usuário autenticado a partir do evento Lambda:
|
|
112
|
+
|
|
113
|
+
```typescript
|
|
114
|
+
// Extrai loggedUser injetado pelo mecanizou-authorizer
|
|
115
|
+
event.requestContext.authorizer.lambda.loggedUser
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
Campos extraídos: `email`, `uid` (account), `name` (account). Esses dados são incluídos como atributos nos logs e traces para correlação, mas não são usados para decisões de autorização.
|
|
119
|
+
|
|
120
|
+
O decorator Ts.ED (`src/tsed/log-telemetry.ts`) tenta acessar `LoggedUserIdentifier.use($ctx)` para extrair `accountUserUid`, `accountUid` e `applicationUid`, mas faz isso de forma defensiva (try/catch) pois é uma dependência da aplicação consumidora.
|
|
121
|
+
|
|
122
|
+
## 6. Eventos Produzidos e Consumidos
|
|
123
|
+
|
|
124
|
+
**Nenhum.** A biblioteca não produz nem consome eventos de mensageria (SQS, SNS, EventBridge, DMS).
|
|
125
|
+
|
|
126
|
+
Os "eventos" que ela produz são sinais de **observabilidade** enviados ao coletor OTLP:
|
|
127
|
+
|
|
128
|
+
### Sinais OTel Emitidos
|
|
129
|
+
|
|
130
|
+
**Logs estruturados** (via `StandardLogger`):
|
|
131
|
+
- Severidades: `ERROR`, `WARN`, `INFO`, `DEBUG`
|
|
132
|
+
- Atributos padronizados: `service.name`, `deployment.environmentName`, `duration.timestamp`, `error.*`, `execution.*`, `http.*`, `context`, `function.*`, `request.*`, `trace.*`, `span.*`
|
|
133
|
+
|
|
134
|
+
**Traces** (via `StandardTracer`):
|
|
135
|
+
- Spans com `SpanKind.SERVER`
|
|
136
|
+
- Atributos: `service.name`, `deployment.environmentName`, `execution.*`, `duration.*`, `error.*`
|
|
137
|
+
- Status: `OK` ou `ERROR`
|
|
138
|
+
|
|
139
|
+
**Métricas** (via OpenTelemetry Metrics API):
|
|
140
|
+
|
|
141
|
+
| Métrica | Tipo | Framework | Descrição |
|
|
142
|
+
|---|---|---|---|
|
|
143
|
+
| `lambda_execution_duration` | Histogram (ms) | SST | Duração de execução do Lambda |
|
|
144
|
+
| `total_successful` | Counter | SST | Total de execuções bem-sucedidas |
|
|
145
|
+
| `total_failed` | Counter | SST | Total de execuções com falha |
|
|
146
|
+
| `tsed_execution_duration` | Histogram (ms) | Ts.ED | Duração de execução do método |
|
|
147
|
+
| `tsed_successful_requests` | Counter | Ts.ED | Total de requisições bem-sucedidas |
|
|
148
|
+
| `tsed_failed_requests` | Counter | Ts.ED | Total de requisições com falha |
|
|
149
|
+
|
|
150
|
+
Labels das métricas: `origin`, `status`, `functionName`/`controller`, `method`, `routeKey`, `requestId`, `serviceName`, `environmentName`, `error_type` (em falhas).
|
|
151
|
+
|
|
152
|
+
## 7. Dados Armazenados
|
|
153
|
+
|
|
154
|
+
**Nenhum.** A biblioteca não gerencia entidades, tabelas ou qualquer armazenamento persistente. Ela apenas emite sinais de telemetria para um coletor externo.
|
|
155
|
+
|
|
156
|
+
## 8. Infraestrutura
|
|
157
|
+
|
|
158
|
+
**Não possui infraestrutura própria.** Não há `sst.config.ts`, `serverless.yml`, `template.yaml`, diretório `infra/`, `Dockerfile`, ou `docker-compose.yml`.
|
|
159
|
+
|
|
160
|
+
O repositório é uma biblioteca npm pura. A infraestrutura relevante é:
|
|
161
|
+
|
|
162
|
+
### CI/CD (GitHub Actions)
|
|
163
|
+
|
|
164
|
+
| Workflow | Trigger | Ações |
|
|
165
|
+
|---|---|---|
|
|
166
|
+
| `release.yml` | Push em `master`, `alpha`, `beta` | Install → Build → semantic-release (publica no npm) → Slack notify |
|
|
167
|
+
| `pull_request.yml` | PR para `master`, `staging` | Install → Build → Test |
|
|
168
|
+
|
|
169
|
+
### Publicação npm
|
|
170
|
+
|
|
171
|
+
- Registry: `registry.npmjs.org` (configurado em `.npmrc`)
|
|
172
|
+
- Autenticação: token via `NPM_PUBLISH_TOKEN`
|
|
173
|
+
- Artefato publicado: diretório `dist/` (CommonJS compilado com declarations)
|
|
174
|
+
- Versionamento: automático via semantic-release baseado em conventional commits
|
|
175
|
+
- Branches de release: `master` (estável), `alpha` e `beta` (pre-release)
|
|
176
|
+
|
|
177
|
+
### Destino do pacote publicado
|
|
178
|
+
|
|
179
|
+
O pacote `@mecanizou/telemetry-hub` é consumido como dependência por outros serviços Mecanizou (SST Lambdas e Ts.ED services) que o instalam via `npm install @mecanizou/telemetry-hub`.
|