https://github.com/opentelemetry-php/context-swoole
[READONLY] Swoole context
https://github.com/opentelemetry-php/context-swoole
Last synced: 12 months ago
JSON representation
[READONLY] Swoole context
- Host: GitHub
- URL: https://github.com/opentelemetry-php/context-swoole
- Owner: opentelemetry-php
- Created: 2022-11-29T03:41:17.000Z (over 3 years ago)
- Default Branch: main
- Last Pushed: 2025-03-12T10:22:35.000Z (over 1 year ago)
- Last Synced: 2025-07-01T23:48:43.117Z (about 1 year ago)
- Language: PHP
- Size: 17.6 KB
- Stars: 6
- Watchers: 4
- Forks: 4
- Open Issues: 0
-
Metadata Files:
- Readme: README-zh_CN.md
Awesome Lists containing this project
README
[](https://github.com/opentelemetry-php/context-swoole/releases)
[](https://github.com/open-telemetry/opentelemetry-php/issues)
[](https://github.com/open-telemetry/opentelemetry-php-contrib/tree/main/src/Context/Swoole)
[](https://github.com/opentelemetry-php/context-swoole)
[](https://packagist.org/packages/open-telemetry/context-swoole/)
[](https://packagist.org/packages/open-telemetry/context-swoole/)
This is a read-only subtree split of .
# OpenTelemetry Swoole context
[简体中文](README-zh_CN.md) | [ENGLISH](README.md)
不同于传统的 php-fpm 运行时单个进程同一时刻只处理一个请求,在 Swoole 中每个进程同时会处理多个 http 请求,这个库解决在 Swoole 中使用 Opentelemetry 的上下文切换问题。
## Requirement
* php >= 8.0
* swoole >= 4.5
## 安装
Install the package with composer:
```bash
composer require open-telemetry/context-swoole
```
请注意,该库需要与 OpenTelemetry 配合使用,例如 `open-telemetry/opentelemetry`.
## 使用
基于 docker 快速启动 jaeger
```bash
docker run -d --name jaeger \
-p 16686:16686 \
-p 4318:4318 \
-p 4317:4317 \
jaegertracing/all-in-one
```
注册 `TracerProvider` 并启动 Swoole http server:
```php
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();
```
使用以下命令进行访问测试:
```bash
curl -i 127.0.0.1:9501/swoole-context-demo
```
最后打开浏览器访问 jaeger UI: 查询链路信息。