文章目录
- Prometheus 的功能和使用场景
- 功能
- 使用场景
- Docker 服务的创建和启动
- 1. 安装 Docker
- 2. 创建 Prometheus 配置文件
- 3. 启动 Prometheus Docker 容器
- 4. 访问 Prometheus
- 常见报错及解决方法
- 1. 配置文件错误
- 2. 端口冲突
- 3. 容器无法启动
- 4. 配置文件挂载失败
- 5. 无法访问 Prometheus Web 界面
- 6. 服务发现失败
- 7. 数据存储问题
- 8. 存储块时间范围重叠的问题
- 解决方法
- 1. 删除重叠的块
- 2. 使用 `promtool` 修复数据
- 3. 备份并重新初始化数据目录
- 总结
- 总结
Prometheus 是一个开源的系统监控和报警工具,最初由 SoundCloud 开发,现在是 CNCF(Cloud Native Computing Foundation)的一部分。它主要用于收集和存储时间序列数据(metrics),并提供强大的查询和报警功能。以下是 Prometheus 的详细描述,包括其功能、使用场景、Docker 服务的创建和启动,以及常见报错的解决方法。
Prometheus 的功能和使用场景
功能
- 多维数据模型:Prometheus 使用多维数据模型,数据通过度量名称(metric name)和键值对(label)来标识。
- 强大的查询语言(PromQL):Prometheus 提供了一种强大的查询语言 PromQL,用于实时查询和分析数据。
- 独立的时间序列数据库:Prometheus 自带一个高效的时间序列数据库,用于存储所有采集到的数据。
- 拉取模型:Prometheus 通过 HTTP 协议定期从目标(targets)拉取数据,而不是等待目标推送数据。
- 服务发现:Prometheus 支持多种服务发现机制,可以自动发现和监控动态变化的目标。
- 报警管理:Prometheus 提供了报警规则,可以根据查询结果生成报警,并通过 Alertmanager 进行报警管理和通知。
使用场景
- 系统监控:监控服务器、容器、网络设备等的性能和健康状态。
- 应用监控:监控应用程序的性能指标,如请求速率、错误率、响应时间等。
- 业务监控:监控业务指标,如用户注册数、订单量、交易量等。
- 报警和通知:根据监控数据生成报警,并通过邮件、短信、Slack 等方式通知相关人员。
Docker 服务的创建和启动
1. 安装 Docker
首先,确保你已经安装了 Docker。如果没有安装,可以参考 Docker 官方文档进行安装。
2. 创建 Prometheus 配置文件
创建一个 prometheus.yml
文件,内容如下:
global:scrape_interval: 15sscrape_configs:- job_name: 'prometheus'static_configs:- targets: ['localhost:9090']
3. 启动 Prometheus Docker 容器
使用以下命令启动 Prometheus Docker 容器:
docker run -d \--name=prometheus \-p 9090:9090 \-v /path/to/prometheus.yml:/etc/prometheus/prometheus.yml \prom/prometheus
在这个命令中:
-d
表示以后台模式运行容器。--name=prometheus
为容器指定一个名称。-p 9090:9090
将主机的 9090 端口映射到容器的 9090 端口。-v /path/to/prometheus.yml:/etc/prometheus/prometheus.yml
将主机上的配置文件挂载到容器内。
4. 访问 Prometheus
启动容器后,可以通过浏览器访问 http://localhost:9090
来查看 Prometheus 的 Web 界面。
常见报错及解决方法
1. 配置文件错误
错误信息:
Error loading config: couldn't load configuration (--config.file="/etc/prometheus/prometheus.yml"): parsing YAML file /etc/prometheus/prometheus.yml: yaml: line 10: did not find expected key
解决方法:
检查 prometheus.yml
文件的语法是否正确,确保缩进和格式符合 YAML 规范。
2. 端口冲突
错误信息:
Error starting Prometheus: listen tcp :9090: bind: address already in use
解决方法:
检查是否有其他服务占用了 9090 端口,可以使用 netstat -tuln | grep 9090
命令查看。如果端口被占用,可以修改 Prometheus 的端口配置,或者停止占用该端口的服务。
3. 容器无法启动
错误信息:
docker: Error response from daemon: Conflict. The container name "/prometheus" is already in use by container "xxxxxx".
解决方法:
如果容器名称已经被占用,可以使用 docker ps -a
查看所有容器,并使用 docker rm <container_id>
删除冲突的容器,或者为新容器指定一个不同的名称。
# 查看所有容器
docker ps -a# 删除冲突的容器
docker rm <container_id># 或者为新容器指定一个不同的名称
docker run -d \--name=prometheus_new \-p 9090:9090 \-v /path/to/prometheus.yml:/etc/prometheus/prometheus.yml \prom/prometheus
4. 配置文件挂载失败
错误信息:
level=error ts=2023-10-01T00:00:00.000Z caller=main.go:123 msg="Error loading config" err="open /etc/prometheus/prometheus.yml: no such file or directory"
解决方法:
确保主机上的配置文件路径正确,并且文件存在。检查挂载路径是否正确。
# 确保配置文件路径正确
ls /path/to/prometheus.yml# 确保挂载路径正确
docker run -d \--name=prometheus \-p 9090:9090 \-v /path/to/prometheus.yml:/etc/prometheus/prometheus.yml \prom/prometheus
5. 无法访问 Prometheus Web 界面
错误信息:
ERR_CONNECTION_REFUSED
解决方法:
- 确保 Prometheus 容器正在运行,可以使用
docker ps
命令查看。 - 确保端口映射正确,主机的 9090 端口是否被正确映射到容器的 9090 端口。
- 检查防火墙设置,确保 9090 端口没有被阻止。
# 查看正在运行的容器
docker ps# 确保端口映射正确
docker run -d \--name=prometheus \-p 9090:9090 \-v /path/to/prometheus.yml:/etc/prometheus/prometheus.yml \prom/prometheus# 检查防火墙设置(以 ufw 为例)
sudo ufw allow 9090
6. 服务发现失败
错误信息:
level=error ts=2023-10-01T00:00:00.000Z caller=main.go:123 msg="Error discovering targets" err="no such host"
解决方法:
- 确保服务发现配置正确,检查
prometheus.yml
文件中的scrape_configs
部分。 - 确保目标主机名或 IP 地址正确,并且可以解析。
# 示例配置
scrape_configs:- job_name: 'node_exporter'static_configs:- targets: ['localhost:9100']
7. 数据存储问题
错误信息:
level=error ts=2023-10-01T00:00:00.000Z caller=main.go:123 msg="Error opening storage" err="no space left on device"
解决方法:
- 检查磁盘空间,确保有足够的空间用于存储时间序列数据。
- 可以使用
docker volume
持久化存储数据。
# 检查磁盘空间
df -h# 使用 Docker volume 持久化存储数据
docker volume create prometheus_datadocker run -d \--name=prometheus \-p 9090:9090 \-v /path/to/prometheus.yml:/etc/prometheus/prometheus.yml \-v prometheus_data:/prometheus \prom/prometheus
8. 存储块时间范围重叠的问题
level=error ts=2024-09-04 23:39:41.929Z caller=main.go:808 err="opening storage failed: reloadBlocks: invalid block sequence: block time ranges overlap: (mint: 1719913276592, maxt: 1719914400000, <ulid: TRPVOHJ84BHVZNA6010, mint: 1719907200000, maxt: 1719914400000, range: 2h0m0s>, <ulid: 01J6XC9FKN6DSMAIDGVI97RSEB, mint: 1719913276592, maxt: 1719914400000, range: 18m43.5s>)"
这个错误信息表明 Prometheus 在启动时遇到了存储块时间范围重叠的问题。具体来说,两个块的时间范围(mint
和 maxt
)有重叠,这导致了存储加载失败。以下是解决这个问题的几种方法:
解决方法
1. 删除重叠的块
你可以手动删除重叠的块。首先,找到 Prometheus 数据目录(通常是 /prometheus
或者你在 Docker 容器中挂载的目录),然后删除重叠的块。
-
进入数据目录:
cd /path/to/prometheus/data
-
找到重叠的块:
错误信息中提到的块的ULID
是TRPVOHJ84BHVZNA6010
和01J6XC9FKN6DSMAIDGVI97RSEB
。你可以在数据目录中找到这些块。 -
删除重叠的块:
rm -rf /path/to/prometheus/data/TRPVOHJ84BHVZNA6010 rm -rf /path/to/prometheus/data/01J6XC9FKN6DSMAIDGVI97RSEB
-
重启 Prometheus:
docker restart prometheus
2. 使用 promtool
修复数据
Prometheus 提供了一个工具 promtool
,可以用来检查和修复数据块。
-
下载
promtool
:
如果你没有安装promtool
,可以从 Prometheus 的 GitHub Releases 页面下载。 -
检查数据块:
promtool tsdb analyze /path/to/prometheus/data
-
修复数据块:
promtool tsdb repair /path/to/prometheus/data
-
重启 Prometheus:
docker restart prometheus
3. 备份并重新初始化数据目录
如果上述方法都无法解决问题,你可以备份现有数据目录,然后重新初始化。
-
备份数据目录:
mv /path/to/prometheus/data /path/to/prometheus/data_backup
-
重新初始化数据目录:
mkdir /path/to/prometheus/data
-
重启 Prometheus:
docker restart prometheus
总结
Prometheus 存储块时间范围重叠的问题通常可以通过手动删除重叠的块或使用 promtool
修复数据来解决。如果这些方法都无法解决问题,重新初始化数据目录是最后的手段。请注意,重新初始化数据目录会导致现有的监控数据丢失,因此在执行此操作之前务必备份数据。
总结
Prometheus 是一个功能强大且灵活的监控和报警工具,广泛应用于云原生环境和微服务架构中。通过 Docker 部署 Prometheus 可以简化安装和管理过程,但在使用过程中可能会遇到一些常见的错误。通过上述方法