@superblocksteam/telemetry 2.0.83-next.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/LICENSE.txt +87 -0
- package/README.md +155 -0
- package/dist/browser/index.d.ts +8 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +19 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/init.d.ts +75 -0
- package/dist/browser/init.d.ts.map +1 -0
- package/dist/browser/init.js +169 -0
- package/dist/browser/init.js.map +1 -0
- package/dist/browser/resilient-exporter.d.ts +43 -0
- package/dist/browser/resilient-exporter.d.ts.map +1 -0
- package/dist/browser/resilient-exporter.js +88 -0
- package/dist/browser/resilient-exporter.js.map +1 -0
- package/dist/common/contracts/tier2-traces.d.ts +75 -0
- package/dist/common/contracts/tier2-traces.d.ts.map +1 -0
- package/dist/common/contracts/tier2-traces.js +186 -0
- package/dist/common/contracts/tier2-traces.js.map +1 -0
- package/dist/common/deployment-type.d.ts +18 -0
- package/dist/common/deployment-type.d.ts.map +1 -0
- package/dist/common/deployment-type.js +30 -0
- package/dist/common/deployment-type.js.map +1 -0
- package/dist/common/guardrails.d.ts +116 -0
- package/dist/common/guardrails.d.ts.map +1 -0
- package/dist/common/guardrails.js +189 -0
- package/dist/common/guardrails.js.map +1 -0
- package/dist/common/index.d.ts +16 -0
- package/dist/common/index.d.ts.map +1 -0
- package/dist/common/index.js +32 -0
- package/dist/common/index.js.map +1 -0
- package/dist/common/log-sanitizer.d.ts +78 -0
- package/dist/common/log-sanitizer.d.ts.map +1 -0
- package/dist/common/log-sanitizer.js +340 -0
- package/dist/common/log-sanitizer.js.map +1 -0
- package/dist/common/policy-evaluator.d.ts +103 -0
- package/dist/common/policy-evaluator.d.ts.map +1 -0
- package/dist/common/policy-evaluator.js +200 -0
- package/dist/common/policy-evaluator.js.map +1 -0
- package/dist/common/resource.d.ts +62 -0
- package/dist/common/resource.d.ts.map +1 -0
- package/dist/common/resource.js +106 -0
- package/dist/common/resource.js.map +1 -0
- package/dist/common/tier-hints.d.ts +182 -0
- package/dist/common/tier-hints.d.ts.map +1 -0
- package/dist/common/tier-hints.js +209 -0
- package/dist/common/tier-hints.js.map +1 -0
- package/dist/index.d.ts +43 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +76 -0
- package/dist/index.js.map +1 -0
- package/dist/lint/forbidden-attributes.d.ts +149 -0
- package/dist/lint/forbidden-attributes.d.ts.map +1 -0
- package/dist/lint/forbidden-attributes.js +214 -0
- package/dist/lint/forbidden-attributes.js.map +1 -0
- package/dist/lint/index.d.ts +9 -0
- package/dist/lint/index.d.ts.map +1 -0
- package/dist/lint/index.js +16 -0
- package/dist/lint/index.js.map +1 -0
- package/dist/llmobs/index.d.ts +22 -0
- package/dist/llmobs/index.d.ts.map +1 -0
- package/dist/llmobs/index.js +29 -0
- package/dist/llmobs/index.js.map +1 -0
- package/dist/llmobs/tier1-exporter.d.ts +146 -0
- package/dist/llmobs/tier1-exporter.d.ts.map +1 -0
- package/dist/llmobs/tier1-exporter.js +196 -0
- package/dist/llmobs/tier1-exporter.js.map +1 -0
- package/dist/llmobs/tier2-summarizer.d.ts +268 -0
- package/dist/llmobs/tier2-summarizer.d.ts.map +1 -0
- package/dist/llmobs/tier2-summarizer.js +650 -0
- package/dist/llmobs/tier2-summarizer.js.map +1 -0
- package/dist/node/exporters/resilient-exporter.d.ts +77 -0
- package/dist/node/exporters/resilient-exporter.d.ts.map +1 -0
- package/dist/node/exporters/resilient-exporter.js +129 -0
- package/dist/node/exporters/resilient-exporter.js.map +1 -0
- package/dist/node/index.d.ts +11 -0
- package/dist/node/index.d.ts.map +1 -0
- package/dist/node/index.js +24 -0
- package/dist/node/index.js.map +1 -0
- package/dist/node/init.d.ts +75 -0
- package/dist/node/init.d.ts.map +1 -0
- package/dist/node/init.js +245 -0
- package/dist/node/init.js.map +1 -0
- package/dist/node/log-processor.d.ts +83 -0
- package/dist/node/log-processor.d.ts.map +1 -0
- package/dist/node/log-processor.js +266 -0
- package/dist/node/log-processor.js.map +1 -0
- package/dist/node/metrics-client.d.ts +66 -0
- package/dist/node/metrics-client.d.ts.map +1 -0
- package/dist/node/metrics-client.js +193 -0
- package/dist/node/metrics-client.js.map +1 -0
- package/dist/node/traced-socket.d.ts +76 -0
- package/dist/node/traced-socket.d.ts.map +1 -0
- package/dist/node/traced-socket.js +261 -0
- package/dist/node/traced-socket.js.map +1 -0
- package/dist/testing/in-memory-exporter.d.ts +179 -0
- package/dist/testing/in-memory-exporter.d.ts.map +1 -0
- package/dist/testing/in-memory-exporter.js +254 -0
- package/dist/testing/in-memory-exporter.js.map +1 -0
- package/dist/testing/index.d.ts +8 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +19 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/test-init.d.ts +80 -0
- package/dist/testing/test-init.d.ts.map +1 -0
- package/dist/testing/test-init.js +144 -0
- package/dist/testing/test-init.js.map +1 -0
- package/dist/types/index.d.ts +40 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +23 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/policy.d.ts +92 -0
- package/dist/types/policy.d.ts.map +1 -0
- package/dist/types/policy.js +125 -0
- package/dist/types/policy.js.map +1 -0
- package/dist-esm/browser/index.d.ts +8 -0
- package/dist-esm/browser/index.d.ts.map +1 -0
- package/dist-esm/browser/index.js +9 -0
- package/dist-esm/browser/index.js.map +1 -0
- package/dist-esm/browser/init.d.ts +75 -0
- package/dist-esm/browser/init.d.ts.map +1 -0
- package/dist-esm/browser/init.js +162 -0
- package/dist-esm/browser/init.js.map +1 -0
- package/dist-esm/browser/resilient-exporter.d.ts +43 -0
- package/dist-esm/browser/resilient-exporter.d.ts.map +1 -0
- package/dist-esm/browser/resilient-exporter.js +84 -0
- package/dist-esm/browser/resilient-exporter.js.map +1 -0
- package/dist-esm/common/contracts/tier2-traces.d.ts +75 -0
- package/dist-esm/common/contracts/tier2-traces.d.ts.map +1 -0
- package/dist-esm/common/contracts/tier2-traces.js +178 -0
- package/dist-esm/common/contracts/tier2-traces.js.map +1 -0
- package/dist-esm/common/deployment-type.d.ts +18 -0
- package/dist-esm/common/deployment-type.d.ts.map +1 -0
- package/dist-esm/common/deployment-type.js +27 -0
- package/dist-esm/common/deployment-type.js.map +1 -0
- package/dist-esm/common/guardrails.d.ts +116 -0
- package/dist-esm/common/guardrails.d.ts.map +1 -0
- package/dist-esm/common/guardrails.js +179 -0
- package/dist-esm/common/guardrails.js.map +1 -0
- package/dist-esm/common/index.d.ts +16 -0
- package/dist-esm/common/index.d.ts.map +1 -0
- package/dist-esm/common/index.js +16 -0
- package/dist-esm/common/index.js.map +1 -0
- package/dist-esm/common/log-sanitizer.d.ts +78 -0
- package/dist-esm/common/log-sanitizer.d.ts.map +1 -0
- package/dist-esm/common/log-sanitizer.js +331 -0
- package/dist-esm/common/log-sanitizer.js.map +1 -0
- package/dist-esm/common/policy-evaluator.d.ts +103 -0
- package/dist-esm/common/policy-evaluator.d.ts.map +1 -0
- package/dist-esm/common/policy-evaluator.js +196 -0
- package/dist-esm/common/policy-evaluator.js.map +1 -0
- package/dist-esm/common/resource.d.ts +62 -0
- package/dist-esm/common/resource.d.ts.map +1 -0
- package/dist-esm/common/resource.js +100 -0
- package/dist-esm/common/resource.js.map +1 -0
- package/dist-esm/common/tier-hints.d.ts +182 -0
- package/dist-esm/common/tier-hints.d.ts.map +1 -0
- package/dist-esm/common/tier-hints.js +199 -0
- package/dist-esm/common/tier-hints.js.map +1 -0
- package/dist-esm/index.d.ts +43 -0
- package/dist-esm/index.d.ts.map +1 -0
- package/dist-esm/index.js +53 -0
- package/dist-esm/index.js.map +1 -0
- package/dist-esm/lint/forbidden-attributes.d.ts +149 -0
- package/dist-esm/lint/forbidden-attributes.d.ts.map +1 -0
- package/dist-esm/lint/forbidden-attributes.js +209 -0
- package/dist-esm/lint/forbidden-attributes.js.map +1 -0
- package/dist-esm/lint/index.d.ts +9 -0
- package/dist-esm/lint/index.d.ts.map +1 -0
- package/dist-esm/lint/index.js +9 -0
- package/dist-esm/lint/index.js.map +1 -0
- package/dist-esm/llmobs/index.d.ts +22 -0
- package/dist-esm/llmobs/index.d.ts.map +1 -0
- package/dist-esm/llmobs/index.js +22 -0
- package/dist-esm/llmobs/index.js.map +1 -0
- package/dist-esm/llmobs/tier1-exporter.d.ts +146 -0
- package/dist-esm/llmobs/tier1-exporter.d.ts.map +1 -0
- package/dist-esm/llmobs/tier1-exporter.js +190 -0
- package/dist-esm/llmobs/tier1-exporter.js.map +1 -0
- package/dist-esm/llmobs/tier2-summarizer.d.ts +268 -0
- package/dist-esm/llmobs/tier2-summarizer.d.ts.map +1 -0
- package/dist-esm/llmobs/tier2-summarizer.js +646 -0
- package/dist-esm/llmobs/tier2-summarizer.js.map +1 -0
- package/dist-esm/node/exporters/resilient-exporter.d.ts +77 -0
- package/dist-esm/node/exporters/resilient-exporter.d.ts.map +1 -0
- package/dist-esm/node/exporters/resilient-exporter.js +125 -0
- package/dist-esm/node/exporters/resilient-exporter.js.map +1 -0
- package/dist-esm/node/index.d.ts +11 -0
- package/dist-esm/node/index.d.ts.map +1 -0
- package/dist-esm/node/index.js +11 -0
- package/dist-esm/node/index.js.map +1 -0
- package/dist-esm/node/init.d.ts +75 -0
- package/dist-esm/node/init.d.ts.map +1 -0
- package/dist-esm/node/init.js +239 -0
- package/dist-esm/node/init.js.map +1 -0
- package/dist-esm/node/log-processor.d.ts +83 -0
- package/dist-esm/node/log-processor.d.ts.map +1 -0
- package/dist-esm/node/log-processor.js +261 -0
- package/dist-esm/node/log-processor.js.map +1 -0
- package/dist-esm/node/metrics-client.d.ts +66 -0
- package/dist-esm/node/metrics-client.d.ts.map +1 -0
- package/dist-esm/node/metrics-client.js +189 -0
- package/dist-esm/node/metrics-client.js.map +1 -0
- package/dist-esm/node/traced-socket.d.ts +76 -0
- package/dist-esm/node/traced-socket.d.ts.map +1 -0
- package/dist-esm/node/traced-socket.js +257 -0
- package/dist-esm/node/traced-socket.js.map +1 -0
- package/dist-esm/testing/in-memory-exporter.d.ts +179 -0
- package/dist-esm/testing/in-memory-exporter.d.ts.map +1 -0
- package/dist-esm/testing/in-memory-exporter.js +248 -0
- package/dist-esm/testing/in-memory-exporter.js.map +1 -0
- package/dist-esm/testing/index.d.ts +8 -0
- package/dist-esm/testing/index.d.ts.map +1 -0
- package/dist-esm/testing/index.js +8 -0
- package/dist-esm/testing/index.js.map +1 -0
- package/dist-esm/testing/test-init.d.ts +80 -0
- package/dist-esm/testing/test-init.d.ts.map +1 -0
- package/dist-esm/testing/test-init.js +137 -0
- package/dist-esm/testing/test-init.js.map +1 -0
- package/dist-esm/types/index.d.ts +40 -0
- package/dist-esm/types/index.d.ts.map +1 -0
- package/dist-esm/types/index.js +7 -0
- package/dist-esm/types/index.js.map +1 -0
- package/dist-esm/types/policy.d.ts +92 -0
- package/dist-esm/types/policy.d.ts.map +1 -0
- package/dist-esm/types/policy.js +122 -0
- package/dist-esm/types/policy.js.map +1 -0
- package/package.json +101 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tier 2 Traces Contract
|
|
3
|
+
*
|
|
4
|
+
* This file defines the Tier 2 telemetry contract:
|
|
5
|
+
* - Forbidden attributes (removed by Collector)
|
|
6
|
+
* - Hashed attributes (pseudonymized by Collector)
|
|
7
|
+
* - Dropped attributes (removed by Collector)
|
|
8
|
+
* - Forbidden value patterns (for lint-time detection)
|
|
9
|
+
*
|
|
10
|
+
* ENFORCEMENT: The OTEL Collector handles runtime enforcement.
|
|
11
|
+
* These definitions are used for:
|
|
12
|
+
* - ESLint rules (static analysis at CI time)
|
|
13
|
+
* - Development warnings (guardrails.ts)
|
|
14
|
+
* - Collector config generation
|
|
15
|
+
*
|
|
16
|
+
* See: obs/otel-collector/config-tiered.yaml
|
|
17
|
+
* Source of truth: engineering/projects/o11y-refactor/contracts/tier2-traces.v0.3.0.json
|
|
18
|
+
*/
|
|
19
|
+
/**
|
|
20
|
+
* Attributes that are FORBIDDEN in Tier 2 telemetry.
|
|
21
|
+
* These contain sensitive data that should never leave the customer's environment.
|
|
22
|
+
* The Collector strips these entirely (not hashed, not present in Tier 2).
|
|
23
|
+
*/
|
|
24
|
+
export declare const TIER2_FORBIDDEN_ATTRIBUTES: Set<string>;
|
|
25
|
+
/**
|
|
26
|
+
* Attributes that should be HASHED (pseudonymized) in Tier 2 telemetry.
|
|
27
|
+
* The Collector replaces these with SHA256 hashes for privacy.
|
|
28
|
+
* Hashes enable aggregate analysis without exposing plaintext identifiers.
|
|
29
|
+
*
|
|
30
|
+
* Mapping:
|
|
31
|
+
* user-email, user.email, etc. → user.hash
|
|
32
|
+
* organization-id, organization_id → organization.hash
|
|
33
|
+
* application-id, application_id → application.hash
|
|
34
|
+
* session.id → session.hash
|
|
35
|
+
* enduser.id → enduser.pseudo.id
|
|
36
|
+
*/
|
|
37
|
+
export declare const TIER2_HASHED_ATTRIBUTES: Set<string>;
|
|
38
|
+
/**
|
|
39
|
+
* Attributes that should be DROPPED entirely in Tier 2.
|
|
40
|
+
* These are correlation IDs that don't provide operational value.
|
|
41
|
+
*/
|
|
42
|
+
export declare const TIER2_DROPPED_ATTRIBUTES: Set<string>;
|
|
43
|
+
/**
|
|
44
|
+
* Spans that should ALWAYS be sampled (never dropped by rate limiting).
|
|
45
|
+
*/
|
|
46
|
+
export declare const ALWAYS_SAMPLE_SPANS: Set<string>;
|
|
47
|
+
/**
|
|
48
|
+
* Patterns that indicate forbidden content in attribute values.
|
|
49
|
+
* Used for secondary filtering when attribute names aren't explicit.
|
|
50
|
+
*
|
|
51
|
+
* IMPORTANT: Patterns should NOT use ^ and $ anchors so they match
|
|
52
|
+
* secrets embedded anywhere in a string (e.g., in query params, headers).
|
|
53
|
+
*/
|
|
54
|
+
export declare const FORBIDDEN_VALUE_PATTERNS: RegExp[];
|
|
55
|
+
/**
|
|
56
|
+
* Check if an attribute name is forbidden in Tier 2.
|
|
57
|
+
*/
|
|
58
|
+
export declare function isForbiddenAttribute(name: string): boolean;
|
|
59
|
+
/**
|
|
60
|
+
* Check if an attribute should be hashed in Tier 2.
|
|
61
|
+
*/
|
|
62
|
+
export declare function isHashedAttribute(name: string): boolean;
|
|
63
|
+
/**
|
|
64
|
+
* Check if an attribute should be dropped in Tier 2.
|
|
65
|
+
*/
|
|
66
|
+
export declare function isDroppedAttribute(name: string): boolean;
|
|
67
|
+
/**
|
|
68
|
+
* Check if a value contains forbidden patterns (like tokens, keys).
|
|
69
|
+
*/
|
|
70
|
+
export declare function containsForbiddenPattern(value: unknown): boolean;
|
|
71
|
+
/**
|
|
72
|
+
* Check if a span should always be sampled.
|
|
73
|
+
*/
|
|
74
|
+
export declare function shouldAlwaysSample(spanName: string): boolean;
|
|
75
|
+
//# sourceMappingURL=tier2-traces.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tier2-traces.d.ts","sourceRoot":"","sources":["../../../src/common/contracts/tier2-traces.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH;;;;GAIG;AACH,eAAO,MAAM,0BAA0B,aAsDrC,CAAC;AAEH;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,uBAAuB,aAmBlC,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,wBAAwB,aAQnC,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,mBAAmB,aAE9B,CAAC;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,wBAAwB,UAuBpC,CAAC;AAEF;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAExD;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAGhE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAE5D"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tier 2 Traces Contract
|
|
3
|
+
*
|
|
4
|
+
* This file defines the Tier 2 telemetry contract:
|
|
5
|
+
* - Forbidden attributes (removed by Collector)
|
|
6
|
+
* - Hashed attributes (pseudonymized by Collector)
|
|
7
|
+
* - Dropped attributes (removed by Collector)
|
|
8
|
+
* - Forbidden value patterns (for lint-time detection)
|
|
9
|
+
*
|
|
10
|
+
* ENFORCEMENT: The OTEL Collector handles runtime enforcement.
|
|
11
|
+
* These definitions are used for:
|
|
12
|
+
* - ESLint rules (static analysis at CI time)
|
|
13
|
+
* - Development warnings (guardrails.ts)
|
|
14
|
+
* - Collector config generation
|
|
15
|
+
*
|
|
16
|
+
* See: obs/otel-collector/config-tiered.yaml
|
|
17
|
+
* Source of truth: engineering/projects/o11y-refactor/contracts/tier2-traces.v0.3.0.json
|
|
18
|
+
*/
|
|
19
|
+
/**
|
|
20
|
+
* Attributes that are FORBIDDEN in Tier 2 telemetry.
|
|
21
|
+
* These contain sensitive data that should never leave the customer's environment.
|
|
22
|
+
* The Collector strips these entirely (not hashed, not present in Tier 2).
|
|
23
|
+
*/
|
|
24
|
+
export const TIER2_FORBIDDEN_ATTRIBUTES = new Set([
|
|
25
|
+
// LLM/AI content
|
|
26
|
+
'llmobs.input',
|
|
27
|
+
'llmobs.output',
|
|
28
|
+
'prompt',
|
|
29
|
+
'code',
|
|
30
|
+
'tool_input',
|
|
31
|
+
'tool_output',
|
|
32
|
+
// File content
|
|
33
|
+
'file_path',
|
|
34
|
+
'file_content',
|
|
35
|
+
// Database content
|
|
36
|
+
'db.statement',
|
|
37
|
+
'db.query_text',
|
|
38
|
+
'db.query.text',
|
|
39
|
+
// HTTP bodies and URLs
|
|
40
|
+
'http.request.body',
|
|
41
|
+
'http.response.body',
|
|
42
|
+
'url.full',
|
|
43
|
+
'url.query',
|
|
44
|
+
'http.url',
|
|
45
|
+
'http.target',
|
|
46
|
+
// Resource identifiers (names are customer-specific)
|
|
47
|
+
'api-id',
|
|
48
|
+
'api_id',
|
|
49
|
+
'api-name',
|
|
50
|
+
'api_name',
|
|
51
|
+
'resource-id',
|
|
52
|
+
'resource_id',
|
|
53
|
+
'resource-name',
|
|
54
|
+
'resource_name',
|
|
55
|
+
'integration-id',
|
|
56
|
+
'integration_id',
|
|
57
|
+
'widget-type',
|
|
58
|
+
'branch',
|
|
59
|
+
'commit-id',
|
|
60
|
+
'commit_id',
|
|
61
|
+
'profile-id',
|
|
62
|
+
'profile_id',
|
|
63
|
+
// Stack traces
|
|
64
|
+
'error.stack',
|
|
65
|
+
'exception.stacktrace',
|
|
66
|
+
// Auth/secrets
|
|
67
|
+
'auth_token',
|
|
68
|
+
'api_key',
|
|
69
|
+
'authorization',
|
|
70
|
+
'cookie',
|
|
71
|
+
'x-api-key',
|
|
72
|
+
]);
|
|
73
|
+
/**
|
|
74
|
+
* Attributes that should be HASHED (pseudonymized) in Tier 2 telemetry.
|
|
75
|
+
* The Collector replaces these with SHA256 hashes for privacy.
|
|
76
|
+
* Hashes enable aggregate analysis without exposing plaintext identifiers.
|
|
77
|
+
*
|
|
78
|
+
* Mapping:
|
|
79
|
+
* user-email, user.email, etc. → user.hash
|
|
80
|
+
* organization-id, organization_id → organization.hash
|
|
81
|
+
* application-id, application_id → application.hash
|
|
82
|
+
* session.id → session.hash
|
|
83
|
+
* enduser.id → enduser.pseudo.id
|
|
84
|
+
*/
|
|
85
|
+
export const TIER2_HASHED_ATTRIBUTES = new Set([
|
|
86
|
+
// User identity (hashed to user.hash)
|
|
87
|
+
'user-email',
|
|
88
|
+
'user.email',
|
|
89
|
+
'user_email',
|
|
90
|
+
'user.id',
|
|
91
|
+
'enduser.email',
|
|
92
|
+
// Organization identity (hashed to organization.hash)
|
|
93
|
+
'organization-id',
|
|
94
|
+
'organization_id',
|
|
95
|
+
// Application identity (hashed to application.hash)
|
|
96
|
+
'application-id',
|
|
97
|
+
'application_id',
|
|
98
|
+
// Session/enduser identity
|
|
99
|
+
'session.id',
|
|
100
|
+
'enduser.id',
|
|
101
|
+
]);
|
|
102
|
+
/**
|
|
103
|
+
* Attributes that should be DROPPED entirely in Tier 2.
|
|
104
|
+
* These are correlation IDs that don't provide operational value.
|
|
105
|
+
*/
|
|
106
|
+
export const TIER2_DROPPED_ATTRIBUTES = new Set([
|
|
107
|
+
'correlation-id',
|
|
108
|
+
'correlation_id',
|
|
109
|
+
'request-id',
|
|
110
|
+
'request_id',
|
|
111
|
+
'trace-id',
|
|
112
|
+
'execution_id',
|
|
113
|
+
'binding_keys',
|
|
114
|
+
]);
|
|
115
|
+
/**
|
|
116
|
+
* Spans that should ALWAYS be sampled (never dropped by rate limiting).
|
|
117
|
+
*/
|
|
118
|
+
export const ALWAYS_SAMPLE_SPANS = new Set([
|
|
119
|
+
'api.execute',
|
|
120
|
+
]);
|
|
121
|
+
/**
|
|
122
|
+
* Patterns that indicate forbidden content in attribute values.
|
|
123
|
+
* Used for secondary filtering when attribute names aren't explicit.
|
|
124
|
+
*
|
|
125
|
+
* IMPORTANT: Patterns should NOT use ^ and $ anchors so they match
|
|
126
|
+
* secrets embedded anywhere in a string (e.g., in query params, headers).
|
|
127
|
+
*/
|
|
128
|
+
export const FORBIDDEN_VALUE_PATTERNS = [
|
|
129
|
+
// JWT tokens (anywhere in string)
|
|
130
|
+
// Header (eyJ...) and payload (eyJ...) must be base64url encoded JSON
|
|
131
|
+
// Signature can be any length (even short for test tokens)
|
|
132
|
+
/eyJ[A-Za-z0-9_-]{10,}\.eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]+/,
|
|
133
|
+
// API keys (sk-/pk- prefix patterns with word boundaries)
|
|
134
|
+
/\b(sk|pk)-[a-zA-Z0-9]{32,}\b/,
|
|
135
|
+
// Bearer tokens (anywhere in string)
|
|
136
|
+
/Bearer\s+[A-Za-z0-9._-]{20,}/,
|
|
137
|
+
// PEM blocks (anywhere in string)
|
|
138
|
+
/-----BEGIN\s+(RSA\s+)?(PRIVATE|PUBLIC)\s+KEY-----/,
|
|
139
|
+
// AWS access key IDs
|
|
140
|
+
/\bAKIA[A-Z0-9]{16}\b/,
|
|
141
|
+
// GitHub tokens
|
|
142
|
+
/\b(ghp|gho|ghu|ghs|ghr)_[A-Za-z0-9]{36,}\b/,
|
|
143
|
+
// Generic API key patterns (key=value or key:value with long alphanumeric)
|
|
144
|
+
/\b(api[_-]?key|apikey|secret[_-]?key|access[_-]?token)[=:]\s*[A-Za-z0-9_-]{20,}\b/i,
|
|
145
|
+
];
|
|
146
|
+
/**
|
|
147
|
+
* Check if an attribute name is forbidden in Tier 2.
|
|
148
|
+
*/
|
|
149
|
+
export function isForbiddenAttribute(name) {
|
|
150
|
+
return TIER2_FORBIDDEN_ATTRIBUTES.has(name);
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Check if an attribute should be hashed in Tier 2.
|
|
154
|
+
*/
|
|
155
|
+
export function isHashedAttribute(name) {
|
|
156
|
+
return TIER2_HASHED_ATTRIBUTES.has(name);
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Check if an attribute should be dropped in Tier 2.
|
|
160
|
+
*/
|
|
161
|
+
export function isDroppedAttribute(name) {
|
|
162
|
+
return TIER2_DROPPED_ATTRIBUTES.has(name);
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Check if a value contains forbidden patterns (like tokens, keys).
|
|
166
|
+
*/
|
|
167
|
+
export function containsForbiddenPattern(value) {
|
|
168
|
+
if (typeof value !== 'string')
|
|
169
|
+
return false;
|
|
170
|
+
return FORBIDDEN_VALUE_PATTERNS.some(pattern => pattern.test(value));
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Check if a span should always be sampled.
|
|
174
|
+
*/
|
|
175
|
+
export function shouldAlwaysSample(spanName) {
|
|
176
|
+
return ALWAYS_SAMPLE_SPANS.has(spanName);
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=tier2-traces.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tier2-traces.js","sourceRoot":"","sources":["../../../src/common/contracts/tier2-traces.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH;;;;GAIG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,IAAI,GAAG,CAAC;IAChD,iBAAiB;IACjB,cAAc;IACd,eAAe;IACf,QAAQ;IACR,MAAM;IACN,YAAY;IACZ,aAAa;IAEb,eAAe;IACf,WAAW;IACX,cAAc;IAEd,mBAAmB;IACnB,cAAc;IACd,eAAe;IACf,eAAe;IAEf,uBAAuB;IACvB,mBAAmB;IACnB,oBAAoB;IACpB,UAAU;IACV,WAAW;IACX,UAAU;IACV,aAAa;IAEb,qDAAqD;IACrD,QAAQ;IACR,QAAQ;IACR,UAAU;IACV,UAAU;IACV,aAAa;IACb,aAAa;IACb,eAAe;IACf,eAAe;IACf,gBAAgB;IAChB,gBAAgB;IAChB,aAAa;IACb,QAAQ;IACR,WAAW;IACX,WAAW;IACX,YAAY;IACZ,YAAY;IAEZ,eAAe;IACf,aAAa;IACb,sBAAsB;IAEtB,eAAe;IACf,YAAY;IACZ,SAAS;IACT,eAAe;IACf,QAAQ;IACR,WAAW;CACZ,CAAC,CAAC;AAEH;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,IAAI,GAAG,CAAC;IAC7C,sCAAsC;IACtC,YAAY;IACZ,YAAY;IACZ,YAAY;IACZ,SAAS;IACT,eAAe;IAEf,sDAAsD;IACtD,iBAAiB;IACjB,iBAAiB;IAEjB,oDAAoD;IACpD,gBAAgB;IAChB,gBAAgB;IAEhB,2BAA2B;IAC3B,YAAY;IACZ,YAAY;CACb,CAAC,CAAC;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,IAAI,GAAG,CAAC;IAC9C,gBAAgB;IAChB,gBAAgB;IAChB,YAAY;IACZ,YAAY;IACZ,UAAU;IACV,cAAc;IACd,cAAc;CACf,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC;IACzC,aAAa;CACd,CAAC,CAAC;AAEH;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,kCAAkC;IAClC,sEAAsE;IACtE,2DAA2D;IAC3D,8DAA8D;IAE9D,0DAA0D;IAC1D,8BAA8B;IAE9B,qCAAqC;IACrC,8BAA8B;IAE9B,kCAAkC;IAClC,mDAAmD;IAEnD,qBAAqB;IACrB,sBAAsB;IAEtB,gBAAgB;IAChB,4CAA4C;IAE5C,2EAA2E;IAC3E,oFAAoF;CACrF,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,OAAO,0BAA0B,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAC9C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,OAAO,uBAAuB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAC3C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,OAAO,wBAAwB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAC5C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,KAAc;IACrD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,OAAO,wBAAwB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AACvE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAgB;IACjD,OAAO,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AAC3C,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deployment Type Parsing
|
|
3
|
+
*
|
|
4
|
+
* Shared utility for validating and parsing deployment type values.
|
|
5
|
+
* Used by both the server and CLI telemetry initialization.
|
|
6
|
+
*/
|
|
7
|
+
import { DeploymentTypeEnum } from "@superblocksteam/shared";
|
|
8
|
+
/**
|
|
9
|
+
* Parse and validate a deployment type string.
|
|
10
|
+
*
|
|
11
|
+
* Returns CLOUD if not specified. Throws if an invalid value is provided.
|
|
12
|
+
*
|
|
13
|
+
* @param value - Raw deployment type string (typically from env var)
|
|
14
|
+
* @returns Valid DeploymentTypeEnum value
|
|
15
|
+
* @throws Error if value is not a valid DeploymentTypeEnum
|
|
16
|
+
*/
|
|
17
|
+
export declare function parseDeploymentType(value: string | undefined): DeploymentTypeEnum;
|
|
18
|
+
//# sourceMappingURL=deployment-type.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deployment-type.d.ts","sourceRoot":"","sources":["../../src/common/deployment-type.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,MAAM,GAAG,SAAS,GACxB,kBAAkB,CAapB"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deployment Type Parsing
|
|
3
|
+
*
|
|
4
|
+
* Shared utility for validating and parsing deployment type values.
|
|
5
|
+
* Used by both the server and CLI telemetry initialization.
|
|
6
|
+
*/
|
|
7
|
+
import { DeploymentTypeEnum } from "@superblocksteam/shared";
|
|
8
|
+
/**
|
|
9
|
+
* Parse and validate a deployment type string.
|
|
10
|
+
*
|
|
11
|
+
* Returns CLOUD if not specified. Throws if an invalid value is provided.
|
|
12
|
+
*
|
|
13
|
+
* @param value - Raw deployment type string (typically from env var)
|
|
14
|
+
* @returns Valid DeploymentTypeEnum value
|
|
15
|
+
* @throws Error if value is not a valid DeploymentTypeEnum
|
|
16
|
+
*/
|
|
17
|
+
export function parseDeploymentType(value) {
|
|
18
|
+
if (!value || value === "") {
|
|
19
|
+
return DeploymentTypeEnum.CLOUD;
|
|
20
|
+
}
|
|
21
|
+
if (!Object.values(DeploymentTypeEnum).includes(value)) {
|
|
22
|
+
throw new Error(`Invalid SUPERBLOCKS_DEPLOYMENT_TYPE: "${value}". ` +
|
|
23
|
+
`Valid values are: ${Object.values(DeploymentTypeEnum).join(", ")}.`);
|
|
24
|
+
}
|
|
25
|
+
return value;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=deployment-type.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deployment-type.js","sourceRoot":"","sources":["../../src/common/deployment-type.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB,CACjC,KAAyB;IAEzB,IAAI,CAAC,KAAK,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;QAC3B,OAAO,kBAAkB,CAAC,KAAK,CAAC;IAClC,CAAC;IACD,IACE,CAAC,MAAM,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,QAAQ,CAAC,KAA2B,CAAC,EACxE,CAAC;QACD,MAAM,IAAI,KAAK,CACb,yCAAyC,KAAK,KAAK;YACjD,qBAAqB,MAAM,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CACvE,CAAC;IACJ,CAAC;IACD,OAAO,KAA2B,CAAC;AACrC,CAAC"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Telemetry Guardrails
|
|
3
|
+
*
|
|
4
|
+
* Lint-time guardrails to detect forbidden or high-cardinality attributes.
|
|
5
|
+
*
|
|
6
|
+
* NOTE: In the tiered telemetry architecture, the OTEL Collector handles
|
|
7
|
+
* runtime filtering and sanitization. These guardrails are for:
|
|
8
|
+
* - ESLint rules (static analysis)
|
|
9
|
+
* - Development warnings (not enforcement)
|
|
10
|
+
* - CI validation
|
|
11
|
+
*
|
|
12
|
+
* See obs/otel-collector/config-tiered.yaml for runtime enforcement.
|
|
13
|
+
*/
|
|
14
|
+
import type { Attributes } from '@opentelemetry/api';
|
|
15
|
+
/**
|
|
16
|
+
* Guardrail violation types.
|
|
17
|
+
*/
|
|
18
|
+
export declare enum ViolationType {
|
|
19
|
+
/** Attribute is forbidden in Tier 2 */
|
|
20
|
+
FORBIDDEN_ATTRIBUTE = "forbidden_attribute",
|
|
21
|
+
/** Attribute should be a resource attribute, not span attribute */
|
|
22
|
+
RESOURCE_ONLY = "resource_only",
|
|
23
|
+
/** Value contains forbidden pattern (JWT, API key, etc.) */
|
|
24
|
+
FORBIDDEN_VALUE = "forbidden_value",
|
|
25
|
+
/** Attribute value has too high cardinality */
|
|
26
|
+
HIGH_CARDINALITY = "high_cardinality"
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Guardrail violation record.
|
|
30
|
+
*/
|
|
31
|
+
export interface GuardrailViolation {
|
|
32
|
+
/** Type of violation */
|
|
33
|
+
type: ViolationType;
|
|
34
|
+
/** Attribute key that violated */
|
|
35
|
+
attributeKey: string;
|
|
36
|
+
/** Human-readable message */
|
|
37
|
+
message: string;
|
|
38
|
+
/** Severity level */
|
|
39
|
+
severity: 'error' | 'warning';
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Mode for guardrail reporting.
|
|
43
|
+
*
|
|
44
|
+
* NOTE: Runtime filtering is handled by the OTEL Collector.
|
|
45
|
+
* These modes are for lint-time/development feedback only.
|
|
46
|
+
*/
|
|
47
|
+
export declare enum GuardrailMode {
|
|
48
|
+
/** Log violations as warnings (development) */
|
|
49
|
+
WARN = "warn",
|
|
50
|
+
/** Throw on violations (CI/strict mode) */
|
|
51
|
+
STRICT = "strict"
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Options for guardrail validation.
|
|
55
|
+
*/
|
|
56
|
+
export interface GuardrailOptions {
|
|
57
|
+
/** Reporting mode */
|
|
58
|
+
mode: GuardrailMode;
|
|
59
|
+
/** Whether to check for high-cardinality values */
|
|
60
|
+
checkCardinality?: boolean;
|
|
61
|
+
/** Maximum allowed cardinality for string values */
|
|
62
|
+
maxCardinalityLength?: number;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Validate span attributes against Tier 2 guardrails.
|
|
66
|
+
*
|
|
67
|
+
* This is for lint-time validation. Runtime filtering is handled by Collector.
|
|
68
|
+
*
|
|
69
|
+
* @param attributes - Attributes to validate
|
|
70
|
+
* @param options - Guardrail options
|
|
71
|
+
* @returns Array of violations found
|
|
72
|
+
*/
|
|
73
|
+
export declare function validateSpanAttributes(attributes: Attributes, options?: Partial<GuardrailOptions>): GuardrailViolation[];
|
|
74
|
+
/**
|
|
75
|
+
* Validate metric labels against Tier 2 guardrails.
|
|
76
|
+
*
|
|
77
|
+
* @param labels - Metric labels to validate
|
|
78
|
+
* @param options - Guardrail options
|
|
79
|
+
* @returns Array of violations found
|
|
80
|
+
*/
|
|
81
|
+
export declare function validateMetricLabels(labels: Record<string, string | number | boolean>, options?: Partial<GuardrailOptions>): GuardrailViolation[];
|
|
82
|
+
/**
|
|
83
|
+
* Report guardrail violations.
|
|
84
|
+
*
|
|
85
|
+
* NOTE: This is for development feedback only. Runtime filtering
|
|
86
|
+
* is handled by the OTEL Collector.
|
|
87
|
+
*
|
|
88
|
+
* @param attributes - Attributes to check
|
|
89
|
+
* @param options - Guardrail options
|
|
90
|
+
* @throws Error in STRICT mode if violations found
|
|
91
|
+
*/
|
|
92
|
+
export declare function reportViolations(attributes: Attributes, options?: Partial<GuardrailOptions>): void;
|
|
93
|
+
/**
|
|
94
|
+
* Check if an attribute key is allowed in Tier 2.
|
|
95
|
+
* Convenience function for quick checks.
|
|
96
|
+
*
|
|
97
|
+
* @param key - Attribute key
|
|
98
|
+
* @returns true if allowed
|
|
99
|
+
*/
|
|
100
|
+
export declare function isTier2Allowed(key: string): boolean;
|
|
101
|
+
/**
|
|
102
|
+
* Check if an attribute should be hashed (by Collector).
|
|
103
|
+
*
|
|
104
|
+
* @param key - Attribute key
|
|
105
|
+
* @returns true if should be hashed
|
|
106
|
+
*/
|
|
107
|
+
export declare function shouldHash(key: string): boolean;
|
|
108
|
+
/**
|
|
109
|
+
* Get all forbidden attribute names (for documentation/linting).
|
|
110
|
+
*/
|
|
111
|
+
export declare function getForbiddenAttributes(): string[];
|
|
112
|
+
/**
|
|
113
|
+
* Get all hashed attribute names (for documentation/linting).
|
|
114
|
+
*/
|
|
115
|
+
export declare function getHashedAttributes(): string[];
|
|
116
|
+
//# sourceMappingURL=guardrails.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guardrails.d.ts","sourceRoot":"","sources":["../../src/common/guardrails.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AASrD;;GAEG;AACH,oBAAY,aAAa;IACvB,uCAAuC;IACvC,mBAAmB,wBAAwB;IAC3C,mEAAmE;IACnE,aAAa,kBAAkB;IAC/B,4DAA4D;IAC5D,eAAe,oBAAoB;IACnC,+CAA+C;IAC/C,gBAAgB,qBAAqB;CACtC;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,wBAAwB;IACxB,IAAI,EAAE,aAAa,CAAC;IACpB,kCAAkC;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,6BAA6B;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,qBAAqB;IACrB,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;CAC/B;AAED;;;;;GAKG;AACH,oBAAY,aAAa;IACvB,+CAA+C;IAC/C,IAAI,SAAS;IACb,2CAA2C;IAC3C,MAAM,WAAW;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,qBAAqB;IACrB,IAAI,EAAE,aAAa,CAAC;IACpB,mDAAmD;IACnD,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,oDAAoD;IACpD,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAQD;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,UAAU,EACtB,OAAO,GAAE,OAAO,CAAC,gBAAgB,CAAM,GACtC,kBAAkB,EAAE,CAqDtB;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,EACjD,OAAO,GAAE,OAAO,CAAC,gBAAgB,CAAM,GACtC,kBAAkB,EAAE,CAGtB;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,UAAU,EACtB,OAAO,GAAE,OAAO,CAAC,gBAAgB,CAAM,GACtC,IAAI,CAuBN;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAMnD;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAE/C;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,EAAE,CAEjD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,EAAE,CAE9C"}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Telemetry Guardrails
|
|
3
|
+
*
|
|
4
|
+
* Lint-time guardrails to detect forbidden or high-cardinality attributes.
|
|
5
|
+
*
|
|
6
|
+
* NOTE: In the tiered telemetry architecture, the OTEL Collector handles
|
|
7
|
+
* runtime filtering and sanitization. These guardrails are for:
|
|
8
|
+
* - ESLint rules (static analysis)
|
|
9
|
+
* - Development warnings (not enforcement)
|
|
10
|
+
* - CI validation
|
|
11
|
+
*
|
|
12
|
+
* See obs/otel-collector/config-tiered.yaml for runtime enforcement.
|
|
13
|
+
*/
|
|
14
|
+
import { TIER2_FORBIDDEN_ATTRIBUTES, TIER2_HASHED_ATTRIBUTES, TIER2_DROPPED_ATTRIBUTES, containsForbiddenPattern, } from './contracts/tier2-traces.js';
|
|
15
|
+
import { RESOURCE_ONLY_ATTRIBUTES } from './resource.js';
|
|
16
|
+
/**
|
|
17
|
+
* Guardrail violation types.
|
|
18
|
+
*/
|
|
19
|
+
export var ViolationType;
|
|
20
|
+
(function (ViolationType) {
|
|
21
|
+
/** Attribute is forbidden in Tier 2 */
|
|
22
|
+
ViolationType["FORBIDDEN_ATTRIBUTE"] = "forbidden_attribute";
|
|
23
|
+
/** Attribute should be a resource attribute, not span attribute */
|
|
24
|
+
ViolationType["RESOURCE_ONLY"] = "resource_only";
|
|
25
|
+
/** Value contains forbidden pattern (JWT, API key, etc.) */
|
|
26
|
+
ViolationType["FORBIDDEN_VALUE"] = "forbidden_value";
|
|
27
|
+
/** Attribute value has too high cardinality */
|
|
28
|
+
ViolationType["HIGH_CARDINALITY"] = "high_cardinality";
|
|
29
|
+
})(ViolationType || (ViolationType = {}));
|
|
30
|
+
/**
|
|
31
|
+
* Mode for guardrail reporting.
|
|
32
|
+
*
|
|
33
|
+
* NOTE: Runtime filtering is handled by the OTEL Collector.
|
|
34
|
+
* These modes are for lint-time/development feedback only.
|
|
35
|
+
*/
|
|
36
|
+
export var GuardrailMode;
|
|
37
|
+
(function (GuardrailMode) {
|
|
38
|
+
/** Log violations as warnings (development) */
|
|
39
|
+
GuardrailMode["WARN"] = "warn";
|
|
40
|
+
/** Throw on violations (CI/strict mode) */
|
|
41
|
+
GuardrailMode["STRICT"] = "strict";
|
|
42
|
+
})(GuardrailMode || (GuardrailMode = {}));
|
|
43
|
+
const DEFAULT_OPTIONS = {
|
|
44
|
+
mode: GuardrailMode.WARN,
|
|
45
|
+
checkCardinality: true,
|
|
46
|
+
maxCardinalityLength: 200,
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* Validate span attributes against Tier 2 guardrails.
|
|
50
|
+
*
|
|
51
|
+
* This is for lint-time validation. Runtime filtering is handled by Collector.
|
|
52
|
+
*
|
|
53
|
+
* @param attributes - Attributes to validate
|
|
54
|
+
* @param options - Guardrail options
|
|
55
|
+
* @returns Array of violations found
|
|
56
|
+
*/
|
|
57
|
+
export function validateSpanAttributes(attributes, options = {}) {
|
|
58
|
+
const opts = { ...DEFAULT_OPTIONS, ...options };
|
|
59
|
+
const violations = [];
|
|
60
|
+
for (const [key, value] of Object.entries(attributes)) {
|
|
61
|
+
// Check for forbidden attributes
|
|
62
|
+
if (TIER2_FORBIDDEN_ATTRIBUTES.has(key)) {
|
|
63
|
+
violations.push({
|
|
64
|
+
type: ViolationType.FORBIDDEN_ATTRIBUTE,
|
|
65
|
+
attributeKey: key,
|
|
66
|
+
message: `Attribute '${key}' is forbidden in Tier 2 telemetry. ` +
|
|
67
|
+
`Collector will filter this at runtime.`,
|
|
68
|
+
severity: 'warning',
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
// Check for resource-only attributes
|
|
72
|
+
if (RESOURCE_ONLY_ATTRIBUTES.has(key)) {
|
|
73
|
+
violations.push({
|
|
74
|
+
type: ViolationType.RESOURCE_ONLY,
|
|
75
|
+
attributeKey: key,
|
|
76
|
+
message: `Attribute '${key}' should be a RESOURCE attribute, not a span attribute. ` +
|
|
77
|
+
`Set it in initNodeTelemetry() config, not per-span.`,
|
|
78
|
+
severity: 'warning',
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
// Check for forbidden value patterns
|
|
82
|
+
if (containsForbiddenPattern(value)) {
|
|
83
|
+
violations.push({
|
|
84
|
+
type: ViolationType.FORBIDDEN_VALUE,
|
|
85
|
+
attributeKey: key,
|
|
86
|
+
message: `Attribute '${key}' contains a forbidden pattern (JWT, API key, etc.). ` +
|
|
87
|
+
`Collector will filter this at runtime.`,
|
|
88
|
+
severity: 'warning',
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
// Check for high cardinality
|
|
92
|
+
if (opts.checkCardinality && typeof value === 'string') {
|
|
93
|
+
if (value.length > opts.maxCardinalityLength) {
|
|
94
|
+
violations.push({
|
|
95
|
+
type: ViolationType.HIGH_CARDINALITY,
|
|
96
|
+
attributeKey: key,
|
|
97
|
+
message: `Attribute '${key}' has a very long value (${value.length} chars). ` +
|
|
98
|
+
`This may cause high cardinality. Consider using a shorter, normalized value.`,
|
|
99
|
+
severity: 'warning',
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return violations;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Validate metric labels against Tier 2 guardrails.
|
|
108
|
+
*
|
|
109
|
+
* @param labels - Metric labels to validate
|
|
110
|
+
* @param options - Guardrail options
|
|
111
|
+
* @returns Array of violations found
|
|
112
|
+
*/
|
|
113
|
+
export function validateMetricLabels(labels, options = {}) {
|
|
114
|
+
// Metric labels use the same rules as span attributes
|
|
115
|
+
return validateSpanAttributes(labels, options);
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Report guardrail violations.
|
|
119
|
+
*
|
|
120
|
+
* NOTE: This is for development feedback only. Runtime filtering
|
|
121
|
+
* is handled by the OTEL Collector.
|
|
122
|
+
*
|
|
123
|
+
* @param attributes - Attributes to check
|
|
124
|
+
* @param options - Guardrail options
|
|
125
|
+
* @throws Error in STRICT mode if violations found
|
|
126
|
+
*/
|
|
127
|
+
export function reportViolations(attributes, options = {}) {
|
|
128
|
+
const opts = { ...DEFAULT_OPTIONS, ...options };
|
|
129
|
+
const violations = validateSpanAttributes(attributes, opts);
|
|
130
|
+
if (violations.length === 0) {
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
switch (opts.mode) {
|
|
134
|
+
case GuardrailMode.STRICT: {
|
|
135
|
+
throw new Error(`Guardrail violations found:\n` +
|
|
136
|
+
violations.map(v => ` - ${v.message}`).join('\n'));
|
|
137
|
+
}
|
|
138
|
+
case GuardrailMode.WARN: {
|
|
139
|
+
violations.forEach(v => {
|
|
140
|
+
console.warn(`[Guardrail] ${v.message}`);
|
|
141
|
+
});
|
|
142
|
+
break;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Check if an attribute key is allowed in Tier 2.
|
|
148
|
+
* Convenience function for quick checks.
|
|
149
|
+
*
|
|
150
|
+
* @param key - Attribute key
|
|
151
|
+
* @returns true if allowed
|
|
152
|
+
*/
|
|
153
|
+
export function isTier2Allowed(key) {
|
|
154
|
+
return (!TIER2_FORBIDDEN_ATTRIBUTES.has(key) &&
|
|
155
|
+
!TIER2_DROPPED_ATTRIBUTES.has(key) &&
|
|
156
|
+
!RESOURCE_ONLY_ATTRIBUTES.has(key));
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Check if an attribute should be hashed (by Collector).
|
|
160
|
+
*
|
|
161
|
+
* @param key - Attribute key
|
|
162
|
+
* @returns true if should be hashed
|
|
163
|
+
*/
|
|
164
|
+
export function shouldHash(key) {
|
|
165
|
+
return TIER2_HASHED_ATTRIBUTES.has(key);
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Get all forbidden attribute names (for documentation/linting).
|
|
169
|
+
*/
|
|
170
|
+
export function getForbiddenAttributes() {
|
|
171
|
+
return [...TIER2_FORBIDDEN_ATTRIBUTES];
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Get all hashed attribute names (for documentation/linting).
|
|
175
|
+
*/
|
|
176
|
+
export function getHashedAttributes() {
|
|
177
|
+
return [...TIER2_HASHED_ATTRIBUTES];
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=guardrails.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guardrails.js","sourceRoot":"","sources":["../../src/common/guardrails.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Common Telemetry Utilities
|
|
3
|
+
*
|
|
4
|
+
* Shared utilities for resource building and policy evaluation.
|
|
5
|
+
*
|
|
6
|
+
* NOTE: Sanitization and routing are handled by the OTEL Collector
|
|
7
|
+
* in the tiered telemetry architecture. See obs/otel-collector/config-tiered.yaml.
|
|
8
|
+
*/
|
|
9
|
+
export * from "./deployment-type.js";
|
|
10
|
+
export * from "./resource.js";
|
|
11
|
+
export * from "./policy-evaluator.js";
|
|
12
|
+
export * from "./guardrails.js";
|
|
13
|
+
export * from "./contracts/tier2-traces.js";
|
|
14
|
+
export * from "./log-sanitizer.js";
|
|
15
|
+
export * from "./tier-hints.js";
|
|
16
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/common/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,cAAc,sBAAsB,CAAC;AACrC,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AACtC,cAAc,iBAAiB,CAAC;AAChC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Common Telemetry Utilities
|
|
3
|
+
*
|
|
4
|
+
* Shared utilities for resource building and policy evaluation.
|
|
5
|
+
*
|
|
6
|
+
* NOTE: Sanitization and routing are handled by the OTEL Collector
|
|
7
|
+
* in the tiered telemetry architecture. See obs/otel-collector/config-tiered.yaml.
|
|
8
|
+
*/
|
|
9
|
+
export * from "./deployment-type.js";
|
|
10
|
+
export * from "./resource.js";
|
|
11
|
+
export * from "./policy-evaluator.js";
|
|
12
|
+
export * from "./guardrails.js";
|
|
13
|
+
export * from "./contracts/tier2-traces.js";
|
|
14
|
+
export * from "./log-sanitizer.js";
|
|
15
|
+
export * from "./tier-hints.js";
|
|
16
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/common/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,cAAc,sBAAsB,CAAC;AACrC,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AACtC,cAAc,iBAAiB,CAAC;AAChC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC"}
|