OpenTelemetry (Beta) 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 page is an advance notice. The OpenTelemetry integration described below is available today through a Beta program; broader availability is planned for later in 2026. To join the Beta program, email aemcs-apm-beta@adobe.com, describing your use case. If your organization currently relies on Adobe’s built-in APM integration, use this Beta period to evaluate OpenTelemetry, choose your own APM endpoint, and plan your transition ahead of that change. Once enrolled, see Step 1 below to enable it for your environment.

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.
  • Logs — your AEM application’s logs, 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.

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. Choose the variant that suits your tooling; 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.

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.

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 and outbound database (JDBC) spans generated while a request is processed.

High-volume internal scheduler and health-probe activity (for example, Quartz jobs) is filtered out so that traces stay focused on application requests. Fine-grained AEM framework-internal spans — such as Sling resource resolution, OSGi services, or JCR access — are not emitted in this release.

Metrics — JVM runtime and HTTP server metrics, using standard OpenTelemetry metric names, 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).

Logs — your AEM application’s log entries, sent using OpenTelemetry’s logs signal, when enabled. Log entries carry the same resource attributes as traces and metrics (service.name, deployment.environment), so they can be correlated with them.

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

Step 1: Enable the integration request-access

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 2).

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

Step 2: 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>.

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: "v1"
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: "v1"
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: "v1"
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: "v1"
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

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

kind: "Otel"
version: "v1"
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: "v1"
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 3: Deploy deploy

The integration takes effect on your environment’s next deployment — that is, the next time a deployment pipeline runs for the environment in Cloud Manager (for example, a full-stack deployment). If your environment has not been deployed since you added your config/otel.yaml file and set your credential, run a deployment to activate it.

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

Step 4: 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 a deployment 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.
  • Logs (if enabled) — incoming log entries for your AEM services.

If this data appears, the integration is working.

Troubleshooting troubleshooting

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

Symptom
What to check
No data after deployment
Confirm the deployment completed successfully and that a deployment has run since the integration was enabled. 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 2 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). If your application has not logged anything 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.

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).

What happens to New Relic if I enable OpenTelemetry?

When you run the Configuration Pipeline, data to New Relic will no longer be transmitted from AEM as a Cloud Service.

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

Yes. Disable OpenTelemetry via the Configuration Pipeline, then run a Full Stack pipeline to completion. This is possible until the end of November 2026.

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