Обнаружение смонтированных файловых систем

Обзор

Можно обнаруживать смонтированные файловые системы и их свойства:

  • имя точки монтирования
  • тип файловой системы
  • размер файловой системы
  • статистика inode
  • параметры монтирования

Для этого можно использовать комбинацию из:

  • vfs.fs.get элемента данных агента в качестве основного элемента данных
  • зависимого правила низкоуровневого обнаружения и прототипов элементов данных

Статистика файловой системы возвращается только в том случае, если пользователь агента Zabbix имеет право прохода по каждому каталогу в пути точки монтирования; в противном случае соответствующая файловая система не включается в вывод vfs.fs.get.

Настройка

Основной элемент данных

Создайте элемент данных агента Zabbix, используя следующий ключ:

vfs.fs.get

Установите тип информации в значение "Text" для потенциально больших JSON-данных.

Данные, возвращаемые этим элементом данных, будут содержать примерно следующее для смонтированной файловой системы:

[
  {
    "fsname": "/",
    "fstype": "ext4",
    "bytes": {
      "total": 249405239296,
      "free": 24069537792,
      "used": 212595294208,
      "pfree": 10.170306,
      "pused": 89.829694
    },
    "inodes": {
      "total": 15532032,
      "free": 12656665,
      "used": 2875367,
      "pfree": 81.487503,
      "pused": 18.512497
    },
    "options": "rw,noatime,errors=remount-ro"
  }
]
Зависимое правило LLD

Создайте правило обнаружения на низком уровне типа Зависимый элемент данных:

В качестве мастер-элемента данных выберите элемент vfs.fs.get, который мы создали.

На вкладке LLD macros задайте пользовательские макросы с соответствующим JSONPath:

На вкладке Filters можно добавить регулярное выражение, которое будет отфильтровывать только файловые системы read-write:

Прототип зависимого элемента данных

Создайте прототип элемента данных с типом "Dependent item" в этом правиле LLD. В качестве мастер-элемента для этого прототипа выберите элемент vfs.fs.get, который мы создали.

Обратите внимание на использование пользовательских макросов в имени и ключе прототипа элемента данных:

  • Name: Free disk space on {#FSNAME}, type: {#FSTYPE}
  • Key: Free[{#FSNAME}]

В качестве типа информации используйте:

  • Numeric (unsigned) для метрик вроде 'free', 'total', 'used'
  • Numeric (float) для метрик вроде 'pfree', 'pused' (percentage)

На вкладке Preprocessing прототипа элемента данных выберите JSONPath и используйте следующее выражение JSONPath в качестве параметра:

$.[?(@.fsname=='{#FSNAME}')].bytes.free.first()

Когда обнаружение начнется, для каждой точки монтирования будет создан один элемент данных. Этот элемент данных будет возвращать количество свободных байтов для указанной точки монтирования.

Discovery in the short mode

As an alternative to a dependent discovery rule, you may create a discovery rule of the Zabbix agent type with the key:

vfs.fs.get[short]

In the short mode, the item returns the list of mounted filesystems without disk space and inode statistics, for example:

[
  {
    "fsname": "/",
    "fstype": "ext4",
    "options": "rw,noatime,errors=remount-ro"
  },
  {
    "fsname": "/home",
    "fstype": "xfs",
    "options": "rw,relatime,attr2,inode64,noquota"
  }
]

As the agent does not query the filesystems themselves, discovery does not trigger automounting and is not delayed by unresponsive network filesystems. It can also run less often than data collection, for example, once per hour.

In the LLD macros tab, define custom macros with the corresponding JSONPath, for example, {#FSNAME} - $.fsname and {#FSTYPE} - $.fstype.

Then create an item prototype of the Zabbix agent type that returns the statistics of one discovered filesystem:

  • Key: vfs.fs.get[full,{#FSNAME}]
  • Type of information: Text
  • Preprocessing: JSONPath $[0]

Use this item prototype as the master item for dependent item prototypes, for example, with the JSONPath $.bytes.free to get the number of free bytes.

If the agent cannot obtain statistics for a discovered filesystem (for example, because of missing permissions), vfs.fs.get[full,{#FSNAME}] returns an empty array, the $[0] preprocessing step fails, and the item becomes unsupported, so the problem is visible instead of the filesystem being silently skipped. Note that this configuration performs a separate agent check for each discovered filesystem.

This approach is used by the OS templates shipped with Zabbix and requires Zabbix agent 8.0 or later.