diff options
| author | FrankFoerster24 <108520305+FrankFoerster24@users.noreply.github.com> | 2024-04-02 18:35:33 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-04-02 19:35:33 +0300 |
| commit | c3dccb91fe5907a42a285b34443591d28cb344fc (patch) | |
| tree | 829a3f71078dfaebf9fc3d79f049a9cc8e194691 /robusta_krr | |
| parent | d65cf3d422c825af4f29a5705706c64614ab7820 (diff) | |
Add Mimir support (#168)
* Add Mimir support
* Update url postfix for Mimir
* Fix Mimir-specific headers
---------
Co-authored-by: Pavel Zhukov <33721692+LeaveMyYard@users.noreply.github.com>
Co-authored-by: LeaveMyYard <zhukovpavel2001@gmail.com>
Diffstat (limited to 'robusta_krr')
3 files changed, 54 insertions, 2 deletions
diff --git a/robusta_krr/core/integrations/prometheus/loader.py b/robusta_krr/core/integrations/prometheus/loader.py index 82c7d74..db49392 100644 --- a/robusta_krr/core/integrations/prometheus/loader.py +++ b/robusta_krr/core/integrations/prometheus/loader.py @@ -16,13 +16,13 @@ from robusta_krr.core.models.objects import K8sObjectData, PodData from .metrics_service.prometheus_metrics_service import PrometheusMetricsService from .metrics_service.thanos_metrics_service import ThanosMetricsService from .metrics_service.victoria_metrics_service import VictoriaMetricsService +from .metrics_service.mimir_metrics_service import MimirMetricsService if TYPE_CHECKING: from robusta_krr.core.abstract.strategies import BaseStrategy, MetricsPodData logger = logging.getLogger("krr") - class PrometheusMetricsLoader: def __init__(self, *, cluster: Optional[str] = None) -> None: """ @@ -56,7 +56,7 @@ class PrometheusMetricsLoader: metrics_to_check = [PrometheusMetricsService] else: logger.info("No Prometheus URL is specified, trying to auto-detect a metrics service") - metrics_to_check = [VictoriaMetricsService, ThanosMetricsService, PrometheusMetricsService] + metrics_to_check = [VictoriaMetricsService, ThanosMetricsService, MimirMetricsService, PrometheusMetricsService] for metric_service_class in metrics_to_check: service_name = metric_service_class.name() diff --git a/robusta_krr/core/integrations/prometheus/metrics_service/mimir_metrics_service.py b/robusta_krr/core/integrations/prometheus/metrics_service/mimir_metrics_service.py new file mode 100644 index 0000000..ea3af57 --- /dev/null +++ b/robusta_krr/core/integrations/prometheus/metrics_service/mimir_metrics_service.py @@ -0,0 +1,47 @@ +from typing import Optional + +from kubernetes.client import ApiClient +from prometrix import MetricsNotFound + +from robusta_krr.utils.service_discovery import MetricsServiceDiscovery + +from .prometheus_metrics_service import PrometheusMetricsService + +class MimirMetricsDiscovery(MetricsServiceDiscovery): + def find_metrics_url(self, *, api_client: Optional[ApiClient] = None) -> Optional[str]: + """ + Finds the Mimir Metrics URL using selectors. + Args: + api_client (Optional[ApiClient]): A Kubernetes API client. Defaults to None. + Returns: + Optional[str]: The discovered Mimir Metrics URL, or None if not found. + """ + return super().find_url( + selectors=[ + "app.kubernetes.io/name=mimir,app.kubernetes.io/component=query-frontend", + ] + ) + + +class MimirMetricsService(PrometheusMetricsService): + """ + A class for fetching metrics from Mimir Metrics. + """ + + service_discovery = MimirMetricsDiscovery + url_postfix = "/prometheus" + additional_headers = {"X-Scope-OrgID": "anonymous"} + + def check_connection(self): + """ + Checks the connection to Prometheus. + Raises: + MimirMetricsNotFound: If the connection to Mimir Metrics cannot be established. + """ + try: + super().check_connection() + except MetricsNotFound as e: + # This is to clarify which metrics service had the issue and not say its a prometheus issue + raise MetricsNotFound( + f"Couldn't connect to Mimir Metrics found under {self.prometheus.url}\nCaused by {e.__class__.__name__}: {e})" + ) from e diff --git a/robusta_krr/core/integrations/prometheus/metrics_service/prometheus_metrics_service.py b/robusta_krr/core/integrations/prometheus/metrics_service/prometheus_metrics_service.py index ebcb835..423a29a 100644 --- a/robusta_krr/core/integrations/prometheus/metrics_service/prometheus_metrics_service.py +++ b/robusta_krr/core/integrations/prometheus/metrics_service/prometheus_metrics_service.py @@ -51,6 +51,8 @@ class PrometheusMetricsService(MetricsService): """ service_discovery: type[MetricsServiceDiscovery] = PrometheusDiscovery + url_postfix: str = "" + additional_headers: dict[str, str] = {} def __init__( self, @@ -86,9 +88,12 @@ class PrometheusMetricsService(MetricsService): f"{self.name()} instance could not be found while scanning in {self.cluster} cluster." ) + self.url += self.url_postfix + logger.info(f"Using {self.name()} at {self.url} for cluster {cluster or 'default'}") headers = settings.prometheus_other_headers + headers |= self.additional_headers if self.auth_header: headers |= {"Authorization": self.auth_header} |
