How to add a custom metric provider

This guide shows you how to expose your own metrics through the @@metrics endpoint.

A metric provider is an adapter on OFS.interfaces.IApplication that yields Metric instances. For the interface and the Metric fields, see Interfaces.

Implement the provider

from zope.interface import implementer
from plone.observability.interfaces import IMetricProvider
from plone.observability.metric import Metric


@implementer(IMetricProvider)
class MyMetricProvider:
    name = "myapp"
    scope = "instance"

    def __init__(self, context):
        self.context = context

    def collect(self):
        yield Metric(
            name="myapp_queue_length",
            value=get_queue_length(),
            type="gauge",
            scope="instance",
            help="Number of items in the processing queue",
        )

Register the adapter

<adapter
    factory=".metrics.MyMetricProvider"
    provides="plone.observability.interfaces.IMetricProvider"
    for="OFS.interfaces.IApplication"
    name="myapp"
    />

The next scrape of @@metrics includes the yielded metrics.

Keep labels low-cardinality

Do not put unbounded values, such as a user id or a full URL, into metric names or labels. Each unique combination becomes a separate Prometheus time series. See About metrics and cardinality for why this matters and what to use instead.

See also

Metrics describes the built-in metrics and the scope label your provider should set.