getTracer()->spanBuilder($this->getName())->startSpan(); // do stuff $span->end(); } } An user of the instrumentation and API/SDK would the call: $instrumentation = new Instrumentation; $instrumentation->activate() to activate and use the instrumentation with the API/SDK. **/ trait InstrumentationTrait { private TextMapPropagatorInterface $propagator; private TracerProviderInterface $tracerProvider; private TracerInterface $tracer; private MeterInterface $meter; private LoggerInterface $logger; public function __construct() { $this->initDefaults(); } /** * The name of the instrumenting/instrumented library/package/project. * @see https://github.com/open-telemetry/opentelemetry-specification/blob/v1.12.0/specification/glossary.md#instrumentation-scope * @see https://github.com/open-telemetry/opentelemetry-specification/blob/v1.12.0/specification/glossary.md#instrumentation-library */ abstract public function getName(): string; /** * The version of the instrumenting/instrumented library/package/project. * If unknown or a lookup is too expensive simply return NULL. * @see https://github.com/open-telemetry/opentelemetry-specification/blob/v1.12.0/specification/glossary.md#instrumentation-scope * @see https://github.com/open-telemetry/opentelemetry-specification/blob/v1.12.0/specification/glossary.md#instrumentation-library */ abstract public function getVersion(): ?string; /** * The version of the instrumenting/instrumented library/package/project. * If unknown simply return NULL. * @see https://github.com/open-telemetry/opentelemetry-specification/blob/v1.12.0/specification/glossary.md#instrumentation-scope * @see https://github.com/open-telemetry/opentelemetry-specification/blob/v1.12.0/specification/glossary.md#instrumentation-library */ abstract public function getSchemaUrl(): ?string; /** * This method will be called from the API when the instrumentation has been activated (via activate()). * Here you can put any bootstrapping code needed by the instrumentation. * If not needed simply implement a method which returns TRUE. */ abstract public function init(): bool; /** * This method registers and activates the instrumentation with the OpenTelemetry API/SDK and thus * the instrumentation will be used to generate telemetry data. */ public function activate(): bool { $this->validateImplementation(); // activate instrumentation with the API. not implemented yet. return true; } public function setPropagator(TextMapPropagatorInterface $propagator): void { $this->propagator = $propagator; } public function getPropagator(): TextMapPropagatorInterface { return $this->propagator; } public function setTracerProvider(TracerProviderInterface $tracerProvider): void { $this->tracerProvider = $tracerProvider; // @see https://github.com/open-telemetry/opentelemetry-specification/blob/v1.12.0/specification/trace/api.md#get-a-tracer $this->tracer = $tracerProvider->getTracer( $this->getName(), $this->getVersion(), $this->getSchemaUrl(), ); } public function getTracerProvider(): TracerProviderInterface { return $this->tracerProvider; } public function getTracer(): TracerInterface { return $this->tracer; } public function setMeterProvider(MeterProviderInterface $meterProvider): void { // @see https://github.com/open-telemetry/opentelemetry-specification/blob/v1.12.0/specification/metrics/api.md#get-a-meter $this->meter = $meterProvider->getMeter( $this->getName(), $this->getVersion(), ); } public function getMeter(): MeterInterface { return $this->meter; } public function setLogger(LoggerInterface $logger): void { $this->logger = $logger; } public function getLogger(): LoggerInterface { return $this->logger; } private function validateImplementation(): void { if (!$this instanceof InstrumentationInterface) { throw new RuntimeException(sprintf( '"%s" is meant to implement "%s"', InstrumentationTrait::class, InstrumentationInterface::class )); } } private function initDefaults(): void { $this->propagator = new NoopTextMapPropagator(); $this->tracer = new NoopTracer(); $this->tracerProvider = new NoopTracerProvider(); /** @phan-suppress-next-line PhanAccessMethodInternal */ $this->meter = new NoopMeter(); $this->logger = new NullLogger(); } }