@qlever-llc/trellis 0.10.11 → 0.10.12

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.
Files changed (110) hide show
  1. package/esm/errors/TrellisError.d.ts +3 -3
  2. package/esm/errors/TrellisError.js +3 -3
  3. package/esm/server/internal_jobs/job-manager.d.ts.map +1 -1
  4. package/esm/server/internal_jobs/job-manager.js +32 -1
  5. package/esm/server/runtime.d.ts +3 -0
  6. package/esm/server/runtime.d.ts.map +1 -1
  7. package/esm/server/service.d.ts +15 -0
  8. package/esm/server/service.d.ts.map +1 -1
  9. package/esm/server/service.js +8 -0
  10. package/esm/server.d.ts.map +1 -1
  11. package/esm/server.js +54 -6
  12. package/esm/service/deno.d.ts +1 -1
  13. package/esm/service/deno.d.ts.map +1 -1
  14. package/esm/service/mod.d.ts +1 -1
  15. package/esm/service/mod.d.ts.map +1 -1
  16. package/esm/service/node.d.ts +1 -1
  17. package/esm/service/node.d.ts.map +1 -1
  18. package/esm/service/outbox_inbox.d.ts.map +1 -1
  19. package/esm/service/outbox_inbox.js +14 -0
  20. package/esm/telemetry/core.d.ts.map +1 -1
  21. package/esm/telemetry/core.js +1 -1
  22. package/esm/telemetry/env.d.ts.map +1 -1
  23. package/esm/telemetry/env.js +6 -1
  24. package/esm/telemetry/init.d.ts +3 -0
  25. package/esm/telemetry/init.d.ts.map +1 -0
  26. package/esm/telemetry/init.js +7 -0
  27. package/esm/telemetry/metrics.d.ts +34 -0
  28. package/esm/telemetry/metrics.d.ts.map +1 -0
  29. package/esm/telemetry/metrics.js +181 -0
  30. package/esm/telemetry/mod.d.ts +3 -0
  31. package/esm/telemetry/mod.d.ts.map +1 -1
  32. package/esm/telemetry/mod.js +2 -0
  33. package/esm/telemetry/runtime.d.ts +2 -0
  34. package/esm/telemetry/runtime.d.ts.map +1 -0
  35. package/esm/telemetry/runtime.js +134 -0
  36. package/esm/telemetry.d.ts +3 -0
  37. package/esm/telemetry.d.ts.map +1 -0
  38. package/esm/telemetry.js +2 -0
  39. package/esm/transfer.d.ts.map +1 -1
  40. package/esm/transfer.js +27 -16
  41. package/esm/trellis.d.ts.map +1 -1
  42. package/esm/trellis.js +460 -56
  43. package/package.json +7 -5
  44. package/script/errors/TrellisError.d.ts +3 -3
  45. package/script/errors/TrellisError.js +3 -3
  46. package/script/server/internal_jobs/job-manager.d.ts.map +1 -1
  47. package/script/server/internal_jobs/job-manager.js +32 -1
  48. package/script/server/runtime.d.ts +3 -0
  49. package/script/server/runtime.d.ts.map +1 -1
  50. package/script/server/service.d.ts +15 -0
  51. package/script/server/service.d.ts.map +1 -1
  52. package/script/server/service.js +8 -0
  53. package/script/server.d.ts.map +1 -1
  54. package/script/server.js +54 -6
  55. package/script/service/deno.d.ts +1 -1
  56. package/script/service/deno.d.ts.map +1 -1
  57. package/script/service/mod.d.ts +1 -1
  58. package/script/service/mod.d.ts.map +1 -1
  59. package/script/service/node.d.ts +1 -1
  60. package/script/service/node.d.ts.map +1 -1
  61. package/script/service/outbox_inbox.d.ts.map +1 -1
  62. package/script/service/outbox_inbox.js +14 -0
  63. package/script/telemetry/core.d.ts.map +1 -1
  64. package/script/telemetry/core.js +1 -1
  65. package/script/telemetry/env.d.ts.map +1 -1
  66. package/script/telemetry/env.js +6 -1
  67. package/script/telemetry/init.d.ts +3 -0
  68. package/script/telemetry/init.d.ts.map +1 -0
  69. package/script/telemetry/init.js +10 -0
  70. package/script/telemetry/metrics.d.ts +34 -0
  71. package/script/telemetry/metrics.d.ts.map +1 -0
  72. package/script/telemetry/metrics.js +186 -0
  73. package/script/telemetry/mod.d.ts +3 -0
  74. package/script/telemetry/mod.d.ts.map +1 -1
  75. package/script/telemetry/mod.js +7 -1
  76. package/script/telemetry/runtime.d.ts +2 -0
  77. package/script/telemetry/runtime.d.ts.map +1 -0
  78. package/script/telemetry/runtime.js +137 -0
  79. package/script/telemetry.d.ts +3 -0
  80. package/script/telemetry.d.ts.map +1 -0
  81. package/script/telemetry.js +18 -0
  82. package/script/transfer.d.ts.map +1 -1
  83. package/script/transfer.js +28 -17
  84. package/script/trellis.d.ts.map +1 -1
  85. package/script/trellis.js +490 -86
  86. package/src/errors/TrellisError.ts +4 -4
  87. package/src/server/internal_jobs/job-manager.ts +35 -5
  88. package/src/server/runtime.ts +4 -0
  89. package/src/server/service.ts +27 -0
  90. package/src/server.ts +66 -11
  91. package/src/service/deno.ts +1 -0
  92. package/src/service/mod.ts +1 -0
  93. package/src/service/node.ts +1 -0
  94. package/src/service/outbox_inbox.ts +14 -0
  95. package/src/telemetry/core.ts +1 -1
  96. package/src/telemetry/env.ts +5 -1
  97. package/src/telemetry/init.ts +8 -0
  98. package/src/telemetry/metrics.ts +294 -0
  99. package/src/telemetry/mod.ts +7 -0
  100. package/src/telemetry/runtime.ts +218 -0
  101. package/src/telemetry.ts +2 -0
  102. package/src/transfer.ts +69 -30
  103. package/src/trellis.ts +487 -88
  104. package/esm/tracing.d.ts +0 -5
  105. package/esm/tracing.d.ts.map +0 -1
  106. package/esm/tracing.js +0 -8
  107. package/script/tracing.d.ts +0 -5
  108. package/script/tracing.d.ts.map +0 -1
  109. package/script/tracing.js +0 -27
  110. package/src/tracing.ts +0 -28
@@ -21,6 +21,7 @@ exports.outboxMessageToPrepared = outboxMessageToPrepared;
21
21
  const result_1 = require("@qlever-llc/result");
22
22
  const typebox_1 = require("typebox");
23
23
  const kv_js_1 = require("../kv.js");
24
+ const mod_js_1 = require("../telemetry/mod.js");
24
25
  exports.defaultSqlOutboxTables = Object.freeze({
25
26
  outbox: "trellis_outbox",
26
27
  inbox: "trellis_inbox",
@@ -554,6 +555,12 @@ _OutboxDispatcher_repository = new WeakMap(), _OutboxDispatcher_runtime = new We
554
555
  });
555
556
  }
556
557
  catch (error) {
558
+ (0, mod_js_1.recordTrellisError)(error, {
559
+ surface: "outbox",
560
+ direction: "dispatcher",
561
+ operation: "batch",
562
+ phase: "dispatch",
563
+ });
557
564
  __classPrivateFieldGet(this, _OutboxDispatcher_instances, "m", _OutboxDispatcher_scheduleRetryWakeup).call(this);
558
565
  try {
559
566
  __classPrivateFieldGet(this, _OutboxDispatcher_options, "f").onError?.(error);
@@ -590,6 +597,13 @@ async function dispatchOutbox(repository, runtime, options = {}) {
590
597
  const result = await runtime.publishPrepared(outboxMessageToPrepared(message));
591
598
  const value = result.take();
592
599
  if ((0, result_1.isErr)(value)) {
600
+ (0, mod_js_1.recordTrellisError)(value.error, {
601
+ surface: "outbox",
602
+ direction: "dispatcher",
603
+ operation: message.event,
604
+ phase: "publish",
605
+ messagingSystem: "nats",
606
+ });
593
607
  failed += 1;
594
608
  await repository.markFailed(message.id, {
595
609
  error: value.error.message,
@@ -1 +1 @@
1
- {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../src/telemetry/core.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,EACZ,OAAO,EACP,KAAK,IAAI,EACT,QAAQ,EACR,cAAc,EACd,KAAK,EACL,KAAK,MAAM,EACZ,MAAM,oBAAoB,CAAC;AAE5B,wBAAgB,SAAS,CAAC,KAAK,SAAgC,GAAG,MAAM,CAEvE;AAED,wBAAgB,aAAa,IAAI,IAAI,GAAG,SAAS,CAEhD;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAEtD;AAED,wBAAsB,aAAa,CAAC,CAAC,EACnC,IAAI,EAAE,IAAI,EACV,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACnB,OAAO,CAAC,CAAC,CAAC,CAEZ;AAED,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC;AACpD,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC"}
1
+ {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../src/telemetry/core.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,EACZ,OAAO,EACP,KAAK,IAAI,EACT,QAAQ,EACR,cAAc,EACd,KAAK,EACL,KAAK,MAAM,EACZ,MAAM,oBAAoB,CAAC;AAE5B,wBAAgB,SAAS,CAAC,KAAK,SAAkC,GAAG,MAAM,CAEzE;AAED,wBAAgB,aAAa,IAAI,IAAI,GAAG,SAAS,CAEhD;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAEtD;AAED,wBAAsB,aAAa,CAAC,CAAC,EACnC,IAAI,EAAE,IAAI,EACV,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACnB,OAAO,CAAC,CAAC,CAAC,CAEZ;AAED,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC;AACpD,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC"}
@@ -10,7 +10,7 @@ Object.defineProperty(exports, "context", { enumerable: true, get: function () {
10
10
  Object.defineProperty(exports, "SpanKind", { enumerable: true, get: function () { return api_1.SpanKind; } });
11
11
  Object.defineProperty(exports, "SpanStatusCode", { enumerable: true, get: function () { return api_1.SpanStatusCode; } });
12
12
  Object.defineProperty(exports, "trace", { enumerable: true, get: function () { return api_1.trace; } });
13
- function getTracer(scope = "@qlever-llc/trellis/tracing") {
13
+ function getTracer(scope = "@qlever-llc/trellis/telemetry") {
14
14
  return api_1.trace.getTracer(scope);
15
15
  }
16
16
  function getActiveSpan() {
@@ -1 +1 @@
1
- {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/telemetry/env.ts"],"names":[],"mappings":"AAYA,wBAAgB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAUtD"}
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/telemetry/env.ts"],"names":[],"mappings":"AAYA,wBAAgB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CActD"}
@@ -39,7 +39,12 @@ const dntShim = __importStar(require("../_dnt.shims.js"));
39
39
  function getEnv(key) {
40
40
  const deno = dntShim.dntGlobalThis;
41
41
  if (deno.Deno?.env?.get) {
42
- return deno.Deno.env.get(key);
42
+ try {
43
+ return deno.Deno.env.get(key);
44
+ }
45
+ catch {
46
+ return undefined;
47
+ }
43
48
  }
44
49
  const processGlobal = dntShim.dntGlobalThis;
45
50
  return processGlobal.process?.env?.[key];
@@ -0,0 +1,3 @@
1
+ /** Initializes Trellis telemetry for a service runtime. */
2
+ export declare function initTelemetry(serviceName: string): void;
3
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/telemetry/init.ts"],"names":[],"mappings":"AAGA,2DAA2D;AAC3D,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAGvD"}
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.initTelemetry = initTelemetry;
4
+ const result_js_1 = require("./result.js");
5
+ const runtime_js_1 = require("./runtime.js");
6
+ /** Initializes Trellis telemetry for a service runtime. */
7
+ function initTelemetry(serviceName) {
8
+ (0, result_js_1.configureErrorTraceId)();
9
+ (0, runtime_js_1.initTelemetryRuntime)(serviceName);
10
+ }
@@ -0,0 +1,34 @@
1
+ import { type Meter } from "@opentelemetry/api";
2
+ /** Low-cardinality attributes accepted by {@link recordTrellisError}. */
3
+ export type TrellisErrorMetricAttributes = {
4
+ /** Stable Trellis surface name, such as `rpc`, `jobs`, or `operations`. */
5
+ surface?: string;
6
+ /** Stable flow direction such as `client`, `server`, `publish`, or `consume`. */
7
+ direction?: string;
8
+ /** Stable operation kind or method name. Do not pass IDs, subjects, or URLs. */
9
+ operation?: string;
10
+ /** Stable lifecycle phase such as `encode`, `send`, `auth`, or `handler`. */
11
+ phase?: string;
12
+ /** Stable local Trellis error type override when the thrown value does not expose one. */
13
+ errorType?: string;
14
+ /** Stable wrapped remote Trellis error type override. */
15
+ remoteErrorType?: string;
16
+ /** Stable auth failure reason, such as `missing_session_key`. */
17
+ authReason?: string;
18
+ /** Static messaging system name, when already known. */
19
+ messagingSystem?: string;
20
+ /** Static messaging operation name, when already known. */
21
+ messagingOperation?: string;
22
+ };
23
+ /** Returns the shared Trellis OpenTelemetry meter. */
24
+ export declare function getTrellisMeter(): Meter;
25
+ /** Records one Trellis error with only stable, low-cardinality attributes. */
26
+ export declare function recordTrellisError(error: unknown, attributes?: TrellisErrorMetricAttributes): void;
27
+ /**
28
+ * Builds sanitized, low-cardinality attributes for `trellis.errors`.
29
+ *
30
+ * @internal Exported for focused tests; runtime callers should use
31
+ * {@link recordTrellisError}.
32
+ */
33
+ export declare function buildTrellisErrorMetricAttributes(error: unknown, attributes?: TrellisErrorMetricAttributes): Record<string, string>;
34
+ //# sourceMappingURL=metrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/telemetry/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,KAAK,EAAW,MAAM,oBAAoB,CAAC;AAiDzD,yEAAyE;AACzE,MAAM,MAAM,4BAA4B,GAAG;IACzC,2EAA2E;IAC3E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iFAAiF;IACjF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gFAAgF;IAChF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6EAA6E;IAC7E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0FAA0F;IAC1F,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yDAAyD;IACzD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iEAAiE;IACjE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wDAAwD;IACxD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,2DAA2D;IAC3D,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC;AASF,sDAAsD;AACtD,wBAAgB,eAAe,IAAI,KAAK,CAEvC;AAED,8EAA8E;AAC9E,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,OAAO,EACd,UAAU,GAAE,4BAAiC,GAC5C,IAAI,CAWN;AAED;;;;;GAKG;AACH,wBAAgB,iCAAiC,CAC/C,KAAK,EAAE,OAAO,EACd,UAAU,GAAE,4BAAiC,GAC5C,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAsDxB"}
@@ -0,0 +1,186 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getTrellisMeter = getTrellisMeter;
4
+ exports.recordTrellisError = recordTrellisError;
5
+ exports.buildTrellisErrorMetricAttributes = buildTrellisErrorMetricAttributes;
6
+ const api_1 = require("@opentelemetry/api");
7
+ const TRELLIS_METER_NAME = "@qlever-llc/trellis";
8
+ const MAX_ATTRIBUTE_LENGTH = 96;
9
+ const LOW_CARDINALITY_PATTERN = /^[A-Za-z0-9_.:-]+$/;
10
+ const UUID_PATTERN = /(^|[_.:-])[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}($|[_.:-])/i;
11
+ const ULID_PATTERN = /(^|[_.:-])[0-7][0-9A-HJKMNP-TV-Z]{25}($|[_.:-])/i;
12
+ const LONG_HEX_SEGMENT_PATTERN = /(^|[_.:-])[0-9a-f]{12,}($|[_.:-])/i;
13
+ const TRELLIS_SUBJECT_PREFIX_PATTERN = /^(rpc|events|feeds|operations|jobs|state|kv|store|resources|transfer)\.v\d+\./;
14
+ const AUTH_REASONS = new Set([
15
+ "invalid_request",
16
+ "missing_session_key",
17
+ "missing_proof",
18
+ "session_not_found",
19
+ "session_expired",
20
+ "invalid_signature",
21
+ "user_not_found",
22
+ "user_already_exists",
23
+ "username_taken",
24
+ "identity_already_exists",
25
+ "identity_not_found",
26
+ "user_inactive",
27
+ "unknown_device",
28
+ "device_deployment_not_found",
29
+ "device_deployment_disabled",
30
+ "device_activation_revoked",
31
+ "unknown_service",
32
+ "service_disabled",
33
+ "iat_out_of_range",
34
+ "invalid_binding_token",
35
+ "session_corrupted",
36
+ "session_already_bound",
37
+ "authtoken_already_used",
38
+ "oauth_session_key_mismatch",
39
+ "reply_subject_mismatch",
40
+ "insufficient_permissions",
41
+ "forbidden",
42
+ "last_admin_required",
43
+ "missing_flow_id",
44
+ "device_activation_flow_not_found",
45
+ "device_activation_flow_expired",
46
+ "device_activation_rejected",
47
+ "device_identity_key_mismatch",
48
+ "invalid_device_qr_mac",
49
+ ]);
50
+ /** Returns the shared Trellis OpenTelemetry meter. */
51
+ function getTrellisMeter() {
52
+ return api_1.metrics.getMeter(TRELLIS_METER_NAME);
53
+ }
54
+ /** Records one Trellis error with only stable, low-cardinality attributes. */
55
+ function recordTrellisError(error, attributes = {}) {
56
+ getTrellisMeter().createCounter("trellis.errors", {
57
+ description: "Trellis errors observed by runtime instrumentation.",
58
+ unit: "{error}",
59
+ }).add(1, buildTrellisErrorMetricAttributes(error, attributes));
60
+ }
61
+ /**
62
+ * Builds sanitized, low-cardinality attributes for `trellis.errors`.
63
+ *
64
+ * @internal Exported for focused tests; runtime callers should use
65
+ * {@link recordTrellisError}.
66
+ */
67
+ function buildTrellisErrorMetricAttributes(error, attributes = {}) {
68
+ const serializable = serializableErrorData(error);
69
+ const metricAttributes = {
70
+ "exception.type": exceptionType(error),
71
+ "trellis.error.type": trellisErrorType(error, serializable, attributes.errorType),
72
+ };
73
+ const remoteErrorType = lowCardinalityValue(attributes.remoteErrorType) ??
74
+ remoteSerializableErrorType(serializable);
75
+ if (remoteErrorType) {
76
+ metricAttributes["trellis.remote_error.type"] = remoteErrorType;
77
+ }
78
+ setLowCardinalityAttribute(metricAttributes, "trellis.surface", attributes.surface);
79
+ setLowCardinalityAttribute(metricAttributes, "trellis.direction", attributes.direction);
80
+ setLowCardinalityAttribute(metricAttributes, "trellis.operation", attributes.operation);
81
+ setLowCardinalityAttribute(metricAttributes, "trellis.phase", attributes.phase);
82
+ setLowCardinalityAttribute(metricAttributes, "trellis.auth.reason", boundedAuthReason(attributes.authReason) ?? authReason(serializable));
83
+ setLowCardinalityAttribute(metricAttributes, "messaging.system", attributes.messagingSystem);
84
+ setLowCardinalityAttribute(metricAttributes, "messaging.operation", attributes.messagingOperation);
85
+ return metricAttributes;
86
+ }
87
+ function trellisErrorType(error, serializable, override) {
88
+ const overrideType = lowCardinalityValue(override);
89
+ if (overrideType)
90
+ return overrideType;
91
+ const serializableType = lowCardinalityValue(serializable?.type);
92
+ if (serializableType)
93
+ return serializableType;
94
+ const objectType = objectStringProperty(error, "type");
95
+ if (objectType)
96
+ return objectType;
97
+ return exceptionType(error);
98
+ }
99
+ function exceptionType(error) {
100
+ if (error instanceof Error) {
101
+ const name = lowCardinalityValue(error.name);
102
+ if (name)
103
+ return name;
104
+ }
105
+ const objectType = objectStringProperty(error, "type");
106
+ if (objectType)
107
+ return objectType;
108
+ return "unknown";
109
+ }
110
+ function serializableErrorData(error) {
111
+ const toSerializable = safeProperty(error, "toSerializable");
112
+ if (!isSerializableMethod(toSerializable))
113
+ return undefined;
114
+ try {
115
+ const data = toSerializable.call(error);
116
+ return isRecord(data) ? data : undefined;
117
+ }
118
+ catch {
119
+ return undefined;
120
+ }
121
+ }
122
+ function remoteSerializableErrorType(serializable) {
123
+ const remoteError = safeProperty(serializable, "remoteError");
124
+ if (!isRecord(remoteError))
125
+ return undefined;
126
+ return objectStringProperty(remoteError, "type");
127
+ }
128
+ function authReason(serializable) {
129
+ const type = safeProperty(serializable, "type");
130
+ if (type === "AuthError") {
131
+ return boundedAuthReason(safeProperty(serializable, "reason"));
132
+ }
133
+ if (type === "RemoteError") {
134
+ const remoteError = safeProperty(serializable, "remoteError");
135
+ if (isRecord(remoteError) && objectStringProperty(remoteError, "type") ===
136
+ "AuthError") {
137
+ return boundedAuthReason(safeProperty(remoteError, "reason"));
138
+ }
139
+ }
140
+ return undefined;
141
+ }
142
+ function boundedAuthReason(value) {
143
+ const sanitized = lowCardinalityValue(value);
144
+ if (!sanitized || !AUTH_REASONS.has(sanitized))
145
+ return undefined;
146
+ return sanitized;
147
+ }
148
+ function isRecord(value) {
149
+ return value !== null && typeof value === "object" && !Array.isArray(value);
150
+ }
151
+ function isSerializableMethod(value) {
152
+ return typeof value === "function";
153
+ }
154
+ function safeProperty(value, key) {
155
+ if (!isRecord(value))
156
+ return undefined;
157
+ try {
158
+ return value[key];
159
+ }
160
+ catch {
161
+ return undefined;
162
+ }
163
+ }
164
+ function objectStringProperty(value, key) {
165
+ return lowCardinalityValue(safeProperty(value, key));
166
+ }
167
+ function setLowCardinalityAttribute(attributes, key, value) {
168
+ const sanitized = lowCardinalityValue(value);
169
+ if (sanitized)
170
+ attributes[key] = sanitized;
171
+ }
172
+ function lowCardinalityValue(value) {
173
+ if (typeof value !== "string")
174
+ return undefined;
175
+ const trimmed = value.trim();
176
+ if (trimmed.length === 0 ||
177
+ trimmed.length > MAX_ATTRIBUTE_LENGTH ||
178
+ !LOW_CARDINALITY_PATTERN.test(trimmed) ||
179
+ UUID_PATTERN.test(trimmed) ||
180
+ ULID_PATTERN.test(trimmed) ||
181
+ LONG_HEX_SEGMENT_PATTERN.test(trimmed) ||
182
+ TRELLIS_SUBJECT_PREFIX_PATTERN.test(trimmed)) {
183
+ return undefined;
184
+ }
185
+ return trimmed;
186
+ }
@@ -3,6 +3,9 @@ export { createMapCarrier, extractTraceContext, injectTraceContext, } from "./ca
3
3
  export type { Context, Span } from "./core.js";
4
4
  export { context, getActiveSpan, getTracer, SpanKind, SpanStatusCode, trace, withSpan, withSpanAsync, } from "./core.js";
5
5
  export { getEnv } from "./env.js";
6
+ export { initTelemetry } from "./init.js";
7
+ export { buildTrellisErrorMetricAttributes, getTrellisMeter, recordTrellisError, } from "./metrics.js";
8
+ export type { TrellisErrorMetricAttributes } from "./metrics.js";
6
9
  export type { NatsHeadersLike } from "./nats.js";
7
10
  export { createNatsHeaderCarrier } from "./nats.js";
8
11
  export { configureErrorTraceId } from "./result.js";
@@ -1 +1 @@
1
- {"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../../src/telemetry/mod.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EACL,OAAO,EACP,aAAa,EACb,SAAS,EACT,QAAQ,EACR,cAAc,EACd,KAAK,EACL,QAAQ,EACR,aAAa,GACd,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,YAAY,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,eAAe,GAChB,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../../src/telemetry/mod.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EACL,OAAO,EACP,aAAa,EACb,SAAS,EACT,QAAQ,EACR,cAAc,EACd,KAAK,EACL,QAAQ,EACR,aAAa,GACd,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EACL,iCAAiC,EACjC,eAAe,EACf,kBAAkB,GACnB,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,4BAA4B,EAAE,MAAM,cAAc,CAAC;AACjE,YAAY,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,eAAe,GAChB,MAAM,cAAc,CAAC"}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.startServerSpan = exports.startClientSpan = exports.getTrellisTracer = exports.configureErrorTraceId = exports.createNatsHeaderCarrier = exports.getEnv = exports.withSpanAsync = exports.withSpan = exports.trace = exports.SpanStatusCode = exports.SpanKind = exports.getTracer = exports.getActiveSpan = exports.context = exports.injectTraceContext = exports.extractTraceContext = exports.createMapCarrier = void 0;
3
+ exports.startServerSpan = exports.startClientSpan = exports.getTrellisTracer = exports.configureErrorTraceId = exports.createNatsHeaderCarrier = exports.recordTrellisError = exports.getTrellisMeter = exports.buildTrellisErrorMetricAttributes = exports.initTelemetry = exports.getEnv = exports.withSpanAsync = exports.withSpan = exports.trace = exports.SpanStatusCode = exports.SpanKind = exports.getTracer = exports.getActiveSpan = exports.context = exports.injectTraceContext = exports.extractTraceContext = exports.createMapCarrier = void 0;
4
4
  var carrier_js_1 = require("./carrier.js");
5
5
  Object.defineProperty(exports, "createMapCarrier", { enumerable: true, get: function () { return carrier_js_1.createMapCarrier; } });
6
6
  Object.defineProperty(exports, "extractTraceContext", { enumerable: true, get: function () { return carrier_js_1.extractTraceContext; } });
@@ -16,6 +16,12 @@ Object.defineProperty(exports, "withSpan", { enumerable: true, get: function ()
16
16
  Object.defineProperty(exports, "withSpanAsync", { enumerable: true, get: function () { return core_js_1.withSpanAsync; } });
17
17
  var env_js_1 = require("./env.js");
18
18
  Object.defineProperty(exports, "getEnv", { enumerable: true, get: function () { return env_js_1.getEnv; } });
19
+ var init_js_1 = require("./init.js");
20
+ Object.defineProperty(exports, "initTelemetry", { enumerable: true, get: function () { return init_js_1.initTelemetry; } });
21
+ var metrics_js_1 = require("./metrics.js");
22
+ Object.defineProperty(exports, "buildTrellisErrorMetricAttributes", { enumerable: true, get: function () { return metrics_js_1.buildTrellisErrorMetricAttributes; } });
23
+ Object.defineProperty(exports, "getTrellisMeter", { enumerable: true, get: function () { return metrics_js_1.getTrellisMeter; } });
24
+ Object.defineProperty(exports, "recordTrellisError", { enumerable: true, get: function () { return metrics_js_1.recordTrellisError; } });
19
25
  var nats_js_1 = require("./nats.js");
20
26
  Object.defineProperty(exports, "createNatsHeaderCarrier", { enumerable: true, get: function () { return nats_js_1.createNatsHeaderCarrier; } });
21
27
  var result_js_1 = require("./result.js");
@@ -0,0 +1,2 @@
1
+ export declare function initTelemetryRuntime(serviceName: string): void;
2
+ //# sourceMappingURL=runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/telemetry/runtime.ts"],"names":[],"mappings":"AAmNA,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAM9D"}
@@ -0,0 +1,137 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.initTelemetryRuntime = initTelemetryRuntime;
4
+ const api_1 = require("@opentelemetry/api");
5
+ const env_js_1 = require("./env.js");
6
+ let initialized = false;
7
+ let provider;
8
+ let metricProvider;
9
+ function runtimeImport(specifier) {
10
+ const load = new Function("specifier", "return import(specifier);");
11
+ return load(specifier);
12
+ }
13
+ async function loadTracingRuntime() {
14
+ const [traceNode, otlp, traceBase, resources, semantic] = await Promise.all([
15
+ runtimeImport(["@opentelemetry", "sdk-trace-node"].join("/")),
16
+ runtimeImport(["@opentelemetry", "exporter-trace-otlp-proto"].join("/")),
17
+ runtimeImport(["@opentelemetry", "sdk-trace-base"].join("/")),
18
+ runtimeImport(["@opentelemetry", "resources"].join("/")),
19
+ runtimeImport(["@opentelemetry", "semantic-conventions"].join("/")),
20
+ ]);
21
+ return {
22
+ NodeTracerProvider: traceNode.NodeTracerProvider,
23
+ OTLPTraceExporter: otlp.OTLPTraceExporter,
24
+ BatchSpanProcessor: traceBase.BatchSpanProcessor,
25
+ ConsoleSpanExporter: traceBase.ConsoleSpanExporter,
26
+ resourceFromAttributes: resources.resourceFromAttributes,
27
+ ATTR_SERVICE_NAME: semantic.ATTR_SERVICE_NAME,
28
+ };
29
+ }
30
+ async function loadMetricsRuntime() {
31
+ const [sdkMetrics, otlp, resources, semantic] = await Promise.all([
32
+ runtimeImport(["@opentelemetry", "sdk-metrics"].join("/")),
33
+ runtimeImport(["@opentelemetry", "exporter-metrics-otlp-proto"].join("/")),
34
+ runtimeImport(["@opentelemetry", "resources"].join("/")),
35
+ runtimeImport(["@opentelemetry", "semantic-conventions"].join("/")),
36
+ ]);
37
+ return {
38
+ MeterProvider: sdkMetrics.MeterProvider,
39
+ PeriodicExportingMetricReader: sdkMetrics.PeriodicExportingMetricReader,
40
+ ConsoleMetricExporter: sdkMetrics.ConsoleMetricExporter,
41
+ OTLPMetricExporter: otlp.OTLPMetricExporter,
42
+ resourceFromAttributes: resources.resourceFromAttributes,
43
+ ATTR_SERVICE_NAME: semantic.ATTR_SERVICE_NAME,
44
+ };
45
+ }
46
+ async function initTracingRuntime(serviceName) {
47
+ const endpoint = (0, env_js_1.getEnv)("OTEL_EXPORTER_OTLP_ENDPOINT");
48
+ const consoleTracing = (0, env_js_1.getEnv)("OTEL_TRACES_CONSOLE") === "true";
49
+ if (!endpoint && !consoleTracing) {
50
+ return;
51
+ }
52
+ try {
53
+ const runtime = await loadTracingRuntime();
54
+ const spanProcessors = [];
55
+ if (endpoint) {
56
+ spanProcessors.push(new runtime.BatchSpanProcessor(new runtime.OTLPTraceExporter({ url: `${endpoint}/v1/traces` })));
57
+ }
58
+ if (consoleTracing) {
59
+ spanProcessors.push(new runtime.BatchSpanProcessor(new runtime.ConsoleSpanExporter()));
60
+ }
61
+ const nextProvider = new runtime.NodeTracerProvider({
62
+ resource: runtime.resourceFromAttributes({
63
+ [runtime.ATTR_SERVICE_NAME]: serviceName,
64
+ }),
65
+ ...(spanProcessors.length > 0 ? { spanProcessors } : {}),
66
+ });
67
+ provider = nextProvider;
68
+ nextProvider.register();
69
+ }
70
+ catch (error) {
71
+ console.warn("Failed to initialize tracing runtime", error);
72
+ }
73
+ }
74
+ function metricEndpoint() {
75
+ const metricsEndpoint = (0, env_js_1.getEnv)("OTEL_EXPORTER_OTLP_METRICS_ENDPOINT");
76
+ if (metricsEndpoint)
77
+ return metricsEndpoint;
78
+ const endpoint = (0, env_js_1.getEnv)("OTEL_EXPORTER_OTLP_ENDPOINT");
79
+ if (!endpoint)
80
+ return undefined;
81
+ return `${endpoint.replace(/\/$/, "")}/v1/metrics`;
82
+ }
83
+ function metricExportIntervalMillis() {
84
+ const configured = (0, env_js_1.getEnv)("OTEL_METRIC_EXPORT_INTERVAL");
85
+ if (!configured)
86
+ return undefined;
87
+ const parsed = Number(configured);
88
+ if (!Number.isFinite(parsed) || parsed <= 0)
89
+ return undefined;
90
+ return Math.trunc(parsed);
91
+ }
92
+ async function initMetricsRuntime(serviceName) {
93
+ const endpoint = metricEndpoint();
94
+ const consoleMetrics = (0, env_js_1.getEnv)("TRELLIS_METRICS_CONSOLE") === "true";
95
+ if (!endpoint && !consoleMetrics) {
96
+ return;
97
+ }
98
+ try {
99
+ const runtime = await loadMetricsRuntime();
100
+ const readers = [];
101
+ const exportIntervalMillis = metricExportIntervalMillis();
102
+ if (endpoint) {
103
+ readers.push(new runtime.PeriodicExportingMetricReader({
104
+ exporter: new runtime.OTLPMetricExporter({ url: endpoint }),
105
+ ...(exportIntervalMillis !== undefined
106
+ ? { exportIntervalMillis }
107
+ : {}),
108
+ }));
109
+ }
110
+ if (consoleMetrics) {
111
+ readers.push(new runtime.PeriodicExportingMetricReader({
112
+ exporter: new runtime.ConsoleMetricExporter(),
113
+ ...(exportIntervalMillis !== undefined
114
+ ? { exportIntervalMillis }
115
+ : {}),
116
+ }));
117
+ }
118
+ const nextMetricProvider = new runtime.MeterProvider({
119
+ resource: runtime.resourceFromAttributes({
120
+ [runtime.ATTR_SERVICE_NAME]: serviceName,
121
+ }),
122
+ ...(readers.length > 0 ? { readers } : {}),
123
+ });
124
+ metricProvider = nextMetricProvider;
125
+ api_1.metrics.setGlobalMeterProvider(nextMetricProvider);
126
+ }
127
+ catch (error) {
128
+ console.warn("Failed to initialize metrics runtime", error);
129
+ }
130
+ }
131
+ function initTelemetryRuntime(serviceName) {
132
+ if (initialized)
133
+ return;
134
+ initialized = true;
135
+ void initTracingRuntime(serviceName);
136
+ void initMetricsRuntime(serviceName);
137
+ }
@@ -0,0 +1,3 @@
1
+ import "./_dnt.polyfills.js";
2
+ export * from "./telemetry/mod.js";
3
+ //# sourceMappingURL=telemetry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"AAAA,OAAO,qBAAqB,CAAC;AAC7B,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ require("./_dnt.polyfills.js");
18
+ __exportStar(require("./telemetry/mod.js"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"transfer.d.ts","sourceRoot":"","sources":["../src/transfer.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EAGX,KAAK,MAAM,IAAI,UAAU,EAC1B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAIL,KAAK,OAAO,EACZ,KAAK,cAAc,EAEpB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,IAAI,EAAE,EAAE,KAAK,MAAM,EAAE,MAAM,SAAS,CAAC;AAI5C,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAM1D,eAAO,MAAM,cAAc;;;;;;;EAOzB,CAAC;AAEH,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,cAAc,CAAC,CAAC;AAYrD,eAAO,MAAM,uBAAuB;;;;;;;;;;;;EAQlC,CAAC;AAEH,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;EAIrC,CAAC;AAEH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAG9B,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC,OAAO,uBAAuB,CAAC,CAAC;AACvE,MAAM,MAAM,oBAAoB,GAAG,MAAM,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAC7E,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAE/D,MAAM,MAAM,YAAY,GACpB,UAAU,GACV,WAAW,GACX,cAAc,CAAC,UAAU,CAAC,GAC1B,aAAa,CAAC,UAAU,CAAC,CAAC;AAE9B,KAAK,mBAAmB,GAAG;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,UAAU,CAAC;IACzD,UAAU,CAAC,EAAE,MAAM,MAAM,CAAC;CAC3B,CAAC;AA4NF,cAAM,kBAAkB;;IAKtB,SAAS,aACP,EAAE,EAAE,cAAc,EAClB,IAAI,EAAE,mBAAmB,EACzB,SAAS,EAAE,MAAM;IAOnB,SAAS,KAAK,EAAE,IAAI,cAAc,CAEjC;IAED,SAAS,KAAK,IAAI,IAAI,mBAAmB,CAExC;IAED,SAAS,KAAK,SAAS,IAAI,MAAM,CAEhC;IAED,SAAS,CAAC,aAAa,CACrB,KAAK,EAAE,aAAa,EACpB,SAAS,EAAE,MAAM,GAChB,UAAU,CAAC,IAAI,EAAE,aAAa,CAAC;cAwBlB,YAAY,CAC1B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,UAAU,EACnB,GAAG,CAAC,EAAE,MAAM,EACZ,GAAG,CAAC,EAAE,OAAO,GACZ,OAAO,CAAC,OAAO,CAAC;CAgBpB;AAED,qBAAa,kBAAmB,SAAQ,kBAAkB;;gBAItD,EAAE,EAAE,cAAc,EAClB,IAAI,EAAE,mBAAmB,EACzB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,iBAAiB;IAM1B,IAAI,CAAC,IAAI,EAAE,YAAY,GAAG,WAAW,CAAC,QAAQ,EAAE,aAAa,CAAC;CA+F/D;AAED,qBAAa,qBAAsB,SAAQ,kBAAkB;;gBAIzD,EAAE,EAAE,cAAc,EAClB,IAAI,EAAE,mBAAmB,EACzB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,oBAAoB;IAM7B,MAAM,IAAI,WAAW,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,aAAa,CAAC;IAiChE,KAAK,IAAI,WAAW,CAAC,UAAU,EAAE,aAAa,CAAC;CAWhD;AAED,MAAM,MAAM,cAAc,GAAG,kBAAkB,GAAG,qBAAqB,CAAC;AAExE,wBAAgB,oBAAoB,CAClC,EAAE,EAAE,cAAc,EAClB,IAAI,EAAE,mBAAmB,EACzB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,iBAAiB,GACvB,kBAAkB,CAAC;AACtB,wBAAgB,oBAAoB,CAClC,EAAE,EAAE,cAAc,EAClB,IAAI,EAAE,mBAAmB,EACzB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,oBAAoB,GAC1B,qBAAqB,CAAC;AACzB,wBAAgB,oBAAoB,CAClC,EAAE,EAAE,cAAc,EAClB,IAAI,EAAE,mBAAmB,EACzB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,aAAa,GACnB,cAAc,CAAC;AAYlB,wBAAsB,qBAAqB,CAAC,IAAI,EAAE;IAChD,kBAAkB,EAAE,MAAM,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,UAAU,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B,GAAG,OAAO,CAAC,OAAO,CAAC,CAiBnB"}
1
+ {"version":3,"file":"transfer.d.ts","sourceRoot":"","sources":["../src/transfer.ts"],"names":[],"mappings":"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"}