使用 OpenTelemetry 检测 Apache Http Server

博客文章在发布后不会更新。这篇文章已经发布一年多了,其内容可能已过时,部分链接可能无效。在依赖任何信息之前,请务必核实。

如果您正在使用 Apache HTTP Server 并且迫切需要某种可观测性工具来监控您的 Web 服务器,那么 Apache HTTP Server 的 OpenTelemetry 模块是您的理想选择:它能够对进入服务器的请求进行跟踪,并捕获涉及此类传入请求的许多模块(包括 mod_proxy)的响应时间。通过此,您将获得每个模块的层次化时间消耗。本文将演示 Apache HTTP Server 的 OpenTelemetry 模块的监控功能以及该模块的入门快速指南。

OpenTelemetry 模块入门

构建模块

开始使用 Apache HTTP Server 的 OpenTelemetry 模块非常简单,您只需要一个 docker 引擎和 git。从 GitHub 下载源代码,然后为 CentOS7 构建 Docker 镜像1

git clone https://github.com/open-telemetry/opentelemetry-cpp-contrib
cd  instrumentation/otel-webserver-module
docker compose --profile centos7 build

这些命令下载所有必需的依赖项,构建 Apache HTTP Server 的 OpenTelemetry 模块,并在 Docker 镜像上安装它。

注意:上述命令可能需要大约 1 小时才能完成。

构建完成后,键入以下命令运行 Docker 镜像1

docker compose --profile centos7 up -d

上述命令将启动一个名为 webserver_centos7 的 centos7 镜像 Docker 容器,其中包含 OpenTelemetry Collector 和一个 Zipkin 后端。

Apache HTTP Server 的 OpenTelemetry 模块将被配置并安装到所需位置,同时 Apache HTTP Server 将使用 OpenTelemetry 模块启动。

在后端查看 spans

docker-compose.yml 中所述,webserver_centos7 监听端口 9004,Zipkin 监听端口 9411,OpenTelemetry Collector 监听端口 4317。

要向 Apache HTTP Server 发送请求,您可以使用终端中的 curl(curl localhost:9004),或在任何浏览器中访问 localhost:9004。Apache HTTP Server 在 Centos 上的默认登录页面将显示“Testing 123…”消息,如下所示。

Testing

现在,可以在 Zipkin 后端看到 traces 和 spans。要查看它们,请在浏览器中访问 localhost:9411,然后单击 **Run Query** 按钮。下图是 Zipkin UI 中显示 Apache HTTP Server 发出的 spans 的屏幕截图。

Span-List

这显示了已触发到 Apache HTTP Server 的查询或端点的列表,例如 /noindex/css

要查看详细信息,请单击任何一个 **SHOW** 按钮。下图是 Zipkin UI 中显示 span 层次结构的屏幕截图。

A screenshot from the Zipkin UI showing the span hierarchy

以上显示,在处理此请求时,mod_proxymod_proxy_balancermod_dav 参与了请求处理,并显示了每个模块消耗的时间。

模块级详细信息有何益处?

为了演示模块级详细信息的益处,我们将向 PHP 脚本引入人为延迟,并观察延迟如何在 Zipkin 后端显示。需要执行以下步骤。

  • 登录到容器并安装 PHP 模块。

    docker exec -it webserver_centos7 /bin/bash
    yum install php -y
    
  • /etc/httpd/conf/httpd.conf 中添加 AddType application/x-httpd-php .html,如下所示。

    Php-Config
  • **/var/www/html** 目录中创建一个名为 index.html 的文件,并添加以下文本。

    <!doctype html>
    <html>
      <head>
        <title>PHP Test Page</title>
      </head>
    
      <body>
        <?php echo date('h:i:s') . "<br />"; echo "Introduce delay of 1 seconds" .
        "<br />"; sleep(1); echo date('h:i:s'); ?>
      </body>
    </html>
    
  • 重新启动服务器

    httpd -k restart
    
  • 现在,访问 localhost:9004/index.html。您应该会看到类似以下内容。

    Php-Response
  • 现在,可以在 Zipkin 后端看到 traces 和 spans。要查看它们,请在浏览器中输入 localhost:9411,然后单击 **Run Query** 按钮。要查看详细信息,请单击 /index.html 对应的 **SHOW** 按钮。

    Span-Delay
  • 我们可以看到,mod_php5.c_handler 消耗了大约 **1 秒**,这贡献了请求的总时间消耗。

当 HTTP 请求流经各个模块时,执行延迟或错误可能发生在参与请求的任何模块中。为了识别请求处理中任何延迟或错误的根本原因,模块级信息(例如各个模块的响应时间)将增强 Apache HTTP Server 的可调试性。

在目标系统中安装 OpenTelemetry 模块

要使用 Apache HTTP Server 的 OpenTelemetry 模块,请按照以下步骤提取包并将其安装到安装了 Apache HTTP Server 的目标系统上。

  • 为了克隆源代码,请执行以下操作。

    git clone https://github.com/open-telemetry/opentelemetry-cpp-contrib
    cd  opentelemetry-cpp-contrib/instrumentation/otel-webserver-module
    
  • 触发构建命令以在 Docker 镜像内生成包1

    docker compose --profile centos7 build
    

上述过程可能需要大约一个小时才能构建完成。这将在 Centos 7 镜像上作为 apache_centos7 进行构建。

  • 构建完成后,就可以提取镜像了。我们需要启动容器,可以通过以下命令完成。

    docker run -idt --name <container_name> apache_centos7 /bin/bash
    

上述命令将运行容器,可以使用 docker ps 命令进行验证。

  • 容器内生成的包位于 /otel-webserver-module/build 目录中。可以使用以下方式将其提取到主机系统:

    docker cp <container_name>:/otel-webserver-module/build/opentelemetry-webserver-sdk-x64-linux.tgz <target-directory>
    

注意:上述包应适用于任何具有 **x86-64** 指令集且 glibc 版本大于 2.17 的 Linux 发行版。撰写此博客时,不支持其他架构。

  • 将上述包以及 opentelemetry_module.conf 传输到目标系统。

  • 将包 opentelemetry-webserver-sdk-x64-linux.tgz 解压缩到 /opt 目录。

    tar -xvf opentelemetry-webserver-sdk-x64-linux.tgz -C /opt
    
  • 现在,通过执行以下命令安装模块:

    cd /opt/opentelemetry-webserver-sdk
    ./install.sh
    
  • 在 Centos 的情况下,Apache HTTP Server 的配置文件通常位于 /etc/httpd/conf/。因此,将 opentelemetry_module.conf 复制到 /etc/httpd/conf

  • 编辑 /etc/httpd/conf/httpd.conf 文件,并在文件末尾添加 Include conf/opentelemetry_module.conf,如下所示。

    Conf
  • 现在,让我们看一下 opentelemetry_module.conf 及其内容。

    • 下面的 LoadFile 是包中包含的依赖库。

      LoadFile
    • 下面的配置是为 OpenTelemetry 模块设置的。

      LoadModule

      对于 Apache HTTP Server 2.2,需要使用 libmod_apache_otel22.so 而不是 libmod_apache_otel.so

    • 以下指令应设置为 ON,OpenTelemetry 模块才能启用,否则将禁用。

      enabled
    • 由于该模块与 Collector 一起工作并通过 OTLP 格式发送数据,因此需要以下指令。

      exporter

      ApacheModuleOtelExporterEndpoint 应指向 Collector 的端点。

    • ServiceNamespace、ServiceName 和 ServiceInstanceId 应由以下指令提供。

      service
    • 所有其他指令均为可选,在此指南中可以保持不变。

  • 要验证 OpenTelemetry 模块是否已正确集成到 Apache HTTP Server 中,请键入 httpd -M 并查找 otel_apache_module (shared)

    verify-module
  • 现在,重新启动 Apache HTTP Server,OpenTelemetry 模块应已集成。


  1. docker-compose 已弃用。详情请参阅 Migrate to Compose V2。 ↩︎ ↩︎ ↩︎