监控平台简介:
统一监控平台由七大角色构成:监控源、数据采集、数据存储、数据分析、数据展现、预警中心、CMDB(企业软硬件资产管理)
- 监控源:
从层次上来分,大致可以分为三层,业务应用层、中间件层、基础设施层。业务应用层主要包括应用软件、企业消息总线等,中间件层包括数据库、缓存、配置中心、等各种系统软件,基础设施层主要有物理机、虚拟机、容器、网络设备、存储设备等等。
- 数据采集:
数据源如此多样,数据采集的任务自然轻松不了。数据采集从指标上划分可以分为业务指标、应用指标、系统软件监控指标、系统指标。应用监控指标如:可用性、异常、吞吐量、响应时间、当前等待笔数、资源占用率、请求量、日志大小、性能、队列深度、线程数、服务调用次数、访问量、服务可用性等,业务监控指标如大额流水、流水区域、流水明细、请求笔数、响应时间、响应笔数等,系统监控指标如:CPU负载、内存负载、磁盘负载、网络IO、磁盘IO、tcp连接数、进程数等。
从采集方式来说通常可以分为接口采集、客户端agent采集、通过网络协议主动抓取(http、snmp等)
- 数据存储:
采集到的数据一般都会存储到文件系统(如HDFS)、索引系统(如elasticsearch)、指标库(如influxdb)、消息队列(如kafka,做消息临时存储或者缓冲)、数据库(如mysql)
- 数据分析:
针对采集到的数据,进行数据的处理。处理分两类:实时处理和批处理。技术包括Map/Reduce计算、全日志检索、流式计算、指标计算等,重点是根据不同的场景需求选择不同的计算方式。
- 数据展现:
将处理的结果进行图表展现,在多屏时代,跨设备的支持必不可少。
- 预警:
如果在数据处理过程发现了问题,则需要进行异常的分析、风险的预估以及事件的触发或告警。
- CMDB(企业软硬件资产管理):
CMDB在统一监控平台中是很重要的一环,监控源虽然种类繁多,但是他们大都有着关系,如应用运行在运行环境中,应用的正常运行又依赖网络和存储设备,一个应用也会依赖于其他的应用(业务依赖),一旦其中任何一个环节出了问题,都会导致应用的不可用。CMDB除了存储软硬件资产外,还要存储这样一份资产间的关联关系,一个资产发生了故障,要能根据这个关系迅速得知哪些其他的资产会被影响,然后逐一解决问题。
为什么选择Prometheus?
Prometheus VS Zabbix:
发行时间 | 开发语言 | 性能 | 社区支持 | 容器支持 | 企业使用 | 部署难度 | |
Prometheus | 2016 | go | 支持万为单位 | 相对不如zabbix,但是人数与日俱增 | 不仅支持swarm原生集群,还支持Kubernetes容器集群的监控,是目前容器监控最好的解决方案 | 基本上使用Kubernetes与容器的企业,prometheus是最好的选择 | 只有一个核心server组件,一条命令便可以启动 |
Zabbix | 2012 | c + php | 上限约一万字节 | 应用广泛,支持较成熟,遇到的问题都能搜索到 | Zabbix出现得比较早,当时容器还没有诞生,自然对容器的支持也比较差 | 在传统监控系统中,尤其是在服务器相关监控方面,占据绝对优势 | 多种系统,多种监控信息采集方式 |
架构原理:
- Prometheus Server:
Prometheus Sever是Prometheus组件中的核心部分,负责实现对监控数据的获取,存储及查询。Prometheus Server可以通过静态配置管理监控目标,也可以配合使用Service Discovery的方式动态管理监控目标,并从这些监控目标中获取数据。其次Prometheus Sever需要对采集到的数据进行存储,Prometheus Server本身就是一个实时数据库,将采集到的监控数据按照时间序列的方式存储在本地磁盘当中。Prometheus Server对外提供了自定义的PromQL,实现对数据的查询以及分析。另外Prometheus Server的联邦集群能力可以使其从其他的Prometheus Server实例中获取数据。
- Exporters:
Exporter将监控数据采集的端点通过HTTP服务的形式暴露给Prometheus Server,Prometheus Server通过访问该Exporter提供的Endpoint端点,即可以获取到需要采集的监控数据。可以将Exporter分为2类:
直接采集:这一类Exporter直接内置了对Prometheus监控的支持,比如cAdvisor,Kubernetes,Etcd,Gokit等,都直接内置了用于向Prometheus暴露监控数据的端点。
间接采集:原有监控目标并不直接支持Prometheus,因此需要通过Prometheus提供的Client Library编写该监控目标的监控采集程序。例如:Mysql Exporter,JMX Exporter,Consul Exporter等。
- AlertManager:
在Prometheus Server中支持基于Prom QL创建告警规则,如果满足Prom QL定义的规则,则会产生一条告警。在AlertManager从 Prometheus server 端接收到 alerts后,会进行去除重复数据,分组,并路由到对应的接受方式,发出报警。常见的接收方式有:电子邮件,pagerduty,webhook 等。
- PushGateway:
Prometheus数据采集基于Prometheus Server从Exporter pull数据,因此当网络环境不允许Prometheus Server和Exporter进行通信时,可以使用PushGateway来进行中转。通过PushGateway将内部网络的监控数据主动Push到Gateway中,Prometheus Server采用针对Exporter同样的方式,将监控数据从PushGateway pull到Prometheus Server。
- Prometheus的工作流:
1、Prometheus server定期从配置好的jobs或者exporters中拉取metrics,或者接收来自 Pushgateway发送过来的metrics,或者从其它的Prometheus server中拉metrics;
2、Prometheus server在本地存储收集到的metrics,并运行定义好的alerts.rules,记录新的时间序列或者向Alert manager推送警报;
3、Alertmanager根据配置文件,对接收到的警报进行处理,发出告警;
4、在Web UI或Grafana中,通过PromQL从Prometheus server中查询并对采集到的数据进行可视化。
安装部署:
安装Prometheus:
tar -zxvf prometheus-*.tar.gz 进行解压即可。
进入prometheus-*解压目录,配置prometheus.yml:
# my global config
global:
scrape_interval: 15s # 设置为每15秒钟从Target采集一次数据,默认是1分钟一次
evaluation_interval: 15s # 设置为每15秒钟评估一下规则,默认是1分钟一次
# scrape_timeout is set to the global default (10s).
# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets: ["localhost:9093"] # 配置 alertmanager地址
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
- "prometheus.rules.yml" # 配置规则文件
# - "first_rules.yml"
# - "second_rules.yml"
# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
# 配置一个job,这里就是以prometheus自己作为exporter,监控prometheus自己
- job_name: "prometheus"
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ["172.16.0.213:9090"]
labels:
instance: prometheus
# 配置mysql exporter,监控mysql
- job_name: "mysqld_exporter"
static_configs:
- targets: ["localhost:9104"]
labels:
instance: mysql_208
# 配置linux exporter,监控linux主机
- job_name: "node_exporter"
static_configs:
- targets: ["localhost:9100"]
labels:
instance: linux_208
# 监控 访客管理这个JVM进程
- job_name: "vms"
metrics_path: /vms/actuator/prometheus
static_configs:
- targets: ["localhost:10109"]
配置prometheus.rules.yml:
groups:
# 配置一个规则,满足规则时,会将报警信息推送到alertmanager
- name: InstanceDown
rules:
- alert: "服务进程死亡"
expr: up == 0 # 基于Prom QL表达式创建的告警规则
for: 5m # 如果连续5分钟内的检测结果都是up == 0,那么推送报警信息给alertmanager
labels:
severity: critical # 报警的严重程度
annotations: # 报警内容
summary: "Instance {{ $labels.instance }} down"
description: "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 5 minutes."
- name: MemoryRule
rules:
- alert: "内存使用率过高报警"
expr: ((node_memory_MemFree_bytes + node_memory_Buffers_bytes + node_memory_Cached_bytes)) / node_memory_MemTotal_bytes * 100 > 80 # 基于Prom QL表达式创建的告警规则
for: 5m # 如果连续5分钟内的检测到的内存使用率都高于80%,那么推送报警信息给alertmanager
labels:
severity: "High" # 报警的严重程度
annotations: # 报警内容
summary: "服务名:{{$labels.alertname}}"
description: "业务500报警: {{ $value }}"
value: "{{ $value }}"
这是邮箱收到的报警信息:
配置好之后,启动即可。
访问地址:localhost:9090
安装Grafana:
With Grafana | Grafana documentation
Download Grafana | Grafana Labs
下载,解压,启动。
访问地址:172.16.0.213:3000
安装AlertManager:
下载,解压,配置alertmanager.yml文件:
global:
smtp_smarthost: 'smtp.qq.com:465'
smtp_from: '1737***937@qq.com'
smtp_auth_username: '1737***937@qq.com'
smtp_auth_password: 'idhcsx***qoe***'
smtp_require_tls: false
route:
receiver: 'mail-dyy'
group_wait: 1s
group_interval: 5s
repeat_interval: 1h
group_by: ['alertname']
receivers:
- name: 'mail-dyy'
email_configs:
- to: '1737***937@qq.com'
后续扩展:
监控平台是随着应用平台的扩展而扩展的。目前我们做了一个最小闭环,包含prometheus、alertmanager、grafana、node_exporter、mysqld_exporter等组成的最小闭环,可以监控linux服务器、监控mysql、监控具体的java项目。但是需要很多横向扩展的,比如监控MQ、监控Redis、监控Nginx等等。在做这些横向扩展的时候,主要需要把握两点,即Exporter、Grafana模板,而且Exporter暴露的监控项需要和Grafana模板里面的PromQL对应起来,如果没有对应的现成的模板,则需要手动创建。
Exporter:
Grafana模板:
根据名字来搜索想要的模板:
获取模板的ID:
在Grafana操作界面中进行import dashboard,输入上面的ID即可导入一个样式模板: