Created
August 11, 2020 15:05
-
-
Save ser/4e3fdef3d87cda94676f004ed0954ee6 to your computer and use it in GitHub Desktop.
COLLECTD LXD VIA API
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python3 | |
# (C) Serge Victor 2020, LGPL3 license, https://www.gnu.org/licenses/lgpl-3.0.en.html | |
# ADD | |
# LD_PRELOAD=/usr/lib/python3.8/config-3.8-x86_64-linux-gnu/libpython3.8.so | |
# to /etc/default/collectd | |
# RUN | |
# pip3 install pylxd | |
# to install modules | |
# GENERATE keys | |
# openssl req -newkey rsa:2048 -nodes -keyout lxd.key -out lxd.csr | |
# openssl x509 -signkey lxd.key -in lxd.csr -req -days 365 -out lxd.crt | |
# More docs on: | |
# https://pylxd.readthedocs.io/en/latest/ | |
# https://linuxcontainers.org/lxd/docs/master/rest-api | |
import datetime | |
import requests | |
requests.packages.urllib3.disable_warnings(requests.packages.urllib3.exceptions.InsecureRequestWarning) | |
from pylxd import Client | |
passdir = "/home/ser/.pass/" | |
client = Client('https://127.0.0.1:8443',cert=(passdir + 'lxd.crt', passdir + 'lxd.key'),verify=False) | |
client.authenticate('your lxd pass') | |
containers = client.containers.all() | |
api = Client().api | |
def configer(ObjConfiguration): | |
collectd.info('Configuring LXD collectd') | |
def initer(): | |
collectd.info('Initing LXD collectd') | |
def reader(input_data=None): | |
# foreach container | |
for container in containers: | |
alldata = api.instances[container.name].state.get().json() | |
ts = int(datetime.datetime.now().timestamp()) | |
### MEMORY | |
# memory / gauge | |
mem = alldata['metadata']['memory']['usage'] | |
swp = alldata['metadata']['memory']['swap_usage'] | |
values = collectd.Values(plugin_instance=container.name + " memory", | |
type="gauge", plugin="LXD", time=ts) | |
values.dispatch(type_instance="memory usage", values=[mem]) | |
values.dispatch(type_instance="swap usage", values=[swp]) | |
### End Memory | |
### CPU | |
# cpu / counter | |
cpu = alldata['metadata']['cpu']['usage'] | |
values = collectd.Values(plugin_instance=container.name + " CPU", | |
type="counter", plugin="LXD", time=ts) | |
values.dispatch(type_instance="CPU usage", values=[cpu]) | |
### End CPU | |
### DISK | |
# disk / gauge | |
rootdisk = alldata['metadata']['disk']['root']['usage'] | |
values = collectd.Values(plugin_instance=container.name + " disk usage", | |
type="gauge", plugin="LXD", time=ts) | |
values.dispatch(type_instance="root filesystem", values=[rootdisk]) | |
### End DISK | |
### Network | |
# net / counter | |
net_bytes_received = alldata['metadata']['network']['eth0']['counters']['bytes_received'] | |
net_bytes_sent = alldata['metadata']['network']['eth0']['counters']['bytes_sent'] | |
net_packets_received = alldata['metadata']['network']['eth0']['counters']['packets_received'] | |
net_packets_sent = alldata['metadata']['network']['eth0']['counters']['packets_sent'] | |
values = collectd.Values(plugin_instance=container.name + " network", | |
type="counter", plugin="LXD", time=ts) | |
values.dispatch(type_instance="TX bytes", values=[net_bytes_sent]) | |
values.dispatch(type_instance="RX bytes", values=[net_bytes_received]) | |
values.dispatch(type_instance="TX packets", values=[net_packets_sent]) | |
values.dispatch(type_instance="RX packets", values=[net_packets_received]) | |
### End Network | |
if __name__ == '__main__': | |
# Mimic Collectd Values object | |
class Values(object): | |
def __init__(self, **kwargs): | |
self.__dict__["_values"] = kwargs | |
def __setattr__(self, key, value): | |
self.__dict__["_values"][key] = value | |
def dispatch(self, **kwargs): | |
values = self._values.copy() | |
values.update(kwargs) | |
print(values) | |
import types | |
collectd = types.ModuleType("collectd") | |
collectd.Values = Values | |
reader() | |
else: | |
import collectd | |
collectd.register_config(configer) | |
collectd.register_init(initer) | |
collectd.register_read(reader) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment