fix(ops): bound CD DB probes and restore SigNoz collector

This commit is contained in:
ogt
2026-07-15 02:29:51 +08:00
parent 27736add14
commit bfb2d2d040
11 changed files with 442 additions and 19 deletions

View File

@@ -1,10 +1,11 @@
#!/bin/bash
# =============================================================================
# WOOO AIOps - SignOz 備份腳本 (ClickHouse + SQLite)
# 版本: 1.1.0
# 版本: 1.2.0
# 建立日期: 2026-04-05
# 2026-04-05 Claude Code: 新增 SignOz 分散式追蹤備份 — 首席架構師備份審計
# 2026-04-05 Claude Code: v1.1 修正 tar pipeline exit code 處理 + || true
# 2026-07-15 Codex: v1.2 確保任何 exit/signal/failure 都會受控還原 OTEL Collector
# =============================================================================
set -euo pipefail
@@ -14,11 +15,42 @@ source "$(dirname "$0")/common.sh"
SERVICE="signoz"
LOCAL_REPO="${BACKUP_BASE}/signoz"
DUMP_DIR="/tmp/signoz-backup-$$"
COLLECTOR_RESTORE_PENDING=0
CLEANUP_COMPLETE=0
restore_collector() {
if [ "${COLLECTOR_RESTORE_PENDING}" -ne 1 ]; then
return 0
fi
log_info "重啟 signoz-otel-collector..."
if docker start signoz-otel-collector 2>/dev/null; then
COLLECTOR_RESTORE_PENDING=0
return 0
fi
log_warn "signoz-otel-collector 重啟失敗"
return 1
}
cleanup() {
# 確保 collector 已重啟
docker start signoz-otel-collector 2>/dev/null || true
local exit_code=$?
if [ "${CLEANUP_COMPLETE}" -eq 1 ]; then
return "${exit_code}"
fi
CLEANUP_COMPLETE=1
# cleanup 期間忽略重複 signal避免還原與刪除流程重入。
trap '' HUP INT TERM
restore_collector || true
rm -rf "${DUMP_DIR}"
return "${exit_code}"
}
on_signal() {
local signal_number="$1"
exit "$((128 + signal_number))"
}
backup_volume() {
@@ -44,6 +76,12 @@ backup_volume() {
main() {
local start_time=$(date +%s)
trap cleanup EXIT
trap 'on_signal 1' HUP
trap 'on_signal 2' INT
trap 'on_signal 15' TERM
log_info "========== 開始 SignOz 備份 =========="
mkdir -p "${DUMP_DIR}"
@@ -51,13 +89,14 @@ main() {
# Step 1: 停止 OTEL Collector 確保數據一致性
log_info "暫停 signoz-otel-collector 以確保數據一致性..."
# 先 arm 還原再停止,消除 signal 發生在 stop 與狀態記錄之間的空窗。
COLLECTOR_RESTORE_PENDING=1
docker stop signoz-otel-collector 2>/dev/null || log_warn "signoz-otel-collector 未在運行,繼續"
docker stop signoz-telemetrystore-migrator 2>/dev/null || true
# Step 2: 備份 ClickHouse volume (排除 tmp 目錄降低體積)
backup_volume "signoz-clickhouse" "${DUMP_DIR}/clickhouse_${timestamp}.tar.gz" "--exclude=/data/tmp" || {
log_error "ClickHouse volume 備份失敗"
cleanup
notify_clawbot "failed" "${SERVICE}" "SignOz ClickHouse 備份失敗"
exit 1
}
@@ -68,15 +107,14 @@ main() {
}
# Step 4: 重啟 Collector
log_info "重啟 signoz-otel-collector..."
docker start signoz-otel-collector 2>/dev/null || log_warn "signoz-otel-collector 重啟失敗"
# 若此處失敗,保留 pending 讓 EXIT cleanup 再做一次有界還原。
restore_collector || true
# Step 5: 初始化 Restic 倉庫
if [ ! -d "${LOCAL_REPO}/data" ]; then
log_info "初始化 Restic 倉庫: ${LOCAL_REPO}"
restic -r "${LOCAL_REPO}" init --password-file "${RESTIC_PASSWORD_FILE}" 2>&1 || {
log_error "Restic 倉庫初始化失敗"
rm -rf "${DUMP_DIR}"
exit 1
}
fi
@@ -92,8 +130,6 @@ main() {
# Step 7: GFS 清理
cleanup_old_backups "${LOCAL_REPO}"
rm -rf "${DUMP_DIR}"
local end_time=$(date +%s)
local duration=$((end_time - start_time))
log_success "========== SignOz 備份完成 (${duration}s) =========="