Saat memerlukan pelacakan terdistribusi untuk aplikasi PHP yang berjalan di Alibaba Cloud, OpenTelemetry menyediakan standar instrumentasi yang netral terhadap vendor. Instrumenkan aplikasi PHP Anda dengan SDK OpenTelemetry dan laporkan data jejak ke Managed Service for OpenTelemetry. Setelah jejak mencapai Application Real-Time Monitoring Service (ARMS), Anda dapat melihat topologi aplikasi, jejak, transaksi abnormal dan lambat, serta analisis SQL di Konsol ARMS.
Pilih salah satu pendekatan instrumentasi berikut sesuai kebutuhan Anda:
| Approach | PHP version | Best for |
|---|---|---|
| Automatic instrumentation | PHP 8.0+ | Pengaturan tanpa kode menggunakan ekstensi OpenTelemetry PHP. Berfungsi dengan framework yang didukung. |
| Manual instrumentation | PHP 7.4+ | Kontrol penuh atas rentang, atribut, dan event. Gunakan untuk rentang kustom atau framework yang tidak didukung. |
Prasyarat
Sebelum memulai, pastikan Anda telah memiliki:
PHP 8.0 atau versi lebih baru (instrumentasi otomatis) atau PHP 7.4 atau versi lebih baru (instrumentasi manual)
Titik akhir OTLP dan token otentikasi dari Konsol ARMS (lihat bagian Dapatkan titik akhir di bawah)
Dapatkan titik akhir
Masuk ke Konsol ARMS.
Di panel navigasi sebelah kiri, klik Integration Center.
Di bagian Server-side Applications, klik kartu OpenTelemetry.
Di panel OpenTelemetry, klik tab Start Integration dan pilih wilayah.
Saat Anda mengakses wilayah untuk pertama kalinya, sumber daya akan diinisialisasi secara otomatis di sana.
Atur Connection Type dan Export Protocol, lalu salin titik akhirnya.
Parameter Options Guidance Connection Type Alibaba Cloud VPC Network, Public Network Gunakan VPC jika layanan Anda berjalan di wilayah Alibaba Cloud yang sama. Jika tidak, gunakan Public Network. Export Protocol HTTP (disarankan), gRPC Pilih berdasarkan dukungan protokol pada client Anda. 
Kode contoh
Unduh kode contoh lengkap dari php-demo di GitHub.
Automatic instrumentation
Instrumentasi otomatis menggunakan ekstensi OpenTelemetry PHP untuk menghasilkan jejak tanpa mengubah kode aplikasi Anda. Langkah-langkah berikut menggunakan aplikasi pelempar dadu berbasis Slim sebagai contoh.
Langkah 1: Buat aplikasi
Inisialisasi proyek:
mkdir <project-name> && cd <project-name>composer init \ --no-interaction \ --stability beta \ --require slim/slim:"^4" \ --require slim/psr7:"^1" composer updateBuat file
index.phpdi direktori proyek:<?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();Verifikasi aplikasi berjalan: Buka
http://localhost:8080/rolldicedi browser. Anda seharusnya melihat bilangan acak antara 1 dan 6.php -S localhost:8080
Langkah 2: Bangun ekstensi OpenTelemetry PHP
Instal dependensi build:
macOS:
brew install gcc make autoconfLinux (apt):
sudo apt-get install gcc make autoconf
Bangun dan instal ekstensi dengan PECL. Build yang berhasil akan menghasilkan output seperti berikut:
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(Opsional) Jika output tidak menyertakan
Extension opentelemetry enabled in php.ini, tambahkan ekstensi tersebut secara manual ke filephp.iniAnda:opentelemetry dukungan opentelemetry => diaktifkan versi ekstensi => 1.0.0beta6Verifikasi bahwa ekstensi telah dimuat. Output yang diharapkan adalah sebagai berikut. Atau, jalankan
php --ri opentelemetryuntuk informasi detail mengenai ekstensi:php -m | grep opentelemetryopentelemetryopentelemetry opentelemetry support => enabled extension version => 1.0.0beta6
Langkah 3: Instal dependensi instrumentasi
# Instal ekstensi gRPC (mungkin memakan waktu beberapa menit)
pecl install grpccomposer 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| Package | Purpose |
|---|---|
open-telemetry/sdk | Core OpenTelemetry SDK untuk PHP |
open-telemetry/opentelemetry-auto-slim | Automatic instrumentation untuk Slim |
open-telemetry/exporter-otlp | OTLP exporter |
php-http/guzzle7-adapter | HTTP client adapter |
open-telemetry/transport-grpc | gRPC transport layer |
Langkah 4: Jalankan aplikasi yang telah di-instrumentasi
Jalankan aplikasi dengan variabel lingkungan yang mengonfigurasi SDK 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:8080Ganti placeholder berikut dengan nilai Anda:
| Placeholder | Description | Example |
|---|---|---|
<your-service-name> | Nama aplikasi yang ditampilkan di ARMS | php-demo |
<endpoint> | Titik akhir gRPC dari bagian Prasyarat | http://tracing-analysis-dc-hz.aliyuncs.com:8090 |
<token> | Token otentikasi dari bagian Prasyarat | -- |
Verifikasi
Buka
http://localhost:8080/rolldicedi browser. Setiap permintaan akan menghasilkan jejak secara otomatis.Masuk ke atau Konsol Managed Service for OpenTelemetry.
Di halaman Applications, temukan aplikasi Anda dan klik namanya untuk melihat jejak.
Mungkin diperlukan beberapa menit hingga jejak muncul di konsol. Jika jejak masih belum muncul, verifikasi bahwa ekstensi OpenTelemetry telah dimuat (php -m | grep opentelemetry) serta titik akhir dan token Anda benar.Manual instrumentation
Instrumentasi manual memberi Anda kontrol penuh atas pembuatan rentang, atribut, event, dan pencatatan error. Gunakan pendekatan ini ketika instrumentasi otomatis tidak mencakup kasus penggunaan Anda atau ketika Anda memerlukan rentang kustom bersama rentang yang di-instrumentasi secara otomatis.
Langkah 1: Buat aplikasi
Ikuti langkah-langkah yang sama seperti pada bagian Instrumentasi otomatis > Langkah 1 untuk membuat aplikasi pelempar dadu berbasis Slim.
Langkah 2: Instal dependensi SDK OpenTelemetry
Instal library client HTTP dan paket SDK OpenTelemetry. Pilih tab yang sesuai dengan protokol ekspor Anda.
gRPC
composer require guzzlehttp/guzzlecomposer require \
open-telemetry/sdk \
open-telemetry/exporter-otlp# Instal ekstensi gRPC jika belum terinstal
pecl install grpc
composer require open-telemetry/transport-grpcHTTP
composer require guzzlehttp/guzzlecomposer require \
open-telemetry/sdk \
open-telemetry/exporter-otlpLangkah 3: Tulis kode inisialisasi
Buat file opentelemetry_util.php di direktori yang sama dengan index.php. File ini mengatur TracerProvider, exporter, dan 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\Otlp\OtlpHttpTransportFactory;
use OpenTelemetry\SDK\Common\Export\TransportFactoryInterface;
function initOpenTelemetry()
{
// 1. Tentukan Sumber daya layanan
$resource = ResourceInfoFactory::emptyResource()->merge(ResourceInfo::create(Attributes::create([
ResourceAttributes::SERVICE_NAME => '<your-service-name>', // Wajib
ResourceAttributes::HOST_NAME => '<your-host-name>' // Opsional
])));
// 2. Buat SpanExporter yang mengirim data melalui HTTP
$transport = (new OtlpHttpTransportFactory())->create(
'<http-endpoint>',
'application/x-protobuf'
);
$spanExporter = new SpanExporter($transport);
// 3. Bangun dan daftarkan TracerProvider global
$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) // Mengosongkan rentang yang tertunda saat mematikan
->buildAndRegisterGlobal();
}
?>Ganti placeholder berikut:
| Placeholder | Description |
|---|---|
<your-service-name> | Nama aplikasi yang ditampilkan di ARMS |
<your-host-name> | Hostname server Anda |
<your-token> | Token otentikasi untuk ekspor gRPC |
<grpc-endpoint> | Titik akhir gRPC dari bagian Prasyarat |
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();
}
?>Ganti placeholder berikut:
| Placeholder | Description |
|---|---|
<your-service-name> | Nama aplikasi yang ditampilkan di ARMS |
<your-host-name> | Hostname server Anda |
<http-endpoint> | Titik akhir HTTP dari bagian Prasyarat |
Langkah 4: Tambahkan instrumentasi ke aplikasi
Perbarui index.php untuk menginisialisasi OpenTelemetry dan membuat rentang.
Impor paket yang diperlukan dan inisialisasi OpenTelemetry di bagian atas
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();Buat rentang di rute
/rolldiceuntuk menangkap pelacakan tingkat permintaan:$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; });Buat rentang bersarang untuk melacak operasi multi-langkah. Rute
/rolltwodicesberikut menunjukkan hubungan rentang induk-anak:$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; });Catat exception pada rentang. Rute
/errorberikut menunjukkan penanganan error:$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; } });
Langkah 5: Jalankan dan verifikasi
Jalankan aplikasi:
php -S localhost:8080Kirim permintaan untuk menghasilkan data jejak:
http://localhost:8080/rolldice http://localhost:8080/rolltwodices http://localhost:8080/errorMasuk ke atau Konsol Managed Service for OpenTelemetry. Di halaman Applications, temukan aplikasi Anda dan klik namanya untuk melihat jejak.
Mungkin diperlukan beberapa menit hingga jejak muncul di konsol. Jika jejak masih belum muncul, verifikasi bahwa titik akhir dan token Anda benar serta server Anda dapat menjangkau titik akhir melalui jaringan.
Langkah selanjutnya
Jelajahi paket auto-instrumentasi tambahan untuk framework lain di OpenTelemetry Registry.