Skip to content

Instantly share code, notes, and snippets.

@ser
Created August 11, 2020 15:05
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ser/4e3fdef3d87cda94676f004ed0954ee6 to your computer and use it in GitHub Desktop.
Save ser/4e3fdef3d87cda94676f004ed0954ee6 to your computer and use it in GitHub Desktop.
COLLECTD LXD VIA API
#!/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