opentelemetry-php/tests/Sdk/Unit/Trace/TracingTest.php

679 lines
29 KiB
PHP

<?php
declare(strict_types=1);
namespace OpenTelemetry\Tests\Sdk\Unit\Trace;
use function iterator_to_array;
use OpenTelemetry\Sdk\Resource\ResourceConstants;
use OpenTelemetry\Sdk\Resource\ResourceInfo;
use OpenTelemetry\Sdk\Trace as SDK;
use OpenTelemetry\Sdk\Trace\Attribute;
use OpenTelemetry\Sdk\Trace\Attributes;
use OpenTelemetry\Sdk\Trace\Clock;
use OpenTelemetry\Sdk\Trace\Span;
use OpenTelemetry\Sdk\Trace\SpanContext;
use OpenTelemetry\Sdk\Trace\SpanStatus;
use OpenTelemetry\Sdk\Trace\Tracer;
use OpenTelemetry\Sdk\Trace\TracerProvider;
use PHPUnit\Framework\TestCase;
class TracingTest extends TestCase
{
public function testContextGenerationAndRestore()
{
$spanContext = SpanContext::generate();
$this->assertSame(strlen($spanContext->getTraceId()), 32);
$this->assertSame(strlen($spanContext->getSpanId()), 16);
$this->assertSame(strlen($spanContext->getSpanId()), 16);
$spanContext2 = SpanContext::generate();
$this->assertNotSame($spanContext->getTraceId(), $spanContext2->getTraceId());
$this->assertNotSame($spanContext->getSpanId(), $spanContext2->getSpanId());
$spanContext3 = SpanContext::restore($spanContext->getTraceId(), $spanContext->getSpanId());
$this->assertSame($spanContext3->getTraceId(), $spanContext->getTraceId());
$this->assertSame($spanContext3->getSpanId(), $spanContext->getSpanId());
}
public function testTracerSpanContextRestore()
{
$tracerProvider = new SDK\TracerProvider();
$tracer = new Tracer($tracerProvider, ResourceInfo::create(new Attributes([])));
$tracer->startAndActivateSpan('tracer1.firstSpan');
$spanContext = $tracer->getActiveSpan()->getContext();
$spanContext2 = SpanContext::restore($spanContext->getTraceId(), $spanContext->getSpanId());
$tracer2 = new Tracer($tracerProvider, ResourceInfo::create(new Attributes([])), $spanContext2);
$tracer2->startAndActivateSpan('tracer2.firstSpan');
$this->assertSame(
$tracer->getActiveSpan()->getContext()->getTraceId(),
$tracer2->getActiveSpan()->getContext()->getTraceId()
);
}
public function testSpanNameUpdate()
{
$tracerProvider = new SDK\TracerProvider();
$tracer = $tracerProvider->getTracer('OpenTelemetry.TracingTest');
$database = $tracer->startAndActivateSpan('database');
$this->assertSame($database->getSpanName(), 'database');
$database->updateName('tarantool');
$this->assertSame($database->getSpanName(), 'tarantool');
}
public function testNestedSpans()
{
$tracerProvider = new SDK\TracerProvider();
/** @var Tracer $tracer */
$tracer = $tracerProvider->getTracer('OpenTelemetry.TracingTest');
$guard = $tracer->startAndActivateSpan('guard.validate');
$connection = $tracer->startAndActivateSpan('guard.validate.connection');
$procedure = $tracer->startAndActivateSpan('guard.procedure.registration')->end();
$connection->end();
$policy = $tracer->startAndActivateSpan('policy.describe')->end();
$guard->end();
$this->assertEquals($connection->getParent(), $guard->getContext());
$this->assertEquals($procedure->getParent(), $connection->getContext());
$this->assertEquals($policy->getParent(), $guard->getContext());
$this->assertCount(4, $tracer->getSpans());
}
public function testCreateSpan()
{
$tracerProvider = new SDK\TracerProvider();
$tracer = $tracerProvider->getTracer('OpenTelemetry.TracingTest');
$tracer->startAndActivateSpan('firstSpan');
$global = $tracer->getActiveSpan();
/** @var SDK\Span $mysql */
$mysql = $tracer->startAndActivateSpan('mysql');
$this->assertSame($tracer->getActiveSpan(), $mysql);
$this->assertSame($global->getContext()->getTraceId(), $mysql->getContext()->getTraceId());
$this->assertEquals($mysql->getParent(), $global->getContext());
$this->assertNotNull($mysql->getStartEpochTimestamp());
$this->assertTrue($mysql->isRecording());
$this->assertNull($mysql->getDuration());
$mysql->end();
$this->assertFalse($mysql->isRecording());
$this->assertNotNull($mysql->getDuration());
$duration = $mysql->getDuration();
// subsequent calls to end should be ignored
$mysql->end();
self::assertSame($duration, $mysql->getDuration());
self::assertTrue($mysql->isStatusOK());
// active span rolled back
$this->assertSame($tracer->getActiveSpan(), $global);
}
public function testCreateSpanWithSampler()
{
$tracerProvider = new SDK\TracerProvider(null, new SDK\Sampler\AlwaysOffSampler());
$tracer = $tracerProvider->getTracer('OpenTelemetry.TracingTest');
$tracer->startAndActivateSpan('firstSpan');
$global = $tracer->getActiveSpan();
$this->assertSame($tracer->getActiveSpan(), $global);
/** @var SDK\Span $mysql */
$mysql = $tracer->startAndActivateSpan('mysql');
$this->assertSame($tracer->getActiveSpan(), $mysql);
$this->assertSame($global->getContext()->getTraceId(), $mysql->getContext()->getTraceId());
$this->assertNotNull($mysql->getStartEpochTimestamp());
$this->assertFalse($mysql->isRecording());
$this->assertNull($mysql->getDuration());
$mysql->end();
$this->assertFalse($mysql->isRecording());
$this->assertNull($mysql->getDuration());
self::assertTrue($mysql->isStatusOK());
// active span rolled back
$this->assertSame($tracer->getActiveSpan(), $global);
}
public function testStatusManipulation()
{
$tracerProvider = new SDK\TracerProvider();
/** @var Tracer $tracer */
$tracer = $tracerProvider->getTracer('OpenTelemetry.TracingTest');
$cancelled = $tracer->startAndActivateSpan('cancelled')
->setSpanStatus(SpanStatus::CANCELLED)
->end();
self::assertFalse($cancelled->isStatusOK());
self::assertSame(SpanStatus::CANCELLED, $cancelled->getCanonicalStatusCode());
self::assertSame(SpanStatus::DESCRIPTION[SpanStatus::CANCELLED], $cancelled->getStatusDescription());
self::assertCount(1, $tracer->getSpans());
}
public function testSetSpanStatusWhenNotRecording()
{
$tracerProvider = new SDK\TracerProvider();
$tracer = $tracerProvider->getTracer('OpenTelemetry.TracingTest');
$span = $tracer->startAndActivateSpan('span')
->setSpanStatus(SpanStatus::UNKNOWN, 'my description')
->end()
->setSpanStatus(SpanStatus::CANCELLED, 'nope');
$this->assertEquals(SpanStatus::new(SpanStatus::UNKNOWN, 'my description'), $span->getStatus());
}
public function testSpanAttributesApi()
{
$tracerProvider = new SDK\TracerProvider();
$tracer = $tracerProvider->getTracer('OpenTelemetry.TracingTest');
$tracer->startAndActivateSpan('firstSpan');
/**
* @var SDK\Span
*/
$span = $tracer->getActiveSpan();
self::assertInstanceOf(SDK\Span::class, $span);
// set attributes
$span->replaceAttributes(new Attributes(['username' => 'nekufa']));
// get attribute
$this->assertEquals(new Attribute('username', 'nekufa'), $span->getAttribute('username'));
// otherwrite
$span->replaceAttributes(new Attributes(['email' => 'nekufa@gmail.com']));
// null attributes
self::assertNull($span->getAttribute('username'));
/** @var Attribute $email */
$email = $span->getAttribute('email');
self::assertEquals(new Attribute('email', 'nekufa@gmail.com'), $email);
// set attribute
$span->setAttribute('username', 'nekufa');
$attributes = $span->getAttributes();
self::assertCount(2, $attributes);
/** @var Attribute $username */
$username = $span->getAttribute('username');
self::assertEquals(new Attribute('email', 'nekufa@gmail.com'), $email);
self::assertEquals(new Attribute('username', 'nekufa'), $username);
// attribute key - code coverage
self::assertEquals('email', $email->getKey());
self::assertEquals('username', $username->getKey());
// keep order
$expected = [
'a' => new Attribute('a', 1),
'b' => new Attribute('b', 2),
];
$span->replaceAttributes(new Attributes(['a' => 1, 'b' => 2]));
$actual = iterator_to_array($span->getAttributes());
self::assertEquals($expected, $actual);
// attribute update don't change the order
$span->setAttribute('a', 3);
$span->setAttribute('b', 4);
$expected = [
'a' => new Attribute('a', 3),
'b' => new Attribute('b', 4),
];
$actual = iterator_to_array($span->getAttributes());
self::assertEquals($expected, $actual);
}
public function testSetAttributeReplaceAttributesWhenNotRecording()
{
$tracer = (new SDK\TracerProvider())->getTracer('OpenTelemetry.TracingTest');
/** @var SDK\Span $span */
$span = $tracer->startAndActivateSpan('testSpan');
$span->setAttribute('key1', 'value1');
$span->end();
$this->assertFalse($span->isRecording());
$this->assertCount(1, $span->getAttributes());
$this->assertArrayHasKey('key1', iterator_to_array($span->getAttributes()));
$span->setAttribute('key2', 'value2');
$this->assertCount(1, $span->getAttributes());
$this->assertArrayHasKey('key1', iterator_to_array($span->getAttributes()));
$this->assertArrayNotHasKey('key2', iterator_to_array($span->getAttributes()));
$span->replaceAttributes(new Attributes(['foo' => 'bar']));
$this->assertCount(1, $span->getAttributes());
$this->assertArrayHasKey('key1', iterator_to_array($span->getAttributes()));
$this->assertArrayNotHasKey('foo', iterator_to_array($span->getAttributes()));
}
public function testEventRegistration()
{
$tracerProvider = new SDK\TracerProvider();
$tracer = $tracerProvider->getTracer('OpenTelemetry.TracingTest');
$span = $tracer->startAndActivateSpan('database');
$eventAttributes = new Attributes([
'space' => 'guard.session',
'id' => 67235,
]);
$timestamp = Clock::get()->timestamp();
$span->addEvent('select', $timestamp, $eventAttributes);
$events = $span->getEvents();
self::assertCount(1, $events);
[$event] = iterator_to_array($events);
$this->assertSame($event->getName(), 'select');
$attributes = new Attributes([
'space' => 'guard.session',
'id' => 67235,
]);
self::assertEquals($attributes, $event->getAttributes());
$span->addEvent('update', $timestamp)
->setAttribute('space', 'guard.session')
->setAttribute('id', 67235)
->setAttribute('active_at', time());
$this->assertCount(2, $span->getEvents());
}
public function testAddEventWhenNotRecording()
{
$tracerProvider = new SDK\TracerProvider();
$tracer = $tracerProvider->getTracer('OpenTelemetry.TracingTest');
$span = $tracer->startAndActivateSpan('span');
$span->addEvent('recorded_event', 0);
$events = $span->getEvents();
self::assertCount(1, $events);
[$event] = iterator_to_array($events);
$this->assertSame($event->getName(), 'recorded_event');
$span->end();
$span->addEvent('not_recorded_event', 1);
$this->assertCount(1, $span->getEvents());
[$event] = iterator_to_array($events);
$this->assertSame($event->getName(), 'recorded_event');
}
public function testStopRecordingWhenSpanEnds()
{
$tracerProvider = new SDK\TracerProvider();
$tracer = $tracerProvider->getTracer('OpenTelemetry.TracingTest');
$span = $tracer->startAndActivateSpan('span');
$this->assertTrue($span->isRecording());
$span->end();
$this->assertFalse($span->isRecording());
}
public function testParentSpanContext()
{
$tracerProvider = new SDK\TracerProvider();
$tracer = $tracerProvider->getTracer('OpenTelemetry.TracingTest');
$tracer->startAndActivateSpan('firstSpan');
$global = $tracer->getActiveSpan();
$request = $tracer->startAndActivateSpan('request');
$requestParent = $request->getParent();
$this->assertNotNull($requestParent);
$this->assertSame($requestParent->getSpanId(), $global->getContext()->getSpanId());
$this->assertNull($global->getParent());
}
public function testActiveRootSpanIsNoopSpanIfNoParentProvided()
{
$tracer = (new SDK\TracerProvider())->getTracer('OpenTelemetry.TracingTest');
$this->assertInstanceOf(
SDK\NoopSpan::class,
$tracer->getActiveSpan()
);
}
public function testCreateSpanResourceNonDefaultTraceProviderNonDefaultTrace()
{
/*
* A resource can be associated with the TracerProvider when the TracerProvider is created.
* That association cannot be changed later. When associated with a TracerProvider, all
* Spans produced by any Tracer from the provider MUST be associated with this Resource.
*/
// Create a new provider with a resource containing 2 attributes.
$providerResource = ResourceInfo::create(new Attributes(['provider' => 'primary', 'empty' => '']));
$traceProvider = new TracerProvider($providerResource);
$tpAttributes = $traceProvider->getResource()->getAttributes();
// Verify the resource associated with the trace provider.
$this->assertCount(5, $tpAttributes);
/** @var Attribute $primary */
$primary = $tpAttributes->getAttribute('provider');
/** @var Attribute $empty */
$empty = $tpAttributes->getAttribute('empty');
$this->assertEquals('primary', $primary->getValue());
$this->assertEquals('', $empty->getValue());
// Add a Tracer. The trace provider should add its resource to the new Tracer.
/** @var Tracer $tracer */
$tracer = $traceProvider->getTracer('name', 'version');
$resource = $tracer->getResource();
$attributes = $resource->getAttributes();
// Verify the resource associated with the tracer.
/** @var Attribute $name */
$name = $resource->getAttributes()->getAttribute('name');
/** @var Attribute $sdkname */
$sdkname = $resource->getAttributes()->getAttribute(ResourceConstants::TELEMETRY_SDK_NAME);
/** @var Attribute $sdklanguage */
$sdklanguage = $resource->getAttributes()->getAttribute(ResourceConstants::TELEMETRY_SDK_LANGUAGE);
/** @var Attribute $sdkversion */
$sdkversion = $resource->getAttributes()->getAttribute(ResourceConstants::TELEMETRY_SDK_VERSION);
/** @var Attribute $servicename */
$servicename = $attributes->getAttribute(ResourceConstants::SERVICE_NAME);
/** @var Attribute $serviceversion */
$serviceversion = $attributes->getAttribute(ResourceConstants::SERVICE_VERSION);
/** @var Attribute $primary */
$primary = $attributes->getAttribute('provider');
/** @var Attribute $empty */
$empty = $attributes->getAttribute('empty');
$this->assertEquals('primary', $primary->getValue());
$this->assertEquals('', $empty->getValue());
$this->assertEquals('opentelemetry', $sdkname->getValue());
$this->assertEquals('php', $sdklanguage->getValue());
$this->assertEquals('dev', $sdkversion->getValue());
$this->assertEquals('name', $servicename->getValue());
$this->assertEquals('version', $serviceversion->getValue());
$this->assertCount(8, $attributes);
// Start a span with the tracer.
$tracer->startAndActivateSpan('firstSpan');
/** @var Span $global */
$global = $tracer->getActiveSpan();
$this->assertSame($tracer->getActiveSpan(), $global);
// Verify the resource associated with the span.
/** @var Attributes $attributes */
$attributes = $global->getResource()->getAttributes();
/** @var Attribute $name */
$name = $resource->getAttributes()->getAttribute('name');
/** @var Attribute $sdkname */
$sdkname = $resource->getAttributes()->getAttribute(ResourceConstants::TELEMETRY_SDK_NAME);
/** @var Attribute $sdklanguage */
$sdklanguage = $resource->getAttributes()->getAttribute(ResourceConstants::TELEMETRY_SDK_LANGUAGE);
/** @var Attribute $sdkversion */
$sdkversion = $resource->getAttributes()->getAttribute(ResourceConstants::TELEMETRY_SDK_VERSION);
/** @var Attribute $servicename */
$servicename = $attributes->getAttribute(ResourceConstants::SERVICE_NAME);
/** @var Attribute $serviceversion */
$serviceversion = $attributes->getAttribute(ResourceConstants::SERVICE_VERSION);
/** @var Attribute $primary */
$primary = $attributes->getAttribute('provider');
/** @var Attribute $empty */
$empty = $attributes->getAttribute('empty');
$this->assertEquals('primary', $primary->getValue());
$this->assertEquals('', $empty->getValue());
$this->assertEquals('opentelemetry', $sdkname->getValue());
$this->assertEquals('php', $sdklanguage->getValue());
$this->assertEquals('dev', $sdkversion->getValue());
$this->assertEquals('name', $servicename->getValue());
$this->assertEquals('version', $serviceversion->getValue());
$this->assertCount(8, $attributes);
}
public function testCreateSpanGetsResourceFromDefaultTraceProviderDefaultTrace()
{
/*
* A resource can be associated with the TracerProvider when the TracerProvider is created.
* That association cannot be changed later. When associated with a TracerProvider, all
* Spans produced by any Tracer from the provider MUST be associated with this Resource.
*/
// Create a new provider.
$traceProvider = new TracerProvider();
$tpAttributes = $traceProvider->getResource()->getAttributes();
// Verify the resource associated with the trace provider.
$this->assertCount(0, $tpAttributes);
// Add a Tracer. The trace provider should merge its resource one inherited from the traceprovider.
/** @var Tracer $tracer */
$tracer = $traceProvider->getTracer('name');
$resource = $tracer->getResource();
$attributes = $resource->getAttributes();
// Verify the resource associated with the tracer.
/** @var Attribute $sdkname */
$sdkname = $resource->getAttributes()->getAttribute(ResourceConstants::TELEMETRY_SDK_NAME);
/** @var Attribute $sdklanguage */
$sdklanguage = $resource->getAttributes()->getAttribute(ResourceConstants::TELEMETRY_SDK_LANGUAGE);
/** @var Attribute $sdkversion */
$sdkversion = $resource->getAttributes()->getAttribute(ResourceConstants::TELEMETRY_SDK_VERSION);
/** @var Attribute $servicename */
$servicename = $attributes->getAttribute(ResourceConstants::SERVICE_NAME);
/** @var Attribute $serviceversion */
$serviceversion = $attributes->getAttribute(ResourceConstants::SERVICE_VERSION);
$this->assertEquals('opentelemetry', $sdkname->getValue());
$this->assertEquals('php', $sdklanguage->getValue());
$this->assertEquals('dev', $sdkversion->getValue());
$this->assertEquals('name', $servicename->getValue());
$this->assertEquals('', $serviceversion->getValue());
$this->assertCount(6, $attributes);
// Start a span with the tracer.
$tracer->startAndActivateSpan('firstSpan');
/** @var Span $global */
$global = $tracer->getActiveSpan();
$this->assertSame($tracer->getActiveSpan(), $global);
// Verify the resource associated with the span.
$attributes = $global->getResource()->getAttributes();
/** @var Attribute $sdkname */
$sdkname = $resource->getAttributes()->getAttribute(ResourceConstants::TELEMETRY_SDK_NAME);
/** @var Attribute $sdklanguage */
$sdklanguage = $resource->getAttributes()->getAttribute(ResourceConstants::TELEMETRY_SDK_LANGUAGE);
/** @var Attribute $sdkversion */
$sdkversion = $resource->getAttributes()->getAttribute(ResourceConstants::TELEMETRY_SDK_VERSION);
/** @var Attribute $servicename */
$servicename = $attributes->getAttribute(ResourceConstants::SERVICE_NAME);
/** @var Attribute $serviceversion */
$serviceversion = $attributes->getAttribute(ResourceConstants::SERVICE_VERSION);
$this->assertEquals('opentelemetry', $sdkname->getValue());
$this->assertEquals('php', $sdklanguage->getValue());
$this->assertEquals('dev', $sdkversion->getValue());
$this->assertEquals('name', $servicename->getValue());
$this->assertEquals('', $serviceversion->getValue());
$this->assertCount(6, $attributes);
}
public function testCreateSpanGetsResourceFromNonDefaultTraceProviderDefaultTrace()
{
/*
* A resource can be associated with the TracerProvider when the TracerProvider is created.
* That association cannot be changed later. When associated with a TracerProvider, all
* Spans produced by any Tracer from the provider MUST be associated with this Resource.
*/
// Create a new provider with a resource containing 2 attributes.
$providerResource = ResourceInfo::create(new Attributes(['provider' => 'primary', 'empty' => '']));
$traceProvider = new TracerProvider($providerResource);
$tpAttributes = $traceProvider->getResource()->getAttributes();
// Verify the resource associated with the trace provider.
$this->assertCount(5, $tpAttributes);
/** @var Attribute $primary */
$primary = $tpAttributes->getAttribute('provider');
/** @var Attribute $empty */
$empty = $tpAttributes->getAttribute('empty');
$this->assertEquals('primary', $primary->getValue());
$this->assertEquals('', $empty->getValue());
// Add a Tracer. The trace provider should add its resource to the new Tracer.
/** @var Tracer $tracer */
$tracer = $traceProvider->getTracer('name');
$resource = $tracer->getResource();
$attributes = $resource->getAttributes();
// Verify the resource associated with the tracer.
/** @var Attribute $name */
$name = $resource->getAttributes()->getAttribute('name');
/** @var Attribute $sdkname */
$sdkname = $resource->getAttributes()->getAttribute(ResourceConstants::TELEMETRY_SDK_NAME);
/** @var Attribute $sdklanguage */
$sdklanguage = $resource->getAttributes()->getAttribute(ResourceConstants::TELEMETRY_SDK_LANGUAGE);
/** @var Attribute $sdkversion */
$sdkversion = $resource->getAttributes()->getAttribute(ResourceConstants::TELEMETRY_SDK_VERSION);
/** @var Attribute $servicename */
$servicename = $attributes->getAttribute(ResourceConstants::SERVICE_NAME);
/** @var Attribute $serviceversion */
$serviceversion = $attributes->getAttribute(ResourceConstants::SERVICE_VERSION);
/** @var Attribute $primary */
$primary = $attributes->getAttribute('provider');
/** @var Attribute $empty */
$empty = $attributes->getAttribute('empty');
$this->assertEquals('primary', $primary->getValue());
$this->assertEquals('', $empty->getValue());
$this->assertEquals('opentelemetry', $sdkname->getValue());
$this->assertEquals('php', $sdklanguage->getValue());
$this->assertEquals('dev', $sdkversion->getValue());
$this->assertEquals('name', $servicename->getValue());
$this->assertEquals('', $serviceversion->getValue());
$this->assertCount(8, $attributes);
// Start a span with the tracer.
$tracer->startAndActivateSpan('firstSpan');
/** @var Span $global */
$global = $tracer->getActiveSpan();
$this->assertSame($tracer->getActiveSpan(), $global);
// Verify the resource associated with the span.
$attributes = $global->getResource()->getAttributes();
/** @var Attribute $sdkname */
$sdkname = $resource->getAttributes()->getAttribute(ResourceConstants::TELEMETRY_SDK_NAME);
/** @var Attribute $sdklanguage */
$sdklanguage = $resource->getAttributes()->getAttribute(ResourceConstants::TELEMETRY_SDK_LANGUAGE);
/** @var Attribute $sdkversion */
$sdkversion = $resource->getAttributes()->getAttribute(ResourceConstants::TELEMETRY_SDK_VERSION);
/** @var Attribute $servicename */
$servicename = $attributes->getAttribute(ResourceConstants::SERVICE_NAME);
/** @var Attribute $serviceversion */
$serviceversion = $attributes->getAttribute(ResourceConstants::SERVICE_VERSION);
/** @var Attribute $primary */
$primary = $attributes->getAttribute('provider');
/** @var Attribute $empty */
$empty = $attributes->getAttribute('empty');
$this->assertEquals('primary', $primary->getValue());
$this->assertEquals('', $empty->getValue());
$this->assertEquals('opentelemetry', $sdkname->getValue());
$this->assertEquals('php', $sdklanguage->getValue());
$this->assertEquals('dev', $sdkversion->getValue());
$this->assertEquals('name', $servicename->getValue());
$this->assertEquals('', $serviceversion->getValue());
$this->assertCount(8, $attributes);
}
public function testCreateSpanGetsResourceFromDefaultTraceProviderNonDefaultTrace()
{
/*
* A resource can be associated with the TracerProvider when the TracerProvider is created.
* That association cannot be changed later. When associated with a TracerProvider, all
* Spans produced by any Tracer from the provider MUST be associated with this Resource.
*/
// Create a new provider.
$traceProvider = new TracerProvider();
$tpAttributes = $traceProvider->getResource()->getAttributes();
// Verify the resource associated with the trace provider.
$this->assertCount(0, $tpAttributes);
// Add a Tracer. The trace provider should merge its resource one inherited from the traceprovider.
/** @var Tracer $tracer */
$tracer = $traceProvider->getTracer('name', 'version');
$resource = $tracer->getResource();
$attributes = $resource->getAttributes();
// Verify the resource associated with the tracer.
/** @var Attribute $sdkname */
$sdkname = $resource->getAttributes()->getAttribute(ResourceConstants::TELEMETRY_SDK_NAME);
/** @var Attribute $sdklanguage */
$sdklanguage = $resource->getAttributes()->getAttribute(ResourceConstants::TELEMETRY_SDK_LANGUAGE);
/** @var Attribute $sdkversion */
$sdkversion = $resource->getAttributes()->getAttribute(ResourceConstants::TELEMETRY_SDK_VERSION);
/** @var Attribute $servicename */
$servicename = $attributes->getAttribute(ResourceConstants::SERVICE_NAME);
/** @var Attribute $serviceversion */
$serviceversion = $attributes->getAttribute(ResourceConstants::SERVICE_VERSION);
$this->assertEquals('opentelemetry', $sdkname->getValue());
$this->assertEquals('php', $sdklanguage->getValue());
$this->assertEquals('dev', $sdkversion->getValue());
$this->assertEquals('name', $servicename->getValue());
$this->assertEquals('version', $serviceversion->getValue());
$this->assertCount(6, $attributes);
// Start a span with the tracer.
$tracer->startAndActivateSpan('firstSpan');
/** @var Span $global */
$global = $tracer->getActiveSpan();
$this->assertSame($tracer->getActiveSpan(), $global);
// Verify the resource associated with the span.
$attributes = $global->getResource()->getAttributes();
/** @var Attribute $sdkname */
$sdkname = $resource->getAttributes()->getAttribute(ResourceConstants::TELEMETRY_SDK_NAME);
/** @var Attribute $sdklanguage */
$sdklanguage = $resource->getAttributes()->getAttribute(ResourceConstants::TELEMETRY_SDK_LANGUAGE);
/** @var Attribute $sdkversion */
$sdkversion = $resource->getAttributes()->getAttribute(ResourceConstants::TELEMETRY_SDK_VERSION);
/** @var Attribute $servicename */
$servicename = $attributes->getAttribute(ResourceConstants::SERVICE_NAME);
/** @var Attribute $serviceversion */
$serviceversion = $attributes->getAttribute(ResourceConstants::SERVICE_VERSION);
$this->assertEquals('opentelemetry', $sdkname->getValue());
$this->assertEquals('php', $sdklanguage->getValue());
$this->assertEquals('dev', $sdkversion->getValue());
$this->assertEquals('name', $servicename->getValue());
$this->assertEquals('version', $serviceversion->getValue());
$this->assertCount(6, $attributes);
}
}