Prometheus是一个功能强大的开源监控系统,可从您的服务中收集指标并将其存储在时间序列数据库中。它通过Grafana等工具提供多维数据模型,灵活的查询语言和多样化的可视化可能性。
默认情况下,Prometheus仅导出有关其自身的指标(例如,它收到的请求数,内存消耗等)。但是,您可以通过安装导出程序,生成其他指标的可选程序来大大扩展Prometheus 。
出口商 - Prometheus团队维护的官方出版物以及社区贡献的出口商 - 提供从基础设施,数据库和Web服务器到消息系统,API等所有内容的信息。
一些最受欢迎的选择包括:
您可以在Prometheus网站上找到更完整的官方和社区贡献出口商列表。
在本教程中,您将安装,配置和保护Prometheus和节点导出器,以生成可以更轻松地监控服务器性能的指标。
在学习本教程之前,请确保您拥有:
出于安全考虑,我们首先创建两个新用户帐户prometheus和node_exporter。我们将在整个教程中使用这些帐户来隔离Prometheus核心文件和目录的所有权。
创建这两个用户,并使用--no-create-home
和--shell /bin/false
选项,以便这些用户无法登录到服务器。
sudo useradd --no-create-home --shell /bin/false prometheus
sudo useradd --no-create-home --shell /bin/false node_exporter
在我们下载Prometheus二进制文件之前,请创建用于存储Prometheus文件和数据的必要目录。遵循Linux的标准惯例,我们将为prometheus的配置文件在/etc
中创建一个目录,并为其数据在/var/lib
中创建一个目录。
sudo mkdir /etc/prometheus
sudo mkdir /var/lib/prometheus
现在,将新目录的用户和组所有权设置为prometheus用户。
sudo chown prometheus:prometheus /etc/prometheus
sudo chown prometheus:prometheus /var/lib/prometheus
有了我们的用户和目录,我们现在可以下载Prometheus,然后创建最小配置文件,以便首次运行Prometheus。
首先,将当前稳定版本的Prometheus下载并解压缩到您的主目录中。您可以在Prometheus下载页面上找到最新的二进制文件及其校验和。
cd ~
curl -LO https://github.com/prometheus/prometheus/releases/download/v2.0.0/prometheus-2.0.0.linux-amd64.tar.gz
接下来,使用该sha256sum
命令生成下载文件的校验和:
sha256sum prometheus-2.0.0.linux-amd64.tar.gz
将此命令的输出与Prometheus下载页面上的校验和进行比较,以确保您的文件既是正版文件又未损坏。
e12917b25b32980daee0e9cf879d9ec197e2893924bd1574604eb0f550034d46 prometheus-2.0.0.linux-amd64.tar.gz
如果校验和不匹配,请删除下载的文件并重复上述步骤以重新下载文件。
现在,解压缩下载的存档。
tar xvf prometheus-2.0.0.linux-amd64.tar.gz
这将创建一个名为prometheus-2.0.0.linux-amd64
的目录,该目录包含两个二进制文件(prometheus
和promtool
),目录consoles
和console_libraries
包含Web界面文件,许可证,通知和几个示例文件的目录。
将两个二进制文件复制到该/usr/local/bin
目录。
sudo cp prometheus-2.0.0.linux-amd64/prometheus /usr/local/bin/
sudo cp prometheus-2.0.0.linux-amd64/promtool /usr/local/bin/
将二进制文件的用户和组所有权设置为在步骤1中创建的prometheus用户。
sudo chown prometheus:prometheus /usr/local/bin/prometheus
sudo chown prometheus:prometheus /usr/local/bin/promtool
将consoles
和console_libraries
目录复制到/etc/prometheus
。
sudo cp -r prometheus-2.0.0.linux-amd64/consoles /etc/prometheus
sudo cp -r prometheus-2.0.0.linux-amd64/console_libraries /etc/prometheus
将目录上的用户和组所有权设置为prometheus用户。使用该-R
标志将确保对目录内的文件设置所有权。
sudo chown -R prometheus:prometheus /etc/prometheus/consoles
sudo chown -R prometheus:prometheus /etc/prometheus/console_libraries
最后,从主目录中删除剩余文件,因为我们不再需要它们。
rm -rf prometheus-2.0.0.linux-amd64.tar.gz prometheus-2.0.0.linux-amd64
现在已经安装了Prometheus,我们将在准备第一次运行时创建其配置和服务文件。
在/etc/prometheus
目录中,使用nano
或您喜欢的文本编辑器来创建名为prometheus.yml
的配置文件。目前,该文件将包含足够的信息,以便首次运行Prometheus。
sudo nano /etc/prometheus/prometheus.yml
警告: Prometheus的配置文件使用YAML格式,该格式严格禁止选项卡,并且需要两个空格来缩进。如果配置文件格式不正确,Prometheus将无法启动。
在global
设置中,定义抓取指标的默认时间间隔。请注意,除非单个导出器自己的设置覆盖全局变量,否则Prometheus会将这些设置应用于每个导出器。
global:
scrape_interval: 15s
该scrape_interval
值告诉Prometheus 每15秒从其出口商那里收集指标,这对于大多数出口商而言足够长。
现在,使用以下scrape_configs
指令将Prometheus本身添加到导出器列表中:
...
scrape_configs:
- job_name: 'prometheus'
scrape_interval: 5s
static_configs:
- targets: ['localhost:9090']
Prometheus使用job_name
在标签和图表上标记出口商,因此请务必在此处选择描述性内容。
而且,由于Prometheus会导出可用于监控性能和调试的重要数据,因此我们将全局scrape_interval
指令从15秒重写为5秒,以便更频繁地进行更新。
最后,Prometheus使用static_configs
和targets
指令来确定导出器的运行位置。由于此特定导出器与Prometheus本身在同一服务器上运行,因此我们可以使用localhost
IP地址而不是默认端口9090
来代替IP地址。
您的配置文件现在应如下所示:
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'prometheus'
scrape_interval: 5s
static_configs:
- targets: ['localhost:9090']
保存文件并退出文本编辑器。
现在,将配置文件上的用户和组所有权设置为在步骤1中创建的prometheus用户。
sudo chown prometheus:prometheus /etc/prometheus/prometheus.yml
配置完成后,我们准备首次运行它来测试Prometheus。
启动Prometheus作为prometheus用户,为配置文件和数据目录提供路径。
sudo -u prometheus /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
输出包含有关Prometheus加载进度,配置文件和相关服务的信息。这也证实Prometheus正在端口 9090
监听。
Outputlevel=info ts=2017-11-17T18:37:27.474530094Z caller=main.go:215 msg="Starting Prometheus" version="(version=2.0.0, branch=HEAD, re
vision=0a74f98628a0463dddc90528220c94de5032d1a0)"
level=info ts=2017-11-17T18:37:27.474758404Z caller=main.go:216 build_context="(go=go1.9.2, user=root@615b82cb36b6, date=20171108-
07:11:59)"
level=info ts=2017-11-17T18:37:27.474883982Z caller=main.go:217 host_details="(Linux 4.4.0-98-generic #121-Ubuntu SMP Tue Oct 10 1
4:24:03 UTC 2017 x86_64 prometheus-update (none))"
level=info ts=2017-11-17T18:37:27.483661837Z caller=web.go:380 component=web msg="Start listening for connections" address=0.0.0.0
:9090
level=info ts=2017-11-17T18:37:27.489730138Z caller=main.go:314 msg="Starting TSDB"
level=info ts=2017-11-17T18:37:27.516050288Z caller=targetmanager.go:71 component="target manager" msg="Starting target manager...
"
level=info ts=2017-11-17T18:37:27.537629169Z caller=main.go:326 msg="TSDB started"
level=info ts=2017-11-17T18:37:27.537896721Z caller=main.go:394 msg="Loading configuration file" filename=/etc/prometheus/promethe
us.yml
level=info ts=2017-11-17T18:37:27.53890004Z caller=main.go:371 msg="Server is ready to receive requests."
如果收到错误消息,请仔细检查您是否在配置文件中使用了YAML语法,然后按照屏幕上的说明解决问题。
现在,按CTRL+C
来停止Prometheus ,然后打开一个新的systemd
服务文件。
sudo nano /etc/systemd/system/prometheus.service
服务文件告诉systemd
,您将Prometheus作为prometheus用户运行,并且配置文件位于/etc/prometheus/prometheus.yml
目录中,并将其数据存储在/var/lib/prometheus
目录中。(systemd
服务文件的详细信息超出了本教程的范围,但您可以在腾讯云+社区了解更多信息。)
将以下内容复制到文件中:
[Unit]
Description=Prometheus
Wants=network-online.target
After=network-online.target
[Service]
User=prometheus
Group=prometheus
Type=simple
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
[Install]
WantedBy=multi-user.target
最后,保存文件并关闭文本编辑器。
要使用新创建的服务,请重新加载systemd
。
sudo systemctl daemon-reload
您现在可以使用以下命令启动Prometheus:
sudo systemctl start prometheus
要确保Prometheus正在运行,请检查服务的状态。
sudo systemctl status prometheus
输出结果会告诉您Prometheus的状态,主进程标识符(PID),内存使用等。
如果服务的状态不是active
,请按照屏幕上的说明进行操作,并在继续本教程之前重新跟踪上述步骤以解决问题。
● prometheus.service - Prometheus
Loaded: loaded (/etc/systemd/system/prometheus.service; disabled; vendor preset: enabled)
Active: active (running) since Fri 2017-07-21 11:40:40 UTC; 3s ago
Main PID: 2104 (prometheus)
Tasks: 7
Memory: 13.8M
CPU: 470ms
CGroup: /system.slice/prometheus.service
...
当您准备好继续前进时,请按Q
退出status
命令。
最后,启用服务以在开机时启动。
sudo systemctl enable prometheus
现在Prometheus已经启动并运行,我们可以安装一个额外的导出器来生成有关我们服务器资源的指标。
要将Prometheus扩展到仅关于自身的指标之外,我们将安装另一个名为Node Exporter的导出器。节点导出器提供有关系统的详细信息,包括CPU,磁盘和内存使用情况。
首先,将当前稳定版本的Node Exporter下载到您的主目录中。您可以在Prometheus的下载页面上找到最新的二进制文件及其校验和。
cd ~
curl -LO https://github.com/prometheus/node_exporter/releases/download/v0.15.1/node_exporter-0.15.1.linux-amd64.tar.gz
使用该sha256sum
命令生成下载文件的校验和:
sha256sum node_exporter-0.15.1.linux-amd64.tar.gz
通过将其校验和与下载页面上的校验和进行比较来验证下载文件的完整性。
7ffb3773abb71dd2b2119c5f6a7a0dbca0cff34b24b2ced9e01d9897df61a127 node_exporter-0.15.1.linux-amd64.tar.gz
如果校验和不匹配,请删除下载的文件并重复上述步骤。
现在,解压缩下载的存档。
tar xvf node_exporter-0.15.1.linux-amd64.tar.gz
这将创建一个名为node_exporter-0.15.1.linux-amd64
的目录,该目录包含名为node_exporter
二进制文件,许可证和通知。
将二进制文件复制到/usr/local/bin
目录,并将用户和组所有权设置为您在步骤1中创建的node_exporter用户。
sudo cp node_exporter-0.15.1.linux-amd64/node_exporter /usr/local/bin
sudo chown node_exporter:node_exporter /usr/local/bin/node_exporter
最后,从主目录中删除剩余文件,因为我们不再需要它们。
rm -rf node_exporter-0.15.1.linux-amd64.tar.gz node_exporter-0.15.1.linux-amd64
现在您已经安装了Node Exporter,让我们在为它创建服务文件之前运行它,并借此来测试它,以便它在开机时启动。
运行Node Exporter的步骤与运行Prometheus本身的步骤类似。首先为Node Exporter创建Systemd服务文件。
sudo nano /etc/systemd/system/node_exporter.service
此服务文件告诉您的系统将Node Exporter作为node_exporter用户运行,并启用默认的收集器集。
将以下内容复制到服务文件中:
[Unit]
Description=Node Exporter
Wants=network-online.target
After=network-online.target
[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter
[Install]
WantedBy=multi-user.target
收集器定义节点导出器将生成哪些度量标准。您可以在Node Exporter自述文件中查看Node Exporter的完整收集器列表 - 包括默认启用和不推荐使用的收集器列表。
如果您需要覆盖默认的收集器列表,可以使用--collectors.enabled
标志,如:
...
ExecStart=/usr/local/bin/node_exporter --collectors.enabled meminfo,loadavg,filesystem
...
前面的示例将告诉节点导出器仅使用 meminfo
, loadavg
和filesystem
收集器生成指标。您可以根据您的需要将收集器限制为很少或很多,但请注意,逗号之前或之后没有空格。
保存文件并关闭文本编辑器。
最后,重新加载systemd
以使用新创建的服务。
sudo systemctl daemon-reload
您现在可以使用以下命令运行Node Exporter:
sudo systemctl start node_exporter
使用该status
命令验证节点导出器是否正确运行。
sudo systemctl status node_exporter
与之前一样,此输出告诉您节点导出器的状态,主进程标识符(PID),内存使用情况等。
如果服务的状态不是active
,请按照屏幕上的消息并重新跟踪上述步骤以解决问题,然后再继续。
● node_exporter.service - Node Exporter
Loaded: loaded (/etc/systemd/system/node_exporter.service; disabled; vendor preset: enabled)
Active: active (running) since Fri 2017-07-21 11:44:46 UTC; 5s ago
Main PID: 2161 (node_exporter)
Tasks: 3
Memory: 1.4M
CPU: 11ms
CGroup: /system.slice/node_exporter.service
最后,启用节点导出器以开机时启动。
sudo systemctl enable node_exporter
随着Node Exporter完全配置并按预期运行,我们将告诉Prometheus开始抓取新指标。
因为Prometheus只抓取在其配置文件scrape_configs
部分中定义的导出器,所以我们需要为Node Exporter添加一个条目,就像我们为Prometheus本身所做的那样。
打开配置文件。
sudo nano /etc/prometheus/prometheus.yml
在scrape_configs
块的末尾,添加一个名为node_exporter
的新条目。
...
- job_name: 'node_exporter'
scrape_interval: 5s
static_configs:
- targets: ['localhost:9100']
由于此导出程序也在与Prometheus本身相同的服务器上运行,因此我们可以再次使用localhost而不是IP地址,同样使用Node Exporter的默认9100
端口。
您的整个配置文件应如下所示:
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'prometheus'
scrape_interval: 5s
static_configs:
- targets: ['localhost:9090']
- job_name: 'node_exporter'
scrape_interval: 5s
static_configs:
- targets: ['localhost:9100']
准备好继续时,保存文件并退出文本编辑器。
最后,重新启动Prometheus以使更改生效。
sudo systemctl restart prometheus
再次使用该status
命令验证一切是否正常运行。
sudo systemctl status prometheus
如果未将服务状态设置为active
,请按照屏幕上的说明操作并重新跟踪先前的步骤,然后再继续操作。
● prometheus.service - Prometheus
Loaded: loaded (/etc/systemd/system/prometheus.service; disabled; vendor preset: enabled)
Active: active (running) since Fri 2017-07-21 11:46:39 UTC; 6s ago
Main PID: 2219 (prometheus)
Tasks: 6
Memory: 19.9M
CPU: 433ms
CGroup: /system.slice/prometheus.service
我们现在已安装,配置和运行Prometheus和Node Exporter。作为连接到Web界面之前的最后一项预防措施,我们将通过基本HTTP身份验证来增强安装的安全性,以确保未经授权的用户无法访问我们的指标。
Prometheus不包含内置身份验证或任何其他通用安全机制。一方面,这意味着您将获得一个具有更少配置限制的高度灵活的系统; 另一方面,这意味着您需要确保您的指标和整体设置足够安全。
为简单起见,我们将使用Nginx为我们的安装添加基本的HTTP身份验证,Prometheus及其首选的数据可视化工具Grafana都完全支持它。
首先安装apache2-utils
,这将使您可以访问用于生成密码文件的实用程序htpasswd
。
sudo apt-get update
sudo apt-get install apache2-utils
现在,通过告知htpasswd
您要存储文件的位置以及要用于身份验证的用户名来创建密码文件。
注意: htpasswd
将提示您输入并重新确认您要与此用户关联的密码。另外,请记下您在此处输入的用户名和密码,因为您需要在步骤9中登录Prometheus。
sudo htpasswd -c /etc/nginx/.htpasswd sammy
此命令的结果是一个新创建的文件.htpasswd
,该文件位于目录/etc/nginx
中,该目录包含用户名和您输入的密码的hashed版本。
接下来,配置Nginx以使用新创建的密码。
首先,制作默认Nginx配置文件的Prometheus特定副本,以便以后在遇到问题时可以恢复为默认值。
sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/prometheus
然后,打开新配置文件。
sudo nano /etc/nginx/sites-available/prometheus
找到location /
块下方的server
块。它应该看起来像:
...
location / {
try_files $uri $uri/ =404;
}
...
由于我们将所有流量转发到Prometheus,请使用以下内容替换该try_files
指令:
...
location / {
auth_basic "Prometheus server authentication";
auth_basic_user_file /etc/nginx/.htpasswd;
proxy_pass http://localhost:9090;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
...
这些设置可确保用户必须在每个新会话开始时进行身份验证。此外,反向代理会将此块处理的所有请求定向到Prometheus。
完成更改后,保存文件并关闭文本编辑器。
现在,通过删除/etc/nginx/sites-enabled
目录中的链接来取消激活默认Nginx配置文件,并通过创建指向它的链接来激活新配置文件。
sudo rm /etc/nginx/sites-enabled/default
sudo ln -s /etc/nginx/sites-available/prometheus /etc/nginx/sites-enabled/
在重新启动Nginx之前,请使用以下命令检查配置是否有错误:
sudo nginx -t
输出应该表明syntax is ok
和test is successful
。如果收到错误消息,请按照屏幕上的说明解决问题,然后再继续执行下一步。
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
然后,重新加载Nginx以包含所有更改。
sudo systemctl reload nginx
验证Nginx是否已启动并正在运行。
sudo systemctl status nginx
如果您的输出未指示服务的状态active
,请按照屏幕上的消息重新跟踪上述步骤以解决问题,然后再继续。
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: en
Active: active (running) since Mon 2017-07-31 21:20:57 UTC; 12min ago
Process: 4302 ExecReload=/usr/sbin/nginx -g daemon on; master_process on; -s r
Main PID: 3053 (nginx)
Tasks: 2
Memory: 3.6M
CPU: 56ms
CGroup: /system.slice/nginx.service
此时,我们拥有一个功能齐全且安全的Prometheus服务器,因此我们可以登录Web界面开始查看指标。
Prometheus提供了一个基本的Web界面,用于监视自身及其导出器的状态,执行查询以及生成图形。但是,由于界面的简单性,Prometheus团队建议 安装和使用Grafana,而不是测试和调试。
在本教程中,我们将使用内置的Web界面来确保Prometheus和Node Exporter正常运行,我们还将查看简单的查询和图形。
首先,将Web浏览器指向http://your_server_ip
。
在HTTP身份验证对话框中,输入您在步骤8中选择的用户名和密码。
登录后,您将看到Expression Browser,您可以在其中执行和可视化自定义查询。
在执行任何表达式之前,首先单击屏幕顶部的Status菜单,然后单击Targets菜单选项,验证Prometheus和Node Explorer的状态。由于我们已将Prometheus配置为自身和节点导出器,因此您应该看到UP
状态中列出了两个目标。
如果缺少导出器或显示错误消息,请使用以下命令检查服务的状态:
sudo systemctl status prometheus
sudo systemctl status node_exporter
两个服务的输出应报告Active: active (running)
状态。如果某项服务完全不活动或处于活动状态但仍无法正常工作,请按照屏幕上的说明操作并重新跟踪前面的步骤,然后再继续。
接下来,为了确保导出器正常工作,我们将针对Node Exporter执行一些表达式。
首先,单击屏幕顶部的“ 图形”菜单返回“ 表达式浏览器”。
在“ 表达式”字段中,键入node_memory_MemAvailable
并按“ 执行”按钮以使用服务器具有的内存量更新“ 控制台”选项卡。
默认情况下,节点导出程序以字节为单位报告此数量。要转换为兆字节,我们将使用数学运算符除以1024两次。
在“ 表达式”字段中,输入node_memory_MemAvailable/1024/1024
然后按“ 执行”按钮。
“ 控制台”选项卡现在将以兆字节为单位显示结果。
如果要验证结果,请从终端执行free
命令。(该-h
标志告诉 free
要以人类可读的格式,兆字节为单位给我们发回报告。)
free -h
此输出包含有关内存使用情况的详细信息,包括可用列中显示的可用内存。
total used free shared buff/cache available
Mem: 488M 144M 17M 3.7M 326M 324M
Swap: 0B 0B 0B
除了基本运算符之外,Prometheus查询语言还提供了许多用于聚合结果的函数。
在“ 表达式”字段中,键入avg_over_time(node_memory_MemAvailable[5m])/1024/1024
并单击“ 执行”按钮。结果将是过去5分钟内的平均可用内存(以兆字节为单位)。
现在,单击Graph选项卡将执行的表达式显示为图形而不是文本。
最后,在此选项卡上,将鼠标悬停在图表上,以获取有关图表X和Y轴上任何特定点的其他详细信息。
如果您想了解有关在Prometheus的内置Web界面中创建表达式的更多信息,请参阅官方文档中的查询Prometheus部分。
在本教程中,我们使用一个额外的导出器下载,配置,保护和测试了完整的Prometheus安装。
要了解Prometheus还能做些什么,请访问Prometheus官方文档。
而且,要了解有关扩展Prometheus的更多信息,请查看可用出口商列表以及Grafana官方网站。
更多Ubuntu教程请前往腾讯云+社区学习更多知识。
参考文献:《How To Install Prometheus on Ubuntu 16.04》
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。