Cuando necesita distributed tracing para aplicaciones PHP que se ejecutan en Alibaba Cloud, OpenTelemetry ofrece un estándar de instrumentación neutral respecto al proveedor. Instrumente su aplicación PHP con el SDK de OpenTelemetry y reporte los datos de las trazas a Managed Service for OpenTelemetry. Una vez que las trazas llegan a Application Real-Time Monitoring Service (ARMS), puede consultar la topología de la aplicación, las trazas, las transacciones anómalas y lentas, así como el análisis de SQL en la consola de ARMS.
Elija uno de los siguientes métodos de instrumentación según sus necesidades:
|
Método |
Versión de PHP |
Recomendado para |
|
Instrumentación automática |
PHP 8.0+ |
Configuración sin código mediante la extensión de PHP de OpenTelemetry. Funciona con los framework compatibles. |
|
Instrumentación manual |
PHP 7.4+ |
Control total sobre spans, atributos y eventos. Úsela cuando necesite spans personalizados o trabaje con framework no compatibles. |
Requisitos previos
Antes de empezar, compruebe que cuenta con lo siguiente:
PHP 8.0 o posterior (instrumentación automática) o PHP 7.4 o posterior (instrumentación manual)
Un endpoint OTLP y un token de autenticación obtenidos desde la consola de ARMS (consulte la sección Obtener un endpoint más adelante)
Obtener un endpoint
Inicie sesión en la consola de ARMS.
En el panel de navegación izquierdo, haga clic en Integration Center.
En la sección Server-side Applications, haga clic en la tarjeta OpenTelemetry.
-
En el panel OpenTelemetry, haga clic en la pestaña Start Integration y seleccione una región.
La primera vez que accede a una región, los recursos se inicializan automáticamente en ella.
-
Establezca Connection Type y Export Protocol, y luego copie el endpoint.
Parámetro
Opciones
Guía
Connection Type
Alibaba Cloud VPC Network, Public Network
Use VPC si su servicio se ejecuta en la misma región de Alibaba Cloud. De lo contrario, use Public Network.
Export Protocol
HTTP (recomendado), gRPC
Elija la opción según el protocolo que admita su cliente.

Código de ejemplo
Descargue el código de ejemplo completo desde php-demo en GitHub.
Instrumentación automática
La instrumentación automática utiliza la extensión de PHP de OpenTelemetry para generar trazas sin modificar el código de su aplicación. Los pasos siguientes usan como ejemplo una aplicación de lanzamiento de dados basada en Slim.
Paso 1: Crear la aplicación
-
Inicialice el proyecto:
mkdir <project-name> && cd <project-name>composer init \ --no-interaction \ --stability beta \ --require slim/slim:"^4" \ --require slim/psr7:"^1" composer update -
Cree un archivo
index.phpen el directorio del proyecto:<?php use Psr\Http\Message\ResponseInterface as Response; use Psr\Http\Message\ServerRequestInterface as Request; use Slim\Factory\AppFactory; require __DIR__ . '/vendor/autoload.php'; $app = AppFactory::create(); $app->get('/rolldice', function (Request $request, Response $response) { $result = random_int(1,6); $response->getBody()->write(strval($result)); return $response; }); $app->run(); -
Compruebe que la aplicación se ejecuta correctamente: abra
http://localhost:8080/rolldiceen un navegador. Debería ver un número aleatorio entre 1 y 6.php -S localhost:8080
Paso 2: Compilar la extensión de PHP de OpenTelemetry
-
Instale las dependencias de compilación:
-
macOS:
brew install gcc make autoconf -
Linux (apt):
sudo apt-get install gcc make autoconf
-
-
Compile e instale la extensión con PECL. Una compilación correcta finaliza con una salida similar a la siguiente:
pecl install opentelemetryBuild process completed successfully Installing '/opt/homebrew/Cellar/php/8.2.8/pecl/20220829/opentelemetry.so' install ok: channel://pecl.php.net/opentelemetry-1.0.0beta6 Extension opentelemetry enabled in php.ini -
(Opcional) Si la salida no incluye
Extension opentelemetry enabled in php.ini, agregue manualmente la extensión a su archivophp.ini:[opentelemetry] extension=opentelemetry.so -
Compruebe que la extensión se cargó. Salida esperada: También puede ejecutar
php --ri opentelemetrypara obtener información detallada de la extensión:php -m | grep opentelemetryopentelemetryopentelemetry opentelemetry support => enabled extension version => 1.0.0beta6
Paso 3: Instalar las dependencias de instrumentación
# Install the gRPC extension (may take several minutes)
pecl install grpc
composer config allow-plugins.php-http/discovery false
composer require \
open-telemetry/sdk \
open-telemetry/opentelemetry-auto-slim \
open-telemetry/exporter-otlp \
php-http/guzzle7-adapter \
open-telemetry/transport-grpc
|
Paquete |
Propósito |
|
|
SDK principal de OpenTelemetry para PHP |
|
|
Instrumentación automática para Slim |
|
|
Exportador OTLP |
|
|
Adaptador de cliente HTTP |
|
|
Capa de transporte gRPC |
Paso 4: Ejecutar la aplicación instrumentada
Inicie la aplicación con variables de entorno que configuran el SDK de OpenTelemetry:
env OTEL_PHP_AUTOLOAD_ENABLED=true \
OTEL_SERVICE_NAME=<your-service-name> \
OTEL_TRACES_EXPORTER=otlp \
OTEL_METRICS_EXPORTER=none \
OTEL_LOGS_EXPORTER=none \
OTEL_EXPORTER_OTLP_PROTOCOL=grpc \
OTEL_EXPORTER_OTLP_ENDPOINT=<endpoint> \
OTEL_EXPORTER_OTLP_HEADERS=Authentication=<token> \
OTEL_PROPAGATORS=baggage,tracecontext \
php -S localhost:8080
Reemplace los siguientes marcadores de posición con sus valores:
|
Marcador de posición |
Descripción |
Ejemplo |
|
|
Nombre de la aplicación que se muestra en ARMS |
|
|
|
Endpoint gRPC obtenido en la sección Requisitos previos |
|
|
|
Token de autenticación obtenido en la sección Requisitos previos |
-- |
Comprobar
Abra
http://localhost:8080/rolldiceen un navegador. Cada solicitud genera una traza automáticamente.Inicie sesión en la consola de Managed Service for OpenTelemetry.
En la página Applications, busque su aplicación y haga clic en su nombre para consultar las trazas.
Las trazas pueden tardar unos minutos en aparecer en la consola. Si siguen sin mostrarse, compruebe que la extensión de OpenTelemetry está cargada ( php -m | grep opentelemetry ) y que su endpoint y token son correctos.
Instrumentación manual
La instrumentación manual le otorga control total sobre la creación de spans, los atributos, los eventos y el registro de errores. Utilice este método cuando la instrumentación automática no cubra su caso de uso o cuando necesite spans personalizados junto con los generados automáticamente.
Paso 1: Crear la aplicación
Siga los mismos pasos descritos en la sección Instrumentación automática > Paso 1 para crear la aplicación de lanzamiento de dados basada en Slim.
Paso 2: Instalar las dependencias del SDK de OpenTelemetry
Instale la biblioteca del cliente HTTP y los paquetes del SDK de OpenTelemetry. Seleccione la pestaña que corresponda a su protocolo de exportación.
gRPC
composer require guzzlehttp/guzzle
composer require \
open-telemetry/sdk \
open-telemetry/exporter-otlp
# Install the gRPC extension if not already installed
pecl install grpc
composer require open-telemetry/transport-grpc
HTTP
composer require guzzlehttp/guzzle
composer require \
open-telemetry/sdk \
open-telemetry/exporter-otlp
Paso 3: Escribir el código de inicialización
Cree un archivo opentelemetry_util.php en el mismo directorio que index.php. Este archivo configura TracerProvider, el exportador y el sampler.
gRPC
<?php
use OpenTelemetry\API\Common\Instrumentation\Globals;
use OpenTelemetry\API\Trace\Propagation\TraceContextPropagator;
use OpenTelemetry\Contrib\Otlp\SpanExporter;
use OpenTelemetry\SDK\Common\Attribute\Attributes;
use OpenTelemetry\SDK\Common\Export\Stream\StreamTransportFactory;
use OpenTelemetry\SDK\Resource\ResourceInfo;
use OpenTelemetry\SDK\Resource\ResourceInfoFactory;
use OpenTelemetry\SDK\Sdk;
use OpenTelemetry\SDK\Trace\Sampler\AlwaysOnSampler;
use OpenTelemetry\SDK\Trace\Sampler\ParentBased;
use OpenTelemetry\SDK\Trace\SpanProcessor\SimpleSpanProcessor;
use OpenTelemetry\SDK\Trace\SpanProcessor\BatchSpanProcessorBuilder;
use OpenTelemetry\SDK\Trace\TracerProvider;
use OpenTelemetry\SemConv\ResourceAttributes;
use OpenTelemetry\Contrib\Grpc\GrpcTransportFactory;
use OpenTelemetry\Contrib\Otlp\OtlpUtil;
use OpenTelemetry\API\Signals;
function initOpenTelemetry()
{
// 1. Define the service resource
$resource = ResourceInfoFactory::emptyResource()->merge(ResourceInfo::create(Attributes::create([
ResourceAttributes::SERVICE_NAME => '<your-service-name>', // Required
ResourceAttributes::HOST_NAME => '<your-host-name>' // Optional
])));
// 2. Create a SpanExporter that sends data over gRPC
$headers = [
'Authentication' => '<your-token>',
];
$transport = (new GrpcTransportFactory())->create(
'<grpc-endpoint>' . OtlpUtil::method(Signals::TRACE),
'application/x-protobuf',
$headers
);
$spanExporter = new SpanExporter($transport);
// 3. Build and register the global TracerProvider
$tracerProvider = TracerProvider::builder()
->addSpanProcessor(
(new BatchSpanProcessorBuilder($spanExporter))->build()
)
->setResource($resource)
->setSampler(new ParentBased(new AlwaysOnSampler()))
->build();
Sdk::builder()
->setTracerProvider($tracerProvider)
->setPropagator(TraceContextPropagator::getInstance())
->setAutoShutdown(true) // Flush pending spans on shutdown
->buildAndRegisterGlobal();
}
?>
Reemplace los siguientes marcadores de posición:
|
Marcador de posición |
Descripción |
|
|
Nombre de la aplicación que se muestra en ARMS |
|
|
Nombre de host de su servidor |
|
|
Token de autenticación para la exportación por gRPC |
|
|
Endpoint gRPC obtenido en la sección Requisitos previos |
HTTP
<?php
use OpenTelemetry\API\Common\Instrumentation\Globals;
use OpenTelemetry\API\Trace\Propagation\TraceContextPropagator;
use OpenTelemetry\Contrib\Otlp\SpanExporter;
use OpenTelemetry\SDK\Common\Attribute\Attributes;
use OpenTelemetry\SDK\Common\Export\Stream\StreamTransportFactory;
use OpenTelemetry\SDK\Resource\ResourceInfo;
use OpenTelemetry\SDK\Resource\ResourceInfoFactory;
use OpenTelemetry\SDK\Sdk;
use OpenTelemetry\SDK\Trace\Sampler\AlwaysOnSampler;
use OpenTelemetry\SDK\Trace\Sampler\ParentBased;
use OpenTelemetry\SDK\Trace\SpanProcessor\SimpleSpanProcessor;
use OpenTelemetry\SDK\Trace\SpanProcessor\BatchSpanProcessorBuilder;
use OpenTelemetry\SDK\Trace\TracerProvider;
use OpenTelemetry\SemConv\ResourceAttributes;
use OpenTelemetry\Contrib\Otlp\OtlpHttpTransportFactory;
use OpenTelemetry\SDK\Common\Export\TransportFactoryInterface;
function initOpenTelemetry()
{
// 1. Define the service resource
$resource = ResourceInfoFactory::emptyResource()->merge(ResourceInfo::create(Attributes::create([
ResourceAttributes::SERVICE_NAME => '<your-service-name>', // Required
ResourceAttributes::HOST_NAME => '<your-host-name>' // Optional
])));
// 2. Create a SpanExporter that sends data over HTTP
$transport = (new OtlpHttpTransportFactory())->create(
'<http-endpoint>',
'application/x-protobuf'
);
$spanExporter = new SpanExporter($transport);
// 3. Build and register the global TracerProvider
$tracerProvider = TracerProvider::builder()
->addSpanProcessor(
(new BatchSpanProcessorBuilder($spanExporter))->build()
)
->setResource($resource)
->setSampler(new ParentBased(new AlwaysOnSampler()))
->build();
Sdk::builder()
->setTracerProvider($tracerProvider)
->setPropagator(TraceContextPropagator::getInstance())
->setAutoShutdown(true) // Flush pending spans on shutdown
->buildAndRegisterGlobal();
}
?>
Reemplace los siguientes marcadores de posición:
|
Marcador de posición |
Descripción |
|
|
Nombre de la aplicación que se muestra en ARMS |
|
|
Nombre de host de su servidor |
|
|
Endpoint HTTP obtenido en la sección Requisitos previos |
Paso 4: Agregar la instrumentación a la aplicación
Actualice index.php para inicializar OpenTelemetry y crear spans.
-
Importe los paquetes obligatorios e inicialice OpenTelemetry al inicio de
index.php:<?php use OpenTelemetry\API\Common\Instrumentation\Globals; use OpenTelemetry\SDK\Common\Attribute\Attributes; use OpenTelemetry\SDK\Trace\TracerProvider; require __DIR__ . '/opentelemetry_util.php'; // Initialize OpenTelemetry: configure service name, exporter, and global TracerProvider initOpenTelemetry(); -
Cree un span en la ruta
/rolldicepara capturar el seguimiento a nivel de solicitud:$app->get('/rolldice', function (Request $request, Response $response) { // Get a tracer instance $tracer = \OpenTelemetry\API\Globals::tracerProvider()->getTracer('my-tracer'); // Start a span for this operation $span = $tracer->spanBuilder("/rolldice")->startSpan(); $span->setAttribute("http.method", "GET"); $span->addEvent("Init"); // Configure events with attributes $eventAttributes = Attributes::create([ "key1" => "value", "key2" => 3.14159, ]); // Business logic $result = random_int(1,6); $response->getBody()->write(strval($result)); $span->addEvent("End"); $span->end(); return $response; }); -
Cree spans anidados para rastrear operaciones de varios pasos. A continuación se muestra la ruta
/rolltwodices, que ilustra una relación de span padre-hijo:$app->get('/rolltwodices', function (Request $request, Response $response) { $tracer = \OpenTelemetry\API\Globals::tracerProvider()->getTracer('my-tracer'); // Create a parent span $parentSpan = $tracer->spanBuilder("/rolltwodices/parent")->startSpan(); $scope = $parentSpan->activate(); $value1 = random_int(1,6); // Create a child span within the parent scope $childSpan = $tracer->spanBuilder("/rolltwodices/parent/child")->startSpan(); // Business logic $value2 = random_int(1,6); $result = "dice1: " . $value1 . ", dice2: " . $value2; // End spans and detach scope $childSpan->end(); $parentSpan->end(); $scope->detach(); $response->getBody()->write(strval($result)); return $response; }); -
Registre excepciones en los spans. La siguiente ruta
/errormuestra cómo manejar errores:$app->get('/error', function (Request $request, Response $response) { $tracer = \OpenTelemetry\API\Globals::tracerProvider()->getTracer('my-tracer'); $span3 = $tracer->spanBuilder("/error")->startSpan(); try { // Simulate an exception throw new \Exception('exception!'); } catch (\Throwable $t) { // Mark the span as an error $span3->setStatus(\OpenTelemetry\API\Trace\StatusCode::STATUS_ERROR, "exception in span3!"); // Record the exception with stack trace $span3->recordException($t, ['exception.escaped' => true]); } finally { $span3->end(); $response->getBody()->write("error"); return $response; } });
Paso 5: Ejecutar y comprobar
-
Inicie la aplicación:
php -S localhost:8080 -
Envíe solicitudes para generar datos de trazas:
http://localhost:8080/rolldice http://localhost:8080/rolltwodices http://localhost:8080/error Inicie sesión en la consola de Managed Service for OpenTelemetry. En la página Applications, busque su aplicación y haga clic en su nombre para consultar las trazas.
Las trazas pueden tardar unos minutos en aparecer en la consola. Si siguen sin mostrarse, compruebe que su endpoint y token sean correctos, y que su servidor pueda alcanzar el endpoint a través de la red.
Pasos siguientes
Explore paquetes adicionales de instrumentación automática para otros framework en el registro de OpenTelemetry