Как вывести на график общее количество открытых файлов, сокетов, каталогов, … Используя Ubuntu, telegraf, influxdb, grafana.

Напишем скрипт, который будет преобразовывать результат вывода команды lsof (выводит типы открытых файлов) в статистику с помощью awk, и далее в формат influx_line также с помощью awk

lsof -F t | awk '{a["ALL"]++;a[$1]++}END{for(i in a){ printf "%s %s\n",a[i],i}}' | sort -nr | head -n 30 | awk '{a[$2]=$1}END{printf("system_fds_types ");for(i in a){printf "%s=%s,",i,a[i]};printf("none=0\n")}'

Пример результата:

system_fds_types f14=791,f6=963,ftxt=1480,f7=949,tFIFO=9369,tIPv4=827,f8=910,fcwd=1480,tunix=17241,f9=874,ta_inode=6410,fmem=160258,tDIR=1975,tunknown=1485,tsock=5319,f0=984,fDEL=48767,f1=984,tREG=238620,f10=849,f2=984,frtd=1480,ALL=572311,f11=831,f3=965,f12=807,f4=967,f13=791,f5=963,tCHR=3123,none=0

Теперь если создать исполняемый файл /tmp/fds.sh с текстом

#! /bin/bash

lsof -F t |                          \
awk '{   a["ALL"]++; a[$1]++ }       \
     END                             \
     {   for(i in a)                 \
         {                           \
             printf "%s %s\n",a[i],i \
         }                           \
     }' |                            \
sort -nr |                           \
head -n 30 |                         \
awk '{   a[$2]=$1   }                \
     END                             \
     {                               \
         printf("system_fds_types ");\
         for(i in a){                \
             printf "%s=%s,",i,a[i]  \
         };                          \
         printf("none=0\n")          \
     }'

А в файле конфигурации telegraf добавить секцию

[[inputs.exec]]
    commands = [
        '/tmp/fds.sh'
    ]
    timeout = "10s"
    interval = "20s"
    data_format = "influx"

То будет собираться статистика по разным типам объектов. Примеры объектов ниже:

 259501 tREG
 177321 fmem
  51518 fDEL
  19162 tunix
   9512 tFIFO
   7621 ta_inode
   5254 tsock
   3703 tCHR
   2968 tDIR
   1478 ftxt
   1478 frtd
   1478 fcwd
   1362 tIPv4
    629 tnetlink
    401 tIPv6

Расшифровку типов объектов можно посмотреть в документации к команде lsof

man lsof
``IPv4'' for an IPv4 socket;
``IPv6''  for  an  open  IPv6  network  file  - even if its address is IPv4, mapped in an IPv6 address;
``ax25'' for a Linux AX.25 socket;
``inet'' for an Internet domain socket;
``lla'' for a HP-UX link level access file;
``rte'' for an AF_ROUTE socket;
``sock'' for a socket of unknown domain;
``unix'' for a UNIX domain socket;
``x.25'' for an HP-UX x.25 socket;
``BLK'' for a block special file;
``CHR'' for a character special file;
``DEL'' for a Linux map file that has been deleted;
``DIR'' for a directory;
``DOOR'' for a VDOOR file;
``FIFO'' for a FIFO special file;
``KQUEUE'' for a BSD style kernel event queue file;
``LINK'' for a symbolic link file;
``MPB'' for a multiplexed block file;
``MPC'' for a multiplexed character file;
``NOFD'' for a Linux /proc/<PID>/fd directory that  can't  be  opened  --  the  directory  path appears in the NAME column, followed by an error message;
``PAS'' for a /proc/as file;
``PAXV'' for a /proc/auxv file;
``PCRE'' for a /proc/cred file;
``PCTL'' for a /proc control file;
``PCUR'' for the current /proc process;
``PCWD'' for a /proc current working directory;
``PDIR'' for a /proc directory;
``PETY'' for a /proc executable type (etype);
``PFD'' for a /proc file descriptor;
``PFDR'' for a /proc file descriptor directory;
``PFIL'' for an executable /proc file;
``PFPR'' for a /proc FP register set;
``PGD'' for a /proc/pagedata file;
``PGID'' for a /proc group notifier file;
``PIPE'' for pipes;
``PLC'' for a /proc/lwpctl file;
``PLDR'' for a /proc/lpw directory;
``PLDT'' for a /proc/ldt file;
``PLPI'' for a /proc/lpsinfo file;
``PLST'' for a /proc/lstatus file;
``PLU'' for a /proc/lusage file;
``PLWG'' for a /proc/gwindows file;
``PLWI'' for a /proc/lwpsinfo file;
``PLWS'' for a /proc/lwpstatus file;
``PLWU'' for a /proc/lwpusage file;
``PLWX'' for a /proc/xregs file;
``PMAP'' for a /proc map file (map);
``PMEM'' for a /proc memory image file;
``PNTF'' for a /proc process notifier file;
``POBJ'' for a /proc/object file;
``PODR'' for a /proc/object directory;
``POLP'' for an old format /proc light weight process file;
``POPF'' for an old format /proc PID file;
``POPG'' for an old format /proc page data file;
``PORT'' for a SYSV named pipe;
``PREG'' for a /proc register file;
``PRMP'' for a /proc/rmap file;
``PRTD'' for a /proc root directory;
``PSGA'' for a /proc/sigact file;
``PSIN'' for a /proc/psinfo file;
``PSTA'' for a /proc status file;
``PSXSEM'' for a POSIX semaphore file;
``PSXSHM'' for a POSIX shared memory file;
``PUSG'' for a /proc/usage file;
``PW'' for a /proc/watch file;
``PXMP'' for a /proc/xmap file;
``REG'' for a regular file;
``SMT'' for a shared memory transport file;
``STSO'' for a stream socket;
``UNNM'' for an unnamed type file;
``XNAM'' for an OpenServer Xenix special file of unknown type;
``XSEM'' for an OpenServer Xenix semaphore file;
``XSD'' for an OpenServer Xenix shared data file;

Добавляем график в Grafana

И теперь можно по графикам выявлять сколько ресурсов определённого типа используется системой в целом

Оставьте комментарий