Skip to content

Instantly share code, notes, and snippets.

@LuisPalacios
Last active March 18, 2022 16:47
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 LuisPalacios/e130f8200132a86a32dafbf2bfd0d1fb to your computer and use it in GitHub Desktop.
Save LuisPalacios/e130f8200132a86a32dafbf2bfd0d1fb to your computer and use it in GitHub Desktop.
Script compatible con el Plugin [[input.exec]] de Telegraf para mandar datos a InfluxDB
#!/bin/bash
#
# By Luispa (2022)
#
# Script para ser usado desde un cliente Telegraf en un HOST KVM para informar a influxdb
# del tamaño de sus discos de sus GUESTS. El caso de uso es en un linux Host con QEMU/KVM
# donde nos gustaría ver cuanto ocupa cada QCOW2
#
# - capacity --> Tamaño máximo del disco del GUEST. Indica el tamaño máximo al que
#  puede crecer el disco. Se estableción durante la creación de la VM.
# - allocated --> Cuanto tamaño ha reservado y está utilizando el GUEST en realidad.
# Siempre es menor del tamaño "capacity".
#  - physical --> Tamaño del qcow2 en el HOST. Será un poco más grande que el "allocated".
#
# Este script debe mostrar los datos que monitoriza por su standard output y la salida
# esperada son varias líneas, una por cada métrica que queremos enviar a influxdb.
#
# root@almacenix:/etc/telegraf/scripts# ./vm_disk.sh
# disk,host=sol,device=pihole.parchis.org physical=7006126080,capacity=8589934592,allocation=7004733440,used=3228145 1647621011682000000
# disk,host=sol,device=almacenix.parchis.org physical=4957798400,capacity=8589934592,allocation=4956413952,used=3263529 1647621011682000000
# disk,host=sol,device=netdisco.parchis.org physical=3532521472,capacity=6442450944,allocation=3531186176,used=3489317 1647621011682000000
# | ------------------------------------ -------------------------------------------------------------------------- --------------------
# | | | |
# | | | |
# +-----------+---------------------------+-+-------------------------------------------------------------------------+-+------------+
# |measurement|,tag_set | | field_set | |timestamp |
# +-----------+---------------------------+-+-------------------------------------------------------------------------+-+------------+
#
# Referencia : https://docs.influxdata.com/influxdb/v1.8/write_protocols/line_protocol_reference/
# Tutorial : https://docs.influxdata.com/influxdb/v1.8/write_protocols/line_protocol_tutorial/
#
# INSTALACIÓN:
#
# 1. Permitir al usuario 'telegraf' (o '_telegraf') ejecutar el virsh y virt-df
# Añadir lo siguiente al fichero /etc/sudoers con 'visudo'
#
# # Para que no llene el syslog
# Defaults: _telegraf !logfile, !syslog
#
# # Permitir que el usuario _telegraf ejecute los siguientes comandos como root
# _telegraf ALL = (root) NOPASSWD: /usr/bin/virsh
# _telegraf ALL = (root) NOPASSWD: /usr/bin/virt-df
#
# Añadir la siguiente línea en /etc/pam.d/sudo
# :
# @include common-account
# session [success=1 default=ignore] pam_succeed_if.so quiet ruser = _telegraf # <== AÑADIR esta línea AQUI !!
# @include common-session-noninteractive
#
# 2. Crear /etc/telegraf/scripts/vm_disk.sh y copiar este script con permisos de ejecución
#
# chmod 755 /etc/telegraf/scripts/vm_disk.sh
#
# 3. Modificar el fichero de configuración de telgraf:
#
# Opción 1: /etc/telegraf/telegraf.conf
# Opción 2: Si lo cargas directamente desde InfluxDB, modificarlo en InfluxDB
# http://almacenix.parchis.org:8086 --> Load Data > Telegraf
#
# [[inputs.exec]]
# commands = ["/etc/telegraf/scripts/vm_disk.sh"]
# data_format = "influx"
# interval = "600s"
#
# 4. Rearranca el servicio
#
# systemctl restart telegraf
#
# 5. Compruebo que funciona, en tu servidor influxdb...
#
# http://a.b.c.d:8086
# Data Explorer
# telegraf
# _measurement: disk
# _field: used
# tags: device, type, host
#
#
# Timestamp: fecha actual, en milisegundos y le añado 6 ceros (descarto los nanosegundos)
timestamp=`date +%s%3N000000`
host=`hostname`
#LOG="/tmp/poc.log"
#echo --- >> ${LOG}
#date >> ${LOG}
# Me guardo cuanto se está usando de cada VM
IFS=$'\n'
alldisks=($(sudo -u root virt-df | grep -v "^Sistema"))
# Recorro las vm's (guests)
for vm in $(sudo -u root virsh list --all --name);
do
#echo ${vm} >> ${LOG}
physical=0
capacity=0
allocation=0
# Get the physical, capacity, allocation
for disk in $(sudo -u root virsh domblklist ${vm} --details | grep disk | awk '/disk/{print $3}');
do
declare -A arr
for line in $(sudo -u root virsh domblkinfo ${vm} ${disk} | grep -v "^$");
do
key=`echo "${line//:}" | awk '{print tolower($1)}'`
value=`echo "${line}" | awk '{print $2}'`
arr+=( [${key}]=${value} )
done
physical=$((physical+${arr['physical']}))
capacity=$((capacity+${arr['capacity']}))
allocation=$((allocation+${arr['allocation']}))
done
# Get the used
used=0
for value in $(echo "${alldisks[*]}" | grep ${vm} | awk '{print $3}');
do
used=$((used+${value}))
done
used=$((${used}*1024))
echo "disk,host=${host},device=${vm} fisico=${physical},capacidad=${capacity},reserva=${allocation},uso=${used} ${timestamp}"
#echo "disk,host=${host},device=${vm} fisico=${physical},capacidad=${capacity},reserva=${allocation},uso=${used} ${timestamp}" >> ${LOG}
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment