背景
目前平台缺少强有力的监控工具,单独依靠Spring Boot Admin 还太欠缺,没有大屏、没有分布式链路追踪、自定义告警繁琐,在我的《Spring Boot Admin2》专栏中自定义过JVM监控和异常监控,都需要自己编码定义监控规则和告警,效率很低。
需求
为了解决如上的问题,我整理了一下内部对应监控的可能需求:
1、内部服务的监控(Metrics)
2、网站、服务接口外部可用性监控
3、服务器硬件相关指标监控
4、数据库、中间件等监控
5、自定义的一些业务指标监控(Exporter)
6、灵活的自定义告警规则(AlertManager)
7、链路监控(skywalking)
产品调研
Zabbix
传统监控产品,主要在服务器相关监控方面有优势,不支持云原生监控,C语言开发,资料多
📌 Zabbix 告警机制不完善,设置繁琐; 监控微服务能力太弱,了解到只能监控微服务的在线状态
Nightingale(夜莺)(Open-Falcon)
国产监控,云原生监控分析系统,采用 All-In-One 的设计,集数据采集、可视化、监控告警、数据分析于一体,与Prometheus、VictoriaMetrics、Grafana、Telegraf、Datadog 等生态紧密协同集成,提供开箱即用的企业级监控分析和告警能力,产品较新2020年发布,符合国人风格,资料少,部分插件需要购买或自研,GO语,https://n9e.github.io/docs/prologue/introduction/
📌 本来个人更倾向于选择该产品,深入产品交流群后,群里交流不活跃,很多问题没人回复,如果用开源产品肯定会碰到很多问题,没有一个良好的交流环境会很难继续使用。
📌 后期调研了企业版,企业版价格昂贵,按年收费,费用堪比一个高级程序员。
Hertzbeat
国产小众监控,主打无侵入式,无Agent监控,支持JVM,MYSQL,Linux, Kubernetes等应用服务,数据库,操作系统,中间件,云原生等监控。更自由化的阈值告警配置,支持邮箱,短信,webhook,钉钉,企业微信,飞书机器人等告警通知。提供Custom-Monitoring,通过不同的协议SSH,JDBC,JMX,SNMP,HTTP等,仅需配置YML就能自定义监控指标并快速接入监控系统,Java语言
https://hertzbeat.com/docs/
📌 刚看到的个人开源监控产品,群交流活跃,个人觉得功能够用但是不够美观
Prometheus
云原生时代监控产品,支持自定义配置告警,自定义监控,Go语言开发,资料较多
这是监控三字塔,可见Prometheus+Grafana的组合已经覆盖了大部分的监控。
这是Prometheus的管理界面,Prometheus本身也是一个TSDB(时序数据库)。
配合Grafana大屏工具,对指标进行展示,并且官方商城有很多免费的大屏可以直接使用,几乎可以做到开箱即用,上图就是使用了免费的JVM指标大屏。
📌 Grafana 具有很强大的功能,相关教程文章可见《Grafana》
Prometheus 架构
什么是Exporter
广义上讲所有可以向Prometheus提供监控样本数据的程序都可以被称为一个Exporter。而Exporter的一个实例称为target,如下所示,Prometheus通过轮询的方式定期从这些target中获取样本数据:
- 社区提供的
Prometheus社区提供了丰富的Exporter实现,涵盖了从基础设施,中间件以及网络等各个方面的监控功能。这些Exporter可以实现大部分通用的监控需求。下表列举一些社区中常用的Exporter:
- 用户自定义的
除了直接使用社区提供的Exporter程序以外,用户还可以基于Prometheus提供的Client Library创建自己的Exporter程序,目前Promthues社区官方提供了对以下编程语言的支持:Go、Java/Scala、Python、Ruby。同时还有第三方实现的如:Bash、C++、Common Lisp、Erlang,、Haskeel、Lua、Node.js、PHP、Rust等。
自定义埋点
public class DemoMetrics implements MeterBinder {
public Counter counter;
public Map<String, Double> map = new HashMap<>();
@Override
public void bindTo(MeterRegistry meterRegistry) {
//定义并注册一个计数器
this.counter = Counter.builder("prometheus.demo.counter").tags(new String[]{"name", "counter1"})
.description("demo counter").register(meterRegistry);
//设置动态变化的仪表盘
Gauge.builder("prometheus.demo.gauge", map, x -> x.get("x")).tags("name", "gauge1").description("This is Gauge")
.register(meterRegistry);
}
}
总结
综上所述,为了既省成本又有扩展性,决定选择开源的Prometheus+Grafana,虽然有一定的学习成本,但毕竟是目前的主流监控产品。
作者其他文章:
Grafana 系列文章,版本:OOS v9.3.1
- Grafana 的介绍和安装
- Grafana监控大屏配置参数介绍(一)
- Grafana监控大屏配置参数介绍(二)
- Grafana监控大屏可视化图表
- Grafana 查询数据和转换数据
Spring Boot Admin 2 系列文章:
- Spring Boot Admin 参考指南
- SpringBoot Admin服务离线、不显示健康信息的问题
- Spring Boot Admin2 @EnableAdminServer的加载
- Spring Boot Admin2 AdminServerAutoConfiguration详解
- Spring Boot Admin2 实例状态监控详解
- Spring Boot Admin2 自定义JVM监控通知
- Spring Boot Admin2 自定义异常监控
- Spring Boot Admin 监控指标接入Grafana可视化