Para implementar rastreamento distribuído em aplicações PHP na Alibaba Cloud, use o OpenTelemetry como padrão de instrumentação neutro. Instrumente sua aplicação PHP com o SDK do OpenTelemetry e envie os dados de rastreamento para o Managed Service for OpenTelemetry. Após os rastreamentos chegarem ao Application Real-Time Monitoring Service (ARMS), visualize a topologia da aplicação, traces, transações anômalas ou lentas e análises de SQL no console do ARMS.
Escolha uma das abordagens de instrumentação abaixo conforme sua necessidade:
|
Abordagem |
Versão do PHP |
Indicado para |
|
Instrumentação automática |
PHP 8.0+ |
Configuração sem código usando a extensão OpenTelemetry para PHP. Compatível com frameworks suportados. |
|
Instrumentação manual |
PHP 7.4+ |
Controle total sobre spans, atributos e eventos. Ideal para spans personalizados ou frameworks não suportados. |
Pré-requisitos
Antes de começar, certifique-se de ter:
PHP 8.0 ou superior (para instrumentação automática) ou PHP 7.4 ou superior (para instrumentação manual)
Um endpoint OTLP e um token de autenticação obtidos no console do ARMS (consulte a seção Obter um endpoint abaixo)
Obter um endpoint
Faça login no console do ARMS.
No painel de navegação à esquerda, clique em Integration Center.
Na seção Server-side Applications, clique no cartão OpenTelemetry.
-
No painel OpenTelemetry, clique na aba Start Integration e selecione uma região.
Ao acessar uma região pela primeira vez, os recursos são inicializados automaticamente nesse local.
-
Defina o Connection Type e o Export Protocol e copie o endpoint.
Parâmetro
Opções
Orientação
Connection Type
Alibaba Cloud VPC Network, Public Network
Use VPC se seu service estiver na mesma região da Alibaba Cloud. Caso contrário, use Public Network.
Export Protocol
http (recomendado), gRPC
Escolha com base no suporte de protocolo do seu cliente.

Código de exemplo
Baixe o código de exemplo completo no repositório php-demo no GitHub.
Instrumentação automática
A instrumentação automática usa a extensão OpenTelemetry para PHP para gerar rastreamentos sem alterar o código da sua aplicação. Os passos a seguir usam uma aplicação de rolagem de dados baseada no Slim como exemplo.
Passo 1: Crie a aplicação
-
Inicialize o projeto:
mkdir <project-name> && cd <project-name>composer init \ --no-interaction \ --stability beta \ --require slim/slim:"^4" \ --require slim/psr7:"^1" composer update -
Crie um arquivo
index.phpno diretório do projeto:<?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(); -
Verifique se a aplicação está funcionando: Abra
http://localhost:8080/rolldiceno navegador. Um número aleatório entre 1 e 6 deve ser exibido.php -S localhost:8080
Passo 2: Compilar a extensão OpenTelemetry para PHP
-
Instale as dependências de compilação:
-
macOS:
brew install gcc make autoconf -
Linux (apt):
sudo apt-get install gcc make autoconf
-
-
Compile e instale a extensão com o PECL: Uma compilação bem-sucedida termina com uma saída semelhante a:
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) Se a saída não incluir
Extension opentelemetry enabled in php.ini, adicione manualmente a extensão ao seu arquivophp.ini:[opentelemetry] extension=opentelemetry.so -
Verifique se a extensão foi carregada: Saída esperada: Alternativamente, execute
php --ri opentelemetrypara obter informações detalhadas sobre a extensão:php -m | grep opentelemetryopentelemetryopentelemetry opentelemetry support => enabled extension version => 1.0.0beta6
Passo 3: Instale dependências de instrumentação
# 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
|
Pacote |
Finalidade |
|
|
sdk principal do OpenTelemetry para PHP |
|
|
Instrumentação automática para Slim |
|
|
Exportador OTLP |
|
|
Adaptador de cliente http |
|
|
Camada de transporte gRPC |
Passo 4: Execute a aplicação instrumentada
Inicie a aplicação definindo variáveis de ambiente que configuram o sdk do 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
Substitua os placeholders abaixo pelos seus valores:
|
Placeholder |
Descrição |
Exemplo |
|
|
Nome da aplicação exibido no ARMS |
|
|
|
Endpoint gRPC obtido na seção de Pré-requisitos |
|
|
|
Token de autenticação obtido na seção de Pré-requisitos |
-- |
Verifique
Acesse
http://localhost:8080/rolldiceno navegador. Cada requisição gera um rastreamento automaticamente.Faça login no console do Managed Service for OpenTelemetry.
Na página Applications, localize sua aplicação e clique em nome dela para visualizar os rastreamentos.
Pode levar alguns minutos até que os rastreamentos apareçam no console. Se eles ainda não forem exibidos, verifique se a extensão OpenTelemetry está carregada ( php -m | grep opentelemetry ) e confirme se o endpoint e o token estão corretos.
Instrumentação manual
A instrumentação manual oferece controle total sobre a criação de spans, atributos, eventos e registro de erros. Adote esta abordagem quando a instrumentação automática não atender ao seu caso de uso ou quando for necessário criar spans personalizados em conjunto com os gerados automaticamente.
Passo 1: Crie a aplicação
Siga os mesmos passos descritos na seção Instrumentação automática > Passo 1 para criar a aplicação de rolagem de dados baseada no Slim.
Passo 2: Instale dependências do sdk do OpenTelemetry
Instale a biblioteca de cliente http e os pacotes do sdk do OpenTelemetry. Selecione a aba correspondente ao seu protocolo de exportação.
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
Passo 3: Escrever o código de inicialização
Crie um arquivo opentelemetry_util.php no mesmo diretório do index.php. Este arquivo configura o TracerProvider, o exportador e o amostrador.
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();
}
?>
Substitua os seguintes placeholders:
|
Placeholder |
Descrição |
|
|
Nome da aplicação exibido no ARMS |
|
|
Hostname do seu servidor |
|
|
Token de autenticação para exportação via gRPC |
|
|
Endpoint gRPC obtido na seção de Pré-requisitos |
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();
}
?>
Substitua os seguintes placeholders:
|
Placeholder |
Descrição |
|
|
Nome da aplicação exibido no ARMS |
|
|
Hostname do seu servidor |
|
|
Endpoint http obtido na seção de Pré-requisitos |
Passo 4: Adicionar instrumentação à aplicação
Atualize o index.php para inicializar o OpenTelemetry e criar spans.
-
Importe os pacotes necessários e inicialize o OpenTelemetry no início do
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(); -
Crie um span na rota
/rolldicepara capturar o rastreamento no nível da requisição:$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; }); -
Crie spans aninhados para rastrear operações com múltiplas etapas. A rota
/rolltwodicesabaixo demonstra uma relação de span pai-filho:$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 exceções nos spans. A rota
/errora seguir exemplifica o tratamento de erros:$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; } });
Passo 5: Execute e verifique
-
Inicie a aplicação:
php -S localhost:8080 -
Envie requisições para gerar dados de rastreamento:
http://localhost:8080/rolldice http://localhost:8080/rolltwodices http://localhost:8080/error Faça login no console do Managed Service for OpenTelemetry. Na página Applications, localize sua aplicação e clique em nome dela para visualizar os rastreamentos.
Pode levar alguns minutos até que os rastreamentos apareçam no console. Se eles ainda não forem exibidos, verifique se o endpoint e o token estão corretos e confirme se o servidor consegue alcançar o endpoint pela rede.
Próximos passos
Explore pacotes adicionais de instrumentação automática para outros frameworks no Registro do OpenTelemetry