feat(services): enhance service health management with IP health tracking
quality / commitlint (push) Skipped
CD / update-wiki (push) Successful in 6s
quality / changes (push) Successful in 5s
quality / docker-check (push) Skipped
quality / web (push) Successful in 55s
quality / api (push) Successful in 41s
CD / quality (push) Successful in 1m45s
CD / publish (push) Successful in 1m33s
quality / commitlint (push) Skipped
CD / update-wiki (push) Successful in 6s
quality / changes (push) Successful in 5s
quality / docker-check (push) Skipped
quality / web (push) Successful in 55s
quality / api (push) Successful in 41s
CD / quality (push) Successful in 1m45s
CD / publish (push) Successful in 1m33s
- Introduced IP health tracking in service views, allowing for detailed monitoring of individual IP statuses and latencies. - Updated the service configuration to include an `ip_health` array, providing structured health data for each IP. - Enhanced the `attachServiceHealth` function to aggregate IP health data alongside overall service health. - Modified relevant components to display IP health information, improving visibility and user experience in service management interfaces. This commit significantly improves the health monitoring capabilities of services, enabling better insights into the status of individual IPs associated with each service.
This commit is contained in:
Vendored
+10
-1
File diff suppressed because one or more lines are too long
Vendored
+34
@@ -631,6 +631,7 @@ __export(repos_exports, {
|
||||
listGroups: () => listGroups,
|
||||
listHealthCheckTargets: () => listHealthCheckTargets,
|
||||
listHealthChecks: () => listHealthChecks,
|
||||
listIpHealthByServiceIds: () => listIpHealthByServiceIds,
|
||||
listIpHealthStatus: () => listIpHealthStatus,
|
||||
listNodes: () => listNodes,
|
||||
listNotificationLog: () => listNotificationLog,
|
||||
@@ -1822,6 +1823,39 @@ function aggregateIpHealthByServiceIds(db, serviceIds) {
|
||||
}
|
||||
return result;
|
||||
}
|
||||
function listIpHealthByServiceIds(db, serviceIds) {
|
||||
const result = /* @__PURE__ */ new Map();
|
||||
if (serviceIds.length === 0) return result;
|
||||
const idList = sql2.join(
|
||||
serviceIds.map((id) => sql2`${id}`),
|
||||
sql2`, `
|
||||
);
|
||||
const rows = db.all(sql2`
|
||||
SELECT sb.service_id AS service_id,
|
||||
ihs.ip AS ip,
|
||||
${WORST_HEALTH_SQL} AS health_status,
|
||||
MAX(ihs.latency_ms) AS health_latency_ms
|
||||
FROM ip_health_status ihs
|
||||
INNER JOIN service_bindings sb
|
||||
ON ihs.scope = 'binding' AND ihs.ref_id = sb.id
|
||||
WHERE sb.service_id IN (${idList})
|
||||
GROUP BY sb.service_id, ihs.ip
|
||||
`);
|
||||
for (const row of rows) {
|
||||
const parsed = parseHealthAggregateRow({
|
||||
health_status: row.health_status,
|
||||
health_latency_ms: row.health_latency_ms
|
||||
});
|
||||
const list = result.get(row.service_id) ?? [];
|
||||
list.push({
|
||||
ip: row.ip,
|
||||
status: parsed.health_status,
|
||||
latency_ms: parsed.health_latency_ms
|
||||
});
|
||||
result.set(row.service_id, list);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
function mergeHealthAggregates(parts) {
|
||||
const rank = {
|
||||
unknown: 0,
|
||||
|
||||
@@ -2070,6 +2070,55 @@ export function aggregateIpHealthByServiceIds(
|
||||
return result;
|
||||
}
|
||||
|
||||
export type ServiceIpHealthRow = {
|
||||
ip: string;
|
||||
status: IpHealthState;
|
||||
latency_ms: number | null;
|
||||
};
|
||||
|
||||
/** Per-IP binding-scope health, worst status if the same IP is on several bindings. */
|
||||
export function listIpHealthByServiceIds(
|
||||
db: Db,
|
||||
serviceIds: number[],
|
||||
): Map<number, ServiceIpHealthRow[]> {
|
||||
const result = new Map<number, ServiceIpHealthRow[]>();
|
||||
if (serviceIds.length === 0) return result;
|
||||
const idList = sql.join(
|
||||
serviceIds.map((id) => sql`${id}`),
|
||||
sql`, `,
|
||||
);
|
||||
const rows = db.all<{
|
||||
service_id: number;
|
||||
ip: string;
|
||||
health_status: string | null;
|
||||
health_latency_ms: number | null;
|
||||
}>(sql`
|
||||
SELECT sb.service_id AS service_id,
|
||||
ihs.ip AS ip,
|
||||
${WORST_HEALTH_SQL} AS health_status,
|
||||
MAX(ihs.latency_ms) AS health_latency_ms
|
||||
FROM ip_health_status ihs
|
||||
INNER JOIN service_bindings sb
|
||||
ON ihs.scope = 'binding' AND ihs.ref_id = sb.id
|
||||
WHERE sb.service_id IN (${idList})
|
||||
GROUP BY sb.service_id, ihs.ip
|
||||
`);
|
||||
for (const row of rows) {
|
||||
const parsed = parseHealthAggregateRow({
|
||||
health_status: row.health_status,
|
||||
health_latency_ms: row.health_latency_ms,
|
||||
});
|
||||
const list = result.get(row.service_id) ?? [];
|
||||
list.push({
|
||||
ip: row.ip,
|
||||
status: parsed.health_status,
|
||||
latency_ms: parsed.health_latency_ms,
|
||||
});
|
||||
result.set(row.service_id, list);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
export function mergeHealthAggregates(
|
||||
parts: Array<HealthAggregate | undefined | null>,
|
||||
): HealthAggregate {
|
||||
|
||||
Reference in New Issue
Block a user