Ad Widget

Collapse

Получить данные с csv

Collapse
This topic has been answered.
X
X
 
  • Time
  • Show
Clear All
new posts
  • RK3DNP
    Junior Member
    • Mar 2021
    • 13

    #1

    Получить данные с csv

    Привет, подскажите пожалуйста, есть csv файл с данными баз Exchange, когда был последний бекап, надо эти данные добавить в заббикс.

    Вот пример csv
    "Database";"LastFullBackup";"LastIncrementalBa ckup "
    "base-002";"6/26/2024 5:11:38 AM";
    "base-001";"6/26/2024 5:11:38 AM";
    "base-003";"6/25/2024 11:11:44 PM";

    Создал в discovery list обнаружение
    type - zabbix
    key - vfs.file.contents[C:\Temp\Backups.csv]

    Preprocessing - CSV to JSON ; "

    LLD macros
    {#DATABASE} - $.Database
    {#LASTFULLBACKUP} - $.LastFullBackup
    {#LASTINCREMENTALBACKUP} - $.LastIncrementalBackup

    Теперь надо создать Item Prototype, но не могу понять какой выбирать type и key если надо к примеру выводить:
    Полный бекап {#DATABASE} от {#LASTFULLBACKUP}
    Инкрементный бекап {#DATABASE} от {#LASTINCREMENTALBACKUP}

    Тест обнаружение выводит следующее:
    [{""Database"":""base-002"",""LastFullBackup"":""6/26/2024 5:11:38 AM"",""LastIncrementalBackup"":""},{""Database"":" "base-001"",""LastFullBackup"":""6/26/2024 5:11:38 AM"",""LastIncrementalBackup"":""},{""Database"":" "base-003"",""LastFullBackup"":""6/25/2024 11:11:44 PM"",""LastIncrementalBackup"":""} и т.д.

  • Answer selected by RK3DNP at 27-06-2024, 12:06.
    Kos
    Senior Member
    Zabbix Certified SpecialistZabbix Certified Professional
    • Aug 2015
    • 3404

    Я бы делал следующим образом.

    Во-первых, засунул бы то, что у вас сейчас в правиле обнаружения (элемент данных с его ключом и шагом предобработки "CSV to JSON") в обычный элемент данных, в котором на выходе имел бы тот JSON, что у вас сейчас отображает тест.

    Во-вторых, правило обнаружения сделал бы зависимым элементом данных от сделанного в предыдущем пункте. В шаги предобработки добавил бы краткий JavaScript:
    Code:
    //return only needed static properties
    return JSON.stringify(JSON.parse(value),['Database']);
    Цель: оставить в JSON-е только статические поля (т.е. список баз данных), тогда вторым шагом предобработки можно добавить тротлинг (чтобы не гонять LLD, если этот список не изменился).
    Соответственно, в настройках LLD из макросов оставить только первый (поскольку только он и будет оставаться в JSON-е).

    В-третьих, прототипы тоже сделать зависимыми элементами данных, в качестве мастера указать тот же исходный элемент данных, на который ссылается и правило LLD (т.е. сделанный на первом шаге). А в предобработку добавить шаг JSONPath, с помощью которого для каждого сгенерированного из прототипа элемента данных будет извлекаться именно его значение, например, для даты последнего полного бэкапа:
    Code:
    $[?(@.Database == "{#DATABASE}")].LastFullBackup
    Тут, правда (независимо от моих соображений, изложенных выше), есть ещё пара моментов:
    • не для всех баз (по крайней мере, в вашем примере) заполнены все поля (скажем, поле LastIncrementalBackup - пустое);
    • формат, в котором записан таймстэмп, неудобен для обработки (не подходит для написания триггера). Если триггеров не нужно, а делается это только для красивой картинки (вывести значения куда-нибудь на дашборд), то сойдёт. Если же надо преобразовать, например, в unixtime, то придётся делать ещё предобработку для этих прототипов, где из этого формата парсить с помощью JavaScript-кода.
    Last edited by Kos; 27-06-2024, 16:38.

    Comment

    • Kos
      Senior Member
      Zabbix Certified SpecialistZabbix Certified Professional
      • Aug 2015
      • 3404

      #2
      Я бы делал следующим образом.

      Во-первых, засунул бы то, что у вас сейчас в правиле обнаружения (элемент данных с его ключом и шагом предобработки "CSV to JSON") в обычный элемент данных, в котором на выходе имел бы тот JSON, что у вас сейчас отображает тест.

      Во-вторых, правило обнаружения сделал бы зависимым элементом данных от сделанного в предыдущем пункте. В шаги предобработки добавил бы краткий JavaScript:
      Code:
      //return only needed static properties
      return JSON.stringify(JSON.parse(value),['Database']);
      Цель: оставить в JSON-е только статические поля (т.е. список баз данных), тогда вторым шагом предобработки можно добавить тротлинг (чтобы не гонять LLD, если этот список не изменился).
      Соответственно, в настройках LLD из макросов оставить только первый (поскольку только он и будет оставаться в JSON-е).

      В-третьих, прототипы тоже сделать зависимыми элементами данных, в качестве мастера указать тот же исходный элемент данных, на который ссылается и правило LLD (т.е. сделанный на первом шаге). А в предобработку добавить шаг JSONPath, с помощью которого для каждого сгенерированного из прототипа элемента данных будет извлекаться именно его значение, например, для даты последнего полного бэкапа:
      Code:
      $[?(@.Database == "{#DATABASE}")].LastFullBackup
      Тут, правда (независимо от моих соображений, изложенных выше), есть ещё пара моментов:
      • не для всех баз (по крайней мере, в вашем примере) заполнены все поля (скажем, поле LastIncrementalBackup - пустое);
      • формат, в котором записан таймстэмп, неудобен для обработки (не подходит для написания триггера). Если триггеров не нужно, а делается это только для красивой картинки (вывести значения куда-нибудь на дашборд), то сойдёт. Если же надо преобразовать, например, в unixtime, то придётся делать ещё предобработку для этих прототипов, где из этого формата парсить с помощью JavaScript-кода.
      Last edited by Kos; 27-06-2024, 16:38.

      Comment

      • Hamardaban
        Senior Member
        Zabbix Certified SpecialistZabbix Certified Professional
        • May 2019
        • 2713

        #3
        Насколько понял вашу задачку - у вас по каждой базе есть 2 метрики: датавремя_полного_бэкапа и датавремя_инкрементного_бэкапа.
        Ваш LLD должен находить список баз (макрос обнаружения {#DATABASE}) и для каждой базы делать 2 элемента данных из прототипов.
        Итого - прототипа 2 шт:
        "Дата полного бекап {#DATABASE}" и "Дата инкрементного бекап {#DATABASE}"

        зы
        пока пИсал коллега kos изложил всё более обстоятельно и правильно по поводу зависимых и мастер элементов
        а также нюансов обработки датвремен
        но суть не меняется​
        Last edited by Hamardaban; 26-06-2024, 18:06.

        Comment

        • RK3DNP
          Junior Member
          • Mar 2021
          • 13

          #4
          Триггеры да, нужны будут. Хотел изначально прям агентом через powershell забирать, но столкнулся с проблемой по таймауту, не завершается скрипт.
          да, не везде делается инкрементный бекап.

          Comment

          • RK3DNP
            Junior Member
            • Mar 2021
            • 13

            #5
            Originally posted by Kos
            Я бы делал следующим образом.

            Во-первых, засунул бы то, что у вас сейчас в правиле обнаружения (элемент данных с его ключом и шагом предобработки "CSV to JSON") в обычный элемент данных, в котором на выходе имел бы тот JSON, что у вас сейчас отображает тест.

            Во-вторых, правило обнаружения сделал бы зависимым элементом данных от сделанного в предыдущем пункте. В шаги предобработки добавил бы краткий JavaScript:
            Code:
            //return only needed static properties
            return JSON.stringify(JSON.parse(value),['Database']);
            Цель: оставить в JSON-е только статические поля (т.е. список баз данных), тогда вторым шагом предобработки можно добавить тротлинг (чтобы не гонять LLD, если этот список не изменился).
            Соответственно, в настройках LLD из макросов оставить только первый (поскольку только он и будет оставаться в JSON-е).

            В-третьих, прототипы тоже сделать зависимыми элементами данных, в качестве мастера указать тот же исходный элемент данных, на который ссылается и правило LLD (т.е. сделанный на первом шаге). А в предобработку добавить шаг JSONPath, с помощью которого для каждого сгенерированного из прототипа элемента данных будет извлекаться именно его значение, например, для даты последнего полного бэкапа:
            Code:
            $[?($.Database == "{#DATABASE}")].LastFullBackup
            Тут, правда (независимо от моих соображений, изложенных выше), есть ещё пара моментов:
            • не для всех баз (по крайней мере, в вашем примере) заполнены все поля (скажем, поле LastIncrementalBackup - пустое);
            • формат, в котором записан таймстэмп, неудобен для обработки (не подходит для написания триггера). Если триггеров не нужно, а делается это только для красивой картинки (вывести значения куда-нибудь на дашборд), то сойдёт. Если же надо преобразовать, например, в unixtime, то придётся делать ещё предобработку для этих прототипов, где из этого формата парсить с помощью JavaScript-кода.
            1 пункт понятен
            2. Создаю правило обнаружение, где тип зависимость, указывать item из 1ого пункты.
            В процессинг пишу java script который дали
            LLD macros {#DATABASE} - $.Database
            KEY- написал test.123, правильно?

            3. Теперь создаю зависимы item
            Имя Base {#DATABASE}
            Тип зависимый item из 1 пункта
            В процессенге добавляю JSONPath
            А тут какой KEY писать?

            Comment

            • Kos
              Senior Member
              Zabbix Certified SpecialistZabbix Certified Professional
              • Aug 2015
              • 3404

              #6
              Originally posted by RK3DNP
              2. Создаю правило обнаружение, где тип зависимость, указывать item из 1ого пункты.
              [...]
              KEY- написал test.123, правильно?

              3. Теперь создаю зависимы item
              [...]
              А тут какой KEY писать?
              Да, всё верно.
              Key - по вашему выбору. Разве что, ключ прототипа должен содержать LLD-макрос, чтобы для каждого генерируемого из этого прототипа реального элемента данных ключ был бы уникальным. А имена ключей правил LLD принято заканчивать словом ".discovery".

              Поэтому можно сделать, например,так:
              для п.2: db.backup.discovery
              для п.3: для двух прототипов (как указал коллега Hamardaban): db.backup.full[{#DATABASE}] и db.backup.incremental[{#DATABASE}]

              Comment

              • RK3DNP
                Junior Member
                • Mar 2021
                • 13

                #7
                Originally posted by Kos
                Да, всё верно.
                Key - по вашему выбору. Разве что, ключ прототипа должен содержать LLD-макрос, чтобы для каждого генерируемого из этого прототипа реального элемента данных ключ был бы уникальным. А имена ключей правил LLD принято заканчивать словом ".discovery".

                Поэтому можно сделать, например,так:
                для п.2: db.backup.discovery
                для п.3: для двух прототипов (как указал коллега Hamardaban): db.backup.full[{#DATABASE}] и db.backup.incremental[{#DATABASE}]
                Ошибка при создание зависимого item
                Cannot create item: item with the same key "db.backup.full[{#DATABASE}]" already exists.
                Cannot create item: item with the same key "db.backup.full[{#DATABASE}]" already exists.
                Cannot create item: item with the same key "db.backup.full[{#DATABASE}]" already exists.

                Это не может быть ошибка в jsonpath, так как код у меня такой получается
                [
                {
                "Database":"base-001",
                "LastFullBackup":"6/21/2024 5:11:07 PM",
                "LastIncrementalBackup":"6/25/2024 5:11:09 PM"

                }
                {
                "Database":"base-002",
                "LastFullBackup":"6/21/2024 5:11:07 PM",
                "LastIncrementalBackup":"6/25/2024 5:11:09 PM"

                }
                ]

                Во вложении файл с ошибкой при тесте.
                Attached Files
                Last edited by RK3DNP; 27-06-2024, 10:48.

                Comment

                • RK3DNP
                  Junior Member
                  • Mar 2021
                  • 13

                  #8
                  Все получилось, спасибо.
                  Проблема была
                  1. Это из-за двойных скобок (в csv были и после преобразования добавлялись)
                  2. Заменил $ на @ в строке: $[?(@.Database == "{#DATABASE}")].LastFullBackup

                  Comment


                  • Kos
                    Kos commented
                    Editing a comment
                    Блин, да что ж такое - опять не могу набрать нормально, где-то опечатываюсь... Спасибо, поправил в исходном сообщении.
                Working...