Spring Cloud之应用程序多维度监控解决方案

使用微服务框架开发应用程序,其特点是分模块、跨进程、分布式部署。这就增加了对整个服务的监控难度,由于分布式服务的“雪崩式效应”,当一个微服务发生故障时,会连带着对整个服务造成不可估量的影响。因此如何快速定位问题,以及查询系统健康程度等就显得尤为必要。系统内及系统间的监控,也是微服务治理的重要组成部分。本文从系统级别和系统间的级别角度,通过笔者在实际生产环境中的应用经验,总结了对Spring Boot应用程序的监控整体多维度解决方案。本文适合Spring Boot开发人员阅读,也适合运维相关的同学阅读,如果你对程序本身的监控感兴趣,也可以尝试去阅读。

1. 系统级别监控

系统级别的监控,是应用程序本身的健康程度的直接体现,常用包括JVM、GC、Environment、IO、System Load、Property、ClassLoading等信息。Spring Boot提供了Actuator组件,对应用程序的监控做了集成功能,第三方工具就可以读取Actuator暴露的接口来收集数据。

1.1 Spring Boot Admin

Spring Boot Admin是一款监控和管理Spring Boot应用程序的开源软件。Spring Boot Admin读取Actuator的接口数据,并通过Spring Boot Admin UI将实时数据展示在前端。了解Spring Boot Admin的配置方法,可以参考我之前的博文《Spring Boot(四)之程序性能监控》

Actuator提供的监控数据多而全,基本能覆盖日常的监控需求。

1.2 JVM工具及付费JVM工具

JDK一般都自带了一些JVM分析工具,像JConsole、JMap、VisualVM等,可以在本地直接读取进程信息并展示。

还有一些第三方的JVM分析工具,比如阿里开源的Arthas,可以对你的Java程序进行诊断。还有诸如OneAPM等公司,提供了整体的端到端性能诊断解决方案。

JVM工具,更多的是用来分析JVM Heap信息、内存快照等,可以用来做基本的内存溢出和性能优化的诊断。

1.3 日志分析

log日志,也是我们监控系统、排查问题的主要信息来源。在微服务架构体系下,一个痛点就是日志的聚合和链路追踪:即在分布式部署下,一个工程通常需要部署在几十个甚至上百个节点中,这时候,如何收集各个服务器的日志并快速定位是哪台机器出的问题,这是目前Spring Boot应用程序分布式部署的难点。

Spring Cloud提供了Sleuth组件,可以解决上面的这个问题,具体的实现步骤,可以参考我的博文《Spring Cloud之分布式链路跟踪服务Sleuth》

2. 系统间链路监控

由于我们的微服务都是分布式部署的,这就产生了对调用链的监控需求。什么是分布式服务调用链呢,假设用户访问一个资源,请求首先到网关(Nginx或Zuul)A这里,A转发请求到服务B,B又通过HTTP或RPC调用服务C,则此时就产生了一个简单的分布式调用链:A->B->C。分布式调用链的监控,主要关注服务调用层级关系、调用链出错比例、调用链吞吐、请求响应时间等信息。

2.1 HTTP调用

对于服务间采用HTTP治理的分布式系统来说,调用链可以参考之前的博文《Spring Cloud之分布式链路跟踪服务Sleuth》 和第二篇《Spring Cloud之基于Zipkin的链路数据持久化》

2.2 RPC服务调用

通用的RPC框架,都会提供自己的监控组件,你可以根据你选择的RPC框架选择对应的RPC监控。例如我们目前的服务采用Spring Boot + Dubbo的方式开发,使用的RPC监控组件就是Dubbo Admin。Dubbo Admin目前提供了如下的服务监控页面:

image

image

提供了服务提供者、消费者、调用关系、响应时间等指标信息。

3. 监控数据存储及展示

使用Spring Boot Admin做监控,有一个痛点是其只展示了实时的metrics信息,并不具备存储监控数据的功能,如果我们需要做数据的时间序列分析,就需要借助其他组件。接下来,我提供了一种基于Actuator+Prometheus+Grafana的监控数据展示方案。

3.1 Prometheus

Prometheus是由SoundCloud开发的开源监控报警系统和时序列数据库(TSDB)。Prometheus使用Go语言开发,是Google BorgMon监控系统的开源版本。Prometheus具有如下几个特点:

  • 多维度数据模型。
  • 通过HTTP的Pull方式采集时序数据。
  • 可以配置服务发现来发现监控对象。
  • 支持多种数据查询,可以对接Grafana。

Prometheus的整体架构可参考下图:

image

Prometheus+Grafana的工作流程大约是这样:

  1. 应用程序暴露metrics接口。
  2. Prometheus定时抓取metrics指标信息。
  3. Prometheus存储、整理、清洗指标数据。
  4. Grafana读取Prometheus的API,数据展示。

Prometheus的安装过程可直接在官网查找,本文不再赘述。

3.2 应用程序修改

增加依赖:

1
2
compile('io.micrometer:micrometer-registry-prometheus:1.0.9')
compile('io.micrometer:micrometer-spring-legacy:1.0.9')

增加metrics配置类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.spring.autoconfigure.MeterRegistryCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* Created by zhaoyh on 2019-03-12
* micrometer+prometheus配置
*
* @author zhaoyh
*/
@Configuration
public class MetricsConfiguration {
@Bean
public MeterRegistryCustomizer meterRegistryCustomizer(MeterRegistry meterRegistry) {
return meterRegistry1 -> {
meterRegistry.config()
.commonTags("application", "你的程序名称");
};
}
}

然后打开 http://程序host:port/prometheus ,即可查看相关metrics指标数据。

3.3 Grafana

Grafana是一个跨平台的开源度量分析和可视化工具,通过将采集的数据查询然后做可视化的展示,并具备一定的报警功能。Grafana具备如下特点:

  • 比较灵活的图标展示方式。
  • 支持Graphite,InfluxDB,OpenTSDB,Prometheus,Elasticsearch等多数据源。
  • 可配置的报警功能。
  • 支持多数据源联合查询。

Grafana的安装可参考这里

Grafana中添加Prometheus数据源的步骤可参考这里

Grafana有两种方式创建监控的Dashboard,第一种是自定义Dashboard,第二种是直接使用Dashboard模版

Grafana中展示到的Spring Boot应用程序的时序数据如下图:

image

4. 总结

本文,介绍了对应用程序监控的解决方案,也算是笔者实际应用的一个总结,也欢迎业余时间有兴趣做服务监控的小伙伴多多交流。

以上内容就是关于Spring Cloud之应用程序多维度监控解决方案的全部内容了,谢谢你阅读到了这里!

Author:zhaoyh