服务监控

除了日志收集(Logs)和链路追踪(Traces)以外,我们的系统还要有服务监控(Metrics),才满足微服务架构必不可少的可观测性,可观测性包括Metrics、Traces、Logs 3 个维度。

在这里插入图片描述

服务监控就是对我们的服务和服务器的各种性能指标进行监控。

比如我们服务应用程序的请求成功率、系统吞吐量、响应时长等,如果是Java程序的话,还可以对JVM的各种指标进行监控。

而服务器的性能指标则包括CPU使用率、内存使用率、系统平均负载(Load1、Load5、Load15)、磁盘吞吐量、网络吞吐量等等。

在这里插入图片描述

在服务监控方案,主要的解决方案有:

  • Prometheus+Grafana
  • Zabbix

Prometheus+Grafana

Prometheus是目前最常用的服务监控组件,原生支持容器监控,最适合在k8s环境下部署Prometheus进行监控。

Prometheus+Grafana整体架构

以下是Prometheus+Grafana的整体架构。

在这里插入图片描述

上图橙色的都是Prometheus的部分。

首先Prometheus Server是Prometheus的服务端:

  • Retrieval组件通过服务发现机制获取需要收集监控信息的目标,然后拉取外部目标的监控信息。
  • TSDB是一个时序数据库,拉取到的监控指标信息会存储到TSDB中。
  • 然后HTTP Server组件开启http端口,供外部的UI组件或命令行请求查询监控信息,HTTP Server从TSDB从查询监控信息返回。
  • “Rules And Alters”告警规则组件查询TSDB中的监控数据,如果满足告警规则,则通知外部的AlterManager组件发送告警信息。

在这里插入图片描述

然后是左边负责收集监控指标的部分:

  • Client Library:一般的应用程序可以通过引入客户端依赖包进行监控指标的收集。
  • Exporter:像MySQL、MongoDB、Redis这种第三方工具,不支持引入依赖包,那么通过专属的Exporter主动收集对应监控指标。比如MySQL Exporter会主动查询MySQL的相关性能信息,转为标志的监控指标格式的数据,存储起来,等待Prometheus服务端拉取。
  • Pushgateway:用于临时性任务的收集,比如一个批处理程序,主动推送监控指标信息到Pushgatew中存储起来,等待Prometheus服务端拉取。

在这里插入图片描述

AlterManager则是Prometheus的监控告警组件,会接收Prometheus的告警通知,然后根据配置进行相应的告警通通知操作,比如发生邮件等。

在这里插入图片描述

最后还有UI界面或命令行工具。Prometheus是有自己的UI界面的,但是比较简陋,因此一般不使用,而是使用Grafana,Grafana是比较强大的图像界面工具。

UI界面会请求Prometheus服务端查询监控信息,而HTTP Server接收到请求后,会查询TSDB数据库返回相应的监控信息。

在这里插入图片描述

Java应用程序通过Actuator整合Prometheus

我们Java应用程序如果要收集监控指标数据到Prometheus的话,需要引入spring-boot-starter-actuator依赖包。

actuator专门用于收集当前应用程序的各种监控指标以及健康状况,然后通过暴露端点的方式供外部查询。外部应用可以通过Actuator提供的端点Endpoint查询到相应的监控信息。

在这里插入图片描述

除了引入spring-boot-starter-actuator以外,还要引用一个micrometer-registry-prometheus依赖包,用于将监控数据转为Prometheus的格式。

在这里插入图片描述
然后我们要在application.yml中添加以下配置开启Actuator端点:

management:
  endpoints:
    web:
      exposure:
        include: "*" 

Prometheus的服务端则需要在prometheus.yml进行相应配置:

scrape_configs:
  - job_name: 'java_actuator'
  	scrape_interval: 5s
    metrics_path: '/actuator/prometheus'
    static_configs:
    - targets: ['<your_java_app_host>:<your_java_app_port>']

Zabbix

Zabbix也是一款服务监控软件,比Prometheus要早。

在这里插入图片描述

Zabbix支持通过Agent和自定义脚本两种方式收集监控数据。Agent是部署在客户端集群上的一个进程,主动监控目标机器以及应用程序,收集监控指标,发送到Zabbix_Server。Zabbix_Server把收集到的监控数据存入数据库中。

Zabbix有一个Web界面,可以查询Zabbix_Server存储的监控数据。

Agent除了可以直接发送监控数据到Zabbix_Server以外,还可以发送到Zabbix_Proxy中,Zabbix_Proxy是一个代理节点,暂存从Agent收到的数据,并提交到Server。这种部署架构一般用在跨网络、跨机房的的网络架构中。

如果是大型网络架构,节点非常多。还可以部署Zabbix_Node,Zabbix_Node可以接收Agent或Proxy发来的监控数据,由Node提交到Server。

对比

Prometheus更侧重于云原生和微服务架构的监控,并且由于其强大的多维数据模型,使得它比Zabbix能提供更多更细的监控指标项,但是配置复杂学习成本高。

Zabbix由于提供了全面的监控功能(可以监控服务器、网络设备、应用程序),因此适合用于企业级监控(需要全面监控服务器、网络设备和各种网络参数的场景),但是对于云原生环境监控则没有Prometheus来的合适。

更多推荐