@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.
- package/esm/errors/TrellisError.d.ts +3 -3
- package/esm/errors/TrellisError.js +3 -3
- package/esm/server/internal_jobs/job-manager.d.ts.map +1 -1
- package/esm/server/internal_jobs/job-manager.js +32 -1
- package/esm/server/runtime.d.ts +3 -0
- package/esm/server/runtime.d.ts.map +1 -1
- package/esm/server/service.d.ts +15 -0
- package/esm/server/service.d.ts.map +1 -1
- package/esm/server/service.js +8 -0
- package/esm/server.d.ts.map +1 -1
- package/esm/server.js +54 -6
- package/esm/service/deno.d.ts +1 -1
- package/esm/service/deno.d.ts.map +1 -1
- package/esm/service/mod.d.ts +1 -1
- package/esm/service/mod.d.ts.map +1 -1
- package/esm/service/node.d.ts +1 -1
- package/esm/service/node.d.ts.map +1 -1
- package/esm/service/outbox_inbox.d.ts.map +1 -1
- package/esm/service/outbox_inbox.js +14 -0
- package/esm/telemetry/core.d.ts.map +1 -1
- package/esm/telemetry/core.js +1 -1
- package/esm/telemetry/env.d.ts.map +1 -1
- package/esm/telemetry/env.js +6 -1
- package/esm/telemetry/init.d.ts +3 -0
- package/esm/telemetry/init.d.ts.map +1 -0
- package/esm/telemetry/init.js +7 -0
- package/esm/telemetry/metrics.d.ts +34 -0
- package/esm/telemetry/metrics.d.ts.map +1 -0
- package/esm/telemetry/metrics.js +181 -0
- package/esm/telemetry/mod.d.ts +3 -0
- package/esm/telemetry/mod.d.ts.map +1 -1
- package/esm/telemetry/mod.js +2 -0
- package/esm/telemetry/runtime.d.ts +2 -0
- package/esm/telemetry/runtime.d.ts.map +1 -0
- package/esm/telemetry/runtime.js +134 -0
- package/esm/telemetry.d.ts +3 -0
- package/esm/telemetry.d.ts.map +1 -0
- package/esm/telemetry.js +2 -0
- package/esm/transfer.d.ts.map +1 -1
- package/esm/transfer.js +27 -16
- package/esm/trellis.d.ts.map +1 -1
- package/esm/trellis.js +460 -56
- package/package.json +7 -5
- package/script/errors/TrellisError.d.ts +3 -3
- package/script/errors/TrellisError.js +3 -3
- package/script/server/internal_jobs/job-manager.d.ts.map +1 -1
- package/script/server/internal_jobs/job-manager.js +32 -1
- package/script/server/runtime.d.ts +3 -0
- package/script/server/runtime.d.ts.map +1 -1
- package/script/server/service.d.ts +15 -0
- package/script/server/service.d.ts.map +1 -1
- package/script/server/service.js +8 -0
- package/script/server.d.ts.map +1 -1
- package/script/server.js +54 -6
- package/script/service/deno.d.ts +1 -1
- package/script/service/deno.d.ts.map +1 -1
- package/script/service/mod.d.ts +1 -1
- package/script/service/mod.d.ts.map +1 -1
- package/script/service/node.d.ts +1 -1
- package/script/service/node.d.ts.map +1 -1
- package/script/service/outbox_inbox.d.ts.map +1 -1
- package/script/service/outbox_inbox.js +14 -0
- package/script/telemetry/core.d.ts.map +1 -1
- package/script/telemetry/core.js +1 -1
- package/script/telemetry/env.d.ts.map +1 -1
- package/script/telemetry/env.js +6 -1
- package/script/telemetry/init.d.ts +3 -0
- package/script/telemetry/init.d.ts.map +1 -0
- package/script/telemetry/init.js +10 -0
- package/script/telemetry/metrics.d.ts +34 -0
- package/script/telemetry/metrics.d.ts.map +1 -0
- package/script/telemetry/metrics.js +186 -0
- package/script/telemetry/mod.d.ts +3 -0
- package/script/telemetry/mod.d.ts.map +1 -1
- package/script/telemetry/mod.js +7 -1
- package/script/telemetry/runtime.d.ts +2 -0
- package/script/telemetry/runtime.d.ts.map +1 -0
- package/script/telemetry/runtime.js +137 -0
- package/script/telemetry.d.ts +3 -0
- package/script/telemetry.d.ts.map +1 -0
- package/script/telemetry.js +18 -0
- package/script/transfer.d.ts.map +1 -1
- package/script/transfer.js +28 -17
- package/script/trellis.d.ts.map +1 -1
- package/script/trellis.js +490 -86
- package/src/errors/TrellisError.ts +4 -4
- package/src/server/internal_jobs/job-manager.ts +35 -5
- package/src/server/runtime.ts +4 -0
- package/src/server/service.ts +27 -0
- package/src/server.ts +66 -11
- package/src/service/deno.ts +1 -0
- package/src/service/mod.ts +1 -0
- package/src/service/node.ts +1 -0
- package/src/service/outbox_inbox.ts +14 -0
- package/src/telemetry/core.ts +1 -1
- package/src/telemetry/env.ts +5 -1
- package/src/telemetry/init.ts +8 -0
- package/src/telemetry/metrics.ts +294 -0
- package/src/telemetry/mod.ts +7 -0
- package/src/telemetry/runtime.ts +218 -0
- package/src/telemetry.ts +2 -0
- package/src/transfer.ts +69 -30
- package/src/trellis.ts +487 -88
- package/esm/tracing.d.ts +0 -5
- package/esm/tracing.d.ts.map +0 -1
- package/esm/tracing.js +0 -8
- package/script/tracing.d.ts +0 -5
- package/script/tracing.d.ts.map +0 -1
- package/script/tracing.js +0 -27
- 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,
|
|
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"}
|
package/script/telemetry/core.js
CHANGED
|
@@ -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/
|
|
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,
|
|
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"}
|
package/script/telemetry/env.js
CHANGED
|
@@ -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
|
-
|
|
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 @@
|
|
|
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"}
|
package/script/telemetry/mod.js
CHANGED
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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);
|
package/script/transfer.d.ts.map
CHANGED
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"transfer.d.ts","sourceRoot":"","sources":["../src/transfer.ts"],"names":[],"mappings":"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"}
|