dcgm+Prometheus+grafana+loki+promtail搭建显卡监控及日志管理系统
一.组件介绍
DCGM提供了对数据中心 GPU 的管理和监控功能。负责收集 GPU 相关的性能数据和健康状态指标
Prometheus定期抓取指定的目标来收集指标数据,用来收集和存储来自 DCGM 的 GPU 指标数据
Grafana是可视化平台,用来可视化loki和Prometheus收集的数据
loki用来处理和存储日志数据
promtail收集并将日志通过http发送给loki的 Distributor 组件
二.数据流动
GPU 指标数据流:DCGM→Prometheus→Grafana
日志数据流:promtail→loki→Grafana
三.配置过程
文件树:
/home/czy/prometheus-dcgm
├─config
│ loki-config.yaml
│ promtail-config.yaml
├─loki
│ chunks
│ index
│
├─promtail
│ log
├─var
├──────log
│ └─dcgm-exporter
│
├─docker-compose.yml
│
└─prometheus.yml
docker-compose.yml
version: "3"
networks:
monitoring:
driver: bridge
services:
dcgm-exporter:
image: nvidia/dcgm-exporter
container_name: dcgm-exporter
runtime: nvidia
volumes:
- ./var/log/dcgm-exporter:/var/log/
ports:
- "9400:9400"
# environment:
# - DCGM_LOG_LEVEL=DEBUG
# - DCGM_LOG=1
# - DCGM_LOG_DIR=./var/log/dcgm-exporter
networks:
- monitoring
cap_add:
- SYS_ADMIN
prometheus:
image: prom/prometheus
container_name: prometheus
ports:
- "9999:9090" # Prometheus 默认端口是 9090
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
networks:
- monitoring
loki:
image: grafana/loki:2.0.0
container_name: loki
restart: unless-stopped
ports:
- 3100:3100
volumes:
- ./config:/etc/loki/config
- ./loki/index:/opt/loki/index
- ./loki/chunks:/opt/loki/chunks
user: "root"
command: -config.file=/etc/loki/config/loki-config.yaml
networks:
- monitoring
promtail:
image: grafana/promtail:2.0.0
container_name: promtail
restart: unless-stopped
volumes:
- ./var/log/dcgm-exporter:/var/log
- ./config:/etc/promtail/config
- ./data/log:/logs
user: "root"
command: -config.file=/etc/promtail/config/promtail-config.yaml
networks:
- monitoring
grafana:
image: grafana/grafana:latest
container_name: grafana
ports:
- "3000:3000"
networks:
- monitoring
prometheus.yml
global:
scrape_interval: 30s
scrape_configs:
- job_name: 'prometheus'
scrape_interval: 5s
static_configs:
- targets: ['localhost:9090']
- job_name: 'dcgm'
scrape_interval: 5s
static_configs:
- targets: ['dcgm-exporter:9400']
loki-config.yaml
# 启用或禁用 Loki 的身份验证功能
auth_enabled: false # 这里设置为 false,表示不启用身份验证
server:
# Loki 监听 HTTP 请求的端口
http_listen_port: 3100 # Loki 的接收端口,这里设置为 3100。即使 Loki 其他配置变化,这个端口不需要更改
ingester:
lifecycler:
address: 127.0.0.1 # Lifecycler 组件的绑定地址,通常设置为本地地址
ring:
kvstore:
store: inmemory # 使用内存存储来管理 ingester 的 ring 信息
replication_factor: 1 # 设置副本因子为 1,表示每个日志条目只存储一个副本
final_sleep: 0s # 在生命周期结束前等待的时间,这里设置为 0 秒
# 每个 chunk 的空闲时间,超过此时间未使用的 chunk 将被认为是空闲的
chunk_idle_period: 5m # 设置为 5 分钟
# chunk 保留时间,指在处理完后保留 chunk 的时间
chunk_retain_period: 30s # 设置为 30 秒
# 最大传输重试次数,设置为 0 表示不进行重试
max_transfer_retries: 0 # 设置为 0 次
schema_config:
configs:
- from: 2021-06-04 # 从该日期开始使用此配置
store: boltdb # 存储类型为 BoltDB
object_store: filesystem # 对象存储类型为文件系统
schema: v11 # 使用 schema 版本 v11
index:
prefix: index_ # 索引的前缀
period: 168h # 索引周期为 168 小时,即 7 天
storage_config:
boltdb:
directory: /tmp/loki/index # BoltDB 存储的目录位置,用于存储索引
filesystem:
directory: /tmp/loki/chunks # 文件系统存储的目录位置,用于存储 chunk 数据
limits_config:
enforce_metric_name: false # 是否强制执行指标名称的规范,这里设置为 false,不强制
reject_old_samples: true # 是否拒绝旧的样本
reject_old_samples_max_age: 168h # 设置拒绝样本的最大年龄为 168 小时,即 7 天
ingestion_rate_mb: 15 # 每秒允许的最大 ingestion 速率为 15 MB
chunk_store_config:
# 最大回溯周期,指在查询中允许回溯的最大时间
max_look_back_period: 0s
table_manager:
# 启用或禁用日志数据的保留删除功能
retention_deletes_enabled: false # 这里设置为 false,表示不启用保留删除
# 数据保留时间
retention_period: 0s # 设置为 0 秒,表示不进行保留
promtail-config.yaml
server:
log_level: info
http_listen_port: 9081
positions:
filename: /tmp/positions.yaml
clients:
- url: http://loki:3100/loki/api/v1/push
scrape_configs:
- job_name: system
static_configs:
- targets:
- localhost
labels:
job: varlogs
__path__: /var/log/*.log
运行 docker-compose up -d
在3000端口配置Prometheus数据源的dcgm数据可视化json样式
查看loki日志数据源
四、配置详解
Grafana Loki笔记04: Promtail简介和配置详解 | 青蛙小白 (frognew.com)
在本项目中,Promtail 扮演了一个日志代理(Agent)的角色,负责将本地日志内容收集并发送到 Loki。Promtail 的配置和日志抓取机制是通过 static_configs
静态配置实现的。在 promtail-config.yaml
文件中,通过 scrape_configs.static_configs.labels.path
字段来指定要抓取的日志路径。
日志抓取路径设置: 在 promtail-config.yaml
中,scrape_configs.static_configs.labels.path
被设置为 /var/log/*.log
。使得 Promtail 监视 /var/log/
目录下所有以 .log
结尾的文件。
Docker Compose 配置: 在 docker-compose.yml
中,通过将 Promtail 容器的 /var/log
目录与本地的 ./var/log/dcgm-exporter
目录绑定,使得 Promtail 可以访问到本地日志文件。此外,将 DCGM Exporter 的 /var/log/
目录绑定到本地的 ./var/log/dcgm-exporter
目录,从而实现 Promtail 对 DCGM Exporter 容器日志内容的抓取。
static_configs
具体内容
# 配置在当前机器上查找发现目标。
# 这是Prometheus服务发现代码所需的,但对于只能查看本地机器上的文件的Promtail来说并不适用。
# 因此,它只应该具有localhost的值,或者可以完全排除它,Promtail将应用localhost的默认值。
targets:
- localhost
# 定义要抓取的文件和要应用于__path__文件定义的所有流的可选附加标签集合。
labels:
# 从中加载日志的路径。可以使用通配符模式(例如,/var/log/*.log)。
__path__: <string>
# 用于排除要加载的文件。也可以使用通配符模式。
__path_exclude__: <string>
# 分配给日志的附加标签
[ <labelname>: <labelvalue> ... ]
在 docker-compose.yml
中,所有容器通过桥接网络连接,因此 Promtail 容器能够通过容器名直接访问 Loki 容器。在 Promtail 的配置中,clients.url
字段被设置为 http://loki:3100/loki/api/v1/push,这是Promtail 向 Loki 发送日志数据的 API 端点。