lili 9c4638ee9d
Some checks failed
contract-gates / contract-gates (push) Has been cancelled
docs-gate / docs-gate (push) Has been cancelled
fix(观测): 阶段四第一波起容器四处排障修复(端口/expand-env/镜像)
起容器碰生产 mini-infra 暴露四坑,逐个修:
- 端口:9090 被 mini-infra 自身 mihomo/clash API 占(docker ps 看不到 host 网/宿主进程端口、摸底漏),Prometheus 让到 9091
- Loki+Tempo:配置注释里的 ${MINIO_*} 被 expand-env 连注释严格校验、通配符触发 "missing closing brace",改纯文字(先前误判 Tempo 宽松、其实同款)
- Collector 镜像:daocloud mirror 的 collector-contrib:0.116.0 缺 binary(exec no such file、force 重下同 digest 仍坏);0.114.0 的 redaction 缺 blocked_key_patterns/redact_all_types(脱敏红线);定版 0.155.0(binary 完好+redaction 字段最全)
五件全绿:Collector/Prometheus(9091)/Tempo/Loki/Grafana 全 200,实占约 170MiB(<< 3.4G 上限)。
follow-up:0.155 提示 otlphttp→otlp_http(deprecated warning、不阻塞)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-05 07:25:39 -07:00

58 lines
2.2 KiB
Bash
Executable File

#!/usr/bin/env bash
# =============================================================================
# 观测栈健康探针 —— 五件就绪判定(配置控制面阶段四 · 第一波)
# -----------------------------------------------------------------------------
# 一次探完 Collector / Prometheus / Tempo / Loki / Grafana 五个对外端点,
# 全绿(全部 HTTP 200)整体 PASS 退 0;任一非 200 / 超时则 FAIL 退 1。
#
# 两处内网纪律(与 nacos/rocketmq 探针一致):
# - `--noproxy '*'`:本机系统代理是 fake-ip(198.18.x);内网直连(Tailscale 100.64.x)
# 必须绕过它,否则连接被代理拦下返 000。这是内网外呼铁律。
# - curl -w 恒输出 http_code(失败为 000);仅在 curl 二进制本身返空时兜底 000,
# 不用 `|| echo 000`(会与 -w 的 000 叠成 "000000")。
#
# 各件探的就绪端点:
# Collector :13133 / health_check extension(就绪返 200)
# Prometheus :9091 /-/healthy 自身健康(宿主 9091→容器 9090;9090 被 mihomo/clash 占)
# Tempo :3200 /ready 就绪(未就绪期返 503,就绪后 200)
# Loki :3100 /ready 就绪(未就绪期返 503,就绪后 200)
# Grafana :3002 /api/health 自身健康(DB/插件就绪返 200)
#
# 用法:HOST=100.64.0.8 bash deploy/infra/observability/health-check.sh
# =============================================================================
set -uo pipefail
HOST="${HOST:-100.64.0.8}"
MAX_TIME="${MAX_TIME:-8}"
# 探针清单:名称|URL。逐个探,记录结果。
CHECKS=(
"Collector|http://${HOST}:13133/"
"Prometheus|http://${HOST}:9091/-/healthy"
"Tempo|http://${HOST}:3200/ready"
"Loki|http://${HOST}:3100/ready"
"Grafana|http://${HOST}:3002/api/health"
)
fail=0
for item in "${CHECKS[@]}"; do
name="${item%%|*}"
url="${item#*|}"
code="$(curl -s -o /dev/null -w '%{http_code}' --noproxy '*' --max-time "${MAX_TIME}" "${url}" 2>/dev/null)"
code="${code:-000}"
if [[ "$code" == "200" ]]; then
echo "PASS ${name} 200 @ ${url}"
else
echo "FAIL ${name}=${code} @ ${url}"
fail=1
fi
done
echo "---"
if [[ "$fail" == "0" ]]; then
echo "PASS 观测栈五件全绿 @ ${HOST}"
exit 0
fi
echo "FAIL 观测栈存在未就绪组件 @ ${HOST}(见上)"
exit 1