/
AlexandrNarbaev
/
opencode_initializer
Обзор
Документация
Войти
/
AlexandrNarbaev
/
opencode_initializer
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
main
src/lib/34-observability.sh
140 строк
5 KB
Alexandr Narbaev
release: v2.0.3 — deep-research findings (10 fixes)
08 авг 2026, 13:25
08 авг 2026, 13:25
f4c2d9b
Код
Авторство
О чём код?
#!/usr/bin/env bash # lib/34-observability.sh — Grafana + Prometheus observability stack # Requires: Docker, MODE, infra.yml # Config: ~/.config/opencode-setup/setup.conf # EXTERNAL_OBSERVABILITY=true — skip local setup, use external stack # EXTERNAL_GRAFANA_URL=... — external Grafana URL # EXTERNAL_PROMETHEUS_URL=... — external Prometheus URL # OTEL_EXPORTER_ENABLED=true — OpenTelemetry collector # OTEL_EXPORTER_ENDPOINT=... — OTel endpoint (grpc/http) set -euo pipefail _step_skip step_observability && return 0 section "Observability Stack (Prometheus + Grafana)" # ── Check for external observability config ───────────────────────────────── CONFIG_FILE="$HOME/.config/opencode-setup/setup.conf" EXTERNAL_OBSERVABILITY=false EXTERNAL_GRAFANA_URL="" EXTERNAL_PROMETHEUS_URL="" if [ -f "$CONFIG_FILE" ]; then # shellcheck disable=SC1090 source "$CONFIG_FILE" 2>/dev/null || true fi if [ "${EXTERNAL_OBSERVABILITY:-false}" = "true" ]; then if [ -n "${EXTERNAL_GRAFANA_URL:-}" ]; then info "EXTERNAL_OBSERVABILITY=true — using external Grafana at $EXTERNAL_GRAFANA_URL" else info "EXTERNAL_OBSERVABILITY=true — skipping local observability setup" fi if [ -n "${EXTERNAL_PROMETHEUS_URL:-}" ]; then info "External Prometheus at $EXTERNAL_PROMETHEUS_URL" fi log "Local Prometheus/Grafana NOT installed (external stack configured)" _step_done step_observability return 0 fi # ── Check for corporate OTel collector ──────────────────────────────────── OTEL_EXPORTER_ENABLED="${OTEL_EXPORTER_ENABLED:-false}" OTEL_EXPORTER_ENDPOINT="${OTEL_EXPORTER_ENDPOINT:-}" if [ "${OTEL_EXPORTER_ENABLED:-false}" = "true" ] && [ -n "${OTEL_EXPORTER_ENDPOINT:-}" ]; then info "OTel exporter configured → ${OTEL_EXPORTER_ENDPOINT}" _set_config "OTEL_EXPORTER_ENABLED" "true" _set_config "OTEL_EXPORTER_ENDPOINT" "$OTEL_EXPORTER_ENDPOINT" fi INFRA_CONFIG="$HOME/.config/opencode/infra.yml" SERVICES_DIR="$HOME/.config/opencode" PROMETHEUS_YML="$SERVICES_DIR/prometheus.yml" mkdir -p "$SERVICES_DIR" NODE_PORT="${NODE_EXPORTER_PORT:-9100}" METRICS_PORT="${METRICS_EXPORTER_PORT:-9464}" # Resolve docker host IP for Linux (host.docker.internal only works on Mac/Win) DOCKER_HOST=$(ip -4 addr show docker0 2>/dev/null | grep -oE 'inet [0-9.]+' | awk '{print $2}' || echo "host.docker.internal") # ── Create/update prometheus.yml ────────────────────────────────────────── log "Generating $PROMETHEUS_YML" cat >"$PROMETHEUS_YML" <<PROMCONF global: scrape_interval: 15s scrape_configs: - job_name: 'node' static_configs: - targets: ['${DOCKER_HOST}:${NODE_PORT}'] - job_name: 'prometheus' static_configs: - targets: ['localhost:9090'] - job_name: 'opencode' static_configs: - targets: ['${DOCKER_HOST}:${METRICS_PORT}'] metrics_path: /metrics PROMCONF log "prometheus.yml written" # ── Add prometheus + grafana to infra.yml if missing ─────────────────────── if [ -f "$INFRA_CONFIG" ]; then HAS_PROM=$(grep -c "prom/prometheus" "$INFRA_CONFIG" 2>/dev/null || echo 0) HAS_GRAFANA=$(grep -c "grafana/grafana" "$INFRA_CONFIG" 2>/dev/null || echo 0) if [ "$HAS_PROM" -eq 0 ] || [ "$HAS_GRAFANA" -eq 0 ]; then log "Adding observability services to $INFRA_CONFIG" if [ "$HAS_PROM" -eq 0 ]; then sed -i '/^services:/a\ \ prometheus:\ image: prom/prometheus:latest\ container_name: opencode-prometheus\ ports: ["127.0.0.1:${PROMETHEUS_PORT:-9090}:9090"]\ volumes:\ - ./prometheus.yml:/etc/prometheus/prometheus.yml\ - opencode_prometheus_data:/prometheus\ command: --config.file=/etc/prometheus/prometheus.yml\ restart: unless-stopped' "$INFRA_CONFIG" fi if [ "$HAS_GRAFANA" -eq 0 ]; then sed -i '/^services:/a\ \ grafana:\ image: grafana/grafana:latest\ container_name: opencode-grafana\ ports: ["127.0.0.1:${GRAFANA_PORT:-3001}:3000"]\ environment:\ GF_SECURITY_ADMIN_USER: admin\ GF_SECURITY_ADMIN_PASSWORD: ${GRAFANA_PASSWORD:-admin}\ GF_INSTALL_PLUGINS: grafana-piechart-panel\ volumes:\ - opencode_grafana_data:/var/lib/grafana\ - '"$SCRIPT_DIR"'/src/grafana/provisioning:/etc/grafana/provisioning\ - '"$SCRIPT_DIR"'/src/grafana/dashboards:/etc/grafana/dashboards\ restart: unless-stopped' "$INFRA_CONFIG" fi HAS_PROM_VOL=$(grep -c "opencode_prometheus_data" "$INFRA_CONFIG" 2>/dev/null || echo 0) HAS_GRAFANA_VOL=$(grep -c "opencode_grafana_data" "$INFRA_CONFIG" 2>/dev/null || echo 0) if [ "$HAS_PROM_VOL" -eq 0 ]; then sed -i '/^volumes:/a\ opencode_prometheus_data:' "$INFRA_CONFIG" fi if [ "$HAS_GRAFANA_VOL" -eq 0 ]; then sed -i '/^volumes:/a\ opencode_grafana_data:' "$INFRA_CONFIG" fi log "Observability services added to infra.yml" else log "Observability services already in infra.yml" fi else warn "No infra.yml found — run setup.sh --with-observability first" fi _step_done step_observability