Dynatrace
The Dynatrace integration sends application OpenTelemetry traces and metrics alongside normalized Speedscale capture logs. Application spans populate Services and Distributed Tracing. Capture logs identify the source workload, remote destination, protocol, command, and status; retain the full RRPair in Speedscale Cloud or a BYOC object-storage channel when it must be replayed.
Trace correlation requires a valid W3C traceparent header on the captured application request. Requests without one still appear in Logs, but Dynatrace cannot link them to an application trace.
How it works
Dynatrace's ingest API accepts OTLP over HTTP. The collector receives gRPC or HTTP inside the cluster, then sends each signal to the correct Dynatrace path. It also:
- marks spans with HTTP 5xx responses or exception events as errors;
- identifies the source workload with
service.nameandspeedscale.workload; - identifies the remote destination with
hostname,server.address, andnetwork.peer.address; - emits a readable message and
speedscale.protocol,speedscale.command, andspeedscale.statusfor HTTP, PostgreSQL, Kafka, and other captured protocols; - extracts W3C trace context from captured request headers;
- converts cumulative metrics to delta temporality before export.
Why use it
Dynatrace Services shows service health, request rate, response time, endpoints, and failures from the application spans. Distributed Tracing shows individual request paths. Speedscale capture logs add the protocol and remote-destination context needed to identify the corresponding full traffic in Speedscale Cloud or a BYOC object-storage channel.
Install the channel
Create a Dynatrace access token with openTelemetryTrace.ingest, metrics.ingest, and logs.ingest. Store the token in a Kubernetes Secret:
kubectl create namespace byoc-dynatrace
kubectl -n byoc-dynatrace create secret generic dynatrace-api-token \
--from-literal=api-token='<DYNATRACE_TOKEN>'
helm upgrade --install byoc-dynatrace speedscale-byoc/dynatrace \
--namespace byoc-dynatrace \
--set dynatrace.endpoint='https://<ENVIRONMENT>.live.dynatrace.com/api/v2/otlp' \
--set dynatrace.credentialsSecret=dynatrace-api-token
The endpoint is the OTLP base URL. Do not add /v1/traces, /v1/metrics, or /v1/logs.
Add one Forwarder exporter for this channel:
forwarder:
exporters:
byoc_dynatrace:
otel_endpoint: http://byoc-dynatrace-dynatrace.byoc-dynatrace.svc.cluster.local:4317
filter_rule: standard
dlp_config_id: standard
Send application OTLP data to the same collector service on port 4317 for gRPC or 4318 for HTTP.
The chart's NetworkPolicy only admits traffic from the speedscale namespace by default. Add each application namespace that sends OTLP data:
helm upgrade byoc-dynatrace speedscale-byoc/dynatrace \
--namespace byoc-dynatrace --reuse-values \
--set 'networkPolicy.allowedNamespaces={speedscale,<APP_NAMESPACE>}'
Verify in Dynatrace
Open Logs, paste this expression into the Filter field, and select Run query:
msgType = rrpair AND speedscale.direction = OUT
This is filter-field syntax, not DQL. The table only needs four columns: timestamp, Log message, service.name, and hostname. service.name is the source service and hostname is the remote destination. For example, PostgreSQL traffic can show accounts-service and banking-postgres.banking-app.svc.cluster.local.
Append AND speedscale.protocol = https to show only HTTPS traffic.

Open Services separately to confirm that application throughput, response-time, and failure charts contain current data.

Use the capture with proxymock
Dynatrace is the observability view, not the portable RRPair archive. There is no direct proxymock import dynatrace command. Retain the same traffic in Speedscale Cloud, Amazon S3, or Google Cloud Storage if developers need to turn a trace into local tests and mocks.
Pull a Speedscale snapshot by ID:
proxymock cloud pull snapshot '<SNAPSHOT_ID>' --out ./dynatrace-capture
proxymock mock --in ./dynatrace-capture
proxymock replay --in ./dynatrace-capture \
--test-against http://localhost:8080
For an S3 or GCS BYOC channel, retrieve recent RRPairs by service and time range:
proxymock import s3 --bucket '<BUCKET>' --prefix byoc/ \
--service '<SERVICE_NAME>' --from now-1h --out ./dynatrace-capture
# Native GCS uses Google Application Default Credentials.
proxymock import gcs --bucket '<GCS_BUCKET>' --prefix byoc/ \
--service '<SERVICE_NAME>' --from now-1h --out ./dynatrace-capture
See Pull traffic from a BYOC bucket for authentication, filtering, and cluster discovery.
Evidence
The chart's collector configuration is rendered and validated with its pinned OpenTelemetry Collector image in CI. A runtime test sends HTTPS, PostgreSQL, and Kafka RRPairs through the rendered collector in one mixed batch and verifies readable messages, source-service isolation, real upstream hostnames, protocol metadata, and trace behavior. Dynatrace also exposes ingest health metrics such as accepted and rejected OTLP metric data points and received spans for troubleshooting.