@inso_web/els-mcp
Version:
MCP-сервер поверх INSO Error Logs Service. Read-only tools (search, analytics, fingerprinting, correlations) для подключения Claude Desktop/Code и ChatGPT к логам ошибок. Streamable HTTP transport + stdio для npx-запуска.
77 lines • 3.06 kB
JavaScript
const SERVICE_VERSION = process.env.GIT_SHA ?? process.env.npm_package_version ?? '0.1.0-alpha.0';
export function checkLiveness() {
return {
status: 'ok',
uptimeSec: Math.round(process.uptime()),
version: SERVICE_VERSION,
};
}
export async function checkReadiness(deps = {}) {
const timeoutMs = deps.timeoutMs ?? 3000;
const [redisCheck, upstreamCheck] = await Promise.all([
deps.redis ? withTimeout(checkRedis(deps.redis), timeoutMs) : Promise.resolve({ ok: true }),
deps.elsClient
? withTimeout(checkUpstream(deps.elsClient, deps.elsHealthPath), timeoutMs)
: Promise.resolve({ ok: true }),
]);
const ready = redisCheck.ok && upstreamCheck.ok;
return {
status: ready ? 'ready' : 'not_ready',
checks: {
redis: redisCheck,
upstream: upstreamCheck,
},
};
}
async function checkRedis(redis) {
// Redis "недоступен" — это допустимое degraded состояние: cache miss всегда.
// Поэтому для readyz считаем "ok" если либо Redis pingается, либо disabled.
// Если был сконфигурирован, но не отвечает → not ready (force k8s degrade).
const start = Date.now();
try {
const ok = await redis.ping();
const latencyMs = Date.now() - start;
if (!ok) {
return { ok: false, latencyMs, error: 'ping failed' };
}
return { ok: true, latencyMs };
}
catch (err) {
return { ok: false, error: err.message };
}
}
async function checkUpstream(client, pathHint) {
// ELS известен через client'а. Не у всех методов есть health-check;
// делаем "lightweight probe" — пробуем listApps() с очень коротким timeout.
// Если 401/403 — endpoint reachable, но key недостаточно для list_apps; всё равно ok.
// Если 5xx или connection refused — not ready.
void pathHint;
const start = Date.now();
try {
await client.listApps();
return { ok: true, latencyMs: Date.now() - start };
}
catch (err) {
const e = err;
const status = e?.meta?.status;
// INSUFFICIENT_SCOPE (403) / NOT_FOUND (404) — ELS reachable, это ok.
if (e?.code === 'INSUFFICIENT_SCOPE' ||
e?.code === 'NOT_FOUND' ||
e?.code === 'INVALID_ARGS') {
return { ok: true, latencyMs: Date.now() - start, ...(status !== undefined ? { status } : {}) };
}
return {
ok: false,
latencyMs: Date.now() - start,
error: e?.message ?? 'unknown',
...(status !== undefined ? { status } : {}),
};
}
}
function withTimeout(p, ms) {
return Promise.race([
p,
new Promise((resolve) => setTimeout(() => resolve({ ok: false, error: 'timeout' }), ms)),
]);
}
//# sourceMappingURL=health.js.map