Skip to content
This repository was archived by the owner on Dec 5, 2025. It is now read-only.

Commit 1dd109b

Browse files
committed
wip --deploy
1 parent 62a223a commit 1dd109b

File tree

9 files changed

+48
-87
lines changed

9 files changed

+48
-87
lines changed

src/Http/Middleware/AddTraceId.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ protected function getTraceId(): ?string
4646

4747
// If no root span, try to get from current active span
4848
$currentSpan = Span::getCurrent();
49-
if ($currentSpan && $currentSpan->getContext()->isValid()) {
49+
if ($currentSpan->getContext()->isValid()) {
5050
return $currentSpan->getContext()->getTraceId();
5151
}
5252

src/Http/Middleware/TraceRequest.php

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,7 @@
1515
class TraceRequest
1616
{
1717
/**
18-
* Handle an incoming request.
19-
*
20-
* @return mixed
18+
* @throws \Throwable
2119
*/
2220
public function handle(Request $request, Closure $next)
2321
{

src/Support/HttpAttributesHelper.php

Lines changed: 3 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,8 @@ class HttpAttributesHelper
1818
public static function shouldIgnoreRequest(Request $request): bool
1919
{
2020
$ignorePaths = config('otel.ignore_paths', []);
21-
$path = $request->path();
2221

23-
foreach ($ignorePaths as $pattern) {
24-
if (fnmatch($pattern, $path)) {
25-
return true;
26-
}
27-
}
28-
29-
return false;
22+
return array_any($ignorePaths, fn ($pattern) => fnmatch($pattern, $request->path()));
3023
}
3124

3225
/**
@@ -134,27 +127,16 @@ public static function setResponseHeaders(SpanInterface $span, Response $respons
134127
*/
135128
private static function isHeaderAllowed(string $headerName, array $allowedHeaders): bool
136129
{
137-
foreach ($allowedHeaders as $pattern) {
138-
if (fnmatch(strtolower($pattern), $headerName)) {
139-
return true;
140-
}
141-
}
130+
return array_any($allowedHeaders, fn ($pattern) => fnmatch(strtolower($pattern), $headerName));
142131

143-
return false;
144132
}
145133

146134
/**
147135
* Check if header is sensitive based on patterns
148136
*/
149137
private static function isHeaderSensitive(string $headerName, array $sensitiveHeaders): bool
150138
{
151-
foreach ($sensitiveHeaders as $pattern) {
152-
if (fnmatch(strtolower($pattern), $headerName)) {
153-
return true;
154-
}
155-
}
156-
157-
return false;
139+
return array_any($sensitiveHeaders, fn ($pattern) => fnmatch(strtolower($pattern), $headerName));
158140
}
159141

160142
/**

src/Support/Measure.php

Lines changed: 29 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@
44

55
use Closure;
66
use Illuminate\Contracts\Foundation\Application;
7-
use Illuminate\Support\Facades\Context as LaravelContext;
87
use Illuminate\Support\Facades\Log;
98
use OpenTelemetry\API\Globals;
109
use OpenTelemetry\API\Trace\NoopTracer;
10+
use OpenTelemetry\API\Trace\NoopTracerProvider;
1111
use OpenTelemetry\API\Trace\Span;
1212
use OpenTelemetry\API\Trace\SpanContextValidator;
1313
use OpenTelemetry\API\Trace\SpanInterface;
@@ -18,40 +18,42 @@
1818
use OpenTelemetry\Context\ContextInterface;
1919
use OpenTelemetry\Context\Propagation\TextMapPropagatorInterface;
2020
use OpenTelemetry\Context\ScopeInterface;
21+
use Throwable;
2122

2223
class Measure
2324
{
2425
private static ?SpanInterface $rootSpan = null;
2526

2627
private static ?ScopeInterface $rootScope = null;
2728

29+
private static ?bool $enabled = null;
30+
2831
public function __construct(protected Application $app) {}
2932

3033
// ======================= Enable/Disable Management =======================
3134

3235
public function enable(): void
3336
{
34-
LaravelContext::addHidden('otel.tracing.enabled', true);
37+
self::$enabled = true;
3538
}
3639

3740
public function disable(): void
3841
{
39-
LaravelContext::addHidden('otel.tracing.enabled', false);
42+
self::$enabled = false;
4043
}
4144

4245
public function isEnabled(): bool
4346
{
44-
// If context has not been set, fall back to the general config.
45-
if (LaravelContext::missingHidden('otel.tracing.enabled')) {
47+
if (self::$enabled === null) {
4648
return config('otel.enabled', true);
4749
}
4850

49-
return LaravelContext::getHidden('otel.tracing.enabled');
51+
return self::$enabled;
5052
}
5153

5254
public function reset(): void
5355
{
54-
LaravelContext::addHidden('otel.tracing.enabled', config('otel.enabled', true));
56+
self::$enabled = null;
5557

5658
// Only end root span in Octane mode
5759
// In FPM mode, each request is a separate process, so root span management is handled by middleware
@@ -67,7 +69,7 @@ public function reset(): void
6769
*/
6870
public function startRootSpan(string $name, array $attributes = [], ?ContextInterface $parentContext = null): SpanInterface
6971
{
70-
$parentContext = $parentContext ?: \OpenTelemetry\Context\Context::getRoot();
72+
$parentContext = $parentContext ?: Context::getRoot();
7173
$tracer = $this->tracer();
7274

7375
$span = $tracer->spanBuilder($name)
@@ -122,7 +124,7 @@ public function endRootSpan(): void
122124
if (self::$rootScope) {
123125
try {
124126
self::$rootScope->detach();
125-
} catch (\Throwable $e) {
127+
} catch (Throwable $e) {
126128
// Scope may have already been detached, ignore errors
127129
}
128130
self::$rootScope = null;
@@ -171,14 +173,14 @@ public function trace(string $name, Closure $callback, array $attributes = []):
171173
->setAttributes($attributes)
172174
->startSpan();
173175

174-
$scope = $span->storeInContext(\OpenTelemetry\Context\Context::getCurrent())->activate();
176+
$scope = $span->storeInContext(Context::getCurrent())->activate();
175177

176178
try {
177179
$result = $callback($span);
178180
$span->setStatus(StatusCode::STATUS_OK);
179181

180182
return $result;
181-
} catch (\Throwable $e) {
183+
} catch (Throwable $e) {
182184
$span->recordException($e);
183185
$span->setStatus(StatusCode::STATUS_ERROR, $e->getMessage());
184186
throw $e;
@@ -194,7 +196,8 @@ public function trace(string $name, Closure $callback, array $attributes = []):
194196
public function end(): void
195197
{
196198
$span = Span::getCurrent();
197-
if ($span && $span !== Span::getInvalid()) {
199+
200+
if ($span !== Span::getInvalid()) {
198201
$span->end();
199202
}
200203
}
@@ -212,7 +215,7 @@ public function addEvent(string $name, array $attributes = []): void
212215
/**
213216
* Record exception
214217
*/
215-
public function recordException(\Throwable $exception, array $attributes = []): void
218+
public function recordException(Throwable $exception, array $attributes = []): void
216219
{
217220
$this->activeSpan()->recordException($exception, $attributes);
218221
}
@@ -236,7 +239,17 @@ public function tracer(): TracerInterface
236239
return new NoopTracer;
237240
}
238241

239-
return $this->app->get(TracerInterface::class);
242+
try {
243+
return $this->app->get(TracerInterface::class);
244+
} catch (Throwable $e) {
245+
Log::error('OpenTelemetry: Tracer not found', [
246+
'error' => $e->getMessage(),
247+
'line' => $e->getLine(),
248+
'file' => $e->getFile(),
249+
]);
250+
251+
return new NoopTracer;
252+
}
240253
}
241254

242255
/**
@@ -301,7 +314,7 @@ public function extractContextFromPropagationHeaders(array $headers): ContextInt
301314
*/
302315
public function flush(): void
303316
{
304-
Globals::tracerProvider()->forceFlush();
317+
Globals::tracerProvider()?->forceFlush();
305318
}
306319

307320
/**
@@ -318,15 +331,9 @@ public function isOctane(): bool
318331
public function isRecording(): bool
319332
{
320333
$tracerProvider = Globals::tracerProvider();
321-
if (method_exists($tracerProvider, 'getSampler')) {
322-
$sampler = $tracerProvider->getSampler();
323-
324-
// This is a simplified check. A more robust check might involve checking sampler decision.
325-
return ! ($sampler instanceof \OpenTelemetry\SDK\Trace\Sampler\NeverOffSampler);
326-
}
327334

328335
// Fallback for NoopTracerProvider or other types
329-
return ! ($tracerProvider instanceof \OpenTelemetry\API\Trace\NoopTracerProvider);
336+
return ! ($tracerProvider instanceof NoopTracerProvider);
330337
}
331338

332339
/**
@@ -342,7 +349,6 @@ public function getStatus(): array
342349
return [
343350
'is_recording' => $isRecording,
344351
'is_noop' => ! $isRecording,
345-
'active_spans_count' => Context::storage()->count(),
346352
'current_trace_id' => $traceId !== '00000000000000000000000000000000' ? $traceId : null,
347353
'tracer_provider' => [
348354
'class' => get_class($tracerProvider),

src/Watchers/AuthenticateWatcher.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ public function recordFailed(Failed $event): void
9595
$span->setAttributes([
9696
'auth.guard' => $event->guard,
9797
'auth.credentials.count' => count($event->credentials),
98-
TraceAttributes::ENDUSER_ID => $event->user ? $event->user->getAuthIdentifier() : null,
98+
TraceAttributes::ENDUSER_ID => $event->user?->getAuthIdentifier(),
9999
]);
100100

101101
$span->end();
@@ -111,7 +111,7 @@ public function recordLogout(Logout $event): void
111111

112112
$span->setAttributes([
113113
'auth.guard' => $event->guard,
114-
TraceAttributes::ENDUSER_ID => $event->user ? $event->user->getAuthIdentifier() : null,
114+
TraceAttributes::ENDUSER_ID => $event->user?->getAuthIdentifier(),
115115
'auth.user.type' => $event->user ? get_class($event->user) : null,
116116
]);
117117

src/Watchers/EventWatcher.php

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -71,12 +71,6 @@ protected function shouldSkip(string $eventName): bool
7171
return true;
7272
}
7373

74-
foreach ($this->eventsToSkip as $eventToSkip) {
75-
if (fnmatch($eventToSkip, $eventName)) {
76-
return true;
77-
}
78-
}
79-
80-
return false;
74+
return array_any($this->eventsToSkip, fn ($eventToSkip) => fnmatch($eventToSkip, $eventName));
8175
}
8276
}

src/Watchers/HttpClientWatcher.php

Lines changed: 6 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use Illuminate\Http\Client\Events\ResponseReceived;
1111
use Illuminate\Http\Client\Request;
1212
use Illuminate\Http\Client\Response;
13+
use Illuminate\Support\Facades\Http;
1314
use OpenTelemetry\API\Trace\SpanInterface;
1415
use OpenTelemetry\API\Trace\SpanKind;
1516
use OpenTelemetry\API\Trace\StatusCode;
@@ -57,7 +58,7 @@ public function recordRequest(RequestSending $request): void
5758
$tracer = Measure::tracer();
5859
$span = $tracer->spanBuilder(SpanNameHelper::httpClient($request->request->method(), $processedUrl))
5960
->setSpanKind(SpanKind::KIND_CLIENT)
60-
->setParent(Context::getCurrent()) // ✅ 修复:使用当前 context 作为父 context
61+
->setParent(Context::getCurrent())
6162
->setAttributes([
6263
TraceAttributes::HTTP_REQUEST_METHOD => $request->request->method(),
6364
TraceAttributes::URL_FULL => $processedUrl,
@@ -181,27 +182,15 @@ private function setResponseHeaders(SpanInterface $span, Response $response): vo
181182
*/
182183
private function isHeaderAllowed(string $headerName, array $allowedHeaders): bool
183184
{
184-
foreach ($allowedHeaders as $pattern) {
185-
if (fnmatch(strtolower($pattern), $headerName)) {
186-
return true;
187-
}
188-
}
189-
190-
return false;
185+
return array_any($allowedHeaders, fn ($pattern) => fnmatch(strtolower($pattern), $headerName));
191186
}
192187

193188
/**
194189
* Check if header is sensitive based on patterns
195190
*/
196191
private function isHeaderSensitive(string $headerName, array $sensitiveHeaders): bool
197192
{
198-
foreach ($sensitiveHeaders as $pattern) {
199-
if (fnmatch(strtolower($pattern), $headerName)) {
200-
return true;
201-
}
202-
}
203-
204-
return false;
193+
return array_any($sensitiveHeaders, fn ($pattern) => fnmatch(strtolower($pattern), $headerName));
205194
}
206195

207196
private function createRequestComparisonHash(Request $request): string
@@ -242,13 +231,7 @@ private function hasTracingMiddleware(array $headers): bool
242231
'x-b3-spanid',
243232
];
244233

245-
foreach ($tracingHeaders as $headerName) {
246-
if (isset($headers[$headerName]) || isset($headers[ucfirst($headerName)]) || isset($headers[strtoupper($headerName)])) {
247-
return true;
248-
}
249-
}
250-
251-
return false;
234+
return array_any($tracingHeaders, fn ($headerName) => isset($headers[$headerName]) || isset($headers[ucfirst($headerName)]) || isset($headers[strtoupper($headerName)]));
252235
}
253236

254237
/**
@@ -262,11 +245,9 @@ protected function registerHttpClientMiddleware(Application $app): void
262245
}
263246

264247
// Register global request middleware to automatically add propagation headers
265-
\Illuminate\Support\Facades\Http::globalRequestMiddleware(function ($request) {
266-
// 获取当前上下文的传播头
248+
Http::globalRequestMiddleware(function ($request) {
267249
$propagationHeaders = Measure::propagationHeaders();
268250

269-
// 为每个传播头添加到请求中
270251
foreach ($propagationHeaders as $name => $value) {
271252
$request = $request->withHeader($name, $value);
272253
}

src/Watchers/RedisWatcher.php

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
use Illuminate\Redis\Events\CommandExecuted;
99
use OpenTelemetry\API\Trace\SpanKind;
1010
use OpenTelemetry\Context\Context;
11-
use OpenTelemetry\SemConv\TraceAttributes;
1211
use Overtrue\LaravelOpenTelemetry\Facades\Measure;
1312
use Overtrue\LaravelOpenTelemetry\Support\SpanNameHelper;
1413

@@ -37,8 +36,8 @@ public function recordCommand(CommandExecuted $event): void
3736
->startSpan();
3837

3938
$attributes = [
40-
TraceAttributes::DB_SYSTEM => 'redis',
41-
TraceAttributes::DB_STATEMENT => $this->formatCommand($event->command, $event->parameters),
39+
'db.system.name' => 'redis',
40+
'dn.statement' => $this->formatCommand($event->command, $event->parameters),
4241
'db.connection' => $event->connectionName,
4342
'db.command.time_ms' => $event->time,
4443
];

tests/Support/MeasureTest.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
namespace Overtrue\LaravelOpenTelemetry\Tests\Support;
44

5-
use Illuminate\Support\Facades\Context as LaravelContext;
65
use Mockery;
76
use OpenTelemetry\API\Globals;
87
use OpenTelemetry\API\Trace\SpanBuilderInterface;
@@ -28,11 +27,13 @@ public function test_enable_and_disable_tracing()
2827

2928
public function test_is_enabled_falls_back_to_config()
3029
{
31-
LaravelContext::forget('otel.tracing.enabled');
30+
Measure::reset();
3231

3332
config()->set('otel.enabled', true);
3433
$this->assertTrue(Measure::isEnabled());
3534

35+
Measure::reset();
36+
3637
config()->set('otel.enabled', false);
3738
$this->assertFalse(Measure::isEnabled());
3839
}

0 commit comments

Comments
 (0)