mimir-coordinator-k8s

Mimir Coordinator K8S

  • Canonical Observability
Channel Revision Published Runs on
latest/stable 38 15 Apr 2025
Ubuntu 22.04
latest/candidate 39 15 Apr 2025
Ubuntu 22.04
latest/beta 40 15 Apr 2025
Ubuntu 22.04
latest/edge 40 09 Apr 2025
Ubuntu 22.04
juju deploy mimir-coordinator-k8s
Show information

Platform:

charms.mimir_coordinator_k8s.v0.prometheus_api

prometheus_api.

This library implements endpoint wrappers for the prometheus-api interface. The prometheus-api interface is used to transfer information about an instance of Prometheus, such as how to access and uniquely identify it. Typically, this is useful for charms that operate a Prometheus instance to give other applications access to its API.

Usage
Requirer

PrometheusApiRequirer is a wrapper for pulling data from the prometheus-api interface. To use it in your charm:

  • observe the relation-changed event for this relation wherever your charm needs to use this data (this endpoint wrapper DOES NOT automatically observe any events)
  • wherever you need access to the data, call PrometheusApiRequirer(...).get_data()

An example implementation is:

class FooCharm(CharmBase):
    def __init__(self, framework):
        super().__init__(framework)

        self.prometheus_api = PrometheusApiRequirer(self.model.relations, "prometheus-api")

        self.framework.observe(self.on["prometheus-api"].relation_changed, self._on_prometheus_api_changed)

    def _on_prometheus_api_changed(self):
        data = self.prometheus_api.get_data()
        ...

Where you also add relation to your charmcraft.yaml or metadata.yaml (note that PrometheusApiRequirer is designed for relating to a single application and must be used with limit=1 as shown below):

requires:
  prometheus-api:
    limit: 1
    interface: prometheus_api
Provider

PrometheusApiProvider is a wrapper for publishing data to charms related using the prometheus-api interface. Note that PrometheusApiProvider does not manage any events, but instead provides a publish method for sending data to all related applications. Triggering publish appropriately is left to the charm author, although generally you want to do this at least during the relation_joined and leader_elected events. An example implementation is:

class FooCharm(CharmBase):
    def __init__(self, framework):
        super().__init__(framework)
        self.prometheus_api = PrometheusApiProvider(
            relations=self.model.relations,
            relation_name="prometheus-api",
            app=self.app,
        )

        self.framework.observe(self.on.leader_elected, self.do_something_to_publish)
        self.framework.observe(self._charm.on["prometheus-api"].relation_joined, self.do_something_to_publish)
        self.framework.observe(self.on.some_event_that_changes_prometheus_api, self.do_something_to_publish)

    def do_something_to_publish(self, e):
        self.prometheus_api.publish(...)

Where you also add the following to your charmcraft.yaml or metadata.yaml:

provides:
  prometheus-api:
    interface: prometheus_api

class PrometheusApiAppData

Description

Data model for the prometheus-api interface. None

class PrometheusApiRequirer

Description

Endpoint wrapper for the requirer side of the prometheus-api relation. None

Methods

PrometheusApiRequirer. __init__( self , relation_mapping: RelationMapping , relation_name: str )

Initialize the PrometheusApiRequirer object.

Arguments

relation_mapping

The RelationMapping of a charm (typically self.model.relations from within a charm object).

relation_name

The name of the wrapped relation.

Description

This object is for accessing data from relations that use the prometheus-api interface. It does not autonomously handle the events associated with that relation. It is up to the charm using this object to observe those events as they see fit. Typically, that charm should observe this relation's relation-changed event.

This object is for interacting with a relation that has limit=1 set in charmcraft.yaml. In particular, the get_data method will raise if more than one related application is available.

PrometheusApiRequirer. relations( self )

Description

Return the relation instances for applications related to us on the monitored relation. None

PrometheusApiRequirer. get_data( self )

Return data for at most one related application, raising if more than one is available.

Description

Useful for charms that always expect exactly one related application. It is recommended that those charms also set limit=1 for that relation in charmcraft.yaml. Returns None if no data is available (either because no applications are related to us, or because the related application has not sent data).

class PrometheusApiProvider

Description

The provider side of the prometheus-api relation. None

Methods

PrometheusApiProvider. __init__( self , relation_mapping: RelationMapping , app: Application , relation_name: str )

Initialize the PrometheusApiProvider object.

Arguments

relation_mapping

The RelationMapping of a charm (typically self.model.relations from within a charm object).

app

This application.

relation_name

The name of the relation.

Description

This object is for serializing and sending data to a relation that uses the prometheus-api interface - it does not automatically observe any events for that relation. It is up to the charm using this to call publish when it is appropriate to do so, typically on at least the charm's leader_elected event and this relation's relation_joined event.

PrometheusApiProvider. relations( self )

Description

Return the applications related to us under the monitored relation. None

PrometheusApiProvider. publish( self , direct_url , ingress_url )

Post prometheus-api to all related applications.

Arguments

direct_url

The cluster-internal URL at which this application can be reached. Typically, this is a Kubernetes FQDN like name.namespace.svc.cluster.local for connecting to the prometheus api from inside the cluster, with scheme.

ingress_url

The non-internal URL at which this application can be reached. Typically, this is an ingress URL.

Description

This method writes to the relation's app data bag, and thus should never be called by a unit that is not the leader otherwise ops will raise an exception.