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.
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.
Supported OpenTelemetry versions supported-versions
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, andjvm.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,prodorstage).
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,
stageandprod). - 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:
OTEL_CUSTOMER_AUTHBasic, a space, then the Base64 encoding of username:password.Basic YWxhZGRpbjpvcGVuc2VzYW1lBearer, a space, then your token.Bearer eyJhbGciOiJ...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).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).
https://otlp.nr-data.net (US), https://otlp.eu01.nr-data.net (EU)api-key header (raw value, no prefix). Use the ingest License key, not a User (NRAK-) key.https://otlp.<your-datadog-site> (for example, https://otlp.datadoghq.com)dd-api-key header. Direct OTLP trace intake is in Preview.https://{your-environment-id}.live.dynatrace.com/api/v2/otlpAuthorization header as Api-Token <token>. Set OTEL_CUSTOMER_AUTH to Api-Token <token>.https://ingress.<region>.aws.dash0.com:4318 (for example, https://ingress.eu-west-1.aws.dash0.com:4318)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
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.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.nameof your author or publish tier, or for inbound HTTP request spans. - Metrics — incoming
jvm.*andhttp.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:
OTEL_CUSTOMER_AUTH value.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.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.