一、Promethes和zabbix对比

对比项 Prometheus zabbix Prometheus优势 zabbix优势
管理 二进制文件启动 LNMP+编译 轻量级server,便于迁移和维护
配置 配置文件 图形化 更好的支持自动化配置 成本低
client 丰富的client库 zabbix_agent自定义脚本 为各种中间件、应用提供专业的exporter,监控项更全面 支持自定义监控项,对监控涉及者的格局要求较高
数据存储方式 Prometheus TSDB MySQL 监控数据以时间维度统计情况较多,时序数据库更实用与监控数据的次敦促,按时间索引性能更高 Mysql比较常用
数据处理 PromQl MySQL PromQL计算函数丰富,统计维度广 同上
二次开发 丰富的SDK api 提供了Go、Java/Scala、Python、Ruby等sdk二次开发更便捷 api适配较为常用
对云环境的支持 原生支持容器监控 更适合物理机监控 自动发现容器,更好的适配k8s
告警方式 可按照标签分组,收敛 在次数上收敛 告警收敛方式更多样化
监控项值 支持数字 支持数字字符串 可做日志监控

二、Prometheus工作流程:

1、服务端

Prometheus服务端是以一个进程的方式启动,下载安装完成之后,只需要启动一个进程即可,程序默认监听9090端口。每次采集到的数据叫做metrics。这些采集到的数据会先存放到内存中,然后定期的写入磁盘,如果服务器重启会将硬盘数据写会内存,所以对内存有一定消耗,Pormetheus不需要重视历史数据,所以默认只会保留15天的数据。

[root@bogon prometheus]# nohup ./prometheus &
[root@bogon prometheus]# ps -ef |grep prometheus
root       2620   2618  0 15:33 ?        00:00:04 ./prometheus
root       6414   2631  0 16:01 pts/1    00:00:00 grep prometheus

2、客户端

Prometheus 客户端分为pull和push 两种方式。

  • pull模式

如果pull形式的话是服务端主动向客户端拉取数据,这样需要客户端上安装exporter作为守护进程(官网提供了很多exporters可以下载使用),比如node_exporter,几乎把系统自身相关数据全部采集了,非常全面,node_exporter默认监听9100端口。

  • push模式

如果是push形式的话客户端需要安装pushgateway插件,然后需要运维人员用脚本吧监控数据以key/value的形式提交给pushgateway,在由pushgateway提交给服务端。(这种模式适用于exporters无法满足监控需求时可以定义)

3、metrics主要数据类型

  • Gauges

最简单、使用最多的指标,获取一个返回值,这个返回值没有变化规律,不能肯定他是按照一定增长或减少的状态,采集回来的是多少就是多少。比如硬盘容量、CPU内存使用率都适合使用Gauges类型

  • Counters

计数器。数据从0开始累积,理想状态下应该是永远增长或者是不变。适合统计机器开机时间、HTTP访问量。

  • Histograms

和summary一样属于高级指标,用于统计数据的分布情况。比如最小值、最大值、中间值。比如统计一天的日志,大部分用户响应时间都是正常的,只有少量用户异常,如果这使用取平均值的话,这少量用户的异常情况就会被掩盖,而Histograms可以分别统计出全部用户的响应时间,比如0-1秒的用户有多少、1-2秒的用户有多少。

联邦集群监控架构图
在这里插入图片描述
每个数据中心部署单独的Prometheus Server,用于采集当前数据中心的监控数据。并由一个中心的Prometheus Server 负责聚合多个数据中心的监控数据。

联邦集群是每个Prometheus Server都包含一个用于获取当前实例中监控样本的接口/federate。不管是Prometheus实例还是exporter实例都可以获取。

三、Prometheus 服务端安装

1、首先下载prometheus服务端

https://github.com/prometheus/prometheus/releases
或者官网下载
https://prometheus.io/download/

2、解压安装包可以看到以下目录结构

[root@bogon local]# cd prometheus/
[root@bogon prometheus]# ll
总用量 95028
-rw-r--r--  1 root root        0 12月  4 12:57 1000
drwxr-xr-x. 2 3434 3434     4096 11月  6 2018 console_libraries
drwxr-xr-x. 2 3434 3434     4096 11月  6 2018 consoles
drwxr-xr-x. 3 root root     4096 12月  6 11:44 data
-rw-r--r--  1 root root     1920 12月  2 17:34 go.go
-rw-r--r--. 1 3434 3434    11357 11月  6 2018 LICENSE
-rw-------  1 root root    62726 12月  6 16:00 nohup.out
-rw-r--r--. 1 3434 3434     2769 11月  6 2018 NOTICE
-rwxr-xr-x. 1 3434 3434 58074162 11月  6 2018 prometheus
-rw-r--r--  1 root root      767 12月  3 15:24 prometheus.sh
-rw-r--r--  1 3434 3434     1772 12月  6 09:31 prometheus.yml
-rwxr-xr-x. 1 3434 3434 39113694 11月  6 2018 promtool
drwxr-xr-x. 2 root root     4096 12月  6 10:43 rules

3、运行promtheus程序

[root@bogon prometheus]# nohup ./prometheus &

查看端口

[root@bogon prometheus]# netstat -tunlp |grep prometheus
tcp        0      0 :::9090                     :::*                        LISTEN      2620/./prometheus 

在浏览器中输入server端ip地址:ip:9090
在这里插入图片描述
可以查看当前监控的节点,因为没有监控其他client端,所以目前只监控了server本身
在这里插入图片描述
只监控了prometheus服务端本身
在这里插入图片描述

4、配置文件

prometheus配置文件分四个配置

  • global:全局配置
  • alerting:告警配置
  • rule_files:告警规则
  • scrape_configs:配置数据源(target)
    prometheus 配置文件:

horbor_labels:配置为true可以确保当采集到的监控指标冲突时,能够自动忽略冲突的监控数据。如果为false时,prometheus会自动将冲突的标签替换为exported_ 的形式

match[]:指定需要获取的时间序列。match[]参数必须是一个瞬时向量选择器,比如:up或者{job=”api-server”}。配置多个match[]参数,用于获取多组时间序列的监控数据。

[root@bogon prometheus]# cat prometheus.yml
# my global config
global:
  scrape_interval:     15s # # 拉取targets 的默认时间间隔 Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # # 执行rules的时间间隔 Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).

# Alertmanager configuration
alerting:
  alertmanagers:
  - static_configs:
      - targets:
          - 172.16.5.25:9093

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:  #告警规则
   # - "first_rules.yml"
   # - "second_rules.yml"
  - /usr/local/prometheus/rules/all.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: slaves
    honor_labels: true
    metrics_path: /federate
    params:
      match[]:
        - '{__name__=~"^slave:.*"}'   # Request all slave-level time series
        - '{__name__=~"job:.*"}'
        - '{__name__=~"node.*"}'

    static_configs:  #静态发现两个slave端(因为slave端就两台所以可以直接用静态发现)
      - targets:
        - 172.16.5.122:9090
        - 172.16.5.25:9090

5、配置告警规则

[root@bogon prometheus]# cat rules/all.yml 
groups:
    - name: 主机状态-监控告警
      rules:
      - alert: 主机状态
        expr: up == 0
        for: 1m
        labels:
          status: 非常严重
        annotations:
          summary: "{{$labels.instance}}:服务器宕机"
          description: "{{$labels.instance}}:服务器延时超过5分钟"
      
      - alert: CPU使用情况
        expr: 100-(avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) by(instance)* 100) > 60
        for: 1m
        labels:
          status: 一般告警
        annotations:
          summary: "{{$labels.mountpoint}} CPU使用率过高!"
          description: "{{$labels.mountpoint }} CPU使用大于60%(目前使用:{{$value}}%)"
  
      - alert: 内存使用
        expr: 100 -(node_memory_MemTotal_bytes -node_memory_MemFree_bytes+node_memory_Buffers_bytes+node_memory_Cached_bytes ) / node_memory_MemTotal_bytes * 100> 80
        for: 1m
        labels:
          status: 严重告警
        annotations:
          summary: "{{$labels.mountpoint}} 内存使用率过高!"
          description: "{{$labels.mountpoint }} 内存使用大于80%(目前使用:{{$value}}%)"
      - alert: IO性能
        expr: 100-(avg(irate(node_disk_io_time_seconds_total[1m])) by(instance)* 100) < 60
        for: 1m
        labels:
          status: 严重告警
        annotations:
          summary: "{{$labels.mountpoint}} 流入磁盘IO使用率过高!"
          description: "{{$labels.mountpoint }} 流入磁盘IO大于60%(目前使用:{{$value}})"
 
      - alert: 网络
        expr: ((sum(rate (node_network_receive_bytes_total{device!~'tap.*|veth.*|br.*|docker.*|virbr*|lo*'}[5m])) by (instance)) / 100) > 102400
        for: 1m
        labels:
          status: 严重告警
        annotations:
          summary: "{{$labels.mountpoint}} 流入网络带宽过高!"
          description: "{{$labels.mountpoint }}流入网络带宽持续2分钟高于100M. RX带宽使用率{{$value}}"
 
      - alert: 网络
        expr: ((sum(rate (node_network_transmit_bytes_total{device!~'tap.*|veth.*|br.*|docker.*|virbr*|lo*'}[5m])) by (instance)) / 100) > 102400
        for: 1m
        labels:
          status: 严重告警
        annotations:
          summary: "{{$labels.mountpoint}} 流出网络带宽过高!"
          description: "{{$labels.mountpoint }}流出网络带宽持续2分钟高于100M. RX带宽使用率{{$value}}"
      
      - alert: TCP会话
        expr: node_netstat_Tcp_CurrEstab > 1000
        for: 1m
        labels:
          status: 严重告警
        annotations:
          summary: "{{$labels.mountpoint}} TCP_ESTABLISHED过高!"
          description: "{{$labels.mountpoint }} TCP_ESTABLISHED大于1000%(目前使用:{{$value}}%)"
 
      - alert: 磁盘容量
        expr: 100-(node_filesystem_free_bytes{fstype=~"ext4|xfs"}/node_filesystem_size_bytes {fstype=~"ext4|xfs"}*100) > 70
        for: 1m
        labels:
          status: 严重告警
        annotations:
          summary: "{{$labels.mountpoint}} 磁盘分区使用率过高!"
          description: "{{$labels.mountpoint }} 磁盘分区使用大于80%(目前使用:{{$value}}%)"

四、安装alertmanager 告警插件

1、安装下载alertmanager

下载地址:
https://github.com/prometheus/alertmanager
解压之后文件结构:

[root@client local]# cd alertmanager/
[root@client alertmanager]# ll
总用量 49440
-rwxr-xr-x. 1 3434 3434 27610164 9月   3 23:02 alertmanager
-rw-r--r--. 1 root root      676 12月  6 10:52 alertmanager.yml
-rw-r--r--. 1 3434 3434      380 9月   3 23:37 alertmanager.yml.bak
-rw-r--r--. 1 root root     1359 12月  6 09:45 alertmanager.yml.youxiang
-rwxr-xr-x. 1 3434 3434 22935908 9月   3 23:02 amtool
drwxr-xr-x. 2 root root     4096 12月  6 17:36 data
-rw-r--r--. 1 3434 3434    11357 9月   3 23:37 LICENSE
-rw-------. 1 root root    37468 12月  6 17:20 nohup.out
-rw-r--r--. 1 3434 3434      457 9月   3 23:37 NOTICE

启动alertmanager

[root@client alertmanager]# nohup ./alertmanager &
[1] 22490
nohup: 忽略输入并把输出追加到"nohup.out"

查看进程

[root@client alertmanager]# ps -ef |grep alertmanager
root       3334      1  0 15:36 ?        00:00:08 ./alertmanager
root      22662  22093  0 17:45 pts/1    00:00:00 grep alertmanager

2、alertmanager配置文件

  • 邮箱报警配置文件
[root@client alertmanager]# cat alertmanager.yml
global:
  # resolve_timeout:解析超时时间
  resolve_timeout: 5m
  #     # smtp_smarthost: 使用email打开服务配置
  smtp_smarthost: 'smtp.163.com:465'
  # smtp_from:指定通知报警的邮箱
  smtp_from: 'xxx@163.com'
  # smtp_auth_username:邮箱用户名
  smtp_auth_username: 'xxx@163.com'
  # smtp_auth_password:授权密码
  smtp_auth_password: 'SHAbidaohaode123'
  # smtp_require_tls:是否启用tls
  smtp_require_tls: false
  # route标记:告警如何发送分配
route:
  # group_by:采用哪个标签作为分组的依据
  group_by: ['alertname']
  # group_wait:分组等待的时间
  group_wait: 10s
  # group_interval:上下两组发送告警的间隔时间
  group_interval: 10s
  # repeat_interval:重复发送告警时间。默认1h
  repeat_interval: 1m
  # receiver 定义谁来通知报警
  receiver: 'mail'
 
  # receiver标记:告警接受者 
receivers:
  # name:报警来源自定义名称
- name: 'mail'
  # email_configs:通过邮箱发送报警
  email_configs:
  # to:指定接收端email
    - to: 'xxx@163.com'
  • 企业微信报警
[root@client alertmanager]# cat alertmanager.yml.wechat 
global:
  resolve_timeout: 5m
  wechat_api_corp_id: 'wwf21db505fce2dde4'  
  wechat_api_url: 'https://qyapi.weixin.qq.com/cgi-bin/'
  wechat_api_secret: 'VmgazzYOKCeUe7JkdeKE_Je-PSIsZN85dHXaFQvFJME'
 
route:
  group_by: ['alertname']  #报警分组依据
  group_wait: 10s  #组等待时间
  group_interval: 10s  #发送前等待时间
  repeat_interval: 1h  #重复周期
  receiver: 'wechat'   #默认报警接受者
receivers:
- name: 'wechat'
  wechat_configs:
  - send_resolved: true
    to_party: '1'
    agent_id: '1000002'
    corp_id: 'xxxx'
    api_url: 'https://qyapi.weixin.qq.com/cgi-bin/'
    api_secret: 'xxxx-PSIsZN85dHXaFQvFJME'

然后在server端配置文件中填写alerting

[root@bogon prometheus]# vim prometheus.yml 
alerting:
  alertmanagers:
  - static_configs:
    - targets: ["172.16.5.25:9093"]

五、添加slave节点

在两台slave节点安装prometheus server端,用来分布式监控

1、启动prometheus

解压完成放到后台启动prometheus

[root@client node_exporter]# nohup ./prometheus &

启动之后查看进程已经启动

[root@bogon prometheus]# ps -ef |grep prometheus
root      68158   2755  1 17:44 pts/1    00:00:02 ./prometheus
root      68725   2755  0 17:48 pts/1    00:00:00 grep prometheus

2、添加文件自动发现

在prometheus目录下创建targets/nodes目录并创建nodes.json文件用来自动发现被监控节点

[root@bogon nodes]# pwd
/usr/local/prometheus/targets/nodes
[root@bogon nodes]# ll
总用量 4
-rw-r--r-- 1 root root 152 12月  9 17:44 nodes.json
#targetes 里面写的就是需要监控的机器,在prometheus配置文件直接调用这个文件就可以不用每次都手动改配置文件了
[root@bogon nodes]# cat nodes.json 
[{
  "targets": [
    "172.16.5.25:9100",
    "172.16.5.122:9100",
    "172.16.1.32:9100"
  ],
  "labels": {
    "server": "server=172.16.5.122"
  }
}]

3、slave端配置文件

[root@bogon prometheus]# cat prometheus.yml
# my global config
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 is set to the global default (10s).
  external_labels:
    slave: 1  # This is the 1nd slave. This prevents clashes between slaves.

# Alertmanager configuration
alerting:
  alertmanagers:
  - static_configs:
      - targets:
          - 172.16.5.25:9093

            # Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  - /usr/local/prometheus/rules/all.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-172.16.5.122'   #增加一个节点,取名为prometheus-172.16.5.122
    # Add usual service discovery here, such as static_configs
    metrics_path: "/metrics"   #获取数据的路径 http://slaveip:9100/metrics
    file_sd_configs:  #这个配置表示通过文件发现
    - files: 
      - targets/nodes/nodes.json # 读取目录下nodes.json文件
      refresh_interval: 1m  # 刷新频率,1 分钟

报警规则跟上面相同

地址规范:
我这里server端地址:
172.16.5.30
两个slave地址分别为
172.16.5.122
172.16.5.25
因为只开了3台虚拟机,所以两台slave 监控的节点是各自本身和对方的ip
172.16.5.122额外监控了172.16.1.32运维平台的机器

下面看图:
这是172.16.5.122 的某一个监控值
在这里插入图片描述
这是172.16.5.25的监控值
在这里插入图片描述
这是server端监控的值,可以看到server端可以收集到两台slave的所有监控信息

六、安装grafana图形显示工具

1、安装启动

下载地址:

wget https://dl.grafana.com/oss/release/grafana-6.5.1-1.x86_64.rpm
yum localinstall grafana-6.5.1-1.x86_64.rpm

启动grafana-server

[root@bogon prometheus]# service grafana-server start 

查看进程

[root@bogon prometheus]# ps -ef |grep grafana
grafana    5316      1  0 08:58 ?        00:00:05 /usr/sbin/grafana-server --pidfile=/var/run/grafana-server.pid --config=/etc/grafana/grafana.ini --packaging=rpm cfg:default.paths.provisioning=/etc/grafana/provisioning cfg:default.paths.data=/var/lib/grafana cfg:default.paths.logs=/var/log/grafana cfg:default.paths.plugins=/var/lib/grafana/plugins
root       7355   2750  0 09:16 pts/1    00:00:00 grep grafana

浏览器中访问ip:3000
在这里插入图片描述

2、添加数据源

在这里插入图片描述
在这里插入图片描述
URL地址是prometheus-server
在这里插入图片描述
填写完成之后添加Save&test,出现下图则添加成功
在这里插入图片描述

3、导入dashboard模板

在这里插入图片描述
常用的prometheus 模板有8919和1860,然后将Data Source 选择为刚才添加的Prometheus数据源
在这里插入图片描述
整体的监控图形显示
在这里插入图片描述