prometheus监控系统怎么搭建 (prometheusgrafana监控系统)

大家好,我是小斐,今天分享的这篇文章主要是看到阿里云在3月14日分享的一篇文章,文章链接如下:统一观测丨使用 Prometheus 监控 SNMP,我们该关注哪些指标?,阿里云太没有诚意,故自己分享一篇有诚意的文章,方便IT运维和网络领域的同行,推进Prometheus在SNMP领域的监控和报警实践。

SNMP通识

SNMP是什么:一种通用网络管理(监控)协议,用于管理和监视TCP/IP协议网络中的网络连接设备,如交换机、路由器、防火墙、服务器等等。

日常运维接触比较多的设备如:服务器管理口(戴尔iDrac SNMP)、交换机SNMP、路由器SNMP等等,其实日常运维接触的设备绝大部分都支持SNMP。

目前版本:SNMP v1、SNMP v2c、SNMP v3,主流使用v2c,如果有很高安全要求使用v3,不建议使用v1。

SNMP系统包括网络管理系统NMS(Network Management System)、代理进程Agent、被管对象Management object和管理信息库MIB(Management Information Base)四部分组成。

prometheusgrafana监控安装,prometheusgrafana告警部署流程

SNMP模型

以交换机为例说明SNMP模型构成:

  • NMS:一般指支持下发和收集SNMP OID的集成软件,在Prometheus中相当于snmp-exporter
  • Device:被管理或监控的对象,这里指交换机
  • Agent:被管理或监控的对象中的代理进程,这里指交换机启用snmp agent进程
  • MIB:可以理解为被管理或监控对象可以提供的信息,一般都是以txt或mib为后缀的文件的形式存在,这里一般都是各设备官方提供,有公有和私有之分
  • Managed Object:一般是指管理对象或设备本身或者某个设备上的某个部件

OID说明:

Object ID,对象标识符,用于定位一个数据项。OID是一串数字,比如1.3.6.1.2.1.1表示system,数字是树形结构,左侧为根,右侧为叶,前面一截是由IANA分配的厂商标识符,后面就是各个厂商自定的,所以不同厂商设备的OID树差别很大。OID树结构参见下图。

prometheusgrafana监控安装,prometheusgrafana告警部署流程

OID树结构

Module:

SNMP可以监控的设备和厂商多种多样,故SNMP为了区别和分层级,根据不同的功能划分了很多module,比如网络设备的接口信息模块:if_mib。

数据采集

Prometheus是什么,PromQL如何写?在此就不说明,该篇主要说明如何部署和数据采集。

数据采集对象:

对象类型

具体对象

采集器

网络协议

HTTP、HTTPS、DNS、TCP、ICMP 和 gRPC等

blackbox_exporter

网络设备

路由器、交换机等

snmp_exporter

主机节点

虚拟主机、物理主机等

node_exporter

应用

延迟、错误、QPS、内部状态等

Prometheus Client

中间件

资源用量、服务状态等

Prometheus Client

容器

资源用量、状态等

cAdvisor

编排工具

集群资源用量、调度等

Kubernetes Components

接下来我将围绕snmp_exporter部署采集交换机为例子,结合snmp_exporter如何使用以及Prometheus和Grafana的部署,搭建一套小型的采集网络设备相关的IT监控平台。

部署搭建

环境:

角色

系统版本

作用

服务端

CentOS 7.9 64位

部署Prometheus

采集端

CentOS 7.9 64位

部署snmp_exporter

设备端

华为S5720-36C-EI-AC

启用snmp agent

Tips:Ubuntu 18.04下默认的内核(5.4.xxx) 容易导致snmp_exporter运行一段时间假死,避免使用该内核,提的issue目前看还没有解决。

下面演示 Prometheus+Grafana搭建在同一台服务器上,本地存储,不启用远端存储,采集端搭建在单独服务器上,共两台,至于生产环境需要部署高可用或者多联邦集群自行摸索哦。 部署架构如下:

prometheusgrafana监控安装,prometheusgrafana告警部署流程

部署架构

服务端部署

采用二进制包安装和部署:服务端IP-172.17.40.51

# 新建程序运行文件夹
mkdir -p /opt/prometheus
cd /opt/prometheus
mkdir conf data deploy logs rules targets

# 系统初始化
yum update
# 更换源
minorver=6.10
sudo sed -e "s|^mirrorlist=|#mirrorlist=|g" \
         -e "s|^#baseurl=http://mirror.centos.org/centos/\$releasever|baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos-vault/$minorver|g" \
         -i.bak \
         /etc/yum.repos.d/CentOS-*.repo

yum makecache
# 时间和时区
yum install ntpdate
# 设置时区
timedatectl set-timezone Asia/Shanghai
ntpdate ntp.aliyun.com
# 查看时间
date

安装部署Prometheus:

# *载下**prometheus的二进制运行文件包
wget -c -P /opt/prometheus/deploy https://github.com/prometheus/prometheus/releases/download/v2.37.6/prometheus-2.37.6.linux-amd64.tar.gz
# 解压包
tar -zxvf prometheus-2.37.6.linux-amd64.tar.gz
# 设置软链接
ln -s /opt/prometheus/deploy/prometheus-2.37.6.linux-amd64/ /opt/prometheus/current

设置系统服务:

# 设置为系统服务
vim /usr/lib/systemd/system/prometheus.service
# 服务文件信息
[Unit]
Description=Prometheus Server
Wants=network-online.target
After=network.target
[Service]
Type=simple
User=root
ExecStart=/opt/prometheus/current/prometheus --config.file=/opt/prometheus/conf/prometheus.yml --web.listen-address=:9090 --storage.tsdb.path=/opt/prometheus/data/  --storage.tsdb.retention=90d --web.enable-lifecycle --web.enable-admin-api
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
[Install]
WantedBy=multi-user.target

上面参数说明:

# prometheus启动配置文件 核心
--config.file=/opt/prometheus/conf/prometheus.yml
# TSDB数据库文件保存路径
--storage.tsdb.path=/opt/prometheus/data/
# TSDB数据保存周期90天
--storage.tsdb.retention=90d
# 开启配置文件热加载 指配置文件改动,不需要重启,直接调用API热加载即可
--web.enable-lifecle
# 开启API服务
--web.enable-admin-api

Prometheus配置文件编写,配置文件需要放到/opt/prometheus/conf/目录下,命名为: prometheus.yml ,并启动Prometheus服务:

# 全局配置文件
global:
  scrape_interval: 15s # 设置数据采集间隔每次15s,默认1分钟
  evaluation_interval: 15s # 评估规则每次15s,默认1分钟,该设置是针对告警规则rule_files
  scrape_timeout: 10s # 采集超时,默认10s
  external_labels:
    monitor: "it-monitor"

# 告警插件配置
alerting:
  alertmanagers:
    - static_configs:
        - targets:
          # - 172.17.40.51:9093

# 按照设定参数进行扫描加载,用于自定义报警规则,其报警媒介和route路由由alertmanager插件实现
rule_files:
  # - "/opt/prometheus/rules/*.yml"
  # - "second_rules.yml"

# 设定采集对象,这里既有静态设置也有设置服务发现(服务发现用于后续target更改只需要进行规则修改即可,不需要进行prometheus守护进程重启)
scrape_configs:
  - job_name: "prometheus"
    metrics_path: /metrics
    scheme: http
    static_configs:
      - targets: ["172.17.40.51:9090"]
    relabel_configs:
      - source_labels: [ '__address__' ]
        target_label:  'instance'
        regex: "(.*):(.*)"
        replacement: $1

启动Prometheus服务:

systemctl deamon-reload
# 启动Prometheus
systemctl start prometheus
# 停止Prometheus
systemctl stop prometheus
# 重启Prometheus
systemctl restart prometheus

到此完成Prometheus的搭建和配置,接下来搭建snmp_exporter,并编写yml文件采集交换机数据。

采集器部署

采集端 IP-172.17.40.54,使用源码编译部署

# 系统初始化,时区时间,镜像源 看Prometheus部署案例

# 系统依赖*载下**
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
yum install https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm
sudo cp /etc/yum.repos.d/elrepo.repo /etc/yum.repos.d/elrepo.repo.bak
# 然后编辑 /etc/yum.repos.d/elrepo.repo 文件,在 mirrorlist= 开头的行前面加 # 注释掉;并将 http://elrepo.org/linux 替换为
https://mirrors.tuna.tsinghua.edu.cn/elrepo
sudo yum makecache
# *载下**依赖软件
yum install -y wget tree net-snmp net-snmp-utils net-snmp-libs net-snmp-devel golang p7zip*

*载下**snmp_exporter源码包并编译:

# 测试机器获取OID信息
snmpwalk -v 2c -c 123456 172.18.48.5 1.3.6.1.4.1.2011.5.25.19.1.1.1

# git *载下**snmp_exporter 如系统没有git,直接yum安装
cd /opt
git clone https://github.com/prometheus/snmp_exporter.git

# 设置go国内代理
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct

# go编译生成snmp_exporter
tar -zxvf snmp_exporter.git
go build
ls -al | grep snmp_exporter

# 查看目录树
tree

# 至此,可以看到snmp_exporter路径下有一个generator的目录,该目录下在编译前是没有generator文件和mibs文件夹的,编译,生成mibs文件夹后
cd opt/snmp_exporter/generator/
go build
make mibs
ls -al

# 可以看到/opt/snmp_exporter/generator目录下多了一个generator文件和mibs文件夹,然后我们可以去华为官网,把需要的对应版本交换机的mib文件全部*载下**下来,然后放到mibs文件夹里
export MIBDIRS=/opt/snmp_exporter/generator/mibs:/opt/snmp_exporter/generator/mibs/MIB-V200R019C10SPC500/MIBs:/opt/snmp_exporter/generator/mibs/MIB-V200R021C00SPC100/MIBs

# 生成snmp.yml文件,前提是需要编辑generator.yml文件,然后使用generator生成器根据generator.yml文件生成snmp.yml配置文件
./generator generate

上面通过go源码编译生成snmp_exporter二进制可执行文件,在目录/opt/snmp_exporter/snmp_exporter

prometheusgrafana监控安装,prometheusgrafana告警部署流程

目录信息

同时需要snmp.yml的配置文件生成器generator来生成我们需要的配置信息。

故还需要在目录/opt/snmp_exporter/generator/执行./generator generate生产snmp.yml配置文件,但是生成snmp.yml配置文件需要编辑generator.yml配置文件,在这个文件中自定义我们需要的监控参数和数据,主要是SNMP的OID信息。

比如常见的交换机接口OID信息:

prometheusgrafana监控安装,prometheusgrafana告警部署流程

常见OID信息

generator.yml配置文件结构说明:

modules:
  HUAWEI:
    walk:
      - 1.3.6.1.2.1.2.2.1.1                 #ifIndex - 接口索引
      - 1.3.6.1.2.1.2.2.1.2                 #IfDescr - 描述接口的字符串
      - 1.3.6.1.2.1.2.2.1.3                 #ifType - 接口类型
      ......
    max_repetitions: 25
    retries: 3
    timeout: 5s
    version: 2
    auth:
      community: xxxxxx

    lookups:
      - source_indexes: [ifIndex]
        lookup: ifAlias
        #drop_source_indexes: false

    overrides:
      ifAlias:
        ignore: true # 查找的指标在snmp_exporter输出控制台直接删除该指标
        #regex_extracts:  # 根据正则表达式和指标值创建新指标
        #   Temp: 
        #     - regex: '(.*)' # 正则表达式从返回的 SNMP walks 值中提取一个值
        #       value: '$1' # 结果将被解析为 float64,默认为 $1
        #   Status:
        #     - regex: '.*Example'
        #       value: '1' # 正则表达式匹配且值解析的第一个条目获胜
        #     - regex: '.*'
        #       value: '0'
        #type: DisplayString

HUAWEI是我自定义的模块名称,walk下, 找到需要监控对象对应的OID写入即可,version是指交换机SNMP使用的版本是v2c,auth下的community是指交换机上启用snmp agent设置的字符串。lookups和overrides相关参数,第二篇展开说明。

目前已完成华为交换机、深信服AD、AF、AC、戴尔iDrac等SNMP配置文件,需要generator.yml配置文件的可以关注采集,后续打算开源出来。

# 把配置好的generator.yml文件上传到/opt/snmp_exporter/generator
# 相关交换机或者设备的mib文件需要先*载下**放到mibs目录中(可自定义目录)
# 进入目录生成snmp.yml配置文件,并移动到snmp_exporter目录中
cd /opt/snmp_exporter/generator
./generator generate
mv snmp.yml ../

注册snmp_exporter系统服务管理:

# vim /usr/lib/systemd/system/snmp_exporter.service
# 系统服务信息
[Unit]
Description=snmp_exporter
After=network.target

[Service]
ExecStart=/root/snmp_exporter/snmp_exporter --config.file=/root/snmp_exporter/snmp.yml
Restart=on-failure

[Install]
WantedBy=multi-user.target

启动:

# 启动服务
systemctl deamon-reload
systemctl start snmp_exporter.service
systemctl stop snmp_exporter.service
systemctl restart snmp_exporter.service

如我生成的snmp.yml文件数据展示:浏览器打开snmp_exporter服务,查看采集的数据情况,日常数据采集调试,需要经常用到,默认端口是9116:

prometheusgrafana监控安装,prometheusgrafana告警部署流程

示例

Target是指设备对象的IP地址,Module是指generator.yml配置文件中自定义的模块名称,其中Target需要开启snmp agent服务,这里是华为交换机开启命令:

snmp-agent
snmp-agent community read cipher xxx
snmp-agent sys-info version v2c v3
#########trap是否需要开启,看个人需求
# snmp-agent target-host trap address udp-domain 192.168.1.200 params securityname cipher xxx
# snmp-agent trap enable 
#########
snmp-agent protocol source-status all-interface
snmp-agent packet contextengineid-check enable
undo snmp-agent protocol source-status ipv6 all-interface

当我提交,snmp_exporter就会获取交换机信息,至于是啥信息,就是你在generator.yml配置文件中填写的OID信息(也可以是对象名称),如下图所示(部分)。

prometheusgrafana监控安装,prometheusgrafana告警部署流程

采集信息

至此就完成了snmp_exporter的搭建和采集交换机的数据了。

联动

完成基础的搭建工作和数据采集工作,那么就需要进行数据收集到Prometheus并持久化以及数据的展示,可以看上面画的架构图,完成Prometheus targets搭建和Prometheus Server的搭建,但还没有完成pull metrics和PromQL的动作,以及Gafana的搭建配置工作。

如何pull metrics呢,关于snmp_exporter的pull metrics,可以修改prometheus.yml的配置文件:在Prometheus部署中可看原始配置,在原始配置的 scrape_configs: 下添加一个job,如下所示:

# 采集交换机信息
  - job_name: "SNMP"
    scrape_interval: 30s  # 针对SNMP采集节点 覆盖全局配置15s
    scrape_timeout: 20s
    file_sd_configs:
      - files:
        - /opt/prometheus/targets/network-*.yml
        refresh_interval: 2m
    metrics_path: /snmp
    relabel_configs:
    - source_labels: ["__address__"]
      target_label: __param_target
    - source_labels: ["__param_target"]
      target_label: instance
    # prometheus采集目标直接修改为snmp_exporter 服务IP地址
    - target_label: __address__
      replacement: 172.17.40.54:9116 # snmp_exporter 服务IP地址
    - source_labels: ["mib"] # 从自定义的目标标签获取MIB模块名称
      target_label: __param_module

上文中启动文件服务发现,在目录/opt/prometheus/targets/新建目录yml文件,示例如下:新建network-switch.yml

- labels:
    mib: HUAWEI
    brand: Huawei
    hostname: HZ-XS-AG
    model: S5720-36C-EI-AC
  targets:
    - 172.18.48.2
- labels:
    mib: HUAWEI
    brand: Huawei
    hostname: HZ-XS-Access
    model: S5720S-52P-LI-AC
  targets:
    - 172.18.48.5
- labels:
    mib: HUAWEI
    brand: Huawei
    hostname: HZ-XS-POE
    model: S5720S-28P-PWR-LI-AC
  targets:
    - 172.18.48.6

其他标签可以忽略,也可以自己添加自定义标签,mib(我自定义的)需要加上,targets必须填写被管理或监控的设备IP。

# 重启prometheus
systemctl restart prometheus
# 或在Prometheus服务器上热加载配置文件
curl -X POST localhost:9090/-/reload

打开Prometheus Web UI,就可以看到数据,到此就完成pull metrics动作,如下图所示: 打开 172.17.40.51:9090

prometheusgrafana监控安装,prometheusgrafana告警部署流程

首页

prometheusgrafana监控安装,prometheusgrafana告警部署流程

target

可看到配置文件中对应的targets都是UP状态,并点击对应数据url也是正常返回我定义的数据。

Grafana的搭建和配置:在172.17.40.51上搭建,端口号默认3000

# grafana搭建 CentOS
wget https://dl.grafana.com/enterprise/release/grafana-enterprise-9.4.3-1.x86_64.rpm
sudo yum install grafana-enterprise-9.4.3-1.x86_64.rpm

# 官方文档
https://grafana.com/grafana/download?pg=get&plcmt=selfmanaged-box1-cta1

打开Grafana,配置数据源为Prometheus,并编写数据展示模版,过于简单就不做介绍,主要是模版和编写查询PromQL,我这边已完成华为交换机,华为无线AC/AP,深信服AD、AF、AC和戴尔iDrac的模版,Linux主机节点是利用了StarsL.cn分享的ID为:16098 模版,然后自己自定义了一部分;Windows服务器节点也是利用StarsL.cn分享的ID为:10467 模版。后续完全完善测试后,计划分享到官方网站,欢迎各位参与测试, 需要模版和generator.yml文件的直接关注私信

prometheusgrafana监控安装,prometheusgrafana告警部署流程

AD模版

prometheusgrafana监控安装,prometheusgrafana告警部署流程

无线模版

prometheusgrafana监控安装,prometheusgrafana告警部署流程

Linux主机模版

总结

到此就完成了简单的SNMP的监控,关于文中很多细节,后续文章分享;比如Prometheus基本参数的说明,snmp_exporter采集自数据,数据出现乱码怎么处理,数据格式如何转换,generator.yml配置如何编写,如何打造适合自己自定义的配置文件。

目前只是说明服务搭建配置和数据采集,万里长征踏出第一步,后续接入报警,报警规则如何编写,报警媒介方式(邮箱、钉钉、飞书),如何编写PromQL实现精美的大屏面板,以及远端存储和其他类型数据采集。

知乎专栏更多精彩:网络小斐

微信公号:网络小斐