中国*******银行系统监控架构说明
*张磊 2020-03-16 *
**系统监控,经前期技术选型及调研,采用prometheus+influxdb+grafana开源架构,通过prometheus进行数据采集,并将数据保存到influxdb时序数据库中;grafana作为可视化的数据显示及告警。
要采集数据,需要对被监控系统进行“埋点”。在后续章节中会详细说明。
系统监控,各系统之间的关系,如下图所示:
-
首先,需要在被监控系统上进行“埋点”,以便数据被prometheus抓取。
-
prometheus会循环从埋点获取数据(时间间隔可配置),并保存到时序数据库中。
-
grafana将保存到influxdb中的数据展示,并设置告警及告警方式。
-
应用可以从influxdb中获取数据,也可以接受grafana的告警信息进行处理。
接下来将对其使用进行详细说明。供开发和实施人员参考。
为提高软件安装效率与降低维护成本,并结合行方目前情况,建议使用docker安装。
prometheus
prometheus是一个开源监控系统。它通过抓取目标的HTTP端点暴露的metrics(度量)数据来进行监控。Prometheus提供了本地存储(TSDB
时序数据库),并且保存到硬盘中。也可以保存到远程时序数据库中,例如influxdb。其详细架构如下图所示:
Metric类型:
-
Counter:
一种累加的metric,如请求的个数,结束的任务数,出现的错误数等 -
Gauge:
常规的metric,如温度,可任意加减。其为瞬时的,与时间没有关系的,可以任意变化的数据。 -
Histogram:
柱状图,用于观察结果采样,分组及统计,如:请求持续时间,响应大小。其主要用于表示一段时间内对数据的采样,并能够对其指定区间及总数进行统计。根据统计区间计算 -
Summary:
类似Histogram,用于表示一段时间内数据采样结果,其直接存储quantile数据,而不是根据统计区间计算出来的。不需要计算,直接存储结果
1.1 安装prometheus
- 通过docker命令搜索镜像:docker search prometheus
- 下载镜像:dokcer pull prom/prometheus
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200325152315464.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NhbnNoaXpoYW5n,size_16,color_FFFFFF,t_70)
1.2 集成influxdb
因为需要与influxdb数据库集成,同时也需要获取被监控系统的指标数据,所以需要对其yml文件进行映射,在容器内部无法修改yml文件。
集成influxdb,修改yml文件,配置remote_write:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-njQfnGE3-1584413109909)(1/media/image5.png)]{width=“5.44in” height=“4.9375in”}同时,将被监控系统的“埋点”信息进行配置,其中,scrape_interval表示轮询间隔;mertics_path表示获取被监控系统指标数据库的入口;targets表示被监控系统的地址与端口。
1.3 启动命令
docker run -p 9090:9090 --name prometheus -v
/home/eyecool/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
-d prom/prometheus:latest
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MnAMMRrD-1584413109910)(1/media/image6.png)]{width=“5.56in” height=“1.5631944444444446in”}
- 进入容器,执行docker exec命令
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WviNCQU9-1584413109911)(1/media/image7.png)]{width=“5.280589457567804in”
height=“0.4270297462817148in”}
- Web管理台访问,默认端口9090,通过浏览器访问,http://192.168.61.95:9090,
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-58Zp87qD-1584413109912)(1/media/image8.png)]{width=“5.52799978127734in”
height=“2.3229166666666665in”}
1.4 Metric(指标)类型
-
Counter:一种累加的
metric,递增的计数器。(适合:记录接口请求次数,统计交易量) -
Gauge:一种常规的
metric,可以任意加减。(适合:记录cpu变化,类似破浪线不均匀) -
Histogram:可以理解为柱状图,典型的应用如:请求持续时间,响应大小,可以对观察结果采样,分组及统计。
-
Summary:类似于 Histogram,
典型的应用如:请求持续时间,响应大小,提供观测值的 count 和 sum
功能,提供百分位的功能,即可以按百分比划分跟踪结果。
2.influxdb
InfluxDB是一个由InfluxData开发的开源时序型数据。它由Go写成,着力于高性能地查询与存储时序型数据。InfluxDB被广泛应用于存储系统的监控数据,IoT行业的实时数据等场景。
InfluxDB(时序数据库),常用的一种使用场景:监控数据统计。每毫秒记录一下电脑内存的使用情况,然后就可以根据统计的数据,利用图形化界面(一般配合Grafana)制作内存使用情况的折线图。
可以理解为按时间记录一些数据(常用的监控数据、埋点统计数据等),然后制作图表做统计。
2.1 与传统数据库相关区别
和传统数据库相比,influxdb在相关概念上有一定不同,具体如下:
influxdb 中的概念 传统数据库中的概念
database 数据库
measurement 数据库中的表
point 表中的一行数据
point的数据结构由时间戳(time)、标签(tags)、数据(fields)三部分组成,具体含义如下:
point 属性 含义
time 数据记录的时间,是主索引(自动生成)
tags 各种有索引的属性
fields 各种value值(没有索引的属性)
- 此外,influxdb还有个特有的概念:series(一般由:retention policy,
measurement, tagset就共同组成),其含义如下:
所有在数据库中的数据,都需要通过图表来展示,而这个series表示这个表里面的数据,可以在图表上画成几条线:通过tags排列组合算出来。
-
需要注意的是,influxdb不需要像传统数据库一样创建各种表,其表的创建主要是通过第一次数据插入时自动创建,如下:
insert mytest, server=serverA count=1,name=5
//自动创建表“mytest”,“server” 是 tags,“count”、“name” 是 fields -
fields 中的 value 基本不用于索引
2.2 安装influxdb
- Docker查找并拉取infuxdb镜像
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CJ14VyHe-1584413109913)(1/media/image9.png)]{width=“5.44in” height=“3.1756944444444444in”}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JGQqx3fi-1584413109916)(1/media/image10.png)]{width=“5.45599956255468in”
height=“0.42291666666666666in”}
- 运行容器:docker run -p 8083:8083 -p 8086:8086 --name influxdb –d
influx:latest
其中:
端口
8083:管理页面端口,访问localhost:8083可以进入你本机的influxdb管理页面;端口 8086:http连接influxdb
client端口,一般使用该端口往本机的influxdb读写数据。
- 进入容器:docker exec -it influxdb bash
切换到目录:/usr/bin下,执行./influx,等待连接:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1EMliblc-1584413109917)(1/media/image11.png)]{width=“3.957839020122485in”
height=“0.5520144356955381in”}
2.3 常用命令
-
show databases;
-
create database prometheus;
-
create database testdb2 with duration
30d;创建数据库时带存储策略,保存30天 -
use prometheus;
-
select * from prometheus;
-
select * from my_gauge where time >=‘2020-03-09 15:49:00’
tz(‘Asia/Shanghai’) -
show retention policies on “db_name”, 数据库存储策略
-
CREATE DATABASE “prometheus_db”
CREATE USER “prometheus_user” WITH PASSWORD ‘12345678’
GRANT ALL ON “prometheus_db” TO “prometheus_user”
2.4 可视化工具
为方便查询数据,Influxdbstudio可作为influxdb的可视化工具,不过该工具不能执行update和insert操作。
grafana
grafana 是一款采用 go
语言编写的开源应用,主要用于大规模指标数据的可视化展现,是网络架构和应用分析中最流行的时序数据展示工具,目前已经支持绝大部分常用的时序数据库。可以做数据监控和数据统计,并带有告警功能。
3.1 安装grafana
- Search 镜像:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kyIgoX7c-1584413109918)(1/media/image12.png)]{width=“5.383999343832021in”
height=“2.2993055555555557in”}
- 拉取镜像:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ctEHD6e5-1584413109919)(1/media/image13.png)]{width=“5.4in” height=“2.421527777777778in”}
- 创建grafana.ini文件,映射到容器中,如果想支持告警发送邮件,需修改grafana.ini文件:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-18fprQKQ-1584413109920)(1/media/image14.png)]{width=“5.431999125109361in”
height=“2.361111111111111in”}
- 启动容器:docker run -d -p 3000:3000 -v
/home/eyecool/grafana/grafana.ini:/etc/grafana/grafana.ini --name
grafana -d grafana/grafana
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g1ZhkaYM-1584413109921)(1/media/image15.png)]{width=“5.44799978127734in”
height=“0.4701388888888889in”}
- Web通过http访问3000端口:首次登陆时,使用admin/admin登陆,会让我们修改密码。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aQ8znC6u-1584413109923)(1/media/image16.png)]{width=“5.48in” height=“2.873611111111111in”}
3.2 集成influxdb
从web端,登录grafana控制台。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8x84ZHnZ-1584413109924)(1/media/image17.png)]{width=“5.431999125109361in”
height=“1.2555555555555555in”}
- 选择数据库:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-80ww9Br2-1584413109925)(1/media/image18.png)]{width=“5.383999343832021in”
height=“3.2155883639545055in”}
- 选择influxDB:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U8aKvUSO-1584413109927)(1/media/image19.png)]{width=“5.32in” height=“3.223611111111111in”}
- 配置
- 添加数据源
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xzmzyrjK-1584413109932)(1/media/image20.png)]{width=“5.792000218722659in”
height=“2.2881944444444446in”}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mRjD9z3W-1584413109934)(1/media/image21.png)]{width=“5.791666666666667in”
height=“1.9236111111111112in”}
以influxdb为例,提前搭建好时序数据库数据库。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VlUKFBen-1584413109935)(1/media/image22.png)]{width=“5.76799978127734in”
height=“4.231944444444444in”}
- 添加报警
提前找到/grafana/conf/defaults.ini配置文件,搜索smtp配置发件人邮箱。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tFfNTnpH-1584413109936)(1/media/image23.png)]{width=“5.760416666666667in”
height=“1.8055555555555556in”}
添加报警收件人
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ONw8y6TH-1584413109937)(1/media/image24.png)]{width=“5.763194444444444in”
height=“1.2868055555555555in”}
添加邮件报警发送
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DX09bL2f-1584413109938)(1/media/image25.png)]{width=“5.761111111111111in”
height=“1.9756944444444444in”}
添加webhook报警发送java项目
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QLgCOBwQ-1584413109940)(1/media/image26.png)]{width=“5.754166666666666in”
height=“1.863888888888889in”}
3.3 配置监控项
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7yAC6A9E-1584413109942)(1/media/image27.png)]{width=“5.759722222222222in”
height=“1.2090277777777778in”} 查询与sql一样
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LAv9my8N-1584413109944)(1/media/image28.png)]{width=“5.7659722222222225in”
height=“2.5409722222222224in”}
添加报警规则配置
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4h3MlREr-1584413109948)(1/media/image29.png)]{width=“5.760416666666667in”
height=“2.592361111111111in”}
Name:就是这个报警的名字。
Evaluate every:表示每隔多长时间检查下面的条件是否成立。
For:这个选项可不设置,不设置表示每次检查一旦发现条件成立就会发通知。如果设置,则表示条件成立后,并不会将状态直接从
OK 改为 Alert,而是先变为 Pending
状态,这时候不会立即发通知,等这个条件一直满足超过设定的 For
的时间,才会将状态改为 []{#OLE_LINK1 .anchor}Alert,并发送通知。
Conditions:条件组中可以设置多个条件,只有判断成立才触发状态变更。
avg():用来控制如何将搜索出来的数据集计算得出一个可以跟阈值进行比较的值,可以换成
max(), min() 等等。
query(A, 5m,
now):第一个参数指定了是用哪个语句来执行,就是代表了图表的查询语句标签页定义的语句。后面的两个参数
5m, now 则表示了时间区间,5分钟之前到现在。如果填成 10m, now-2m
则表示10分钟之前到2分钟之前的这段时间。
IS ABOVE
1000:表示算出来的结果是否超过1000,这种跟阈值对比的算法可以自行修改。
No Data & Error
Handling:表示没有收到数据,或者执行出错的情况下,将状态设置成什么。
Send to:NeteaseAlert,设置报警发送的通道,详见3.4告警通知。
Message:这里表示发出的报警的文字内容是什么。
3.4 告警通知
grafana可以支持多种告警通知方式,比较常用的有:email、webhook等。
- 邮件告警,前提是在ini文件中配置stmp信息(前面已说明)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c6sahtPe-1584413109949)(1/media/image25.png)]{width=“5.60799978127734in”
height=“1.9756944444444444in”}
- Webhook告警
该方式告警,需要java应用提供post接口:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YmJyAjdI-1584413109951)(1/media/image30.png)]{width=“5.768055555555556in”
height=“0.7034722222222223in”}
Grafana配置webhook报警:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m9UvWMdX-1584413109953)(1/media/image26.png)]{width=“5.754166666666666in”
height=“1.863888888888889in”}
Java接收webhook报警信息,根据具体场景,接收处理对应状态(state)的数据
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xYWNIEaf-1584413109954)(1/media/image31.png)]{width=“5.754166666666666in”
height=“4.179861111111111in”}
=======
109951)]{width=“5.768055555555556in”
height=“0.7034722222222223in”}
Grafana配置webhook报警:
[外链图片转存中…(img-m9UvWMdX-1584413109953)]{width=“5.754166666666666in”
height=“1.863888888888889in”}
Java接收webhook报警信息,根据具体场景,接收处理对应状态(state)的数据
[外链图片转存中…(img-xYWNIEaf-1584413109954)]{width=“5.754166666666666in”
height=“4.179861111111111in”}
=======