用Prometheus开始下一代系统监控
首先
本文概述了下一代系统监控工具 Prometheus 的概要和引入方法,该工具正在稳步发展。
未来一代的系统监控
在构建系统时,首先考虑使用由AWS等供应商提供的公共云服务的云优先思维,可谓是毋庸置疑的事实标准。
新冠疫情等不确定性因素、市场需求和价值观的变化等使得企业所追求的速度必然增高。因此,为了能够方便快捷地应对变化并迅速扩展系统规模,采用微服务思想和容器技术是必不可少的。
因此,为了保持业务运行,关于系统监控的手段也从传统的安装专用模块的代理型(※)转变为无代理型监控方式或容器监控等,对于系统监控的理念也发生了变化。
在监视目标服务器上安装代理并通过管理服务器作为管理器进行集中监视的一种监视方式。
普罗米修斯简介
Prometheus是由SoundCloud的工程师开发的开源系统监控工具。2016年,它作为继Kubernetes之后,成为CNCF(Cloud Native Computing Foundation)的第二个托管项目。
Prometheus是为了监控容器化环境如Kubernetes而开发的,但也可以在本地环境中使用。此外,它采用了无需代理的监控方式,使其易于部署使用。
建筑设计
以下是有关Prometheus架构的描述。
-
- Prometheus serverが監視対象に対して、pull型の監視を行う
-
- スクレイプして取得された時系列データは、Prometheus Web UIや、Grafanaなどと連携してダッシュボードで表示することができる
-
- ルールとアラートを設定し、Alertmanagaerを用いてEmailやWebhookでアラートを通知する
- ほとんどのPrometheusコンポーネントはGoで記述されているため、静的バイナリとして簡単にビルドおよびデプロイできる
以下是对于“Prometheus導入”的中文释义:
Prometheus引入
要运行Prometheus,您需要从Prometheus的官网下载二进制文件(※)。
(※)本篇文章使用的是截至2月28日1版的版本。
下载 Prometheus
在本文中,我已将其下载到/opt目录下。
-
- Prometheusのダウンロード及び展開
-
- # cd /opt
-
- # wget https://github.com/prometheus/prometheus/releases/download/v2.28.1/prometheus-2.28.1.linux-amd64.tar.gz
- # tar xzvf prometheus-2.28.1.linux-amd64.tar.gz
普罗米修斯的设置
进入展开的目录,并编辑prometheus.yml文件。
Prometheus使用YAML格式作为配置文件。
为了改变Scrape的监控间隔,我们将全局部分scrape_interval的值从默认值15秒更改为10秒。
-
- prometheus.ymlの編集
-
- # cd prometheus-2.28.1.linux-amd64/
-
- # vi prometheus.yml
- prometheus.yml
global:
scrape_interval: 10s # 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).
普罗米修斯的启动
将服务注册到systemctl以进行管理。
为了方便管理,还会创建符号链接。
# 将/opt/prometheus-2.28.1.linux-amd64符号链接到/opt/prometheus。
# 使用vi编辑/etc/systemd/system/prometheus.service文件。
- /etc/systemd/system/prometheus.service
[Unit]
Description = Prometheus
After=local-fs.target
ConditionPathExists=/opt/prometheus
[Service]
ExecStart=/opt/prometheus/prometheus.sh
Restart=no
Type=oneshot
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
我将创建一个启动脚本,通过prometheus.service来执行。
另外,我将为该脚本赋予执行权限。
使用以下一种方式将以下内容进行中文本地化:
# 编辑 /opt/prometheus/prometheus.sh 文件
# 赋予 /opt/prometheus/prometheus.sh 文件可执行权限
- prometheus.sh
#! /bin/bash
cd /opt/prometheus
nohup ./prometheus &
执行以下命令,进行systemctl的注册。
# systemctl 重新加载守护程序
在进行了systemctl注册后,启动Prometheus。
启动Prometheus后,确认状态已变为active。
# 启动Prometheus服务并查看状态。
● prometheus.service - Prometheus
Loaded: loaded (/etc/systemd/system/prometheus.service; disabled; vendor preset: enabled)
Active: active (exited) since Sat 2021-07-24 23:36:16 JST; 1s ago
Process: 1281 ExecStart=/opt/prometheus/prometheus.sh (code=exited, status=0/SUCCESS)
Main PID: 1281 (code=exited, status=0/SUCCESS)
Tasks: 5 (limit: 1100)
Memory: 16.8M
CGroup: /system.slice/prometheus.service
└─1291 ./prometheus
Jul 24 23:36:16 ubuntu prometheus.sh[1291]: level=info ts=2021-07-24T14:36:16.953Z caller=head.go:794 component=tsdb msg="On-disk memory mappable chunks r>
Jul 24 23:36:16 ubuntu prometheus.sh[1291]: level=info ts=2021-07-24T14:36:16.953Z caller=head.go:800 component=tsdb msg="Replaying WAL, this may take a w>
Jul 24 23:36:16 ubuntu prometheus.sh[1291]: level=info ts=2021-07-24T14:36:16.955Z caller=tls_config.go:191 component=web msg="TLS is disabled." http2=fal>
Jul 24 23:36:16 ubuntu prometheus.sh[1291]: level=info ts=2021-07-24T14:36:16.956Z caller=head.go:854 component=tsdb msg="WAL segment loaded" segment=0 ma>
Jul 24 23:36:16 ubuntu prometheus.sh[1291]: level=info ts=2021-07-24T14:36:16.956Z caller=head.go:860 component=tsdb msg="WAL replay completed" checkpoint>
Jul 24 23:36:16 ubuntu prometheus.sh[1291]: level=info ts=2021-07-24T14:36:16.960Z caller=main.go:851 fs_type=EXT4_SUPER_MAGIC
Jul 24 23:36:16 ubuntu prometheus.sh[1291]: level=info ts=2021-07-24T14:36:16.961Z caller=main.go:854 msg="TSDB started"
Jul 24 23:36:16 ubuntu prometheus.sh[1291]: level=info ts=2021-07-24T14:36:16.961Z caller=main.go:981 msg="Loading configuration file" filename=prometheus>
Jul 24 23:36:16 ubuntu prometheus.sh[1291]: level=info ts=2021-07-24T14:36:16.961Z caller=main.go:1012 msg="Completed loading of configuration file" filen>
Jul 24 23:36:16 ubuntu prometheus.sh[1291]: level=info ts=2021-07-24T14:36:16.961Z caller=main.go:796 msg="Server is ready to receive web requests."
如果希望在服务器启动时自动启动prometheus,可以执行以下命令。
启用prometheus服务的systemctl指令。
浏览器式
Prometheus提供了一个名为PromQL(Prometheus Query Language)的函数式查询语言。
您可以使用表达式浏览器执行PromQL查询,并将结果显示为图表。
PromQL是一种独特的查询语言,具有直观易懂的规范。此外,它具有使用标签进行筛选和对时间序列数据进行简便操作的特点。还可以对获取的指标进行四则运算和逻辑运算,来处理和展示数据。
Prometheus默认使用TCP端口9090。
打开浏览器,访问http://<服务器IP地址>:9090。
您可以从该用户界面的查询浏览器中执行PromuQL查询。
如果想要确认Prometheus所监视的目标,请从[状态]选项卡中选择[目标]。
我们可以知道普罗米修斯自身正在被监视。
返回到默认页面并尝试执行PromuQL查询。
如果在搜索框中输入up,将显示作为PromuQL查询表达式的预测候选项。
按下[执行]按钮。
当使用Prometheus进行抓取时,执行“up”的结果将显示在仪表盘上。在这种情况下,“up”表示自身成功地抓取了数据,并显示为1。因此,我们可以确认Prometheus的运行状态正常。
如果您使用PromQL从浏览器执行查询,可以使用标签来对获取的指标进行补全。例如,如上所示的”up”指标,您可以使用instance标签指定要监视的目标,使用job标签指定名称。
up{instance="localhost:9090", job="prometheus"}
节点导出器
Node exporter可以获取Linux等操作系统的CPU、内存、磁盘容量等常见系统资源的指标,并能在仪表盘上进行可视化展示。
Node exporter与Prometheus一样,可以从Prometheus官网下载二进制文件(※)。
下载Node Exporter。
在这篇文章中,我们已经将文件下载到了/opt目录下。
-
- Node exporterのダウンロード及び展開
-
- # cd /opt
-
- # wget https://github.com/prometheus/node_exporter/releases/download/v1.2.0/node_exporter-1.2.0.linux-amd64.tar.gz
- # tar xzvf node_exporter-1.2.0.linux-amd64.tar.gz
Node exporter的配置设置
为了添加Node exporter的配置,您需要编辑prometheus.yml文件,并在scrape_configs部分添加一个新的以’node’开头的抓取配置,如下所示:job_name: ‘node’。
-
- prometheus.ymlの編集
-
- # cd node_exporter-1.2.0.linux-amd64/
-
- # vi prometheus.yml
- prometheus.yml
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: 'node'
static_configs:
- targets: ['localhost:9100']
在编辑设置文件之后,重新启动Prometheus服务。
重启Prometheus服务
在Prometheus服务重新启动后,再次输入”up”命令,你可以得知Node exporter已被添加。
由于Node exporter的状态已经变为0,因此我们试着在服务器端执行以下命令。
运行./node_exporter。
当启动Node exporter后,再次输入up命令,可以看到Node exporter的状态变为1。
如上所述,您可以像在Prometheus中那样,使用systemctl管理Node exporter。
最后
在作为SRE时,重要的是将传统的系统监控理念改为不仅仅由人进行判断和应对警报,而是基本上由软件解释警报,在必要时人员才会进行处理,以此来建立监控系统。
要进行这种有效监控,Prometheus是一个必须掌握的工具。
请参阅
-
- DOCS
- How Prometheus Monitoring works | Prometheus Architecture explained