diff options
3 files changed, 53 insertions, 58 deletions
diff --git a/robusta_krr/core/integrations/prometheus/loader.py b/robusta_krr/core/integrations/prometheus/loader.py index ba4355a..0e42c90 100644 --- a/robusta_krr/core/integrations/prometheus/loader.py +++ b/robusta_krr/core/integrations/prometheus/loader.py @@ -78,58 +78,4 @@ class MetricsLoader(Configurable): ResourceHistoryData: The gathered resource history data. """ - return await self.loader.gather_data(object, resource, period, step) - self.debug(f"Gathering data for {object} and {resource}") - - await self.add_historic_pods(object, period) - - MetricLoaderType = BaseMetricLoader.get_by_resource(resource) - metric_loader = MetricLoaderType(self.config, self.prometheus) - return await metric_loader.load_data(object, period, step) - - async def add_historic_pods(self, object: K8sObjectData, period: datetime.timedelta) -> None: - """ - Finds pods that have been deleted but still have some metrics in Prometheus. - - Args: - object (K8sObjectData): The Kubernetes object. - period (datetime.timedelta): The time period for which to gather data. - """ - - days_literal = min(int(period.total_seconds()) // 60 // 24, 32) - period_literal = f"{days_literal}d" - pod_owners: list[str] - pod_owner_kind: str - - if object.kind == "Deployment": - replicasets = await self.query( - "kube_replicaset_owner{" - f'owner_name="{object.name}", ' - f'owner_kind="Deployment", ' - f'namespace="{object.namespace}"' - "}" - f"[{period_literal}]" - ) - pod_owners = [replicaset["metric"]["replicaset"] for replicaset in replicasets] - pod_owner_kind = "ReplicaSet" - else: - pod_owners = [object.name] - pod_owner_kind = object.kind - - owners_regex = "|".join(pod_owners) - related_pods = await self.query( - "kube_pod_owner{" - f'owner_name=~"{owners_regex}", ' - f'owner_kind="{pod_owner_kind}", ' - f'namespace="{object.namespace}"' - "}" - f"[{period_literal}]" - ) - - current_pods = {p.name for p in object.pods} - - object.pods += [ - PodData(name=pod["metric"]["pod"], deleted=True) - for pod in related_pods - if pod["metric"]["pod"] not in current_pods - ] + return await self.loader.gather_data(object, resource, period, step)
\ No newline at end of file diff --git a/robusta_krr/core/integrations/prometheus/metrics_service/thanos_metrics_service.py b/robusta_krr/core/integrations/prometheus/metrics_service/thanos_metrics_service.py new file mode 100644 index 0000000..7a5b009 --- /dev/null +++ b/robusta_krr/core/integrations/prometheus/metrics_service/thanos_metrics_service.py @@ -0,0 +1,46 @@ +from typing import Optional +from kubernetes.client import ApiClient +from requests.exceptions import ConnectionError, HTTPError + +from robusta_krr.core.models.config import Config +from robusta_krr.utils.service_discovery import ServiceDiscovery + +from .prometheus_metrics_service import PrometheusMetricsService + +class ThanosMetricsDiscovery(ServiceDiscovery): + def find_prometheus_url(self, *, api_client: Optional[ApiClient] = None) -> Optional[str]: + return super().find_url( + selectors=[ + "app.kubernetes.io/component=query,app.kubernetes.io/name=thanos", + ], + api_client=api_client, + ) + + +class ThanosMetricsNotFound(Exception): + pass + +class ThanosMetricsService(PrometheusMetricsService): + def __init__( + self, + config: Config, + *, + cluster: Optional[str] = None, + api_client: Optional[ApiClient] = None, + ) -> None: + super().__init__(config=config, cluster=cluster, api_client=api_client, service_discovery=ThanosMetricsDiscovery) + + def check_connection(self): + try: + response = self.prometheus._session.get( + f"{self.prometheus.url}/api/v1/query", + verify=self.prometheus.ssl_verification, + headers=self.prometheus.headers, + # This query should return empty results, but is correct + params={"query": "example"}, + ) + response.raise_for_status() + except (ConnectionError, HTTPError) as e: + raise ThanosMetricsNotFound( + f"Couldn't connect to Thanos found under {self.prometheus.url}\nCaused by {e.__class__.__name__}: {e})" + ) from e diff --git a/robusta_krr/core/integrations/prometheus/metrics_service/victoria_metrics_service.py b/robusta_krr/core/integrations/prometheus/metrics_service/victoria_metrics_service.py index 345042c..307364d 100644 --- a/robusta_krr/core/integrations/prometheus/metrics_service/victoria_metrics_service.py +++ b/robusta_krr/core/integrations/prometheus/metrics_service/victoria_metrics_service.py @@ -11,12 +11,15 @@ class VictoriaMetricsDiscovery(ServiceDiscovery): def find_prometheus_url(self, *, api_client: Optional[ApiClient] = None) -> Optional[str]: return super().find_url( selectors=[ - "app.kubernetes.io/name=vmsingle,managed-by=vm-operator", + "app.kubernetes.io/name=vmsingle", + "app.kubernetes.io/name=victoria-metrics-single", + "app.kubernetes.io/name=vmselect" + "app=vmselect", + ], api_client=api_client, ) - class VictoriaMetricsNotFound(Exception): pass @@ -42,5 +45,5 @@ class VictoriaMetricsService(PrometheusMetricsService): response.raise_for_status() except (ConnectionError, HTTPError) as e: raise VictoriaMetricsNotFound( - f"Couldn't connect to Prometheus found under {self.prometheus.url}\nCaused by {e.__class__.__name__}: {e})" + f"Couldn't connect to Victoria Metrics found under {self.prometheus.url}\nCaused by {e.__class__.__name__}: {e})" ) from e |
