Advertisement
Guest User

Untitled

a guest
Feb 20th, 2019
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.04 KB | None | 0 0
  1. #!/usr/bin/python3
  2.  
  3. #Import librarys
  4. import inspect
  5. import os
  6. import sys
  7. sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))))
  8.  
  9. import threading
  10. from http.server import HTTPServer
  11. import socket
  12. import time
  13.  
  14. from prometheus.collectors import Gauge
  15. from prometheus.registry import Registry
  16. from prometheus.exporter import PrometheusMetricHandler
  17.  
  18. import requests
  19. import json
  20. import configparser
  21.  
  22. # Parse and read config file
  23. config = configparser.ConfigParser()
  24. config.read(os.path.expanduser("/root/prometheus/config.conf"))
  25. server_name = config.get("login", "server")
  26. node = config.get("login", "node")
  27. username = config.get("login", "username")
  28. password = config.get("login", "password")
  29. PORT_NUMBER = int(config.get("server", "port"))
  30.  
  31. #set start time for geting new key after 2 hours
  32. start_time = time.time()
  33.  
  34. # api-endpoint
  35. url = server_name + "/api2/json/access/ticket"
  36.  
  37. #PARAMS = {'data':auth}
  38. data = {'username':username,
  39.         'password': password}
  40.  
  41. #ticket = response['data']['ticket']
  42. #token = response['data']['CSRFPreventionToken']
  43.  
  44.  
  45. #get API security code (ticket)
  46. def get_key():
  47.     global start_time
  48.     start_time = time.time()
  49.     r = requests.post(url = url, data = data)
  50.     response = r.json()
  51.     ticket = response['data']['ticket']
  52.     return ticket
  53.  
  54. #set cookies for authorization with ticket code
  55. cookies = dict(PVEAuthCookie= get_key())
  56.  
  57. #refresh key and cookie variable
  58. def refresh_key():
  59.     global cookies
  60.     cookies = dict(PVEAuthCookie= get_key())
  61.  
  62.  
  63. # get request function
  64. def get_request(api_url):
  65.     r = requests.get(server_name + api_url, cookies=cookies)
  66.     return r.json()
  67.  
  68. # get node status
  69. def get_node_status():
  70.     node_status = get_request("/api2/json/nodes/" + node + "/status")
  71.     proxmox_host_metric = node_status['data']
  72.     return proxmox_host_metric
  73.  
  74. # get all VM metric
  75. def get_all_vm():
  76.     all_vm = get_request("/api2/json/cluster/resources?type=vm")
  77.     vm = all_vm['data']
  78.     list = [item for item in vm if item['status'] == "running"]
  79.     return list
  80.  
  81.  
  82. # Gether metrics
  83. def gather_data(registry):
  84.  
  85.  
  86.     # Get the host name of the machine
  87.     host = socket.gethostname()
  88.  
  89.     # Create our collectors
  90.     ram_metric = Gauge("memory_usage_bytes", "Memory usage in bytes",
  91.                        {'host': host})
  92.     max_memory_metric = Gauge("max_memory_assigned", "Assigned memmory in bytes",
  93.                        {'host': host})
  94.     cpu_metric = Gauge("cpu_usage_percent", "CPU usage percent.",
  95.                        {'host': host})
  96.     disk_read_metric = Gauge("disk_read_bytes", "Disk read in bytes",
  97.                        {'host': host})
  98.     disk_write_metric = Gauge("disk_write_bytes", "Disk write in bytes",
  99.                        {'host': host})
  100.     net_in_metric = Gauge("net_in_bytes", "Network input in bytes",
  101.                        {'host': host})
  102.     net_out_metric = Gauge("net_out_bytes", "Network output in bytes",
  103.                        {'host': host})
  104.     # pmx host collectors  
  105.     pmx_root_fs = Gauge("pmx_root_fs_bytes", "Root File System in bytes",
  106.                        {'host': host})
  107.     pmx_load_avg = Gauge("pmx_load_avg", "Proxmox load average",
  108.                        {'host': host})
  109.     pmx_cpu_usage  = Gauge("pmx_cpu_usage_percentage", "Proxmox cpu usage in percentage",
  110.                        {'host': host})
  111.     pmx_memory_usage = Gauge("pmx_memory_usage_bytes", "Proxmox memory usage in bytes",
  112.                        {'host': host})
  113.    
  114.  
  115.     # register the metric collectors
  116.     registry.register(ram_metric)
  117.     registry.register(max_memory_metric)
  118.     registry.register(cpu_metric)
  119.     registry.register(disk_read_metric)
  120.     registry.register(disk_write_metric)
  121.     registry.register(net_in_metric)
  122.     registry.register(net_out_metric)
  123.     # register proxmox metrics
  124.     registry.register(pmx_root_fs)
  125.     registry.register(pmx_load_avg)
  126.     registry.register(pmx_cpu_usage)
  127.     registry.register(pmx_memory_usage)
  128.  
  129.  
  130.     # Start gathering metrics every 15 seconds
  131.     while True:
  132.         if time.time() - start_time >= 3600:
  133.             refresh_key()
  134.  
  135.         time.sleep(15)
  136.  
  137.         # Add metrics
  138.         metric = get_all_vm()
  139.         proxmox_metric = get_node_status()
  140.  
  141.         for item in metric:
  142.  
  143.             for key,value in item.items():
  144.                 if key == "mem":
  145.                     ram_metric.set({'name': item['name'], 'type': 'usage'}, item['mem'])
  146.                 elif key == "maxmem":
  147.                     max_memory_metric.set({'name': item['name'], 'type': 'max'}, item['maxmem'])
  148.                 elif key == "cpu":
  149.                     cpu_metric.set({'name': item['name'], 'type': 'load'}, item['cpu'])
  150.                 elif key == "diskread":
  151.                     disk_read_metric.set({'name': item['name'], 'type': 'disk_read'}, item['diskread'])
  152.                 elif key == "diskwrite":
  153.                     disk_write_metric.set({'name': item['name'], 'type': 'disk_write'}, item['diskwrite'])
  154.                 elif key == "netin":
  155.                     net_in_metric.set({'name': item['name'], 'type': 'net_in'}, item['netin'])
  156.                 elif key == "netout":
  157.                     net_out_metric.set({'name': item['name'], 'type': 'net_out'}, item['netout'])
  158.  
  159.         pmx_root_fs.set({'name': host, 'type': 'Free'}, proxmox_metric['rootfs']['free'])
  160.         pmx_root_fs.set({'name': host, 'type': 'Total'}, proxmox_metric['rootfs']['total'])
  161.         pmx_root_fs.set({'name': host, 'type': 'Used'}, proxmox_metric['rootfs']['used'])
  162.         pmx_root_fs.set({'name': host, 'type': 'Available'}, proxmox_metric['rootfs']['avail'])
  163.  
  164.         pmx_load_avg.set({'name': host, 'type': '1 minute'}, float(proxmox_metric['loadavg'][0]))
  165.         pmx_load_avg.set({'name': host, 'type': '5 minutes'}, float(proxmox_metric['loadavg'][1]))
  166.         pmx_load_avg.set({'name': host, 'type': '15 minutes'}, float(proxmox_metric['loadavg'][2]))
  167.  
  168.         pmx_cpu_usage.set({'name': host, 'type': 'idle'}, proxmox_metric['cpu'])
  169.         pmx_cpu_usage.set({'name': host, 'type': 'IO wait'}, proxmox_metric['wait'])
  170.  
  171.         pmx_memory_usage.set({'name': host, 'type': 'used'}, proxmox_metric['memory']['used'])
  172.         pmx_memory_usage.set({'name': host, 'type': 'free'}, proxmox_metric['memory']['free'])
  173.         pmx_memory_usage.set({'name': host, 'type': 'total'}, proxmox_metric['memory']['total'])
  174.  
  175.  
  176. if __name__ == "__main__":
  177.  
  178.     # Create the registry
  179.     registry = Registry()
  180.  
  181.     # Create the thread that gathers the data while we serve it
  182.     thread = threading.Thread(target=gather_data, args=(registry, ))
  183.     thread.start()
  184.  
  185.     # Set a server to export (expose to prometheus) the data (in a thread)
  186.     try:
  187.         # We make this to set the registry in the handler
  188.         def handler(*args, **kwargs):
  189.             PrometheusMetricHandler(registry, *args, **kwargs)
  190.  
  191.         server = HTTPServer(('', PORT_NUMBER), handler)
  192.         server.serve_forever()
  193.  
  194.     except KeyboardInterrupt:
  195.         server.socket.close()
  196.         thread.join()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement