This commit is contained in:
Kekskurse 2019-12-30 16:18:42 +01:00
commit 13273356dc
14 changed files with 178 additions and 0 deletions

2
.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
*.pyc
*__pycache__

0
exporter/__init__.py Normal file
View File

8
exporter/cli.py Normal file
View File

@ -0,0 +1,8 @@
import socket
class Cli:
def __init__(self):
self.servername = socket.gethostname()
def gauge(self, name, value):
print("g|server."+self.servername+"."+name+" "+str(value))
def incr(self, name, value):
print("i|server."+self.servername+"."+name+" "+str(value))

0
exporter/statsd.py Normal file
View File

0
monitors/__init__.py Normal file
View File

14
monitors/cpu.py Normal file
View File

@ -0,0 +1,14 @@
import psutil
class CPU:
interval = 10;
loopCount = 0
def __init__(self, exporter):
self.exporter = exporter
def run(self):
cpus = psutil.cpu_percent(interval=1, percpu=True)
i = 0
for cpu in cpus:
i = i + 1
self.exporter.gauge("cpu."+str(i), cpu)

17
monitors/hdd.py Normal file
View File

@ -0,0 +1,17 @@
import os
import psutil
class HDD:
interval = 10;
loopCount = 0
def __init__(self, exporter):
self.exporter = exporter
def run(self):
discs = psutil.disk_partitions()
for disc in discs:
name = disc.device.split("/")[-1]
usage = psutil.disk_usage(disc.mountpoint)
self.exporter.gauge("hdd."+name+".total", usage.total)
self.exporter.gauge("hdd."+name+".used", usage.used)
self.exporter.gauge("hdd."+name+".free", usage.free)
self.exporter.gauge("hdd."+name+".percent", usage.percent)

12
monitors/load.py Normal file
View File

@ -0,0 +1,12 @@
import os
class Load:
interval = 10;
loopCount = 0
def __init__(self, exporter):
self.exporter = exporter
def run(self):
load1, load5, load15 = os.getloadavg()
self.exporter.gauge("load.1min", load1)
self.exporter.gauge("load.5min", load5)
self.exporter.gauge("load.11min", load15)

50
monitors/network.py Normal file
View File

@ -0,0 +1,50 @@
import psutil
class Network:
interval = 1;
loopCount = 0
def __init__(self, exporter):
self.exporter = exporter
self.last = {}
def run(self):
data = psutil.net_io_counters(True, False)
for device in data:
if device in self.last:
bytes_sent = data[device].bytes_sent - self.last[device]["bytes_sent"]
bytes_recv = data[device].bytes_sent - self.last[device]["bytes_recv"]
packets_sent = data[device].packets_sent - self.last[device]["packets_sent"]
packets_recv = data[device].packets_recv - self.last[device]["packets_recv"]
errin = data[device].errin - self.last[device]["errin"]
errout = data[device].errout - self.last[device]["errout"]
dropin = data[device].dropin - self.last[device]["dropin"]
dropout = data[device].dropout - self.last[device]["dropout"]
self.exporter.incr("net."+device+".bytes_sent", bytes_sent)
self.exporter.incr("net."+device+".bytes_recv", bytes_recv)
self.exporter.incr("net."+device+".packets_sent", packets_sent)
self.exporter.incr("net."+device+".packets_recv", packets_recv)
self.exporter.incr("net."+device+".errin", errin)
self.exporter.incr("net."+device+".errout", errout)
self.exporter.incr("net."+device+".dropin", dropin)
self.exporter.incr("net."+device+".dropout", dropout)
else:
self.last[device] = {}
self.last[device]["bytes_sent"] = data[device].bytes_sent
self.last[device]["bytes_recv"] = data[device].bytes_recv
self.last[device]["packets_sent"] = data[device].packets_sent
self.last[device]["packets_recv"] = data[device].packets_recv
self.last[device]["errin"] = data[device].errin
self.last[device]["errout"] = data[device].errout
self.last[device]["dropin"] = data[device].dropin
self.last[device]["dropout"] = data[device].dropout
self.exporter.gauge("net."+device+".bytes_sent", data[device].bytes_sent)
self.exporter.gauge("net."+device+".bytes_recv", data[device].bytes_recv)
self.exporter.gauge("net."+device+".packets_sent", data[device].packets_sent)
self.exporter.gauge("net."+device+".packets_recv", data[device].packets_recv)
self.exporter.gauge("net."+device+".errin", data[device].errin)
self.exporter.gauge("net."+device+".errout", data[device].errout)
self.exporter.gauge("net."+device+".dropin", data[device].dropin)
self.exporter.gauge("net."+device+".dropout", data[device].dropout)
#print(device)
#print(data[device].bytes_sent)
#print(data)
#self.exporter.gauge("users", len(psutil.users()))

11
monitors/processes.py Normal file
View File

@ -0,0 +1,11 @@
import os
class Processes:
interval = 10;
loopCount = 0
def __init__(self, exporter):
self.exporter = exporter
def run(self):
stream = os.popen('ps fax | wc -l')
output = stream.read()
self.exporter.gauge("processes", int(output))

25
monitors/ram.py Normal file
View File

@ -0,0 +1,25 @@
from psutil import virtual_memory, swap_memory
class Ram:
interval = 10;
loopCount = 0
def __init__(self, exporter):
self.exporter = exporter
def run(self):
mem = virtual_memory()
self.exporter.gauge("ram.total", mem.total)
self.exporter.gauge("ram.available", mem.available)
self.exporter.gauge("ram.percent", mem.percent)
self.exporter.gauge("ram.used", mem.used)
self.exporter.gauge("ram.free", mem.free)
self.exporter.gauge("ram.active", mem.active)
self.exporter.gauge("ram.inactive", mem.inactive)
self.exporter.gauge("ram.buffers", mem.buffers)
self.exporter.gauge("ram.cached", mem.cached)
self.exporter.gauge("ram.shared", mem.shared)
self.exporter.gauge("ram.slab", mem.slab)
mem = swap_memory()
self.exporter.gauge("swap.total", mem.total)
self.exporter.gauge("swap.percent", mem.percent)
self.exporter.gauge("swap.used", mem.used)
self.exporter.gauge("swap.free", mem.free)

9
monitors/user.py Normal file
View File

@ -0,0 +1,9 @@
import psutil
class User:
interval = 10;
loopCount = 0
def __init__(self, exporter):
self.exporter = exporter
def run(self):
self.exporter.gauge("users", len(psutil.users()))

2
requirements.txt Normal file
View File

@ -0,0 +1,2 @@
psutil==5.6.7
statsd==3.3.0

28
run.py Normal file
View File

@ -0,0 +1,28 @@
import time
from exporter.cli import Cli
from monitors.load import Load
from monitors.hdd import HDD
from monitors.processes import Processes
from monitors.ram import Ram
from monitors.cpu import CPU
from monitors.user import User
from monitors.network import Network
exporter = Cli()
checks = []
checks.append(Load(exporter))
checks.append(HDD(exporter))
checks.append(Processes(exporter))
checks.append(Ram(exporter))
checks.append(CPU(exporter))
checks.append(User(exporter))
checks.append(Network(exporter))
while True:
for check in checks:
if check.loopCount > check.interval:
check.run()
check.loopCount = -1;
check.loopCount = check.loopCount + 1
time.sleep(1)