Migrating to EDOT PHP from the Elastic PHP Agent

Follow these steps to migrate from the legacy Elastic APM PHP agent (elastic-apm-php) to the Elastic Distribution of OpenTelemetry PHP (elastic-otel-php).

1. Uninstall the Elastic APM PHP agent

Remove the previously installed elastic-apm-php package:

Debian/Ubuntu:

sudo dpkg -r elastic-apm-php

CentOS/Fedora:

sudo rpm -e elastic-apm-php

Alpine Linux:

sudo apk del elastic-apm-php

2. Install EDOT PHP

Download the appropriate package for your system from the GitHub releases page.

Debian/Ubuntu:

sudo dpkg -i elastic-otel-php_<version>_amd64.deb

CentOS/Fedora:

sudo rpm -ivh elastic-otel-php-<version>-1.x86_64.rpm

Alpine Linux:

sudo apk add --allow-untrusted elastic-otel-php-<version>.apk

3. Update configuration

Switch from php.ini-based configuration to environment variables. Below is a common mapping between old and new settings:

Elastic APM (php.ini) EDOT PHP (environment variable) Description
elastic_apm.enabled = 1 ELASTIC_OTEL_ENABLED=true Enables EDOT PHP features - enabled by default
elastic_apm.service_name = my-app OTEL_SERVICE_NAME=my-app Defines the logical service name
elastic_apm.server_url = http://... OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318 Sets OTLP exporter endpoint
elastic_apm.secret_token = token123 OTEL_EXPORTER_OTLP_HEADERS="Authorization=Bearer token123" Sets auth header for OTLP exporter
elastic_apm.environment = production OTEL_RESOURCE_ATTRIBUTES=deployment.environment=production Adds environment context to exported data

💡 EDOT PHP does not require changes to your code or Composer configuration — instrumentation works automatically after package installation.


Full Configuration Mapping: Elastic APM PHP → EDOT PHP

Elastic APM PHP Option EDOT PHP Environment variable equivalent Option Description
api_key OTEL_EXPORTER_OTLP_HEADERS Set API key via OTLP headers. Example: Authorization=Bearer <token>.
breakdown_metrics No span compression or breakdown-type metric generation (yet).
capture_errors No direct equivalent. Handled via standard error handling and inferred spans.
disable_instrumentations OTEL_PHP_DISABLED_INSTRUMENTATIONS Comma-separated list of instrumentations to disable.
disable_send No direct option. Could potentially be simulated with custom exporters or filtering processors.
enabled ELASTIC_OTEL_ENABLED Enables or disables EDOT PHP instrumentation entirely.
environment OTEL_RESOURCE_ATTRIBUTES Add deployment metadata (e.g., deployment.environment=prod).
global_labels OTEL_RESOURCE_ATTRIBUTES Set global key-value pairs for all spans/metrics.
log_level OTEL_LOG_LEVEL, ELASTIC_OTEL_LOG_LEVEL_FILE Controls log verbosity globally (OTEL_LOG_LEVEL) or per sink (e.g., file, stderr, syslog via ELASTIC_OTEL_LOG_LEVEL_*).
server_url OTEL_EXPORTER_OTLP_ENDPOINT Sets OTLP exporter endpoint. Defaults to http://localhost:4318.
service_name OTEL_SERVICE_NAME Defines service name for traces/metrics.
transaction_sample_rate OTEL_TRACES_SAMPLER_ARG Sampling rate for traces (e.g., 0.25).
transaction_max_spans No direct support in PHP SDK for limiting spans per transaction.
span_frames_min_duration ELASTIC_OTEL_INFERRED_SPANS_MIN_DURATION Duration threshold for inferred spans.
sanitize_field_names Not yet supported in EDOT PHP.
verify_server_cert ELASTIC_OTEL_VERIFY_SERVER_CERT Enable or disable SSL verification when exporting telemetry.
transaction_ignore_urls OTEL_PHP_EXCLUDED_URLS A comma-separated list of regex patterns for excluding incoming HTTP URLs from tracing (e.g., client/.*/info,healthcheck).
transaction_name_callback No equivalent for callback-based naming; use grouping or manual setAttribute().
log_level_syslog ELASTIC_OTEL_LOG_LEVEL_SYSLOG Sets syslog sink verbosity.
log_level_file ELASTIC_OTEL_LOG_LEVEL_FILE Controls log level for file-based output.
log_level_stderr ELASTIC_OTEL_LOG_LEVEL_STDERR Controls log level for stderr (recommended in containers).
log_file ELASTIC_OTEL_LOG_FILE Path for log output; supports %p (PID) and %t (timestamp) placeholders.
log_feature ELASTIC_OTEL_LOG_FEATURES Fine-grained feature-based logging configuration.
transaction_url_groups ELASTIC_OTEL_TRANSACTION_URL_GROUPS Group similar URL paths (e.g., /user/*).
inferred_spans_enabled ELASTIC_OTEL_INFERRED_SPANS_ENABLED Enables inferred spans (preview).
inferred_spans_sampling_interval ELASTIC_OTEL_INFERRED_SPANS_SAMPLING_INTERVAL Sampling frequency for stack traces during inferred spans.
inferred_spans_min_duration ELASTIC_OTEL_INFERRED_SPANS_MIN_DURATION Minimum duration of inferred span (used to limit noise).

4. Restart your PHP environment

Restart the relevant PHP processes for changes to take effect. This could include:

  • PHP-FPM:
    sudo systemctl restart php8.x-fpm
    
  • Apache:
    sudo systemctl restart apache2
    
  • CLI scripts:
    php script.php
    

✅ You’re now ready to start collecting traces and metrics using OpenTelemetry with Elastic!

Advantages of EDOT PHP over the Classic Elastic APM Agent

Fully automatic instrumentation with zero code changes

  • No need to modify application code, add Composer packages, or wrap bootstrap files.
  • Works out-of-the-box after system package installation.
  • No need to register SDK, bootstrap, or start a tracer manually — everything is handled by the agent at the extension level.

OpenTelemetry standard compliance

  • EDOT PHP is built on top of OpenTelemetry SDK and conventions, ensuring compatibility with:
    • community tools,
    • vendor-neutral backends,
    • standard propagation formats (traceparent, baggage),
    • open observability pipelines (e.g., EDOT Collector or OpenTelemetry Collector).

Modular, extensible architecture

  • Based on the OpenTelemetry SDK — you can add custom exporters, processors, and samplers.
  • Easy to extend or adapt to advanced use cases (e.g., exporting to multiple backends).

Better future-proofing and community alignment

  • EDOT PHP benefits from:
    • upstream OpenTelemetry improvements,
    • Elastic-specific early bugfixes and features,
    • community-driven instrumentation libraries and patterns.

Unified telemetry collection (traces + metrics)

  • EDOT PHP can be used in environments where both tracing and metrics are collected using OpenTelemetry.
  • The classic APM agent focuses solely on APM/tracing.

⚠️ Limitations Compared to the Elastic APM Agent

  • Lack of Span Compression

    The classic Elastic APM agent includes span compression, which merges multiple similar spans (e.g., repeated SQL queries or HTTP calls) into a single composite span to reduce trace noise and overhead.

    EDOT PHP does not currently support span compression. As a result, traces may be more verbose and produce higher cardinality, especially in loop-heavy code.

For a broader overview of known limitations — including technical constraints related to PHP runtime and extensions — see the Limitations page.