#!/bin/bash set -e # Script to start Prometheus and Grafana for Hindsight metrics # This provides a single command for the full monitoring stack SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "$SCRIPT_DIR/../../.." && pwd)" MONITORING_DATA_DIR="$PROJECT_ROOT/.monitoring" API_PORT="${API_PORT:-8888}" PROMETHEUS_PORT="${PROMETHEUS_PORT:-8889}" GRAFANA_PORT="${GRAFANA_PORT:-8890}" # Versions PROMETHEUS_VERSION="2.48.0" GRAFANA_VERSION="10.2.2" # Detect OS and architecture OS=$(uname -s | tr '[:upper:]' '[:lower:]') ARCH=$(uname -m) case "$OS" in darwin) OS_NAME="darwin" ;; linux) OS_NAME="linux" ;; *) echo "Unsupported OS: $OS"; exit 1 ;; esac case "$ARCH" in x86_64) ARCH_NAME="amd64" ;; arm64|aarch64) ARCH_NAME="arm64" ;; *) echo "Unsupported architecture: $ARCH"; exit 1 ;; esac # Prometheus paths PROMETHEUS_DIR="$MONITORING_DATA_DIR/prometheus" PROMETHEUS_ARCHIVE="prometheus-${PROMETHEUS_VERSION}.${OS_NAME}-${ARCH_NAME}.tar.gz" PROMETHEUS_URL="https://github.com/prometheus/prometheus/releases/download/v${PROMETHEUS_VERSION}/${PROMETHEUS_ARCHIVE}" PROMETHEUS_BIN="$PROMETHEUS_DIR/prometheus-${PROMETHEUS_VERSION}.${OS_NAME}-${ARCH_NAME}/prometheus" # Grafana paths GRAFANA_DIR="$MONITORING_DATA_DIR/grafana" GRAFANA_ARCHIVE="grafana-${GRAFANA_VERSION}.${OS_NAME}-${ARCH_NAME}.tar.gz" GRAFANA_URL="https://dl.grafana.com/oss/release/${GRAFANA_ARCHIVE}" GRAFANA_HOME="$GRAFANA_DIR/grafana-v${GRAFANA_VERSION}" GRAFANA_BIN="$GRAFANA_HOME/bin/grafana" # Cleanup function cleanup() { echo "" echo "Shutting down monitoring stack..." if [ -n "$PROM_PID" ] && kill -0 "$PROM_PID" 2>/dev/null; then kill "$PROM_PID" 2>/dev/null || true fi if [ -n "$GRAFANA_PID" ] && kill -0 "$GRAFANA_PID" 2>/dev/null; then kill "$GRAFANA_PID" 2>/dev/null || true fi echo "Monitoring stack stopped" exit 0 } trap cleanup SIGINT SIGTERM # Download Prometheus if needed if [ ! -f "$PROMETHEUS_BIN" ]; then echo "Downloading Prometheus ${PROMETHEUS_VERSION}..." mkdir -p "$PROMETHEUS_DIR" cd "$PROMETHEUS_DIR" curl -sL -o "$PROMETHEUS_ARCHIVE" "$PROMETHEUS_URL" tar xzf "$PROMETHEUS_ARCHIVE" rm "$PROMETHEUS_ARCHIVE" echo "Prometheus ready" fi # Download Grafana if needed if [ ! -f "$GRAFANA_BIN" ]; then echo "Downloading Grafana ${GRAFANA_VERSION}..." mkdir -p "$GRAFANA_DIR" cd "$GRAFANA_DIR" curl -sL -o "$GRAFANA_ARCHIVE" "$GRAFANA_URL" tar xzf "$GRAFANA_ARCHIVE" rm "$GRAFANA_ARCHIVE" echo "Grafana ready" fi # Create Prometheus config mkdir -p "$PROMETHEUS_DIR" cat > "$PROMETHEUS_DIR/prometheus.yml" < "$GRAFANA_PROV_DIR/datasources/prometheus.yaml" < "$GRAFANA_PROV_DIR/dashboards/dashboards.yaml" < "$GRAFANA_DIR/grafana.ini" < /dev/null 2>&1; then echo "WARNING: Hindsight API not detected at localhost:$API_PORT" echo " Start the API first: ./scripts/dev/start-api.sh" echo "" fi # Start Prometheus in background cd "$(dirname "$PROMETHEUS_BIN")" "$PROMETHEUS_BIN" \ --config.file="$PROMETHEUS_DIR/prometheus.yml" \ --storage.tsdb.path="$PROMETHEUS_DIR/data" \ --web.console.templates="$(dirname "$PROMETHEUS_BIN")/consoles" \ --web.console.libraries="$(dirname "$PROMETHEUS_BIN")/console_libraries" \ --web.listen-address="0.0.0.0:$PROMETHEUS_PORT" \ --web.enable-lifecycle \ --log.level=warn & PROM_PID=$! # Start Grafana in background cd "$GRAFANA_HOME" "$GRAFANA_BIN" server \ --homepath="$GRAFANA_HOME" \ --config="$GRAFANA_DIR/grafana.ini" & GRAFANA_PID=$! echo "Monitoring stack running. Press Ctrl+C to stop." echo "" # Wait for processes wait "$PROM_PID" "$GRAFANA_PID" 2>/dev/null || true # If we get here, clean up cleanup