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