一、Prometheus基本介绍

Prometheus(由go语言开发)是一套开源的监控&报警&时间序列(按照时间排序)数据库的组合。因为kubernetes(俗称k8s)的流行带动了prometheus的发展。它可以监控主机,服务,容器,支持多种exporter采集数据,还支持pushgateway进行数据上报,Prometheus性能足够支撑上万台规模的集群。
https://prometheus.io/docs/introduction/overview/

时间序列数据(TimeSeries Data) : 按照时间顺序记录系统、设备状态变化的数据被称为时序数据。这种时序数据,会应用到很多场景, 如:

  • 最常见的就是我们系统中的日志
  • 无人驾驶车辆运行中要记录的经度,纬度,速度,方向,旁边物体的距离等等。每时每刻都要将数据记录下来做分析。
  • 某一个地区的各车辆的行驶轨迹数据、车流量
  • 传统证券行业实时交易数据
  • 实时运维监控数据,网卡流量图,服务的当前状态,资源的使用情况,比如说,你所监控的内容出现了直线飙升、断崖式下跌、断线,一般都意味着出现了问题,不管是什么时候发生的,都要赶紧查一下出了什么问题

1.1、时间序列数据库的主要优点

时间序列数据库主要用于指处理带时间标签(按照时间的顺序变化,即时间序列化)的数据,带时间标签的数据也称为时间序列数据。

  • 性能好

关系型数据库对于大规模数据的处理性能糟糕,这一点可以从I/O上有明显的体现。使用NOSQL可以比较好的处理大规模数据,但是依然比不上时间序列数据库。

  • 存储成本低

由于采用的是metrics:key=value(标签:关键字=值)的数据存储方式,又使用了高效的压缩算法,平均消耗的存储成本在3.5个字节左右 ,所以比较节省存储空间 ,并且能有效降低IO

Prometheus有着非常高效的时间序列数据存储方法,每个采样数据仅仅占用3.5byte左右空间,上百万条时间序列数据,每隔30秒采集一次,保留60天,大概占用200多G的空间(来自官方文件数据)

1.2、Prometheus主要特征

  1. 多维度数据模型,可以通过多个维度对数据建模,也可以通过多个维度对数据进行查询

  2. 灵活的查询语言,提供灵活的PromQL查询方式,还提供了HTTP查询接口,可以很方便地结合Grafana等组件展示数据

  3. 不依赖分布式存储,支持单节点的本地存储。通过Prometheus自带的时序数据库,可以完成每秒百万及的数据存储,如果需要存储大量历史数据,还可以对接第三方的时序数据库

  4. 以HTTP方式,通过pull模型拉取时间序列数据,并提供了开放的指标数据标准

  5. 也可以通过中间网关支持push模型
    这种推,拉监控其实就是主动和被动监控,默认情况下是以pull(拉)的方式,也就是监控主机去找被监控主机将数据要过来,如果要实现push(推)的方式需要中间网关的支持,这只是与zabbix的叫法不同而已

  6. 通过服务发现或者静态配置来发现目标服务对象

  7. 支持多种多样的图表和界面展示,可以使用第三方的工具来展示内容,如Grafana

1.3、Prometheus监控原理

  1. Prometheus Server负责定时在目标上抓取metrics(指标)数据,
  2. 每个抓取目标[主机、服务]都需要暴露一个HTTP服务接口用于Prometheus定时抓取。也就是说prometheus会将获取到的监控数据打包成一个可访问的web页面,通过访问指定的url来确定主机的状态

Pull方式的优势是能够自动进行上游监控和水平监控,配置更少,更容易扩展,更灵活,更容易实现高可用。简单来说就是Pull方式可以降低耦合。由于在推送系统中很容易出现因为向监控系统推送数据失败而导致被监控系统瘫痪的问题。因为如果同一时间有很多被监控主机都把数据推送给监控主机的话,就很可能导致监控主机处理不过来,所以通过Pull方式,被采集端无需感知监控系统的存在,完全独立于监控系统之外,这样数据的采集完全由监控系统控制。

1.4、Prometheus配置文件六个大配置段的含义

  • 下面这张图展示了Prometheus的架构和各个组件是如何交互和协作的
    在这里插入图片描述

  • prometheus配置文件各个大配置段

    • scrape_configs 采集配置段 做采集器
    • rule_files 告警、预聚合配置文件段
    • remote_read 远程查询段
    • remote_write 远程写入段
    • alerting: Alertmanager信息段
  • 优秀的开源项目大多是模块化的,能让使用者根据业务场景自行决定开启哪些配置

对应的配置段用途
采集配置段做采集器,数据保存在本地
采集配置段 + 远程写入段做采集器+传输器,数据保存在本地+远端存储
远程查询段做查询器,查询远端存储数据
采集配置段 + 远程查询段做采集器+查询器,查询本地数据+远端存储数据
采集配置段 + Alertmanager信息段 + 告警配置文件段做采集器+告警触发器,查询本地数据生成报警发往Alertmanager
远程查询段 + Alertmanager信息段 + 告警配置文件段做远程告警触发器,查询远端数据生成报警发往Alertmanager
远程查询段+远程写入段 + 预聚合配置文件段做预聚合指标,生成的结果集指标写入远端存储
  • yaml具体配置格式
# 全局配置段
global:
  # 采集间隔 
  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: 10s 
  # 查询日志,包含各阶段耗时统计
  query_log_file: /opt/logs/prometheus_query_log
  # 全局标签组
  # 通过本实例采集的数据都会叠加下面的标签
  external_labels:
    account: 'huawei-main'
    region: 'node1'

# Alertmanager信息段
alerting:
  alertmanagers:
  - scheme: http
    static_configs:
    - targets:
      - "localhost:9090"

# 告警、预聚合配置文件段
rule_files:
    - /etc/prometheus/rules/record.yml
    - /etc/prometheus/rules/alert.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'.

    static_configs:
    - targets: ['localhost:9090']

# 远程查询段
remote_read:
  # prometheus 
  - url: http://prometheus/v1/read
    read_recent: true

  # m3db 
  - url: "http://m3coordinator-read:7201/api/v1/prom/remote/read"
    read_recent: true

# 远程写入段
remote_write:
  - url: "http://m3coordinator-write:7201/api/v1/prom/remote/write"
    queue_config:
      capacity: 10000
      max_samples_per_send: 60000
    write_relabel_configs:
      - source_labels: [__name__]
        separator: ;
        # 标签key前缀匹配到的drop
        regex: '(kubelet_|apiserver_|container_fs_).*'
        replacement: $1
        action: drop

二、部署prometheus监控平台

  • 安装部署prometheus服务监控端
  • 监控一个远端机器
  • 监控一个服务:mysql
prometheus 主程序包:wget https://github.com/prometheus/prometheus/releases/download/v2.11.1/prometheus-2.16.0.linux-amd64.tar.gz

远端主机监控插件(类似于zabbix-agent): wget  https://github.com/prometheus/node_exporter/releases/download/v0.18.1/node_exporter-1.0.0-rc.0linux-amd64.tar.gz

mysql业务监控插件: wget   https://github.com/prometheus/mysqld_exporter/releases/download/v0.12.0/mysqld_exporter-0.12.1.linux-amd64.tar.gz
  • 实验拓扑图
    prometheus实验图.png

2.1、部署prometheus服务监控端

[root@node1 ~]# tar xf prometheus-2.11.1.linux-amd64.tar.gz -C /usr/local/
[root@node1 ~]# cd /usr/local/prometheus-2.11.1.linux-amd64/
[root@node1 prometheus-2.11.1.linux-amd64]# ./prometheus --config.file=prometheus.yml &

启动测试
Prometheus_1.png

看到这个页面说明prometheus启动成功了,默认监控了自己,我们来看一下本机的监控状态
Prometheus_2.png

点击 status—targets即可看到监控的机器或者资源
Prometheus_3.png

看到本机了,同时也可以根据提示在浏览器中输入http://IP或者域名:9090/metrics查看监控数据。

显示监控数据
http://192.168.98.201:9090/metrics

Prometheus_node1_metrics4.png

如果能看到这些信息就说明监控拿到了数据,拿到数据就可以正常显示了。通过这个URL我们可以知道prometheus把监控的数据都统一存放在一起,然后生成一个web页面,用户可以通过web页面查看相关的数据,这些数据遵循了时序数据库的格式,也就是key=value的形式.这些数据就是我们的监控指标,只不过现在还没有办法分析,需要借助图形展示才会更方便阅读

prometheus显示同样也提供了图表,可以通过图表很直观的看到监控项的状态,只不过自带的图形实在是不怎么好看。

通过点击Graph可以显示到下列图表,在搜索栏中输入关键字可以匹配出你想看的监控项

image20200225140312916.png
这里输入的是process_cpu_seconds_total,CPU使用状态表就出现了,注意要点一下图表左上角的Graph按钮,默认是在console按钮页面。

2.2、监控一个远端业务机器

a、安装监控客户端

[root@node2 ~]# tar xf node_exporter-0.18.1.linux-amd64.tar.gz -C /usr/local/
[root@node2 ~]# cd /usr/local/node_exporter-0.18.1.linux-amd64/
[root@node2 node_exporter-0.18.1.linux-amd64]# ls
LICENSE  node_exporter  NOTICE

#后台启动
[root@node2 node_exporter-0.18.1.linux-amd64]# nohup /usr/local/node_exporter-0.18.1.linux-amd64/node_exporter &
[1] 7281
[root@node2 node_exporter-0.18.1.linux-amd64]# nohup: 忽略输入并把输出追加到"nohup.out"


#业务机器监控插件服务端口
[root@node2 node_exporter-0.18.1.linux-amd64]# lsof -i :9100
COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
node_expo 7281 root    3u  IPv6  42486      0t0  TCP *:jetdirect (LISTEN)

#验证  http://被监控机名称:9100/metrics
http://192.168.98.202:9100/metrics
现在这台机器上的数据被打包成了一个可以访问的页面,所以可以使用浏览器去访问这个页面,看下能否获取到相关的数据,如果能够获取的话就表示没有问题了。 

b、在prometheus添加监控信息

#被监控主机设置完成之后,需要在prometeus主配置文件中添加被监控机信息
[root@node1 prometheus-2.11.1.linux-amd64]# tail -4  prometheus.yml 

  - job_name: 'node2'	#定义名称
    static_configs:#定义具体配置
    - targets: ['192.168.98.202:9100']#定义目标
 
 ####注意缩进  两个空格
     
 #重启服务    
[root@node1 prometheus-2.11.1.linux-amd64]# pkill prometheus
[root@node1 prometheus-2.11.1.linux-amd64]# ./prometheus --config.file=prometheus.yml &


注意:prometheus启动报错
**lock DB directory: resource temporarily unavailable"** 
原因:prometheus没有正常关闭,锁文件存在
rm $prometheus_dir/data/lock

c、测试验证

设置完查看prometheus页面
Prometheus_6.png

查看Status-Targets页面后可以看到被监控机node2(192.168.98.202)已经在监控列表中了,同时可以通过浏览器看看其监控数据。

Prometheus_node2_metrics5.png

在浏览器中输入http://192.168.98.202:9100/metrics 能看到数据

2.3、监控一个服务:mysql

要监控mysql需要两个条件,一个是系统中有mysql,另一个是要有监控插件,现在监控插件已经下载好了,所以我们要先安装mysql,然后进行相应的授权,让插件可以获取到所需要的信息,然后再设置相关插件,修改prometheus配置文件

a、部署mysql业务

[root@node2 node_exporter-0.18.1.linux-amd64]# dnf -y install mariadb-server mariadb
[root@node2 mysqld_exporter-0.12.0.linux-amd64]# systemctl enable mariadb
Created symlink from /etc/systemd/system/multi-user.target.wants/mariadb.service to /usr/lib/systemd/system/mariadb.service.
[root@node2 mysqld_exporter-0.12.0.linux-amd64]# systemctl start mariadb

#创建监控用户
MariaDB [(none)]> grant select,replication client,process on *.* to 'hello'@'localhost' identified by '123456';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)

b、部署监控插件

[root@node2 ~]# tar xf mysqld_exporter-0.12.1.linux-amd64.tar.gz -C /usr/local
[root@node2 ~]# vim /usr/local/mysqld_exporter-0.12.1.linux-amd64/.my.cnf
[root@node2 ~]# cat /usr/local/mysqld_exporter-0.12.1.linux-amd64/.my.cnf
[client]
user=hello
password=123456

#启动
[root@node2 ~]# nohup /usr/local/mysqld_exporter-0.12.1.linux-amd64/mysqld_exporter --config.my-cnf=/usr/local/mysqld_exporter-0.12.1.linux-amd64/.my.cnf &

[root@node2 ~]# lsof -i :9104
COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
mysqld_ex 7698 root    3u  IPv6  46415      0t0  TCP *:peerwire (LISTEN)

c、在prometheus主配置文件中添加监控

#
[root@node1 prometheus-2.11.1.linux-amd64]# tail -10 prometheus.yml 
    static_configs:
    - targets: ['localhost:9090']

  - job_name: 'node2'
    static_configs:
    - targets: ['192.168.98.202:9100']
  
  - job_name: 'mariadb'
    static_configs:
    - targets: ['192.168.98.202:9104']

d、重启prometheus服务

[root@node1 prometheus-2.11.1.linux-amd64]# pkill prometheus
[root@node1 prometheus-2.11.1.linux-amd64]# ./prometheus --config.file=prometheus.yml &

e、通过监控页面查看服务

Prometheus_node2_mysql9.png

通过Graph页面看看相关图表

Prometheus_node2_mysql8.png

可以勾选stacked将图形显示为堆叠状。

三、prometheus Grafana数据展示及告警

prometheus这个监控软件的展示界面实在是有些难看,所以换一个展示方式:Grafana,Grafana是一个开源的度量分析和可视化工具(没有监控功能),可以通过将采集的数据分析,查询,然后进行可视化的展示,并能实现报警。

3.1、部署grafana

a、grafana安装

软件包获得
官方网站: grafana:https://grafana.com/

软件包安装

[root@manage01 ~]# dnf -y localinstall grafana-6.6.1-1.x86_64...

服务启动

#服务启动
[root@manage01 ~]# systemctl enable grafana-server
Created symlink from /etc/systemd/system/multi-user.target.wants/grafana-server.service to /usr/lib/systemd/system/grafana-server.service.
[root@manage01 ~]# systemctl start grafana-server

#验证启动
[root@manage01 ~]# lsof -i :3000
COMMAND     PID    USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
grafana-s 17154 grafana    8u  IPv6  53939      0t0  TCP *:hbci (LISTEN)

grafana启动成功后,可以通过页面访问到grafana页面

在浏览器中输入http://IP或者域名:3000

grafana1.png
要求输入账号密码: admin/admin(默认)

当看到这个页面说明grafana已经安装成功并且工作了。

输入账号密码登录时,由于是第一次登录,为了安全要求必须更改密码后才能登录
grafana2.png
输入两次新密码后,点击save即可登录

b、grafana页面设置-添加prometheus数据源

登录成功后,页面会为你提供一个使用引导线,按着引导需要都设置一下,主要为grafana设置数据源。

image20200225145354437.png

从图标上可以看出,我们需要设置数据源—展示仪表盘—添加用户这些操作。
点击Add data source 增加数据源

image20200225145454014.png

选择Prometheus进入下一步。

image20200225153536052.png

auth部分的设置,主要是与HTTPS配合使用的,如果使用的是https就需要证书,认证等,需要对此部分内容进行一些配置

按照页面要求填入对应信息即可,一般错误都是因为输入错误造成的。点击Save & Test后保存成功

grafana6.png

通过左侧导航栏中的齿轮图标下拉菜单中的Data Source看到刚才添加的数据源

3.2、绘制图形

a、仪表盘管理

grafana7.png

添加完数据源后,可以继续添加仪表盘,这样我们就能以图表的方式看到数据,继续点击New Dshboard

grafana8.png

图上显示你可以增加一个图形到仪表盘,也可以选择一个样式图标

这里任选一个都可以,这个版本不知道作者怎么想的,其实功能都能实现

这里选择第一个 Add query

grafana9.png

进入页面后,左侧有四个标识,分别是

数据源
image20200225154121203.png

图表
image20200225154146665.png

设置
image20200225154213541.png

告警
image20200225154254663.png

我们按照图标步骤先来设置数据源

如上图,在A项中根据需求,匹配你的监控项,如果有多项,可以通过右上角的add query增加,设置完成后就可以设置图表样式了,点击图表

grafana10.png

图表主要说的就是图表的样式,主要项解释:

  • 第一个 Draw Modes 说的是图表中图的展示方式,有条状 线 点三种
  • 第二个 Mode Options 说的是图表的填充阴影透明度 图上线的粗细
  • 最后一个 是否开启图表堆叠和显示百分比

设置完成后再看看设置图标

该页面主要是设置图表名称和注释的

grafana11_1.png

设置好后我们图表设置就暂时这样,后续告警再细说告警设置。

点击保存后图表就保存好了。

grafana11.png

保存图表时会要求输入仪表盘名称。这里输入Node2

grafana12.png

确认无误后,点击保存

grafana13.png

仪表盘做好了,同时也看到了我们的图形。

接下来应该设置用户,这个用户添加,采用的是邀请机制,也就是需要我们生成邀请链接,然后发给对应的用户,然后对方访问相应的链接注册,这样,这个用户才能添加成功 点击Add users按钮

grafana14.png

按照要求添加一个用户

grafana15.png

点击邀请用户

image20200225161454447.png

输入用户名称、用户角色点击邀请

image20200225161653564.png

点击邀请后,需要将邀请链接发给用户或者自己在浏览器中打开确认邀请
切换到另一台主机在浏览器中打开

image20200225162223119.png

输入email地址和用户密码点击注册即可

image20200225162409462.png

回到使用admin账号登录grafana的主机,刷新后就可以看到新注册的用户,也可以对用户进行删除,修改权限

b、grafana设置–添加监控cpu负载的图形

点击左边侧栏:➕—Choose Visualization

选择graph图表样式

按照要求输入数据项:

  • node_load1 CPU一分钟平均负载
  • node_load5 CPU五分钟平均负载
  • node_load15 CPU十五分钟平均负载

注意:如果同时监控了多个机器,图表会显示所有机器的,如果只想显示某个机器的可以使用监控匹配。

输入方法如下:

监控项{instance=“被监控机IP:port”}

如下图

image20200225163828382.png

这样就可以显示一台机器了。

c、grafana设置—使用模板图表展示MySQL监控

mysql监控模板下载
https://github.com/percona/grafana-dashboards

模板设置

#在grafana配置文件中添加插件信息
[root@manage01 ~]# vim /etc/grafana/grafana.ini 
[root@manage01 grafana]# tail -3 /etc/grafana/grafana.ini 
[dashboards.json]
enabled = true
path = /var/lib/grafana/dashboards

#下载插件
[root@manage01 ~]# unzip grafana-dashboards-master.zip 


#拷贝插件到指定位置
[root@manage01 ~]# cd grafana-dashboards-master/
[root@manage01 grafana-dashboards-master]# cp -r dashboards /var/lib/grafana/
[root@manage01 dashboards]# vim /var/lib/grafana/dashboards/MySQL_Overview.json
#搜索pmm-singlestat-panel替换为singlestat
#重启生效
[root@manage01 grafana]# systemctl restart grafana-server.service 

web界面导入模板

grafana20.png

选择左侧菜单—➕—Import

选择对应的json文件,然后导入即可

grafana21.png

点击导入后就可以看到图片了

image20200225171755015.png

3.3 Grafana告警

设置grafana的告警通道

image20200225174606552.png

点击左侧铃铛图表—notification channels—Add channel

image20200225175559736.png

  • Name 部分:填一个名字
  • Type 部分:选择 webhook 方式
  • Send on all alerts:勾选后表示默认所有的报警都会通过这个通道发
  • Include image:勾选后表示在报警的时候同时截图发送,因为目前的报警通知不支持图片,所以这里不用勾选
  • Disable Resolve Message:勾选后表示当状态从报警中恢复到正常时,不再发送信息,即不告知恢复正常,这里不用勾选
  • Send reminders:勾选后表示除了状态刚变成报警中时会发报警消息,过后每隔一段时间,如果依然处于报警中的状态,那么还会发一次重复报警
  • Send reminder every:表示每隔多长时间发送重复报警,这里填默认30分钟
  • Url:正式服的报警服务器
  • Http Method:选择 POST

设置完成后点击send test可以去注册账号时使用的邮箱查看报警邮件

image20200225175125898.png

设置好通道并完成验证后,为图表设置报警

onealter7.png

选择图表 点击图表名称的下拉菜单—edit 进入编辑菜单

onealter8.png

选择铃铛图表—create alert 设置图表告警

onealter9.png

这里报警阈值设置的是取CPU Load平均值 因为是实验,所以预警值是0.5方便测试告警

onealter10.png

设置完成后,发现图表上出现了预警线,点击保存

接下来在node2上增加CPU的负载

image20200225220905872.png

image20200225222218919.png

告警完成。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐