Sergey Belskiy Technical Blog

All about SharePoint

Создание собственных правил 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;
        }
    }
}

Вот и всё. После всё будет работать.