@superblocksteam/sdk 2.0.139 → 2.0.140-next.0
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 @@
|
|
|
1
|
+
{"version":3,"file":"otlp-config.js","sourceRoot":"","sources":["../../src/telemetry/otlp-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"otlp-config.test.d.ts","sourceRoot":"","sources":["../../src/telemetry/otlp-config.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import * as http from "node:http";
|
|
2
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
3
|
+
import { buildDeltaCounterPayload, deploymentEnvironment, emitOtlpCounter, otlpBaseUrl, otlpMetricsUrl, } from "./otlp-config.js";
|
|
4
|
+
describe("otlpBaseUrl", () => {
|
|
5
|
+
it("returns <origin>/api for a valid base URL, dropping any path", () => {
|
|
6
|
+
expect(otlpBaseUrl("https://app.superblocks.com/some/path")).toBe("https://app.superblocks.com/api");
|
|
7
|
+
});
|
|
8
|
+
it("returns undefined when the base URL is missing", () => {
|
|
9
|
+
expect(otlpBaseUrl(undefined)).toBeUndefined();
|
|
10
|
+
});
|
|
11
|
+
it("returns undefined on an unparseable base URL", () => {
|
|
12
|
+
expect(otlpBaseUrl("not a url")).toBeUndefined();
|
|
13
|
+
});
|
|
14
|
+
});
|
|
15
|
+
describe("otlpMetricsUrl", () => {
|
|
16
|
+
it("derives <baseUrl origin>/api/v1/metrics from SUPERBLOCKS_BASE_URL", () => {
|
|
17
|
+
expect(otlpMetricsUrl({
|
|
18
|
+
SUPERBLOCKS_BASE_URL: "https://pr-19864.superblocks.dev/some/path",
|
|
19
|
+
})).toBe("https://pr-19864.superblocks.dev/api/v1/metrics");
|
|
20
|
+
});
|
|
21
|
+
it("always exports through the server proxy: SUPERBLOCKS_OTEL_COLLECTOR_URL alone is ignored", () => {
|
|
22
|
+
// There is no direct-to-collector path anymore; the server proxies OTLP.
|
|
23
|
+
expect(otlpMetricsUrl({
|
|
24
|
+
SUPERBLOCKS_OTEL_COLLECTOR_URL: "http://localhost:4318",
|
|
25
|
+
})).toBeNull();
|
|
26
|
+
});
|
|
27
|
+
it("returns null when no base URL is present (emission is skipped)", () => {
|
|
28
|
+
expect(otlpMetricsUrl({})).toBeNull();
|
|
29
|
+
});
|
|
30
|
+
it("returns null on an unparseable base URL", () => {
|
|
31
|
+
expect(otlpMetricsUrl({ SUPERBLOCKS_BASE_URL: "not a url" })).toBeNull();
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
describe("warnIfCollectorUrlIgnored", () => {
|
|
35
|
+
it("warns once (and only once) when the retired direct-export var is set", async () => {
|
|
36
|
+
// The module-level call in otlp-config.ts latches the once-flag against
|
|
37
|
+
// the real process.env at import time, so a shell that exports the var
|
|
38
|
+
// would make the statically imported instance a no-op here. Import a
|
|
39
|
+
// fresh instance with the var stubbed away.
|
|
40
|
+
vi.stubEnv("SUPERBLOCKS_OTEL_COLLECTOR_URL", "");
|
|
41
|
+
vi.resetModules();
|
|
42
|
+
const { warnIfCollectorUrlIgnored } = await import("./otlp-config.js");
|
|
43
|
+
const warn = vi.spyOn(console, "warn").mockImplementation(() => { });
|
|
44
|
+
warnIfCollectorUrlIgnored({});
|
|
45
|
+
expect(warn).not.toHaveBeenCalled();
|
|
46
|
+
warnIfCollectorUrlIgnored({
|
|
47
|
+
SUPERBLOCKS_OTEL_COLLECTOR_URL: "http://localhost:4318",
|
|
48
|
+
});
|
|
49
|
+
warnIfCollectorUrlIgnored({
|
|
50
|
+
SUPERBLOCKS_OTEL_COLLECTOR_URL: "http://localhost:4318",
|
|
51
|
+
});
|
|
52
|
+
expect(warn).toHaveBeenCalledTimes(1);
|
|
53
|
+
expect(warn.mock.calls[0][0]).toContain("SUPERBLOCKS_OTEL_COLLECTOR_URL");
|
|
54
|
+
warn.mockRestore();
|
|
55
|
+
vi.unstubAllEnvs();
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
describe("deploymentEnvironment", () => {
|
|
59
|
+
it("maps an ephemeral pr-<n> host to 'ephemeral'", () => {
|
|
60
|
+
expect(deploymentEnvironment({
|
|
61
|
+
SUPERBLOCKS_BASE_URL: "https://pr-19864.superblocks.dev",
|
|
62
|
+
})).toBe("ephemeral");
|
|
63
|
+
});
|
|
64
|
+
it("maps localhost to 'local'", () => {
|
|
65
|
+
expect(deploymentEnvironment({ SUPERBLOCKS_BASE_URL: "http://localhost:3000" })).toBe("local");
|
|
66
|
+
});
|
|
67
|
+
it("maps the production host to 'prod'", () => {
|
|
68
|
+
expect(deploymentEnvironment({
|
|
69
|
+
SUPERBLOCKS_BASE_URL: "https://app.superblocks.com",
|
|
70
|
+
})).toBe("prod");
|
|
71
|
+
});
|
|
72
|
+
it("falls back to 'other' when no base URL is available", () => {
|
|
73
|
+
expect(deploymentEnvironment({})).toBe("other");
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
describe("buildDeltaCounterPayload", () => {
|
|
77
|
+
it("builds a monotonic DELTA sum with one int data point and the given attributes", () => {
|
|
78
|
+
const payload = buildDeltaCounterPayload({
|
|
79
|
+
name: "dev_server_child_respawn_completed_total",
|
|
80
|
+
description: "desc",
|
|
81
|
+
attributes: { reason: "flip_restart" },
|
|
82
|
+
environment: "ephemeral",
|
|
83
|
+
nowMs: 1_730_000_000_000,
|
|
84
|
+
});
|
|
85
|
+
const rm = payload.resourceMetrics[0];
|
|
86
|
+
const resourceAttrs = Object.fromEntries(rm.resource.attributes.map((a) => [a.key, a.value.stringValue]));
|
|
87
|
+
expect(resourceAttrs["service.name"]).toBe("sdk-dev-server");
|
|
88
|
+
expect(resourceAttrs["deployment.environment.name"]).toBe("ephemeral");
|
|
89
|
+
const metric = rm.scopeMetrics[0].metrics[0];
|
|
90
|
+
expect(metric.sum.isMonotonic).toBe(true);
|
|
91
|
+
expect(metric.sum.aggregationTemporality).toBe(1); // DELTA
|
|
92
|
+
const dp = metric.sum.dataPoints[0];
|
|
93
|
+
expect(dp.asInt).toBe("1");
|
|
94
|
+
const dpAttrs = Object.fromEntries(dp.attributes.map((a) => [a.key, a.value.stringValue]));
|
|
95
|
+
expect(dpAttrs.reason).toBe("flip_restart");
|
|
96
|
+
// Nanosecond timestamps must be decimal strings, start <= time.
|
|
97
|
+
expect(typeof dp.timeUnixNano).toBe("string");
|
|
98
|
+
expect(BigInt(dp.startTimeUnixNano) <= BigInt(dp.timeUnixNano)).toBe(true);
|
|
99
|
+
expect(dp.timeUnixNano).toBe((BigInt(1_730_000_000_000) * 1000000n).toString());
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
describe("emitOtlpCounter (integration: listens on the OTLP endpoint)", () => {
|
|
103
|
+
let server;
|
|
104
|
+
let received;
|
|
105
|
+
let port;
|
|
106
|
+
beforeEach(async () => {
|
|
107
|
+
received = null;
|
|
108
|
+
server = http.createServer((req, res) => {
|
|
109
|
+
let body = "";
|
|
110
|
+
req.on("data", (c) => (body += c));
|
|
111
|
+
req.on("end", () => {
|
|
112
|
+
received = {
|
|
113
|
+
url: req.url,
|
|
114
|
+
contentType: req.headers["content-type"],
|
|
115
|
+
body,
|
|
116
|
+
};
|
|
117
|
+
res.writeHead(200, { "content-type": "application/json" });
|
|
118
|
+
res.end("{}");
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
await new Promise((resolve) => server.listen(0, "127.0.0.1", resolve));
|
|
122
|
+
port = server.address().port;
|
|
123
|
+
});
|
|
124
|
+
afterEach(async () => {
|
|
125
|
+
await new Promise((resolve) => server.close(() => resolve()));
|
|
126
|
+
});
|
|
127
|
+
it("POSTs the counter as OTLP JSON to the server proxy's /api/v1/metrics", async () => {
|
|
128
|
+
await emitOtlpCounter({
|
|
129
|
+
name: "dev_server_child_respawn_completed_total",
|
|
130
|
+
description: "desc",
|
|
131
|
+
attributes: { reason: "flip_restart" },
|
|
132
|
+
env: { SUPERBLOCKS_BASE_URL: `http://127.0.0.1:${port}` },
|
|
133
|
+
// Tests must observe the request, so keep the socket alive (no unref) and
|
|
134
|
+
// await the POST instead of fire-and-forget.
|
|
135
|
+
unref: false,
|
|
136
|
+
timeoutMs: 5000,
|
|
137
|
+
});
|
|
138
|
+
expect(received).not.toBeNull();
|
|
139
|
+
expect(received.url).toBe("/api/v1/metrics");
|
|
140
|
+
expect(received.contentType).toContain("application/json");
|
|
141
|
+
const parsed = JSON.parse(received.body);
|
|
142
|
+
const metric = parsed.resourceMetrics[0].scopeMetrics[0].metrics[0];
|
|
143
|
+
expect(metric.sum.dataPoints[0].asInt).toBe("1");
|
|
144
|
+
});
|
|
145
|
+
it("resolves without throwing and sends nothing when no base URL is configured", async () => {
|
|
146
|
+
await expect(emitOtlpCounter({
|
|
147
|
+
name: "dev_server_child_respawn_completed_total",
|
|
148
|
+
description: "desc",
|
|
149
|
+
attributes: { reason: "flip_restart" },
|
|
150
|
+
env: {},
|
|
151
|
+
unref: false,
|
|
152
|
+
})).resolves.toBeUndefined();
|
|
153
|
+
expect(received).toBeNull();
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
//# sourceMappingURL=otlp-config.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"otlp-config.test.js","sourceRoot":"","sources":["../../src/telemetry/otlp-config.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Early telemetry preload for the dev-server child.
|
|
3
|
+
*
|
|
4
|
+
* This module has ONE job: start the OpenTelemetry SDK before any instrumented
|
|
5
|
+
* module (node:http, express, the ai-service) is loaded. OTel auto-instrumentation
|
|
6
|
+
* patches modules at require time, so if the SDK starts late — as it did when the
|
|
7
|
+
* only init was `configureTelemetry` at connect time — those modules load
|
|
8
|
+
* unpatched and the dev-server exports nothing. The child entry (`dev.mts`)
|
|
9
|
+
* imports this as its very first import so it runs before the SDK barrel.
|
|
10
|
+
*
|
|
11
|
+
* It intentionally does NOT init dd-trace/LLMObs. Those spans are created during
|
|
12
|
+
* generation (after connect) and need the application id that is only known then,
|
|
13
|
+
* so `configureTelemetry` still owns LLMObs. `configureTelemetry`'s own
|
|
14
|
+
* `initNodeTelemetry` call becomes a no-op here: `initNodeTelemetry` returns the
|
|
15
|
+
* already-created instance, so we init once, early.
|
|
16
|
+
*
|
|
17
|
+
* Config comes from the environment (available at process start), not the auth
|
|
18
|
+
* file, so nothing here has to await a network/disk read. The endpoint and
|
|
19
|
+
* environment tag are resolved by the shared `otlp-config` module, the same one
|
|
20
|
+
* the lightweight parent uses, so parent and child agree on where telemetry goes.
|
|
21
|
+
*/
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=preload.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preload.d.ts","sourceRoot":"","sources":["../../src/telemetry/preload.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Early telemetry preload for the dev-server child.
|
|
3
|
+
*
|
|
4
|
+
* This module has ONE job: start the OpenTelemetry SDK before any instrumented
|
|
5
|
+
* module (node:http, express, the ai-service) is loaded. OTel auto-instrumentation
|
|
6
|
+
* patches modules at require time, so if the SDK starts late — as it did when the
|
|
7
|
+
* only init was `configureTelemetry` at connect time — those modules load
|
|
8
|
+
* unpatched and the dev-server exports nothing. The child entry (`dev.mts`)
|
|
9
|
+
* imports this as its very first import so it runs before the SDK barrel.
|
|
10
|
+
*
|
|
11
|
+
* It intentionally does NOT init dd-trace/LLMObs. Those spans are created during
|
|
12
|
+
* generation (after connect) and need the application id that is only known then,
|
|
13
|
+
* so `configureTelemetry` still owns LLMObs. `configureTelemetry`'s own
|
|
14
|
+
* `initNodeTelemetry` call becomes a no-op here: `initNodeTelemetry` returns the
|
|
15
|
+
* already-created instance, so we init once, early.
|
|
16
|
+
*
|
|
17
|
+
* Config comes from the environment (available at process start), not the auth
|
|
18
|
+
* file, so nothing here has to await a network/disk read. The endpoint and
|
|
19
|
+
* environment tag are resolved by the shared `otlp-config` module, the same one
|
|
20
|
+
* the lightweight parent uses, so parent and child agree on where telemetry goes.
|
|
21
|
+
*/
|
|
22
|
+
import os from "node:os";
|
|
23
|
+
import { ExpressInstrumentation } from "@opentelemetry/instrumentation-express";
|
|
24
|
+
import { HttpInstrumentation } from "@opentelemetry/instrumentation-http";
|
|
25
|
+
import { DeploymentTypeEnum } from "@superblocksteam/shared";
|
|
26
|
+
import { getDefaultPolicy, initNodeTelemetry, parseDeploymentType, } from "@superblocksteam/telemetry";
|
|
27
|
+
import packageJson from "../../package.json" with { type: "json" };
|
|
28
|
+
import { ATTR_SUPERBLOCKS_BASE_URL, ATTR_SUPERBLOCKS_CSB_ID, ATTR_SUPERBLOCKS_IS_CSB, getEnvironmentFromHostname, } from "./attributes.js";
|
|
29
|
+
import { getTelemetryIdentity } from "./identity.js";
|
|
30
|
+
import { applyLocalObsEnvVars } from "./local-obs.js";
|
|
31
|
+
import { otlpBaseUrl, SERVICE_NAME } from "./otlp-config.js";
|
|
32
|
+
// Apply local-obs env defaults first so deployment type / export policy are set
|
|
33
|
+
// before we read them below (mirrors the module-scope call in index.ts).
|
|
34
|
+
applyLocalObsEnvVars();
|
|
35
|
+
const baseUrl = process.env.SUPERBLOCKS_BASE_URL;
|
|
36
|
+
const otlpUrl = otlpBaseUrl(baseUrl);
|
|
37
|
+
// Without a base URL we have no proxy to export to; skip early init and let the
|
|
38
|
+
// later configureTelemetry path (which resolves config from the auth file) run.
|
|
39
|
+
// Warn so the fallback is visible: by then http/express are already loaded
|
|
40
|
+
// unpatched, so auto-instrumented traces are missing for this run.
|
|
41
|
+
if (!otlpUrl) {
|
|
42
|
+
console.warn("[Telemetry] SUPERBLOCKS_BASE_URL is not set; skipping early OpenTelemetry init. Auto-instrumented HTTP/Express traces will be missing for this run.");
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
const hostname = (() => {
|
|
46
|
+
try {
|
|
47
|
+
return baseUrl ? new URL(baseUrl).hostname : "";
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
return "";
|
|
51
|
+
}
|
|
52
|
+
})();
|
|
53
|
+
const isCsb = !!process.env.SUPERBLOCKS_IS_CSB;
|
|
54
|
+
// A typo'd SUPERBLOCKS_DEPLOYMENT_TYPE must not abort early init; default to
|
|
55
|
+
// CLOUD like the connect-time path in index.ts does.
|
|
56
|
+
const deploymentType = (() => {
|
|
57
|
+
try {
|
|
58
|
+
return parseDeploymentType(process.env.SUPERBLOCKS_DEPLOYMENT_TYPE);
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
console.warn("[Telemetry] Invalid SUPERBLOCKS_DEPLOYMENT_TYPE, defaulting to CLOUD:", error);
|
|
62
|
+
return DeploymentTypeEnum.CLOUD;
|
|
63
|
+
}
|
|
64
|
+
})();
|
|
65
|
+
try {
|
|
66
|
+
initNodeTelemetry({
|
|
67
|
+
serviceName: SERVICE_NAME,
|
|
68
|
+
serviceVersion: packageJson.version,
|
|
69
|
+
environment: getEnvironmentFromHostname(hostname),
|
|
70
|
+
otlpUrl,
|
|
71
|
+
resourceAttributes: {
|
|
72
|
+
[ATTR_SUPERBLOCKS_BASE_URL]: hostname,
|
|
73
|
+
[ATTR_SUPERBLOCKS_IS_CSB]: String(isCsb),
|
|
74
|
+
...(isCsb && { [ATTR_SUPERBLOCKS_CSB_ID]: os.hostname() }),
|
|
75
|
+
},
|
|
76
|
+
instrumentations: [
|
|
77
|
+
new HttpInstrumentation(),
|
|
78
|
+
new ExpressInstrumentation(),
|
|
79
|
+
],
|
|
80
|
+
logsEnabled: true,
|
|
81
|
+
// Identity (application/user/org) is only known at connect;
|
|
82
|
+
// configureTelemetry fills it in and every span and exported log
|
|
83
|
+
// record picks it up here.
|
|
84
|
+
dynamicAttributes: getTelemetryIdentity,
|
|
85
|
+
}, getDefaultPolicy(deploymentType));
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
// Never let telemetry init crash the dev-server boot.
|
|
89
|
+
console.error("[Telemetry] Early preload failed to initialize:", error);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=preload.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preload.js","sourceRoot":"","sources":["../../src/telemetry/preload.ts"],"names":[],"mappings":"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"}
|
package/dist/telemetry/util.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
|
|
1
|
+
import { SERVICE_NAME } from "./otlp-config.js";
|
|
2
|
+
export { SERVICE_NAME };
|
|
2
3
|
export declare function getConfiguration(): Promise<{
|
|
3
4
|
superblocksBaseUrl: import("url").URL;
|
|
4
|
-
otlpBaseUrl: string;
|
|
5
|
+
otlpBaseUrl: string | undefined;
|
|
5
6
|
superblocksHostname: string;
|
|
6
7
|
serviceName: string;
|
|
7
|
-
token: string;
|
|
8
8
|
}>;
|
|
9
9
|
//# sourceMappingURL=util.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../src/telemetry/util.ts"],"names":[],"mappings":"AAEA,
|
|
1
|
+
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../src/telemetry/util.ts"],"names":[],"mappings":"AAEA,OAAO,EAAe,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAI7D,OAAO,EAAE,YAAY,EAAE,CAAC;AAExB,wBAAsB,gBAAgB;;;;;GAmBrC"}
|
package/dist/telemetry/util.js
CHANGED
|
@@ -1,45 +1,19 @@
|
|
|
1
1
|
import { getLocalTokenWithUrl } from "@superblocksteam/util";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
* Priority:
|
|
7
|
-
* 1. SUPERBLOCKS_OTEL_COLLECTOR_URL env var (for local obs mode)
|
|
8
|
-
* 2. Superblocks API endpoint derived from base URL
|
|
9
|
-
*
|
|
10
|
-
* When SUPERBLOCKS_OTEL_COLLECTOR_URL is set (e.g., http://localhost:4318),
|
|
11
|
-
* telemetry is sent directly to the local OTEL collector.
|
|
12
|
-
*
|
|
13
|
-
* Note: This returns the BASE URL. The telemetry library appends /v1/traces,
|
|
14
|
-
* /v1/metrics, /v1/logs to this URL.
|
|
15
|
-
*/
|
|
16
|
-
function getOtlpBaseUrl(superblocksBaseUrl) {
|
|
17
|
-
const localOtelUrl = process.env.SUPERBLOCKS_OTEL_COLLECTOR_URL;
|
|
18
|
-
if (localOtelUrl) {
|
|
19
|
-
// Remove trailing /v1/traces etc. if present (just use base URL)
|
|
20
|
-
return localOtelUrl.replace(/\/v1\/(traces|metrics|logs)$/, "");
|
|
21
|
-
}
|
|
22
|
-
// Default: Superblocks API proxies OTLP requests
|
|
23
|
-
// The server expects /api/v1/traces but the telemetry lib adds /v1/traces,
|
|
24
|
-
// so we return /api and let telemetry lib append /v1/traces
|
|
25
|
-
return superblocksBaseUrl.origin + "/api";
|
|
26
|
-
}
|
|
2
|
+
import { otlpBaseUrl, SERVICE_NAME } from "./otlp-config.js";
|
|
3
|
+
// Re-exported so existing importers of `./util.js` keep resolving SERVICE_NAME
|
|
4
|
+
// from the single source of truth in otlp-config.
|
|
5
|
+
export { SERVICE_NAME };
|
|
27
6
|
export async function getConfiguration() {
|
|
28
7
|
try {
|
|
29
8
|
const tokenWithUrl = await getLocalTokenWithUrl();
|
|
30
9
|
const superblocksBaseUrl = new URL(tokenWithUrl.superblocksBaseUrl);
|
|
31
|
-
const
|
|
10
|
+
const otlpBase = otlpBaseUrl(superblocksBaseUrl);
|
|
32
11
|
const superblocksHostname = superblocksBaseUrl.hostname;
|
|
33
|
-
let token = "";
|
|
34
|
-
if ("token" in tokenWithUrl) {
|
|
35
|
-
token = tokenWithUrl.token.substring(0, 8);
|
|
36
|
-
}
|
|
37
12
|
return {
|
|
38
13
|
superblocksBaseUrl,
|
|
39
|
-
otlpBaseUrl,
|
|
14
|
+
otlpBaseUrl: otlpBase,
|
|
40
15
|
superblocksHostname,
|
|
41
16
|
serviceName: SERVICE_NAME,
|
|
42
|
-
token,
|
|
43
17
|
};
|
|
44
18
|
}
|
|
45
19
|
catch (e) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/telemetry/util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAE7D,
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/telemetry/util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAE7D,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAE7D,+EAA+E;AAC/E,kDAAkD;AAClD,OAAO,EAAE,YAAY,EAAE,CAAC;AAExB,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,MAAM,oBAAoB,EAAE,CAAC;QAClD,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAC;QACpE,MAAM,QAAQ,GAAG,WAAW,CAAC,kBAAkB,CAAC,CAAC;QACjD,MAAM,mBAAmB,GAAG,kBAAkB,CAAC,QAAQ,CAAC;QACxD,OAAO;YACL,kBAAkB;YAClB,WAAW,EAAE,QAAQ;YACrB,mBAAmB;YACnB,WAAW,EAAE,YAAY;SAC1B,CAAC;IACJ,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CACX,4FAA4F,EAC5F,CAAC,CACF,CAAC;QACF,MAAM,CAAC,CAAC;IACV,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@superblocksteam/sdk",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.140-next.0",
|
|
4
4
|
"description": "Superblocks JS SDK",
|
|
5
5
|
"homepage": "https://www.superblocks.com",
|
|
6
6
|
"license": "Superblocks Community Software License",
|
|
@@ -9,10 +9,18 @@
|
|
|
9
9
|
".": {
|
|
10
10
|
"types": "./dist/index.d.ts",
|
|
11
11
|
"import": "./dist/index.js"
|
|
12
|
+
},
|
|
13
|
+
"./otlp-config": {
|
|
14
|
+
"types": "./dist/telemetry/otlp-config.d.ts",
|
|
15
|
+
"import": "./dist/telemetry/otlp-config.js"
|
|
16
|
+
},
|
|
17
|
+
"./telemetry-preload": {
|
|
18
|
+
"types": "./dist/telemetry/preload.d.ts",
|
|
19
|
+
"import": "./dist/telemetry/preload.js"
|
|
12
20
|
}
|
|
13
21
|
},
|
|
14
22
|
"dependencies": {
|
|
15
|
-
"@babel/core": "7.
|
|
23
|
+
"@babel/core": "7.29.6",
|
|
16
24
|
"@babel/parser": "^7.25.8",
|
|
17
25
|
"@babel/plugin-proposal-decorators": "^7.28.0",
|
|
18
26
|
"@babel/plugin-transform-typescript": "7.28.0",
|
|
@@ -35,24 +43,25 @@
|
|
|
35
43
|
"dd-trace": "^5.57.1",
|
|
36
44
|
"express": "^4.21.1",
|
|
37
45
|
"fast-glob": "^3.3.3",
|
|
38
|
-
"form-data": "^4.0.
|
|
46
|
+
"form-data": "^4.0.6",
|
|
39
47
|
"fs-extra": "^11.3.0",
|
|
40
48
|
"jwt-decode": "^4.0.0",
|
|
41
49
|
"lodash-es": "^4.18.1",
|
|
42
50
|
"package-manager-detector": "^1.3.0",
|
|
51
|
+
"react-compiler-runtime": "1.0.0",
|
|
43
52
|
"read-pkg": "^9.0.1",
|
|
44
53
|
"semver": "^7.5.4",
|
|
45
54
|
"simple-git": "^3.36.0",
|
|
46
55
|
"slugify": "^1.6.6",
|
|
47
|
-
"vite": "6.4.
|
|
56
|
+
"vite": "6.4.3",
|
|
48
57
|
"vite-tsconfig-paths": "^6.0.4",
|
|
49
58
|
"winston": "^3.17.0",
|
|
50
59
|
"yaml": "^2.7.1",
|
|
51
|
-
"@superblocksteam/library-shared": "2.0.
|
|
52
|
-
"@superblocksteam/shared": "0.
|
|
53
|
-
"@superblocksteam/telemetry": "2.0.
|
|
54
|
-
"@superblocksteam/
|
|
55
|
-
"@superblocksteam/
|
|
60
|
+
"@superblocksteam/library-shared": "2.0.140-next.0",
|
|
61
|
+
"@superblocksteam/shared": "0.9597.0",
|
|
62
|
+
"@superblocksteam/telemetry": "2.0.140-next.0",
|
|
63
|
+
"@superblocksteam/util": "2.0.140-next.0",
|
|
64
|
+
"@superblocksteam/vite-plugin-file-sync": "2.0.140-next.0"
|
|
56
65
|
},
|
|
57
66
|
"devDependencies": {
|
|
58
67
|
"@eslint/js": "^9.39.2",
|
|
@@ -10,6 +10,7 @@ import { injectIndexVitePlugin } from "@superblocksteam/vite-plugin-file-sync/in
|
|
|
10
10
|
|
|
11
11
|
import { customComponentsPlugin } from "./dev-utils/custom-build.mjs";
|
|
12
12
|
import { ddRumPlugin } from "./dev-utils/vite-plugin-dd-rum.mjs";
|
|
13
|
+
import { reactCompilerRuntimeAlias } from "./react-compiler-runtime-shim.mjs";
|
|
13
14
|
import { getLogger } from "./telemetry/logging.js";
|
|
14
15
|
import { generateApiBuildManifestPlugin } from "./vite-plugin-generate-api-build-manifest.mjs";
|
|
15
16
|
import { injectSuperblocksIdsPlugin } from "./vite-plugin-inject-sb-ids-transform.mjs";
|
|
@@ -95,12 +96,15 @@ async function buildWithVite({
|
|
|
95
96
|
|
|
96
97
|
const customFolder = path.join(root, "custom");
|
|
97
98
|
|
|
99
|
+
const compilerRuntimeAlias = reactCompilerRuntimeAlias();
|
|
100
|
+
|
|
98
101
|
await build({
|
|
99
102
|
root,
|
|
100
103
|
mode,
|
|
101
104
|
appType: "spa",
|
|
102
105
|
clearScreen: true,
|
|
103
106
|
resolve: {
|
|
107
|
+
alias: compilerRuntimeAlias ? [compilerRuntimeAlias] : [],
|
|
104
108
|
// Deduplicate these packages to prevent multiple instances in the bundle.
|
|
105
109
|
// This is critical for React context providers like react-router to work correctly.
|
|
106
110
|
dedupe: ["react", "react-dom", "react-router"],
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { isAbsolute } from "node:path";
|
|
3
|
+
|
|
4
|
+
import { describe, expect, it } from "vitest";
|
|
5
|
+
|
|
6
|
+
import { buildResolveConfig } from "./dev-server.mjs";
|
|
7
|
+
|
|
8
|
+
describe("buildResolveConfig", () => {
|
|
9
|
+
it("aliases react/compiler-runtime to an existing shim file", () => {
|
|
10
|
+
const config = buildResolveConfig();
|
|
11
|
+
const aliases = config?.alias as unknown as Array<{
|
|
12
|
+
find: string;
|
|
13
|
+
replacement: string;
|
|
14
|
+
}>;
|
|
15
|
+
|
|
16
|
+
const entry = aliases.find((a) => a.find === "react/compiler-runtime");
|
|
17
|
+
expect(entry).toBeDefined();
|
|
18
|
+
expect(isAbsolute(entry!.replacement)).toBe(true);
|
|
19
|
+
expect(existsSync(entry!.replacement)).toBe(true);
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
it("does not alias bare react or react/jsx-runtime", () => {
|
|
23
|
+
const aliases = buildResolveConfig()?.alias as unknown as Array<{
|
|
24
|
+
find: string;
|
|
25
|
+
}>;
|
|
26
|
+
expect(aliases.some((a) => a.find === "react")).toBe(false);
|
|
27
|
+
expect(aliases.some((a) => a.find === "react/jsx-runtime")).toBe(false);
|
|
28
|
+
});
|
|
29
|
+
});
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { Tracer } from "@opentelemetry/api";
|
|
2
|
+
import { describe, expect, it, vi } from "vitest";
|
|
3
|
+
|
|
4
|
+
import type * as TelemetryModule from "../telemetry/index.js";
|
|
5
|
+
|
|
6
|
+
const { firstTracer, getTracerMock, secondTracer } = vi.hoisted(() => ({
|
|
7
|
+
firstTracer: { name: "first-tracer" } as unknown as Tracer,
|
|
8
|
+
getTracerMock: vi.fn(),
|
|
9
|
+
secondTracer: { name: "second-tracer" } as unknown as Tracer,
|
|
10
|
+
}));
|
|
11
|
+
|
|
12
|
+
vi.mock("../telemetry/index.js", async (importOriginal) => {
|
|
13
|
+
const actual = await importOriginal<typeof TelemetryModule>();
|
|
14
|
+
|
|
15
|
+
return {
|
|
16
|
+
...actual,
|
|
17
|
+
getTracer: getTracerMock,
|
|
18
|
+
};
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
import { getDevServerTracer } from "./dev-server.mjs";
|
|
22
|
+
|
|
23
|
+
describe("getDevServerTracer", () => {
|
|
24
|
+
it("resolves the SDK tracer at call time", () => {
|
|
25
|
+
getTracerMock
|
|
26
|
+
.mockReturnValueOnce(firstTracer)
|
|
27
|
+
.mockReturnValueOnce(secondTracer);
|
|
28
|
+
|
|
29
|
+
expect(getDevServerTracer()).toBe(firstTracer);
|
|
30
|
+
expect(getDevServerTracer()).toBe(secondTracer);
|
|
31
|
+
});
|
|
32
|
+
});
|
|
@@ -41,6 +41,7 @@ import type { SyncService } from "@superblocksteam/vite-plugin-file-sync/sync-se
|
|
|
41
41
|
|
|
42
42
|
import pkg from "../../package.json" with { type: "json" };
|
|
43
43
|
import { flagOrEnv } from "../flag.js";
|
|
44
|
+
import { reactCompilerRuntimeAlias } from "../react-compiler-runtime-shim.mjs";
|
|
44
45
|
import type { SuperblocksSdk } from "../sdk.js";
|
|
45
46
|
import { getTracer } from "../telemetry/index.js";
|
|
46
47
|
import { getErrorMeta, getLogger } from "../telemetry/logging.js";
|
|
@@ -78,9 +79,12 @@ import {
|
|
|
78
79
|
import { buildManifestStubPlugin } from "./vite-plugin-build-manifest-stub.mjs";
|
|
79
80
|
import { ddRumPlugin } from "./vite-plugin-dd-rum.mjs";
|
|
80
81
|
|
|
81
|
-
const tracer = getTracer();
|
|
82
82
|
const logger = getLogger();
|
|
83
83
|
|
|
84
|
+
export function getDevServerTracer() {
|
|
85
|
+
return getTracer();
|
|
86
|
+
}
|
|
87
|
+
|
|
84
88
|
/**
|
|
85
89
|
* Maps a dev-server request URL onto a low-cardinality endpoint label for
|
|
86
90
|
* metrics. Returns undefined for non-`/_sb_*` URLs (Vite-proxied traffic).
|
|
@@ -162,6 +166,20 @@ const OPTIMIZE_DEPS_CONFIG: UserConfig["optimizeDeps"] = {
|
|
|
162
166
|
},
|
|
163
167
|
};
|
|
164
168
|
|
|
169
|
+
/**
|
|
170
|
+
* Vite `resolve` config shared by both the activation and pre-warm servers.
|
|
171
|
+
*
|
|
172
|
+
* Applies the `react/compiler-runtime` → shim alias via `reactCompilerRuntimeAlias()`.
|
|
173
|
+
* Must stay identical across both `createServer()` calls — Vite hashes this
|
|
174
|
+
* config into the dep-optimization cache (see OPTIMIZE_DEPS_CONFIG note).
|
|
175
|
+
*/
|
|
176
|
+
export function buildResolveConfig(): UserConfig["resolve"] {
|
|
177
|
+
const alias = reactCompilerRuntimeAlias();
|
|
178
|
+
return {
|
|
179
|
+
alias: alias ? [alias] : [],
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
|
|
165
183
|
/**
|
|
166
184
|
* Builds the Vite plugin list shared by both pre-warm and activation.
|
|
167
185
|
*
|
|
@@ -1449,6 +1467,7 @@ async function startVite({
|
|
|
1449
1467
|
dispose: () => void;
|
|
1450
1468
|
routeIndex: number;
|
|
1451
1469
|
}> {
|
|
1470
|
+
const tracer = getDevServerTracer();
|
|
1452
1471
|
return tracer.startActiveSpan("startVite", async (startViteSpan) => {
|
|
1453
1472
|
try {
|
|
1454
1473
|
const logger = getLogger(loggerOverride);
|
|
@@ -1541,6 +1560,7 @@ async function startVite({
|
|
|
1541
1560
|
clearScreen: process.env.SUPERBLOCKS_CLI_ENV !== "local",
|
|
1542
1561
|
customLogger: viteLogger,
|
|
1543
1562
|
optimizeDeps: OPTIMIZE_DEPS_CONFIG,
|
|
1563
|
+
resolve: buildResolveConfig(),
|
|
1544
1564
|
server: {
|
|
1545
1565
|
middlewareMode: true,
|
|
1546
1566
|
watch: {
|
|
@@ -1638,6 +1658,7 @@ export async function preWarmViteCache(root: string): Promise<void> {
|
|
|
1638
1658
|
plugins: vitePlugins(root, { fileSync: fileSyncVitePlugin().plugin }),
|
|
1639
1659
|
logLevel: "warn",
|
|
1640
1660
|
optimizeDeps: OPTIMIZE_DEPS_CONFIG,
|
|
1661
|
+
resolve: buildResolveConfig(),
|
|
1641
1662
|
});
|
|
1642
1663
|
const depsDir = path.join(root, "node_modules", ".vite", "deps");
|
|
1643
1664
|
const pollMs = 100;
|