beyla - 基于 eBPF 的 HTTP 和 HTTPS 服务自动检测

Created at: 2023-02-20 21:56:47
Language: C
License: Apache-2.0

格拉法纳贝拉标志

格拉法娜·贝拉

基于 eBPF 的 HTTP/HTTPS/GRPC GO 服务的自动检测,以及用其他语言编写的 HTTP/HTTPS 服务(拦截内核级套接字操作以及 OpenSSL 调用)。

构建状态

开始

要试用 Beyla,你需要运行网络服务让 Beyla 进行检测。Beyla 支持多种编程语言(Go、Java、.NET、NodeJS、Python、Ruby、Rust 等),所以如果你已经有一个示例服务,你可以使用它。如果没有示例,可以从目录下载并运行:

example-http-service.go
examples/

curl -OL https://raw.githubusercontent.com/grafana/beyla/main/examples/example-http-service/example-http-service.go
go run ./example-http-service.go

接下来,生成一些流量。以下命令将触发一个 GET 请求,每两秒 http://localhost:8080 一次。

watch curl -s http://localhost:8080

现在我们已经运行了一个示例,我们可以下载并运行 Beyla。

首先,从 Github 发布页面下载并解压缩最新版本。该版本应包含可执行文件。

./beyla

Beyla 支持多种方式查找要检测的服务(按网络端口、可执行文件名称、进程 ID)和多种公开格式(Prometheus、OpenTelemetry 指标、单跨度跟踪)。

首先,我们将告诉 Beyla 检测在端口 8080(我们的示例服务)上运行的服务,并在端口 9400 上以 Prometheus 格式公开指标。

export BEYLA_PROMETHEUS_PORT=9400
export OPEN_PORT=8080
sudo -E ./beyla

现在,你应该会看到有关 http://localhost:9400/metrics 的指标。

有关详细信息,请参阅文档快速入门教程

要求

  • 内核 4.18 或更高版本的 Linux
  • 在主机中启用了 eBPF
  • 对于检测 Go 程序,它们必须使用 Go 1.17 或更高版本进行编译
  • 执行检测器的管理访问权限
    • 或者从启用该功能的用户执行它。
      SYS_ADMIN
  • 如果你想在内核级别检测HTTP调用(对于Go以外的其他语言),你的内核需要启用BTF(使用CONFIG_DEBUG_INFO_BTF编译)
图书馆 加工
内核级 HTTP 调用
开放SSL库
标准
net/http
大猩猩穆克斯
琴酒
gRPC-Go

Kubernetes

你可以触发文件夹中的 Kubernetes 描述符。

deployments/

  1. 提供你的格拉法纳凭据。使用以下 K8s 秘密模板介绍 Mimir 和 Tempo 的端点、用户名和 API 密钥:

    $ cp deployments/01-grafana-credentials.template.yml 01-grafana-credentials.yml
    $ # EDIT the fields
    $ vim 01-grafana-credentials.yml
    $ kubectl apply -f 01-grafana-credentials.yml 
    
  2. 部署 Grafana 代理:

    kubectl apply -f deployments/02-grafana-agent.yml
    
  3. 部署演示应用,将自动检测器作为挎斗。可以在 deployments/03-instrumented-app.yml 文件中使用博客示例。

    $ kubectl apply -f ./deployments/03-instrumented-app.yml
    $ kubectl port-forward service/goblog 8443:8443
    

你应该能够在 Grafana 板中查询跟踪和指标。

开发配方

如何重新生成 eBPF 内核二进制文件

eBPF 程序嵌入到生成的文件中。通常不需要此步骤,除非你更改文件夹中的 C 代码。

pkg/internal/ebpf/bpf_*
bpf

如果你安装了 Docker,则只需运行:

make docker-generate

如果无法安装 docker,则应在本地安装以下必需的包:

dnf install -y kernel-devel make llvm clang glibc-devel.i686
make generate

在Fedora 35、38和Red Hat Enterprise Linux 8中测试。

捐赠

部分代码取自:https://github.com/open-telemetry/opentelemetry-go-instrumentation