Prometheus Grafana

使用 prometheus 配合 grafana 监控 nas 主机和磁盘状态。

node_exporter 选择直接安装到物理机,其他使用 docker 部署。

介绍

Prometheus 是由前 Google 工程师从 2012 年开始在 Soundcloud 以开源软件的形式进行研发的系统监控和告警工具包,自此以后,许多公司和组织都采用了 Prometheus 作为监控告警工具。Prometheus 的开发者和用户社区非常活跃,它现在是一个独立的开源项目,可以独立于任何公司进行维护。为了证明这一点,Prometheus 于 2016 年 5 月加入 CNCF 基金会,成为继 Kubernetes 之后的第二个 CNCF 托管项目。

Prometheus 的主要优势有:

  • 由指标名称和和键/值对标签标识的时间序列数据组成的多维 数据模型
  • 强大的 查询语言 PromQL
  • 不依赖分布式存储;单个服务节点具有自治能力。
  • 时间序列数据是服务端通过 HTTP 协议主动拉取获得的。
  • 也可以通过中间网关来 推送时间序列数据
  • 可以通过静态配置文件或服务发现来获取监控目标。
  • 支持多种类型的图表和仪表盘。

Prometheus 生态系统由多个组件组成,其中有许多组件是可选的:

  • Prometheus Server 作为服务端,用来存储时间序列数据。
  • 客户端库 用来检测应用程序代码。
  • 用于支持临时任务的 推送网关
  • Exporter 用来监控 HAProxy,StatsD,Graphite 等特殊的监控目标,并向 Prometheus 提供标准格式的监控样本数据。
  • alartmanager 用来处理告警。
  • 其他各种周边工具。

其中大多数组件都是用 Go 编写的,因此很容易构建和部署为静态二进制文件。

安装 exporter

本文只安装 node_exporter 和硬盘信息采集脚本。

官方的各种 exporter 下载地址:https://prometheus.io/download/

node_exporter 下载地址:https://prometheus.io/download/#node_exporter

官方给出的是的二进制类型的可执行程序。下载下来并解压缩并移动二进制文件到自己定义的位置。

因为是二进制文件使用也是很简单,只需要给二进制文件配置可执行权限即可。

为了方便我们来修改下默认的端口,并指定自定义采集数据文件的位置:

sudo ./node_exporter --web.listen-address=:49100 --collector.textfile.directory=/your/path/textfile_collector
  • --web.listen-address:自定义端口,prometheus 服务端通过该端口访问 exporter 获取采集到的信息。
  • --collector.textfile.directory:自定义采集数据位置,采集文件内的数据格式必须是 prometheus 规定的格式。
  • 执行 node_exporter 必须使用 root 权限进行。否则个别信息无法采集。

为了方便启动和管理 node_exporter 我们把它设置为 service,使其能被 systemctl 管理。

创建文件并写入下列配置:sudo vi /etc/systemd/system/node_exporter.service

[Unit]
Description=node_exporter service

[Service]
User=root
ExecStart=/your/path/promethues/node_exporter/node_exporter --web.listen-address=:49100 --collector.textfile.directory=/your/path/textfile_collector

TimeoutStopSec=10
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

创建完成后启动,并且设置为开机自动启动。

sudo systemctl start node_exporter.service
sudo systemctl enable node_exporter.service

可以尝试使用浏览器访问,会得到很多字符串形式的数据。

安装 prometheus

prometheus 本文采用 docker 进行安装

  • 首先准备好配置文件: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).

# 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"

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    #static_configs:
    #  - targets: ["localhost:9090"]

    # node_exporter
  - job_name: 'node'
    static_configs:
    - targets: ['192.168.4.254:49100']

注意我们需要修改 scrape_configs下的配置信息,如果需要监控多台主机的话,这里复制粘贴job_name这个配置,修改下面的targets内部的信息。

如果是监控多个集群的话,job_name就是表示一个集群,相应的targets里面写的就是集群内所有主机的地址信息,注意job_name不可以重复。

官方文档:scrape_config

  • 其次我们需要准备一个目录存放数据,prometheus 的配置数据和采集数据。
  • prometheus 默存只存储 15 天的数据。 官方文档:operational-aspects

以下是本文使用 docker 命令:

docker run -d --name prometheus\
    -p 49090:9090 \
    -v /your/path/promethues/config:/etc/prometheus \
    -v /your/path/promethues/data:/data/prometheus \
    --restart unless-stopped \
    prom/prometheus \
    --config.file="/etc/prometheus/prometheus.yml" \
    --storage.tsdb.path="/data/prometheus" \
    --web.listen-address="0.0.0.0:9090"

注意修改命令中的参数。

采集硬盘 SMART 信息

这里采用大佬写好的脚本进行采集,大佬的仓库地址:https://github.com/micha37-martins/S.M.A.R.T-disk-monitoring-for-Prometheus

此仓库 README 中还推荐了两个配套使用的 grafana 面板配置。

  • 安装 smartctl 命令,本文是 ubuntu 22.04 其他操作系统请自行搜索安装
sudo apt install smartmontools
  • 下载仓库中的采集数据脚本: smartmon.sh ,该脚本必须使用 root 权限运行。
  • 设置 root 用户的计划任务,执行命令:sudo crontab -u root -e,添加以下计划任务
    • 注意此步需要上面安装 node_exporter 时指定的 --collector.textfile.directory 位置
    • 简单来讲就是运行脚本,把结果存储到 --collector.textfile.directory 指定的位置中。
*/5 * * * * /your/path/smartmon.sh > /your/path/promethues/node_exporter/textfile_collector/smart_metrics.prom
  • 采集的间隔时间,修改计划任务的时间即可,上述示例为:每五分钟采集一次。

安装 grafana

grafana 用来展示 prometheus 中存储的采集数据。

采用 docker 部署。

  • 首先我们需要 run 一个 grafana 容器,把配置文件搞出来,方便以后修改。
# 随便运行一下
docker run -d --name grafana grafana/grafana

# 拷贝配置文件
docker cp grafana:/etc/grafana/grafana.ini ./

# 清理刚刚创建的容器
docker stop grafana && docker rm grafana
  • 配置文件不用修改,本文使用默认的配置文件。
  • 准备一个存储数据的目录。
  • grafana 默认使用的端口是 3000。

以下是本文使用 docker 命令:

docker run -d --name grafana \
    -p 49200:3000 \
    -v "/your/path/grafana/grafana.ini:/etc/grafana/grafana.ini" \
    -v "/your/path/grafana/data:/var/lib/grafana" \
    --restart unless-stopped \
    grafana/grafana
  • 默认的用户名和密码均为:admin 第一次登录过后会提示修改密码。

  • grafana 面板配置分享网站:https://grafana.com/grafana/dashboards/

    • 这里推荐几个面板ID:18608919
    • smart 硬盘信息展示面板:10530
  • 面板配置使用:

    • 设置数据源:左侧菜单ConfigurationData sourcesAdd data source。添加即可
    • 如果是配置 prometheus 数据源,默认没有认证,写完地址之后直接保存即可。
    • 使用现成的面板:左侧菜单Dashboards+ Import。根据提示填入面板 ID 或者面板的 JSON 配置数据。点击load
    • 根据提示,选择数据源,确认面板名称,点击import 即可导入。
    • 导入后在左侧菜单DashboardsBrowse中即可看见。点击即可进入面板
    • 其他面板操作,创建。请自行搜索学习。