feat(telemetry): expose compute pipeline stage metrics

This commit is contained in:
DCCONSTRUCTIONS
2026-07-29 01:53:31 +03:00
parent 783aa444ac
commit 79eb4b46f7
19 changed files with 1000 additions and 24 deletions
@@ -14,6 +14,7 @@ export interface ComputeContour {
mqtt_host: string;
mqtt_port: number;
telemetry_poll_interval_seconds: number;
mqtt_publish_interval_seconds: number;
revision: number;
updated_at_utc: string | null;
}
@@ -33,6 +34,7 @@ export interface ComputeContourDraft {
mqtt_host: string;
mqtt_port: number;
telemetry_poll_interval_seconds: number;
mqtt_publish_interval_seconds: number;
}
export interface ComputeContourAgentInstall {
@@ -99,6 +101,7 @@ export async function createComputeContour(
mqtt_host: draft.mqtt_host,
mqtt_port: draft.mqtt_port,
telemetry_poll_interval_seconds: draft.telemetry_poll_interval_seconds,
mqtt_publish_interval_seconds: draft.mqtt_publish_interval_seconds,
}),
signal,
});
@@ -16,6 +16,7 @@ export interface WorkerTelemetryState {
}
export function useWorkerTelemetry(
contourId: string | null,
pollMilliseconds = DEFAULT_WORKER_TELEMETRY_POLL_MILLISECONDS,
enabled = true,
externalRefreshGeneration = 0,
@@ -30,7 +31,7 @@ export function useWorkerTelemetry(
const refresh = useCallback(() => setGeneration((value) => value + 1), []);
useEffect(() => {
if (!enabled) {
if (!enabled || !contourId) {
setTelemetry(null);
setLoading(false);
setError(null);
@@ -38,7 +39,7 @@ export function useWorkerTelemetry(
}
const controller = new AbortController();
setLoading(true);
void fetchWorkerTelemetry(controller.signal)
void fetchWorkerTelemetry(contourId, controller.signal)
.then((document) => {
if (controller.signal.aborted) return;
setTelemetry(document);
@@ -52,7 +53,7 @@ export function useWorkerTelemetry(
if (!controller.signal.aborted) setLoading(false);
});
return () => controller.abort();
}, [enabled, externalRefreshGeneration, generation]);
}, [contourId, enabled, externalRefreshGeneration, generation]);
useEffect(() => {
if (!enabled || loading) return;
@@ -181,13 +181,17 @@ async function requestJson(
}
export async function fetchWorkerTelemetry(
contourId: string,
signal?: AbortSignal,
): Promise<WorkerTelemetry> {
const document = requireJsonRecord(
await requestJson("/api/v1/system/worker-telemetry?history=90", {
method: "GET",
signal,
}),
await requestJson(
`/api/v1/system/contours/${encodeURIComponent(contourId)}/telemetry?history=90`,
{
method: "GET",
signal,
},
),
"missioncore.worker-telemetry/v1",
);
if (
@@ -198,7 +202,7 @@ export async function fetchWorkerTelemetry(
|| !isRecord(document.network)
|| !Array.isArray(document.history)
) {
throw new Error("Срез Worker 006 неполон.");
throw new Error("Срез вычислительного контура неполон.");
}
return document as unknown as WorkerTelemetry;
}