open-telemetry/context-swoole

OpenTelemetry PHP的异步Swoole/OpenSwoole上下文实现。

1.0.2 2024-09-17 09:20 UTC

This package is auto-updated.

Last update: 2024-09-17 09:27:26 UTC


README

Releases Issues Source Mirror Latest Version Stable

这是https://github.com/open-telemetry/opentelemetry-php-contrib的只读子树分割。

OpenTelemetry Swoole上下文

简体中文 | 英文

与PHP-FPM运行时不同,在Swoole中,每个进程可以同时处理多个HTTP请求。这个库解决了在使用OpenTelemetry时Swoole的上下文切换问题。

要求

  • php >= 8.0
  • swoole >= 4.5

安装

使用composer安装此包

composer require open-telemetry/context-swoole

注意:此库需要与OpenTelemetry一起使用,例如open-telemetry/opentelemetry

使用方法

快速通过Docker启动基于Jaeger的。

docker run -d --name jaeger \
  -p 16686:16686 \
  -p 4318:4318 \
  -p 4317:4317 \
  jaegertracing/all-in-one

注册TracerProvider并启动Swoole http服务器

<?php

use OpenTelemetry\API\Globals;
use OpenTelemetry\API\Instrumentation\Configurator;
use OpenTelemetry\API\Trace\SpanKind;
use OpenTelemetry\Context\Context;
use OpenTelemetry\Context\ContextStorage;
use OpenTelemetry\Contrib\Context\Swoole\SwooleContextStorage;
use OpenTelemetry\Contrib\Otlp\OtlpHttpTransportFactory;
use OpenTelemetry\Contrib\Otlp\SpanExporter;
use OpenTelemetry\SDK\Trace\SpanProcessor\SimpleSpanProcessor;
use OpenTelemetry\SDK\Trace\TracerProvider;
use Swoole\Http\Server;

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

// Create a tracer provider with the exporter and processor
$transport = (new OtlpHttpTransportFactory())->create('http://127.0.0.1:4318/v1/traces', 'application/json');
$exporter = new SpanExporter($transport);
$spanProcessor = new SimpleSpanProcessor($exporter);
$tracerProvider = new TracerProvider($spanProcessor);

// Use Swoole context storage
Context::setStorage(new SwooleContextStorage(new ContextStorage()));

// Register the tracer provider
Globals::registerInitializer(fn(Configurator $configurator) => $configurator->withTracerProvider($tracerProvider));

// Create a Swoole HTTP server, which will start on local port 9501
$http = new Server('127.0.0.1', 9501);

// Http request callback
$http->on('request', function ($request, $response) {
    $tracer = Globals::tracerProvider()->getTracer('io.opentelemetry.contrib.swoole.php');

    try {
        $root = $tracer->spanBuilder($request->server['request_uri'])
            ->setSpanKind(SpanKind::KIND_SERVER)
            ->startSpan();
        $scope = $root->activate();

        for ($i = 0; $i < 3; $i++) {
            // start a span, register some events
            $span = $tracer->spanBuilder('loop-' . $i)->startSpan();

            $span
                ->setAttribute('remote_ip', '1.2.3.4')
                ->setAttribute('country', 'USA');

            $span->addEvent('found_login' . $i, [
                'id' => $i,
                'username' => 'otuser' . $i,
            ]);
            $span->addEvent('generated_session', [
                'id' => md5((string) microtime(true)),
            ]);

            $span->end();
        }
    } finally {
        $root->end();
        $scope->detach();
    }

    $response->header('Content-Type', 'text/plain');
    $response->end('Hello Swoole Context');
});

// Start server
$http->start();

使用以下命令访问测试

curl -i 127.0.0.1:9501/swoole-context-demo

在Jaeger UI中查找跟踪:http://127.0.0.1:16686/ .