学习如何使用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-compose
is deprecated. For details, see Migrate to Compose V2. ↩︎ ↩︎ ↩︎