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

Commit 86fdbfc

Browse files
committed
wip
1 parent 1a8b788 commit 86fdbfc

File tree

3 files changed

+54
-31
lines changed

3 files changed

+54
-31
lines changed

README.md

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -10,24 +10,29 @@ This package provides a simple way to add [OpenTelemetry](https://opentelemetry.
1010

1111
## 🎯 Package Positioning
1212

13-
### vs Official Auto-Instrumentation Package
13+
### Built on Official Auto-Instrumentation
1414

15-
- **[Official Package](https://packagist.org/packages/open-telemetry/opentelemetry-auto-laravel)**: Automatic instrumentation using hooks, zero code changes required
16-
- **This Package**: Manual instrumentation with Laravel-style APIs, providing fine-grained control and additional features
15+
This package is **built on top of** the official [`open-telemetry/opentelemetry-auto-laravel`](https://packagist.org/packages/open-telemetry/opentelemetry-auto-laravel) package, providing additional manual instrumentation capabilities.
16+
17+
### Package Relationship
18+
19+
- **[Official Package](https://packagist.org/packages/open-telemetry/opentelemetry-auto-laravel)**: Foundation auto-instrumentation (automatically installed as dependency)
20+
- **This Package**: Additional manual instrumentation with Laravel-style APIs and enhanced features
1721

1822
### When to Use This Package
1923

20-
- ✅ Need precise control over span attributes and lifecycle
21-
- ✅ Want to integrate deeply with Laravel events and services
24+
- ✅ Need both automatic AND manual instrumentation
25+
- ✅ Want precise control over span attributes and lifecycle
26+
- ✅ Need to integrate deeply with Laravel events and services
2227
- ✅ Prefer explicit instrumentation with Laravel facades
2328
- ✅ Need custom watchers and middleware
2429
- ✅ Building complex tracing scenarios
2530

26-
### When to Use Official Auto-Instrumentation
31+
### When to Use Official Package Only
2732

28-
- ✅ Want zero-code instrumentation
33+
- ✅ Want zero-code instrumentation only
2934
- ✅ Need basic request/response tracing
30-
- ✅ Prefer automatic framework detection
35+
- ✅ Prefer minimal setup
3136

3237
## Installation
3338

@@ -135,20 +140,23 @@ OTEL_ENABLED=false
135140
OTEL_TRACES_EXPORTER=none
136141
```
137142

138-
### Alternative: Official Auto-Instrumentation Setup
143+
### Official Auto-Instrumentation Configuration
139144

140-
If you prefer automatic instrumentation (requires `ext-opentelemetry` and official auto package):
141-
142-
```bash
143-
composer require open-telemetry/opentelemetry-auto-laravel
144-
```
145+
This package automatically installs `open-telemetry/opentelemetry-auto-laravel` as a dependency. To enable the official auto-instrumentation features:
145146

146147
```dotenv
148+
# Enable PHP auto-instrumentation (requires ext-opentelemetry)
147149
OTEL_PHP_AUTOLOAD_ENABLED=true
148150
OTEL_PHP_TRACE_CLI_ENABLED=true
149151
OTEL_PROPAGATORS=baggage,tracecontext
152+
153+
# Basic OpenTelemetry configuration (used by both packages)
154+
OTEL_SERVICE_NAME=my-laravel-app
155+
OTEL_TRACES_EXPORTER=console
150156
```
151157

158+
**Note**: The official package provides automatic instrumentation, while this package adds manual instrumentation capabilities on top.
159+
152160
## Usage
153161

154162
### Register the middleware

composer.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,19 +16,19 @@
1616
],
1717
"require": {
1818
"php": ">=8.4",
19-
"laravel/framework": "^12.0",
19+
"laravel/framework": "^10.0|^11.0|^12.0",
2020
"open-telemetry/api": "^1.0",
2121
"open-telemetry/sdk": "^1.0",
22-
"open-telemetry/exporter-otlp": "^1.0"
22+
"open-telemetry/exporter-otlp": "^1.0",
23+
"open-telemetry/opentelemetry-auto-laravel": "^1.1.1"
2324
},
2425
"require-dev": {
2526
"orchestra/testbench": "^9.0",
2627
"laravel/pint": "^1.15",
2728
"spatie/test-time": "^1.3"
2829
},
2930
"suggest": {
30-
"ext-opentelemetry": "Required for zero-code instrumentation",
31-
"open-telemetry/opentelemetry-auto-laravel": "For automatic instrumentation (alternative to manual instrumentation)"
31+
"ext-opentelemetry": "Required for zero-code instrumentation"
3232
},
3333
"autoload-dev": {
3434
"psr-4": {

src/Support/TracerProviderManager.php

Lines changed: 28 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -30,41 +30,45 @@ public static function getTracerProvider(): TracerProviderInterface
3030

3131
private static function createTracerProvider(): TracerProviderInterface
3232
{
33-
// 首先尝试使用全局的 TracerProvider
33+
// 首先尝试使用全局的 TracerProvider(由 opentelemetry-auto-laravel 初始化)
3434
$globalProvider = Globals::tracerProvider();
3535

3636
// 检查是否是有效的 TracerProvider(不是 NoopTracerProvider)
3737
if (! ($globalProvider instanceof NoopTracerProvider)) {
3838
return $globalProvider;
3939
}
4040

41-
// 如果全局 TracerProvider 无效且配置启用,创建一个基本的 SDK TracerProvider
42-
if (config('otel.enabled', false) && config('otel.sdk.auto_initialize', true)) {
41+
// 如果官方包没有初始化 TracerProvider,且我们的配置允许,提供一个基本的 fallback
42+
if (config('otel.enabled', false) && config('otel.sdk.auto_initialize', false)) {
4343
try {
44-
return self::createSDKTracerProvider();
44+
if (config('app.debug')) {
45+
logger()->info('OpenTelemetry auto-laravel not initialized, creating fallback TracerProvider');
46+
}
47+
48+
return self::createFallbackTracerProvider();
4549
} catch (\Throwable $e) {
46-
// 如果创建失败,记录错误并使用 Noop Provider
4750
if (config('app.debug')) {
48-
logger()->warning('Failed to create OpenTelemetry TracerProvider', [
51+
logger()->warning('Failed to create fallback OpenTelemetry TracerProvider', [
4952
'error' => $e->getMessage(),
50-
'suggestion' => 'Check your OpenTelemetry configuration or install the opentelemetry extension',
53+
'suggestion' => 'Ensure opentelemetry-auto-laravel is properly configured or disable OTEL_SDK_AUTO_INITIALIZE',
5154
]);
5255
}
5356
}
5457
}
5558

56-
// 返回 Noop TracerProvider
59+
// 返回 Noop TracerProvider(这是预期的行为,当 OpenTelemetry 未配置时)
5760
return $globalProvider;
5861
}
5962

60-
private static function createSDKTracerProvider(): TracerProviderInterface
63+
private static function createFallbackTracerProvider(): TracerProviderInterface
6164
{
6265
$resource = ResourceInfo::create(Attributes::create([
6366
'service.name' => config('otel.sdk.service_name', config('app.name', 'laravel-app')),
6467
'service.version' => config('otel.sdk.service_version', '1.0.0'),
6568
'telemetry.sdk.name' => 'opentelemetry',
6669
'telemetry.sdk.language' => 'php',
6770
'telemetry.sdk.version' => \Composer\InstalledVersions::getVersion('open-telemetry/sdk') ?? 'unknown',
71+
'telemetry.auto.version' => 'manual-fallback', // 标识这是手动fallback
6872
]));
6973

7074
$tracerProviderBuilder = TracerProvider::builder()
@@ -96,11 +100,12 @@ private static function createSpanExporter(): ?\OpenTelemetry\SDK\Trace\SpanExpo
96100
private static function createOtlpExporter(): ?\OpenTelemetry\SDK\Trace\SpanExporterInterface
97101
{
98102
try {
99-
$endpoint = config('otel.otlp.endpoint', 'http://localhost:4318');
100-
$headers = config('otel.otlp.headers', []);
103+
// 注意:这里只是一个基本实现
104+
// 在实际使用中,用户应该通过 opentelemetry-auto-laravel 配置 OTLP
105+
if (config('app.debug')) {
106+
logger()->info('Using fallback console exporter instead of OTLP. For production OTLP, configure opentelemetry-auto-laravel properly.');
107+
}
101108

102-
// 这里需要根据实际的 OTLP exporter 实现来创建
103-
// 由于我们没有具体的 OTLP 配置,暂时返回 console exporter
104109
return new ConsoleSpanExporter;
105110
} catch (\Throwable $e) {
106111
logger()->warning('Failed to create OTLP exporter, falling back to console', [
@@ -130,6 +135,16 @@ public static function getProviderInfo(): array
130135
'class' => get_class($provider),
131136
'is_noop' => $provider instanceof NoopTracerProvider,
132137
'is_recording' => ! ($provider instanceof NoopTracerProvider),
138+
'source' => $provider instanceof NoopTracerProvider ? 'noop' :
139+
(self::isUsingGlobalProvider() ? 'auto-laravel' : 'fallback'),
133140
];
134141
}
142+
143+
private static function isUsingGlobalProvider(): bool
144+
{
145+
$globalProvider = Globals::tracerProvider();
146+
147+
return ! ($globalProvider instanceof NoopTracerProvider) &&
148+
self::getTracerProvider() === $globalProvider;
149+
}
135150
}

0 commit comments

Comments
 (0)