本文最后更新于 2024-07-17,

若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益, 请联系我 删除。

本站只有Telegram群组为唯一交流群组, 点击加入

文章内容有误?申请成为本站文章修订者或作者? 向站长提出申请

1714075567818.webp

前言

Prometheus普罗米修斯,是一个开源的监控解决方案。而Grafana则是一个开源的跨平台的度量分析、可视化工具。两者组合使用即可快速搭建出一个漂亮的监控系统

由于我业务需求需要监控一万多台vps,之前使用探针或者zabbix。要么是性能不足造成卡顿,要么是配置繁琐。观察不直观。所以这次使用Prometheus+Grafana的方案进行监控。

普罗米修斯中文文档:https://prometheus.fuckcloudnative.io/

项目地址:https://github.com/prometheus/prometheus

node_exporter:https://github.com/prometheus/node_exporter

blackbox_exporter:https://github.com/prometheus/blackbox_exporter

推荐的一键脚本(自动安装配置所有组件)

bash <(curl -Ls https://raw.githubusercontent.com/Sm1rkBoy/monitor_config/main/install.sh)

安装Docker🐳

配置Prometheus普罗米修斯

通过下述命令拉取Prometheus镜像

# 拉取镜像
docker pull prom/prometheus

可通过下述链接下载prometheus的配置文件,并将其存放在 root/Prometheus/Config路径下

https://github.com/prometheus/prometheus/blob/master/documentation/examples/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"]

然后,启动一个该镜像的容器

# 启动容器
docker run --name Prometheus \
-d -p 9090:9090 \
-v /root/Prometheus/Config/prometheus.yml:/etc/prometheus/prometheus.yml \
prom/prometheus

现在访问其Web管理页面( http://localhost:9090 ),即可看到Prometheus服务被正确启动了

1714075782488.webp

事实上,对于Prometheus服务而言,其是负责收集、存储、查看监控数据。而真正直接进行监控则是通过Exporter完成的。可以看到,Exporter相当于是Prometheus服务的客户端,负责向其提供监控数据。具体地,针对不同的被监控目标,我们需要使用不同的Exporter。这里,我们期望能够监控本机的运行状态(CPU、内存、磁盘等参数)。故这里我们需要下载一个Node Exporter用来采集主机(MacBook Pro)的监控数据。由于这里我们需要监控的是主机,所以一般不推荐使用Docker来部署Node Exporter

# 下载 node exporter(MacOS 64bit)
wget https://github.com/prometheus/node_exporter/releases/download/v1.0.1/node_exporter-1.0.1.darwin-amd64.tar.gz

# 解压
tar xvfz node_exporter-1.0.1.darwin-amd64.tar.gz

# 启动 Node Exporter
cd node_exporter-1.0.1.darwin-amd64
./node_exporter

至此我们的Node Exporter就已经启动成功了,且运行在9100端口

1714075795902.webp故通过 http://localhost:9100/metrics 即可直接访问看到其采集的监控数据1714075805083.webp

现在只需在Prometheus服务的配置文件prometheus.yml中添加相应的配置,即可收集Node Exporter的监控数据。具体地,我们在scrape_configs下添加一个新的名为MacBook Pro的job即可。这里本机IP为192.168.0.108

...
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']

  # 收集主机的监控数据  
  - job_name: 'MacBook Pro'
    static_configs:
    - targets: ['192.168.0.108:9100']

重启prometheus服务后进入其Web管理页面( http://localhost:9090 ),输入up后点击Execute按钮后,即可看到一个我们刚刚添加的job。其中,1表示正常,0表示异常1714075823902.webp

配置Grafana

事实上,Prometheus中也提供了一个可视化方案——Prometheus UI,但其功能较为简单、无法实时关注相关监控指标的变化趋势,故这里我们选择Grafana作为可视化的解决方案。其作为一个通用的可视化工具,自然也支持Prometheus。这里我们直接拉取镜像并启动一个Grafana的容器

# 拉取镜像
docker pull grafana/grafana

# 启动容器
docker run --name myGrafana \
-d -p 3000:3000 \
grafana/grafana

然后通过 http://localhost:3000 可访问Grafana的Web页面,账号、缺省密码均为admin。首先,我们需要添加一个Prometheus类型的数据源,依次选择Configuration → Data Sources → Add data source

1714075839242.webp选择Time series databases时序数据库中的Prometheus即可

1714075849839.webp依次填写数据源名称、URL地址,最后保存即可

1714075858621.webp在Grafana中我们可以自定义各种监控所需的仪表盘,但是如果完全自己搭建较为麻烦。为此我们可在现有模板的基础上根据需要进行微调。进入Grafana官网( https://grafana.com )选择仪表盘1714075870528.webp

过滤出适用Node Exporter类型的相关模板,这里我们选择支持中文的模板

1714075878749.webp然后复制该模板的ID——8919即可1714075886039.webp

现在回到Grafana的Web管理页面,导入我们所需的模板

1714075892715.webp选择数据源,继续导入

1714075899850.webp至此,一个仪表盘就创建完成了,效果如下所示1714075913888.webp

监控MySQL

如果需要利用Prometheus来监控MySQL同样也很方便,只需选择相应的Exporter即可。具体地,选择MySQLD Exporter来采集MySQL的监控数据。命令如下,其中通过DATA_SOURCE_NAME环境变量设置MySQL服务的账号、密码、URL信息

# 拉取镜像
docker pull prom/mysqld-exporter

# 启动容器
docker run -d --name mysqldExporter \
-p 9104:9104 \
-e DATA_SOURCE_NAME="root:123456@(192.168.0.108:3306)/"  \
prom/mysqld-exporter

通过 http://localhost:9104/metrics 即可查看MySQLD Exporter采集的MySQL监控数据1714075925157.webp

类似地,我们可以在Prometheus服务的配置文件prometheus.yml中添加相应的配置,用于收集MySQLD Exporter的监控数据

...
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']

  # 收集主机的监控数据  
  - job_name: 'MacBook Pro'
    static_configs:
    - targets: ['192.168.0.108:9100']

  # 收集MySQL的监控数据  
  - job_name: 'MySQL'
    static_configs:
    - targets: ['192.168.0.108:9104']

重启Prometheus服务后,即可看到该job已经生效

1714075938251.webp类似地对于可视化配置而言,在Grafana官网选择适用于监控MySQL的模板(过滤条件:name/description=mysql and data source=Prometheus),复制其ID——12826

1714075946308.webp导入后,效果如下所示

1714075953358.webp

容器监控cAdvisor

现如今Docker部署已经愈来愈流行,为了更好监控Dcoker整体的运行情况。Google开源的一款用于分析、展示容器运行状态的可视化工具——cAdvisor。这里我们依然选择Docker来部署实践

# 拉取镜像
docker pull google/cadvisor

# 启动容器
docker run --name=mycAdvisor \
  -p 8080:8080 -d \
  -v /:/rootfs:ro \
  -v /var/run:/var/run:ro \
  -v /sys:/sys:ro \
  -v /var/lib/docker/:/var/lib/docker:ro \
  -v /dev/disk/:/dev/disk:ro \
  --privileged \
  --device=/dev/kmsg \
  google/cadvisor

具体地,我们可通过 http://localhost:8080 来访问其监控页面,查看Dcoker中整体及各容器的监控指标。值得一提的是,cAdvisor原生支持Prometheu,通过 http://localhost:8080/metrics 即可看到其采集的监控数据

1714075967797.webp

故在prometheus.yml配置文件继续添加一个名为cAdvisor的job,并重启Prometheus服务

...
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']

  # 收集主机的监控数据  
  - job_name: 'MacBook Pro'
    static_configs:
    - targets: ['192.168.0.108:9100']

  # 收集MySQL的监控数据  
  - job_name: 'MySQL'
    static_configs:
    - targets: ['192.168.0.108:9104']

  # 收集Docker容器的监控数据
  - job_name: 'cAdvisor'
    static_configs:
    - targets: ['192.168.0.108:8080']

类似地对于可视化配置而言,在Grafana官网选择适用于cAdvisor的模板(过滤条件:name/description=cAdvisor and data source=Prometheus),复制其ID——893。导入后,效果如下所示1714075979926.webp

相关插件:

blackbox_exporter

黑盒导出器允许通过 HTTP、HTTPS、DNS、TCP、ICMP 和 gRPC 对端点进行黑盒探测。

Using the docker image

Note: You may want to enable ipv6 in your docker configuration

docker run --rm \
  -p 9115/tcp \
  --name blackbox_exporter \
  -v $(pwd):/config \
  quay.io/prometheus/blackbox-exporter:latest --config.file=/config/blackbox.yml

检查结果

访问http://localhost:9115/probe?target=google.com&module=http_2xx 将返回针对 google.com 的 HTTP 探测的指标。该 probe_success 指标指示探测是否成功。添加 debug=true参数将返回该探测器的调试信息。

有关导出器本身操作的指标可在端点http://localhost:9115/metrics 处获得。

TLS 和基本身份验证

Blackbox Exporter 支持 TLS 和基本身份验证。这可以更好地控制各种 HTTP 端点。

要使用 TLS 和/或基本身份验证,您需要使用参数传递配置文件 --web.config.file。文件的格式在导出工具包存储库中描述 。

请注意,TLS 和基本身份验证设置会影响所有 HTTP 端点:用于抓取的 /metrics、用于探测的 /probe 以及 Web UI。

HTTP 探针

可以接受一个附加 hostname参数来设置 Host标头和 TLS SNI。这对于以下情况特别有用 dns_sd_config

scrape_configs:
  - job_name: blackbox_all
    metrics_path: /probe
    params:
      module: [ http_2xx ]  # Look for a HTTP 200 response.
    dns_sd_configs:
      - names:
          - example.com
          - prometheus.io
        type: A
        port: 443
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
        replacement: https://$1/  # Make probe URL be like https://1.2.3.4:443/
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: 127.0.0.1:9115  # The blackbox exporter's real hostname:port.
      - source_labels: [__meta_dns_name]
        target_label: __param_hostname  # Make domain name become 'Host' header for probe requests
      - source_labels: [__meta_dns_name]
        target_label: vhost  # and store it in 'vhost' label

node_exporter

Prometheus 导出器,用于 NIX 内核公开的硬件和操作系统指标,用 Go 编写,带有可插入指标收集器。

建议 Windows 用户使用Windows导出器。要公开 NVIDIA GPU 指标, 可以使用prometheus-dcgm 。

部署

node_exporter旨在监控主机系统。在容器中部署需要格外小心,以避免监视容器本身。

对于需要容器化部署的情况,必须使用一些额外的标志来允许 node_exporter访问主机命名空间。

请注意,您想要监视的任何非根安装点都需要绑定安装到容器中。

如果启动容器进行主机监控,请指定 path.rootfs参数。此参数必须与主机根的绑定安装中的路径匹配。 node_exporter 将用作 path.rootfs访问主机文件系统的前缀。

docker run -d \
  --net="host" \
  --pid="host" \
  -v "/:/host:ro,rslave" \
  quay.io/prometheus/node-exporter:latest \
  --path.rootfs=/host

对于 Docker compose,需要类似的标志更改。

---
version: '3.8'

services:
  node_exporter:
    image: quay.io/prometheus/node-exporter:latest
    container_name: node_exporter
    command:
      - '--path.rootfs=/host'
    network_mode: host
    pid: host
    restart: unless-stopped
    volumes:
      - '/:/host:ro,rslave'

在某些系统上,timex收集器需要额外的 Docker 标志 , --cap-add=SYS_TIME才能访问所需的系统调用。

反向代理

参考教程:安装及使用

⚠️Nginx Proxy Manager(以下简称NPM)会用到80、443端口,所以本机不能占用(比如原来就有Nginx)

互联网使用请确保完成了域名解析