Short answer: Observe each stage separately: upload, source fetch, transformation, derivative storage, CDN cache, browser selection, and page rendering. Use stable asset and request identifiers, bounded labels, sampled detail, and alerts tied to user impact rather than raw request volume.
An image that looks slow in a browser may be waiting on the HTML, fetched from a remote origin, encoded for the first time, missed at the edge, oversized for its slot, or delayed by rendering. A single endpoint latency metric cannot distinguish those causes.
What should ingestion expose?
Track upload attempts, accepted and rejected bytes, validation duration, processing duration, ready rate, failure reason, retry count, and age of the oldest unfinished asset. Record asset ID and upload intent ID so retries can be connected without creating duplicates.
Monitor dimensions, formats, and pixel counts of accepted sources. A sudden change may signal a new content workflow that exceeds assumptions. Treat rejection categories as product feedback as well as security signals.
The upload pipeline guide defines useful lifecycle states. Dashboards should use the same state vocabulary so operators and application developers discuss one model.
What should source retrieval expose?
For origin-pull systems, record normalized origin name, status, DNS and connection timing when available, time to first byte, response bytes, redirect count, timeout type, and policy rejection. Avoid raw remote URLs if they contain credentials or uncontrolled high-cardinality query strings.
Separate origin failures from transformation failures. A processor cannot fix a slow or unauthorized source. Track the percentage of transformations that required a remote fetch versus a managed original.
Security rejects belong here too. Denied private addresses, disallowed hosts, and invalid redirects should feed alerts described in the remote origin protection guide.
What should transformation expose?
Measure cold transformation rate, queue delay, processing duration, output dimensions, output format, encoded bytes, failure reason, and resource-limit rejection. Aggregate by named preset and bounded dimension bucket rather than full raw transformation strings.
Track unique normalized variants per asset and new variants per minute. These reveal unbounded dimensions or abuse. A sharp increase can precede storage and cost problems even when requests still succeed.
If automatic format or quality is used, record the resulting format and policy tier. Without output facts, an unexpected large response becomes hard to explain.
What should cache and delivery expose?
At each cache layer, capture hit, miss, stale, revalidated, or bypass status; age; response time; response bytes; content type; and region. Distinguish derivative-cache reuse from CDN edge hits if the platform makes both visible.
Monitor cache hit ratio alongside request distribution. A healthy global ratio can hide one region, preset, or route with persistent misses. Track purge requests and completion separately from normal delivery.
The cache key design guide supplies the fields needed to interpret fragmentation. Do not use full signed URLs as metric labels. Extract a stable preset, version, and status while placing detailed URLs only in access-controlled sampled logs.
What should the browser and page expose?
Collect selected candidate, rendered dimensions, intrinsic dimensions, transferred bytes, image timing, LCP attribution, and layout shift involvement for a sample of page views. Segment by page template, component, device class, and connection category.
Use the browser’s currentSrc and resource timing information where cross-origin timing policy permits. The W3C defines Resource Timing for performance data, while Google’s web-vitals library can help attribute Core Web Vitals in field monitoring.
Connect browser observations to delivery policy using a stable asset ID or preset, not a secret token. The payload waste guide explains useful sizing calculations.
Which alerts are actionable?
Alert on sustained error-rate increases, high latency percentiles, old queued work, cold-transform surges, cache-hit collapse, private-origin rejection spikes, and a rise in LCP image load delay. Include a route, region, preset, or error class so responders have a starting point.
Avoid paging on total traffic alone. A successful campaign can look like an incident. Use rates, ratios, saturation, and user-facing thresholds. Pair alerts with a short runbook that identifies relevant logs, a safe test asset, cache checks, and rollback controls.
How do you control cardinality and privacy?
Metrics labels must be bounded. Use known preset, status, format, region, and dimension buckets. Put asset IDs, request IDs, and raw diagnostic context in logs or traces with sampling and retention controls.
Never log signing secrets, full bearer tokens, embedded origin credentials, or sensitive filenames by default. Hash or redact identifiers where business requirements allow. Restrict access to logs that reveal private asset usage.
End-to-end observability is a correlation problem. A stable request context should connect the browser-visible result to edge delivery and backend processing without forcing every detail into one metric. When each stage emits a clear outcome, image incidents become a sequence of testable facts instead of a vague report that pictures are slow.



