|
9 | 9 | use Illuminate\Support\Facades\Http; |
10 | 10 | use Illuminate\Support\Facades\Log; |
11 | 11 | use OpenTelemetry\SemConv\TraceAttributes; |
12 | | -use OpenTelemetry\Tests\Contrib\Instrumentation\Laravel\Fixtures\Models\TestModel; |
13 | 12 |
|
14 | 13 | /** @psalm-suppress UnusedClass */ |
15 | 14 | class LaravelInstrumentationTest extends TestCase |
@@ -85,148 +84,6 @@ public function test_cache_log_db(): void |
85 | 84 | $this->assertSame(json_encode(['test' => true]), $logRecord->getAttributes()->toArray()['context']); |
86 | 85 | } |
87 | 86 |
|
88 | | - public function test_eloquent_operations(): void |
89 | | - { |
90 | | - // Assert storage is empty before interacting with the database |
91 | | - $this->assertCount(0, $this->storage); |
92 | | - |
93 | | - // Create the test_models table |
94 | | - DB::statement('CREATE TABLE IF NOT EXISTS test_models ( |
95 | | - id INTEGER PRIMARY KEY AUTOINCREMENT, |
96 | | - name TEXT, |
97 | | - created_at DATETIME, |
98 | | - updated_at DATETIME |
99 | | - )'); |
100 | | - |
101 | | - $this->router()->get('/eloquent', function () { |
102 | | - try { |
103 | | - // Test create |
104 | | - $created = TestModel::create(['name' => 'test']); |
105 | | - |
106 | | - // Test find |
107 | | - $found = TestModel::find($created->id); |
108 | | - |
109 | | - // Test update |
110 | | - $found->update(['name' => 'updated']); |
111 | | - |
112 | | - // Test delete |
113 | | - $found->delete(); |
114 | | - |
115 | | - return response()->json(['status' => 'ok']); |
116 | | - } catch (\Exception $e) { |
117 | | - return response()->json([ |
118 | | - 'error' => $e->getMessage(), |
119 | | - 'trace' => $e->getTraceAsString(), |
120 | | - ], 500); |
121 | | - } |
122 | | - }); |
123 | | - |
124 | | - $response = $this->call('GET', '/eloquent'); |
125 | | - if ($response->status() !== 200) { |
126 | | - $this->fail('Request failed: ' . $response->content()); |
127 | | - } |
128 | | - $this->assertEquals(200, $response->status()); |
129 | | - |
130 | | - $eloquentSpans = $this->resolveEloquentOperationSpans(); |
131 | | - |
132 | | - // Sort spans by operation type to ensure consistent order |
133 | | - usort($eloquentSpans, function ($a, $b) { |
134 | | - $operations = ['create' => 0, 'find' => 1, 'update' => 2, 'delete' => 3]; |
135 | | - $aOp = $a->getAttributes()->get('laravel.eloquent.operation'); |
136 | | - $bOp = $b->getAttributes()->get('laravel.eloquent.operation'); |
137 | | - |
138 | | - return ($operations[$aOp] ?? 999) <=> ($operations[$bOp] ?? 999); |
139 | | - }); |
140 | | - |
141 | | - // Create span |
142 | | - $createSpan = array_values(array_filter($eloquentSpans, function ($span) { |
143 | | - return $span->getAttributes()->get('laravel.eloquent.operation') === 'create'; |
144 | | - }))[0]; |
145 | | - $this->assertSame('OpenTelemetry\Tests\Contrib\Instrumentation\Laravel\Fixtures\Models\TestModel::create', $createSpan->getName()); |
146 | | - $this->assertSame('OpenTelemetry\Tests\Contrib\Instrumentation\Laravel\Fixtures\Models\TestModel', $createSpan->getAttributes()->get('laravel.eloquent.model')); |
147 | | - $this->assertSame('test_models', $createSpan->getAttributes()->get('laravel.eloquent.table')); |
148 | | - $this->assertSame('create', $createSpan->getAttributes()->get('laravel.eloquent.operation')); |
149 | | - |
150 | | - // Find span |
151 | | - $findSpan = array_values(array_filter($eloquentSpans, function ($span) { |
152 | | - return $span->getAttributes()->get('laravel.eloquent.operation') === 'find'; |
153 | | - }))[0]; |
154 | | - $this->assertSame('OpenTelemetry\Tests\Contrib\Instrumentation\Laravel\Fixtures\Models\TestModel::find', $findSpan->getName()); |
155 | | - $this->assertSame('OpenTelemetry\Tests\Contrib\Instrumentation\Laravel\Fixtures\Models\TestModel', $findSpan->getAttributes()->get('laravel.eloquent.model')); |
156 | | - $this->assertSame('test_models', $findSpan->getAttributes()->get('laravel.eloquent.table')); |
157 | | - $this->assertSame('find', $findSpan->getAttributes()->get('laravel.eloquent.operation')); |
158 | | - |
159 | | - // Update span |
160 | | - $updateSpan = array_values(array_filter($eloquentSpans, function ($span) { |
161 | | - return $span->getAttributes()->get('laravel.eloquent.operation') === 'update'; |
162 | | - }))[0]; |
163 | | - $this->assertSame('OpenTelemetry\Tests\Contrib\Instrumentation\Laravel\Fixtures\Models\TestModel::update', $updateSpan->getName()); |
164 | | - $this->assertSame('OpenTelemetry\Tests\Contrib\Instrumentation\Laravel\Fixtures\Models\TestModel', $updateSpan->getAttributes()->get('laravel.eloquent.model')); |
165 | | - $this->assertSame('test_models', $updateSpan->getAttributes()->get('laravel.eloquent.table')); |
166 | | - $this->assertSame('update', $updateSpan->getAttributes()->get('laravel.eloquent.operation')); |
167 | | - |
168 | | - // Delete span |
169 | | - $deleteSpan = array_values(array_filter($eloquentSpans, function ($span) { |
170 | | - return $span->getAttributes()->get('laravel.eloquent.operation') === 'delete'; |
171 | | - }))[0]; |
172 | | - $this->assertSame('OpenTelemetry\Tests\Contrib\Instrumentation\Laravel\Fixtures\Models\TestModel::delete', $deleteSpan->getName()); |
173 | | - $this->assertSame('OpenTelemetry\Tests\Contrib\Instrumentation\Laravel\Fixtures\Models\TestModel', $deleteSpan->getAttributes()->get('laravel.eloquent.model')); |
174 | | - $this->assertSame('test_models', $deleteSpan->getAttributes()->get('laravel.eloquent.table')); |
175 | | - $this->assertSame('delete', $deleteSpan->getAttributes()->get('laravel.eloquent.operation')); |
176 | | - } |
177 | | - |
178 | | - public function test_eloquent_static_operations(): void |
179 | | - { |
180 | | - // Assert storage is empty before interacting with the database |
181 | | - $this->assertCount(0, $this->storage); |
182 | | - |
183 | | - // Create the test_models table |
184 | | - DB::statement('CREATE TABLE IF NOT EXISTS test_models ( |
185 | | - id INTEGER PRIMARY KEY AUTOINCREMENT, |
186 | | - name TEXT, |
187 | | - created_at DATETIME, |
188 | | - updated_at DATETIME |
189 | | - )'); |
190 | | - |
191 | | - $this->router()->get('/eloquent', function () { |
192 | | - try { |
193 | | - // create record for Test destroy |
194 | | - $created = TestModel::create(['name' => 'test']); |
195 | | - |
196 | | - // Test destroy |
197 | | - TestModel::destroy([$created->id]); |
198 | | - |
199 | | - return response()->json(['status' => 'ok']); |
200 | | - } catch (\Exception $e) { |
201 | | - return response()->json([ |
202 | | - 'error' => $e->getMessage(), |
203 | | - 'trace' => $e->getTraceAsString(), |
204 | | - ], 500); |
205 | | - } |
206 | | - }); |
207 | | - |
208 | | - $response = $this->call('GET', '/eloquent'); |
209 | | - if ($response->status() !== 200) { |
210 | | - $this->fail('Request failed: ' . $response->content()); |
211 | | - } |
212 | | - $this->assertEquals(200, $response->status()); |
213 | | - |
214 | | - $eloquentSpans = $this->resolveEloquentOperationSpans(); |
215 | | - |
216 | | - // Destroy span |
217 | | - $destroySpans = array_values(array_filter($eloquentSpans, function ($span) { |
218 | | - return $span->getAttributes()->get('laravel.eloquent.operation') === 'destroy'; |
219 | | - })); |
220 | | - |
221 | | - $this->assertCount(1, $destroySpans); |
222 | | - |
223 | | - $destroySpan = $destroySpans[0]; |
224 | | - $this->assertSame('OpenTelemetry\Tests\Contrib\Instrumentation\Laravel\Fixtures\Models\TestModel::destroy', $destroySpan->getName()); |
225 | | - $this->assertSame('OpenTelemetry\Tests\Contrib\Instrumentation\Laravel\Fixtures\Models\TestModel', $destroySpan->getAttributes()->get('laravel.eloquent.model')); |
226 | | - $this->assertSame('test_models', $destroySpan->getAttributes()->get('laravel.eloquent.table')); |
227 | | - $this->assertSame('destroy', $destroySpan->getAttributes()->get('laravel.eloquent.operation')); |
228 | | - } |
229 | | - |
230 | 87 | public function test_low_cardinality_route_span_name(): void |
231 | 88 | { |
232 | 89 | $this->router()->get('/hello/{name}', fn () => null)->name('hello-name'); |
@@ -254,25 +111,4 @@ private function router(): Router |
254 | 111 | /** @psalm-suppress PossiblyNullReference */ |
255 | 112 | return $this->app->make(Router::class); |
256 | 113 | } |
257 | | - |
258 | | - /** |
259 | | - * @return array<int, \OpenTelemetry\SDK\Trace\ImmutableSpan> |
260 | | - */ |
261 | | - private function resolveEloquentOperationSpans(): array |
262 | | - { |
263 | | - // Verify spans for each Eloquent operation |
264 | | - /** @var array<int, \OpenTelemetry\SDK\Trace\ImmutableSpan> $spans */ |
265 | | - $spans = array_values(array_filter( |
266 | | - iterator_to_array($this->storage), |
267 | | - fn ($item) => $item instanceof \OpenTelemetry\SDK\Trace\ImmutableSpan |
268 | | - )); |
269 | | - |
270 | | - // Filter out SQL spans and keep only Eloquent spans |
271 | | - $eloquentSpans = array_values(array_filter( |
272 | | - $spans, |
273 | | - fn ($span) => str_contains($span->getName(), '::') |
274 | | - )); |
275 | | - |
276 | | - return $eloquentSpans; |
277 | | - } |
278 | 114 | } |
0 commit comments