feat: feed worker metrics into runtime router

This commit is contained in:
John
2026-07-02 07:35:10 +08:00
parent b97c8e822e
commit a13808b462
8 changed files with 399 additions and 9 deletions
+21 -3
View File
@@ -132,15 +132,19 @@ function createRuntimeRouter({
key('worker', workerId, 'ewma_first_token_ms'),
key('worker', workerId, 'error_rate'),
key('worker', workerId, 'memory_pressure'),
key('worker', workerId, 'cpu_load'),
key('worker', workerId, 'fd_pressure'),
key('worker', workerId, 'drain'),
]);
if (/^(1|true|yes)$/i.test(String(values[5] ?? ''))) return Number.POSITIVE_INFINITY;
if (/^(1|true|yes)$/i.test(String(values[7] ?? ''))) return Number.POSITIVE_INFINITY;
return (
readNumber(values[0]) * 3 +
readNumber(values[1]) +
readNumber(values[2]) * 0.01 +
readNumber(values[3]) * 5 +
readNumber(values[4]) * 2
readNumber(values[4]) * 2 +
readNumber(values[5]) * 2 +
readNumber(values[6]) * 2
);
};
const workerScoreFromValues = (values = []) => (
@@ -148,7 +152,9 @@ function createRuntimeRouter({
readNumber(values[1]) +
readNumber(values[2]) * 0.01 +
readNumber(values[3]) * 5 +
readNumber(values[4]) * 2
readNumber(values[4]) * 2 +
readNumber(values[12]) * 2 +
readNumber(values[13]) * 2
);
return {
async pickTarget(fallbackPick, orderedTargets = targets) {
@@ -233,6 +239,12 @@ function createRuntimeRouter({
key('worker', workerId, 'stream_error_count'),
key('worker', workerId, 'last_stream_started_at'),
key('worker', workerId, 'last_stream_ended_at'),
key('worker', workerId, 'cpu_load'),
key('worker', workerId, 'fd_pressure'),
key('worker', workerId, 'fd_count'),
key('worker', workerId, 'container_pids'),
key('worker', workerId, 'container_health'),
key('worker', workerId, 'metrics_sampled_at'),
])
.catch(() => [])
: [];
@@ -251,6 +263,12 @@ function createRuntimeRouter({
streamErrorCount: readNumber(values?.[9]),
lastStreamStartedAt: values?.[10] ? Number(values[10]) : null,
lastStreamEndedAt: values?.[11] ? Number(values[11]) : null,
cpuLoad: readNumber(values?.[12]),
fdPressure: readNumber(values?.[13]),
fdCount: readNumber(values?.[14]),
containerPids: readNumber(values?.[15]),
containerHealth: values?.[16] ?? null,
metricsSampledAt: values?.[17] ? Number(values[17]) : null,
score: workerScoreFromValues(values),
});
}