Files
monitoring/docker.py
2026-04-27 11:35:05 +02:00

139 lines
5.2 KiB
Python

import subprocess
import json
def health():
result = subprocess.run(['docker', 'ps', '-a', '--format', 'json', '--no-trunc'], stdout=subprocess.PIPE)
result = str(result.stdout)[:-1].replace("b'", "").replace('\\"', '').replace('\\', '').replace("u003e", ">").split('{"Command"')
ret_dict = {}
for container in result:
if container != "":
j = '{"Command"'+container[:-1]
data = json.loads(j)
ret_dict[data["Names"]] = {}
if data["State"] == "running":
ret_dict[data["Names"]]["status"] = 1
else:
ret_dict[data["Names"]]["status"] = 0
if "unhealthy" in data["Status"]:
ret_dict[data["Names"]]["health"] = 3
elif "Restarting" in data["Status"]:
ret_dict[data["Names"]]["health"] = 2
elif "healthy" in data["Status"]:
ret_dict[data["Names"]]["health"] = 0
elif "starting" in data["Status"]:
ret_dict[data["Names"]]["health"] = 1
else:
ret_dict[data["Names"]]["health"] = -1
return ret_dict
def _sizeConv(value):
number = ""
for d in value:
if d.isdigit():
number += d
elif d == '.':
number += d
else:
continue
number = float(number)
if "TB" in value:
return number * 10**12
elif "GB" in value:
return number * 10**9
elif "MB" in value:
return number * 10**6
elif "KB" in value:
return number * 10**3
else:
return number
def getSize():
result = subprocess.run(['docker', 'system', 'df', '--format', 'json'], stdout=subprocess.PIPE)
result = result.stdout.decode('utf-8')[:-1].split('\n')
size = {}
for line in result:
a = json.loads(line)
size[a["Type"]] = {}
size[a["Type"]]["used"] = _sizeConv(a["Size"])
size[a["Type"]]["reclaimable"] = _sizeConv(a["Reclaimable"].split(" ")[0])
size[a["Type"]]["count_total"] = a["TotalCount"]
size[a["Type"]]["count_active"] = a["Active"]
return size
def getInfo():
docker = {}
result = subprocess.run(['docker', 'system', 'info', '--format', 'json'], stdout=subprocess.PIPE)
result = result.stdout.decode('utf-8')[:-1]
info = json.loads(result)
docker["version"] = info["ServerVersion"]
result = subprocess.run(['docker', 'system', 'df', '-v', '--format', 'json'], stdout=subprocess.PIPE)
result = result.stdout.decode('utf-8')
info = json.loads(result)
docker["images"] = {}
docker["containers"] = {}
docker["volumes"] = {}
docker["buildcache"] = {}
for image in info["Images"]:
docker["images"][image["ID"]] = {}
docker["images"][image["ID"]]["containers"] = image["Containers"]
docker["images"][image["ID"]]["created"] = image["CreatedSince"]
docker["images"][image["ID"]]["repository"] = image["Repository"]
docker["images"][image["ID"]]["size"] = _sizeConv(image["Size"])
docker["images"][image["ID"]]["unique_size"] = image["UniqueSize"]
for container in info["Containers"]:
docker["containers"][container["ID"]] = {}
docker["containers"][container["ID"]]["created"] = container["CreatedAt"]
docker["containers"][container["ID"]]["image"] = container["Image"]
docker["containers"][container["ID"]]["volumes"] = container["LocalVolumes"]
docker["containers"][container["ID"]]["mounts"] = container["Mounts"]
try:
docker["containers"][container["ID"]]["name"] = container["Names"]
except:
docker["containers"][container["ID"]]["name"] = ""
try:
docker["containers"][container["ID"]]["networks"] = container["Networks"]
except:
docker["containers"][container["ID"]]["networks"] = ""
docker["containers"][container["ID"]]["runtime"] = container["RunningFor"]
docker["containers"][container["ID"]]["state"] = container["State"]
docker["containers"][container["ID"]]["size"] = _sizeConv(container["Size"])
docker["containers"][container["ID"]]["status"] = container["Status"]
for volume in info["Volumes"]:
docker["volumes"][volume["Name"]] = {}
docker["volumes"][volume["Name"]]["driver"] = volume["Driver"]
docker["volumes"][volume["Name"]]["links"] = volume["Links"]
docker["volumes"][volume["Name"]]["mountpoint"] = volume["Mountpoint"]
docker["volumes"][volume["Name"]]["size"] = _sizeConv(volume["Size"])
for build in info["BuildCache"]:
docker["buildcache"][build["ID"]] = {}
docker["buildcache"][build["ID"]]["type"] = build["CacheType"]
docker["buildcache"][build["ID"]]["created"] = build["CreatedSince"]
docker["buildcache"][build["ID"]]["in_use"] = build["InUse"]
docker["buildcache"][build["ID"]]["last_use"] = build["LastUsedSince"]
docker["buildcache"][build["ID"]]["shared"] = build["Shared"]
docker["buildcache"][build["ID"]]["size"] = _sizeConv(build["Size"])
docker["buildcache"][build["ID"]]["use_count"] = build["UsageCount"]
return docker
if __name__ == "__main__":
print(json.dumps(getSize()))
print(json.dumps(getInfo()))
#print(health())