Skip to content

Commit 7eeaa13

Browse files
Feat/span processors (#22)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent a8a1645 commit 7eeaa13

18 files changed

Lines changed: 842 additions & 163 deletions

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@ vendor/
44
.idea/
55
.phpunit.result.cache
66
.phpunit.cache
7+
.vscode/

Makefile

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,5 @@ update:
1313
test:
1414
@docker-compose run --rm hyperf-opentelemetry -c "composer test"
1515

16+
ci:
17+
@docker-compose run --rm hyperf-opentelemetry -c "composer ci"

publish/open-telemetry.php

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,11 @@
1414
use Hyperf\OpenTelemetry\Factory\Trace\Exporter\OtlpHttpTraceExporterFactory;
1515
use Hyperf\OpenTelemetry\Factory\Trace\Exporter\StdoutTraceExporterFactory;
1616
use Hyperf\OpenTelemetry\Factory\Trace\Processor\BatchSpanProcessorFactory;
17+
use Hyperf\OpenTelemetry\Factory\Trace\Processor\ChannelBatchSpanProcessorFactory;
18+
use Hyperf\OpenTelemetry\Factory\Trace\Processor\DeferSpanProcessorFactory;
1719
use Hyperf\OpenTelemetry\Factory\Trace\Processor\SimpleSpanProcessorFactory;
1820
use Hyperf\OpenTelemetry\Factory\Trace\Sampler\AlwaysOnSamplerFactory;
21+
use Hyperf\OpenTelemetry\SpanProcessor\ChannelBatchSpanProcessor;
1922
use OpenTelemetry\SDK\Common\Export\TransportFactoryInterface;
2023
use OpenTelemetry\SDK\Logs\Processor\BatchLogRecordProcessor;
2124
use OpenTelemetry\SDK\Metrics\Data\Temporality;
@@ -77,12 +80,23 @@
7780
'schedule_delay_ms' => BatchSpanProcessor::DEFAULT_SCHEDULE_DELAY,
7881
'export_timeout_ms' => BatchSpanProcessor::DEFAULT_EXPORT_TIMEOUT,
7982
'max_export_batch_size' => BatchSpanProcessor::DEFAULT_MAX_EXPORT_BATCH_SIZE,
80-
'auto_flush' => false,
83+
'auto_flush' => true,
8184
],
8285
],
8386
'simple' => [
8487
'driver' => SimpleSpanProcessorFactory::class,
8588
],
89+
'defer' => [
90+
'driver' => DeferSpanProcessorFactory::class,
91+
],
92+
'channel' => [
93+
'driver' => ChannelBatchSpanProcessorFactory::class,
94+
'options' => [
95+
'max_batch_size' => ChannelBatchSpanProcessor::DEFAULT_MAX_EXPORT_BATCH_SIZE,
96+
'channel_capacity' => ChannelBatchSpanProcessor::DEFAULT_CHANNEL_CAPACITY,
97+
'flush_interval' => ChannelBatchSpanProcessor::DEFAULT_FLUSH_INTERVAL,
98+
],
99+
],
86100
],
87101
'samplers' => [
88102
'always_on' => [

src/ConfigProvider.php

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@ public function __invoke(): array
4242
],
4343
'listeners' => [
4444
Listener\MetricFlushListener::class,
45-
Listener\TraceFlushListener::class,
4645
Listener\OtelShutdownListener::class,
4746
Listener\DbQueryExecutedListener::class,
4847
],
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Hyperf\OpenTelemetry\Factory\Trace\Processor;
6+
7+
use Hyperf\Contract\ConfigInterface;
8+
use Hyperf\OpenTelemetry\SpanProcessor\ChannelBatchSpanProcessor;
9+
use OpenTelemetry\SDK\Trace\SpanExporterInterface;
10+
use OpenTelemetry\SDK\Trace\SpanProcessorInterface;
11+
12+
class ChannelBatchSpanProcessorFactory implements TraceProcessorFactoryInterface
13+
{
14+
public function __construct(
15+
protected readonly ConfigInterface $config,
16+
) {
17+
}
18+
19+
public function make(SpanExporterInterface $exporter): SpanProcessorInterface
20+
{
21+
$options = $this->config->get('open-telemetry.traces.processors.channel_batch.options', []);
22+
23+
return new ChannelBatchSpanProcessor(
24+
exporter: $exporter,
25+
maxBatchSize: $options['max_batch_size'] ?? ChannelBatchSpanProcessor::DEFAULT_MAX_EXPORT_BATCH_SIZE,
26+
channelCapacity: $options['channel_capacity'] ?? ChannelBatchSpanProcessor::DEFAULT_CHANNEL_CAPACITY,
27+
flushInterval: $options['flush_interval'] ?? ChannelBatchSpanProcessor::DEFAULT_FLUSH_INTERVAL,
28+
);
29+
}
30+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Hyperf\OpenTelemetry\Factory\Trace\Processor;
6+
7+
use Hyperf\OpenTelemetry\SpanProcessor\DeferSpanProcessor;
8+
use OpenTelemetry\SDK\Trace\SpanExporterInterface;
9+
use OpenTelemetry\SDK\Trace\SpanProcessorInterface;
10+
11+
class DeferSpanProcessorFactory implements TraceProcessorFactoryInterface
12+
{
13+
public function make(SpanExporterInterface $exporter): SpanProcessorInterface
14+
{
15+
return new DeferSpanProcessor($exporter);
16+
}
17+
}

src/Listener/DbQueryExecutedListener.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@ protected function featureName(): string
3939
return 'db_query';
4040
}
4141

42+
/**
43+
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
44+
* @SuppressWarnings(PHPMD.NPathComplexity)
45+
*/
4246
protected function onQueryExecuted(QueryExecuted $event): void
4347
{
4448
if (! $this->isTelemetryEnabled()) {

src/Listener/OtelShutdownListener.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public function listen(): array
3030

3131
public function process(object $event): void
3232
{
33-
Coroutine::create(function () {
33+
Coroutine::create(function (): void {
3434
try {
3535
$this->tracerProvider->shutdown();
3636
} catch (Throwable $e) {

src/Listener/TraceFlushListener.php

Lines changed: 0 additions & 33 deletions
This file was deleted.

src/Middleware/TraceMiddleware.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,13 @@ public function process(ServerRequestInterface $request, RequestHandlerInterface
3333

3434
$context = $this->instrumentation->propagator()->extract($request->getHeaders());
3535

36+
$name = $request->getMethod() . ' ' . Uri::sanitize(
37+
$path,
38+
$this->config->get('open-telemetry.traces.uri_mask', [])
39+
);
40+
3641
$scope = $this->instrumentation->startSpan(
37-
name: $request->getMethod() . ' ' . Uri::sanitize($path, $this->config->get('open-telemetry.traces.uri_mask', [])),
42+
name: $name,
3843
spanKind: SpanKind::KIND_SERVER,
3944
attributes: [
4045
HttpAttributes::HTTP_REQUEST_METHOD => $request->getMethod(),

0 commit comments

Comments
 (0)