Prometheus + Grafana 全链路监控:从网关到数据库的可观测性体系

Prometheus + Grafana 全链路监控:从网关到数据库的可观测性体系

Ethan
2025-08-15 发布 / 正在检测是否收录...

可观测性(Observability)是现代分布式系统的"眼睛"。没有它,你就像在黑暗中开飞机——只有当坠毁时才知道出了问题。本文将构建一个从网关到数据库的完整可观测性体系。

可观测性的三大支柱

支柱核心问题工具
Metrics系统是否健康?QPS 是多少?Prometheus + Grafana
Tracing一个请求经过了哪些服务?哪里慢了?Micrometer Tracing + Zipkin/ARMS
Logging具体发生了什么错误?SLS / ELK

Spring Boot 3 Micrometer 集成

management:
  endpoints:
    web:
      exposure:
        include: health,info,prometheus,metrics
  metrics:
    tags:
      application: ${spring.application.name}
    export:
      prometheus:
        enabled: true
  tracing:
    sampling:
      probability: 1.0   # 开发 100%,生产 0.1
    propagation:
      type: w3c

自定义业务指标

@RestController
public class OrderController {
    private final Counter orderCounter;
    private final Timer orderTimer;

    public OrderController(MeterRegistry meterRegistry) {
        this.orderCounter = Counter.builder("orders.created.total")
            .description("Total orders created")
            .register(meterRegistry);
        this.orderTimer = Timer.builder("orders.create.duration")
            .description("Order creation duration")
            .register(meterRegistry);
    }

    @PostMapping("/orders")
    public Result createOrder(@RequestBody OrderDTO dto) {
        return orderTimer.record(() -> {
            Order order = orderService.create(dto);
            orderCounter.increment();
            return Result.success(order);
        });
    }
}

Prometheus 配置

# prometheus.yml
global:
  scrape_interval: 15s

scrape_configs:
  - job_name: 'spring-boot'
    metrics_path: '/actuator/prometheus'
    static_configs:
      - targets: ['backend:8080']

  - job_name: 'mysql'
    static_configs:
      - targets: ['mysql-exporter:9104']

  - job_name: 'redis'
    static_configs:
      - targets: ['redis-exporter:9121']

Grafana 告警规则

# alerts.yml
groups:
  - name: spring-boot-alerts
    rules:
      - alert: HighErrorRate
        expr: rate(http_server_requests_seconds_count{status=~"5.."}[5m]) > 0.05
        for: 2m
        labels:
          severity: critical
        annotations:
          summary: "错误率超过 5%"

      - alert: JvmHeapUsage
        expr: sum(jvm_memory_used_bytes{area="heap"}) / sum(jvm_memory_max_bytes{area="heap"}) > 0.85
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "JVM 堆内存使用超过 85%"

JVM 诊断大盘关键指标

需要重点监控:堆内存使用率(超过 85% 需排查内存泄漏)、GC 暂停时间(P99 应 < 100ms)、线程数(突增可能是线程泄漏)、类加载数(持续增长提示动态代理滥用)。

GC 调优决策树

低延迟(< 10ms):ZGC。吞吐量优先:Parallel GC。内存受限:Serial GC。通用场景:G1 GC(JDK 9+ 默认)。

# 生产 JVM 参数推荐
-XX:+UseZGC
-Xms4g -Xmx4g
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/tmp/heapdump.hprof

阿里云 ARMS 集成

ARMS 优势:开箱即用的应用拓扑图、基于历史基线的智能告警、代码级诊断直接定位到慢调用行。Spring Boot 只需添加一个 starter,ARMS Agent 自动完成探针注入。

总结

可观测性不是一套工具,而是一种能力。构建这个能力的关键是"三个一":一个 Metrics 仪表盘看到全局健康、一个 Tracing ID 串联整个调用链、一个日志平台搜索所有上下文。

© 版权声明
THE END
喜欢就支持一下吧
点赞 1 分享 收藏

评论 (0)

取消

Warning: file_put_contents(/var/www/html/usr/cache/pagecache/07/0731abc54f0dc02609f8a6a0d59d43ee.cache): failed to open stream: No such file or directory in /var/www/html/usr/plugins/PageCache/Plugin.php on line 188