150 lines
4.9 KiB
Bash
Executable File
150 lines
4.9 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
source "$SCRIPT_DIR/common.sh"
|
|
|
|
REPORT_DIR=""
|
|
DRY_RUN=0
|
|
CANDIDATE_ENV=""
|
|
CONFIG_FILE=""
|
|
ORIGINAL_ENV_FILE=""
|
|
ENV_BACKUP=""
|
|
REGISTRATION_APPLIED=0
|
|
|
|
usage() {
|
|
cat <<'EOF'
|
|
Usage: ./scripts/register_rtr_monitor.sh --report-dir <absolute-host-path> [--dry-run]
|
|
|
|
Registers one local RTR report directory for the artifact metrics sidecar.
|
|
The directory must be on the same host as this installer and may contain
|
|
rtr-source-*.json, rtr-runtime-*.json, and rtr-clients-*.json report files.
|
|
|
|
This command recreates only artifact-metrics, Prometheus, and Grafana. It does
|
|
not restart or recreate the ours-rp-soak container.
|
|
EOF
|
|
}
|
|
|
|
cleanup() {
|
|
[[ -n "$CANDIDATE_ENV" && -f "$CANDIDATE_ENV" ]] && rm -f "$CANDIDATE_ENV"
|
|
[[ -n "$CONFIG_FILE" && -f "$CONFIG_FILE" ]] && rm -f "$CONFIG_FILE"
|
|
return 0
|
|
}
|
|
trap cleanup EXIT
|
|
|
|
restore_failed_registration() {
|
|
if (( REGISTRATION_APPLIED == 0 )) || [[ -z "$ENV_BACKUP" || ! -f "$ENV_BACKUP" ]]; then
|
|
return 0
|
|
fi
|
|
|
|
warn "registration failed after .env replacement; restoring previous metrics configuration"
|
|
cp -p "$ENV_BACKUP" "$ORIGINAL_ENV_FILE"
|
|
ENV_FILE="$ORIGINAL_ENV_FILE"
|
|
load_env || warn "unable to reload restored .env"
|
|
compose_cmd --profile sidecar up -d --force-recreate artifact-metrics \
|
|
|| warn "unable to recreate artifact-metrics with restored configuration"
|
|
}
|
|
|
|
fail_after_apply() {
|
|
restore_failed_registration
|
|
die "$*"
|
|
}
|
|
|
|
while (( $# > 0 )); do
|
|
case "$1" in
|
|
--report-dir)
|
|
[[ $# -ge 2 ]] || die "--report-dir requires a value"
|
|
REPORT_DIR="$2"
|
|
shift 2
|
|
;;
|
|
--dry-run)
|
|
DRY_RUN=1
|
|
shift
|
|
;;
|
|
-h|--help)
|
|
usage
|
|
exit 0
|
|
;;
|
|
*)
|
|
die "unknown argument: $1"
|
|
;;
|
|
esac
|
|
done
|
|
|
|
require_cmd docker
|
|
require_cmd curl
|
|
require_cmd grep
|
|
require_cmd jq
|
|
validate_rtr_registration_dir "$REPORT_DIR"
|
|
load_env
|
|
assert_arch_compatibility
|
|
|
|
ORIGINAL_ENV_FILE="$ENV_FILE"
|
|
REPORT_FILE_COUNT="$(rtr_report_file_count "$REPORT_DIR")"
|
|
LATEST_REPORT_FILE="$(latest_rtr_report_file "$REPORT_DIR")"
|
|
if (( REPORT_FILE_COUNT == 0 )); then
|
|
warn "no recognized RTR report JSON files are currently present in $REPORT_DIR"
|
|
fi
|
|
|
|
CANDIDATE_ENV="$(mktemp "$INSTALLER_ROOT/.env.rtr-register.XXXXXX")"
|
|
cp -p "$ORIGINAL_ENV_FILE" "$CANDIDATE_ENV"
|
|
replace_env_key_file "$CANDIDATE_ENV" "RTR_REPORT_DIR" "$REPORT_DIR"
|
|
|
|
ENV_FILE="$CANDIDATE_ENV"
|
|
load_env
|
|
CONFIG_FILE="$(mktemp "$INSTALLER_ROOT/.rtr-compose-config.XXXXXX")"
|
|
compose_cmd --profile sidecar --profile monitor config --format json > "$CONFIG_FILE"
|
|
jq -e --arg source "$REPORT_DIR" --arg target "$RTR_REPORT_CONTAINER_DIR" '
|
|
.services["artifact-metrics"].volumes
|
|
| any(.[]; .type == "bind" and .source == $source and .target == $target and .read_only == true)
|
|
' "$CONFIG_FILE" >/dev/null || die "candidate compose configuration is missing expected read-only RTR bind mount"
|
|
|
|
if (( DRY_RUN == 1 )); then
|
|
printf 'dry_run=ok\n'
|
|
printf 'report_dir=%s\n' "$REPORT_DIR"
|
|
printf 'recognized_report_files=%s\n' "$REPORT_FILE_COUNT"
|
|
printf 'latest_report=%s\n' "${LATEST_REPORT_FILE:--}"
|
|
printf 'expected_mount_source=%s\n' "$REPORT_DIR"
|
|
printf 'expected_mount_target=%s\n' "$RTR_REPORT_CONTAINER_DIR"
|
|
exit 0
|
|
fi
|
|
|
|
ENV_FILE="$ORIGINAL_ENV_FILE"
|
|
load_env
|
|
soak_container_before="$(compose_cmd ps -q ours-rp-soak || true)"
|
|
ENV_BACKUP="${ORIGINAL_ENV_FILE}.rtr-register-$(date -u +%Y%m%dT%H%M%SZ).bak"
|
|
cp -p "$ORIGINAL_ENV_FILE" "$ENV_BACKUP"
|
|
mv "$CANDIDATE_ENV" "$ORIGINAL_ENV_FILE"
|
|
CANDIDATE_ENV=""
|
|
REGISTRATION_APPLIED=1
|
|
|
|
load_env
|
|
compose_cmd --profile sidecar up -d --force-recreate artifact-metrics \
|
|
|| fail_after_apply "unable to recreate artifact-metrics"
|
|
compose_cmd --profile sidecar --profile monitor up -d prometheus grafana \
|
|
|| fail_after_apply "unable to start Prometheus and Grafana"
|
|
|
|
soak_container_after="$(compose_cmd ps -q ours-rp-soak || true)"
|
|
if [[ -n "$soak_container_before" && "$soak_container_before" != "$soak_container_after" ]]; then
|
|
fail_after_apply "ours-rp-soak container changed during RTR registration; investigate before continuing"
|
|
fi
|
|
|
|
wait_for_endpoint "http://127.0.0.1:${METRICS_PORT:-9556}/metrics" 60 \
|
|
|| fail_after_apply "artifact-metrics did not become ready"
|
|
wait_for_endpoint "http://127.0.0.1:${PROMETHEUS_PORT:-9090}/-/ready" 60 \
|
|
|| fail_after_apply "Prometheus did not become ready"
|
|
wait_for_endpoint "http://127.0.0.1:${GRAFANA_PORT:-3000}/api/health" 60 \
|
|
|| fail_after_apply "Grafana did not become ready"
|
|
|
|
if (( REPORT_FILE_COUNT > 0 )); then
|
|
curl -fsS "http://127.0.0.1:${METRICS_PORT:-9556}/metrics" | grep -q '^ours_rp_rtr_' \
|
|
|| fail_after_apply "artifact-metrics exposes no RTR metrics after registration"
|
|
fi
|
|
|
|
printf 'registration=ok\n'
|
|
printf 'report_dir=%s\n' "$REPORT_DIR"
|
|
printf 'recognized_report_files=%s\n' "$REPORT_FILE_COUNT"
|
|
printf 'latest_report=%s\n' "${LATEST_REPORT_FILE:--}"
|
|
printf 'env_backup=%s\n' "$ENV_BACKUP"
|
|
printf 'ours_rp_soak_container_unchanged=%s\n' "${soak_container_before:-not-running}"
|