学习如何使用OpenTelemetry仪表化Apache Http Server
如果您正在使用Apache HTTP Server,并急需一些可观测性工具来监控您的Web服务器,那么[Apache HTTP Server的OpenTelemetry模块][]就是适合您的选择:它可以跟踪服务器的传入请求,并捕获涉及到这些传入请求的许多模块(包括mod_proxy)的响应时间。通过这个工具,您将获得每个模块的层次化时间消耗。本文演示了OpenTelemetry模块对Apache HTTP Server的监控能力,并提供了使用该模块的快速指南。
开始使用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的Docker容器,该容器包含了CentOS 7映像、OpenTelemetry Collector和Zipkin后端。
OpenTelemetry模块会被配置和安装在所需的位置,并且Apache HTTP Server将启动该OpenTelemetry模块。
在后端查看跨度
如docker-compose.yml所述,webserver_centos7监听端口9004,Zipkin监听端口9411,而OpenTelemetry Collector监听端口4317。
要发送请求到Apache HTTP Server,您可以在终端使用curl命令(curl localhost:9004),或在任何浏览器中访问localhost:9004。您将看到一个默认的Centos Apache HTTP Server欢迎页面,内容为"Testing 123…",如下图所示:

现在,跨度可以在Zipkin后端中查看。要查看跨度,请在浏览器中访问localhost:9411,然后点击Run Query按钮。下面是一个来自Zipkin UI的截图,显示了Apache HTTP Server发送的跨度。

这显示了已经触发到Apache HTTP Server的查询或终端,例如/noindex/css。
要查看详情,请点击任意一个SHOW按钮。下面是来自Zipkin UI的截图,显示了跨度的层次结构。

以上截图显示了在此请求的处理过程中,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后端中查看。要查看跨度,请在浏览器中输入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模块,否则将被禁用。

-
由于模块与收集器一起工作,并以OTLP格式发送数据,因此以下指令是必需的。

_ApacheModuleOtelExporterEndpoint_应指向收集器的端点。
-
ServiceNamespace、ServiceName和ServiceInstanceId应由以下指令提供。
-
所有其他指令都是可选的,对于本指南可以保持原样。
-
-
要验证OpenTelemetry模块是否已正确启用到Apache HTTP Server中,请输入
httpd -M并查找otel_apache_module (shared)。
-
现在,重新启动Apache HTTP Server,OpenTelemetry模块将被仪表化。
-
docker-composeis deprecated. For details, see Migrate to Compose V2. ↩︎ ↩︎ ↩︎