@superblocksteam/sdk 2.0.139 → 2.0.140-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/.turbo/turbo-build.log +1 -1
- package/dist/application-build.d.mts.map +1 -1
- package/dist/application-build.mjs +3 -0
- package/dist/application-build.mjs.map +1 -1
- package/dist/dev-utils/dev-server-resolve-config.test.d.mts +2 -0
- package/dist/dev-utils/dev-server-resolve-config.test.d.mts.map +1 -0
- package/dist/dev-utils/dev-server-resolve-config.test.mjs +20 -0
- package/dist/dev-utils/dev-server-resolve-config.test.mjs.map +1 -0
- package/dist/dev-utils/dev-server-tracing.test.d.mts +2 -0
- package/dist/dev-utils/dev-server-tracing.test.d.mts.map +1 -0
- package/dist/dev-utils/dev-server-tracing.test.mjs +24 -0
- package/dist/dev-utils/dev-server-tracing.test.mjs.map +1 -0
- package/dist/dev-utils/dev-server.d.mts +10 -0
- package/dist/dev-utils/dev-server.d.mts.map +1 -1
- package/dist/dev-utils/dev-server.mjs +20 -1
- package/dist/dev-utils/dev-server.mjs.map +1 -1
- package/dist/react-compiler-runtime-shim.d.mts +23 -0
- package/dist/react-compiler-runtime-shim.d.mts.map +1 -0
- package/dist/react-compiler-runtime-shim.mjs +44 -0
- package/dist/react-compiler-runtime-shim.mjs.map +1 -0
- package/dist/react-compiler-runtime-shim.test.d.mts +2 -0
- package/dist/react-compiler-runtime-shim.test.d.mts.map +1 -0
- package/dist/react-compiler-runtime-shim.test.mjs +23 -0
- package/dist/react-compiler-runtime-shim.test.mjs.map +1 -0
- package/dist/telemetry/attributes.d.ts +0 -1
- package/dist/telemetry/attributes.d.ts.map +1 -1
- package/dist/telemetry/attributes.js +0 -1
- package/dist/telemetry/attributes.js.map +1 -1
- package/dist/telemetry/identity.d.ts +29 -0
- package/dist/telemetry/identity.d.ts.map +1 -0
- package/dist/telemetry/identity.js +9 -0
- package/dist/telemetry/identity.js.map +1 -0
- package/dist/telemetry/identity.test.d.ts +2 -0
- package/dist/telemetry/identity.test.d.ts.map +1 -0
- package/dist/telemetry/identity.test.js +25 -0
- package/dist/telemetry/identity.test.js.map +1 -0
- package/dist/telemetry/index.d.ts.map +1 -1
- package/dist/telemetry/index.js +55 -45
- package/dist/telemetry/index.js.map +1 -1
- package/dist/telemetry/index.test.js +29 -1
- package/dist/telemetry/index.test.js.map +1 -1
- package/dist/telemetry/local-obs.d.ts +8 -2
- package/dist/telemetry/local-obs.d.ts.map +1 -1
- package/dist/telemetry/local-obs.js +8 -3
- package/dist/telemetry/local-obs.js.map +1 -1
- package/dist/telemetry/otlp-config.d.ts +74 -0
- package/dist/telemetry/otlp-config.d.ts.map +1 -0
- package/dist/telemetry/otlp-config.js +204 -0
- package/dist/telemetry/otlp-config.js.map +1 -0
- package/dist/telemetry/otlp-config.test.d.ts +2 -0
- package/dist/telemetry/otlp-config.test.d.ts.map +1 -0
- package/dist/telemetry/otlp-config.test.js +156 -0
- package/dist/telemetry/otlp-config.test.js.map +1 -0
- package/dist/telemetry/preload.d.ts +23 -0
- package/dist/telemetry/preload.d.ts.map +1 -0
- package/dist/telemetry/preload.js +92 -0
- package/dist/telemetry/preload.js.map +1 -0
- package/dist/telemetry/util.d.ts +3 -3
- package/dist/telemetry/util.d.ts.map +1 -1
- package/dist/telemetry/util.js +6 -32
- package/dist/telemetry/util.js.map +1 -1
- package/package.json +18 -9
- package/src/application-build.mts +4 -0
- package/src/dev-utils/dev-server-resolve-config.test.mts +29 -0
- package/src/dev-utils/dev-server-tracing.test.mts +32 -0
- package/src/dev-utils/dev-server.mts +22 -1
- package/src/react-compiler-runtime-shim.mts +50 -0
- package/src/react-compiler-runtime-shim.test.mts +26 -0
- package/src/telemetry/attributes.ts +0 -1
- package/src/telemetry/identity.test.ts +30 -0
- package/src/telemetry/identity.ts +40 -0
- package/src/telemetry/index.test.ts +36 -1
- package/src/telemetry/index.ts +58 -47
- package/src/telemetry/local-obs.ts +8 -3
- package/src/telemetry/otlp-config.test.ts +213 -0
- package/src/telemetry/otlp-config.ts +250 -0
- package/src/telemetry/preload.ts +113 -0
- package/src/telemetry/util.ts +6 -32
- package/tsconfig.tsbuildinfo +1 -1
- package/turbo.json +0 -1
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
describe("telemetry identity", () => {
|
|
3
|
+
afterEach(async () => {
|
|
4
|
+
const { setTelemetryIdentity } = await import("./identity.js");
|
|
5
|
+
setTelemetryIdentity({});
|
|
6
|
+
vi.resetModules();
|
|
7
|
+
});
|
|
8
|
+
it("drops undefined values and returns the rest", async () => {
|
|
9
|
+
const { setTelemetryIdentity, getTelemetryIdentity } = await import("./identity.js");
|
|
10
|
+
setTelemetryIdentity({ "application-id": "app-1", branch: undefined });
|
|
11
|
+
expect(getTelemetryIdentity()).toEqual({ "application-id": "app-1" });
|
|
12
|
+
});
|
|
13
|
+
it("shares identity across module instances, as when the CLI bundle and the preload's node_modules copy each load their own", async () => {
|
|
14
|
+
const writer = await import("./identity.js");
|
|
15
|
+
writer.setTelemetryIdentity({ "application-id": "app-1" });
|
|
16
|
+
// A fresh module registry stands in for the second copy of this module
|
|
17
|
+
// that esbuild bakes into the packaged CLI.
|
|
18
|
+
vi.resetModules();
|
|
19
|
+
const reader = await import("./identity.js");
|
|
20
|
+
expect(reader.getTelemetryIdentity()).toEqual({
|
|
21
|
+
"application-id": "app-1",
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
//# sourceMappingURL=identity.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity.test.js","sourceRoot":"","sources":["../../src/telemetry/identity.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE7D,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,MAAM,EAAE,oBAAoB,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;QAC/D,oBAAoB,CAAC,EAAE,CAAC,CAAC;QACzB,EAAE,CAAC,YAAY,EAAE,CAAC;IACpB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,GAClD,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;QAChC,oBAAoB,CAAC,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QACvE,MAAM,CAAC,oBAAoB,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,gBAAgB,EAAE,OAAO,EAAE,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yHAAyH,EAAE,KAAK,IAAI,EAAE;QACvI,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;QAC7C,MAAM,CAAC,oBAAoB,CAAC,EAAE,gBAAgB,EAAE,OAAO,EAAE,CAAC,CAAC;QAE3D,uEAAuE;QACvE,4CAA4C;QAC5C,EAAE,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;QAE7C,MAAM,CAAC,MAAM,CAAC,oBAAoB,EAAE,CAAC,CAAC,OAAO,CAAC;YAC5C,gBAAgB,EAAE,OAAO;SAC1B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/telemetry/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAW,KAAK,KAAK,EAAS,KAAK,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EAAQ,KAAK,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAK5D,OAAO,EACL,kBAAkB,EAKnB,MAAM,yBAAyB,CAAC;AAWjC,OAAO,KAAK,EAAE,2CAA2C,EAAE,MAAM,mBAAmB,CAAC;AAgCrF;;;GAGG;AACH,eAAO,MAAM,cAAc,oBAUvB,CAAC;AAEL;;;;;GAKG;AACH,eAAO,MAAM,WAAW,SAAmD,CAAC;AAE5E;;;;;;;;;;GAUG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,OAAO,CAAC,CAc1D;AAED,wBAAsB,kBAAkB,CACtC,iBAAiB,CAAC,EAAE,2CAA2C,GAC9D,OAAO,CAAC,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/telemetry/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAW,KAAK,KAAK,EAAS,KAAK,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EAAQ,KAAK,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAK5D,OAAO,EACL,kBAAkB,EAKnB,MAAM,yBAAyB,CAAC;AAWjC,OAAO,KAAK,EAAE,2CAA2C,EAAE,MAAM,mBAAmB,CAAC;AAgCrF;;;GAGG;AACH,eAAO,MAAM,cAAc,oBAUvB,CAAC;AAEL;;;;;GAKG;AACH,eAAO,MAAM,WAAW,SAAmD,CAAC;AAE5E;;;;;;;;;;GAUG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,OAAO,CAAC,CAc1D;AAED,wBAAsB,kBAAkB,CACtC,iBAAiB,CAAC,EAAE,2CAA2C,GAC9D,OAAO,CAAC,OAAO,CAAC,CAkIlB;AAED,wBAAgB,SAAS,IAAI,MAAM,CAMlC;AAED,wBAAgB,SAAS,IAAI,MAAM,CAMlC;AAED,wBAAgB,QAAQ,IAAI,KAAK,CAMhC"}
|
package/dist/telemetry/index.js
CHANGED
|
@@ -6,7 +6,8 @@ import { HttpInstrumentation } from "@opentelemetry/instrumentation-http";
|
|
|
6
6
|
import { DeploymentTypeEnum, OBS_TAG_APPLICATION_ID, OBS_TAG_BRANCH, OBS_TAG_ORG_ID, OBS_TAG_USER_EMAIL, } from "@superblocksteam/shared";
|
|
7
7
|
import { initNodeTelemetry, getTelemetryInstance, isTelemetryInitialized, parseDeploymentType, resetTelemetry, getDefaultPolicy, } from "@superblocksteam/telemetry";
|
|
8
8
|
import packageJson from "../../package.json" with { type: "json" };
|
|
9
|
-
import { ATTR_SUPERBLOCKS_BASE_URL,
|
|
9
|
+
import { ATTR_SUPERBLOCKS_BASE_URL, ATTR_SUPERBLOCKS_CSB_ID, ATTR_SUPERBLOCKS_IS_CSB, ATTR_SUPERBLOCKS_USER_ID, getEnvironmentFromHostname, } from "./attributes.js";
|
|
10
|
+
import { getTelemetryIdentity, setTelemetryIdentity } from "./identity.js";
|
|
10
11
|
import { applyLocalObsEnvVars, isLocalObsEnabled } from "./local-obs.js";
|
|
11
12
|
import { getLogger as getStandardLogger } from "./logging.js";
|
|
12
13
|
import { getConfiguration, SERVICE_NAME } from "./util.js";
|
|
@@ -73,8 +74,26 @@ export async function shutdownTelemetry() {
|
|
|
73
74
|
}
|
|
74
75
|
export async function configureTelemetry(applicationConfig) {
|
|
75
76
|
const logger = getStandardLogger();
|
|
77
|
+
// The application, user, and org are known only at connect, so they are
|
|
78
|
+
// stamped onto every span and exported log record via the SDK's dynamic
|
|
79
|
+
// attribute source rather than the resource. This restores the identity the
|
|
80
|
+
// SDK used to put on the resource, without re-initializing (which would churn
|
|
81
|
+
// instrumentation). The CLI token is deliberately NOT included: it is a
|
|
82
|
+
// credential and does not belong in telemetry.
|
|
83
|
+
const identity = {
|
|
84
|
+
[OBS_TAG_APPLICATION_ID]: applicationConfig?.id,
|
|
85
|
+
[OBS_TAG_BRANCH]: applicationConfig?.branchName,
|
|
86
|
+
[OBS_TAG_USER_EMAIL]: applicationConfig?.userEmail,
|
|
87
|
+
[ATTR_SUPERBLOCKS_USER_ID]: applicationConfig?.userId,
|
|
88
|
+
[OBS_TAG_ORG_ID]: applicationConfig?.organizationId,
|
|
89
|
+
};
|
|
90
|
+
// Repeat calls (e.g. auth hot-reload) must not tear down a working pipeline:
|
|
91
|
+
// a shutdown+reinit loses the global provider registration (the OTel API
|
|
92
|
+
// rejects a second registration), leaving all instrumentation pointed at dead
|
|
93
|
+
// providers. Refresh the identity and keep the running SDK and dd-trace.
|
|
76
94
|
if (configured) {
|
|
77
|
-
|
|
95
|
+
setTelemetryIdentity(identity);
|
|
96
|
+
return true;
|
|
78
97
|
}
|
|
79
98
|
configured = true;
|
|
80
99
|
try {
|
|
@@ -87,6 +106,7 @@ export async function configureTelemetry(applicationConfig) {
|
|
|
87
106
|
return false;
|
|
88
107
|
}
|
|
89
108
|
logger.info(`[INIT] Initializing telemetry for service ${config.serviceName} at Superblocks instance ${config.superblocksHostname}`);
|
|
109
|
+
setTelemetryIdentity(identity);
|
|
90
110
|
// Check for local observability mode (SUPERBLOCKS_LOCAL_OBS=true)
|
|
91
111
|
const isLocalObs = isLocalObsEnabled();
|
|
92
112
|
// Allow env var override for local development testing (AGENT-1048)
|
|
@@ -110,7 +130,6 @@ export async function configureTelemetry(applicationConfig) {
|
|
|
110
130
|
plugins: false,
|
|
111
131
|
tags: {
|
|
112
132
|
[ATTR_SUPERBLOCKS_BASE_URL]: config.superblocksHostname,
|
|
113
|
-
[ATTR_SUPERBLOCKS_CLI_TOKEN]: config.token,
|
|
114
133
|
[ATTR_SUPERBLOCKS_IS_CSB]: !!process.env.SUPERBLOCKS_IS_CSB,
|
|
115
134
|
[ATTR_SUPERBLOCKS_CSB_ID]: process.env.SUPERBLOCKS_IS_CSB
|
|
116
135
|
? os.hostname()
|
|
@@ -126,48 +145,39 @@ export async function configureTelemetry(applicationConfig) {
|
|
|
126
145
|
: undefined,
|
|
127
146
|
});
|
|
128
147
|
logger.info(`[INIT] Datadog LLM tracing is ${ddTrace.llmobs.enabled ? "enabled" : "disabled"} for service ${config.serviceName}`);
|
|
129
|
-
// Configure OpenTelemetry for APM traces and logs via shared telemetry
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
new ExpressInstrumentation(),
|
|
163
|
-
],
|
|
164
|
-
logsEnabled: true,
|
|
165
|
-
}, policy);
|
|
166
|
-
}
|
|
167
|
-
catch (error) {
|
|
168
|
-
console.error("[Telemetry] Failed to initialize OpenTelemetry:", error);
|
|
169
|
-
configured = false;
|
|
170
|
-
return false;
|
|
148
|
+
// Configure OpenTelemetry for APM traces and logs via shared telemetry
|
|
149
|
+
// package. When the early preload already started the SDK, skip: identity
|
|
150
|
+
// flows through the dynamic attribute source above, and constructing
|
|
151
|
+
// instrumentations here would only leave self-enabled orphans behind
|
|
152
|
+
// (initNodeTelemetry would return the existing instance and discard them).
|
|
153
|
+
if (!isTelemetryInitialized()) {
|
|
154
|
+
const policy = getDefaultPolicy(deploymentType);
|
|
155
|
+
try {
|
|
156
|
+
initNodeTelemetry({
|
|
157
|
+
serviceName: config.serviceName,
|
|
158
|
+
serviceVersion: packageJson.version,
|
|
159
|
+
environment: getEnvironmentFromHostname(config.superblocksHostname),
|
|
160
|
+
otlpUrl: config.otlpBaseUrl,
|
|
161
|
+
resourceAttributes: {
|
|
162
|
+
[ATTR_SUPERBLOCKS_BASE_URL]: config.superblocksHostname,
|
|
163
|
+
[ATTR_SUPERBLOCKS_IS_CSB]: String(!!process.env.SUPERBLOCKS_IS_CSB),
|
|
164
|
+
...(process.env.SUPERBLOCKS_IS_CSB && {
|
|
165
|
+
[ATTR_SUPERBLOCKS_CSB_ID]: os.hostname(),
|
|
166
|
+
}),
|
|
167
|
+
},
|
|
168
|
+
instrumentations: [
|
|
169
|
+
new HttpInstrumentation(),
|
|
170
|
+
new ExpressInstrumentation(),
|
|
171
|
+
],
|
|
172
|
+
logsEnabled: true,
|
|
173
|
+
dynamicAttributes: getTelemetryIdentity,
|
|
174
|
+
}, policy);
|
|
175
|
+
}
|
|
176
|
+
catch (error) {
|
|
177
|
+
console.error("[Telemetry] Failed to initialize OpenTelemetry:", error);
|
|
178
|
+
configured = false;
|
|
179
|
+
return false;
|
|
180
|
+
}
|
|
171
181
|
}
|
|
172
182
|
return true;
|
|
173
183
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/telemetry/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB,OAAO,EAAE,OAAO,EAAc,KAAK,EAAe,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAe,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,wCAAwC,CAAC;AAChF,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAG1E,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,cAAc,EACd,cAAc,EACd,kBAAkB,GACnB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,sBAAsB,EACtB,mBAAmB,EACnB,cAAc,EACd,gBAAgB,GACjB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,WAAW,MAAM,oBAAoB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAEnE,OAAO,EACL,yBAAyB,EACzB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/telemetry/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -29,6 +29,7 @@ vi.mock("./logging.js", () => ({
|
|
|
29
29
|
error: vi.fn(),
|
|
30
30
|
}),
|
|
31
31
|
}));
|
|
32
|
+
import { FeatureFlags } from "../flag.js";
|
|
32
33
|
describe("CLI SDK Telemetry Integration", () => {
|
|
33
34
|
let telemetryModule;
|
|
34
35
|
beforeAll(async () => {
|
|
@@ -43,8 +44,10 @@ describe("CLI SDK Telemetry Integration", () => {
|
|
|
43
44
|
resetTelemetry();
|
|
44
45
|
}
|
|
45
46
|
});
|
|
46
|
-
beforeEach(() => {
|
|
47
|
+
beforeEach(async () => {
|
|
47
48
|
vi.clearAllMocks();
|
|
49
|
+
// Each test starts unconfigured; repeat-call behavior is tested explicitly.
|
|
50
|
+
await telemetryModule.shutdownTelemetry();
|
|
48
51
|
});
|
|
49
52
|
describe("configureTelemetry", () => {
|
|
50
53
|
it("successfully initializes telemetry", async () => {
|
|
@@ -57,6 +60,31 @@ describe("CLI SDK Telemetry Integration", () => {
|
|
|
57
60
|
await telemetryModule.configureTelemetry();
|
|
58
61
|
expect(ddTrace.default.init).toHaveBeenCalled();
|
|
59
62
|
});
|
|
63
|
+
it("refreshes identity on a repeat call without tearing down the pipeline", async () => {
|
|
64
|
+
const ddTrace = await import("dd-trace");
|
|
65
|
+
const { isTelemetryInitialized } = await import("@superblocksteam/telemetry");
|
|
66
|
+
const { getTelemetryIdentity } = await import("./identity.js");
|
|
67
|
+
const applicationConfig = {
|
|
68
|
+
id: "app-2",
|
|
69
|
+
branchName: "main",
|
|
70
|
+
userId: "user-1",
|
|
71
|
+
userEmail: "dev@example.com",
|
|
72
|
+
organizationId: "org-1",
|
|
73
|
+
featureFlags: new FeatureFlags({}),
|
|
74
|
+
superblocksBaseUrl: "https://app.superblocks.com",
|
|
75
|
+
token: "test1234",
|
|
76
|
+
};
|
|
77
|
+
await telemetryModule.configureTelemetry();
|
|
78
|
+
const result = await telemetryModule.configureTelemetry(applicationConfig);
|
|
79
|
+
expect(result).toBe(true);
|
|
80
|
+
// The running SDK and dd-trace survive; only identity is refreshed.
|
|
81
|
+
expect(isTelemetryInitialized()).toBe(true);
|
|
82
|
+
expect(ddTrace.default.init).toHaveBeenCalledTimes(1);
|
|
83
|
+
expect(getTelemetryIdentity()).toMatchObject({
|
|
84
|
+
"application-id": "app-2",
|
|
85
|
+
"organization-id": "org-1",
|
|
86
|
+
});
|
|
87
|
+
});
|
|
60
88
|
});
|
|
61
89
|
describe("getTracer", () => {
|
|
62
90
|
it("returns working tracer after initialization", async () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../src/telemetry/index.test.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,EAAE,EACF,MAAM,EACN,EAAE,EACF,SAAS,EACT,QAAQ,EACR,UAAU,GACX,MAAM,QAAQ,CAAC;AAEhB,+CAA+C;AAC/C,OAAO,CAAC,GAAG,CAAC,iBAAiB,GAAG,MAAM,CAAC;AACvC,OAAO,CAAC,GAAG,CAAC,2BAA2B,GAAG,EAAE,CAAC;AAE7C,uDAAuD;AACvD,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;IACzB,OAAO,EAAE;QACP,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE;QACb,MAAM,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;KAC3B;CACF,CAAC,CAAC,CAAC;AAEJ,0DAA0D;AAC1D,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC;IAC1B,YAAY,EAAE,gBAAgB;IAC9B,gBAAgB,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;QAC1C,kBAAkB,EAAE,IAAI,GAAG,CAAC,6BAA6B,CAAC;QAC1D,WAAW,EAAE,iCAAiC;QAC9C,mBAAmB,EAAE,qBAAqB;QAC1C,WAAW,EAAE,gBAAgB;QAC7B,KAAK,EAAE,UAAU;KAClB,CAAC;CACH,CAAC,CAAC,CAAC;AAEJ,0BAA0B;AAC1B,EAAE,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,EAAE,CAAC,CAAC;IAC7B,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC;QACjC,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE;QACb,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE;QACd,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE;QACb,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE;KACf,CAAC;CACH,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../src/telemetry/index.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,11 +5,10 @@
|
|
|
5
5
|
* all environment variables needed for local observability testing with the
|
|
6
6
|
* LGTM stack (Loki, Grafana, Tempo, Mimir).
|
|
7
7
|
*
|
|
8
|
-
* This eliminates the need to manually set
|
|
8
|
+
* This eliminates the need to manually set 8+ environment variables:
|
|
9
9
|
* - SUPERBLOCKS_DEPLOYMENT_TYPE
|
|
10
10
|
* - SUPERBLOCKS_LLMOBS_ENABLED
|
|
11
11
|
* - OTEL_EXPORTER_OTLP_ENDPOINT
|
|
12
|
-
* - SUPERBLOCKS_OTEL_COLLECTOR_URL
|
|
13
12
|
* - DD_LLMOBS_ENABLED
|
|
14
13
|
* - DD_LLMOBS_ML_APP
|
|
15
14
|
* - DD_LLMOBS_AGENTLESS_ENABLED
|
|
@@ -21,6 +20,13 @@
|
|
|
21
20
|
*
|
|
22
21
|
* Or with custom OTEL endpoint:
|
|
23
22
|
* SUPERBLOCKS_LOCAL_OBS=true OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318 pnpm start:all
|
|
23
|
+
*
|
|
24
|
+
* Note: this mode changes export POLICY (sampling, log levels, LLMObs), not the
|
|
25
|
+
* dev-server's OTLP endpoint. The dev-server always exports through the
|
|
26
|
+
* Superblocks server proxy at <SUPERBLOCKS_BASE_URL>/api, so with an auth file
|
|
27
|
+
* pointing at a remote instance, a standalone `SUPERBLOCKS_LOCAL_OBS=true
|
|
28
|
+
* superblocks dev` sends its telemetry to that instance, not to the local
|
|
29
|
+
* collector. Run against a local stack to keep telemetry local.
|
|
24
30
|
*/
|
|
25
31
|
import { DeploymentTypeEnum } from "@superblocksteam/shared";
|
|
26
32
|
export interface LocalObsConfig {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-obs.d.ts","sourceRoot":"","sources":["../../src/telemetry/local-obs.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"local-obs.d.ts","sourceRoot":"","sources":["../../src/telemetry/local-obs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAK7D,MAAM,WAAW,cAAc;IAC7B,kDAAkD;IAClD,OAAO,EAAE,OAAO,CAAC;IACjB,8CAA8C;IAC9C,YAAY,EAAE,MAAM,CAAC;IACrB,iDAAiD;IACjD,cAAc,EAAE,kBAAkB,CAAC,UAAU,CAAC;IAC9C,2BAA2B;IAC3B,MAAM,EAAE;QACN,OAAO,EAAE,IAAI,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,gBAAgB,EAAE,IAAI,CAAC;KACxB,CAAC;IACF,yCAAyC;IACzC,OAAO,EAAE;QACP,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAa3C;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,IAAI,cAAc,GAAG,IAAI,CAqBzD;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAuB3C"}
|
|
@@ -5,11 +5,10 @@
|
|
|
5
5
|
* all environment variables needed for local observability testing with the
|
|
6
6
|
* LGTM stack (Loki, Grafana, Tempo, Mimir).
|
|
7
7
|
*
|
|
8
|
-
* This eliminates the need to manually set
|
|
8
|
+
* This eliminates the need to manually set 8+ environment variables:
|
|
9
9
|
* - SUPERBLOCKS_DEPLOYMENT_TYPE
|
|
10
10
|
* - SUPERBLOCKS_LLMOBS_ENABLED
|
|
11
11
|
* - OTEL_EXPORTER_OTLP_ENDPOINT
|
|
12
|
-
* - SUPERBLOCKS_OTEL_COLLECTOR_URL
|
|
13
12
|
* - DD_LLMOBS_ENABLED
|
|
14
13
|
* - DD_LLMOBS_ML_APP
|
|
15
14
|
* - DD_LLMOBS_AGENTLESS_ENABLED
|
|
@@ -21,6 +20,13 @@
|
|
|
21
20
|
*
|
|
22
21
|
* Or with custom OTEL endpoint:
|
|
23
22
|
* SUPERBLOCKS_LOCAL_OBS=true OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318 pnpm start:all
|
|
23
|
+
*
|
|
24
|
+
* Note: this mode changes export POLICY (sampling, log levels, LLMObs), not the
|
|
25
|
+
* dev-server's OTLP endpoint. The dev-server always exports through the
|
|
26
|
+
* Superblocks server proxy at <SUPERBLOCKS_BASE_URL>/api, so with an auth file
|
|
27
|
+
* pointing at a remote instance, a standalone `SUPERBLOCKS_LOCAL_OBS=true
|
|
28
|
+
* superblocks dev` sends its telemetry to that instance, not to the local
|
|
29
|
+
* collector. Run against a local stack to keep telemetry local.
|
|
24
30
|
*/
|
|
25
31
|
import { DeploymentTypeEnum } from "@superblocksteam/shared";
|
|
26
32
|
const DEFAULT_LOCAL_OTEL_ENDPOINT = "http://localhost:4318";
|
|
@@ -91,7 +97,6 @@ export function applyLocalObsEnvVars() {
|
|
|
91
97
|
SUPERBLOCKS_DEPLOYMENT_TYPE: config.deploymentType,
|
|
92
98
|
SUPERBLOCKS_LLMOBS_ENABLED: "true",
|
|
93
99
|
OTEL_EXPORTER_OTLP_ENDPOINT: config.otelEndpoint,
|
|
94
|
-
SUPERBLOCKS_OTEL_COLLECTOR_URL: config.otelEndpoint,
|
|
95
100
|
DD_LLMOBS_ENABLED: "1",
|
|
96
101
|
DD_LLMOBS_ML_APP: config.llmobs.mlApp,
|
|
97
102
|
DD_LLMOBS_AGENTLESS_ENABLED: "1",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-obs.js","sourceRoot":"","sources":["../../src/telemetry/local-obs.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"local-obs.js","sourceRoot":"","sources":["../../src/telemetry/local-obs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D,MAAM,2BAA2B,GAAG,uBAAuB,CAAC;AAC5D,MAAM,mBAAmB,GAAG,yBAAyB,CAAC;AAsBtD;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB;IAC/B,iBAAiB;IACjB,IAAI,OAAO,CAAC,GAAG,CAAC,qBAAqB,KAAK,MAAM,EAAE,CAAC;QACjD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gDAAgD;IAChD,MAAM,eAAe,GACnB,OAAO,CAAC,GAAG,CAAC,2BAA2B,KAAK,kBAAkB,CAAC,UAAU;QACzE,OAAO,CAAC,GAAG,CAAC,0BAA0B,KAAK,MAAM;QACjD,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC;IAE5C,OAAO,eAAe,CAAC;AACzB,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB;IAC/B,IAAI,CAAC,iBAAiB,EAAE,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO;QACL,OAAO,EAAE,IAAI;QACb,YAAY,EACV,OAAO,CAAC,GAAG,CAAC,2BAA2B,IAAI,2BAA2B;QACxE,cAAc,EAAE,kBAAkB,CAAC,UAAU;QAC7C,MAAM,EAAE;YACN,OAAO,EAAE,IAAI;YACb,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,mBAAmB;YAC1D,gBAAgB,EAAE,IAAI;SACvB;QACD,OAAO,EAAE;YACP,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,eAAe;YAC5C,uEAAuE;YACvE,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,qBAAqB;SACxD;KACF,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,oBAAoB;IAClC,MAAM,MAAM,GAAG,iBAAiB,EAAE,CAAC;IACnC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO;IACT,CAAC;IAED,+DAA+D;IAC/D,MAAM,WAAW,GAA2B;QAC1C,2BAA2B,EAAE,MAAM,CAAC,cAAc;QAClD,0BAA0B,EAAE,MAAM;QAClC,2BAA2B,EAAE,MAAM,CAAC,YAAY;QAChD,iBAAiB,EAAE,GAAG;QACtB,gBAAgB,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK;QACrC,2BAA2B,EAAE,GAAG;QAChC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI;QAC5B,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM;KAClC,CAAC;IAEF,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;QACvD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QAC3B,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared OTLP configuration for the dev-server CLI.
|
|
3
|
+
*
|
|
4
|
+
* This is the single source of truth for where the dev-server sends telemetry
|
|
5
|
+
* and how it tags it. It is imported by three places that must agree:
|
|
6
|
+
* - the early telemetry preload (`preload.mts`, full OTel SDK),
|
|
7
|
+
* - the SDK telemetry init (`util.ts` / `index.ts`),
|
|
8
|
+
* - the lightweight dev-server parent (`parent-otlp-metric.mts`), which hand-
|
|
9
|
+
* rolls OTLP because it must stay small and cannot load the OTel SDK.
|
|
10
|
+
*
|
|
11
|
+
* Because the parent imports this, the module MUST depend only on `node:`
|
|
12
|
+
* builtins and other import-free modules in this package (`attributes.ts`). Do
|
|
13
|
+
* NOT import OpenTelemetry, dd-trace, or the `@superblocksteam/sdk` barrel
|
|
14
|
+
* here — that would drag the SDK into the lightweight parent.
|
|
15
|
+
*
|
|
16
|
+
* Endpoint policy: the dev-server always exports through the Superblocks server's
|
|
17
|
+
* OTLP proxy at `<baseUrl>/api/v1/{traces,metrics,logs}`. The server forwards to
|
|
18
|
+
* the LGTM collector locally and to the in-cluster collector when deployed, so
|
|
19
|
+
* the client behaves identically in every environment — there is no
|
|
20
|
+
* direct-to-collector path.
|
|
21
|
+
*/
|
|
22
|
+
/** Resource `service.name` for every dev-server telemetry signal. */
|
|
23
|
+
export declare const SERVICE_NAME = "sdk-dev-server";
|
|
24
|
+
/**
|
|
25
|
+
* Base URL the dev-server exports OTLP to: `<baseUrl origin>/api`. Callers append
|
|
26
|
+
* `/v1/traces`, `/v1/metrics`, or `/v1/logs`. Returns undefined when the base URL
|
|
27
|
+
* is missing or unparseable so callers can skip emission rather than crash.
|
|
28
|
+
*/
|
|
29
|
+
export declare function otlpBaseUrl(baseUrl: string | URL | undefined): string | undefined;
|
|
30
|
+
/**
|
|
31
|
+
* Full OTLP metrics endpoint derived from `SUPERBLOCKS_BASE_URL`. Used by the
|
|
32
|
+
* lightweight parent's hand-rolled emitter.
|
|
33
|
+
*/
|
|
34
|
+
export declare function otlpMetricsUrl(env?: NodeJS.ProcessEnv): string | null;
|
|
35
|
+
/**
|
|
36
|
+
* Derives the `deployment.environment.name` resource attribute from
|
|
37
|
+
* `SUPERBLOCKS_BASE_URL` so every dev-server signal carries the same environment
|
|
38
|
+
* tag. Defaults to `"other"` when the host is unknown or unavailable.
|
|
39
|
+
*/
|
|
40
|
+
export declare function deploymentEnvironment(env?: NodeJS.ProcessEnv): string;
|
|
41
|
+
export declare function warnIfCollectorUrlIgnored(env?: NodeJS.ProcessEnv): void;
|
|
42
|
+
/**
|
|
43
|
+
* Builds a minimal OTLP/HTTP `ExportMetricsServiceRequest` body for a single
|
|
44
|
+
* monotonic DELTA counter increment (value 1). Timestamps are nanosecond
|
|
45
|
+
* decimal strings built with BigInt so JS number precision can't corrupt them;
|
|
46
|
+
* `startTimeUnixNano <= timeUnixNano` is required by the protocol.
|
|
47
|
+
*/
|
|
48
|
+
export declare function buildDeltaCounterPayload(opts: {
|
|
49
|
+
name: string;
|
|
50
|
+
description: string;
|
|
51
|
+
attributes: Record<string, string>;
|
|
52
|
+
environment: string;
|
|
53
|
+
serviceName?: string;
|
|
54
|
+
scopeName?: string;
|
|
55
|
+
nowMs?: number;
|
|
56
|
+
}): unknown;
|
|
57
|
+
/**
|
|
58
|
+
* Fire-and-forget POST of a single counter increment as OTLP/HTTP JSON.
|
|
59
|
+
*
|
|
60
|
+
* Never throws and never rejects: any failure (no endpoint, DNS, timeout,
|
|
61
|
+
* non-2xx) resolves quietly so telemetry cannot break or delay the parent's
|
|
62
|
+
* supervision loop or shutdown. In production the request socket and timeout are
|
|
63
|
+
* `unref`'d so a slow collector can't keep the parent alive; tests pass
|
|
64
|
+
* `unref: false` and `await` to observe the request deterministically.
|
|
65
|
+
*/
|
|
66
|
+
export declare function emitOtlpCounter(opts: {
|
|
67
|
+
name: string;
|
|
68
|
+
description: string;
|
|
69
|
+
attributes: Record<string, string>;
|
|
70
|
+
env?: NodeJS.ProcessEnv;
|
|
71
|
+
timeoutMs?: number;
|
|
72
|
+
unref?: boolean;
|
|
73
|
+
}): Promise<void>;
|
|
74
|
+
//# sourceMappingURL=otlp-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"otlp-config.d.ts","sourceRoot":"","sources":["../../src/telemetry/otlp-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAOH,qEAAqE;AACrE,eAAO,MAAM,YAAY,mBAAmB,CAAC;AAQ7C;;;;GAIG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,MAAM,GAAG,GAAG,GAAG,SAAS,GAChC,MAAM,GAAG,SAAS,CASpB;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,GAAG,IAAI,CAGf;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,CAYR;AAMD,wBAAgB,yBAAyB,CACvC,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,IAAI,CAQN;AAYD;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE;IAC7C,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAwCV;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiEhB"}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared OTLP configuration for the dev-server CLI.
|
|
3
|
+
*
|
|
4
|
+
* This is the single source of truth for where the dev-server sends telemetry
|
|
5
|
+
* and how it tags it. It is imported by three places that must agree:
|
|
6
|
+
* - the early telemetry preload (`preload.mts`, full OTel SDK),
|
|
7
|
+
* - the SDK telemetry init (`util.ts` / `index.ts`),
|
|
8
|
+
* - the lightweight dev-server parent (`parent-otlp-metric.mts`), which hand-
|
|
9
|
+
* rolls OTLP because it must stay small and cannot load the OTel SDK.
|
|
10
|
+
*
|
|
11
|
+
* Because the parent imports this, the module MUST depend only on `node:`
|
|
12
|
+
* builtins and other import-free modules in this package (`attributes.ts`). Do
|
|
13
|
+
* NOT import OpenTelemetry, dd-trace, or the `@superblocksteam/sdk` barrel
|
|
14
|
+
* here — that would drag the SDK into the lightweight parent.
|
|
15
|
+
*
|
|
16
|
+
* Endpoint policy: the dev-server always exports through the Superblocks server's
|
|
17
|
+
* OTLP proxy at `<baseUrl>/api/v1/{traces,metrics,logs}`. The server forwards to
|
|
18
|
+
* the LGTM collector locally and to the in-cluster collector when deployed, so
|
|
19
|
+
* the client behaves identically in every environment — there is no
|
|
20
|
+
* direct-to-collector path.
|
|
21
|
+
*/
|
|
22
|
+
import * as http from "node:http";
|
|
23
|
+
import * as https from "node:https";
|
|
24
|
+
import { getEnvironmentFromHostname } from "./attributes.js";
|
|
25
|
+
/** Resource `service.name` for every dev-server telemetry signal. */
|
|
26
|
+
export const SERVICE_NAME = "sdk-dev-server";
|
|
27
|
+
/** OTel instrument scope for parent-emitted metrics (distinct from the child). */
|
|
28
|
+
const SCOPE_NAME = "superblocks.cli.dev-parent";
|
|
29
|
+
/** Default fire-and-forget POST budget. Telemetry must never delay the parent. */
|
|
30
|
+
const DEFAULT_TIMEOUT_MS = 1000;
|
|
31
|
+
/**
|
|
32
|
+
* Base URL the dev-server exports OTLP to: `<baseUrl origin>/api`. Callers append
|
|
33
|
+
* `/v1/traces`, `/v1/metrics`, or `/v1/logs`. Returns undefined when the base URL
|
|
34
|
+
* is missing or unparseable so callers can skip emission rather than crash.
|
|
35
|
+
*/
|
|
36
|
+
export function otlpBaseUrl(baseUrl) {
|
|
37
|
+
if (!baseUrl) {
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
40
|
+
try {
|
|
41
|
+
return `${new URL(baseUrl).origin}/api`;
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Full OTLP metrics endpoint derived from `SUPERBLOCKS_BASE_URL`. Used by the
|
|
49
|
+
* lightweight parent's hand-rolled emitter.
|
|
50
|
+
*/
|
|
51
|
+
export function otlpMetricsUrl(env = process.env) {
|
|
52
|
+
const base = otlpBaseUrl(env.SUPERBLOCKS_BASE_URL);
|
|
53
|
+
return base ? `${base}/v1/metrics` : null;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Derives the `deployment.environment.name` resource attribute from
|
|
57
|
+
* `SUPERBLOCKS_BASE_URL` so every dev-server signal carries the same environment
|
|
58
|
+
* tag. Defaults to `"other"` when the host is unknown or unavailable.
|
|
59
|
+
*/
|
|
60
|
+
export function deploymentEnvironment(env = process.env) {
|
|
61
|
+
const baseUrl = env.SUPERBLOCKS_BASE_URL;
|
|
62
|
+
if (!baseUrl) {
|
|
63
|
+
return "other";
|
|
64
|
+
}
|
|
65
|
+
let hostname;
|
|
66
|
+
try {
|
|
67
|
+
hostname = new URL(baseUrl).hostname;
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
return "other";
|
|
71
|
+
}
|
|
72
|
+
return getEnvironmentFromHostname(hostname);
|
|
73
|
+
}
|
|
74
|
+
// The direct-to-collector export path was removed: the dev-server always goes
|
|
75
|
+
// through the server proxy. Anyone still setting the old env var gets one
|
|
76
|
+
// visible notice instead of silently-dropped configuration.
|
|
77
|
+
let warnedCollectorUrlIgnored = false;
|
|
78
|
+
export function warnIfCollectorUrlIgnored(env = process.env) {
|
|
79
|
+
if (warnedCollectorUrlIgnored || !env.SUPERBLOCKS_OTEL_COLLECTOR_URL) {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
warnedCollectorUrlIgnored = true;
|
|
83
|
+
console.warn("[Telemetry] SUPERBLOCKS_OTEL_COLLECTOR_URL is set but ignored: the dev-server always exports through the Superblocks server proxy at <SUPERBLOCKS_BASE_URL>/api.");
|
|
84
|
+
}
|
|
85
|
+
warnIfCollectorUrlIgnored();
|
|
86
|
+
function toAttributeArray(attributes) {
|
|
87
|
+
return Object.entries(attributes).map(([key, value]) => ({
|
|
88
|
+
key,
|
|
89
|
+
value: { stringValue: value },
|
|
90
|
+
}));
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Builds a minimal OTLP/HTTP `ExportMetricsServiceRequest` body for a single
|
|
94
|
+
* monotonic DELTA counter increment (value 1). Timestamps are nanosecond
|
|
95
|
+
* decimal strings built with BigInt so JS number precision can't corrupt them;
|
|
96
|
+
* `startTimeUnixNano <= timeUnixNano` is required by the protocol.
|
|
97
|
+
*/
|
|
98
|
+
export function buildDeltaCounterPayload(opts) {
|
|
99
|
+
const nowNano = BigInt(opts.nowMs ?? Date.now()) * 1000000n;
|
|
100
|
+
// A 1ms window keeps start strictly <= time without implying real duration.
|
|
101
|
+
const startNano = nowNano - 1000000n;
|
|
102
|
+
return {
|
|
103
|
+
resourceMetrics: [
|
|
104
|
+
{
|
|
105
|
+
resource: {
|
|
106
|
+
attributes: toAttributeArray({
|
|
107
|
+
"service.name": opts.serviceName ?? SERVICE_NAME,
|
|
108
|
+
"deployment.environment.name": opts.environment,
|
|
109
|
+
}),
|
|
110
|
+
},
|
|
111
|
+
scopeMetrics: [
|
|
112
|
+
{
|
|
113
|
+
scope: { name: opts.scopeName ?? SCOPE_NAME },
|
|
114
|
+
metrics: [
|
|
115
|
+
{
|
|
116
|
+
name: opts.name,
|
|
117
|
+
description: opts.description,
|
|
118
|
+
sum: {
|
|
119
|
+
aggregationTemporality: 1, // AGGREGATION_TEMPORALITY_DELTA
|
|
120
|
+
isMonotonic: true,
|
|
121
|
+
dataPoints: [
|
|
122
|
+
{
|
|
123
|
+
attributes: toAttributeArray(opts.attributes),
|
|
124
|
+
startTimeUnixNano: startNano.toString(),
|
|
125
|
+
timeUnixNano: nowNano.toString(),
|
|
126
|
+
asInt: "1",
|
|
127
|
+
},
|
|
128
|
+
],
|
|
129
|
+
},
|
|
130
|
+
},
|
|
131
|
+
],
|
|
132
|
+
},
|
|
133
|
+
],
|
|
134
|
+
},
|
|
135
|
+
],
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Fire-and-forget POST of a single counter increment as OTLP/HTTP JSON.
|
|
140
|
+
*
|
|
141
|
+
* Never throws and never rejects: any failure (no endpoint, DNS, timeout,
|
|
142
|
+
* non-2xx) resolves quietly so telemetry cannot break or delay the parent's
|
|
143
|
+
* supervision loop or shutdown. In production the request socket and timeout are
|
|
144
|
+
* `unref`'d so a slow collector can't keep the parent alive; tests pass
|
|
145
|
+
* `unref: false` and `await` to observe the request deterministically.
|
|
146
|
+
*/
|
|
147
|
+
export function emitOtlpCounter(opts) {
|
|
148
|
+
const env = opts.env ?? process.env;
|
|
149
|
+
const url = otlpMetricsUrl(env);
|
|
150
|
+
if (!url) {
|
|
151
|
+
return Promise.resolve();
|
|
152
|
+
}
|
|
153
|
+
let parsed;
|
|
154
|
+
try {
|
|
155
|
+
parsed = new URL(url);
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
return Promise.resolve();
|
|
159
|
+
}
|
|
160
|
+
const body = JSON.stringify(buildDeltaCounterPayload({
|
|
161
|
+
name: opts.name,
|
|
162
|
+
description: opts.description,
|
|
163
|
+
attributes: opts.attributes,
|
|
164
|
+
environment: deploymentEnvironment(env),
|
|
165
|
+
}));
|
|
166
|
+
const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
167
|
+
const unref = opts.unref ?? true;
|
|
168
|
+
const transport = parsed.protocol === "https:" ? https : http;
|
|
169
|
+
return new Promise((resolve) => {
|
|
170
|
+
let settled = false;
|
|
171
|
+
const done = () => {
|
|
172
|
+
if (settled)
|
|
173
|
+
return;
|
|
174
|
+
settled = true;
|
|
175
|
+
resolve();
|
|
176
|
+
};
|
|
177
|
+
const req = transport.request({
|
|
178
|
+
protocol: parsed.protocol,
|
|
179
|
+
hostname: parsed.hostname,
|
|
180
|
+
port: parsed.port,
|
|
181
|
+
path: parsed.pathname + parsed.search,
|
|
182
|
+
method: "POST",
|
|
183
|
+
headers: {
|
|
184
|
+
"content-type": "application/json",
|
|
185
|
+
"content-length": Buffer.byteLength(body),
|
|
186
|
+
},
|
|
187
|
+
}, (res) => {
|
|
188
|
+
// Drain so the socket can close; the status is irrelevant to the parent.
|
|
189
|
+
res.on("data", () => { });
|
|
190
|
+
res.on("end", done);
|
|
191
|
+
res.on("error", done);
|
|
192
|
+
});
|
|
193
|
+
req.on("error", done);
|
|
194
|
+
req.setTimeout(timeoutMs, () => {
|
|
195
|
+
req.destroy();
|
|
196
|
+
done();
|
|
197
|
+
});
|
|
198
|
+
if (unref) {
|
|
199
|
+
req.on("socket", (socket) => socket.unref());
|
|
200
|
+
}
|
|
201
|
+
req.end(body);
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
//# sourceMappingURL=otlp-config.js.map
|