summaryrefslogtreecommitdiff
path: root/python-status-exporter/python-status-exporter.py
blob: 27a6e5f3a735ec51b3eb95882a168041f22dc0a6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#!/bin/env python3

import sys
import os
import inspect
sys.path.insert(0, os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) + "/modules/client_python")

from prometheus_client import start_http_server

import argparse
import importlib

from pprint import pprint
import logging

import time
import signal

def sig_handler(signal, frame):
  if "args" in globals():
    try:
      os.remove(args.pid_file)
    except FileNotFoundError as EX:
      logger = logging.getLogger()
      logger.exception("Unable to remove PID-file {}".format(args.pid_file))
  sys.exit(signal)

signal.signal(signal.SIGINT, sig_handler)
signal.signal(signal.SIGTERM, sig_handler)

def main(args):
  logger = logging.getLogger()
  logger.debug("Starting main({})".format(args))
  if args.fork:
    logger.debug("Trying to fork")
    pid = os.fork()
    if pid:
      pidfile = open(args.pid_file, "w")
      print(pid, file=pidfile)
      logger.debug("Forked into PID: {}".format(pid))
      pidfile.close()
      sys.exit(0)
  else:
    pidfile = open(args.pid_file, "w")
    print(os.getpid(), file=pidfile)
    logger.debug("Running in forground with PID: {}".format(os.getpid()))
    pidfile.close()

  mods = list()
  for m in args.module:
    mod = importlib.import_module("modules." + m[0])
    mods.append(mod)

  if logger.getEffectiveLevel() <= logging.DEBUG:
    for m in mods:
      logger.debug("Listing loaded modules:")
      logger.debug("    " + str(m))

  prom_data = dict()

  for m in mods:
    m.init_datapoints(prom_data)
    m.update_datapoints(prom_data)

  if logger.getEffectiveLevel() <= logging.DEBUG:
    logger.debug("Listing datapoints from all modules:")
    for d in prom_data:
      logger.debug("    " + d)
  

  if args.host is None:
    logger.debug("start http listener")
    start_http_server(args.port)
  else:
    logger.debug("start http listener")
    start_http_server(args.port, args.host)
  while True:
    logger.debug("Sleeping")
    time.sleep(15)
    for m in mods:
      logger.debug("Updating values for " + str(m))
      m.init_datapoints(prom_data)
      m.update_datapoints(prom_data)

if __name__ == '__main__':
  parser = argparse.ArgumentParser()
  parser.add_argument("-H", "--host", help="Listen address", action="store", nargs=1, type=str)
  parser.add_argument("-p", "--port", help="Listen port", action="store", nargs='?', default=8080, type=int)
  parser.add_argument("-m", "--module", help="Module to load", action="append", required=True, nargs=1, type=str)
  parser.add_argument("--pid-file", help="Where to write PID file", action="store", default="/var/run/"+sys.argv[0]+".pid", type=str)
  parser.add_argument("--fork", help="Fork process to background", action="store_true", default=False)
  parser.add_argument("-l", "--log-file", help="Logfile", action="store", nargs='?', default="/dev/stderr")
  parser.add_argument("-L", "--log-level", help="Logfile", action="store", nargs='?', default="error", choices=["debug","info","warning","error","critical"], type=str)
  parser.add_argument("-v", "--version", help="Show version information and exit", action="store_true", default=False)
  global args
  args = parser.parse_args()

  if args.log_file.startswith("/dev/std"):
    logging.basicConfig(filename=args.log_file, filemode="w")
  else:
    logging.basicConfig(filename=args.log_file)
  logger = logging.getLogger()

  if args.log_level == "debug":
    logger.setLevel(logging.DEBUG)
  if args.log_level == "info":
    logger.setLevel(logging.INFO)
  if args.log_level == "warning":
    logger.setLevel(logging.WARNING)
  if args.log_level == "error":
    logger.setLevel(logging.ERROR)
  if args.log_level == "critical":
    logger.setLevel(logging.CRITICAL)

  if args.version:
    print("{} version {}".format(sys.argv[0], "0.00 beta"))
    sys.exit(0)

  # logger.debug("DEBUG")
  # logger.info("INFO")
  # logger.warning("WARNING")
  # logger.error("ERROR")
  # logger.critical("CRITICEL")

  main(args)