Создание собственных правил Health Monitoring в Sharepoint 2010
Привет всем. Хочу сегодня рассказать, как можно создавать свои собственные правила в анализаторе Sharepoint 2010. Стандартных методов нет, потому прийдётся применить навыки программирования. В начале в кратце расскажу вообще про эту систему, которая появилась в Sharepoint 2010.
Microsoft SharePoint Server 2010 содержит анализатор исправности SharePoint, который позволяет диагностировать и устранять ошибки конфигурации, производительности и использования. Анализатор исправности SharePoint применяет предварительно определенные правила исправности на серверах фермы. Правило исправности выполняет проверку и возвращает окно с результатами проверки. Для просмотра предупреждений и устранения ошибок необходимо использовать центр администрирования.
Помимо интерфейсного просмотра работоспособности, можно использовать команды PowerShell. Можно использовать Windows PowerShell для фильтрации данных, отображения их в различными способами и вывода данных в массив, в котором можно фильтровать, сортировать, группировать данные и экспортировать их в Microsoft Excel 2010.
Также можно использовать Windows PowerShell для просмотра и фильтрации событий журнала. Нельзя просматривать или фильтровать события журнала с помощью центра администрирования.
Для этого необходимо выполнить следующие команды:
1. Убедитесь в соответствии следующим минимальным требованиям: См. Add-SPShellAdmin.
2. В меню Пуск выберите пункт Все программы.
3. Выберите пункт Продукты Microsoft SharePoint 2010.
4. Щелкните компонент Командная консоль SharePoint 2010.
5. В командной строке Windows PowerShell введите одну из следующих команд:
- Все события трассировки:
Get-SPLogEvent
- По уровню:
Get-SPLogEvent | Where-Object {$_.Level –eq
[Information | Warning | Error | Critical | Verbose | Unexpected |
Monitorable | High | Medium]}
- По области:
Get-SPLogEvent | Where-Object {$_.Area -eq <Area>}
где <область> — значение свойства Area.
- По категории:
Get-SPLogEvent | Where-Object {$_.Category -eq <Category>
где <категория> — значение свойства Category.
- По идентификатору события:
Get-SPLogEvent | Where-Object {$_.EventID -eq <EventID>}
где <код события> — значение свойства EventID.
- По тексту сообщения:
Get-SPLogEvent | Where-Object {$_.Message -like “*<string>*”}
где <строка> — строка в сообщении события.
- По процессу:
Get-SPLogEvent | Where-Object {$_.Process -like “*<Process>*”}
где <процесс> — значение свойства Process.
Давайте сейчас попробуем создать своё собственное правило. Правила Health реализуются в класе
SPHealthAnalysisRule или SPRepairableHealthAnalysisRule, у которых есть метод проверки Check(), при вызове которого он возвращает строку неисправности. А также есть метод исправления неисправности. Это метод Repair().
Для добавления своего правила на наш сервер Sharepoint 2010 необходимо:
1. Создать свой класс и откомпилировать его в виде dll со строгой подписью.
2. Поместить эту библиотеку в наш GAC
3. Запустить тулзу PowerShell и выполнить следующую команду:
$loc=”C:\mydlllocation.dll”
$asm=[System.Reflection.Assembly]::LoadFrom($loc) <- $asm should be GAC’d
[Microsoft.SharePoint.Administration.Health.SPHealthAnalyzer]::RegisterRules($asm)
После этого мы увидим наше правило в списке правил. Теперь давайте создадим класс.
Для этого нам надо выполнить следующие команды:
1. Открыть Visual Studio под правами Администратора.
2. Создать новый проект библиотеки
3. Далее открыть свойства проекта и выбрать раздел Подпись и указать строгое имя.
4. Далее добавить в пространство имён Microsoft.SharePoint.dll. Библиотека находиться по адресу %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\ISAPI\Microsoft.SharePoint.dll
5. Добавить using Microsoft.SharePoint.Administration.Health;
6. Далее напишем код, который будет проверять наши диски на заполненность.
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using Microsoft.SharePoint.Administration;
using Microsoft.SharePoint.Administration.Health;
namespace Samples.HealthRules
{
public class DiskDriveAlmostFull: SPHealthAnalysisRule
{
private List<DriveInfo> m_FailingDrives = new List<DriveInfo>();
public override string Summary
{
get { return "One or more disk drives are running out of free space."; }
}
public override string Explanation
{
get
{
StringBuilder sb = new StringBuilder();
foreach (DriveInfo drive in this.m_FailingDrives)
{
sb.AppendFormat("{0} ({1}), ",
drive.VolumeLabel, drive.Name);
}
if (sb.Length > 2)
sb.Remove(sb.Length - 2, 2);
return string.Concat(
"The following drives on the failing servers have less than 10GB free: ", sb);
}
}
public override string Remedy
{
get { return "Examine the failing servers and delete old logs or free space on the drives."; }
}
public override SPHealthCategory Category
{
get { return SPHealthCategory.Availability; }
}
public override SPHealthCheckErrorLevel ErrorLevel
{
get { return SPHealthCheckErrorLevel.Error; }
}
public override SPHealthAnalysisRuleAutomaticExecutionParameters AutomaticExecutionParameters
{
get
{
SPHealthAnalysisRuleAutomaticExecutionParameters retval =
new SPHealthAnalysisRuleAutomaticExecutionParameters();
retval.Schedule = SPHealthCheckSchedule.Daily;
retval.Scope = SPHealthCheckScope.All;
retval.ServiceType = typeof(SPTimerService);
return retval;
}
}
public override SPHealthCheckStatus Check()
{
const long bytesInGb = 1024 * 1024 * 1024;
if (!SPFarm.Joined)
throw new InvalidOperationException();
foreach (DriveInfo di in DriveInfo.GetDrives())
{
try
{
if (!(di.IsReady && di.DriveType == DriveType.Fixed))
continue;
if (di.TotalFreeSpace < 10 * bytesInGb)
this.m_FailingDrives.Add(di);
}
catch (IOException)
{
}
}
if (this.m_FailingDrives.Count == 0)
return SPHealthCheckStatus.Passed;
else
return SPHealthCheckStatus.Failed;
}
}
}
Вот и всё. После всё будет работать.