diff --git a/docker-compose.yml b/docker-compose.yml index 3b0b1e8..3301837 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -145,7 +145,34 @@ services: start_period: 40s retries: 3 + # ─────────── 监控 ─────────── + prometheus: + image: prom/prometheus:latest + container_name: fruitshorts-prometheus + restart: unless-stopped + ports: + - "9090:9090" + volumes: + - ./prometheus.yml:/etc/prometheus/prometheus.yml:ro + - prometheus-data:/prometheus + command: + - "--config.file=/etc/prometheus/prometheus.yml" + + grafana: + image: grafana/grafana:latest + container_name: fruitshorts-grafana + restart: unless-stopped + ports: + - "3000:3000" + volumes: + - grafana-data:/var/lib/grafana + environment: + - GF_SECURITY_ADMIN_USER=admin + - GF_SECURITY_ADMIN_PASSWORD=admin + volumes: # 命名卷:跟着 compose 项目走,`docker compose down -v` 才会删 db-data: redis-data: + prometheus-data: + grafana-data: diff --git a/fruitshorts-admin-api/src/main/resources/application.yml b/fruitshorts-admin-api/src/main/resources/application.yml index 3202aef..29fcfa8 100644 --- a/fruitshorts-admin-api/src/main/resources/application.yml +++ b/fruitshorts-admin-api/src/main/resources/application.yml @@ -66,3 +66,15 @@ springdoc: logging: level: com.fruitshorts: debug + +management: + endpoints: + web: + exposure: + include: prometheus,health + endpoint: + health: + show-details: always + metrics: + tags: + application: ${spring.application.name} diff --git a/fruitshorts-app-api/src/main/resources/application.yml b/fruitshorts-app-api/src/main/resources/application.yml index 9fa1bbe..c43fa8f 100644 --- a/fruitshorts-app-api/src/main/resources/application.yml +++ b/fruitshorts-app-api/src/main/resources/application.yml @@ -97,3 +97,15 @@ fruitshorts: logging: level: com.fruitshorts: info + +management: + endpoints: + web: + exposure: + include: prometheus,health + endpoint: + health: + show-details: always + metrics: + tags: + application: ${spring.application.name} diff --git a/fruitshorts-framework/src/main/java/com/fruitshorts/framework/security/SecurityConfig.java b/fruitshorts-framework/src/main/java/com/fruitshorts/framework/security/SecurityConfig.java index 9731823..34c7f8f 100644 --- a/fruitshorts-framework/src/main/java/com/fruitshorts/framework/security/SecurityConfig.java +++ b/fruitshorts-framework/src/main/java/com/fruitshorts/framework/security/SecurityConfig.java @@ -53,9 +53,10 @@ public class SecurityConfig { "/swagger-ui/**", "/swagger-ui.html", "/v3/api-docs/**", - /* 健康检查:给容器编排与冒烟脚本用(本项目没引 actuator,见 HealthController 注释) */ + /* 健康检查与监控:/actuator/health 给容器编排,/actuator/prometheus 给 Prometheus 抓取指标 */ "/healthz", - "/actuator/health" + "/actuator/health", + "/actuator/prometheus" }; private final JwtAuthenticationFilter jwtAuthenticationFilter; diff --git a/prometheus.yml b/prometheus.yml new file mode 100644 index 0000000..bd743fb --- /dev/null +++ b/prometheus.yml @@ -0,0 +1,16 @@ +# Author: fruit.com.cn +# Prometheus 抓取配置:抓取后端双服务的 actuator 指标(服务名走 compose 网络) +global: + scrape_interval: 15s + evaluation_interval: 15s + +scrape_configs: + - job_name: "fruitshorts-app-api" + metrics_path: "/actuator/prometheus" + static_configs: + - targets: ["app-api:8081"] + + - job_name: "fruitshorts-admin-api" + metrics_path: "/actuator/prometheus" + static_configs: + - targets: ["admin-api:8080"]