Exporters

发送遥测数据到 OpenTelemetry Collector,以确保其正确导出。在生产环境中使用 Collector 是一种最佳实践。要可视化您的遥测数据,请将其导出到后端,例如 JaegerZipkinPrometheus特定厂商 的后端。

可用导出器

该注册表包含一个PHP导出器列表

在导出器中,OpenTelemetry Protocol (OTLP) 导出器是按照 OpenTelemetry 数据模型设计的,可以无损地发出 OTel 数据。此外,许多处理遥测数据的工具都支持 OTLP(例如 PrometheusJaeger 和大多数 厂商),为您提供高度的灵活性。要了解更多关于 OTLP 的信息,请参阅 OTLP 规范

本页介绍主要的OpenTelemetry PHP导出器以及如何设置它们。

OTLP

要将跟踪数据发送到OTLP端点(如收集器或Jaeger),您需要使用open-telemetry/exporter-otlp包和满足psr/http-client-implementation的HTTP客户端。

composer require \
  open-telemetry/exporter-otlp \
  php-http/guzzle7-adapter

要使用gRPC导出器,您还需要安装open-telemetry/transport-grpc包以及grpc扩展。

pecl install grpc
composer require open-telemetry/transport-grpc

接下来,配置一个OTLP端点导出器。例如:

<?php

require __DIR__ . '/vendor/autoload.php';

use OpenTelemetry\API\Signals;
use OpenTelemetry\Contrib\Grpc\GrpcTransportFactory;
use OpenTelemetry\Contrib\Otlp\OtlpUtil;
use OpenTelemetry\Contrib\Otlp\SpanExporter;
use OpenTelemetry\SDK\Trace\SpanProcessor\SimpleSpanProcessor;
use OpenTelemetry\SDK\Trace\TracerProvider;

$transport = (new GrpcTransportFactory())->create('http://jaeger:4317' . OtlpUtil::method(Signals::TRACE));
$exporter = new SpanExporter($transport);

$tracerProvider =  new TracerProvider(
    new SimpleSpanProcessor($exporter)
);
<?php

require __DIR__ . '/vendor/autoload.php';

use OpenTelemetry\Contrib\Otlp\OtlpHttpTransportFactory;
use OpenTelemetry\Contrib\Otlp\SpanExporter;
use OpenTelemetry\SDK\Trace\SpanProcessor\SimpleSpanProcessor;
use OpenTelemetry\SDK\Trace\TracerProvider;

$transport = (new OtlpHttpTransportFactory())->create('http://jaeger:4318/v1/traces', 'application/x-protobuf');
$exporter = new SpanExporter($transport);

$tracerProvider =  new TracerProvider(
    new SimpleSpanProcessor($exporter)
);
<?php

require __DIR__ . '/vendor/autoload.php';

use OpenTelemetry\Contrib\Otlp\OtlpHttpTransportFactory;
use OpenTelemetry\Contrib\Otlp\SpanExporter;
use OpenTelemetry\SDK\Trace\SpanProcessor\SimpleSpanProcessor;
use OpenTelemetry\SDK\Trace\TracerProvider;

$transport = (new OtlpHttpTransportFactory())->create('http://jaeger:4318/v1/traces', 'application/json');
$exporter = new SpanExporter($transport);

$tracerProvider =  new TracerProvider(
    new SimpleSpanProcessor($exporter)
);
$tracer = $tracerProvider->getTracer('io.opentelemetry.contrib.php');
$tracer->spanBuilder('example')->startSpan()->end();
<?php

require __DIR__ . '/vendor/autoload.php';

use OpenTelemetry\Contrib\Otlp\OtlpHttpTransportFactory;
use OpenTelemetry\Contrib\Otlp\SpanExporter;
use OpenTelemetry\SDK\Trace\SpanProcessor\SimpleSpanProcessor;
use OpenTelemetry\SDK\Trace\TracerProvider;

$transport = (new OtlpHttpTransportFactory())->create('http://jaeger:4318/v1/traces', 'application/x-ndjson');
$exporter = new SpanExporter($transport);

$tracerProvider =  new TracerProvider(
    new SimpleSpanProcessor($exporter)
);
$tracer = $tracerProvider->getTracer('io.opentelemetry.contrib.php');
$tracer->spanBuilder('example')->startSpan()->end();

然后,追加以下代码以生成一个span:

$tracer = $tracerProvider->getTracer('io.opentelemetry.contrib.php');
$tracer
  ->spanBuilder('example')
  ->startSpan()
  ->end();

要尝试上面的示例,您可以在Docker容器中运行Jaeger

docker run -d --name jaeger \
  -e COLLECTOR_ZIPKIN_HOST_PORT=:9411 \
  -e COLLECTOR_OTLP_ENABLED=true \
  -p 6831:6831/udp \
  -p 6832:6832/udp \
  -p 5778:5778 \
  -p 16686:16686 \
  -p 4317:4317 \
  -p 4318:4318 \
  -p 14250:14250 \
  -p 14268:14268 \
  -p 14269:14269 \
  -p 9411:9411 \
  jaegertracing/all-in-one:latest

Zipkin

如果您正在使用Zipkin来可视化跟踪,您需要先设置它。以下是如何在本地Docker容器中运行它的方法。

docker run --rm -d -p 9411:9411 --name zipkin openzipkin/zipkin

将导出器包安装为应用程序的依赖项。

composer require open-telemetry/exporter-zipkin

更新示例以使用Zipkin导出器并将数据发送到您的Zipkin后端。

$transport = \OpenTelemetry\SDK\Common\Export\Http\PsrTransportFactory::discover()
    ->create('http://zipkin:9411/api/v2/spans', 'application/json');
$zipkinExporter = new ZipkinExporter($transport);
$tracerProvider =  new TracerProvider(
    new SimpleSpanProcessor($zipkinExporter)
);
$tracer = $tracerProvider->getTracer('io.opentelemetry.contrib.php');

最小化导出延迟

大多数PHP运行时是同步和阻塞的。发送遥测数据可能会延迟用户接收HTTP响应。

如果您正在使用fastcgi,可以在发送用户响应后调用fastcgi_finish_request(),这样发送遥测数据的延迟就不会影响请求的处理。

为了最小化遥测数据缓慢传输的影响,特别是对于外部或基于云的后端,您应该考虑使用OpenTelemetry Collector作为代理。该代理可以快速接收,然后批量发送遥测数据到后端。


最后修改于 2025 年 6 月 11 日: 警报清理 (#7090) (c392c714)