学习如何使用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…",如下图所示:

Testing

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

Span-List

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

要查看详情,请点击任意一个SHOW按钮。下面是来自Zipkin UI的截图,显示了跨度的层次结构。

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后端中查看。要查看跨度,请在浏览器中输入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
    • 由于模块与收集器一起工作,并以OTLP格式发送数据,因此以下指令是必需的。

      exporter

      _ApacheModuleOtelExporterEndpoint_应指向收集器的端点。

    • ServiceNamespaceServiceNameServiceInstanceId应由以下指令提供。

      service
    • 所有其他指令都是可选的,对于本指南可以保持原样。

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

    verify-module
  • 现在,重新启动Apache HTTP Server,OpenTelemetry模块将被仪表化。


  1. docker-compose is deprecated. For details, see Migrate to Compose V2↩︎ ↩︎ ↩︎