summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoravi robusta <avi@robusta.dev>2023-05-29 14:16:49 +0300
committeravi robusta <avi@robusta.dev>2023-05-29 16:26:41 +0300
commitbaa8cae96dcafe0e1dd5da520c89f937f712defc (patch)
treeb1ae73ab007bd6e12d793650f0a82d113143fe13
parent1c38463145d12af3dbce6d8b01bd6f6fbdf801e9 (diff)
added correct services, rebase fix
-rw-r--r--robusta_krr/core/integrations/prometheus/loader.py56
-rw-r--r--robusta_krr/core/integrations/prometheus/metrics_service/thanos_metrics_service.py46
-rw-r--r--robusta_krr/core/integrations/prometheus/metrics_service/victoria_metrics_service.py9
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