菜单
开源

使用 Grafana Alloy 监控结构化日志

结构化日志采用一致的格式(例如 JSON)将数据组织成键值对。这种格式使日志数据更容易搜索、过滤和分析。通过 Alloy,您可以收集日志,将其转发到 Grafana Stack,并创建仪表盘来监控系统行为。

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

在此示例场景中,Alloy 通过 HTTP 收集日志条目,将其解析为标签和结构化元数据,并将结果转发到 Loki 目标。

开始之前

请确保您已具备以下条件

注意

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

克隆并部署示例

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

  1. 克隆 Alloy 场景仓库

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

    shell
    cd alloy-scenarios/mail-house
    docker compose up -d

    验证 Docker 容器的状态

    shell
    docker ps
  3. (可选) 停止 Docker 以在完成此示例探索后关闭 Grafana Stack

    shell
    docker compose down

监控和可视化您的数据

使用 Grafana 监控部署的健康状况并可视化您的数据。

监控 Alloy

要监控 Alloy 部署的健康状况,请打开浏览器并访问 https://:12345

有关 Alloy UI 的更多信息,请参阅 调试 Grafana Alloy

可视化您的数据

要使用 Grafana Logs 下钻功能,请打开浏览器并访问 https://:3000/a/grafana-lokiexplore-app

要创建仪表盘来可视化您的指标和日志,请打开浏览器并访问 https://:3000/dashboards

理解 Alloy 配置

此示例使用 config.alloy 文件配置用于日志记录的 Alloy 组件。您可以在克隆仓库的 alloy-scenarios/mail-house/ 路径下找到 config.alloy 文件。

配置中包含 livedebugging,用于将实时数据流传输到 Alloy UI。

配置 livedebugging

livedebugging 将来自您组件的实时数据直接流传输到 Alloy UI。有关此功能的更多详情,请参阅故障排除文档

livedebugging

livedebugging 默认禁用。通过 livedebugging 配置块显式启用它,以便在 Alloy UI 中查看调试数据。

alloy
livedebugging {
  enabled = true
}

配置日志记录

此示例中的日志记录配置需要三个组件

  • loki.source.api
  • loki.process
  • loki.write

loki.source.api

loki.source.api 组件通过 HTTP 接收日志条目并将其转发到其他 Loki 组件。在此示例中,该组件需要以下参数

  • listen_address: 服务器监听新连接的网络地址。将此参数设置为 0.0.0.0 表示服务器监听所有 IP 地址。
  • listen_port: 服务器监听新连接的端口。
  • forward_to: 发送日志条目到的接收器列表。
alloy
loki.source.api "loki_push_api" {
    http {
        listen_address = "0.0.0.0"
        listen_port = 9999
    }
    forward_to = [
        loki.process.labels.receiver,
    ]
}

loki.process

loki.process 组件接收来自其他 Loki 组件的日志条目,应用处理阶段,并将结果转发到接收器列表。在此示例中,该组件需要以下参数

  • expressions: 定义提取数据名称及其对应值的键值对。
  • source: 从提取值映射中获取名称,用于时间戳。
  • format: 确定如何解析源字符串。
  • values: 定义要设置的标签及其查找方式的键值对。
  • forward_to: 发送日志条目到的接收器列表。
alloy
loki.process "labels" {
    stage.json {
      expressions = { 
                      "timestamp" = "",
                      "state" = "", 
                      "package_size" = "", 
                      "package_status" = "", 
                      "package_id" = "",
                    }
    }

  stage.timestamp {
    source = "timestamp"
    format = "RFC3339"
  }

  stage.labels {
    values = {
      "state" = "",
      "package_size" = "",
    }
  }

  stage.structured_metadata {
    values = {
      "package_status" = "",
      "package_id" = "",
    }
  }

  stage.static_labels {
    values = {
      "service_name" = "Delivery World",
    }
  }

  stage.output {
    source = "message"
  }

  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"
  }
}