怎样在Docker中配置OpenTelemetry运行Hyperf

胖浩姑娘_1740

胖浩姑娘_1740

2026-09-19

686人浏览

原创

Hyperf 3.0 在 Docker 中集成 OpenTelemetry 的核心是使用 opentelemetry-php SDK + OTLP 协议替代 jaeger-client-php,需在主协程启动前初始化 TracerProvider、HTTP 中间件正确提取 traceparent、DB/Redis 调用显式继承 Span 上下文,并通过 OpenTelemetry Collector 统一导出至 Jaeger 等后端。

怎样在docker中配置opentelemetry运行hyperf

在 Docker 中为 Hyperf 应用配置 OpenTelemetry,核心是让 PHP 应用(通过 opentelemetry-php SDK)采集追踪数据,并将数据导出到兼容 OTLP 的后端(如 Jaeger、Zipkin 或 OpenTelemetry Collector)。Hyperf 本身不内置 OpenTelemetry 支持,需手动集成 SDK 并借助扩展(如 opentelemetry-ext 或自定义中间件/装饰器)实现自动 instrumentation。

1. 准备基础环境:Docker + Hyperf + OpenTelemetry PHP SDK

确保使用支持 OpenTelemetry 的 PHP 扩展或纯 PHP SDK。推荐方式是使用官方维护的 opentelemetry-php(v1.x),它支持 OTLP/gRPC 和 OTLP/HTTP 导出,且兼容 Swoole(Hyperf 底层)。

Dockerfile 中安装必要依赖:

# 基于 Hyperf 官方镜像(如 hyperf/hyperf:8.2-alpine-v4)
FROM hyperf/hyperf:8.2-alpine-v4
<h1>安装 gRPC 扩展(用于 OTLP/gRPC,可选;若用 HTTP 则无需)</h1><p>RUN apk add --no-cache grpc-dev && \
pecl install grpc && \
docker-php-ext-enable grpc</p><h1>安装 OpenTelemetry PHP SDK(通过 Composer)</h1><p>WORKDIR /var/www
COPY composer.* ./
RUN composer install --no-dev --optimize-autoloader -n</p><h1>复制应用代码</h1><p>COPY . .
</p>

2. 配置 OpenTelemetry SDK(PHP 端)

在 Hyperf 启动流程中初始化全局 TracerProvider。推荐在 config/autoload/opentelemetry.php 中定义配置,并通过 DiBootstrap 注入。

关键步骤:

  • 创建 TracerProvider,使用 OtlpExporter(gRPC 或 HTTP)
  • 设置采样策略(如 AlwaysOnSamplerParentBased
  • 注册全局 Tracer 实例供中间件或服务调用
  • 可选:启用自动 HTTP 请求、MySQL、Redis 等插件(需额外安装 opentelemetry-instrumentation-* 包)

示例初始化代码(放在 app/Bootstrap/OpenTelemetryBootstrap.php):

use OpenTelemetry\API\Globals;
use OpenTelemetry\SDK\Trace\TracerProvider;
use OpenTelemetry\SDK\Trace\Export\BatchSpanProcessor;
use OpenTelemetry\Exporter\Otlp\OtlpExporter;
use OpenTelemetry\SDK\Trace\Sampling\AlwaysOnSampler;
<p>$exporter = new OtlpExporter(
'<a href="https://www.php.cn/link/edb518e0388521905d2302d973250478">https://www.php.cn/link/edb518e0388521905d2302d973250478</a>', // 使用 HTTP/JSON 方式(更易调试)
null,
['Content-Type' => 'application/json']
);
$processor = new BatchSpanProcessor($exporter);
$tracerProvider = new TracerProvider(new AlwaysOnSampler(), $processor);</p><p>Globals::setTracerProvider($tracerProvider);
</p>

并在 bin/hyperf.php 启动前加载该 Bootstrap。

Docker Container Cleaner
Docker Container Cleaner

CLI工具,用于清理已停止的Docker容器、未使用的镜像、卷和网络,释放磁盘空间。

下载

3. 在 Hyperf 中注入追踪逻辑

Hyperf 默认不自动埋点,需手动或半自动添加 Span。常用方式:

  • HTTP Server 中间件:在请求入口创建 root span,注入 trace context 到 ServerRequestInterface,并结束 span 在响应后
  • 装饰器/注解:对 Controller 方法或 Service 方法加注解,用 AOP 自动包裹 span
  • 数据库/Redis 客户端增强:利用 Hyperf 的 PoolProxy 机制,在执行 SQL/命令前后记录 span

简单中间件示例(app/Middleware/TracingMiddleware.php):

use OpenTelemetry\API\Trace\Span;
use OpenTelemetry\API\Trace\Tracer;
use OpenTelemetry\API\Globals;
<p>class TracingMiddleware implements MiddlewareInterface
{
public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
{
$tracer = Globals::getTracerProvider()->getTracer('hyperf-app');
$span = $tracer->spanBuilder($request->getMethod() . ' ' . $request->getUri()->getPath())
->setParent(Context::getCurrent())
->startSpan();
Context::storage()->set(Span::class, $span);</p><pre class="brush:php;toolbar:false;">    try {
        $response = $handler->handle($request);
        $span->setStatus(StatusCode::STATUS_OK);
        return $response;
    } catch (\Throwable $e) {
        $span->setStatus(StatusCode::STATUS_ERROR, $e->getMessage());
        throw $e;
    } finally {
        $span->end();
    }
}

}

4. Docker Compose 编排 OpenTelemetry Collector 和后端

不建议 PHP 直连 Jaeger/Zipkin,而是通过 OpenTelemetry Collector 统一接收、处理、转发。它支持多协议、采样、过滤、打标等能力。

示例 docker-compose.yml

version: '3.8'
services:
  app:
    build: .
    environment:
      - OTEL_EXPORTER_OTLP_ENDPOINT=http://otel-collector:4318
    depends_on:
      - otel-collector
<p>otel-collector:
image: otel/opentelemetry-collector:0.115.0
command: ["--config=/etc/otel-collector-config.yaml"]
volumes:</p>
  • ./otel-collector-config.yaml:/etc/otel-collector-config.yaml ports:
  • "4317:4317" # OTLP/gRPC
  • "4318:4318" # OTLP/HTTP
  • "8888:8888" # Prometheus metrics

jaeger: image: jaegertracing/all-in-one:1.55 ports:

  • "16686:16686" # UI
  • "14250:14250" # gRPC for collector

配套 otel-collector-config.yaml 示例(将 traces 转发至 Jaeger):

receivers:
otlp:
protocols:
http:
grpc:
<p>processors:
batch:</p><p>exporters:
jaeger:
endpoint: jaeger:14250
tls:
insecure: true</p><p>service:
pipelines:
traces:
receivers: [otlp]
processors: [batch]
exporters: [jaeger]
</p>

配置完成后,启动 docker-compose up,访问 http://localhost:16686 即可查看 Hyperf 请求链路。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
k8s和docker区别
k8s和docker区别

k8s和docker区别有抽象层次不同、管理范围不同、功能不同、应用程序生命周期管理不同、缩放能力不同、高可用性等等区别。本专题为大家提供k8s和docker区别相关的各种文章、以及下载和课程。

2023.07.24

625

4

docker进入容器的方法有哪些
docker进入容器的方法有哪些

docker进入容器的方法:1. Docker exec;2. Docker attach;3. Docker run --interactive --tty;4. Docker ps -a;5. 使用 Docker Compose。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.08

4199

6

docker容器无法访问外部网络怎么办
docker容器无法访问外部网络怎么办

docker 容器无法访问外部网络的原因和解决方法:配置 nat 端口映射以将容器端口映射到主机端口。根据主机兼容性选择正确的网络驱动(如 host 或 overlay)。允许容器端口通过主机的防火墙。配置容器的正确 dns 服务器。选择正确的容器网络模式。排除主机网络问题,如防火墙或连接问题。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.08

5037

6

docker镜像有什么用
docker镜像有什么用

docker 镜像是预构建的软件组件,用途广泛,包括:应用程序部署:简化部署,提高移植性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.08

1873

7

Docker容器化部署与DevOps实践
Docker容器化部署与DevOps实践

本专题面向后端与运维开发者,系统讲解 Docker 容器化技术在实际项目中的应用。内容涵盖 Docker 镜像构建、容器运行机制、Docker Compose 多服务编排,以及在 DevOps 流程中的持续集成与持续部署实践。通过真实场景演示,帮助开发者实现应用的快速部署、环境一致性与运维自动化。

2026.02.11

199

16

Docker 容器部署
Docker 容器部署

本专题整合了Docker容器部署相关内容,阅读专题下面的文章了解更多详细操作教程。

2026.03.31

351

14

Java容器化部署与Docker实践教程合集
Java容器化部署与Docker实践教程合集

聚焦 Java 应用的容器化与云原生部署,讲解 Dockerfile 编写规范与 Java 应用镜像构建、多阶段构建(Multi-stage Build)减小镜像体积、Jib / Buildpacks 免 Dockerfile 镜像构建方案、JVM 容器感知参数(-XX:MaxRAMPercentage)配置、Docker Compose 编排多服务(应用 + MySQL + Redis)、容器健康检查与资源限制、Kubernetes

2026.05.11

340

26

Go Docker与容器化部署教程合集
Go Docker与容器化部署教程合集

聚焦 Go 应用的容器化部署优势与实践,讲解 Go 静态编译特性(CGO_ENABLED=0)与 scratch / distroless 极小基础镜像构建、多阶段 Dockerfile 编写规范、交叉编译生成目标平台二进制、镜像安全扫描(Trivy)与漏洞修复、Docker Compose 本地编排开发环境、Kubernetes Deployment / Service / ConfigMap 部署 Go 服务、健康检查(Livene

2026.05.15

245

24

Hyperf 项目部署运维与性能调优手册
Hyperf 项目部署运维与性能调优手册

聚焦 Hyperf 在生产环境的落地,包含 Docker 高效打包、Swoole 配置优化、常见的内存溢出(OOM)问题排查方法以及热更新方案。

2026.05.19

365

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpMyAdmin 安装文档
phpMyAdmin 安装文档

共0课时 | 0人学习

Docker 官方文档
Docker 官方文档

共0课时 | 0人学习

宝塔 Docker 模块使用手册
宝塔 Docker 模块使用手册

共0课时 | 0人学习