#!/usr/bin/env bash # Starts the whole demo stack without Docker, all on 127.0.0.1: # fake OpenAI server :8099 -> the Spring app :8080 <-scraped every 2s- Prometheus :9090 <- Grafana :3000 # PROM and GRAFANA default to where the article says to unpack the release tarballs. set -euo pipefail cd "$(dirname "$0")/.." PROM="${PROM:-/tmp/tools/obs/prom}"; GRAFANA="${GRAFANA:-/tmp/tools/obs/grafana}" RUN=/tmp/obs-run; rm -rf "$RUN"; mkdir -p "$RUN/dashboards" "$RUN/prom" "$RUN/grafana/data" "$RUN/grafana/logs" "$RUN/grafana/plugins" cp dashboards/*.json "$RUN/dashboards/" mvn -q -B -DskipTests package JAR=$(ls target/*.jar | grep -v original | head -1) start() { local name=$1; shift; setsid nohup "$@" > "$RUN/$name.log" 2>&1 < /dev/null & echo $! > "$RUN/$name.pid"; } wait_for() { for i in $(seq 1 60); do curl -s -o /dev/null "$1" && return 0; sleep 1; done; echo "timeout waiting for $1" >&2; exit 1; } # the fake server ships inside the same Boot jar; PropertiesLauncher lets us pick its main class start fake java -Dloader.main=com.ankurm.observability.fake.FakeOpenAiServer -cp "$JAR" org.springframework.boot.loader.launch.PropertiesLauncher 8099 wait_for http://127.0.0.1:8099/ start app java -jar "$JAR" --spring.profiles.active=stack wait_for http://127.0.0.1:8080/actuator/health start prometheus "$PROM/prometheus" --config.file=stack/prometheus.yml --storage.tsdb.path="$RUN/prom" --web.listen-address=127.0.0.1:9090 wait_for http://127.0.0.1:9090/-/ready GF_PATHS_DATA="$RUN/grafana/data" GF_PATHS_LOGS="$RUN/grafana/logs" GF_PATHS_PLUGINS="$RUN/grafana/plugins" \ GF_PATHS_PROVISIONING="$PWD/stack/grafana/provisioning" GF_SERVER_HTTP_ADDR=127.0.0.1 GF_SERVER_HTTP_PORT=3000 \ GF_SECURITY_ADMIN_PASSWORD=admin GF_ANALYTICS_REPORTING_ENABLED=false GF_ANALYTICS_CHECK_FOR_UPDATES=false \ start grafana "$GRAFANA/bin/grafana" server --homepath "$GRAFANA" wait_for http://127.0.0.1:3000/api/health echo "up: app :8080, prometheus :9090, grafana :3000 (admin/admin). pids in $RUN/*.pid"