Erdong’ Blog

苦练七十二变,笑对八十一难。

0%

Prometheus 安装

Prometheus是一个监控平台,它通过抓取这些目标主机上采集器暴露的指标来展示监控数据。本文介绍如何安装、配置和监控 Prometheus。你需要下载安装 Prometheus 并且安装 Exporter,这些工具采集了主机和对应服务的时间序列数据。我们的第一个 Exporter 是 Prometheus 本身,它提供了关于内存使用、垃圾收集等各种各样的主机级指标。

下载 Prometheus

首先下载最新版本的 Prometheus 然后解压,下载地址如下:

https://prometheus.io/download

1
2
tar xvfz prometheus-*.tar.gz
cd prometheus-*

Prometheus 服务是一个名为 Prometheus( 或Windows系统上的 prometheus.exe)的二进制文件。我们可以运行二进制文件,并通过--help 参数选项来查看帮助,如下所示。

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
$ ./prometheus --help
usage: prometheus [<flags>]

The Prometheus monitoring server

Flags:
-h, --help Show context-sensitive help (also try --help-long and --help-man).
--version Show application version.
--config.file="prometheus.yml"
Prometheus configuration file path.
--web.listen-address="0.0.0.0:9090"
Address to listen on for UI, API, and telemetry.
--web.read-timeout=5m Maximum duration before timing out read of the request, and closing idle connections.
--web.max-connections=512 Maximum number of simultaneous connections.
--web.external-url=<URL> The URL under which Prometheus is externally reachable (for example, if Prometheus is served via a reverse
proxy). Used for generating relative and absolute links back to Prometheus itself. If the URL has a path
portion, it will be used to prefix all HTTP endpoints served by Prometheus. If omitted, relevant URL
components will be derived automatically.
--web.route-prefix=<path> Prefix for the internal routes of web endpoints. Defaults to path of --web.external-url.
--web.user-assets=<path> Path to static asset directory, available at /user.
--web.enable-lifecycle Enable shutdown and reload via HTTP request.
--web.enable-admin-api Enable API endpoints for admin control actions.
--web.console.templates="consoles"
Path to the console template directory, available at /consoles.
--web.console.libraries="console_libraries"
Path to the console library directory.
--web.page-title="Prometheus Time Series Collection and Processing Server"
Document title of Prometheus instance.
--storage.tsdb.path="data/"
Base path for metrics storage.
--storage.tsdb.retention=15d
How long to retain samples in storage.
--storage.tsdb.no-lockfile
Do not create lockfile in data directory.
--storage.remote.flush-deadline=<duration>
How long to wait flushing sample on shutdown or config reload.
--storage.remote.read-sample-limit=5e7
Maximum overall number of samples to return via the remote read interface, in a single query. 0 means no
limit.
--storage.remote.read-concurrent-limit=10
Maximum number of concurrent remote read calls. 0 means no limit.
--rules.alert.for-outage-tolerance=1h
Max time to tolerate prometheus outage for restoring 'for' state of alert.
--rules.alert.for-grace-period=10m
Minimum duration between alert and restored 'for' state. This is maintained only for alerts with configured
'for' time greater than grace period.
--rules.alert.resend-delay=1m
Minimum amount of time to wait before resending an alert to Alertmanager.
--alertmanager.notification-queue-capacity=10000
The capacity of the queue for pending Alertmanager notifications.
--alertmanager.timeout=10s
Timeout for sending alerts to Alertmanager.
--query.lookback-delta=5m The delta difference allowed for retrieving metrics during expression evaluations.
--query.timeout=2m Maximum time a query may take before being aborted.
--query.max-concurrency=20
Maximum number of queries executed concurrently.
--query.max-samples=50000000
Maximum number of samples a single query can load into memory. Note that queries will fail if they would
load more samples than this into memory, so this also limits the number of samples a query can return.
--log.level=info Only log messages with the given severity or above. One of: [debug, info, warn, error]
--log.format=logfmt Output format of log messages. One of: [logfmt, json]

配置 Prometheus

Prometheus 的配置采用了 YAML 语法描述,Prometheus 下载好以后会有一个示例配置文件,文件名叫 prometheus.yml ,可以先配置这个文件。

将示例配置文件删除注释和一些高级配置以后,剩下的最基本、最少的配置项如下

1
2
3
4
5
6
7
8
9
10
11
12
global:
scrape_interval: 15s
evaluation_interval: 15s

rule_files:
# - "first.rules"
# - "second.rules"

scrape_configs:
- job_name: prometheus
static_configs:
- targets: ['localhost:9090']

在示例配置文件中有三个配置块:global、rule_files、scrape_configs 。

global 块控制 Prometheus 服务的全局配置,有两个选项。scrape_interval 控制Prometheus 采集数据的频率。你可以为某些指标数据覆盖此选项。默认情况下,全局设置是每15秒采集一次。evaluation_interval选项控制 Prometheus 评估规则的频率。Prometheus 使用规则创建新的时间序列并生成警报。

rule_files 用来指定我们需要加载的规则的配置文件路径,这个配置文件也是 YAML 语法。当前没有配置规则,这部分注释掉不生效。

scrape_configs 控制 Prometheus 监听的资源。由于 Prometheus 还将自己的数据作通过 HTTP 公开出来,因此它可以收集和监控自己的健康状况。在默认配置中有一个名为prometheus 的 job,它抓取 prometheus 服务公开的时间序列数据。该 Job 包含一个静态配置的目标,一般是本地主机的 9090 端口。 Prometheus 希望 Metric 能够在 /metric 的路径上可用。所以默认的 job 可以通过如下 RUEL 来采集,http://localhost:9090/metrics .

返回的时间序列数据详细描述了 Prometheus 服务的状态和性能。

对于完整的配置文件,可以查看官网的文档 , 后续我也会整理出来。

启动 Prometheus

使用刚才修改好的配置文件来启动 Prometheus,切换到 Prometheus 二进制文件的目录下,执行如下命令。

1
./prometheus --config.file=prometheus.yml

当二进制文件和配置文件在同一个目录的时候可以直接使用上述命令。如果不在同一个目录,请指定配置文件的绝对路径。

这样 Prometheus 就会启动起来。你可以使用浏览器访问 http://localhost:9090 地址可以看到关于它自身的状态页面,Prometheus 在启动 30 秒以后在页面就可以看到数据了。

你也可以通过访问 http://localhost:9090/metrics,来验证 Prometheus 是否在暴露自己的指标。

使用浏览器查看

我们来看一下 Prometheus 收集的一些关于自己的数据。访问 http://localhost:9090/graph,并在 “graph” 选项卡中选择 “Console” 视图。

promhttp_metric_handler_requests_total (Prometheus 提供的一个Metric 名称) 输入到控制台,这将返回许多不同的时间序列(以及为每个时间序列记录的最新值),所有这些时间序列的 Metric 名称都是 promhttp_metric_handler_requests_total,但是具有不同的 label 。这些 label 指定不同的请求状态。

如果想看 HTTP 请求返回码 200 的数据,可以使用下面这条语句:

1
promhttp_metric_handler_requests_total{code="200"}

如果要计算返回的时间序列的数量,可以使用 count 来查询,后边会写到函数相关的内容:

1
count(promhttp_metric_handler_requests_total)

推荐目录结构

新安装的 Prometheus 建议使用如下目录结构进行调整。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
.
├── conf
│   └── prometheus.yml
├── current -> deploy/prometheus-2.8.1.linux-amd64
├── data
├── deploy
│   └── prometheus-2.8.1.linux-amd64
│   ├── LICENSE
│   ├── NOTICE
│   ├── console_libraries
│   ├── consoles
│   ├── prometheus
│   ├── prometheus.yml
│   └── promtool
├── logs
│   └── prometheus.log
├── run
│   └── prometheus.pid
└── scripts
└── run.sh

conf 目录用来存储 Prometheus 的配置文件,启动的时候指定配置文件。

current 该目录软连接到二进制文件所在的目录

data Prometheus 数据库的数据存储位置,

deploy 放置 Prometheus 的二进制文件,方便 current 进行软连接

logs 存放日志。如果普通用户启动,建议日志放置在这个目录。如果 root 用户启动,日志可以放在这个目录,也可以放在 /var/log/messages

scripts 放置启动脚本。如果普通用户启动 ,放置启动进程的脚本。如果 root 用户启动,可以放置脚本到该目录,或者写成系统服务。

使用该目录结构可以方便的进行备份、迁移、升级、维护。

提供一个启动脚本 start.sh 的参考模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash
BASEPATH=/opt/prometheus
LOG=$BASEPATH/logs
nohup $BASEPATH/current/prometheus --config.file=$BASEPATH/conf/prometheus.yml --web.listen-address=:9090 --storage.tsdb.path=$BASEPATH/data/ --storage.tsdb.retention=31d >> $LOG/prometheus.log 2>&1 & echo $! > $BASEPATH/run/prometheus.pid

sleep 5
PROC=`ps -ef |grep \`cat $BASEPATH/run/prometheus.pid\` |grep -v grep`

if [ ! -n "$PROC" ] ;then
echo "##########################################"
echo "Process not found, please check by yourself"
echo "##########################################"
else
echo "##########################################"
echo "Prometheus is running"
echo "##########################################"
fi

该脚本做了如下内容

  • 指定配置文件
  • 指定数据暴露的端口
  • 指定数据文件存储的路径
  • 指定数据文件存储的时间(轮询时间)
  • 指定日志的存储位置(nohup 输出作为日志)
  • 生成 PID 文件

CentOS 7 启动脚本可以使用如下模板,

1
2
3
4
5
6
7
8
9
10
[Unit]
Description=Prometheus Server
After=network.target

[Service]
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=30d
User=root

[Install]
WantedBy=multi-user.target
  • 使用 root 用户启动
  • 日志会存储在 /var/log/messages
  • 指定配置文件
  • 指定数据暴露的端口
  • 指定数据文件存储的路径
  • 指定数据文件存储的时间(轮询时间)

大家根据自己需求取用、修改。

======================
Erdong, A Linux user !

坚持原创技术分享, 您的支持将鼓励我继续创作!