一、简介

Prometheus 是由 SoundCloud 开发的开源监控报警系统和时序列数据库。Prometheus 由两个部分组成,一个是监控报警系统,另一个是自带的时序数据库(TSDB)。

1.1 常用的监控软件

在 Prometheus 之前,市面已经出现了很多的监控系统,如 Zabbix、Open-Falcon、Nagios 等。

Zabbix

Zabbix 是开源的分布式监控系统,支持多种采集方式和采集客户端,同时支持 SNMP、IPMI、JMX、Telnet、SSH 等多种协议。Zabbix 核心组件主要是 Agent 和 Server。Zabbix Server 将收集的监控数据存储到 Zabbix Database 中。Zabbix Database 支持常用的关系型数据库,如 MySQL、PostgreSQL、Oracle 等(默认是 MySQL),并提供 Zabbix Web 页面(PHP 编写)数据查询。

Open-Falcon

Open-Falcon 是小米开源的企业级监控工具,用 Go 语言开发而成。这是一款灵活、可扩展并且高性能的监控方案,包括小米、滴滴、美团等在内的互联网公司都在使用它。它的主要组件包括:Falcon-agent、Hearthbeat server、Transfer、Graph、Judge 、Dashboard。

Prometheus

Prometheus 的基本原理是通过 HTTP 周期性抓取被监控组件的状态。任意组件只要提供对应的 HTTP 接口并且符合 Prometheus 定义的数据格式,就可以接入 Prometheus 监控。Prometheus Server 负责定时在目标上抓取 metrics(指标)数据并保存到本地存储。它采用了一种 Pull(拉)的方式获取数据,不仅降低客户端的复杂度,客户端只需要采集数据,无需了解服务端情况,也让服务端可以更加方便地水平扩展。

数据存储方面来看,Zabbix 采用关系数据库保存,这极大限制了 Zabbix 的采集性能;Nagios 和 Open-Falcon 都采用 RDD 数据存储,Open-Falcon 还加入了一致性 hash 算法分片数据,并且可以对接到 OpenTSDB;而 Prometheus 则自研了一套高性能的时序数据库,在 V3 版本可以达到每秒千万级别的数据存储,通过对接第三方时序数据库扩展历史数据的存储。

容器支持角度看,由于 Zabbix 出现得比较早,当时容器还没有诞生,对容器的支持自然比较差;Open-Falcon 虽然提供了容器的监控,但支持力度有限;Prometheus 的动态发现机制,不仅可以支持 Swarm 原生集群,还支持 Kubernetes 容器集群的监控,是目前容器监控最好解决方案;Zabbix 在传统监控系统中,尤其是在服务器相关监控方面,占据绝对优势;伴随着容器的发展,Prometheus 已开始成为主导及容器监控方面的标配,并且在未来可见的时间内将被广泛应用。

1.2 Prometheus简介

下图中左侧是各种数据源,主要是各种符合 Prometheus 数据格式的 exporter。除此之外,为了支持推送数据的 Agent,你可以通过 Pushgateway 组件,将 Push 转化为 Pull。Prometheus 甚至可以从其它的 Prometheus 获取数据。

上侧是服务发现。Prometheus 支持监控对象的自动发现机制,从而可以动态获取监控对象。虽然 Zabbix 和 Open-Falcon 也支持动态发现机制,但 Prometheus 的支持最完善。

中间是核心:通过 Retrieval 模块定时拉取数据,通过 TSDB 保存数据。PromQL 是 Prometheus 提供的查询语法,PromQL 通过解析语法树,查询 TSDB 获取监控数据。图片右侧是告警和页面展现,页面查看除了 Prometheus 自带的 WebUI,还可以通过 Grafana 等组件查询 Prometheus 监控数据。

Prometheus 指标格式分为两个部分:一是指标名称,另一个是指标标签。

格式如下:<metric name>{<label name>=<label value>, ...}

标签可体现指标的维度特征。例如,对于指标 http_request_total,可以有 {status="200", method="POST"} 和 {status="200", method="GET"} 这两个标签。在需要分别获取 GET 和 POST 返回 200 的请求时,可分别使用上述两种指标;在需要获取所有返回 200 的请求时,可以通过 http_request_total{status="200"} 完成数据的聚合,非常便捷和通用。

Prometheus 指标类型有四种:

Counter(计数器):计数统计,累计多长或者累计多少次等。它的特点是只增不减,譬如 HTTP 访问总量;

Gauge(仪表盘):数据是一个瞬时值,如果当前内存用量,它随着时间变化忽高忽低;

Histogram(直方图):服务端分位,不同区间内样本的个数,譬如班级成绩,低于 60 分的 9 个,低于 70 分的 10 个,低于 80 分的 50 个。

Summary(摘要):客户端分位,直接在客户端通过分位情况,还是用班级成绩举例:0.8 分位的是,80 分,0.9 分位的是 85 分,0.99 分位的是 98 分。

注意

关于 Gauge:如果需要了解某个时间段内请求的响应时间,通常做法是使用平均响应时间,但这样做无法体现数据的长尾效应。例如,一个 HTTP 服务器的正常响应时间是 30ms,但有很少几次请求耗时 3s,通过平均响应时间很难甄别长尾效应,所以 Prometheus 引入了 Histogram 和 Summary。

二、环境

2.1 节点信息

节点操作系统主机名称IP地址备注

prometheus&

grafana 服务器

CentOS 7.4prometheus192.168.13.243服务器主机
Linux nodeCentOS 7.4prometheus192.168.13.243Linux 节点
Windows NodeWindows 2012
192.168.111.58windows 节点
Windows NodeWindows 10
192.168.13.43windows 节点

2.2 软件版本

软件版本
系统内核3.10.0-1062.18.1.el7.x86_64
gogo1.13.6 linux/amd64
prometheusversion 2.17.0
node_exporterversion 1.0.0-rc.0
grafana-serverVersion 6.7.1
wmi_exporter0.10.2-amd64

2.3 软件源配置

参考Linux系统安装标准完成配置。

三、安装及配置

3.1 下载及安装

先下载对应版本的安装包。

tar -zxvf prometheus-2.17.0.linux-amd64.tar.gz -C /usr/local/
cd /usr/local/
mv prometheus-2.17.0.linux-amd64/ prometheus
./prometheus --version

3.2 配置文件

配置文件采用缩进方式控制,要确保配置内容符合缩进原则。

vim prometheus.yml


global:     #全局配置
  scrape_interval: 15s # 设置抓取(pull)时间间隔,默认1m
  evaluation_interval: 15s # 设置 rules 评估间隔时间,默认是1m

# 告警管理配置,暂未使用
alerting:
  alertmanagers:
  - static_configs:
    - targets:
      # - alertmanager:9093

# 加载 rules ,根据设置时间定期评估,默认配置
rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"

# 抓取(pull)监控目标配置
# 默认只有主机本身的监控配置
scrape_configs:
# 监控目标的label(这里的监控目标只是一个metric,而不是指某特定主机,可以在特定主机取多个监控目标),在抓取的每条时间序列表中都会添加此label
  - job_name: 'prometheus' #默认主机
    static_configs:
      - targets: ['localhost:9090']
        labels:
          instance: prometheus

  - job_name: 'Linux'  
    static_configs:
      - targets: ['192.168.13.243:9100']
        labels:
          instance: 192.168.13.243

  - job_name: 'Windows'
    static_configs:
      - targets: ['192.168.13.43:9182']
        labels:
          instance: 192.168.13.43

      - targets: ['192.168.111.58:9182']
        labels:
          instance: 192.168.111.58

3.3 设置用户

groupadd prometheus
useradd -g prometheus -s /sbin/nologin prometheus
chown -R prometheus:prometheus /usr/local/prometheus/
mkdir -p /var/lib/prometheus
chown -R prometheus:prometheus /var/lib/prometheus/

3.4 设置开机启动

vim /usr/lib/systemd/system/prometheus.service


[Unit]
Description=Prometheus
Documentation=https://prometheus.io/
After=network.target

[Service]
# Type设置为notify时,服务会不断重启
Type=simple
User=prometheus
# --storage.tsdb.path是可选项,默认数据目录在运行目录的./dada目录中
ExecStart=/usr/local/prometheus/prometheus --config.file=/usr/local/prometheus/p
rometheus.yml --storage.tsdb.path=/var/lib/prometheus --storage.tsdb.retention.t
ime=1y
Restart=on-failure

[Install]
WantedBy=multi-user.target


chown prometheus:prometheus /usr/lib/systemd/system/prometheus.service
systemctl enable prometheus
systemctl start prometheus

3.5 配置防火墙

防火墙详细的配置指令请参考“firewall-cmd日常操作”。

firewall-cmd --zone=public --add-port=9090/tcp --permanent
firewall-cmd --list-all

3.6 检查确认

查看服务状态

查看WEB页面 http://192.168.13.243:9090

四、安装 node_exporter

Node_exporter收集机器的系统数据,采用prometheus官方提供的exporter,除node_exporter外,官方还提供consul,memcached,haproxy,mysqld等exporter,具体可查看官网。

node_exporter 针对 Linux 相关平台。

注意

1、操作基于 Prometheus 主机,如果是其它的主机需要按前面的指令增加对应的用户和组

2、前面已经在 prometheus.yml 文件中增加了对应的节点配置


tar -zxvf node_exporter-1.0.0-rc.0.linux-amd64.tar.gz -C /usr/local/
mv node_exporter-1.0.0-rc.0.linux-amd64/ node_exporter
chown -R prometheus:prometheus ./node_exporter/
vim /usr/lib/systemd/system/node_exporter.service


[Unit]
Description=node_exporter
Documentation=https://prometheus.io/
After=network.target

[Service]
Type=simple
User=prometheus
ExecStart=/usr/local/node_exporter/node_exporter
Restart=on-failure

[Install]
WantedBy=multi-user.target


chown -R prometheus:prometheus /usr/lib/systemd/system/node_exporter.service
systemctl enable node_exporter
systemctl start node_exporter
firewall-cmd --zone=public --add-port=9100/tcp --permanent
firewall-cmd --reload

检查服务状态

检查 WEB 内容

五、安装 wmi_exporter

wmi_exporter 应用在 windows 平台。通过 WMI 实现 Windows 环境下各性能指标的采集。监控的指标覆盖 Windows 平台的各种服务,包括硬件、系统、IIS、MSSQL、服务、TCP 等。默认情况下没有启用 IIS 、MSSQL 和 TCP 的监控项。需要在安装时指定。详细的说明请参考官网:https://github.com/martinlindhe/wmi_exporter

msiexec /i wmi_exporter-0.10.2-amd64.msi ENABLED_COLLECTORS=os,service,cpu,cs,iis,logical_disk,mssql,net,system,tcp,textfile LISTEN_PORT=9182  
msiexec /x wmi_exporter-0.10.2-amd64.msi ENABLED_COLLECTORS=os,service,cpu,cs,iis,logical_disk,mssql,net,system,tcp,textfile LISTEN_PORT=9182

检查 WEB 内容

六、交换机监控

网络设备的监控通过 SNMP 的方式实现。需要注意的是 snmp_exporter 的配置文件需要自行编译生成(将目标设备的 SNMP oid 对应的定义信息整合到配置文件中)。下载地址:https://github.com/prometheus/snmp_exporter/releases 

目标是深信服网络设备,IP地址:10.3.2.1;SNMP community:sangfor,版本 V2。部署之前确认设备及信息正常。

6.1 配置 go 环境

GO项目编译时需要通过代理方式,否则提示 i/o 错误。

go env -w GO111MODULE=on
go env -w GOPROXY="https://goproxy.io,direct"
yum install net-snmp net-snmp-devel net-snmp-utils gcc gcc-c++ unzip make net-snmp-libs

6.2 安装 snmp_exporter

tar zxvf snmp_exporter-0.17.0.linux-amd64.tar.gz -C /usr/local/
mv snmp_exporter-0.17.0.linux-amd64/ snmp_exporter
go get github.com/prometheus/snmp_exporter/generator
cd ${GOPATH-$HOME/go}/src/github.com/prometheus/snmp_exporter/generator
go build
make mibs

1、编译的过程中会自动下载通用的 SNMP 定义文件到 mibs 文件夹,如果交换机设备比较特殊需要检查是否存在对应的 mibs 文件。

默认情况下 mibs 中没有包含 sangfor 设备的定义,在后续生成配置文件的过程中会提示找不到对应的定义。定义好的 mib 说明文件如下图所示:

2、编译完成后,修改当前目录下的generator.yml 文件,generator.yml文件的配置可以参考 https://github.com/prometheus/snmp_exporter/tree/master/generator#file-format ,generator.yml文件中只需要注入snmp的community。

3、成功后会生成 snmp.yml 文件,将生成的配置文件替换原来的文件即可。具体的内容如下所示(注意增加了 sangfor 的内容):

6.3 验证

/usr/local/snmp_exporter/snmp_exporter

启动后通过对应的端口访问确认

如果监控的交换机的认证community不一样,而我们不能在配置文件里在community后面加好几个认证码,可以通过将 if_mib 模块的所有配置再复制一遍,改一下模块的名字,如改成 if_mib2, 相应的改一下 version 和 community 即可。

6.4 添加 prometheus 配置

按前面的方法新建服务配置,同时将对外的端口添加到防火墙的策略中。具体情况如下图所示

确保服务启动正常后,按下面的格式修改配置文件并重启监控服务。

  - job_name: 'SNMP'
    static_configs:
      - targets:
        - 10.3.2.1
    metrics_path: /snmp
    params:
      module: [sangfor]
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: 192.168.13.243:9116


  • 无标签
写评论...