who_need_help/scripts/observability-stop.sh

60 lines
1.6 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
ROOT=$(CDPATH='' cd -- "$(dirname -- "$0")/.." && pwd)
ENV_FILE="$ROOT/.env.load"
if [[ ! -f "$ENV_FILE" ]]; then
echo "Missing $ENV_FILE; no observability project was selected." >&2
exit 1
fi
set -a
# shellcheck source=/dev/null
. "$ENV_FILE"
set +a
: "${LOAD_PROJECT:?LOAD_PROJECT is missing from .env.load}"
if [[ "$LOAD_PROJECT" == "who_need_help" ]]; then
echo "Refusing to stop services in the staging Compose project." >&2
exit 1
fi
runtime_dir="$ROOT/tmp/observability/$LOAD_PROJECT"
export OBSERVABILITY_RUNTIME_DIR="$runtime_dir"
compose=(
docker compose
--env-file "$ENV_FILE"
-p "$LOAD_PROJECT"
-f compose.yaml
-f compose.load.yaml
-f compose.observability.yaml
--profile observability
)
for service in alert-receiver alertmanager prometheus grafana; do
while IFS= read -r container_id; do
[[ -z "$container_id" ]] && continue
observed_project=$(
docker inspect --format '{{index .Config.Labels "com.docker.compose.project"}}' \
"$container_id"
)
observed_service=$(
docker inspect --format '{{index .Config.Labels "com.docker.compose.service"}}' \
"$container_id"
)
if [[ "$observed_project" != "$LOAD_PROJECT" ||
"$observed_service" != "$service" ]]; then
echo "Container scope mismatch for $container_id." >&2
exit 1
fi
done < <("${compose[@]}" ps --all -q "$service")
done
"${compose[@]}" stop grafana prometheus alertmanager alert-receiver
echo "Stopped only the isolated observability services; app and metric volumes remain."