介绍
Prometheus是一个开源的监控系统,可以从您的服务中收集指标。 Prometheus2.0带来了许多改变和改进,例如新的时间序列数据库,更好的资源使用,警报的新配置格式以及更好的Alertmanager发现。
在本教程中,您将升级现有的Prometheus 1.x安装到Prometheus 2.0。 Prometheus 2.0中的新时间序列数据库(称为tsdb
)与Prometheus 1.x不兼容,这意味着您无法使用Prometheus 2从Prometheus 1.x实例读取数据。为了解决这个限制,将Prometheus 1.x配置为只读数据存储以使您的旧数据可用。
Prometheus 2使用一种新的警报规则格式,因此您可以将现有警报规则更新为新格式,并使用Alertmanager。
最后,您将使用Web UI来确保Prometheus按预期工作。
本教程仅涵盖最重要的更改。 在升级到最新版本之前,您应该阅读宣布Prometheus 2.0 ,以确保您不受任何其他更改的影响。
先决条件
要学习本教程,您需要:
- 使用Ubuntu 16.04教程遵循初始服务器安装程序设置了一台Ubuntu 16.04服务器,其中包括sudo非root用户和防火墙。
- Prometheus 1.x安装在您的服务器上,包括Prometheus Web UI。 您可以通过运行
prometheus -version
命令找出您的Prometheus版本。 输出包含您的Prometheus版本以及构建信息。
本教程假设您的Prometheus安装有以下几点:
- 你已经创建了一个prometheus用户。
- 您已经创建了保存Prometheus配置文件的目录
/etc/prometheus
。 - 您已经创建了保存Prometheus数据的目录
/var/lib/prometheus
。 -
prometheus
和promtool
可执行文件位于/usr/local/bin
。 - 您已将Prometheus配置为作为
prometheus
的systemd服务运行。
第1步 - 将Prometheus升级到1.8.2
为了使用Prometheus 2.0访问您的旧数据,您需要将当前的Prometheus安装升级到版本1.8.2
,然后使用remote_read
功能将Prometheus 2.0设置为从旧版本读取。
使用prometheus -version
命令,查看当前的Prometheus版本。 输出包含版本和构建信息。 如果您已经运行版本1.8.2
跳过此步骤。
prometheus -version
prometheus -version outputprometheus, version 1.7.1 (branch: master, revision: 3afb3fffa3a29c3de865e1172fb740442e9d0133)
build user: root@0aa1b7fc430d
build date: 20170612-11:44:05
go version: go1.8.3
在你走得更远之前,停止Prometheus,以便可以替换它的文件:
sudo systemctl stop prometheus
您可以在项目的GitHub发布页面上找到Prometheus 1.8.2以及校验和。 您需要一个名为prometheus-1.8.2.linux-amd64.tar.gz
的文件。 使用以下curl
命令,将Prometheus归档文件和校验和下载到您的主目录:
cd ~
curl -LO https://github.com/prometheus/prometheus/releases/download/v1.8.2/prometheus-1.8.2.linux-amd64.tar.gz
curl -LO https://github.com/prometheus/prometheus/releases/download/v1.8.2/sha256sums.txt
为确保您拥有真正的非损坏归档文件,请使用sha256sum
命令为归档生成校验和,并将其与sha256sums.txt
文件进行比较。
sha256sum -c sha256sums.txt 2>&1 | grep OK
Checksums checkprometheus-1.8.2.linux-amd64.tar.gz: OK
如果在输出中看不到OK
,请删除下载的存档并重新执行上述步骤以再次下载。
现在,解压档案。
tar xvf prometheus-1.8.2.linux-amd64.tar.gz
将prometheus
和promtool
可执行文件复制到/usr/local/bin
目录。
sudo cp prometheus-1.8.2.linux-amd64/prometheus /usr/local/bin
sudo cp prometheus-1.8.2.linux-amd64/promtool /usr/local/bin
将文件的用户和组所有权设置为prometheus用户。
sudo chown prometheus:prometheus /usr/local/bin/prometheus
sudo chown prometheus:prometheus /usr/local/bin/promtool
最后,启动Prometheus以确保其正常工作。
sudo systemctl start prometheus
最后,检查服务的状态。
sudo systemctl status prometheus
您将看到以下输出:
Prometheus service status● prometheus.service - Prometheus
Loaded: loaded (/etc/systemd/system/prometheus.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2018-01-01 21:44:52 UTC; 2s ago
Main PID: 1646 (prometheus)
Tasks: 6
Memory: 17.7M
CPU: 333ms
CGroup: /system.slice/prometheus.service
└─1646 /usr/local/bin/prometheus -config.file /etc/prometheus/prometheus.yml -storage.local.path /var/lib/prometheus/
...
如果服务状态未active
,请按照屏幕上的日志并重新执行上述步骤以解决问题,然后再继续本教程。
验证Prometheus版本以确保您运行的是1.8.2
版本。
prometheus -version
prometheus -version outputprometheus, version 1.8.2 (branch: HEAD, revision: 5211b96d4d1291c3dd1a569f711d3b301b635ecb)
build user: root@1412e937e4ad
build date: 20171104-16:09:14
go version: go1.9.2
如果您没有看到version 1.8.2
请确保您已下载正确的文件version 1.8.2
节中的步骤。
最后,删除您下载的文件,因为您不再需要它们。
rm -rf prometheus-1.8.2.linux-amd64.tar.gz prometheus-1.8.2.linux-amd64
接下来,您将重新配置现有安装,以便在安装Prometheus 2.0时不会影响Prometheus 2.0。
第2步 - 将Prometheus 1.8.2配置为单独服务
我们希望保留Prometheus 1.8.2以便我们可以访问旧数据,但是我们需要确保我们的旧安装在安装Prometheus 2时不会干扰Prometheus 2。 为此,我们将在所有Prometheus相关目录和可执行文件的名称后加1
。 例如, prometheus
可执行文件将成为prometheus1
。 我们还会更新服务定义并将其设置为在不同的端口上运行。
在继续之前,停止Prometheus,以便您可以重命名文件和目录。
sudo systemctl stop prometheus
在/usr/local/bin
目录中,您会发现两个Prometheus可执行文件 - prometheus
和promtool
。 将它们分别重命名为prometheus1
和promtool1
:
sudo mv /usr/local/bin/prometheus /usr/local/bin/prometheus1
sudo mv /usr/local/bin/promtool /usr/local/bin/promtool1
Prometheus有两个相关的目录: /etc/prometheus
用于存储配置文件, /var/lib/prometheus
用于存储数据。 重命名这些目录。
sudo mv /etc/prometheus /etc/prometheus1
sudo mv /var/lib/prometheus /var/lib/prometheus1
我们将Prometheus 1.8.2作为只读数据存储区运行,因此我们不需要它从出口商收集任何数据。 为了确保这一点,我们将使用以下truncate
命令从配置文件中删除所有内容。 删除文件的内容之前,请创建该文件的备份,以便稍后用于配置Prometheus 2.0。
sudo cp /etc/prometheus1/prometheus.yml /etc/prometheus1/prometheus.yml.bak
然后用truncate
清空配置文件的内容。
sudo truncate -s 0 /etc/prometheus1/prometheus.yml
接下来,将服务文件从prometheus
重命名为prometheus1
。
sudo mv /etc/systemd/system/prometheus.service /etc/systemd/system/prometheus1.service
在文本编辑器中打开Prometheus服务文件。
sudo nano /etc/systemd/system/prometheus1.service
您将在9090
的默认端口上运行Prometheus 2.0,因此更改端口Prometheus 1.8.2监听端口9089
。 用以下配置替换ExecStart
指令:
...
ExecStart=/usr/local/bin/prometheus1 \
-config.file /etc/prometheus1/prometheus.yml \
-storage.local.path /var/lib/prometheus1/ \
-web.listen-address ":9089"
...
保存该文件并关闭文本编辑器。 重新加载systemd
以应用更改。
sudo systemctl daemon-reload
启动prometheus1
服务。
sudo systemctl start prometheus1
为确保它按预期工作,请检查服务的状态。
sudo systemctl status prometheus1
和以前一样,输出包含有关过程的信息,例如PID,状态等等:
Service status output● prometheus1.service - Prometheus
Loaded: loaded (/etc/systemd/system/prometheus1.service; disabled; vendor preset: enabled)
Active: active (running) since Mon 2018-01-01 21:46:42 UTC; 3s ago
Main PID: 1718 (prometheus1)
Tasks: 6
Memory: 35.7M
CPU: 223ms
CGroup: /system.slice/prometheus1.service
└─1718 /usr/local/bin/prometheus1 -config.file /etc/prometheus1/prometheus.yml -storage.local.path /var/lib/prometheus1/
...
如果服务状态未active
,请按照屏幕上的日志并重新执行上述步骤以解决问题,然后再继续本教程。
启用该服务以确保它在系统引导时启动。
sudo systemctl enable prometheus1
此时Prometheus 1.8.2不会刮去任何出口商。 这将确保数据的一致性,一旦我们设置Prometheus 2.0,它将使用当前安装作为旧数据的只读数据存储。 下一步,我们将安装Prometheus 2.0并使用Prometheus 1.8.2来访问我们的旧数据。
第3步 - 配置Prometheus2.0
在这一步中,我们将配置Prometheus 2.0来刮取出口商,并使用Prometheus 1.8.2作为只读数据存储,以便我们可以访问我们现有的数据。
在继续本教程之前,请按照教程中第1步和2 2。
安装Prometheus后,创建一个新的配置文件。 配置文件格式没有改变,因此您可以将Prometheus 1.x配置文件与Prometheus 2一起使用。将您在前一步骤中创建的现有Prometheus配置的备份复制到/etc/prometheus/
目录中。
sudo cp /etc/prometheus1/prometheus.yml.bak /etc/prometheus/prometheus.yml
将新创建的配置文件的用户和组所有权设置为Prometheus用户。
sudo chown prometheus:prometheus /etc/prometheus/prometheus.yml
您对此文件所做的唯一更改是告诉Prometheus 2.0将Prometheus 1.8.2用作只读数据存储,以便您可以访问旧数据。 在文本编辑器中打开配置文件。
sudo nano /etc/prometheus/prometheus.yml
在配置文件的末尾,添加从远程Prometheus实例读取的remote_read
指令。 告诉它从localhst:9089
读取localhst:9089
,你的Prometheus 1.8.2实例:
...
remote_read:
- url: http://localhost:9089/api/v1/read
完成后,保存文件并关闭文本编辑器。
在第一次运行Prometheus 2.0之前,我们将更新警报规则并配置Alertmanager与Prometheus配合使用。 如果您不使用警报规则或Alertmanager,请跳过下一步。
第4步 - 配置警报(可选)
Prometheus 1.x警报规则是使用自定义语法定义的。 从版本2.0起,您使用YAML定义警报规则。 为了promtool
迁移,Prometheus的promtool
命令可以将旧规则文件转换为新格式。 如果您不使用警报规则,则可以跳过此步骤。
首先,将您拥有的所有规则从/etc/prometheus1
目录复制到/etc/prometheus
目录。
sudo cp /etc/prometheus1/*.rules /etc/prometheus/
另外,通过运行以下命令确保您具有promtool
版本2.0:
promtool --version
输出包含promtool
版本和构建信息。
promtool --versionpromtool, version 2.0.0 (branch: HEAD, revision: 0a74f98628a0463dddc90528220c94de5032d1a0)
build user: root@615b82cb36b6
build date: 20171108-07:11:59
go version: go1.9.2
如果版本不是2.0,请确保将promtool
可执行文件复制到正确的位置。
现在,导航到/etc/prometheus
目录。
cd /etc/prometheus
对目录中的每个.rules
文件运行以下promtool
命令:
sudo promtool update rules file-name.rules
这会从提供的文件生成一个名为file-name .rules.yml
文件的新文件。 如果您在屏幕上看到任何错误消息,请在继续教程之前按照屏幕上的日志解决问题。
确保在由promtool
创建的文件上正确设置用户和组的所有权。
sudo chown prometheus:prometheus file-name.rules
最后,更新Prometheus配置文件以使用新创建的规则文件,而不是旧规则文件。 在编辑器中打开配置文件。
sudo nano /etc/prometheus/prometheus.yml
将.yml
Postfix附加到rule_files
指令下的每个条目,如下所示:
...
rule_files:
- alert1.rules.yml
- alert2.rules.yml
...
保存文件并退出编辑器。
现在删除旧的警报规则文件,因为它们不再需要。
sudo rm alert1.rules alert2.rules
接下来,让我们配置Prometheus来发现Alertmanager。 -alertmanager.url
标志不再存在。 相反,Prometheus 2.0引入了Alertmanager服务发现功能,该功能带来了许多新功能,并与Kubernetes等服务更好地集成。 如果您不使用Alertmanager,请跳过此步骤的其余部分。
再次打开编辑器中的prometheus.yml
文件:
sudo nano /etc/prometheus/prometheus.yml
以下alerting
指令指示Prometheus使用在Droplet端口上运行的:9093
。 您可以在文件的任何位置添加以下内容:
global:
...
alerting:
alertmanagers:
- static_configs:
- targets:
- alertmanager:9093
rule_files:
...
保存该文件并关闭文本编辑器。
Prometheus现在可以使用警报规则并与Alertmanager通信,我们已经准备好第一次运行它。
第5步 - 运行Prometheus 2.0
为了能够将Prometheus 2.0作为服务运行,我们需要创建一个服务文件。 我们可以从我们用于Prometheus 1.8.2的服务文件开始,因为除了ExecStart
命令外,它大部分是相同的。
通过复制现有的服务文件创建一个新的服务文件:
sudo cp /etc/systemd/system/prometheus1.service /etc/systemd/system/prometheus.service
在您的编辑器中打开新建的服务文件:
sudo nano /etc/systemd/system/prometheus.service
Prometheus2.0在旗帜系统中带来了一些重要的变化,包括:
- 现在标志使用双短划线(
--
)而不是单短划线作为前缀。 - 所有
-storage.local
和-storage.remote
标志已被删除并替换为--storage.tsdb
标志。 -
-alertmanager.url
已被移除并替换为Alertmanager服务发现,这在前面的步骤中已有介绍。
将ExecStart
指令替换为ExecStart
指令:
ExecStart=/usr/local/bin/prometheus \
--config.file /etc/prometheus/prometheus.yml \
--storage.tsdb.path /var/lib/prometheus/ \
--web.console.templates=/etc/prometheus/consoles \
--web.console.libraries=/etc/prometheus/console_libraries
--config.file
指令指示Prometheus在/etc/prometheus
目录中使用prometheus.yml
文件。 我们将使用--storage.tsdb.path
代替--storage.tsdb.path
。 另外,我们添加了两个--web.
标志,所以我们可以访问内置的Web模板。
完成后,保存文件并关闭文本编辑器。
最后,重新加载systemd,以便您可以使用新创建的服务。
sudo systemctl daemon-reload
然后开始Prometheus:
sudo systemctl start prometheus
检查服务的状态以确保其按预期工作。
sudo systemctl status prometheus
Prometheus service status● prometheus.service - Prometheus
Loaded: loaded (/etc/systemd/system/prometheus.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2018-01-01 20:15:09 UTC; 1h 20min ago
Main PID: 1947 (prometheus)
Tasks: 7
Memory: 54.3M
CPU: 15.626s
CGroup: /system.slice/prometheus.service
└─1947 /usr/local/bin/prometheus --config.file /etc/prometheus/prometheus.yml --storage.tsdb.path /var/lib/prometheus/
...
如果服务状态未active
,请按照屏幕上的日志并重新执行上述步骤以解决问题,然后再继续本教程。
现在您知道该服务可以正常工作,请在启动系统时启动它:
sudo systemctl enable prometheus
您可以通过在浏览器中导航到http:// your_server_ip
来访问Prometheus的Web UI,并使用您在安装Prometheus时配置的凭据进行身份验证。 您将在下一步中使用Web UI,以确保Prometheus按预期工作。
第6步 - 测试Prometheus
让我们确保Prometheus2正在按照预期抓取所有出口商,并确保它可以访问先前安装Prometheus的数据。
在Web浏览器中导航到http:// your_server_ip
,以访问Prometheus Web UI。 系统会要求您输入最初安装Prometheus时配置的用户名和密码。
输入凭证后,您会看到“ 图表”页面,您可以在其中执行和可视化查询:
在执行查询之前,让我们来看看Prometheus的版本和出口商状态。 点击导航栏中的状态链接,然后单击运行时和生成信息按钮。 您将看到包含有关Prometheus服务器信息的页面。
接下来,再次点击状态链接,然后点击目标按钮来检查您的出口商是否按预期运行。 该网页包含有关您的出口商的详细信息,包括它们是否已启动并正在运行。
如果您看到任何错误,请确保在继续教程之前按照屏幕上的说明解决问题。
您不会看到您的Prometheus 1.8.2数据源,因为它用作数据存储而不是导出器。 所以让我们确保我们可以访问旧数据和新数据。 点击图表按钮。
在“ 表达式”字段中,键入node_memory_MemAvailable/1024/1024
以兆字节为单位获取服务器的可用内存。 点击执行按钮。
您会看到屏幕上显示的结果:
点击Graph选项卡可以随时查看可用内存。 在图表中,您应该看到以前的数据,在Prometheus暂停工作后,会看到最新的数据。
如果您没有看到旧数据,请通过检查其服务的状态确保Prometheus 1.8.2已启动,并且您已将Prometheus 2.0配置为将其用作远程数据库。
您已验证Prometheus正在正常工作并报告数据。 现在让我们看看如何在Prometheus 1.8.2和旧数据不再使用时移除旧数据。
第7步 - 删除旧数据(可选)
一旦你不需要它,你可能想要移除Prometheus 1.8.2和旧数据。 按照这些步骤清理所有东西。
警告:这是一个不可逆转的操作! 删除旧数据后,除非您备份了它,否则无法恢复。
首先,从Prometheus 2配置文件中删除remote_read
指令。 在您的编辑器中打开Prometheus 2.0配置文件:
sudo nano /etc/prometheus/prometheus.yml
找到并删除应位于文件末尾的remote_read
指令:
remote_read:
- url: http://localhost:9089/api/v1/read
保存该文件并关闭文本编辑器。 重新启动Prometheus以应用更改。
sudo systemctl restart prometheus
确保服务正常运行:
sudo systemctl status prometheus
Prometheus service status● prometheus.service - Prometheus
Loaded: loaded (/etc/systemd/system/prometheus.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2018-01-01 20:15:09 UTC; 1h 20min ago
Main PID: 1947 (prometheus)
Tasks: 7
Memory: 54.3M
CPU: 15.626s
CGroup: /system.slice/prometheus.service
└─1947 /usr/local/bin/prometheus --config.file /etc/prometheus/prometheus.yml --storage.tsdb.path /var/lib/prometheus/
...
如果服务状态未active
,请按照屏幕上的日志并重新执行上述步骤以解决问题,然后再继续本教程。
接下来,禁用并删除prometheus1
服务,然后清理所有Prometheus 1.8.2相关的目录和文件。
禁用该服务以确保它不会自动启动:
sudo systemctl disable prometheus1
然后停止服务:
sudo systemctl stop prometheus1
没有输出表明操作已成功完成。
现在删除prometheus1
服务文件:
sudo rm /etc/systemd/system/prometheus1.service
最后,删除剩余的文件,因为它们不再需要。 首先,删除位于/usr/local/bin
目录中的prometheus1
和promtool1
可执行文件。
sudo rm /usr/local/bin/prometheus1 /usr/local/bin/promtool1
然后删除用于存储数据和配置的/etc/prometheus1
和/var/lib/prometheus1
目录。
sudo rm -r /etc/prometheus1 /var/lib/prometheus1
Prometheus 1.8.2现在已从您的系统中删除,您的旧数据已消失。
结论
在本教程中,您将Prometheus 1.x升级到Prometheus 2.0,更新所有规则文件,并配置Prometheus以发现Alertmanager(如果它存在)。
通过阅读官方宣布Prometheus 2.0的帖子和项目的更新日志,了解Prometheus 2.0包含的所有更改的更多信息。