четверг, 1 сентября 2016 г.

Пишем свой биллинг для Windows Azure Pack.
Часть 3: Учет ресурсов виртуальных машин. SMA Runbook.


В предыдущей статье я привел пример скрипта, с помощью которого можно выполнять сбор информации по ресурсам подписки. Теперь мы напишем на его основе Runbook, который будет формировать окончательные данные. Это будет происходить как по расписанию, так и при срабатывании перехватчика событий Windows Azure Pack


Итак, для начала определимся, какие события мы будем отслеживать:

1. Создание ВМ
2. Остановка ВМ
3. Запуск ВМ
4. Удаление ВМ
5. Присоединение диска
6. Удаление диска
7. Добавление внешнего IP адреса
8. Удаление внешнего IP адреса

Биллинг будем делать посекундный. Для этого воспользуемся "особенностью" Windows Azure Pack - в нем невозможностью изменить ресурсы ВМ без ее остановки (я знаю, что это поведение можно поменять, но пока трогать не буду). Всю работу должен делать один простой ранбук, который получает информацию по подписке Windows Azure Pack клиента и выполняет подсчет суммарного потребления ресурсов. 

Логика работы Runbook.


При срабатывании любого триггера (перечислены выше) Runbook записывает в базу данных всю информацию о ресурсах подписки, на которой произошли изменения. У нас есть три типа подсчета ресурсов (указан в столбце "TaskType"):

1. Sheduled. Отрабатывает каждый час. Для этого в WAP были созданы Assets и привязаны к ранбуку "billing-subscriptions". В процессе работы идет сбор информации по всем ресурсам виртуальных машин для всех подписок. Чтобы Asset отработал корректно, необходимо в поле "vmmJobId" указать значение "0".
2. Event. Отрабатывает при возникновении события в WAP. Собирает информацию по всем ресурсам одной конкретной подписки.
3. Correcting. Данный тип задачи отрабатывает раз в час, вместе с Sheduled. Необходим для сбора данных по машинам, которые были остановлены средствами ОС ВМ. В WAP данная информация не фигурирует, поэтому ее необходимо получать через SCVMM Job. Записывает в БД информацию об количестве CPU и RAM, выделенных ВМ и записывает из в таблицу со знаком "-". Время выполнения берется из задачи, что обеспечивает высокую точность учета ресурсов.

Если виртуальная машина остановлена, значения CPU и RAM для нее считаем как "0". Диски учитываем как есть, так как клиент все равно продолжает их использовать

Создание базы данных

Изначально нам необходимо создать базу данных, куда Runbook будет записывать информацию. Скрипт выглядит следующим образом:

BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION
GO
CREATE TABLE dbo.Subscriptions
(
ID int not null identity(1,1) PRIMARY KEY,
Timestamp float NULL,
SubscriptionID varchar(50) NULL,
Name varchar(100) NULL,
CPU int NULL,
RAM int NULL,
VHDStd int NULL,
VHDFast int NULL,
VHDUltra int NULL,
WindowsVM int NULL,
IPAddress int NULL,
TaskType varchar(20) NULL,
Date varchar(20) NULL,
Custom1 varchar(50) NULL,
Custom2 varchar(50) NULL,
Custom3 varchar(50) NULL
)  
GO
ALTER TABLE dbo.Subscriptions SET (LOCK_ESCALATION = TABLE)
GO
COMMIT
select Has_Perms_By_Name(N'dbo.Subscriptions', 'Object', 'ALTER') as ALT_Per, Has_Perms_By_Name(N'dbo.Subscriptions', 'Object', 'VIEW DEFINITION') as View_def_Per, Has_Perms_By_Name(N'dbo.Subscriptions', 'Object', 'CONTROL') as Contr_Per 

Runbook


В Runbook используются Assets, которые мы создали в первой части данной серии статей. Поэтому никаких дополнительных настроек изменять не требуется.



Automation


Runbook необходимо привязать к событиям:


OBJECT ACTION
VMM VirtualMachine Update
VMM NATConnection Create
VMM NATConnection Delete
VMM NATConnection Update

Теперь необходимо в конец Workflow Runbook из первой статьи добавить строку:

billing-subscriptions -vmmJobId $vmmJobId


При остановке/удалении/запуске подписки Runbook не отрабатывает, так как предполагается, что это действие выполняется только через панель управления провайдера, которая сама знает о статусе подписки клиента и учитывает это при формировании счетов.

Получение данных


Пример запроса для получения информации по потреблению ресурсов подпиской в заданный
промежуток времени:


SELECT [ID]
                ,[Timestamp]
                ,[CPU]
                ,[RAM]
                ,[VHDStd]
                ,[VHDFast]
                ,[VHDUltra]
                ,[WindowsVM]
                ,[IPAddress]
                ,[TaskType]
                ,[DATE]
FROM [BillingDB].[dbo].[Subscriptions]
WHERE [TIMESTAMP] BETWEEN '1472736271' AND '1472759334'
AND [SubscriptionID] LIKE '37a11e28-b4f8-473e-9dc3-0016b3dbe699'
ORDER BY [Timestamp] ASC  

Получим результат:




На этом все. Можно приступать к тестированию биллинга и донастройке его под свои нужды. Далее я планирую добавить в него функционал, который опишу в следующих публикациях.





Комментариев нет:

Отправить комментарий