菜单
开源

使用 Grafana Alloy 监控 Docker 容器

Docker 容器提供统计信息和日志。docker statsdocker logs 命令在终端中以固定快照形式显示指标和日志。使用 Alloy,您可以收集指标和日志,将其转发到 Grafana 栈,并创建仪表盘来监控 Docker 容器。

alloy-scenarios 仓库包含 Alloy 部署的完整示例。克隆该仓库并使用这些示例来了解 Alloy 如何收集、处理和导出遥测信号。

在此示例场景中,Alloy 收集 Docker 容器指标和日志,并将其转发到 Loki 目的地。

开始之前

请确保您已安装以下组件:

注意

您需要管理员权限才能运行 docker 命令。

克隆并部署示例

按照以下步骤克隆仓库并部署监控示例:

  1. 克隆 Alloy scenarios 仓库

    shell
    git clone https://github.com/grafana/alloy-scenarios.git
  2. 启动 Docker 部署 Grafana 栈

    shell
    cd alloy-scenarios/docker-monitoring
    docker compose up -d

    验证 Docker 容器状态

    shell
    docker ps
  3. (可选)停止 Docker 关闭 Grafana 栈(当您完成示例探索时)

    shell
    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 目标。

alloy
prometheus.exporter.cadvisor "example" {
  docker_host = "unix:///var/run/docker.sock"

  storage_duration = "5m"
}

prometheus.scrape

prometheus.scrape 组件抓取 cAdvisor 指标并将其转发到接收器。在此示例中,该组件需要以下参数:

  • targets:抓取指标的目标。
  • forward_to:转发指标的目的地。
  • scrape_interval:抓取目标的频率。
alloy
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 目的地。

alloy
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 守护进程的地址。
alloy
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:写入目标的标签。
alloy
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:发送日志条目到的接收器列表。
alloy
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 端点。
alloy
loki.write "local" {
  endpoint {
    url = "http://loki:3100/loki/api/v1/push"
  }
}