使用 Grafana Alloy 监控 Docker 容器
Docker 容器提供统计信息和日志。docker stats
和 docker logs
命令在终端中以固定快照形式显示指标和日志。使用 Alloy,您可以收集指标和日志,将其转发到 Grafana 栈,并创建仪表盘来监控 Docker 容器。
alloy-scenarios
仓库包含 Alloy 部署的完整示例。克隆该仓库并使用这些示例来了解 Alloy 如何收集、处理和导出遥测信号。
在此示例场景中,Alloy 收集 Docker 容器指标和日志,并将其转发到 Loki 目的地。
开始之前
请确保您已安装以下组件:
注意
您需要管理员权限才能运行
docker
命令。
克隆并部署示例
按照以下步骤克隆仓库并部署监控示例:
克隆 Alloy scenarios 仓库
git clone https://github.com/grafana/alloy-scenarios.git
启动 Docker 部署 Grafana 栈
cd alloy-scenarios/docker-monitoring docker compose up -d
验证 Docker 容器状态
docker ps
(可选)停止 Docker 关闭 Grafana 栈(当您完成示例探索时)
docker compose down
监控和可视化您的数据
使用 Grafana 监控部署健康状况并可视化数据。
监控 Alloy
要监控 Alloy 部署的健康状况,请打开浏览器并访问 https://:12345。
有关 Alloy UI 的更多信息,请参阅调试 Grafana Alloy。
可视化您的数据
要探索指标,请打开浏览器并访问 https://:3000/explore/metrics。
要使用 Grafana Logs Drilldown,请打开浏览器并访问 https://:3000/a/grafana-lokiexplore-app。
要创建用于可视化指标和日志的仪表盘,请打开浏览器并访问 https://:3000/dashboards。
理解 Alloy 配置
此示例使用 config.alloy
文件配置用于指标和日志记录的 Alloy 组件。您可以在克隆的仓库中的 alloy-scenarios/docker-monitoring/
找到此文件。
配置指标
此示例中的指标配置需要三个组件:
prometheus.exporter.cadvisor
prometheus.scrape
prometheus.remote_write
prometheus.exporter.cadvisor
prometheus.exporter.cadvisor
组件公开 Docker 容器指标。在此示例中,该组件需要以下参数:
docker_host
:定义 Docker 端点。storage_duration
:设置数据在内存中存储的时间。
此组件为 prometheus.scrape
提供 prometheus.exporter.cadvisor.example.targets
目标。
prometheus.exporter.cadvisor "example" {
docker_host = "unix:///var/run/docker.sock"
storage_duration = "5m"
}
prometheus.scrape
prometheus.scrape
组件抓取 cAdvisor 指标并将其转发到接收器。在此示例中,该组件需要以下参数:
targets
:抓取指标的目标。forward_to
:转发指标的目的地。scrape_interval
:抓取目标的频率。
prometheus.scrape "scraper" {
targets = prometheus.exporter.cadvisor.example.targets
forward_to = [ prometheus.remote_write.demo.receiver ]
scrape_interval = "10s"
}
prometheus.remote_write
prometheus.remote_write
组件将指标发送到 Prometheus 服务器。在此示例中,该组件需要以下参数:
url
:定义发送指标的完整 URL 端点。
此组件为 prometheus.scrape
提供 prometheus.remote_write.demo.receiver
目的地。
prometheus.remote_write "demo" {
endpoint {
url = "http://prometheus:9090/api/v1/write"
}
}
配置日志
此示例中的日志配置需要四个组件:
discovery.docker
discovery.relabel
loki.source.docker
loki.write
discovery.docker
discovery.docker
组件发现 Docker 容器并提取元数据。在此示例中,该组件需要以下参数:
host
:定义 Docker 守护进程的地址。
discovery.docker "linux" {
host = "unix:///var/run/docker.sock"
}
discovery.relabel
discovery.relabel
组件定义了一个重新标签规则,用于从容器名称创建服务名称。在此示例中,该组件需要以下参数:
targets
:要重新标签的目标。在此示例中,discovery.relabel
组件仅在loki.source.docker
组件中用于其导出的relabel_rules
。没有目标被修改,因此targets
参数为空数组。source_labels
:选择用于重新标签的标签列表。regex
:一个匹配/
后任何字符串的正则表达式。Docker 容器名称通常在 Prometheus 自动发现标签中带有前导斜杠 (/)。此表达式保留容器名称。target_label
:写入目标的标签。
discovery.relabel "logs_integrations_docker" {
targets = []
rule {
source_labels = ["__meta_docker_container_name"]
regex = "/(.*)"
target_label = "service_name"
}
}
loki.source.docker
loki.source.docker
组件从 Docker 容器收集日志。在此示例中,该组件需要以下参数:
host
:Docker 守护进程的地址。targets
:从中读取日志的容器列表。labels
:应用于条目的默认标签集。relabel_rules
:应用于日志条目的重新标签规则。forward_to
:发送日志条目到的接收器列表。
loki.source.docker "default" {
host = "unix:///var/run/docker.sock"
targets = discovery.docker.linux.targets
labels = {"platform" = "docker"}
relabel_rules = discovery.relabel.logs_integrations_docker.rules
forward_to = [loki.write.local.receiver]
}
loki.write
loki.write
组件将日志写入 Loki 目的地。在此示例中,该组件需要以下参数:
url
:定义发送日志到 Loki 的完整 URL 端点。
loki.write "local" {
endpoint {
url = "http://loki:3100/loki/api/v1/push"
}
}