#!/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 [--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}"