ZenPlus APM

APM troubleshooting

Symptom-first diagnosis for the problems that actually come up: no data, partial data, numbers that look wrong, and alerts that do or do not fire.

Applies to ZenPlus 1.6.0 Updated 2026-08-06 Audience Operators + developers Reading time ~10 min

01 Start here: is anything arriving at all? #

Almost every APM problem resolves into one of three questions, in this order. Answer them in order and you will not waste time.

Is the key being used?

Settings → Ingest keys. If last used is empty, nothing has ever authenticated with it — the problem is entirely on the producer side. Skip to “No data at all”.

Is the pipeline accepting?

Settings → Data quality. Non-zero rejected, skewed or dropped counters name the problem directly.

Is the data the shape you expect?

Spans in the trace explorer but no throughput on Services means the spans are the wrong kind. See “Partial data”.

02 No data at all #

CheckHowIf it fails
Endpoint reachablecurl -I http://APPLIANCE/v1/traces from the app hostFirewall or routing between app and appliance
Route reaches the APIThe response must be JSON, not HTMLThe reverse proxy is returning the dashboard for /v1/ — its /v1/ route is missing
Key acceptedPOST a test span (see Getting started)401 — wrong, revoked, or RUM-type key
ProtocolResponse is 415SDK is exporting protobuf; set OTEL_EXPORTER_OTLP_PROTOCOL=http/json
SDK actually exportingEnable SDK debug loggingExporter never configured, or the process exits before the batch flushes
The 415 trap

This is the most common cause of “APM does not work”. Most OpenTelemetry SDKs default to http/protobuf. The appliance's built-in receiver takes JSON, answers 415 to protobuf, and the SDK drops the batch silently — your application logs nothing, and APM stays empty forever. Test with curl before debugging anything else.

03 Partial data #

SymptomCauseFix
Traces exist, service shows 0 throughputOnly INTERNAL spans are emittedInstrument the inbound handler so it produces SERVER spans
Service named unknownservice.name not setSet OTEL_SERVICE_NAME
Traces split into fragmentsTrace context not propagated across a boundaryUse compatible propagators (W3C by default); check proxies are not stripping traceparent
Service map missing edgesSame as above — edges need a parent span id crossing the wireSee Service map
Errors counted with no type or stackSpan marked ERROR with no exception eventRecord exceptions properly in your error handler
Operations list explodesConcrete URLs used as http.routeEmit templated routes
Unique users always 0No end-user attributeSet enduser.id — see Usage

04 Numbers that look wrong #

Throughput lower than expected
Only entry spans count. A service making five downstream calls per request shows one request, not six. This is correct.
Error rate is 0 during a visible outage
Error rate follows OpenTelemetry span status, not HTTP status. Instrumentation that returns 500 without setting span status to ERROR reports no errors. Check what your framework's auto-instrumentation does with handled exceptions.
Numbers shift when changing time range
Windows up to 6 hours read the 5-minute rollup; longer windows read the hourly one. Two different aggregations of the same spans differ slightly. Expected.
Percentiles look approximate
They are. Duration percentiles come from t-digest sketches, which is what makes a year of retention affordable. Counts and error rates are exact.
A service is stuck at “No data”
It has not reported in 10 minutes. That flag is deliberate — freezing the last known-good health would let a dead service look healthy forever.
Usage analytics will not go past 7 days
It reads raw spans, which expire at 7 days. Rollup-based screens are unaffected.

05 Alerting problems #

SymptomCauseFix
No APM alerts everNo rule and no SLO existsNothing alerts by default. Create an alert rule on an apm_* metric, or an SLO
SLO burn never firesFixed in ZenPlus 1.6.0Earlier builds measured the short burn window against a single partially-filled rollup bucket, so it read zero and the both-windows gate could never be satisfied. Windows are now bucket-aligned. After upgrading, expect real burn alerts — verify your targets are the ones you meant
A throughput rule fires constantlyFixed in ZenPlus 1.6.0The evaluator divided a partial bucket's count by a full window, under-reporting throughput by up to 5×. Now divided by the seconds actually covered
Alert fires on every blipA threshold rule is the wrong instrumentUse an SLO. Burn-rate alerting is specifically designed to ignore spikes that do not consume meaningful budget
Alert raised but no notificationNo channels on the rule/SLO, or quiet hoursCheck the notification channels and the rule's schedule window

APM alert rules can be written against: apm_latency_p50, apm_latency_p95, apm_latency_p99 (milliseconds), apm_error_rate and apm_apdex (fractions from 0 to 1), and apm_throughput (requests per second). Leave the target empty to apply a rule to every reporting service.

06 Ingest under load #

SymptomMeaningAction
503 with Retry-AfterIngest queue is fullSDKs retry automatically. Persistent 503 means sustained overload — reduce span volume with sampling, or check storage health
Dropped (flush) climbingSpans accepted then lost on writeStorage is unhealthy or out of disk. This is real data loss
Queue depth persistently highIngest outrunning storageSame investigation as above
Clock-skewed climbingA producer's clock is wrongFix NTP on that host. The producer is named in its span resource attributes
Why skewed spans are refused rather than stored

A span stamped three hours in the future lands in a future rollup bucket and quietly corrupts every window that later includes it. Refusing it means the producer learns something is wrong; storing it means everyone else's dashboards are wrong instead.

07 Still stuck #

Collect these before opening a support case — they answer most of the first round of questions:

  • The exact curl command you used to test ingest, and its full response.
  • A screenshot of Settings → Data quality.
  • The key's last used value.
  • Your SDK's exporter configuration (with the key redacted).
  • Service name, environment, and the time range where you expected data.

Contact Zentryc support.