Ad Widget

Collapse

Мониторинг размера папок

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • Teutorix
    Junior Member
    • Mar 2016
    • 10

    #1

    Мониторинг размера папок

    Доброго времени суток!
    Тема наверное баян, но найти ответов не удалось.

    Задача:
    Мониторить размер подпапок в определённой папке, причём подпапки могут добавляться и удаляться,
    желательно чтобы отрабатывало автоматом (правила обнаружения) а не руками папки обрабатывать.

    Мониторинг одной папки:
    Работает хорошо.
    zabbix агент -> ключ ->
    Code:
    system.run[powershell -noprofile -command "(Get-ChildItem -r c:\folder | Measure-Object -property length -sum | select sum).sum"]
    Мониторинг подпапок:
    Удалось создать скрипт формирования JSON.
    Code:
    $startFolder = "C:\folder"
    $items = (Get-ChildItem $startFolder | Where-Object {$_.PSIsContainer -eq $True} | Sort-Object)
    write-host -NoNewline "{"
    write-host -NoNewline "`"data`":["
    if($items -ne $null -and $items -is [system.array] -eq $false) {
        write-host -NoNewline "{"
        $line = "`"{#FOLDERNAME}`":`"" + $items.Name + "`""
        write-host -NoNewline $line
        $line = ",`"{#FOLDERSIZE}`":`"" + (Get-ChildItem -r $items.FullName | Measure-Object -property length -sum | select sum).sum + "`""
        write-host -NoNewline $line
        write-host -NoNewline "}"
    } else {
        write-host -NoNewline "{"
        $line = "`"{#FOLDERNAME}`":`"" + $items[0].Name + "`""
        write-host -NoNewline $line
        $line = ",`"{#FOLDERSIZE}`":`"" + (Get-ChildItem -r $items[0].FullName | Measure-Object -property length -sum | select sum).sum + "`""
        write-host -NoNewline $line
        write-host -NoNewline "}"
        if($items.Count -gt 1) {
            for($c = 1; $c -lt $items.Count; ++$c) {
               write-host -NoNewline ",{"
               $line = "`"{#FOLDERNAME}`":`"" + $items[$c].Name + "`""
               write-host -NoNewline $line
               $line = ",`"{#FOLDERSIZE}`":`"" + (Get-ChildItem -r $items[$c].FullName | Measure-Object -property length -sum | select sum).sum + "`""
               write-host -NoNewline $line
               write-host -NoNewline "}"
            }
        }
    }
    write-host -NoNewline "]"
    write-host "}"
    Вывод JSON (в удобно читаемом формате, скрипт выводит в одну строку):
    Code:
    {
     "data":[
      {
        "{#FOLDERNAME}":"folder_1",
        "{#FOLDERSIZE}":"10482871"
      },
      {
        "{#FOLDERNAME}":"folder_2",
        "{#FOLDERSIZE}":"3419705"
      },
      {
        "{#FOLDERNAME}":"folder_3",
        "{#FOLDERSIZE}":"30590195"
      }
     ]
    }
    В агенте добавил в конфиг пользовательский параметр:
    Code:
    UserParameter=foldersize,powershell -NoProfile -ExecutionPolicy Bypass -file "c:\zabbix\folder_size.ps1"
    Создал правило обнаружения, добавил макросы:
    {#FOLDERNAME}, {#FOLDERSIZE}
    Создал прототипы элементов данных:
    Имя: Folder - {#FOLDERNAME}
    Тип: Zabbix агент
    Ключ: foldersize[{#FOLDERSIZE}]

    В последних данных инфу вижу, но работает это не так как надо.

    Внимание вопрос!
    Как правильно создать правило обнаружения, прототипы данных и прототипы графиков чтобы имя папки бралось из {#FOLDERNAME}, а её размер из {#FOLDERSIZE}?

    Спасибо!
  • sadman
    Senior Member
    • Dec 2010
    • 1611

    #2

    Comment

    • pirate
      Junior Member
      • Sep 2015
      • 15

      #3
      У меня встречный вопрос. А зачем мониторить папки?

      Comment

      • Teutorix
        Junior Member
        • Mar 2016
        • 10

        #4
        Originally posted by pirate
        У меня встречный вопрос. А зачем мониторить папки?
        Есть некое приложение на сервере, которое во время своей работы создаёт папки и хранит в них временные файлы необходимые для работы, эти папки иногда очень сильно увеличиваются в связи с чем работа приложения замедляется или останавливается вовсе, поэтому нужно вовремя заметить рост какой-то из папок и принять необходимые меры.

        Comment

        • Teutorix
          Junior Member
          • Mar 2016
          • 10

          #5
          Нужно поправить скрипт для вывода в json только списка папок, тут всё понятно.
          Не понял на счёт скрипта возвращающего значение по идентификатору из json и как это настраивается в zabbix, буду курить мануалы, искать примеры.
          Last edited by Teutorix; 01-12-2016, 19:33.

          Comment

          • Teutorix
            Junior Member
            • Mar 2016
            • 10

            #6
            Прошу привести примеры скриптов, если есть возможность, на powershell или на другом скриптовом языке, по которым можно понять принцип возврата значения по идентификатору.

            Comment

            • sadman
              Senior Member
              • Dec 2010
              • 1611

              #7
              Originally posted by teutorix
              Прошу привести примеры скриптов, если есть возможность, на powershell или на другом скриптовом языке, по которым можно понять принцип возврата значения по идентификатору.
              Товарищи, вы вообще думать разучились что ли?

              У вас уже есть "Мониторинг одной папки: Работает хорошо". Уже "Создал правило обнаружения, добавил макросы:{#foldername}". Какая проблема в том, чтобы первое соединить со вторым?

              Comment

              • Teutorix
                Junior Member
                • Mar 2016
                • 10

                #8
                Разделил на два скрипта:

                folder_discovery.ps1
                Code:
                $startFolder = "c:\folder"
                $items = (Get-ChildItem $startFolder | Where-Object {$_.PSIsContainer -eq $True} | Sort-Object)
                write-host -NoNewline "{"
                write-host -NoNewline "`"data`":["
                if($items -ne $null -and $items -is [system.array] -eq $false) {
                    write-host -NoNewline "{"
                    $line = "`"{#FOLDERNAME}`":`"" + $items.Name + "`""
                    write-host -NoNewline $line
                    $line = ",`"{#FOLDERFULLNAME}`":`"" + $items.FullName + "`""
                    write-host -NoNewline $line
                    write-host -NoNewline "}"
                } else {
                    write-host -NoNewline "{"
                    $line = "`"{#FOLDERNAME}`":`"" + $items[0].Name + "`""
                    write-host -NoNewline $line
                    $line = ",`"{#FOLDERFULLNAME}`":`"" + $items[0].FullName + "`""
                    write-host -NoNewline $line
                    write-host -NoNewline "}"
                    if($items.Count -gt 1) {
                        for($c = 1; $c -lt $items.Count; ++$c) {
                           write-host -NoNewline ",{"
                           $line = "`"{#FOLDERNAME}`":`"" + $items[$c].Name + "`""
                           write-host -NoNewline $line
                           $line = ",`"{#FOLDERFULLNAME}`":`"" + $items[$c].FullName + "`""
                           write-host -NoNewline $line
                           write-host -NoNewline "}"
                        }
                    }
                }
                write-host -NoNewline "]"
                write-host "}"
                folder_size_get.ps1
                Code:
                param ($1)
                (Get-ChildItem -r $1 | Measure-Object -property length -sum | select sum).sum
                Параметры в zabbix_agentd.conf
                Code:
                UserParameter=foldername,powershell -NoProfile -ExecutionPolicy Bypass -file "c:\zabbix\folder_discovery.ps1"
                UserParameter=foldersize[*],powershell -NoProfile -ExecutionPolicy Bypass -file "c:\zabbix\folder_size_get.ps1" $1
                На стороне сервера (Ubuntu, Zabbix 3.0.1) установил zabbix_get
                Code:
                wget http://repo.zabbix.com/zabbix/3.0/ubuntu/pool/main/z/zabbix/zabbix-get_3.0.1-1+trusty_i386.deb
                dpkg -i zabbix-get_3.0.1-1+trusty_i386.deb
                apt-get update
                zabbix_get -s server -k foldersize["C:\folder\folder_1"]
                Code:
                ZBX_NOTSUPPORTED: special characters "\, ', ", `, *, ?, [, ], {, }, ~, $, !, &, ;, (, ), <, >, |, #, @, 0x0a" are not allowed in the parameters
                Решение:
                На стороне агента добавить в zabbix_agentd.conf - UnsafeUserParameters=1

                zabbix_get -s server -k foldersize["C:\folder\folder_1"]
                10482871

                zabbix_get -s server -k foldername
                Code:
                {"data":[{"{#FOLDERNAME}":"folder_1","{#FOLDERFULLNAME}":"C:\folder\folder_1"},{"{#FOLDERNAME}":"folder_2","{#FOLDERFULLNAME}":"C:\folder\folder_2"},{"{#FOLDERNAME}":"folder_3","{#FOLDERFULLNAME}":"C:\folder\folder_3"}]}
                Работает если в zabbix создать элемент данных foldersize[C:\folder\folder_1]

                Настройки в zabbix:

                Правило обнаружения:
                Code:
                Имя: Folder
                Тип: Zabbix агент
                Ключ: foldername
                интервал: 60
                Прототипы элементов данных:
                Code:
                Имя: {#FOLDERNAME}
                Тип: Zabbix агент
                Ключ: foldersize[{#FOLDERFULLNAME}]
                Тип информации: Числовой (целое положительное)
                Тип данных: Десятичный
                Результат:
                Мониторинг -> Последние данные:
                Code:
                folder_1
                foldersize[C:olderolder_1]
                folder_2
                foldersize[C:olderolder_2]
                folder_3
                foldersize[C:olderolder_3]
                при подстановке экранируется "\f"

                Comment

                • sadman
                  Senior Member
                  • Dec 2010
                  • 1611

                  #9
                  Originally posted by Teutorix
                  Code:
                  UserParameter=foldersize[*],powershell -NoProfile -ExecutionPolicy Bypass -file "c:\zabbix\folder_size_get.ps1" $1
                  Советую все параметры, передаваемые скрипту, заключать в двойные кавычки. Иначе, если попадется путь с пробелом - будете удивляться.

                  Результат:
                  Мониторинг -> Последние данные:
                  Code:
                  folder_1
                  foldersize[C:olderolder_1]
                  folder_2
                  foldersize[C:olderolder_2]
                  folder_3
                  foldersize[C:olderolder_3]
                  при подстановке экранируется "\f"
                  Как раз - не экранируется. При передаче в заббикс имени каталога нужно из '\' делать '\\'
                  Я это проворачиваю примерно так:

                  Code:
                        $EscapedSymbols = @('\', '"');
                  
                        ForEach ($Symbol in $EscapedSymbols) { 
                                 $Object = $Object.Replace($Symbol, "\$Symbol");
                         }
                  Где $Object, в сущности, строка.

                  Comment

                  • Teutorix
                    Junior Member
                    • Mar 2016
                    • 10

                    #10
                    Нахождение подстроки и замена на свою (powershell):
                    $line = $line.replace("\","\\")

                    Code:
                    $startFolder = "c:\folder"
                    $items = (Get-ChildItem $startFolder | Where-Object {$_.PSIsContainer -eq $True} | Sort-Object)
                    write-host -NoNewline "{"
                    write-host -NoNewline "`"data`":["
                    if($items -ne $null -and $items -is [system.array] -eq $false) {
                        write-host -NoNewline "{"
                        $line = "`"{#FOLDERNAME}`":`"" + $items.Name + "`""
                        write-host -NoNewline $line
                        $line = ",`"{#FOLDERFULLNAME}`":`"" + $items.FullName + "`""
                        $line = $line.replace("\","\\")
                        write-host -NoNewline $line
                        write-host -NoNewline "}"
                    } else {
                        write-host -NoNewline "{"
                        $line = "`"{#FOLDERNAME}`":`"" + $items[0].Name + "`""
                        write-host -NoNewline $line
                        $line = ",`"{#FOLDERFULLNAME}`":`"" + $items[0].FullName + "`""
                        $line = $line.replace("\","\\")
                        write-host -NoNewline $line
                        write-host -NoNewline "}"
                        if($items.Count -gt 1) {
                            for($c = 1; $c -lt $items.Count; ++$c) {
                               write-host -NoNewline ",{"
                               $line = "`"{#FOLDERNAME}`":`"" + $items[$c].Name + "`""
                               write-host -NoNewline $line
                               $line = ",`"{#FOLDERFULLNAME}`":`"" + $items[$c].FullName + "`""
                               $line = $line.replace("\","\\")
                               write-host -NoNewline $line
                               write-host -NoNewline "}"
                            }
                        }
                    }
                    write-host -NoNewline "]"
                    write-host "}"
                    Code:
                    {"data":[{"{#FOLDERNAME}":"folder_1","{#FOLDERFULLNAME}":"C:\\folder\\folder_1"},{"{#FOLDERNAME}":"folder_2","{#FOLDERFULLNAME}":"C:\\folder\\folder_2"},{"{#FOLDERNAME}":"folder_3","{#FOLDERFULLNAME}":"C:\\folder\\folder_3"}]}
                    Работает!

                    Теперь нужно понять как сделать так чтобы быстрее пропадали неактуальные обнаруженные каталоги (мониторинг -> последние данные)
                    В правиле обнаружения есть параметр "Период сохранения потерянных ресурсов (дней)" получается что чаще чем раз в день настроить не удастся.

                    Comment

                    • Teutorix
                      Junior Member
                      • Mar 2016
                      • 10

                      #11
                      Возникает вопрос в выводе графиков из прототипов, как я понял, нет возможности добавлять прототипы графиков в комплексные экраны, получается что необходимо копать api для решения этой задачи.

                      Comment

                      • sadman
                        Senior Member
                        • Dec 2010
                        • 1611

                        #12
                        Originally posted by Teutorix
                        Возникает вопрос в выводе графиков из прототипов, как я понял, нет возможности добавлять прототипы графиков в комплексные экраны, получается что необходимо копать api для решения этой задачи.
                        Разве нет? У меня, в 2.4 есть. "Graph prototype" и "Simple graph prototype".
                        А вот на общий график положить прототипы действительно в стоковой поставке нельзя.

                        "Период сохранения потерянных ресурсов (дней)" может принимать значение 0.
                        Last edited by sadman; 08-12-2016, 09:29.

                        Comment

                        • Teutorix
                          Junior Member
                          • Mar 2016
                          • 10

                          #13
                          Прототипы графиков отлично добавляются в комплексные экраны, сомнения были напрасны.

                          Создал шаблон в который занёс список обнаружения, добавил прототип элементов данных и на основе этих данных создал прототип графиков.
                          Данный шаблон подключил к узлу сети (серверу) который нужно мониторить.
                          Затем добавил прототип графиков в комплексные экраны.

                          Настройка комплексного экрана:
                          Ресурс: Прототип графиков
                          Прототип графиков: выбрать сервер с шаблоном -> необходимый прототип, в моём случае - server: {#FOLDERNAME}

                          При открытии комплексного экрана, выводятся все графики размеров необходимых мне подпапок, что и было нужно.

                          Спасибо sadman за советы!

                          Comment

                          Working...