Last active
March 18, 2022 16:47
-
-
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
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
#!/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