OpenTelemetry for AEM opentelemetry-apm

Adobe is replacing the Application Performance Monitoring (APM) integration built into AEM as a Cloud Service with OpenTelemetry, an open, industry-standard approach to observability supported by every major monitoring platform.

Today, AEM as a Cloud Service includes a built-in APM integration, managed entirely by Adobe. As that integration is replaced, you will need to bring your own APM endpoint — either a vendor platform that accepts OpenTelemetry data, or a self-hosted (on-premises) OpenTelemetry-compatible backend.

AVAILABILITY
This feature is in Limited Availability. To use it, request access by emailing aemcs-apm-beta@adobe.com - Adobe enables OpenTelemetry for your environments shortly after replying to your request. If your environment currently uses Adobe’s built-in APM integration, that integration stops sending data once OpenTelemetry is enabled, since the two cannot run at the same time.
Note that it is not available to HIPAA-scoped environments, Rapid Development Environments (RDE), and sandboxes.

Benefits of this change benefits

  • More telemetry, out of the box — traces, metrics, and logs together, giving you a broader picture of your AEM application’s behavior than today’s built-in integration provides.
  • An open, industry standard — OpenTelemetry is adopted broadly across the observability industry, giving your telemetry a consistent, widely supported format.
  • Send telemetry to the provider that fits your organization — including your current provider, if it supports OpenTelemetry.
  • Advanced Networking support — if your endpoint is private, or requires outbound traffic to leave from a known, stable IP address, this integration supports dedicated egress.
  • One unified method for metrics, traces, and logs — a single integration point for all three, rather than separate mechanisms. Log Forwarding continues to work as-is alongside this — you are not required to change how you forward logs today.

Overview overview

AEM as a Cloud Service can emit telemetry from your application using OpenTelemetry, an open, industry-standard approach to observability, and forward it to the APM provider of your choice. This lets you monitor your AEM application alongside the rest of your systems, in the tools your teams already use.

Common reasons to use this integration include investigating slow or failing requests, tracking JVM health and resource usage over time, building dashboards and alerts for your AEM tiers, and correlating AEM behavior with the rest of your services during an incident — all without leaving the monitoring tools your teams already use.

The following telemetry is in scope:

  • Traces — distributed traces of requests handled by your AEM application.
  • Metrics — application metrics, such as JVM runtime metrics (memory, garbage collection, threads) and inbound HTTP request rates, latencies, and error rates. AEM metrics for request processing, background jobs, and the content repository are being rolled out to all environments. They start appearing automatically once your environment is updated, with no change to your configuration.
  • Logs — your AEM application’s logs at WARN level and above, sent using OpenTelemetry’s logs signal. Logs are optional and can be toggled independently of traces and metrics.

Log Forwarding continues to be supported through its existing, separate mechanism, and is unaffected by this integration.

To learn how it works, including how telemetry flows from AEM to your APM platform, what you control, and how to choose a platform, see the tutorial Observability via OpenTelemetry.

WARNING
If you enable logs through this OpenTelemetry integration and Log Forwarding at the same time, and both send to the same destination, you receive duplicate log messages there. Enable only one path per destination, or send each to a different destination.
IMPORTANT
Only telemetry generated by your AEM application is sent to your APM provider. Details about the underlying Cloud Service runtime and infrastructure are never included. See What data is sent.

Supported OpenTelemetry versions supported-versions

Component
Supported
OpenTelemetry Java agent
2.x
Export protocol
OTLP/HTTPS (OpenTelemetry Protocol over HTTPS)

The OpenTelemetry agent runs as part of the Cloud Service runtime. Adobe provides it and keeps it up to date, so you do not need to install, manage, or upgrade it yourself. The specific patch version may change as Adobe updates the agent.

Supported OpenTelemetry variants supported-variants

Your AEM application can be instrumented with any of the following OpenTelemetry agent variants (distributions), all based on the version above. See each project’s documentation for details:

The default upstream variant works with any APM vendor. The Grafana and Splunk variants add vendor-specific instrumentation and defaults for those platforms. Adobe installs the selected agent variant in the AEM container at deployment. During Limited Availability, the upstream variant is used by default; to use the Grafana or Splunk variant, ask for it when you request access. The config/otel.yaml file configures where telemetry goes; it has no field to select the agent variant.

NOTE
The type value in your config/otel.yaml file (for example, grafana or splunk) identifies your APM provider so that your endpoint and credential are validated correctly. It does not select the agent variant.

APM vendors apm-vendors

You can send your telemetry to any Application Performance Monitoring vendor that accepts OpenTelemetry data over OTLP/HTTPS. This is independent of the OpenTelemetry variant you choose. Vendors with OTLP/HTTPS support include:

This list is not exhaustive — any backend that exposes an OTLP/HTTPS endpoint can be used.

Supported environments supported-environments

You can enable this integration on your Cloud Manager production, stage, and development environments. Each environment is enabled individually — see Step 1. Rapid Development Environments (RDE) are not supported.

Existing APM integrations existing-apm

OpenTelemetry cannot run alongside another APM agent on the same environment:

  • Adobe’s built-in APM integration (New Relic) — OpenTelemetry replaces it. Once Adobe enables OpenTelemetry for an environment at your request, New Relic no longer receives data from that environment. You can move back until the end of November 2026 — see FAQ.
  • Dynatrace OneAgent — if Dynatrace OneAgent is installed on an environment, it takes precedence. The Configuration Pipeline rejects your OpenTelemetry configuration with an error stating that Dynatrace is already active on the environment. To use OpenTelemetry there, contact Adobe Support to remove Dynatrace OneAgent first.
NOTE
You can still send OpenTelemetry data to Dynatrace as your APM provider — see Provider-specific settings. The precedence rule above applies only to the Dynatrace OneAgent running inside your environment.

Network connectivity network-connectivity

Your APM provider’s endpoint must be reachable from your AEM as a Cloud Service environment over HTTPS.

If your APM endpoint is private, or you need outbound traffic to leave from a stable, known IP address, this integration supports Advanced Networking with dedicated egress. See Advanced Networking for how to enable it.

What data is sent what-data-is-sent

Only the traces, metrics, and (if enabled) logs generated by your AEM application are sent to your APM provider. The following examples illustrate the kind of data you can expect.

Traces — spans for the requests your application handles, including:

  • Inbound HTTP request spans, named by method and route (for example, GET /content/...).
  • Servlet, outbound HTTP, and outbound database (JDBC) spans generated while a request is processed.
  • AEM framework spans that show where time is spent inside AEM while a request is processed: Sling request processing, component rendering, HTL script rendering, and JCR queries.

High-volume internal scheduler and health-probe activity (for example, Quartz jobs) is filtered out so that traces stay focused on application requests.

Metrics — JVM runtime and HTTP server metrics, using standard OpenTelemetry metric names, and AEM metrics under the aem. prefix (being rolled out; they appear automatically, with no configuration change), including:

  • JVM runtime: jvm.memory.used, jvm.gc.duration, jvm.thread.count, and jvm.cpu.recent_utilization.
  • HTTP server: http.server.request.duration (request rate, latency percentiles, and error rate are derived from this histogram).
  • AEM, being rolled out: request and error counts (aem.requests.*), Jetty thread-pool usage (aem.jetty.threads.*), Sling jobs, scheduler, and authentication (aem.sling.*), repository sessions, queries, observation, indexing, and binary storage (aem.oak.*), and asset processing (aem.dam.*).

Logs — your AEM application’s log entries at WARN level and above, sent using OpenTelemetry’s logs signal, when enabled. The ability to adjust this log level is in development. Log entries carry the same resource attributes as traces and metrics (service.name, deployment.environment), and the trace and span identifiers of the request that produced them, so they can be correlated with traces.

Logs sent this way are independent of Log Forwarding — see Overview for why enabling both to the same destination causes duplicates.

How telemetry is identified — each trace and metric carries resource attributes that identify its source, including:

  • service.name — identifies your program, environment, service, and tier (for example, cm-p<program>-e<environment>-aem-publish-prod).
  • deployment.environment — the environment type (for example, prod or stage).

Information about the Cloud Service runtime and the platform that hosts your application — such as internal hostnames, addresses, container identifiers, and operating-system or process details — is removed before any data leaves your environment.

Set up the integration set-up

For a guided walkthrough that uses the WKND sample project, from storing your credential in Cloud Manager to verifying telemetry in your observability platform, see the tutorial Configure OpenTelemetry for insights into AEM applications.

Step 1: Request access request-access

Email aemcs-apm-beta@adobe.com with your Cloud Manager program ID and the environment IDs you want to enable. If you want to use the Grafana or Splunk agent variant rather than the default, say so in your email (see Supported OpenTelemetry variants).

Adobe enables OpenTelemetry for those environments shortly after replying to your request. If an environment currently uses Adobe’s built-in APM integration, that integration stops sending data once OpenTelemetry is enabled — see Existing APM integrations.

Step 2: Add your configuration file add-configuration

Add a config/otel.yaml file to your Cloud Manager Config Pipeline repository. At minimum, specify:

  • The environment type(s) this configuration applies to (for example, stage and prod).
  • Your APM provider’s type and OTLP/HTTPS endpoint URL (including region, if applicable).
  • The authentication method your provider uses (see Step 3).

See Example configuration below for the exact file format, including examples for New Relic, Dynatrace, Grafana Cloud, Splunk, Datadog, Dash0, and generic or self-hosted endpoints.

Step 3: Configure your authentication credential configure-credential

Provide the credential that your APM provider requires by declaring a secret environment variable named OTEL_CUSTOMER_AUTH in Cloud Manager. Set Service Applied to All so the credential is available to the author, publish, and preview tiers.

To add or update environment variables, you must be a member of the Deployment Manager role. For the full procedure, see Environment Variables in Cloud Manager.

Set the value according to your provider’s authentication method:

Authentication method
Value of OTEL_CUSTOMER_AUTH
Example
HTTP Basic
The word Basic, a space, then the Base64 encoding of username:password.
Basic YWxhZGRpbjpvcGVuc2VzYW1l
Bearer token
The word Bearer, a space, then your token.
Bearer eyJhbGciOiJ...
API key
The raw key value only, with no prefix.
New Relic ingest License key (for example, a 40‑character key)
NOTE
For Basic and Bearer authentication, the value is sent in the standard Authorization header, so it must include the scheme word (Basic or Bearer). For providers that use a custom header — for example, New Relic’s api-key header — provide only the raw credential value, and set authHeaderName in your configuration file to the correct header name (see Example configuration).
CAUTION
OTEL_CUSTOMER_AUTH is a credential. Always declare it as a secret environment variable so its value is never stored in Git or exposed in logs.

Provider-specific settings provider-specific

The following table summarizes the endpoint and authentication for some common providers. Always confirm the current values in your provider’s own documentation. For providers that use a custom header (for example, New Relic and Datadog), set OTEL_CUSTOMER_AUTH to the raw key value only, and set authHeaderName in your configuration file to the correct header name (see Example configuration).

Provider
Example endpoint
Authentication
New Relic
https://otlp.nr-data.net (US), https://otlp.eu01.nr-data.net (EU)
Ingest License key, sent in the custom api-key header (raw value, no prefix). Use the ingest License key, not a User (NRAK-) key.
Datadog
https://otlp.<your-datadog-site> (for example, https://otlp.datadoghq.com)
API key, sent in the custom dd-api-key header. Direct OTLP trace intake is in Preview.
Dynatrace
https://{your-environment-id}.live.dynatrace.com/api/v2/otlp
API access token, sent in the Authorization header as Api-Token <token>. Set OTEL_CUSTOMER_AUTH to Api-Token <token>.
Dash0
https://ingress.<region>.aws.dash0.com:4318 (for example, https://ingress.eu-west-1.aws.dash0.com:4318)
Auth token, sent in the Authorization header as Bearer <token>. Set OTEL_CUSTOMER_AUTH to Bearer <token>.
Grafana Cloud
https://otlp-gateway-<zone>.grafana.net/otlp (for example, https://otlp-gateway-prod-us-east-0.grafana.net/otlp)
Grafana Cloud instance ID and access policy token, sent in the Authorization header as HTTP Basic. Set OTEL_CUSTOMER_AUTH to Basic <base64(instanceID:token)>.
Splunk
The OTLP/HTTP endpoint of your Splunk Distribution of the OpenTelemetry Collector, running as a gateway (for example, https://<your-splunk-otel-collector>:4318)
The credential your gateway is configured to accept, sent in the Authorization header (for example, Bearer <token>).

Example configuration example-configuration

Add a file like one of the following examples to config/otel.yaml in your Config Pipeline repository, based on your provider from Provider-specific settings.

New Relic:

kind: "Otel"
version: "1"
metadata:
  envTypes:
    - "stage"
    - "prod"
data:
  enabled: true
  type: "newrelic"
  endpoint: "https://otlp.nr-data.net"   # https://otlp.eu01.nr-data.net for the EU region
  authHeaderValue: "${{secrets.OTEL_CUSTOMER_AUTH}}"
  metrics: true   # optional
  logs: true      # optional — see Overview for the Log Forwarding duplicate-message warning

Dynatrace:

kind: "Otel"
version: "1"
metadata:
  envTypes:
    - "stage"
    - "prod"
data:
  enabled: true
  type: "dynatrace"
  endpoint: "https://{your-environment-id}.live.dynatrace.com/api/v2/otlp"
  authHeaderValue: "${{secrets.OTEL_CUSTOMER_AUTH}}"   # the secret's value must be "Api-Token <token>"
  metrics: true
  logs: true

Datadog:

kind: "Otel"
version: "1"
metadata:
  envTypes:
    - "stage"
    - "prod"
data:
  enabled: true
  type: "generic"
  endpoint: "https://otlp.<your-datadog-site>"   # for example, https://otlp.datadoghq.com
  authHeaderName: "dd-api-key"
  authHeaderValue: "${{secrets.OTEL_CUSTOMER_AUTH}}"   # the secret's value is the raw API key, no prefix
  metrics: true
  logs: true

Dash0:

kind: "Otel"
version: "1"
metadata:
  envTypes:
    - "stage"
    - "prod"
data:
  enabled: true
  type: "generic"
  endpoint: "https://ingress.<region>.aws.dash0.com:4318"
  authHeaderValue: "${{secrets.OTEL_CUSTOMER_AUTH}}"   # the secret's value must be "Bearer <token>"
  metrics: true
  logs: true

Grafana Cloud:

kind: "Otel"
version: "1"
metadata:
  envTypes:
    - "stage"
    - "prod"
data:
  enabled: true
  type: "grafana"
  endpoint: "https://otlp-gateway-<zone>.grafana.net/otlp"   # for example, https://otlp-gateway-prod-us-east-0.grafana.net/otlp
  authHeaderValue: "${{secrets.OTEL_CUSTOMER_AUTH}}"   # the secret's value must be "Basic <base64(instanceID:token)>"
  metrics: true
  logs: true

Splunk (through a Splunk Distribution of the OpenTelemetry Collector running as a gateway):

kind: "Otel"
version: "1"
metadata:
  envTypes:
    - "stage"
    - "prod"
data:
  enabled: true
  type: "splunk"
  endpoint: "https://<your-splunk-otel-collector>:4318"
  authHeaderValue: "${{secrets.OTEL_CUSTOMER_AUTH}}"   # the credential your gateway accepts, for example "Bearer <token>"
  metrics: true
  logs: true

Generic or self-hosted endpoint (for example, an on-premises OpenTelemetry collector):

kind: "Otel"
version: "1"
metadata:
  envTypes:
    - "stage"
    - "prod"
data:
  enabled: true
  type: "generic"
  endpoint: "https://<your-otlp-endpoint>"
  authHeaderValue: "${{secrets.OTEL_CUSTOMER_AUTH}}"   # for example, "Basic <base64(user:pass)>"
  metrics: true
  logs: true

Advanced Networking (dedicated egress) — for a private endpoint, or one that requires traffic to leave from a known, stable IP address (see Network connectivity):

kind: "Otel"
version: "1"
metadata:
  envTypes:
    - "stage"
    - "prod"
data:
  enabled: true
  type: "generic"
  endpoint: "https://<your-private-otlp-endpoint>"
  authHeaderValue: "${{secrets.OTEL_CUSTOMER_AUTH}}"
  metrics: true
  logs: true
  advancedNetworking: true   # routes this endpoint's egress through Advanced Networking instead of direct internet egress
IMPORTANT
advancedNetworking has no effect unless Cloud Manager has already provisioned Advanced Networking for your environment — confirm this is set up before relying on it. See Advanced Networking.
NOTE
metrics and logs are each optional and independent of one another — omit either, or set it to false, if you only want traces.

Step 4: Deploy deploy

Once Adobe has confirmed that OpenTelemetry is enabled for your environment (see Step 1), run your Config Pipeline to deploy config/otel.yaml. The pipeline validates your configuration and checks your endpoint and credential before applying the configuration, so most mistakes are reported directly in the pipeline log.

After the pipeline completes, traces, metrics, and (if enabled) logs from your AEM application begin to appear in your APM provider. Use Step 5 to confirm.

Step 5: Verify the integration verify

Because telemetry is sent to your own APM provider, you confirm the integration from your provider’s tools; Adobe does not surface this data back to you.

After the pipeline completes, allow a few minutes for data to arrive, then check your APM provider for the following:

  • Traces — new spans for your AEM services. For example, search for the service.name of your author or publish tier, or for inbound HTTP request spans.
  • Metrics — incoming jvm.* and http.server.* metrics for your services, and aem.* metrics once they have been rolled out to your environment.
  • Logs (if enabled) — incoming log entries for your AEM services.

If this data appears, the integration is working.

NOTE
To confirm that your endpoint and credential work, the Configuration Pipeline sends a single test span to your APM provider each time it validates your configuration. It appears under the service name otel-config-operator-validator and can be safely ignored.

Troubleshooting troubleshooting

If telemetry does not appear in your APM provider, check the following:

Symptom
What to check
Configuration Pipeline error: OTel tracing is disabled for this environment or Feature 'Otel' not allowed
OpenTelemetry has not been enabled for this environment yet. Request access as described in Step 1, and run the pipeline again once Adobe confirms it is enabled.
Configuration Pipeline error stating that Dynatrace is already active
Dynatrace OneAgent is installed on the environment and takes precedence. See Existing APM integrations.
No data after the pipeline completes
Confirm the Config Pipeline completed successfully since your last change. Allow a few minutes for the first data to arrive, then recheck the endpoint URL and the OTEL_CUSTOMER_AUTH value.
Authentication errors or rejected data
Verify that the OTEL_CUSTOMER_AUTH value matches your provider’s required format (see Step 3 and Provider-specific settings). Common mistakes are including or omitting a scheme word (Basic, Bearer, or Api-Token) and using the wrong key — for example, a New Relic User (NRAK-) key instead of an ingest License key.
Endpoint unreachable
Confirm the endpoint URL and region are correct and that the endpoint is reachable over HTTPS. If your endpoint is private, or your provider requires traffic from a known IP address, enable Advanced Networking with dedicated egress.
Unsure whether Advanced Networking is needed
You need it only if your APM endpoint is not reachable from the public internet, or your provider requires you to allow-list a stable source IP address. Public SaaS endpoints, such as the provider examples above, do not require it.
No log entries, but traces and metrics appear
Confirm logs is enabled in your configuration (see What data is sent). Only entries at WARN level and above are sent, so if your application has not logged a warning or error recently, there may be nothing to send yet.
Duplicate log messages at your destination
You likely have both this integration’s logs and Log Forwarding sending to the same destination. See Overview — enable only one path per destination.
An unfamiliar service named otel-config-operator-validator
This is the test span that the Configuration Pipeline sends to check your endpoint and credential. It is expected and can be ignored.

If telemetry still does not appear after these checks, contact aemcs-apm-beta@adobe.com with your program and environment details.

FAQ faq

Why is this change happening?

AEM as a Cloud Service customers have asked for additional metrics and operational data, as well as traces, spans, and logs in context. OpenTelemetry is an industry standard that supports all of these capabilities, and outputs them in a widely supported format (OTLP).

Do I need to request access?

Yes. During Limited Availability, email aemcs-apm-beta@adobe.com with your program and environment IDs. Adobe enables OpenTelemetry for those environments shortly after replying to your request. This is not yet available to HIPAA-scoped environments.

What happens to New Relic if I enable OpenTelemetry?

Once Adobe enables OpenTelemetry for an environment at your request, data is no longer sent to New Relic from that environment. The two cannot run at the same time.

If I migrate to OpenTelemetry from New Relic, can I move back?

Yes. Email aemcs-apm-beta@adobe.com and Adobe disables OpenTelemetry for your environments. Then set enabled: false in your config/otel.yaml file (or remove the file), run your Config Pipeline, and run a Full Stack pipeline to completion to restore New Relic. This is possible until the end of November 2026.

Can I use OpenTelemetry if my environment runs Dynatrace OneAgent?

Not on the same environment — Dynatrace OneAgent takes precedence. You can remove OneAgent and use OpenTelemetry instead, including with Dynatrace as your APM provider. See Existing APM integrations.

What happens after November 2026?

Adobe will move from its built-in APM solution to OpenTelemetry as its permanent observability solution.

recommendation-more-help
experience-manager-cloud-service-help-main-toc