summaryrefslogtreecommitdiff
path: root/robusta_krr
diff options
context:
space:
mode:
authorLeaveMyYard <zhukovpavel2001@gmail.com>2024-04-02 19:37:30 +0300
committerLeaveMyYard <zhukovpavel2001@gmail.com>2024-04-02 19:37:30 +0300
commitd0e531bd623922f603af29ad6613fd7b1ce1944d (patch)
tree4d2f5de5e276454c814a47e86da4ec51d8057b9c /robusta_krr
parent1e7f0aa749f38dee4f81f5ecb4d859a866a4e80f (diff)
parentc3dccb91fe5907a42a285b34443591d28cb344fc (diff)
Merge branch 'main' of github.com:robusta-dev/krr
Diffstat (limited to 'robusta_krr')
-rw-r--r--robusta_krr/core/integrations/prometheus/loader.py4
-rw-r--r--robusta_krr/core/integrations/prometheus/metrics_service/mimir_metrics_service.py47
-rw-r--r--robusta_krr/core/integrations/prometheus/metrics_service/prometheus_metrics_service.py5
-rw-r--r--robusta_krr/core/models/config.py5
4 files changed, 56 insertions, 5 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}
diff --git a/robusta_krr/core/models/config.py b/robusta_krr/core/models/config.py
index d4f04a0..ff6142a 100644
--- a/robusta_krr/core/models/config.py
+++ b/robusta_krr/core/models/config.py
@@ -138,11 +138,10 @@ class Config(pd.BaseSettings):
def load_kubeconfig(self) -> None:
try:
- config.load_incluster_config()
- except ConfigException:
config.load_kube_config(config_file=self.kubeconfig, context=self.context)
self.inside_cluster = False
- else:
+ except ConfigException:
+ config.load_incluster_config()
self.inside_cluster = True
def get_kube_client(self, context: Optional[str] = None):