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.