Setelah Anda menggunakan OpenTelemetry untuk menginstrumentasi aplikasi dan melaporkan data jejak ke Managed Service for OpenTelemetry, Managed Service for OpenTelemetry mulai memantau aplikasi. Anda dapat melihat data pemantauan aplikasi seperti topologi aplikasi, jejak, transaksi abnormal, transaksi lambat, dan analisis SQL. Topik ini menjelaskan cara menggunakan OpenTelemetry SDK untuk PHP untuk secara otomatis atau manual menginstrumentasi aplikasi PHP dan melaporkan data jejak aplikasi PHP.
Prasyarat
Informasi latar belakang
OpenTelemetry SDK untuk PHP memungkinkan Anda secara otomatis atau manual menginstrumentasi aplikasi PHP dengan menggunakan versi PHP yang berbeda.
Untuk instrumentasi otomatis, gunakan PHP 8.0 atau lebih baru.
Untuk instrumentasi manual, gunakan PHP 7.4 atau lebih baru.
OpenTelemetry SDK untuk PHP mendukung instrumentasi otomatis berdasarkan beberapa kerangka kerja. Untuk informasi lebih lanjut, lihat Registry.
Kode contoh
Unduh kode contoh dari php-demo.
Gunakan ekstensi PHP OpenTelemetry untuk secara otomatis menginstrumentasi aplikasi dan melaporkan data jejak
Bagian ini menjelaskan cara membuat aplikasi PHP yang mensimulasikan pelemparan dadu berdasarkan kerangka kerja Slim. Bagian ini juga menjelaskan cara menggunakan OpenTelemetry untuk secara otomatis menginstrumentasi aplikasi guna melaporkan data jejak secara non-intrusif. Selama proses ini, OpenTelemetry secara otomatis menghasilkan data jejak dan rentang.
OpenTelemetry mendukung instrumentasi otomatis berdasarkan beberapa kerangka kerja, termasuk Slim. Untuk informasi lebih lanjut, lihat Registry.
Prasyarat
PHP 8.0 atau lebih baru, Composer, dan PHP Extension Community Library (PECL) telah terinstal.
Prosedur
Buat aplikasi pelemparan dadu.
Inisialisasi aplikasi.
mkdir <project-name> && cd <project-name> composer init \ --no-interaction \ --stability beta \ --require slim/slim:"^4" \ --require slim/psr7:"^1" composer updateTulis kode aplikasi.
Buat file index.php di folder <project-name> dan tambahkan kode berikut.
Kode contoh berikut mensimulasikan permainan pelemparan dadu yang melempar dadu dan mengembalikan angka acak dalam rentang satu hingga enam:
<?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();Setelah menulis kode aplikasi, jalankan perintah
php -S localhost:8080untuk menjalankan aplikasi. Kunjungihttp://localhost:8080/rolldicedi browser.
Bangun ekstensi PHP OpenTelemetry.
Unduh alat yang diperlukan untuk membangun ekstensi PHP OpenTelemetry.
macOS
brew install gcc make autoconfLinux (perintah apt)
sudo apt-get install gcc make autoconf
Gunakan PECL untuk membangun ekstensi PHP OpenTelemetry.
pecl install opentelemetryBeberapa baris terakhir dari respons sukses serupa dengan output berikut:
Build 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.iniOpsional. Aktifkan ekstensi PHP OpenTelemetry.
Jika pesan
Extension opentelemetry enabled in php.inidikembalikan pada langkah sebelumnya, lewati langkah ini.Tambahkan kode berikut ke file php.ini:
[opentelemetry] extension=opentelemetry.soVerifikasi apakah ekstensi PHP OpenTelemetry dibangun dan diaktifkan.
Metode 1:
php -m | grep opentelemetryOutput yang diharapkan:
opentelemetryMetode 2
php --ri opentelemetryOutput yang diharapkan:
opentelemetry opentelemetry support => enabled extension version => 1.0.0beta6
Tambahkan dependensi tambahan yang diperlukan untuk OpenTelemetry SDK untuk PHP melakukan instrumentasi otomatis pada aplikasi pelemparan dadu.
# Operasi ini membutuhkan waktu yang lama. Sejumlah besar informasi ditampilkan di konsol. 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-grpcopen-telemetry/sdk: paket OpenTelemetry SDK untuk PHP.
open-telemetry/opentelemetry-auto-slim: plugin instrumentasi otomatis OpenTelemetry SDK untuk PHP berdasarkan kerangka kerja Slim.
open-telemetry/exporter-otlp: dependensi yang diperlukan untuk OpenTelemetry SDK untuk PHP melaporkan data melalui OpenTelemetry Protocol (OTLP).
Jalankan aplikasi.
Jalankan perintah berikut:
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<your-service-name>: nama aplikasi Anda. Contoh:
php-demo.<endpoint>: titik akhir gRPC yang telah Anda peroleh di bagian Prasyarat. Contoh:
http://tracing-analysis-dc-hz.aliyuncs.com:8090.<token>: token otentikasi yang telah Anda peroleh di bagian Prasyarat.
Kunjungi URL berikut di browser:
http://localhost:8080/rolldiceSetiap kali Anda mengakses halaman ini, OpenTelemetry secara otomatis menghasilkan data jejak dan melaporkannya ke Managed Service for OpenTelemetry.
Lihat data jejak.
Masuk ke Managed Service for OpenTelemetry Console. Di halaman Applications, temukan aplikasi dan klik namanya. Di halaman detail aplikasi, lihat data jejak aplikasi.
Gunakan OpenTelemery SDK untuk PHP untuk secara manual menginstrumentasi aplikasi dan melaporkan data jejak
Bagian ini menjelaskan cara membuat aplikasi PHP yang mensimulasikan pelemparan dadu berdasarkan kerangka kerja Slim. Bagian ini juga menjelaskan cara menggunakan OpenTelemetry SDK untuk PHP untuk secara manual menginstrumentasi aplikasi guna melaporkan data jejak berdasarkan pengaturan kustom. Selama proses ini, Anda dapat membuat rentang di kode dan mengonfigurasi atribut, acara, dan status untuk rentang tersebut.
Jika instrumentasi otomatis tidak dapat memenuhi persyaratan bisnis Anda atau Anda ingin menambahkan instrumentasi secara manual berdasarkan persyaratan bisnis Anda, Anda dapat secara manual menginstrumentasi aplikasi untuk melaporkan data.
Prasyarat
PHP 7.4 atau lebih baru, Composer, dan PECL telah terinstal.
Prosedur
Buat aplikasi pelemparan dadu.
Inisialisasi aplikasi.
mkdir <project-name> && cd <project-name> composer init \ --no-interaction \ --stability beta \ --require slim/slim:"^4" \ --require slim/psr7:"^1" composer updateTulis kode aplikasi.
Buat file index.php di folder <project-name> dan tambahkan kode berikut.
Kode contoh berikut mensimulasikan permainan pelemparan dadu yang melempar dadu dan mengembalikan angka acak dalam rentang satu hingga enam:
<?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();Setelah menulis kode aplikasi, jalankan perintah
php -S localhost:8080untuk menjalankan aplikasi. Kunjungihttp://localhost:8080/rolldicedi browser.
Tambahkan dependensi OpenTelemetry SDK untuk PHP.
gRPC
Unduh pustaka klien HTTP PHP untuk melaporkan data jejak.
composer require guzzlehttp/guzzleUnduh paket OpenTelemetry SDK untuk PHP.
composer require \ open-telemetry/sdk \ open-telemetry/exporter-otlpUnduh dependensi yang diperlukan untuk melaporkan data melalui gRPC.
pecl install grpc # Jika gRPC sudah diunduh dan diinstal, lewati langkah ini. composer require open-telemetry/transport-grpc
HTTP
Unduh pustaka klien HTTP PHP untuk melaporkan data jejak.
composer require guzzlehttp/guzzleUnduh paket OpenTelemetry SDK untuk PHP.
composer require \ open-telemetry/sdk \ open-telemetry/exporter-otlp
Tulis kode inisialisasi OpenTelemetry.
Buat file opentelemetry_util.php di direktori yang sama dengan file index.php.
Tambahkan kode berikut ke file opentelemetry_util.php:
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; // Inisialisasi OpenTelemetry selama inisialisasi aplikasi PHP. function initOpenTelemetry() { // 1. Tentukan informasi tentang sumber daya OpenTelemetry. $resource = ResourceInfoFactory::emptyResource()->merge(ResourceInfo::create(Attributes::create([ ResourceAttributes::SERVICE_NAME => '<your-service-name>', # Diperlukan. Nama aplikasi Anda. ResourceAttributes::HOST_NAME => '<your-host-name>' # Opsional. Nama host. ]))); // 2. Buat SpanExporter yang mengekspor data rentang ke konsol. // $spanExporter = new SpanExporter( // (new StreamTransportFactory())->create('php://stdout', 'application/json') // ); // 2. Buat SpanExporter yang melaporkan data rentang melalui gRPC. $headers = [ 'Authentication' => "<your-token>", ]; $transport = (new GrpcTransportFactory())->create('<grpc-endpoint>' . OtlpUtil::method(Signals::TRACE), 'application/x-protobuf', $headers); $spanExporter = new SpanExporter($transport); // 3. Tambahkan TracerProvider global untuk membuat tracer. $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) // Menentukan apakah akan menutup TracerProvider secara otomatis saat Anda keluar dari aplikasi PHP. Ini memastikan bahwa semua data jejak dilaporkan. ->buildAndRegisterGlobal(); // Tambahkan TracerProvider secara global. } ?><your-service-name>: nama aplikasi Anda
<your-host-name>: nama host
<your-token>: token otentikasi yang digunakan untuk melaporkan data melalui gRPC
<grpc-endpoint>: titik akhir yang digunakan untuk melaporkan data melalui gRPC
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; // Inisialisasi OpenTelemetry selama inisialisasi aplikasi PHP. function initOpenTelemetry() { // 1. Tentukan informasi tentang sumber daya OpenTelemetry. $resource = ResourceInfoFactory::emptyResource()->merge(ResourceInfo::create(Attributes::create([ ResourceAttributes::SERVICE_NAME => '<your-service-name>', # Diperlukan. Nama aplikasi Anda. ResourceAttributes::HOST_NAME => '<your-host-name>' # Opsional. Nama host. ]))); // 2. (Opsional) Buat SpanExporter yang mengekspor data rentang ke konsol. // $spanExporter = new SpanExporter( // (new StreamTransportFactory())->create('php://stdout', 'application/json') // ); // 2. Buat SpanExporter yang melaporkan data rentang melalui HTTP. $transport = (new OtlpHttpTransportFactory())->create('<http-endpoint>','application/x-protobuf'); $spanExporter = new SpanExporter($transport); // 3. Tambahkan TracerProvider global untuk membuat tracer. $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) // Menentukan apakah akan menutup TracerProvider secara otomatis saat Anda keluar dari aplikasi PHP. Ini memastikan bahwa semua data jejak dilaporkan. ->buildAndRegisterGlobal(); // Tambahkan TracerProvider secara global. } ?><your-service-name>: nama aplikasi Anda
<your-host-name>: nama host
<http-endpoint>: titik akhir yang digunakan untuk melaporkan data melalui HTTP
Modifikasi kode aplikasi dan gunakan API OpenTelemetry untuk membuat rentang.
Impor paket yang diperlukan di file 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';Panggil metode initOpenTelemetry untuk menginisialisasi OpenTelemetry. Operasi ini harus dilakukan selama inisialisasi aplikasi PHP.
// Inisialisasi OpenTelemetry. Tentukan nama aplikasi, mode ekspor data jejak, dan titik akhir yang digunakan untuk melaporkan data jejak, serta buat TracerProvider global. initOpenTelemetry();Buat rentang saat memanggil operasi rolldice.
/** * 1. Deskripsi operasi: mensimulasikan permainan pelemparan dadu yang melempar dadu dan mengembalikan angka acak dalam rentang satu hingga enam. * Buat rentang, dan konfigurasikan atribut, acara, dan acara dengan atribut untuk rentang tersebut. */ $app->get('/rolldice', function (Request $request, Response $response) { // Dapatkan tracer. $tracer = \OpenTelemetry\API\Globals::tracerProvider()->getTracer('my-tracer'); // Buat rentang. $span = $tracer->spanBuilder("/rolldice")->startSpan(); // Konfigurasikan atribut untuk rentang. $span->setAttribute("http.method", "GET"); // Konfigurasikan acara untuk rentang. $span->addEvent("Init"); // Konfigurasikan acara dengan atribut. $eventAttributes = Attributes::create([ "key1" => "value", "key2" => 3.14159, ]); // Kode bisnis. $result = random_int(1,6); $response->getBody()->write(strval($result)); $span->addEvent("End"); // Hancurkan rentang. $span->end(); return $response; });Buat rentang bersarang.
Buat operasi rolltwodices untuk mensimulasikan permainan pelemparan dadu yang melempar dua dadu dan mengembalikan angka acak dalam rentang satu hingga enam.
Kode contoh berikut memberikan contoh cara membuat rentang bersarang:
$app->get('/rolltwodices', function (Request $request, Response $response) { // Dapatkan tracer. $tracer = \OpenTelemetry\API\Globals::tracerProvider()->getTracer('my-tracer'); // Buat rentang induk. $parentSpan = $tracer->spanBuilder("/rolltwodices/parent")->startSpan(); $scope = $parentSpan->activate(); $value1 = random_int(1,6); $childSpan = $tracer->spanBuilder("/rolltwodices/parent/child")->startSpan(); // Kode bisnis. $value2 = random_int(1,6); $result = "dice1: " . $value1 . ", dice2: " . $value2; // Hancurkan rentang. $childSpan->end(); $parentSpan->end(); $scope->detach(); $response->getBody()->write(strval($result)); return $response; });Gunakan rentang untuk mencatat pengecualian yang terjadi di kode.
Buat operasi error untuk mensimulasikan kasus di mana pengecualian terjadi di operasi.
Kode contoh berikut memberikan contoh cara menggunakan rentang untuk mencatat pengecualian yang terjadi di kode:
$app->get('/error', function (Request $request, Response $response) { // Dapatkan tracer. $tracer = \OpenTelemetry\API\Globals::tracerProvider()->getTracer('my-tracer'); // Buat rentang. $span3 = $tracer->spanBuilder("/error")->startSpan(); try { // Simulasikan kasus di mana pengecualian terjadi di kode. throw new \Exception('exception!'); } catch (\Throwable $t) { // Set status rentang ke error. $span3->setStatus(\OpenTelemetry\API\Trace\StatusCode::STATUS_ERROR, "pengecualian di span3!"); // Catat jejak tumpukan pengecualian. $span3->recordException($t, ['exception.escaped' => true]); } finally { $span3->end(); $response->getBody()->write("error"); return $response; } });
Jalankan aplikasi.
Jalankan perintah berikut:
php -S localhost:8080Kunjungi URL berikut di browser:
http://localhost:8080/rolldice http://localhost:8080/rolltwodices http://localhost:8080/errorSetiap kali Anda mengakses halaman, OpenTelemetry menghasilkan data jejak dan melaporkannya ke Managed Service for OpenTelemetry.
Lihat data jejak.
Masuk ke Managed Service for OpenTelemetry Console. Di halaman Applications, temukan aplikasi dan klik namanya. Di halaman detail aplikasi, lihat data jejak aplikasi.
