使用 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…”消息,如下所示。

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

这显示了已触发到 Apache HTTP Server 的查询或端点的列表,例如 /noindex/css。
要查看详细信息,请单击任何一个 **SHOW** 按钮。下图是 Zipkin UI 中显示 span 层次结构的屏幕截图。

以上显示,在处理此请求时,mod_proxy、mod_proxy_balancer 和 mod_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,如下所示。
在
**/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。您应该会看到类似以下内容。

现在,可以在 Zipkin 后端看到 traces 和 spans。要查看它们,请在浏览器中输入 localhost:9411,然后单击 **Run Query** 按钮。要查看详细信息,请单击
/index.html对应的 **SHOW** 按钮。
我们可以看到,
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,如下所示。
现在,让我们看一下 opentelemetry_module.conf 及其内容。
下面的 LoadFile 是包中包含的依赖库。

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

对于 Apache HTTP Server 2.2,需要使用
libmod_apache_otel22.so而不是libmod_apache_otel.so。以下指令应设置为 ON,OpenTelemetry 模块才能启用,否则将禁用。

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

ApacheModuleOtelExporterEndpoint 应指向 Collector 的端点。
ServiceNamespace、ServiceName 和 ServiceInstanceId 应由以下指令提供。

所有其他指令均为可选,在此指南中可以保持不变。
要验证 OpenTelemetry 模块是否已正确集成到 Apache HTTP Server 中,请键入
httpd -M并查找otel_apache_module (shared)。
现在,重新启动 Apache HTTP Server,OpenTelemetry 模块应已集成。
docker-compose已弃用。详情请参阅 Migrate to Compose V2。 ↩︎ ↩︎ ↩︎