Plone.observability 1.0.0 final released

We just released plone.observability 1.0.0, the first stable release. It brings Kubernetes-style health probes, a pluggable metrics endpoint, and optional OpenTelemetry tracing to Plone running in containers.

Plone's built-in @@ok view answers OK whether the database is reachable or not, right up until the process is too busy to answer at all. plone.observability gives an orchestrator and your monitoring stack the real signals they need.

What's in the box

Health probes. Separate liveness, readiness, and startup probes on a dedicated HTTP port that stays answerable even when all Zope worker threads are busy. Ready to wire into Kubernetes probe configuration.

Metrics. A pluggable metrics endpoint with Prometheus text and JSON output. Request, ZODB, and content metrics ship out of the box, designed with low-cardinality labels so they stay cheap to scrape and store.

OpenTelemetry tracing (optional extra). Honors the standard OTEL_* environment variables. Every request is traced, Blicca (the former Classic UI) and REST API alike: the publish span carries ZODB object-load counts and load time, and catalog queries, subrequests, content transforms, and commits show up as child spans. On zodb-pgjsonb, loads are additionally split into shared-cache hits vs. actual PostgreSQL round-trips. For Blicca, the render phase is traced in detail, with spans per viewlet manager, viewlet, portlet column, and portlet, so slow tiles and N+1 patterns become visible per request. Optional instrumentors (botocore, requests, urllib3, httpx) pull S3 blob access and outbound HTTP into the same trace, and a small start_span helper lets you add spans to your own code.

Extensible. Custom health checks, metric providers, and metric formatters plug in via the Zope Component Architecture.

Getting started

Works with Plone 6.2 on Python 3.10–3.14. Add plone.observability to your dependencies, include its ZCML, and wire the WSGI filters; the installation guide walks through the full setup.

Feedback, issues, and pull requests are very welcome!

9 Likes

@jensens, thank you for this package!

Do you have any objection to add this, by default, to our container images?

@ericof It would fit like a glove. This is what I made it for.

Quick follow-up: plone.observability 1.1.0 is out, prompted by a PM question about seeing the ingress, Volto, the backend, and the database as one distributed trace.

  • SQL spans down to PostgreSQL: the new opentelemetry-db extra adds an optional psycopg instrumentor. On zodb-pgjsonb every SQL statement becomes a child span of the request span, so a trace now reaches from the ingress to the individual query.
  • New guide: How to trace one request across the whole stack walks through the whole chain hop by hop — Traefik as the trace root, Varnish passing the trace context through, the Volto SSR server via Node auto-instrumentation, and the backend joining automatically (it extracts incoming W3C traceparent headers out of the box).

Changelog: plone.observability/CHANGES.md at main · plone/plone.observability · GitHub