Механизм расчета SLA в SCSM 2012 — одно из самых значительных нововведений по сравнению с SCSM 2010. Если раньше мы могли рассчитывать расписание только для инцидентов по расписанию 24/7 по значению приоритета, то теперь нам доступен расчет SLA по любому параметры типа ДатаВремя.
Но в данном цикле статей я не буду описывать в сотый раз как настроить SLA, а постараюсь объяснить как работает механизм SLA “изнутри”. Это поможет вам использовать более сложные сценарии применения SLA, а также откроет некоторые скрытые возможности механизма SLA в SCSM 2012.
В первой части я расскажу, какие объекты с точки зрения модели SCSM, участвуют в SLA, как они хранятся и как взаимодействуют друг с другом. Данная статья может показаться слишком сложной для понимания, но так оно и есть. Её назначение – чисто справочное, чтобы определится с терминами и показать, где искать те или иные объекты в системе, когда я буду описывать принцип работы SLA в SCSM 2012 во второй части статьи.
Примечание: во избежание путаницы я буду давать названия всех классов так, как они представлены в консоли SCSM.
Объекты SLA
В первую очередь, давайте разберемся, какие объекты используются в расчете SLA и как они хранятся в системе. Итак, для включения механизма SLA необходимы следующие объекты:
- Календарь
- Метрика
- Очередь
- Цель уровня обслуживания
Собственно, для того, чтобы создать цель уровня обслуживания, нам необходимо выбрать целевой класс (чаще всего это будут инциденты или запрос на обслуживание, но могут быть любые классы, унаследованные от WorkItem), очередь, и в качестве критерия указать календарь, метрику и целевое и пороговое время для данного SLO. Запомните эти термины, ниже я буду использовать именно их.
Календарь
Календарь задает расписание, по которому будет рассчитываться время для конкретной цели уровня обслуживания. Календарей может быть несколько. За хранение календарей отвечает класс System.Calendar со следующими свойствами:
Id | Внутренний идентификатор каждого календаря. Ключевое поле. Генерируется автоматически при сохранении формы Календаря. |
Timezone | Временная зона календаря. Хранится в специальном формате. |
DisplayName | Название календаря |
Description | Описание календаря |
Как вы видите, не хватает данных о рабочем времени и выходных. За эти данные отвечают другие классы. Класс System.Calendar.WorkDay отвечает за данные о рабочем времени каждого календаря и имеет следующие свойства:
Id | Внутренний идентификатор каждого рабочего дня. Ключевое поле. Генерируется автоматически при сохранении формы Календаря. |
DisplayName | Совпадает с Id. |
IsEnabled | Является ли указанный интервал рабочим днем |
DayOfWeek | День недели. Значение перечисления Calendar.DayOfWeek |
StartTime | Время начала работы |
EndTime | Время окончания работы |
Класс System.Calendar.Holiday отвечает за хранение выходных дней и имеет следующие свойства:
Id | Внутренний идентификатор каждого выходного. Ключевое поле. Генерируется автоматически при сохранении формы Календаря. |
DisplayName | Название выходного. |
StartTime | Дата начала выходного. Данные времени игнорируются. |
EndTime | Дата окончания выходного. Данные времени игнорируются. |
IsRecurring | Признак, что выходной повторяющийся. |
Между этими тремя классами существуют связи:
Имя | Источник | Цель |
System.CalendarHasHoliday | System.Calendar | System.Calendar.Holiday |
System.CalendarHasWorkDay | System.Calendar | System.Calendar.WorkDay |
К примеру, если вы при настройке календаря выбрали стандартную рабочую неделю (с понедельника по пятницу, с 10:00 по 18:00) и указали выходной 1 января и 23 февраля, то будут созданы:
- Один объект типа System.Calendar
- Пять объектов типа System.Calendar.WorkDay (отдельно для каждого дня неделя)
- Два объекта типа System.Calendar.Holiday
- Связи между объектами 1 и 2, 1 и 3.
Несколько выводов:
- Объекты настройки календаря хранятся в базе данных, поэтому вы можете перенести настройки календарей из одной системы в другую только с помощью SDK (выгрузить информацию в файл из тестовой среды, загрузить на новую)
- Параметр временной зоны хранится в строго определенном формате, поэтому если вы соберетесь создавать календарь с помощью SDK имейте это ввиду. Иначе вы можете получить ошибку “Значение не может быть неопределенным. Имя параметра: timeZone”
Как пример, вывод списка календарей с моей системе с помощью PowerShell:
Возможность создавать объекты через SDK использует Андерс в своем решении по импорту выходных дней из файла календаря Outlook в SCSM.
Метрика
Метрика отвечает за хранение информации, по каким параметрам типа ДатаВремя мы будет рассчитывать SLA. За хранение информации о метрике отвечает класс System.SLA.DateProperty.TimeMetric (наследуется от System.SLA.Metric) со следующими свойствами:
Id | Внутренний идентификатор каждой метрики. Ключевое поле. Генерируется автоматически при сохранении формы метрики. |
DisplayName | Название метрики. |
Description | Описание метрики |
TypeId | ИД типа объекта, для которого создается эта метрика (Guid) |
StartDateProperty | ИД свойства, отвечающего за время начала отсчета (Guid) |
EndDateProperty | ИД свойства, отвечающего за время окончания отсчета (Guid) |
PauseEventCriteria | Критерий для события приостановки SLA (нельзя установить через GUI) |
ResumeEventCriteria | Критерий для события возобновления SLA (нельзя установить через GUI) |
Несколько выводов:
- Как и календари, метрики хранятся в базе данных. Перенос возможен только с помощью SDK.
- Класс метрики имеет скрытые свойства, но изменение этих свойств официально не поддерживается Microsoft. Об этом подробнее будет описано позже.
Очередь
Очередь в SCSM – это разновидность группы. Физически, очередь это и есть группа, но может содержать только объекты, порожденные от класса System.WorkItem. В связи с этим для каждой очереди создается свой собственный singleton-класс (т.е. класс, который сам по себе является объектом, поэтому в системе может быть только один экземпляр этого класса, и его ID совпадает с ID класса) и правило наполнение (Discovery) (именно по этой причине при создании очереди необходимо указывать пакет управления).
После создания очереди в выбранном пакете управления появляется два новых определения: класс, наследованный от класса System.WorkItemGroup:
<ClassType ID="WorkItemGroup.8085d7c3a07c468da1ac625247ae2815" Accessibility="Public" Abstract="false" Base="WorkItem!System.WorkItemGroup" Hosted="false" Singleton="true" Extension="false" />
и новое отношение, которое определяет, объекты какого типа будут хранится в очереди. Тип объекта определяется при создании очереди. В моем примере это инцидент, что видно по типу Target для отношения:
<RelationshipType ID="WorkItemGroup.8085d7c3a07c468da1ac625247ae2815_Contains_System.WorkItem.Incident" Accessibility="Public" Abstract="false" Base="WorkItem!System.WorkItemGroupContainsWorkItems"> <Source ID="ContainedByGroup" MinCardinality="0" MaxCardinality="2147483647" Type="WorkItemGroup.8085d7c3a07c468da1ac625247ae2815" /> <Target ID="GroupContains" MinCardinality="0" MaxCardinality="2147483647" Type="Incident!System.WorkItem.Incident" /> </RelationshipType>
а также новое обнаружение, отвечающее за наполнение группы. В моем примере это динамическое правило:
<Discovery ID="WorkItemGroup.8085d7c3a07c468da1ac625247ae2815.Discovery" Enabled="true" Target="WorkItemGroup.8085d7c3a07c468da1ac625247ae2815" ConfirmDelivery="false" Remotable="true" Priority="Normal"> <Category>Discovery</Category> <DiscoveryTypes> <DiscoveryRelationship TypeID="WorkItemGroup.8085d7c3a07c468da1ac625247ae2815_Contains_System.WorkItem.Incident" /> </DiscoveryTypes> <DataSource ID="GroupPopulationDataSource" TypeID="SystemCenter!Microsoft.SystemCenter.GroupPopulator"> <RuleId>$MPElement$</RuleId> <GroupInstanceId>$MPElement[Name="WorkItemGroup.8085d7c3a07c468da1ac625247ae2815"]$</GroupInstanceId> <MembershipRules> <MembershipRule> <MonitoringClass>$MPElement[Name='Incident!System.WorkItem.Incident']$</MonitoringClass> <RelationshipClass>$MPElement[Name='WorkItemGroup.8085d7c3a07c468da1ac625247ae2815_Contains_System.WorkItem.Incident']$</RelationshipClass> <Expression> <SimpleExpression> <ValueExpression> <Property>$Context/Property[Type='Incident!System.WorkItem.Incident']/Classification$</Property> </ValueExpression> <Operator>Equal</Operator> <ValueExpression> <Value>{e36c84ea-1903-caf8-c2cf-c1e271a27ca7}</Value> </ValueExpression> </SimpleExpression> </Expression> </MembershipRule> </MembershipRules> </DataSource> </Discovery>
Несколько выводов:
- Очереди можно переносить между различными инсталляциями SCSM, т.к. их параметры хранятся в пакетах управления.
- В очередях можно использовать более сложные критерии, нежели это позволяет графический редактор. К примеру, анализировать затронутого пользователя, или затронутые КЭ.
Цель уровня обслуживания
Цель уровня обслуживания объединяет в себе все выше перечисленные объекты. Каждая цель уровня обслуживания – это фактически отдельная метрика в вашем договоре на обслуживание. За хранение параметров цели уровня обслуживания отвечает класс System.SLA.Configuration со следующими свойствами:
Id | Внутренний идентификатор каждой цели уровня обслуживания . Ключевое поле. Генерируется автоматически при сохранении формы метрики. |
DisplayName | Название цели уровня обслуживания . |
Description | Описание цели уровня обслуживания. |
TypeId | ИД типа объекта (т.е. ID класса), для которого создается цель уровня обслуживания |
Для хранения свойств целевого интервала и интервала предупреждения используется класс System.SLA.TimeTarget (наследуется от System.SLA.Target) со следующими свойствами:
Id | Внутренний идентификатор каждого целевого интервала. Ключевое поле. Генерируется автоматически при сохранении формы метрики. |
DisplayName | Совпадает с Id. Генерируется автоматически при сохранении формы метрики. |
TimeMeasure | Интервал (целое число) |
TimeUnits | Единица изменения. Перечисление типа Calendar.TimeUnits. |
Также существуют следующие связи:
Имя | Источник | Цель | Описание |
System.SLA.ConfigurationHasTarget | System.SLA.Configuration | System.SLA.Target | Целевое время разрешения |
System.SLA.ConfigurationHasWarningThreshold | System.SLA.Configuration | System.SLA.Target | Пороговое время предупреждения |
System.SLA.ConfigurationRefersToCalendar | System.SLA.Configuration | System.Calendar | Календарь |
System.SLA.ConfigurationRefersToMetric | System.SLA.Configuration | System.SLA.Metric | Метрика |
Но тут есть нюанс. Часть настройки цели уровня обслуживания хранится в пакете управления. Точнее будет сказать, что в момент создания цели уровня обслуживания создаются ряд объектов как в БД (описанные выше классы и отношения), так и в пакетах управления. В пакете управления создаются следующие объекты (примечание: внутренние имена всех объектов генерируются автоматически, указано только отображаемое имя (DisplayName), которое хранится в секции DisplayStrings):
- Группа. Отображаемое имя строится по принципу:
SLA Group: %ИМЯ_SLO%,
где %ИМЯ_SLO% – это название вашего объекта SLA в консоли. - Цель для рабочего процесса.Отображаемое строится по правилу:
SLA Workflow Target: %ИМЯ_SLO% - Обнаружение (Discovery) для группы 1. Правило для обнаружения следующее: все объекты целевого класса уровня обслуживания (инцидент или запрос на обслуживание), время создания (в UTC) которых больше или равно заданному значению И которые находятся в очереди, выбранной при создании цели уровня обслуживания. Для большего понимания приведу скриншот правила с комментариями (картинка “кликабельна”).
- Два правила (или рабочих процесса в терминах консоли SCSM), источником для которых служит событие создания и удаление (по одному правилу на каждое событие) связи между группой из п.1 и её членом. Отображаемое имя строится по принципу: %ИМЯ_SLO%-AddRelationship и %ИМЯ_SLO%-DeleteRelationship.
- Два правила, источником для которых служит изменение объекта целевого класса уровня обслуживания (т.е. инцидент или запрос на обслуживание) с критерием для первого правила: “CreatedDate была равно null и стала не равна null”, и для второго правила: “FirstResponseDate была равно null и стала не равна null”, где CreatedDate и FirstResponseDate соответственно имя поля начала отсчета и окончания отсчета метрики. Отображаемое имя строится по принципу: %ИМЯ_SLO%-StartEvent и %ИМЯ_SLO%-EndEvent соответственно.
- Два правила, источником для которых служит также изменение объекта целевого класса уровня обслуживания (т.е. инцидент или запрос на обслуживание) без дополнительных критериев, при этом оба правила отключены по умолчанию (Enabled=”false”). Отображаемое имя строится по принципу: %ИМЯ_SLO%-PauseEvent и %ИМЯ_SLO%-ResumeEvent.
Именно эти правила (рабочие процессы) и являются сердцем механизма SLA в SCSM 2012.
Вместо заключения
Собственно на этом всё. В следующей статье расскажу, зачем всё это надо и как это работает. Но уже сейчас внимательный читатель без труда ответит на часто возникающие вопросы:
- Почему SLA не применяется на те инциденты (или другие объекты), которые были созданны до того, как была создана цель уровня обслуживания
- Как перенести настройки SLA из одной системы в другую.
[В очередях можно использовать более сложные критерии, нежели это позволяет графический редактор. К примеру, анализировать затронутого пользователя, или затронутые КЭ]
а можно попросить парочку красивых примеров (для DistinguishedName, например)?
Спасибо,
Анатолий
Как раз это будет в 3й части.