Расширения / Разработка / Расширения АктивногоШлюза / Руководство
Давайте учиться на примере. В этом уроке мы покажем вам создание базового расширения АктивногоШлюза. Ваше расширение АктивногоШлюза будет выполняться на АктивномШлюзе и позволит отслеживать демонстрационное приложение, входящее в комплект АктивногоШлюза Extension SDK.
Подготовьте свое окружение
- Проверьте предварительные условия:
- АппОптима версии 1.176 или новее
- Среда АктивногоШлюза. Чтобы запускать расширения с АктивнымШлюзом, установленным в Amazon Linux 2022, вам необходимо установить библиотеку
libxcrypt-compat
. - Мониторинг доступа администратора
- Установите Python 3.8. АктивныйШлюз поставляется с Python 3.8. Мы рекомендуем использовать Extension SDK с той же версией Python.
- Установите среду АктивногоШлюза. В версии 1.175+ модуль плагина установлен по умолчанию.
Загрузите SDK расширения АктивногоШлюза
- Войдите в АппОптима, перейдите в «Настройки » > «Отслеживаемые технологии » > «Добавить мониторинг новых технологий » > «Добавить расширение АктивногоШлюза» и нажмите «Загрузить SDK расширения» .
- Распакуйте архив в удобную директорию. Он содержит документацию, примеры и файл Extension SDK, который
whl
вы будете использовать для установки SDK. - В каталоге вы найдете примеры расширений
examples
. В этой статье мы будем использоватьCustomCloudTechnology
расширение, расположенное вdemo_activegate_plugin_multi
каталоге.
Установите SDK расширения АктивногоШлюза
Виртуальная среда Python
Мы рекомендуем установить Extension SDK с использованием виртуальной среды Python. Инструкции см. в разделе «Виртуальные среды и пакеты».в документации Python.
- Перейдите в извлеченный каталог с
whl
файлом и выполните следующую команду:pip3 install plugin_sdk-[sdk version number]-py3-none-any.whl
напримерpip3 install plugin_sdk-1.156.0.20181003.61122-py3-none-any.whl
- Запустите
plugin_sdk --help
, чтобы проверить установку Extension SDK. Дополнительную информацию см. в разделе [Install Extension SDK]plugin-sdk-overview).
Развернуть расширение
То, что нужно запомнить
- Вы должны загрузить расширение как на сервер КлючАстром, так и на АктивномШлюзе, который будет его выполнять. Если вы установили Extension SDK на хосте АктивногоШлюза,
build_plugin
команда позаботится как о Сервере, так и о АктивномШлюзе. Если вы установили SDK расширения на отдельный хост, что является более распространенным случаем, загрузите расширение в АктивныйШлюз вручную. На этапе разработки мы рекомендуем вам установить Extension SDK на АктивныйШлюз, чтобы упростить процесс разработки. - Команда
build_plugin
создает пакет расширения и загружает его в выбранный каталог развертывания. Для запуска команды вам понадобится URL-адрес и токен сервера АппОптима. Если вы установили Extension SDK на хосте АктивногоШлюза, SDK автоматически получит URL-адрес сервера из конфигурации АктивногоШлюза. Получите токен в разделе «Настройки» > «Отслеживаемые технологии» > «Пользовательские расширения» и сохраните его какplugin_upload.token
файл в каталоге конфигурации подключаемого модуля АктивногоШлюза. По умолчанию%PROGRAMFILES%\astromkey\remotepluginmodule\agent\conf
в Windows и/opt/astromkey/remotepluginmodule/agent/conf
Linux. - Вы не можете развернуть одну и ту же версию расширения дважды. Чтобы загрузить измененное расширение, обязательно увеличивайте версию расширения при каждой сборке или загрузке. Используйте это
version
свойство в разделе метаданных вашего определения JSON .
Разверните свое расширение!
Перейдите в \examples\demo_activegate_plugin
каталог расширения SDK и выполните plugin_sdk build_plugin
команду. Он создаст пакет расширения из текущего каталога. По завершении скопируйте пакет расширения в каталог развертывания АктивногоШлюза ( %PROGRAMFILES%\astromkey\remotepluginmodule\plugin_deployment
или /opt/astromkey/remotepluginmodule/plugin_deployment
загрузите расширение на сервер АппОптима, которому назначен ваш АктивныйШлюз. Подобное сообщение означает, что все прошло хорошо.
Copying plugin to target_directory: {plugin_deployment_dir}\custom.remote.python.example_multi
Creating plugin archive
========================================
Plugin deployed successfully into {plugin_deployment_dir}\custom.remote.python.example_multi
Plugin archive available at {plugin_deployment_dir}\custom.remote.python.example_multi.zip
========================================
interactive upload -> oneagent_upload_plugin -p {plugin_deployment_dir}\custom.remote.python.example_multi.zip -s https://{astromkey_server_URL}:443/api/v1/remoteplugins -t #####################
Attempting to send plugin to server https://{astromkey_server_URL}:443/api/v1/remoteplugins
plugin has been uploaded successfully
Поздравляем, вы успешно развернули свое первое расширение ActiveGate.
Запустите демо-приложение
Ваше первое расширение АктивногоШлюза будет отслеживать демонстрационное приложение, включенное в SDK. Демо-приложение имитирует EXAMPLE_SERVICE
технологию, работающую в кластере (группе устройств) с двумя узлами (устройствами). API демонстрационного приложения предоставляет доступ к метрикам. Ваше расширение импортирует топологию и получит метрики.
- Запустите демонстрационное приложение. Перейдите в каталог, в который вы распаковали SDK, и выполните следующую команду:
python -m plugin_sdk.demo_app
- Убедитесь, что ваше приложение запущено и работает. Перейдите
http://127.0.0.1:8769/
и проверьте ответ приложения.
Настройка расширения
- Перейдите в «Настройки» > «Отслеживаемые технологии» > вкладка «Пользовательские расширения».
- Откройте
CustomCloudTechnology
расширение и настройте его. - Проверьте успешный запуск расширения. Демо-плагин должен отображать статус «ОК» .
- Ждите. Сбор первых данных занимает до 2 минут.
Осмотр
- Перейдите в раздел «Технологии» и найдите
EXAMPLE_SERVICE
плитку. - Страница «Группа» позволяет анализировать группу и сравнивать эффективность ее участников.
- Анализируйте различные типы диаграмм на странице устройства.
- Перейдите к дополнительным сведениям, чтобы найти вкладку «Память».
Настройте расширение
Расширение АктивногоШлюза состоит из двух ключевых файлов: Python и JSON. Файл JSON определяет представление ваших данных на различных страницах АппОптима. С помощью файла Python вы можете определять дополнительные события и создавать собственные свойства. См. справочник по расширениям АктивногоШлюза и возможности расширений АктивногоШлюза . Попробуйте поэкспериментировать с файлами и посмотреть, как это повлияет на представление данных.
JSON
Файл расширения JSON состоит из следующих четырех основных элементов:
Метаданные
Метаданные содержат список свойств, используемых для идентификации вашего расширения.
{
"name": "custom.remote.python.example_multi",
"version": "1.18",
"productiveMinVersion": "1.000",
"requiredAgentVersion": "1.000",
"type": "python",
"entity": "CUSTOM_DEVICE",
"metricGroup": "tech.Example_Service",
"technologies": ["EXAMPLE_SERVICE"],
"source": {
"package": "demo_activegate_plugin_multi",
"className": "RemoteExamplePlugin",
"install_requires": ["requests>=2.6.0"]
}
}
Имя расширения АктивногоШлюза должно следовать ^ custom.remote.python (\.[a-zA-Z0-9_]+)+$
за регулярным выражением. Например, custom.remote.python.demo
. Имя каждого расширения должно быть уникальным.
Свойства technologies
и favicon
определяют, как ваша технология будет представлена на странице «Обзор технологии» . Чтобы данные вашего расширения отображались на плитке существующей технологии, укажите соответствующее имя технологии. Вы можете найти текущие названия технологий в справочнике JSON расширений АктивногоШлюза или найти их в пользовательском интерфейсе как Main technology
свойство процесса.
Имя пакета и класс, которые должны быть импортированы и выполнены АктивнымШлюзом , соответствуют имени файла Python, содержащего код, и имени определенного в нем класса.
Метрики
Раздел показателей описывает данные, собранные расширением. В этом разделе представлены две метрики, которые отражают как то, что обслуживает наше демонстрационное приложение, так и то, что собирает код Python.
Конфигурационный интерфейс
Разделы ConfigUI и свойств определяют элементы пользовательского интерфейса, используемые для настройки расширения .
Пользовательский интерфейс
Эта часть файла JSON определяет способ отображения показателей. Раздел « Ключевые метрики» позволяет выбрать наиболее важные метрики и представить их в инфографике и на странице группы. Диаграммы вы найдете на вкладке «Дополнительная информация».
Python
Код Python хранится в demo_activegate_plugin_multi.py
файле.
from ruxit.api.base_plugin import RemoteBasePlugin
from ruxit.api.data import PluginProperty
import math
import logging
from enum import Enum
logger = logging.getLogger(__name__)
class RemoteExamplePlugin(RemoteBasePlugin):
class State(Enum):
DOWNTIME = 0
MAINTENANCE = 1
WORKING = 2
def initialize(self, **kwargs):
self.url = self.config.get("url", "http://127.0.0.1:8976")
self.user = self.config.get("auth_user", "admin")
self.password = self.config.get("auth_password", "admin")
self.alert_interval = self.config.get("alert_interval", 10)
self.event_interval = self.config.get("event_interval", 3)
self.relative_interval = self.config.get("relative_interval", 60)
self.state_interval = self.config.get("state_interval", 60)
self.alert_iterations = 0
self.event_iterations = 0
self.relative_iterations = 0
self.absolute_iterations = 0
self.state_iterations = 0
self.current_entries = 1
self.archived_entries = 0
def query(self, **kwargs):
group_name = self.get_group_name()
topology_group = self.topology_builder.create_group(group_name, group_name)
topology_group.per_second("service.querries_per_second", self.get_num_querries())
topology_group.report_property(key="group_property", value="group_property_value")
devices = self.get_device_names()
port = 80
for device_name in devices:
topology_device = topology_group.create_device(device_name, device_name)
topology_device.state_metric("service.state_5", self.get_state_metric())
topology_device.absolute("databases.total_num_entities", self.get_device_entries())
table_size = 100
topology_device.relative("databases.replicated_entries", self.get_archived_entries())
for table in self.get_tables_for_device(device_name):
topology_device.absolute("databases.table_size", table_size, {"table_name": table})
table_size = table_size + 100
if self.should_create_event():
topology_device.report_custom_info_event("Custom event!")
topology_device.report_performance_event("Performance problem description", "Performance problem", {})
topology_device.report_property(key="device_property", value="device_property_value")
topology_device.add_endpoint("127.0.0.1", port)
port += 1
def get_group_name(self):
return "ExampleGroup"
def get_state_metric(self):
if self.state_iterations >= self.state_interval * 3:
self.state_iterations = 0
state = RemoteExamplePlugin.State(int(self.state_iterations / self.state_interval))
self.state_iterations = self.state_iterations + 1
return state.name
def get_num_querries(self):
self.alert_iterations = self.alert_iterations + 1
if self.alert_iterations > self.alert_interval:
if self.alert_iterations > self.alert_interval + 3:
self.alert_iterations = 0
return 1
return 7
def get_device_names(self):
return ["DeviceOne", "DeviceTwo"]
def get_tables_for_device(self, device):
if device == "DeviceOne":
return ["d1_t1", "d1_t2", "d1_t3", "d2_t4"]
return ["d2_t1", "d2_t2", "d2_t3", "d2_t4", "d2_t5", "d2_t6"]
def get_device_entries(self):
if self.absolute_iterations == 360:
self.absolute_iterations = 0
self.absolute_iterations = self.absolute_iterations + 1
return self.current_entries + math.sin(math.radians(self.absolute_iterations))
def get_archived_entries(self):
self.relative_iterations = self.relative_iterations + 1
if self.relative_iterations > self.relative_interval:
self.relative_iterations = 0
self.archived_entries = self.archived_entries + 1
return self.archived_entries
def should_create_event(self):
self.event_iterations = self.event_iterations + 1
if self.event_iterations > self.event_interval:
self.event_iterations = 0
return True
return False
Файл определяет RemoteExamplePlugin
класс, который, в свою очередь, определяет один запрос метода. При запуске вашего расширения этот метод вызывается каждую минуту для сбора и отправки данных и метрик топологии на сервер АппОптима.
Демо-приложение возвращает ответ JSON, как показано в примере ниже.
[
{
"nodes": [
{
"ip": "192.168.0.1",
"stats": {
"stats_counter": [6, 10, 13],
"random": 194,
"state": "WARNING",
"counter": 4,
"version": "1.001"
},
"name": "My Node 01"
},
{
"ip": "127.0.0.1",
"stats": {
"stats_counter": [7, 10, 11],
"random": 194,
"state": "WARNING",
"counter": 4,
"version": "1.001"
},
"name": "My Node 02"
}
],
"name": "My Group 01"
}
]
Метод запроса плагина анализирует ответ, находит группы и устройства и соответствующим образом назначает метрики. Расширение автоматически обнаруживает и отслеживает новые группы и устройства.
Следующие шаги
Это только начало. Ознакомьтесь с другими примерами расширений, поставляемыми вместе с SDK, изучите инструкции и узнайте о других вариантах развертывания .