Коллеги, всех приветствую. Сегодня я бы хотел немного поделиться информацией и рассказать о том, как осуществлять мониторинг за репозиториями в Artifactory используя Zabbix. В статье вы сможете найти готовый шаблон для импорта в Zabbix и быстро начать следить за состоянием ваших репозиториев Artifactory.

Перед тем как мы начнем, хочу сразу сказать, что речь пойдет про базовый мониторинг. В него войдут следующие метрики:

  • Доступность Artifactory API
  • Количество файлов в репозитории
  • Размер всех файлов в репозитории
  • Процент занимаемого места (напр. при наличии квот на занимаемое место артифактами)

Сценарии использования

Причиной постановки на мониторинг может стать желание или необходимость контроля за доступностью сервера Artifactory и за репозиторями, которые хостятся на нем, а также своевременное уведомление в случае появления проблем. Это может быть интересно как администраторам которые занимаются обслуживанием инфраструктуры Artifactory, так и клиентам, кто пользуется репозиториями для решения своих рабочих задач.

Как происходит взаимодействие между Zabbix и Artifactory

После импорта шаблона Zabbix начинает взаимодействовать с сервером Artifactory через REST API при помощи типа проверки HTTP agent. Проверки выполняются с Zabbix сервера/прокси.
Документация Artifactory REST API доступна здесь — https://www.jfrog.com/confluence/display/JFROG/Artifactory+REST+API

Предварительные требования

Для корректного выполнения запросов в Artifactory REST API требуется:

  • Созданные репозитории в Artifactory
  • Созданная учетная запись с правами чтения в репозиториях
  • Созданный API ключ в настройках учетной записи (передается в HTTP заголовке X-JFrog-Art-Api для аутентификации)

Шаблон для импорта

Нижеуказанный шаблон формировался для Zabbix версии 5.4 и 6.0. Для импорта скопируйте шаблон в .yaml файл и загрузите его в Zabbix.

zabbix_export:
  version: '5.4'
  date: '2022-06-10T19:19:11Z'
  groups:
    -
      uuid: 415ba761a2cc482e8e1bc22e6da84833
      name: 'Artifactory Servers'
  templates:
    -
      uuid: 6af6da58d26444eba07652a2d8ca17da
      template: 'Artifactory Template'
      name: 'Artifactory Template'
      description: |
        Zabbix шаблон для базового мониторинга Artifactory API.
        Документация Artifactory API - https://www.jfrog.com/confluence/display/JFROG/Artifactory+REST+API
      groups:
        -
          name: 'Artifactory Servers'
      items:
        -
          uuid: aab31802196146c8b56ef813a0379526
          name: 'Проверка работы Artifactory API'
          type: HTTP_AGENT
          key: artifactory_health_check
          trends: '0'
          value_type: TEXT
          timeout: 30s
          url: '{$SCHEME}{HOST.NAME}{$PORT}/artifactory/api/system/ping'
          status_codes: ''
          triggers:
            -
              uuid: 520827356eee4136b4f4c7d962e7f785
              expression: 'nodata(/Artifactory Template/artifactory_health_check,1m)=1'
              name: 'Artifactory API недоступен (нет ответов)'
              priority: AVERAGE
            -
              uuid: c98253db2dad43f9bcec57f128555ab9
              expression: 'find(/Artifactory Template/artifactory_health_check,#1,"ne","OK")'
              name: 'Проверка Atrifactory API неудачна'
              priority: AVERAGE
              dependencies:
                -
                  name: 'Artifactory API недоступен (нет ответов)'
                  expression: 'nodata(/Artifactory Template/artifactory_health_check,1m)=1'
      discovery_rules:
        -
          uuid: b77d7abb019944dab40ec51aec0b006d
          name: 'Обнаружение репозиториев Artifactory'
          type: HTTP_AGENT
          key: artifactory_repo_discover
          delay: 10m
          item_prototypes:
            -
              uuid: f1a0d247f1e34ff7a1cbf52b18d500d4
              name: 'Количество файлов в репозитории {#KEY}'
              type: DEPENDENT
              key: 'artifactory_repo_files_amount_[{#KEY}]'
              delay: '0'
              preprocessing:
                -
                  type: JSONPATH
                  parameters:
                    - $.files.length()
              master_item:
                key: 'artifactory_repo_files_list_[{#KEY}]'
            -
              uuid: fb572e66d234437bb6e5b9a2502ef773
              name: 'Список файлов в репозитории {#KEY}'
              type: HTTP_AGENT
              key: 'artifactory_repo_files_list_[{#KEY}]'
              delay: 10m
              history: '0'
              trends: '0'
              value_type: TEXT
              timeout: 30s
              url: '{$SCHEME}{HOST.NAME}{$PORT}/artifactory/api/storage/{#KEY}?list&deep=1'
              status_codes: ''
              headers:
                -
                  name: X-JFrog-Art-Api
                  value: '{$ARTIFACTORYAPIKEY}'
            -
              uuid: df5738cf40ca4f51a377a7ed2c8ab714
              name: 'Размер файлов в репозитории {#KEY}'
              type: DEPENDENT
              key: 'artifactory_repo_files_size_[{#KEY}]'
              delay: '0'
              units: B
              preprocessing:
                -
                  type: JSONPATH
                  parameters:
                    - '$.files[*].size.sum()'
              master_item:
                key: 'artifactory_repo_files_list_[{#KEY}]'
            -
              uuid: 1ae78f2d9b60427bad9d83b99bd2cf17
              name: 'Использовано места в репозитории {#KEY}'
              type: CALCULATED
              key: 'artifactory_repo_used_space_[{#KEY}]'
              delay: 10m
              value_type: FLOAT
              units: '%'
              params: '(100*last(//artifactory_repo_files_size_[{#KEY}]))/{$ARTIFACTORYREPOQUOTA}'
              trigger_prototypes:
                -
                  uuid: 493b23bca761440388372bf8b6047d16
                  expression: 'last(/Artifactory Template/artifactory_repo_used_space_[{#KEY}])>85'
                  name: 'В репозитории Artifactory {#KEY} занято более 85%'
                  priority: WARNING
                -
                  uuid: cc3a652087c44b8e937c388a436f1c79
                  expression: 'last(/Artifactory Template/artifactory_repo_used_space_[{#KEY}])>95'
                  name: 'В репозитории Artifactory {#KEY} занято более 95%'
                  priority: AVERAGE
          timeout: 30s
          url: '{$SCHEME}{HOST.NAME}{$PORT}/artifactory/api/repositories'
          status_codes: ''
          headers:
            -
              name: X-JFrog-Art-Api
              value: '{$ARTIFACTORYAPIKEY}'
          lld_macro_paths:
            -
              lld_macro: '{#KEY}'
              path: $.key
      macros:
        -
          macro: '{$ARTIFACTORYAPIKEY}'
          type: SECRET_TEXT
          description: 'API ключ пользователя имеющего доступ к репозиториям (обязательно)'
        -
          macro: '{$ARTIFACTORYREPOQUOTA}'
          value: '10737418240'
          description: 'Квота на используемое место в репозиториях в байтах (сейчас - 10ГБ) (обязательно)'
        -
          macro: '{$PORT}'
          description: 'Порт http сервера Artifactory (необязательно)'
        -
          macro: '{$SCHEME}'
          value: 'https://'
          description: 'Схема подключения (обязательно)'

Импорт шаблона и дальнейшая конфигурация

Теперь совсем немного расскажу о том, что делать после импорта шаблона. Сразу после его появления вам потребуется указать свои значения макросов шаблона. Всего их 4:

  • {$ARTIFACTORYAPIKEY} — API ключ учетной записи для доступа к Artifactory API (обязательно)
  • {$ARTIFACTORYREPOQUOTA} — квота или другие лимиты на репозитории (обязательно)
  • {$PORT} — порт по которому устанавливается соединение с Artifactory API (необязательно)
  • {$SCHEME} — протокол по которому устанавливается соединение с Artifactory API (обязательно)

Мы почти готовы к запуску мониторинга, осталось чуть-чуть 🙂
Следующим шагом будет создание хоста сервера Artifactory за которым мы будем наблюдать. Обратите внимание, что Zabbix потребует от вас указать интерфейс для подключения, однако это не означает, что на Artifactory сервере этот интерфейс действительно должен быть доступен (фактически проверки выполняются Zabbix сервером или прокси через HTTP протокол).

Спустя некоторое время вы должны увидеть новые элементы данных. Метрика отвечающая за проверку состояния Artifactory API появится сразу, еще часть метрик появится позже (должно отработать Discovery rule которая генерирует список репозиториев в Artifactory).

В итоге вы должны увидеть, что мониторинг за репозиториями начался и метрики обновляются

Итог

Коллеги, надеюсь мне удалось кому-то помочь или сэкономить время на задаче постановки мониторинга за репозиториями Artifactory.
Artifactory REST API хорошо задокументирован и мониторинг легко расширить в случае необходимости, все зависит от ваших хотелок и возможностей API 🙂