使用 eBPF 在 Docker 中监控 Go 应用程序
Site24x7 APM Insight 利用扩展伯克利数据包过滤器(eBPF)技术,支持对在 Docker 容器中运行的 Go 应用程序进行自动监控。这种方式无需修改源代码即可监控应用程序性能。
本指南将引导您完成在 Docker 中监控 Go 应用程序所需的全部设置、配置和故障排除步骤。
Docker 中的监控工作流
下图概述了在 Docker 环境中如何通过共享卷和主机进程标识符(PID)命名空间的 Sidecar 容器模式实现监控。
您的 Go 应用程序在应用程序容器(图中标注为 Go application)中运行,而一个独立的辅助容器(APM Insight 代理容器)负责处理所有监控工作。在此 APM Insight 代理容器中,APM Insight Go 代理负责发现您的 Go 进程。Instrumentor(一个小型组件,通过向您的应用添加监控钩子来收集性能数据,无需修改代码)附加轻量级 eBPF 探针来观察应用程序的行为,而 S247DataExporter 则将收集的数据发送到 Site24x7 后端。
两个容器共享一个应用程序二进制卷(用于存放应用可执行文件的共享文件夹),让代理可以读取应用程序的二进制文件而无需修改它。代理还可以访问主机的 /proc 和 /sys 文件夹(图中显示为主机资源),以了解机器上正在运行的进程。所有这些操作都在后台进行,无需对您的应用程序进行任何更改,即可提供性能洞察。

前提条件
开始之前,请确保满足以下要求:
- Docker Engine 20.10 或更高版本
- Docker Compose v2 或更高版本
- Linux 内核 5.8 或更高版本(eBPF 支持所必需)
- 有效的 Site24x7 APM 许可证密钥
- 运行 Go 1.18 或更高版本的 Go 应用程序容器(推荐)
为 Docker 中的 Go 应用程序设置监控
按照以下步骤,快速配置对在 Docker 中运行的 Go 应用程序的自动监控。
第一步:准备应用程序容器
Site24x7 APM 容器需要访问您的 Go 二进制文件才能进行监控。请确保通过共享卷可以访问您的应用程序二进制文件。
修改现有的 docker-compose.yml,通过共享卷暴露 Go 应用程序二进制文件。
services: your-app:
image: your-go-application:latest
container_name: your-app-container # Your application configuration
ports:
- "8080:8080" # Your application ports
# Create shared volume for binary access
volumes:
- app_binary:/app:ro # Mount application directory as read-only # Define shared volume (will be used by APM container)
volumes:
app_binary:
driver: local
第二步:添加 Site24x7 APM Insight 容器
接下来,将 Site24x7 APM Insight 服务添加到 docker-compose.yml 中。
services:
# Your existing application service
your-app:
image: your-go-application:latest
container_name: your-app-container
ports:
- "8080:8080"
volumes:
- app_binary:/app:ro # Site24x7 APM Insight service
site24x7-apm:
image: site24x7/apminsight-go-agent:latest
container_name: site24x7-apm-agent
# Required: Privileged mode for eBPF operations
privileged: true
# Required: Host PID namespace for process discovery
pid: host
# Required environment variables
environment:
# REQUIRED: Your Site24x7 license key
- S247_LICENSE_KEY=
# REQUIRED: Go applications to monitor
# Format: "AppName=ProcessName:Port1,Port2;AnotherApp=ProcessName:Port;"
# Replace with your application details
- GO_APPS=MyGoApp=your-app-binary:8080
# Volume mounts
volumes:
# Required: Host /proc access for eBPF (read-only)
- /proc:/host/proc:ro
# Required: Shared volume with your application (read-only)
- app_binary:/app_runtime:ro
# Restart policy
restart: unless-stopped
# Shared resources
volumes:
app_binary:
driver: local
第三步:配置环境变量
在与 docker-compose.yml 相同的目录中创建 ENV 文件。
# Site24x7 License Key (REQUIRED)
S247_LICENSE_KEY=your_actual_license_key_here # Go Applications to Monitor (REQUIRED)
# Format: "AppName=ProcessName:Port1,Port2,Port3;AnotherApp=ProcessName:Port;"
#
# Examples:
# Single app with one port:
# GO_APPS=WebAPI=mywebapi:8080
#
# Single app with multiple ports:
# GO_APPS=WebAPI=mywebapi:8080,8443,9090
#
# Multiple apps:
# GO_APPS=WebAPI=mywebapi:8080;AdminAPI=adminapi:9000;WorkerService=worker:8081
#
GO_APPS=MyGoApp=your-process-name:8080
GO_APPS 格式用于映射 Go 应用程序以实现自动发现和监控。该格式包含以下字段:
- ProcessName:Go 二进制文件/进程在容器中显示的确切名称。
- Port(s):应用程序监听的端口号(用于应用程序标识)。
- AppName:应用程序的友好名称(将显示在 Site24x7 仪表板中)。
安全注意事项
以下准则说明了监控设置中与安全相关的注意事项:
- 特权模式:eBPF 操作所必需。容器需要提升的权限才能安全地附加和管理 eBPF 探针。
- 主机 PID 命名空间:支持跨容器的进程发现。APM 代理可以查看所有主机进程,但仅监控您在配置中指定的进程。
- 只读卷:应用程序二进制卷使用只读(:ro)选项挂载,防止任何修改并确保安全访问。
高级配置
当您需要监控多个 Go 应用程序,或在更复杂的 Docker 环境(如 Swarm 或 Stack 模式)中部署 APM 代理时,可使用这些高级配置。
监控多个 Go 应用程序
如果您的环境中有多个 Go 容器,可以配置 APM 代理来监控所有容器。
services: # Application 1
user-service:
image: your-registry/user-service:latest
container_name: user-service
ports:
- "8081:8081"
volumes:
- user_app:/app:ro # Application 2
order-service:
image: your-registry/order-service:latest
container_name: order-service
ports:
- "8082:8082"
volumes:
- order_app:/app:ro # Site24x7 APM (monitors both)
site24x7-apm:
image: site24x7/apminsight-go-agent:latest
container_name: site24x7-apm-agent
privileged: true
pid: host
environment:
- S247_LICENSE_KEY=${S247_LICENSE_KEY}
# Monitor both applications
- GO_APPS=UserService=user-service:8081;OrderService=order-service:8082
volumes:
- /proc:/host/proc:ro
# Mount both application volumes
- user_app:/app_runtime/user:ro
- order_app:/app_runtime/order:ro volumes:
user_app:
driver: local
order_app:
driver: local
在 Docker Swarm/Stack 中部署
在 Swarm 模式下部署时(集群中有多台机器,因此 APM 代理必须在每台机器上运行才能监控整个集群),请将 APM 代理设置为在所有节点上运行,以便对每个节点进行监控。
version: '3.8' services:
your-app:
image: your-go-application:latest
deploy:
replicas: 3
placement:
constraints:
- node.role == worker
volumes:
- app_binary:/app:ro site24x7-apm:
image: site24x7/apminsight-go-agent:latest
# Required capabilities
privileged: true
deploy:
mode: global # Run on every node to monitor all applications
placement:
constraints:
- node.platform.os == linux
environment:
- S247_LICENSE_KEY=${S247_LICENSE_KEY}
- GO_APPS=${GO_APPS}
volumes:
- /proc:/host/proc:ro
- app_binary:/app_runtime:ro volumes:
app_binary:
driver: local
相关文章
