Manually instrument PHP applications for Splunk Observability Cloud

Manually instrument your PHP application to add custom attributes to spans or manually generate metrics. Keep reading to learn how to manually instrument your PHP application for Splunk Observability Cloud.

The OpenTelemetry instrumentation for PHP provides a base you can build on by adding your own manual instrumentation. By using both automatic and manual instrumentation, you can better instrument the logic and functionality of your applications, clients, and frameworks.

Create custom spans and traces

To create custom spans and traces, follow these steps:

  1. Create a TracerProvider entry point if you aren’t using an instrumentation library:

    $tracerProvider = Globals::tracerProvider();
  2. Create a tracer:

    // Acquire the tracer only where needed
    
    $tracer = $tracerProvider->getTracer(
       'instrumentation-scope-name', // Name (Required)
       'instrumentation-scope-version', // Version
       'http://example.com/my-schema', // Schema URL
       ['foo' => 'bar'] // Resource attributes
    );
  3. Create spans:

    <?php
    public function roll($rolls) {
       $span = $this->tracer->spanBuilder("rollTheDice")->startSpan();
       $result = [];
       for ($i = 0; $i < $rolls; $i++) {
          $result[] = $this->rollOnce();
       }
       $span->end();
       return $result;
    }
  4. Optionally, set attributes to enrich your spans’ metadata:

    $span->setAttribute(TraceAttributes::CODE_FUNCTION, 'rollOnce');
    $span->setAttribute(TraceAttributes::CODE_FILEPATH, __FILE__);

Create custom metrics

To create custom metrics, follow these steps:

  1. Add the following dependencies:

    use OpenTelemetry\SDK\Metrics\MetricExporter\ConsoleMetricExporterFactory;
    use OpenTelemetry\SDK\Metrics\MeterProvider;
    use OpenTelemetry\SDK\Metrics\MetricReader\ExportingReader;
    
    require 'vendor/autoload.php';
  2. Create a MeterProvider entry point:

    $meterProvider = Globals::meterProvider();
  3. Create an instrument, such as a gauge:

    $queue = [
       'job1',
       'job2',
       'job3',
    ];
    $reader = $meterProvider
       ->getMeter('demo_meter')
       ->createObservableGauge('queued', 'jobs', 'The number of jobs enqueued')
       ->observe(static function (ObserverInterface $observer) use (&$queue): void {
          $observer->observe(count($queue));
       });
    $reader->collect();
    array_pop($queue);
    $reader->collect();