PHP 跟踪扩展

Instana 代理需要使用 PHP 跟踪扩展从 PHP 环境中收集跟踪信息。 启用 PHP 传感器后,会自动下载 PHP 跟踪扩展。

需求

下载 Instana PHP 跟踪扩展后,PHP 传感器会将 zzz-instana.ini 文件放入 Additional ini 目录,或将该文件添加到 PHP SAPI 使用的 ini 文件中。

请勿修改 zzz-instana.ini ,因为每次安装时,PHP 传感器都会根据 Instana 代理 configuration.yaml 文件中的首选项覆盖它。

然后,PHP 传感器会尝试重新启动 PHP 环境,将跟踪扩展加载到内存中。 更多信息,请参阅自动重启

zzz-instana.ini 中,PHP 传感器会为大多数情况生成合理的默认值。 不过,您可以调整这些设置,以满足高度特定的需求。 更多信息,请参阅高级自定义

PHP 扩展

要运行 PHP Tracer,必须有 JSON 扩展

不兼容的 PHP 扩展程序

如果在 PHP 运行时检测到以下任何扩展,PHP Tracer 安装将自动禁用:

  • ionCube 装载机
  • SourceGuardian
  • New Relic
  • Dynatrace
  • Datadog

卸载 Instana PHP 跟踪扩展

卸载 Instana 代理不会自动删除 PHP 扩展。 与自动安装不同,卸载需要手动操作。 要卸载 Instana PHP 跟踪扩展,首先需要禁用 PHP 传感器启动。 否则,PHP 传感器启动时会重新安装扩展。 禁用 PHP 传感器后,移除 PHP 跟踪扩展。 有关移除 PHP 跟踪扩展的更多信息,请参阅移除 PHP 跟踪扩展

禁用 PHP 跟踪传感器

要禁用 PHP 跟踪传感器,请完成以下步骤:

  1. 在文本编辑器中打开<agent_install_dir>/etc/instana/configuration.yml。 显示以下条目:
com.instana.plugin.php:
  tracing:
    enabled: true
  1. enabled: true更改为enabled: false。 因为默认情况下已启用跟踪功能,所以注释 false 并不会禁用跟踪功能。

或者,您也可以设置 installExtension: false 以禁用 PHP 跟踪扩展的安装,但保持传感器可接受跟踪。

您需要重新启动该代理程序以应用更改。

禁用传感器不会禁用跟踪扩展。

禁用 PHP 跟踪扩展

当 PHP 传感器安装扩展时,它也会为您的 PHP 安装启用扩展。 启用扩展意味着 PHP 传感器将 zzz-instana.ini 文件放入 Additional Ini 文件夹,或直接在 php.ini.NET 文件夹中启用。

要了解它的启用位置,请运行您对其启用了跟踪的 php 二进制文件。 下面的示例显示了 PHP-FPM 的 PHP 二进制文件:

$> php-fpm7.0 -i | egrep "^(Scan|Loaded)"
Loaded Configuration File => /etc/php/7.0/fpm/php.ini
Scan this dir for additional .ini files => /etc/php/7.0/fpm/conf.d

在本例中, zzz-instana.ini 文件位于 /etc/php/7.0/fpm/conf.d 中。 如果没有 Additional Ini 文件夹,或者该位置不存在 zzz-instana.ini 文件,请检查 php.ini 。 在本例中,文件格式为 /etc/php/7.0/fpm/php.ini

在 Windows 系统中,在 powershell 中运行以下命令,以获取 php.ini 文件的位置或 PHP-CGI 的 Additional Ini 文件夹的位置:

PS C:\> php-cgi -i | Select-String -Pattern '(Scan|Loaded Configuration)' | ForEach-Object { ($_ -replace '<br\s*/?>', "`n") -replace '<[^>]+>', ''}
Loaded Configuration File C:\Php\php.ini
Scan this dir for additional .ini files (none)

对于使用 mod_php 的 Apache ,可将内容为 <?php phpinfo(); 的 PHP 文件放到 Apache 上可访问网络的位置,然后在浏览器中打开该文件,以获取相同的信息。

要禁用 PHP 跟踪扩展,请完成以下步骤:

  1. 用编辑器打开相应的 ini 文件,并在 extension=/path/to/instana.so 行中添加分号 (;) 作为前缀,如下所示。 添加分号可注释该行。

    ;extension=/path/to/instana.so

    或者,完全删除行 extension=/path/to/instana.so 。 如果您打算以后再启用扩展,请不要删除它。

  2. 如果您有 zzz-instana.ini 文件,也可以按以下方法完全删除该文件:

    $> sudo rm /etc/php/7.0/fpm/conf.d/zzz-instana.ini
    

    在 Windows 中,您可以通过在 powershell 中运行以下命令(以管理员身份)来删除该文件:

    PS C:\> Remove-Item -Path C:\Php\conf\zzz-instana.ini
    

    重要: 请勿删除整个 php.ini 文件。

  3. 如果使用预分叉 Worker,则需要重新启动 PHP 主进程。 否则,扩展名将继续保留在内存中。

禁用扩展并不会将其从系统中删除。

删除 PHP 跟踪扩展

PHP 在找不到扩展时会记录启动错误,因此在删除扩展之前,还必须禁用它。 更多信息,请参阅禁用 PHP 跟踪扩展

PHP 传感器会将 Instana PHP 跟踪扩展放到 extension_dir 设置中指定的目录中, php.ini。 要了解该设置,请运行已启用跟踪的 php 二进制文件。 下面的示例显示了 PHP-FPM 的 PHP 二进制文件:

$> php-fpm7.0 -i | egrep ^extension_dir
extension_dir => /usr/lib/php/20151012 => /usr/lib/php/ext

对于使用 mod_php 的 Apache ,可将内容为 <?php phpinfo(); 的 PHP 文件放到 Apache 上可访问网络的位置,然后在浏览器中打开该文件,以获取相同的信息。

PHP 传感器只使用第一个值,因此在示例中可以找到扩展名 at/usr/lib/php/20151012php.iniinstana.ini中也提供了此扩展的路径。

在 Windows 系统中,您可以在 powershell 中运行以下命令来查找 extension_dir

PS C:\> php-cgi -i | Select-String -Pattern 'extension_dir' | ForEach-Object { ($_ -replace '<br\s*/?>', "`n") -replace '<[^>]+>', ' '}
  extension_dir  C:\php\ext  C:\php\ext

要删除扩展名,请运行以下命令:

$> sudo rm /usr/lib/php/20151012/instana.so

在 Windows 系统中,您可以在 powershell 中(以管理员身份)运行以下命令来删除该文件:

PS C:\> Remove-Item -Path C:\Php\ext\instana.dll

如果您使用的是预分叉 Worker,并且在禁用扩展时没有重启 PHP 主进程,则需要现在重启才能使更改生效。

高级定制

PHP 传感器经常覆盖 zzz-instana.ini ,因此请勿对其进行更改。 不过,还可以再添加一个文件(例如 zzz-instana-extras.ini )。在容器化场景中,该文件可以动态挂载或作为镜像的一部分。

以下设置适用于所有 PHP 版本:

  • instana.batch_threshold_us:对跨度进行批处理的长度和距离阈值。 缺省值是 10000。
  • instana.backtrace_limit:控制记录的调用堆栈的深度。 默认值或上限为 25 个条目。
  • instana.disabled_instrumentation:要禁用的工具的位掩码。 默认值为 0(无)。
  • instana.disable_userland_tracing:禁用对非本地扩展(例如框架和其他 PHP 用户态代码)的所有跟踪。 默认值为 0(关闭)。
  • instana.enable_cli:启用或禁用 CLI SAPI 的跟踪功能。 1 = 开启。 0 = 关闭。 默认值为 0(关闭)。
  • instana.log_level:日志级别:0 = 关闭、1 = ERROR、2 = WARN、3 = INFO 和 4 = DEBUG。 默认值为 0(关闭)。
  • instana.segfault_error_log:捕获或避免对 PHP 的错误日志进行回溯。 默认值为 0(关闭)。
  • instana.span_chunk_size:在发送给代理之前,PHP 内存中要保留的跨度数。 这个数字直接影响批次。 例如,"1 "的分块可有效禁用批处理。

以下设置为 PHP 5 所独有:

  • instana.socket:Instana PHP 传感器的 TCP 插口地址。 套接字地址在安装期间确定,并且缺省为 tcp://127.0.0.1:16816。

以下设置为 PHP 7.0 及更高版本所独有:

  • instana.buffer_hard_limit:如果代理无响应,缓冲区中保留的最大跨度数。 从最老的跨度开始丢弃,直到缓冲区在此限制范围内。 缺省值是 1000。
  • instana.buffer_maximum_delay_ms:跨度缓冲区后续清除的最大间隔时间。 默认值为 1000 毫秒。
  • instana.buffer_soft_limit:清除跨度缓冲区之前缓冲的最大跨度数。 缺省值为 500。

下表是用于配置 PHP 扩展的环境变量的完整列表:

环境变量 缺省值
INSTANA_AGENT_HOST 127.0.0.1
INSTANA_AGENT_PORT 42699
INSTANA_SERVICE_NAME
INSTANA_DEBUG OFF
INSTANA_STACK_TRACE_LENGTH 25
INSTANA_EXTRA_HTTP_HEADERS
INSTANA_SECRETS password, key, secret
INSTANA_LOG_LEVEL

这些环境变量的存在优先于 zzz-instana.ini 中的配置。 更多信息,请参阅环境变量

下列位标志可供 instana.disabled_instrumentation 使用:

  • STREAMS 1
  • PHP 2
  • PDO 4
  • CURL 8
  • REDIS 16
  • MONGODB 32
  • MYSQL 64
  • MEMCACHE 128
  • DB2 256
  • OCI 512
  • SHELL 1024
  • PECL_HTTP 2048
  • REQUEST_HEADERS 4096
  • RESPONSE_HEADERS 8192
  • SOAP 16384
  • WORDPRESS 32768
  • AMQP 65536(适用于pecl-amqpphp-amqp-lib
  • ELASTICSEARCH 131072
  • EXCEPTIONS 262144
  • LOGGERS 524288
  • COUCHBASE 1048576
  • TWIG 2097152
  • SYMFONY 4194304
  • GOOGLE_PUBSUB 268435456
  • openldap 536870912

这些标记无法通过名称进行配置。 您必须使用它们的数值来禁用仪器。

如果您在这些设置方面需要帮助,请联系 IBM 支持中心。

自动重启

PHP 传感器会根据 PHP 设置自动下载并安装相应的 PHP 跟踪扩展。 此外,传感器还会尝试重新启动 PHP 环境,以便将扩展加载到内存中。 目前,Apache 和 PHP-FPM 支持自动重新启动。 PHP-CGI 环境需要手动或脚本处理。

您可以通过 notificationScript 配置设置更改 PHP 传感器尝试重启 PHP 环境的方式。 在 Windows 系统中,该设置使用可执行 shell 脚本或 powershell 脚本的绝对路径。 只要当前安装的跟踪扩展版本与安装的代理程序版本不同,就会触发此脚本。

通知脚本在每个 PHP 运行时运行一次,这意味着只有在有 2 个或更多进程运行同一个 PHP 可执行文件时,才会触发脚本一次。 因此,如果希望 PHP 跟踪扩展载入运行特定 PHP 的所有进程,请确保脚本重启了运行该 PHP 的所有进程。

配置并成功运行该脚本后,它将覆盖自动重启的默认机制。 与默认机制不同的是,该脚本会在任何 SAPI 中执行,因此可用于自动重启 PHP-CGI 环境。 如果要完全禁用自动重启,请配置一个空脚本。

PHP 传感器会为脚本的执行设置以下环境变量:

INSTANA_EXT_VERSION_OLD = the version of the tracing extension currently in memory
INSTANA_EXT_VERSION_NEW = the version of the tracing extension after a restart
INSTANA_PID_HOST = the PID of the process on the host, e.g. your Apache, PHP-FPM or PHP-CGI
INSTANA_PID_CONTAINER = the PID the host process has in a container (if applicable)
INSTANA_CONTAINER = the ID/name of the container the process is running in (if applicable)

下面的示例显示了一个将扩展名更改记录到文件中并重新启动 Apache 的脚本:

#!/bin/bash
echo "Found new tracing extension." >> php_update.log;
echo "INSTANA_EXT_VERSION_OLD=$INSTANA_EXT_VERSION_OLD" >> php_update.log;
echo "INSTANA_EXT_VERSION_NEW=$INSTANA_EXT_VERSION_NEW" >> php_update.log;
echo "INSTANA_PID_HOST=$INSTANA_PID_HOST" >> php_update.log;
echo "INSTANA_PID_CONTAINER=$INSTANA_PID_CONTAINER" >> php_update.log;
echo "INSTANA_CONTAINER=$INSTANA_CONTAINER" >> php_update.log;
echo "restarting apache" >> php_update.log;
apachectl -k graceful >> php_update.log;

如果 Apache 在容器内运行,请将示例脚本中的最后一行替换为下面一行:

docker exec $INSTANA_CONTAINER apachectl -k graceful;

对于 PHP-FPM,可以发送 SIGUSR2 以优雅地重新启动它,如下例所示:

docker exec $INSTANA_CONTAINER kill -USR2 $INSTANA_PID_CONTAINER;

优雅重启会将 PHP 扩展程序加载到内存中,而无需重启主进程。 因此,即使进程在容器内以 PID 1 运行,这种加载也能正常工作。 如果不能或不想使用重启方法,也可以创建一个正在运行的容器实例快照,停止它,然后轻松打开一个新实例:

#!/bin/bash
IMAGE_HASH=$(docker inspect --format='{{.Config.Image}}' $INSTANA_CONTAINER)
IMAGE_NAME=$(docker images | grep $IMAGE_HASH | awk '{print $1}')
IMAGE_TAG="instana-php-$INSTANA_EXT_VERSION_NEW"
docker commit $INSTANA_CONTAINER $IMAGE_NAME:$IMAGE_TAG &&
docker stop $INSTANA_CONTAINER &&
docker run -d --rm $IMAGE_NAME:$IMAGE_TAG

此操作使用传递给脚本的容器 ID 查找容器映像的名称。 然后,它会将当前运行的容器提交到一个新的映像中,该映像标记有新的 PHP 扩展版本号。 然后,它会停止原始容器,并从新标记的图像启动一个容器。 虽然该操作会再次触发 PHP 传感器中的安装程序,但不会再次触发通知脚本,因为扩展程序已经安装。

这些示例假定您使用 Docker 作为容器引擎。 但由于触发的 shell 脚本完全由你控制,你可以根据自己的设置设置自动重启所需的任何逻辑。

捕捉自定义 HTTP 标头

PHP Tracer 可以捕捉进入和退出跨度中的自定义 HTTP 头信息。 要捕获这些标头,请配置 INI 设置 instana.extra_http_headers 或环境变量 INSTANA_EXTRA_HTTP_HEADERS. 在两种配置中都指定标头列表作为值。

使用 INI 设置:

instana.extra_http_headers=HEADER1,HEADER2

使用环境变量:

INSTANA_EXTRA_HttP_HEADERS=HEADER1;HEADER2

作为选项,Instana 代理可以通过在 configuration.yaml 中设置头信息列表,捕获每个跟踪请求或响应的 HTTP 头信息。 更多信息,请参阅捕获自定义 HTTP 标头

PHP Tracer 在标题键和值中都保留了空格。

故障诊断

Instana 用户界面中没有 PHP 痕迹

重要: 确保使用受支持的 PHP 版本。 有关详细信息,请参阅支持的 PHP 版本

如果使用 Plesk,则需要运行 plesk bin php_handler --reread

如果在 PHP 应用程序的 Instana UI 中看不到任何痕迹,请完成以下步骤:

  1. 验证以下前提条件:

  2. 重新加载 PHP 跟踪扩展,方法是在运行 PHP 应用程序的服务上运行以下 reload 命令重新加载 PHP 跟踪扩展:

    • 供 Apache :

      systemctl reload apache2
      
    • 对于 PHP-FPM:

      systemctl reload php<version>-fpm
      

      将 reload 命令中的 <version> 替换为系统中安装的实际版本。

如果在 Instana UI 中仍然看不到任何痕迹,而操作系统默认包含 SELinux 或出于安全目的将其添加到环境中,则 SELinux 可能是造成问题的原因。

PHP Tracer 扩展通过 Unix TCP 套接字 <socket path> 与 PHP 守护进程通信,并通过 TCP/IP 端口 42699 与 Instana 代理通信。 当 SELinux 设置为强制模式时,除非 SELinux 被配置为允许,否则它将阻止 PHP 扩展和守护进程相互通信。

要验证 SELinux 是否是造成该问题的原因,请检查 /var/log/audit/audit.log ,查看 PHP 守护进程是否记录了任何静默拒绝。 或者,您也可以完成以下步骤进行烟雾测试:

  1. 暂时禁用 SELinux。
  2. 重启 PHP 守护进程。

如果 SELinux 被确定为导致问题的原因,可以使用以下任一选项来解决:

  • 配置 SELinux 以允许 PHP Tracer 通信:有了 SELinux,你可以按照自己的安全策略配置自定义策略,以允许通信。 有关创建和修改 SELinux 策略的更多信息,请参阅以下链接:

  • 将 SELinux 设置为允许模式:在此模式下,您的服务可以不受限制地运行。 您可以通过重启服务器恢复默认设置。 要将 SELinux 设置为允许模式,请参阅 SELinux 允许模式

  • 禁用 SELinux:Instana 并不鼓励您禁用安全软件。 正确而安全的方法是创建 SELinux 策略。 不过,如果决定禁用 SELinux,请参阅禁用 Linux

启用日志记录

默认情况下,日志记录是关闭的。 要启用该功能,请参阅以下步骤。

  • 使用环境变量启用日志记录。
  1. 要将日志级别设置为调试,请将 INSTANA_DEBUG 设置为 TRUEINSTANA_LOG_LEVEL=4
  • 使用 INI 文件启用日志记录。
  1. 在 PHP 安装的扫描目录中找到名为 zzz-instana.ini 的文件。 例如,运行 php --ini | grep zzz-instana.iniphp-fpm<version> -i | grep zzz-instana.ini 就会显示其位置。

  2. instana.log_level=4 一行添加到 zzz-instana.ini

  3. 运行所选的 PHP 运行时,确保输出中有日志记录,并启用扩展。 例如,可以运行 php --ri instanaphp-fpm<version> -i | grep instana 进行验证。

    示例:

    [instana.INFO] Initializing, logging at level 4
    
  4. 按照此处所述重新加载 PHP 跟踪扩展。 重要: 跳过这一步最终将导致无法记录。

日志会被导入安装了 PHP 跟踪扩展的 PHP 运行时。 因此,其精确位置在很大程度上取决于其配置。 通常的位置包括 /var/log/apache2/error.log (用于 Apache2 )和 /var/log/php<version>-fpm.log (用于 PHP-FPM)。

手动安装 PHP 跟踪扩展

要手动安装 PHP 跟踪扩展,请完成以下步骤:

  1. 下载 Instana PHP 跟踪扩展,如下所示:

    1. 从以下资源库下载 shell 脚本:

      https://artifact-public.instana.io/artifactory/shared/com/instana/php/instana-ext-download-script/php-instana-ext-download-script.sh
      
    2. 运行 shell 脚本下载适合您环境的扩展。 以下命令显示了可用选项:

      ./php-instana-ext-download-script.sh -a <aarch64/x86_64> -l <musl/glibc> -p <PHP version> -t <NTS/ZTS> -d <serverless/native> -s <OpenSSL version> -v <Instana extension version>
      
      • 对于 PHP 版本,请提供主版本号和次版本号。 例如,要下载用于 PHP 的 Instana 扩展程序 8.4.12 ,请运行标有 -p 8.4 的 shell 脚本。

      • 对于 OpenSSL 版本,请使用 -s ssl1 选项下载支持 OpenSSL 1.1 的扩展,或使用 -s ssl3 下载支持 OpenSSL 3.x 的扩展。

      • 对于 Instana 扩展程序版本,默认值为 release ,可下载最新版本。 使用 -v 标志下载任何特定版本的人工制品。 例如,运行带有 -v 4.7.0 的脚本,即可下载发布版本为 4.7.0 的扩展。

      • 要查看脚本的所有可用选项,请运行以下命令:

        ./php-instana-ext-download-script.sh
        
  2. 安装扩展的步骤如下:

    1. 将下载的 .so 文件移至 PHP CLI 扩展目录。

    2. 创建一个 INI 文件 zzz-instana.ini ,如下例所示,并将其保存到 PHP CLI 附加 INI 目录中。 将 <hostIP> 替换为 Instana 代理服务器主机的 IP 地址,这样就可以从 PHP 环境访问代理服务器。

      ; this file was automatically generated by Instana
      ;
      ; any changes made to this file are expected to be overwritten when
      ; a new version of the Instana PHP Tracer extension is installed
      [instana]
      extension=<php cli extension dir path where extension.so file is placed>
      instana.socket=<hostIP>:16816
      instana.agent_endpoint=http://<hostIP>:42699
      instana.use_agent_endpoint=1
      instana.auto_profile_socket=tcp://<hostIP>:42699
      instana.enable_auto_profile=0
      instana.secrets_matcher=contains-ignore-case
      instana.secrets_list="key,pass,secret"
      instana.extra_http_headers=
      instana.pid_in_root_namespace=<pid of PHP process in hostnamespace>
      instana.enable_cli=1