Ad Widget

Collapse

LLD на JS

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • Victor Sklyarov
    Senior Member
    • Apr 2016
    • 184

    #1

    LLD на JS

    Задача обнаружить диски базы, диск бэкап, диск резервного бэкап, системный диск. Априори диск с БД находится на D:, системный на C: элементы данных для них должны создаваться только когда на них не расположен бэкап.
    1. Само обнаружение - читаю в цикле все директории на всех дисках, затем через JS создаю макросы {#BACKUP_DISK}, {#BACKUP_REZ_DISK}, {#DB_DISK}, {#SYSTEM_DISK} По вышеописанной логике они могут создаваться не все.
    2. Создаю 5 прототипов c этими макросами
    3. На тестовом узле получаю ответ при обнаружении [{"{#BACKUP_DISK}":"D:","{#SYSTEM_DISK}":"C:"}]
    4. Элементы данных связанные с этими макросами успешно создаются
    5 Одновременно получаю ошибку:
    Cannot create item: item with the same key "vfs.fs.size[{#BACKUP_REZ_DISK},free]" already exists.
    Cannot create item: item with the same key "vfs.fs.size[{#DB_DISK},free]" already exists.
    Элементов с такими ключами не создаётся да и не может быть создано из просто нет в JSON. Однако почему обнаружение их пытается создать с пустым именем диска?​
  • Semiadmin
    Senior Member
    • Oct 2014
    • 1625

    #2
    Может, изменить логику - для каждого найденного диска заполнять LLD макрос с его ролью, и писать в него BACKUP_DISK, SYSTEM_DISK etc? Тогда набор макросов у всех дисков будет одинаков, и можно оверрайдами создавать или не создавать те или иные айтемы и триггеры для разных ролей.

    Comment

    • Victor Sklyarov
      Senior Member
      • Apr 2016
      • 184

      #3
      Правильно ли я понимаю, что нужно что-то типа типа этого:
      [
      {"{#DISK}":"C:","{#DISK.FUNC}":"SYSTEM_DISK"},
      {"{#DISK}":"D:","{#DISK.FUNC}":"DB_DISK"},
      {"{#DISK}":"E:","{#DISK.FUNC}":"BACKUP_DISK"},
      {"{#DISK}":"F:","{#DISK.FUNC}":"BACKUP_REZ_DISK "}
      ]
      Что в оверрайдах писать, пока не понимаю.
      Почему не удаётся отсеять создание айтемов просто фильтрами?
      {#BACKUP_DISK} ==существует ИЛИ {#BACKUP_REZ_DISK} ==существует ИЛИ {#SYSTEM_DISK}==существует ИЛИ {#DB_DISK} ==существует

      Comment

      • Victor Sklyarov
        Senior Member
        • Apr 2016
        • 184

        #4
        Может быть и так
        [
        {"{#DISK}":"C:","{#DISK.FUNC}":"SYSTEM_DISK"},
        {"{#DISK}":"С:","{#DISK.FUNC}":"DB_DISK"},
        {"{#DISK}":"D:","{#DISK.FUNC}":"BACKUP_DISK"},
        {"{#DISK}":"D:","{#DISK.FUNC}":"BACKUP_REZ_DISK "}
        ]
        Тогда нужно создавать только один элемент для диска Допустим DB_DISK и BACKUP_DISK Для них более жёсткие требования. Как это сделать?

        Comment

        • Semiadmin
          Senior Member
          • Oct 2014
          • 1625

          #5
          Originally posted by Victor Sklyarov
          П
          [
          {"{#DISK}":"C:","{#DISK.FUNC}":"SYSTEM_DISK"},
          {"{#DISK}":"D:","{#DISK.FUNC}":"DB_DISK"},
          {"{#DISK}":"E:","{#DISK.FUNC}":"BACKUP_DISK"},
          {"{#DISK}":"F:","{#DISK.FUNC}":"BACKUP_REZ_DISK "}
          ]
          Правильный вариант, как мне кажется, этот. Или у одного диска могут быть 2 роли? Но на этот случай я бы просто сделал отдельное значение, вроде SYSTEM_AND_DB_DISK.
          Не думаю, что возможно много сочетаний. Что касается фильтров, то они предназначены для полной фильтрации найденных сущностей, а вот создавать те или иные айтемы/тригеры, а точнее - не создавать, а ставить или снимать галку Discovered у прототипов - это оверрайдами
          Last edited by Semiadmin; 19-03-2024, 10:43.

          Comment

          • Victor Sklyarov
            Senior Member
            • Apr 2016
            • 184

            #6
            Могу ли я сделать так - всегда выдавать все 4 макроса [{"{#BACKUP_DISK}":"D:","{#SYSTEM_DISK}":"C:","{ #DB _DISK}":"D:","{#BACKUP_REZ_DISK}":"Z:"}]
            Затем в замещении написать, например, если {#DB_DISK} равен D: (буква диска совпадает с {#BACKUP_DISK}) прекратить создание item для DB_DISK?
            Аналогично и для других комбинаций.
            Last edited by Victor Sklyarov; 19-03-2024, 13:29.

            Comment

            • Victor Sklyarov
              Senior Member
              • Apr 2016
              • 184

              #7
              К сожалению не работает. Cannot create item: item with the same key "vfs.fs.size[D:,free]" already exists.
              Т.е. несмотря на то, что есть условие если {#BACKUP_DISK} == 'D:' прекратить создание айтема с макросом {#DB _DISK} это игнорируется.

              Comment

              • Alex_UUU
                Senior Member
                • Dec 2018
                • 541

                #8
                Виктор, ты немного не понимаешь механизм создания прототипов.
                Дискаверинг выдает массив. Иногда прикорльнее даже с форматом CSV работать.
                Далее заббикс пробегает про строкам и для каждой строки получает макросы - столбцы.
                Создаваемые из прототипов элементы данных должны отличаться.
                Прекратить создание ЭД нельзя. Можно что-то изменить на уровне получения основного дискаверинга.

                Перечитал несколько раз условие задачи и запутался. Если ты таблицу создаешь сам, то создавай только то, что надо.
                Если метрика для всех дисков одинаковая, то и создавай один ЭД. А роль диска в название выводится элементарно.
                Да, если использовать для метрики не стандартную метрику, а свою, то уникальные ключи делаются через параметры ключа.

                Comment

                • Victor Sklyarov
                  Senior Member
                  • Apr 2016
                  • 184

                  #9
                  Да, по видимому я не понимаю что-то. Задача следующая диск базы данных { #DB _DISK} и бэкапа {#BACKUP_DISK} может быть один или два разных. Я создал прототипы айтемов для каждого макроса. Когда диски разные, всё ОК. Когда диск один, я не хочу создавать айтем для диска базы, только для бэкапа. У айтема бэкапа совсем другие триггеры, чем у базы. Макросы я формирую скриптом и естественно могу формировать только нужные мне. Но если я не отдаю в обработку макроса { #DB _DISK}, возникает ошибка создания айтема для диска базы.
                  Cannot create item: item with the same key "vfs.fs.size[{#DB_DISK},free]" already exists.
                  Cannot evaluate expression: "Cannot accurately apply filter: no value received for macro "{#DB_DISK}".
                  Если отдаю оба макроса, опять ошибка. Т.е. запретить создание айтема по условию нельзя.
                  В общем такая простенькая задача при всех наворотах не решается.
                  Наверно можно решить эту задачу через алиасы, но поскольку объектов более 2000, этот путь слишком затратный, да и н использую я пользовательские параметры.

                  Comment

                  • Alex_UUU
                    Senior Member
                    • Dec 2018
                    • 541

                    #10
                    Так.
                    Дискаверинг может создать только перечисленные прототипы айтем и триггеров. Все.
                    Если айтем различаются только в содержимом и они свои, то нужные параметры можно загнать ... в макрос :-)
                    Т.е. получаем таблу
                    Name DB BACK
                    C Ok
                    D Ok
                    E Ok Ok
                    Нам на моменте дискаверинга, или преобработки получить
                    Name DB BACK ITEM
                    C Ok rm C:/
                    D Ok check D:/
                    E Ok Ok mail_for_null;check D:/
                    И создаем прототипы итемов с такими ключами:
                    my.key[{#ITEM}]

                    Comment

                    Working...