---
title: Charmhub | Deploy Observability Libs using Charmhub - The Open Operator Collection
description: Deploy the latest version of Observability Libs as a Kubernetes Operator
  on any cloud.
url: https://charmhub.io/observability-libs/libraries/metrics_endpoint_discovery
---

# Observability Libs

[Jon Seager](https://charmhub.io/publisher/jnsgruk "View all packages from Jon Seager")

* [Jon Seager](https://charmhub.io/publisher/jnsgruk "View all packages from Jon Seager")

Platform:

edge 454c1f8

```
juju deploy observability-libs --channel edge
```

[Learn to deploy on juju >](https://juju.is/docs/juju/manage-applications)

[Toggle side navigation](https://charmhub.io/observability-libs/libraries/metrics_endpoint_discovery#drawer)

## charms.observability\_libs.v0.metrics\_endpoint\_discovery

* [*Docstrings*Docstrings](https://charmhub.io/observability-libs/libraries/metrics_endpoint_discovery)
  [*Code*Source code](https://charmhub.io/observability-libs/libraries/metrics_endpoint_discovery/source-code)
* + Download

    Fetch library

    ```
    charmcraft fetch-lib charms.observability_libs.v0.metrics_endpoint_discovery
    ```

    [Download metrics\_endpoint\_discovery.py](https://charmhub.io/observability-libs/libraries/metrics_endpoint_discovery/download)
  + *Last updated* 20 Feb 2024
  + *Revision* Library version 0.7

#### MetricsEndpointDiscovery Library.

This library provides functionality for discovering metrics endpoints exposed
by applications deployed to a Kubernetes cluster.

It comprises:

* A custom event and event source for handling metrics endpoint changes.
* Logic to observe cluster events and emit the events as appropriate.

##### Using the Library

###### Handling Events

To ensure that your charm can react to changing metrics endpoint events,
use the CharmEvents extension.

```
import json

from charms.observability_libs.v0.metrics_endpoint_discovery import
    MetricsEndpointCharmEvents,
    MetricsEndpointObserver
)

class MyCharm(CharmBase):

    on = MetricsEndpointChangeCharmEvents()

    def __init__(self, *args):
        super().__init__(*args)

        self._observer = MetricsEndpointObserver(self, {"app.kubernetes.io/name": ["grafana-k8s"]})
        self.framework.observe(self.on.metrics_endpoint_change, self._on_endpoints_change)

    def _on_endpoints_change(self, event):
        self.unit.status = ActiveStatus(json.dumps(event.discovered))
```

---

Index

* [class MetricsEndpointChangeEvent](https://charmhub.io/observability-libs/libraries/metrics_endpoint_discovery#metricsendpointchangeevent)
* + [def \_\_init\_\_(
    self,
    handle)](https://charmhub.io/observability-libs/libraries/metrics_endpoint_discovery#metricsendpointchangeevent-__init__)
* + [def snapshot(
    self)](https://charmhub.io/observability-libs/libraries/metrics_endpoint_discovery#metricsendpointchangeevent-snapshot)
* + [def restore(
    self,
    snapshot)](https://charmhub.io/observability-libs/libraries/metrics_endpoint_discovery#metricsendpointchangeevent-restore)
* + [def discovered(
    self)](https://charmhub.io/observability-libs/libraries/metrics_endpoint_discovery#metricsendpointchangeevent-discovered)
* [class MetricsEndpointChangeCharmEvents](https://charmhub.io/observability-libs/libraries/metrics_endpoint_discovery#metricsendpointchangecharmevents)
* [class MetricsEndpointObserver](https://charmhub.io/observability-libs/libraries/metrics_endpoint_discovery#metricsendpointobserver)
* + [def \_\_init\_\_(
    self,
    charm,
    labels)](https://charmhub.io/observability-libs/libraries/metrics_endpoint_discovery#metricsendpointobserver-__init__)
* + [def start\_observer(
    self)](https://charmhub.io/observability-libs/libraries/metrics_endpoint_discovery#metricsendpointobserver-start_observer)
* + [def stop\_observers(
    self)](https://charmhub.io/observability-libs/libraries/metrics_endpoint_discovery#metricsendpointobserver-stop_observers)
* + [def unit\_tag(
    self)](https://charmhub.io/observability-libs/libraries/metrics_endpoint_discovery#metricsendpointobserver-unit_tag)
* [def write\_payload(
  payload
  )](https://charmhub.io/observability-libs/libraries/metrics_endpoint_discovery#write_payload)
* [def dispatch(
  run\_cmd,
  unit,
  charm\_dir
  )](https://charmhub.io/observability-libs/libraries/metrics_endpoint_discovery#dispatch)
* [def main(
  )](https://charmhub.io/observability-libs/libraries/metrics_endpoint_discovery#main)

#### class MetricsEndpointChangeEvent

Description

A custom event for metrics endpoint changes. None

Methods

MetricsEndpointChangeEvent.
\_\_init\_\_(

*self*

,
handle
)

MetricsEndpointChangeEvent.
snapshot(

*self*
)

Description

Save the event payload data. None

MetricsEndpointChangeEvent.
restore(

*self*

,
snapshot
)

Description

Restore the event payload data. None

MetricsEndpointChangeEvent.
discovered(

*self*
)

Description

Return the payload of detected endpoint changes for this event. None

#### class MetricsEndpointChangeCharmEvents

A CharmEvents extension for metrics endpoint changes.

Description

Includes :class:`MetricsEndpointChangeEvent` in those that can be handled.

#### class MetricsEndpointObserver

Observes changing metrics endpoints in the cluster.

Description

Observed endpoint changes cause :class"`MetricsEndpointChangeEvent` to be emitted.

Methods

MetricsEndpointObserver.
\_\_init\_\_(

*self*

,
charm: CharmBase

,
labels
)

Constructor for MetricsEndpointObserver.

Arguments

charm

the charm that is instantiating the library.

labels

dictionary of label/value to be observed for changing metrics endpoints.

MetricsEndpointObserver.
start\_observer(

*self*
)

Description

Start the metrics endpoint observer running in a new process. None

MetricsEndpointObserver.
stop\_observers(

*self*
)

Description

Stops all running instances of the observer. None

MetricsEndpointObserver.
unit\_tag(

*self*
)

Description

Juju-style tag identifying the unit being run by this charm. None

#### def write\_payload(payload)

Description

Write the input event data to event payload file. None

#### def dispatch(     run\_cmd,     unit,     charm\_dir )

Description

Use the input juju-run command to dispatch a :class:`MetricsEndpointChangeEvent`. None

#### def main()

Main watch and dispatch loop.

Description

Watch the input k8s service names. When changes are detected, write the
observed data to the payload file, and dispatch the change event.
