为了能够更加直观的了解 Prometheus Server,接下来我们将在本地部署并运行一个 Prometheus Server 实例,通过 Node Exporter 采集当前主机的系统资源使用情况。

本文基于 MacOS Go1.15.8

安装 Prometheus Server

Prometheus 基于 Golang 编写、编译后的软件包,不依赖于任何的第三方依赖。用户只需要下载对应平台的二进制包,解压并且添加基本的配置即可正常启动 Prometheus Server。

从二进制包安装

对于非 Docker 用户,可以从 https://prometheus.io/download/ 找到最新版本的 Prometheus Sevrer 软件包:

1
2
export VERSION=2.25.0
curl -LO  https://github.com/prometheus/prometheus/releases/download/v$VERSION/prometheus-$VERSION.darwin-amd64.tar.gz

解压,查看 Prometheus 目录结构:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
tar -xzf prometheus-2.25.0.darwin-amd64.tar.gz
cd prometheus-2.25.0.darwin-amd64

tree -L 2 .
.
├── LICENSE
├── NOTICE
├── console_libraries
│   ├── menu.lib
│   └── prom.lib
├── consoles
│   ├── index.html.example
│   ├── node-cpu.html
│   ├── node-disk.html
│   ├── node-overview.html
│   ├── node.html
│   ├── prometheus-overview.html
│   └── prometheus.html
├── data
│   ├── chunks_head
│   ├── lock
│   ├── queries.active
│   └── wal
├── prometheus
├── prometheus.yml
└── promtool

5 directories, 16 files

解压后当前目录会包含默认的 Prometheus 配置文件 promethes.yml:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 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']

运行 Prometheus Server:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
./prometheus --config.file="prometheus.yml" --web.listen-address="0.0.0.0:9090"
level=info ts=2021-02-13T03:12:43.647Z caller=main.go:366 msg="No time or size retention was set so using the default time retention" duration=15d
level=info ts=2021-02-13T03:12:43.648Z caller=main.go:404 msg="Starting Prometheus" version="(version=2.25.0-rc.0, branch=HEAD, revision=526095f9fa6159a49a3adce177f3294ebcf37b1f)"
level=info ts=2021-02-13T03:12:43.648Z caller=main.go:409 build_context="(go=go1.15.8, user=root@2111579c2ad1, date=20210212-19:11:41)"
level=info ts=2021-02-13T03:12:43.648Z caller=main.go:410 host_details=(darwin)
level=info ts=2021-02-13T03:12:43.648Z caller=main.go:411 fd_limits="(soft=256, hard=unlimited)"
level=info ts=2021-02-13T03:12:43.648Z caller=main.go:412 vm_limits="(soft=unlimited, hard=unlimited)"
level=info ts=2021-02-13T03:12:43.655Z caller=web.go:532 component=web msg="Start listening for connections" address=0.0.0.0:9090
level=info ts=2021-02-13T03:12:43.658Z caller=main.go:779 msg="Starting TSDB ..."
level=info ts=2021-02-13T03:12:43.662Z caller=tls_config.go:191 component=web msg="TLS is disabled." http2=false
......

使用容器安装

对于 Docker 用户,直接使用 Prometheus 的镜像即可启动 Prometheus Server:

1
docker run -p 9090:9090 -v /etc/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus

启动完成后,可以通过 http://localhost:9090/graph 访问 UI 界面:

安装 Node Exporter

在 Prometheus 的架构设计中,Prometheus Server 并不直接服务监控特定的目标,其主要任务负责数据的收集,存储并且对外提供数据查询支持。因此为了能够能够监控到某些东西,如主机的 CPU 使用率,我们需要使用到 Exporter。Prometheus 周期性的从 Exporter 暴露的 HTTP 服务地址(通常是 /metrics)拉取监控样本数据。

从上面的描述中可以看出 Exporter 可以是一个相对开放的概念,其可以是一个独立运行的程序独立于监控目标以外,也可以是直接内置在监控目标中。只要能够向 Prometheus 提供标准格式的监控样本数据即可。 这里为了能够采集到主机的运行指标如 CPU, 内存,磁盘等信息。我们可以使用 Node Exporter。

我们再回顾下 Prometheus 架构设计图:

Node Exporter 同样采用 Golang 编写,并且不存在任何的第三方依赖,只需要下载,解压即可运行。可以从 https://prometheus.io/download/ 获取最新的 Node exporter 版本的二进制包。

1
2
curl -OL https://github.com/prometheus/node_exporter/releases/download/v1.1.0/node_exporter-1.1.0.darwin-amd64.tar.gz
tar -xzf node_exporter-1.1.0.darwin-amd64.tar.gz

运行 Node exporter:

1
2
cd node_exporter-1.1.0.darwin-amd64
./node_exporter

启动成功后,可以看到以下输出:

1
2
3
4
5
6
7
8
./node_exporter
level=info ts=2021-02-13T03:37:54.502Z caller=node_exporter.go:178 msg="Starting node_exporter" version="(version=1.1.0, branch=HEAD, revision=0e74fbcd5fe3b98246292829a8e81e3133e17033)"
level=info ts=2021-02-13T03:37:54.503Z caller=node_exporter.go:179 msg="Build context" build_context="(go=go1.15.8, user=root@cf7d8c880095, date=20210205-23:04:01)"
level=info ts=2021-02-13T03:37:54.503Z caller=filesystem_common.go:74 collector=filesystem msg="Parsed flag --collector.filesystem.ignored-mount-points" flag=^/(dev)($|/)
level=info ts=2021-02-13T03:37:54.503Z caller=filesystem_common.go:76 collector=filesystem msg="Parsed flag --collector.filesystem.ignored-fs-types" flag=^devfs$
...
level=info ts=2021-02-13T03:37:54.503Z caller=node_exporter.go:195 msg="Listening on" address=:9100
...

访问 http://localhost:9100/metrics,可以看到当前 Node exporter 获取到的当前主机的所有监控数据,如下所示:

每一个监控指标之前都会有一段类似于如下形式的信息:

1
2
3
4
5
6
# HELP node_cpu Seconds the cpus spent in each mode.
# TYPE node_cpu counter
node_cpu{cpu="cpu0",mode="idle"} 362812.7890625
# HELP node_load1 1m load average.
# TYPE node_load1 gauge
node_load1 3.0703125

其中 HELP 用于解释当前指标的含义,TYPE 则说明当前指标的数据类型。

从Node Exporter收集监控数据

为了能够让 Prometheus Server 能够从当前 Node exporter 获取到监控数据,这里需要修改 Prometheus 配置文件。编辑 prometheus.yml 并在 scrape_configs 节点下添加以下内容:

1
2
3
4
5
6
7
8
scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']
  # 采集node exporter监控数据
  - job_name: 'node'
    static_configs:
      - targets: ['localhost:9100']

重新启动 Prometheus Server,访问 http://localhost:9090,进入到 Prometheus Server。如果输入“up”并且点击执行按钮以后,可以看到如下结果:

如果 Prometheus 能够正常从 Node exporter 获取数据,则会看到以下结果:

1
2
up{instance="localhost:9090",job="prometheus"}    1
up{instance="localhost:9100",job="node"}    1

其中“1”表示正常,反之“0”则为异常。

快速入门 PromQL

配置完 Prometheus 读取的数据源之后,Prometheus 便可以从 Node Exporter 获取到数据了。那么接下来我们如何查看到这些数据呢?答案是:Prometheus UI!

Prometheus UI 是 Prometheus 内置的一个可视化管理界面,我们通过 http://localhost:9090 就可以访问到该页面。通过 Prometheus UI 可以查询 Prometheus 收集到的数据,而 Prometheus 定义了 PromQL 语言来作为查询监控数据的语言,与 SQL 类似。

查看 NodeExporter 节点所在机器 CPU 1 分钟的负载情况,可以输入 node_load1 即可查看:

切换到 Graph 面板,用户可以使用 PromQL 表达式查询特定监控指标的监控数据。如下所示,查询主机负载变化情况:

PromQL 是 Prometheus 自定义的一套强大的数据查询语言,除了使用监控指标作为查询关键字以为,还内置了大量的函数,帮助用户进一步对时序数据进行处理。例如使用 rate() 函数,可以计算在单位时间内样本数据的变化情况即增长率,因此通过该函数我们可以近似的通过 CPU 使用时间计算 CPU 的利用率:

PromQL 先了解到这里,后面会有专门的文章来详细学习 PromQL 语法。

参考

https://prometheus.io/download/

https://yunlzheng.gitbook.io/prometheus-book/

https://www.cnblogs.com/chanshuyi/p/01_head_first_of_prometheus.html