菜单
开源

使用 Grafana Alloy 监控 TCP 日志

通过裸 TCP 在网络上写入日志是一种广泛使用的方法,用于在系统之间传输日志数据。这种方法提供了一种直接、面向连接的方式,用于将日志从客户端(例如应用程序或日志代理)发送到远程服务器(例如日志聚合器或中心日志系统)。使用 Alloy,您可以收集日志,将其转发到 Grafana 技术栈,并创建仪表盘来监控系统行为。

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

在此示例场景中,Alloy 使用 TCP 端点收集应用程序以 JSON payload 形式写入的日志,并将它们转发到 Loki 目标。

开始之前

请确保您已安装以下项

注意

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

克隆并部署示例

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

  1. 克隆 Alloy 场景仓库

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

    shell
    cd alloy-scenarios/logs-tcp
    docker compose up -d

    验证 Docker 容器状态

    shell
    docker ps
  3. (可选)在探索完本示例后停止 Docker 关闭 Grafana 技术栈

    shell
    docker compose down

监控和可视化您的数据

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

监控 Alloy

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

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

可视化您的数据

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

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

理解 Alloy 配置

本示例使用 config.alloy 文件配置用于日志记录的 Alloy 组件。您可以在克隆的仓库中找到 config.alloy 文件,路径为 alloy-scenarios/logs-tcp/

配置中包含 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: 定义提取的数据名称及其填充值的键值对。
  • values: 定义要设置的标签及其查找方式的键值对。
  • forward_to: 发送日志条目到的接收器列表。
alloy
loki.process "labels" {
    stage.json {
      expressions = { "extracted_service" = "service_name", 
                      "extracted_code_line" = "code_line", 
                      "extracted_server" = "server_id", 
                    }
    }

  stage.labels {
    values = {
      "service_name" = "extracted_service",
    }
  }

  stage.structured_metadata {
    values = {
      "code_line" = "extracted_code_line",
      "server" = "extracted_server",
      }
    }

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