Skip to content
Snippets Groups Projects
resources_service.py 4.19 KiB
Newer Older
Arie Peterson's avatar
Arie Peterson committed
# from config import KRATOS_ADMIN_URL

# from database import db

# from kubernetes.client import CustomObjectsApi
# import re
import requests
from requests.exceptions import ConnectionError
Arie Peterson's avatar
Arie Peterson committed

from flask import current_app
# import helpers.kubernetes


class ResourcesService:
    @classmethod
    def get_resources(cls):
        # custom = CustomObjectsApi()
        # raw_nodes = custom.list_cluster_custom_object('metrics.k8s.io', 'v1beta1', 'nodes')
        # raw_pods = custom.list_cluster_custom_object('metrics.k8s.io', 'v1beta1', 'pods')
        # nodes = []
        # for node in raw_nodes["items"]:
        #     nodes.append({
        #         "name": node["metadata"]["name"],
        #         "cpu_raw": node["usage"]["cpu"],
        #         "cpu": cls.parse_cpu(node["usage"]["cpu"]),
        #         "memory_raw": node["usage"]["memory"],
        #         "memory_used": cls.parse_memory(node["usage"]["memory"]),
        #     })
        try:
            cores = cls.get_prometheus('machine_cpu_cores')
            current_app.logger.info(f"Number of cores: {cores}")
            result = {
                "success": True,
                # Number of cores in use. So average usage times number of cores.
                "cpu": cores * cls.get_prometheus('1 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[8m])))', 'float'),
                "cpu_total": cores,
            #         "memory_raw": node["usage"]["memory"],
            #         "memory_used": cls.parse_memory(node["usage"]["memory"]),
                "memory_total": cls.get_prometheus('machine_memory_bytes'),
                "memory_available": cls.get_prometheus('node_memory_MemAvailable_bytes'),
                "disk_free": cls.get_prometheus('node_filesystem_free_bytes{mountpoint="/"}'),
                "disk_total": cls.get_prometheus('node_filesystem_size_bytes{mountpoint="/"}'),
            }
        except ConnectionError:
            return {
                "success": False,
                "message": "Could not contact prometheus; perhaps monitoring is not enabled.",
            }
        return result
Arie Peterson's avatar
Arie Peterson committed

    # @staticmethod
    # def parse_cpu(s):
    #     result = re.match(r"^(\d+)([mun]?)$", s)
    #     if result is None:
    #         raise Exception("cpu data does not match known patterns")
    #     number = result.group(1)
    #     suffix = result.group(2)
    #     multipliers = {"": 1, "m": 1e-3, "u": 1e-6, "n": 1e-9}
    #     return (int(number) * multipliers[suffix])

    # @staticmethod
    # def parse_memory(s):
    #     result = re.match(r"^(\d+)(|Ki|Mi|Gi)$", s)
    #     if result is None:
    #         raise Exception("memory data does not match known patterns")
    #     number = result.group(1)
    #     suffix = result.group(2)
    #     multipliers = {"": 1, "Ki": 1024, "Mi": 1024*1024, "Gi": 1024*1024*1024}
    #     return (int(number) * multipliers[suffix])

    @staticmethod
    def get_prometheus(query, cast='int'):
        try:
            params = {
                "query": query,
            }
            result = requests.get("http://kube-prometheus-stack-prometheus:9090/api/v1/query", params=params)
            current_app.logger.info(query)
            current_app.logger.info(result.json())
            value = result.json()["data"]["result"][0]["value"][1]
        except AttributeError:
            return None
        if cast == 'float':
            converted = float(value)
        else:
            converted = int(value)
        return converted

  # "pods": {
  #   "apiVersion": "metrics.k8s.io/v1beta1",
  #   "items": [
  #     {
  #       "containers": [
  #         {
  #           "name": "traffic-manager",
  #           "usage": {
  #             "cpu": "2839360n",
  #             "memory": "24696Ki"
  #           }
  #         }
  #       ],
  #       "metadata": {
  #         "creationTimestamp": "2023-11-30T15:10:10Z",
  #         "labels": {
  #           "app": "traffic-manager",
  #           "pod-template-hash": "5cd7cc7fd6",
  #           "telepresence": "manager"
  #         },
  #         "name": "traffic-manager-5cd7cc7fd6-mp7td",
  #         "namespace": "ambassador"
  #       },
  #       "timestamp": "2023-11-30T15:10:00Z",
  #       "window": "12.942s"
  #     },