- 一、常用监控简介
- 二、特性
- 三、运维监控平台设计思路
- 四、prometheus监控体系
- 五、prometheus架构
- 六、prometheus数据模型(什么是标签、什么是指标、什么是样本)
- 七、Prometheus部署实验
一、常用监控简介
1、cacti
Cacti(英文含义为仙人掌〉是一套基于 PHP、MySQL、SNMP和 RRDtool开发的网络流量监测/图形分析工具。
2、Nagios
Nagios是一款开源的免费网络监视工具,能有效监控windows、Linux和Unix的主机状态,交换机路由器等网络设备,包括打印机等。
3、Zabbix
zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。
4、open-Falcaon是小米开源的企业级监控工具,用GO语言开发,包括小米、滴滴、美团等在内的互联网公司都在使用它,是一款灵活、可拓展并且高性能的监控方案
夜莺
5、Prometheus
borg.kubernetes
borgmon(监控系统) 对应克隆的版本:prometheus(go语言)
所以prometheus 特别适合K8S 的架构上
二、特性
① 多维的数据模型(基于时间序列的Key、value键值对)
② 灵活的查询和聚合语言PromQL
③ 提供本地存储和分布式存储,高效的储存,不依赖分布式储存,支持单主节点工作
④ 通过基于HTTP和HTTPS的Pull模型采集时间序列数据(pull数据的推送,时间序列:每段
时间点的数据值指标,持续性的产生。横轴标识时间,纵轴为数据值,一段时间内数值的动态变化,所有的点连线形成大盘式的折线图)
⑤ 可利用Pushgateway (Prometheus的可选中间件)实现Push模式(只会对脚本执行或者一次性/短周期执行的任务,使用push方式)不适合通过/使用七层暴露的指标数据
⑥ 可通过动态服务发现或静态配置发现目标机器(通过consul自动发现和收缩)
⑦ 支持多种图表和数据大盘
三、运维监控平台设计思路
1.数据收集模块
2.数据提取模块 (prometheus-TSDB 查询语言是PromQL)
3.监控告警模块 (布尔值表达式判断是否需要告警 PromQ(CPU使用率)> 80%)
细化为
第六层——用户展示管理层——同一用户管理、集中监控、集中维护
第五层——告警事件生成层——实时记录告警事件、形成分析图表(趋势分析、可视化)
第四层——告警规则配置层——告警规则设置、告警伐值设置(定义布尔值表达式,筛选异常状态)
第三层——数据提取层——定时采集数据到监控模块
第二层——数据展示层——数据生成曲线图展示(对时序数据的动态展示)
第一层——数据收集层——(多渠道监控数据)——(网络,硬件,应用,数据,物理环境)
四、prometheus监控体系
1、系统层监控(需要监控的数据)
1.1 CPU、Load、Memory、swap、disk i/o、process等
1.2.网络监控:网络设备、工作负载、网络延迟、丢包率等
2、 中间件及基础应用监控
2.1.消息中间件:kafka、RocketMQ、等消息代理(redis 中间件)
2.2.WEB(应用)服务器:tomcat、weblogic、apache、php、spring 系列
2.3.数据库/缓存数据库:MySQL、PostgreSQL、MogoDB、es、redis
redis监控内容:
redis所在服务器的系统层监控
redis 服务状态
RDB AOF日志监控
日志——>如果是哨兵模式——>哨兵共享集群信息,产生的日志——>直接包含的其他节点哨兵信息及redis信息
key的数量
key被命中的数据/次数
最大连接数——》redis 和 系统 :
系统:ulimit -a
redis: redis-cli 登陆——》config get maxclients 查看最大连接
监控指标:我们如何选择我们需要监控的指标呢? ? ?数据流向——》
1)服务之间对接:服务数据流向
2)端口、模块、API之间的对接,业务数据流向
3 )网络层面,端口、设备的对接,网络流量/数据的流向
指标选择:(业务测、体验感、稳定/安全性我们关心的指标数据):
主机层面:服务器中影响应用状态的一些指标数据,比如基本的资源(“五大资源”+最大文件打开数+文件描述符+socket等)
网络层面:架构中,内、外网、网络流量数据(gPS TPs)以及延迟、丢包、效率性能、队列-》socket等指标数据
业务层面:在业务数据流向(数据链路线)进行追踪监控,API接口数据流量,
应用层面:示例: mysql,表的数量、总表的记录行,select语句数量、insert数量、慢查询语句,错误日志、主从复制状态,服务内内存,死锁,打开的线程数量、socket、文件描述符
3、应用层监控
用于衡量应用程序代码状态和性能
#监控的分类#:黑盒监控,白盒监控
PS:
白盒监控,自省指标,等待被下载 (cadvisor)
黑盒监控:基于探针的监控方式,不会主动干预、影响数据
4、业务层监控
用于衡量应用程序的价值,如电商业务的销售量,ops、dau日活、转化率等,业务接口:登入数量,注册数、订单量、搜索量和支付量
监控指标:我们如何选择我们需要监控的指标呢? ? ?数据流向—-》
1)服务之间对接:服务数据流向
2) 端口、模块、API之间的对接,业务数据流向
3)网络层面,端口、设备的对接,网络流量/数据的流向
指标选择(业务侧、体验感、稳定/安全性我们关心的指标数据):
主机层面:服务器中影响应用状态的一些指标数据,比如基本的资源(“五大资源”+最大文件打开数+文件描述符+socket等)
网络层面:架构中,内、外网、网络流量数据(QPS RPS)以及延迟、丢包、效率性能、队列-》socket等指标数据
业务层面:在业务数据流向(数据链路线)进行追踪监控,APr接口数据流量,
应用层面:示例:Aysql,表的数量、总表的记录行,select语句数量、insert数量、慢查询语句,错误日志、主从复制状态,服务内内存,死锁,打开的线程数量、socket、文件描述符
五、prometheus架构
1.prometheus-server:
retrieval(获取数据pull/discover),TSDB存储,HTTPserver 控制台接口,内建了数据样本采集器,可以通过配置文件定义,告诉prometheus到那个监控对象中采集指标数据,prometheus采集过后,会存储在自己内建的TSDB数据库中(默认为2个月时间)),提供了promQL支持查询和过滤操作,同时支持自定义规则来作为告警规则,持续分析一场指标,一旦发生,通知给alerter来发送告警信息,还支持对接外置的UI工具 (grafana)等来展示数据
2.pushgateway(短期周期任务)
允许短暂和批量作业将其指标暴露给普罗米修斯,由于这些类型的作业可能存在时间不足而被删除,因此他们可以将其指标推送到pushgateway,然后pushgateway将这些指标暴露给Prometheus-server端,主要用于业务数据汇报
3.exporters(常规任务—守护进程)
专门采集一些web服务,nginx,mysql服务。因为不适合直接通过http的方式采集数据,所以需要通过exporter采集数据(下载mysql_exporter,采集mysql数据指标)cadvisor:docker数据收集工具(docker也有自己内置的监控收集方式)
exporter和instrumtations(内建指标暴露器),负责专门服务数据的收集然后暴露出来等待promtheus收集
4.service discovery:原生支持k8s的服务发现,支持consul、DNS等
5.prometheus内置TSDB数据库作为存储(时序数据的储存,promtheus的TSDB数据库默认保存15天,可以自行调整)
ps:时间序列数据库(时序数据库)主要用于指处理代表签(按照时间的顺序变化,既时间序列化)的数据,带时间标签的数据也成为时间序列数据,这是一种特殊类型的数据库,一般不会保存长时间的数据(与mysql相比)。
数据保存时间 storge.tsdb.retention=90d参数中修改即可(或启动时间指定)
6.alertmanagr:prometheus可以生成告警信息,但是不能直接提供告警,需要使用一个外置的组件altermanager来进行告警,emailetcd优势在于,收敛、支持静默、去重、可以防止告警信息的轰炸
7.data visualization:prometheus web ui(prometheus-server内建),也可以使用grafana
8.PrmoQL(告警规则编写),通常告警规则的文件指定输出到展示界面(grafana)或者直接通过邮件,短信等方式发送警告
9.ui表达式浏览器(调试)
六、prometheus数据模型(什么是标签、什么是指标、什么是样本)
1、概述
prometheus仅用键值方式存储时序式的聚合数据,他不支持文本信息
其中的"键"成为指标(metric),通常意味着cpu速率、内存使用率或分区空闲比例等
同一指标可能适配到多个目标或设备、因而它使用"标签"作为元数据,从而为metric添加更多的信息描述维度例如三台设备,在同一时刻,都会产生例如1分组CPU负载的数据,他们都会使用相同的指标(metric),而此时一个指标,如何表示时间序列?
比如:三个node节点都会有相同的指标(例如cpu0的负载那么就会使用相同的指标名称)
使用 指标:标签=标签值 的格式来表示,例如:local1 {host=node1,host=node2}
metric(cpu指标):
示例:
cpu_usage{core=‘1’,ip=‘192.168.133.50’} 14.04
key cpu0 labels(元数据) 样本
1
2
prometheus每一份样本数据都包含了:
① 时序列标识:key+lables
② 当前时间序列的样本值value
③ 这些标签可以作为过滤器进行指标过滤及聚合运算,如何从上万的数据过滤出关键有限
的时间序列,同时从有限的时间序列在特定范围的样本那就需要手动编写出时间序列的样本表达式来过滤出我们需求的样本数据
2、指标类型
默认都是以双精度浮点型数据(服务端无数据量类型数据)
① counter : 计数器单调递增
② gauge:仪表盘:有起伏特征的
③ histogram:直方图:
在一段时间范围内对数据采样的相关结果,并记入配置的bucket中,他可以存储更多的数据,包括样本值分布在每个bucket的数量,从而prometheus就可以使用内置函数进行计算:
计算样本平均值:以值得综合除以值的数量
计算样本分位值:分位数有助于了解符合特定标准的数据个数,例如评估响应时间超过1秒的请求比例,若超过20%则进行告警等
④ summary,摘要,histogram的扩展类型,它是直接由监控端自行聚合计算出分位数,同时
将计算结果响应给prometheus server的样本采集请求,因而,其分位数计算是由监控端完成
3、作业job和实例targets/instance
① job:能够接收prometheus server数据scrape “mysql_nodes” “mysql_master_slave”
② targets 每一个可以被监控的系统,成为targets多个相同的targets的集合(类)称为job
③ instance:实例 与 targets(类似)
与target相比,instance更趋近于一个具体可以提供监控数据的实例,而targets则更像一个对象、目标性质,target可以是一个节点也可以是一个节点组
target一般是在配置文件中 instance 是在proMQ语句中出现
4、prometheusQL(数据查询语言也是时序数据库使用语言)
支持两种向量,同时内置提供了一组用于数据处理的函数
① 即时向量:最近以此时间戳上跟踪的数据指标(某一个时间点上的数据)
即时向量选择器:返回0个1个或者多个时间序列上在给定时间戳上的各自的一个样本,
该样本成为即时样本,因为有可能某几台数值相同,那么就会有数据重叠
② 时间范围向量:指定时间范围内所有时间戳上的数据指标
范围向量选择器:返回0个1个或多个时间序列上在给定时间范围内的各自的一组样本
七、Prometheus部署实验
服务器分配
主机名 地址 安装包
prometheus 192.168.133.50 prometheus-2.27.1.linux-amd64.tar.gz
node1 192.168.133.75 node_exporter-1.1.2.linux-amd64.tar.gz
[root@localhost ~]# systemctl stop firewalld.service
[root@localhost ~]# setenforce 0
[root@localhost ~]# hostname pro
[root@localhost ~]# su
[root@localhost ~]# hostname node
[root@localhost ~]# su
[root@pro opt]# cd /usr/local/prometheus-2.27.1.linux-amd64/
[root@pro prometheus-2.27.1.linux-amd64]# ls
[root@pro prometheus-2.27.1.linux-amd64]# cat prometheus.yml
# my global config
global: //全局组件
//每隔多久抓取一次指标,注释情况下默认1分钟
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
//内置告警规则的评估周期
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
# scrape_timeout is set to the global default (10s).
//对接的altermanager(第三方告警模块)
# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets:
# - alertmanager:9093
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files: //告警规则
# - "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_name: 'prometheus' //对于指标需要打上的标签,对于PrometheusSQL(查询语句)的标签:比如prometheus{target='values'}
# metrics_path defaults to '/metrics' //收集数据的路径
# scheme defaults to 'http'.
static_configs: //对于Prometheus的静态配置监听端口具体数据收集的位置 默认的端口9090
- targets: ['localhost:9090']
[root@pro prometheus-2.27.1.linux-amd64]# cp prometheus /usr/local/bin
[root@pro prometheus-2.27.1.linux-amd64]# prometheus
打开浏览器,可以见到页面
这里只有promethuse主机的监控内容,节点的却看不到,是因为需要通过静态或者动态来获取节点信息展示在浏览器中
1、展示化浏览器使用
例如我们搜索所有"UP"的机器就可以显示出来,但是如果节点断掉的话也是可以显示,但是后面状态为0
对应查询的位置参数位置
当我们关闭其中一台node节点
1.1、CPU使用总量
node_cpu_seconds_total
1.2、计算过去5分钟内的CPU使用速率
PromQL: irate(node_cpu_seconds_total{mode=“idle”}[5m])
解析:
irate:速率计算函数(灵敏度非常高的)
node_cpu_seconds_total:node节点CPU使用总量
mode=“idle” 空闲指标
5m:过去的5分钟内,所有CPU空闲数的样本值,每个数值做速率运算
1.3、每台主机CPU 在5分组内的平均使用率
PromQL:(1- avg (irate(node_cpu_seconds_total{mode=‘idle’}[5m]))by (instance))* 100
解析
avg:平均值
avg (irate(node_cpu_seconds_total{mode=‘idle’}[5m]):可以理解为CPU空闲量的百分比
by (instance):表示的是所有节点
(1- avg (irate(node_cpu_seconds_total{mode=‘idle’}[5m]))by (instance))* 100:CPU 5分钟内的平均使用率
1.4、其他
其他常用的指标:
1、查询1分钟平均负载超过主机CPU数量两倍的时间序列
node_load1 > on (instance) 2 * count (node_cpu_seconds_total{mode=‘idle’}) by(instance)
2、内存使用率
node_memory_MemTotal_bytes
node_memory_MemFree_bytes
node_memory_Buffers_bytes
node_memory_Cached_bytes
计算使用率:
可用空间:以上后三个指标之和
已用空间:总空间减去可用空间
使用率:已用空间除以总空间
2、静态获取节点信息
[root@master prometheus-2.27.1.linux-amd64]# vim prometheus.yml
在末尾静态增加节点信息
- job_name: 'nodes'
static_configs:
- targets: ['192.168.133.75:9100']
当节点故障时,promethuse仍然还在收集node节点数据,但是状态为down。
3、基于文件服务发现
基于文件的服务发现仅仅略优于静态配置的服务发现方式,它不依赖于任何平台或第三方服务,因而也是最为简单和通用的实现方式。
prometheus server定期从文件中加载target信息(pro-server pull指标发现机制-job_name 获取我要pull的对象target)文件可以只用json和yaml格式,它含有定义的target列表,以及可选的标签信息;以下第一配置,能够将prometheus默认的静态配置转换为基于文件的服务发现时所需的配置;(prometheus会周期性的读取、重载此文件中的配置,从而达到动态发现、更新的操作)
只需要更改node_centos.yml和Prometheus_server.yml文件内容,不需要停止服务
然后编辑prometheus.yml文件、新建node_centos.yml和Prometheus_server.yml文件
[root@pro prometheus-2.27.1.linux-amd64]# pwd
/usr/local/prometheus-2.27.1.linux-amd64
[root@pro prometheus-2.27.1.linux-amd64]# vim prometheus.yml
28 file_sd_configs:
29 - files:
30 - targets/prometheus_*.yaml 文件路径/文件名称
31 refresh_interval: 2m 抓取时间间隔
32
33 # All nodes
34 - job_name: 'nodes'
35 file_sd_configs:
36 - files:
37 - targets/nodes_*.yaml 文件路径/文件名称
38 refresh_interval: 2m
[root@pro prometheus-2.27.1.linux-amd64]# mkdir targets
[root@pro prometheus-2.27.1.linux-amd64]# cd targets/
[root@pro targets]# ls
nodes_centos.yaml prometheus_server.yaml
[root@pro prometheus-2.27.1.linux-amd64]# vim nodes_centos.yml
- targets:
- 192.168.133.75:9100
- 192.168.133.100:9100
- 192.168.133.101:9100
labels:
app: node-exporter
job: node
[root@pro prometheus-2.27.1.linux-amd64]# vim prometheus_server.yaml
- targets:
- 192.168.133.50:9090
labels:
app: prometheus
job: prometheus
这时打开展示型浏览器
几台我们需要监控的机器都可以监控的到了
4、基于DNS ——》SRV记录
基于DNS的服务发现针对一组DNS域名进行定期查询,以发现待监控的目标查询时使用的DNS服务器由/etc/resolv.conf文件指定;
该发现机制依赖于A、AAAA和SRv资源记录,且仅支持该类方法,
1、基于 SRV 记录发现
scrape_configs:
- job_name: 'webapp'
dns_sd_configs:
- names: [‘_prometheus._tcp.shhnwangjian.com]
注意:_prometheus 为服务名称,_tcp 为协议, xiodi.cn 为域名
2、基于 A 记录
- job_name: 'webapp'
dns_sd_configs:
- names: [ 'ops.shhnwangjian.cn']
type: A
port: 9090
5、基于consul发现
一款基于golang开发的开源工具,主要面向分布式,服务化的系统提供服务注册、服务一发现和配置管理的功能提供服务注册/发现、健康检查、Key/Value存储、多数据中心和分布式一致性保证等功能
原理:通过定义json文件将可以进行数据采集的服务注册到consul中,用于自动发现同时使用prometheus做为client端获取consul上注册的服务,从而进行获取数据
[root@pro opt]# unzip consul_1.9.0_linux_amd64.zip -d /usr/local/bin
[root@pro opt]# cd /usr/local/
[root@pro local]# mkdir -pv /consul/data
mkdir: created directory ‘/consul’
mkdir: created directory ‘/consul/data’
[root@pro local]# mkdir /etc/consul && cd /etc/consul
[root@pro consul]# consul agent -dev -ui -data-dir=/consul/data/ \
> -config-dir=/etc/consul/ -client=0.0.0.0
agent -dev:运行开发模式
agent -server:运行server模式
-ui:ui界面
-data-dir:数据位置
/etc/consul:可以以文件形式定义各个services的配置,也可以基于api接口直接配置
-client:监听地址
##编辑/etc/consul目录下的prometheus-servers.json配置文件
[root@pro consul]# vim prometheus-servers.json
{
"services": [
{
"id": "prometheus-server-node01",
"name": "prom-server-node01",
"address": "192.168.133.50",
"port": 9090,
"tags": ["prometheus"],
"checks": [{
"http": "http://192.168.133.50:9090/metrics",
"interval": "5s"
}]
}
]
}
##重载配置文件
[root@pro consul]# consul reload
Configuration reload triggered
打开浏览器输入192.168.133.50:8500,可显示consul界面
[root@pro ~]# cd /usr/local/prometheus-2.27.1.linux-amd64
[root@pro consul]# vim prometheus.yml
。。。。
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: 'prometheus'
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
consul_sd_configs:
- server: "192.168.133.50:8500"
tags:
- "prometheus"
refresh_interval: 2m
# All nodes
- job_name: 'nodes'
consul_sd_configs:
- server: "192.168.133.50:8500"
tags:
- "nodes"
refresh_interval: 2m
启动promethuse
[root@pro prometheus-2.27.1.linux-amd64]# prometheus
这时在consule界面就可以看到主服务的监控了
5.1、添加node节点
[root@pro ~]# cd /etc/consul/
[root@pro consul]# vim nodes.json
{
"services": [
{
"id": "node_exporter-node01",
"name": "node01",
"address": "192.168.133.75",
"port": 9100,
"tags": ["nodes"],
"checks": [{
"http": "http://192.168.133.75:9100/metrics",
"interval": "5s"
}]
},
{
"id": "node_exporter-node02",
"name": "node02",
"address": "192.168.133.100",
"port": 9100,
"tags": ["nodes"],
"checks": [{
"http": "http://192.168.133.100:9100/metrics",
"interval": "5s"
}]
},
{
"id": "node_exporter-node03",
"name": "node03",
"address": "192.168.133.101",
"port": 9100,
"tags": ["nodes"],
"checks": [{
"http": "http://192.168.133.101:9100/metrics",
"interval": "5s"
}]
}
]
}
重启consul和promethuse后打开浏览器