Автоматизация отчетов о быстродействии системы DIRECTUM

17 3

Предыстория: в один прекрасный момент, когда я делал очередной анализ логов профайлинга системы DIRECTUM для одной достаточно масштабной системы, у меня в голове промелькнула совершенно логичная мысль сделать так, чтобы этот анализ делался «по нажатию одной кнопки». Следующая мысль была – сделать так, чтобы «кнопка нажималась» тоже как-нибудь самостоятельно (в конце концов, лень – это большой друг системного администратора, если ей пользоваться грамотно).

В итоге родилась система автоматической отчетности о производительности, которая успешно работает без внешнего вмешательства уже почти год, и о которой я расскажу далее.

Для успешного внедрения и запуска такой системы необходимы следующие условия:

  1. потребность и/или желание знать, насколько быстро работает система DIRECTUM с разбивкой по периодам (например, за каждый день);
  2. время на настройку (при использовании нижеизложенного опыта и соображалки – займет около часа со всеми тестами);
  3. включенная запись логов клиентского профалинга, настроенная на всех клиентских рабочих местах на хранение логов в едином сетевом ресурсе;
  4. здоровая (не в смысле – большая, а совсем в другом смысле) лень.

Итак, представим, что все логи клиентского профайлинга со всех рабочих мест (ну или с их большинства) лежат в едином общедоступном месте.

Для анализа логов удобнее всего предварительно поместить их в специальную базу данных. Предварительно эту базу необходимо подготовить, согласно инструкции, представленной в Руководстве Администратора, в разделе «Мониторинг и профайлинг системы DIRECTUM > Профайлинг системы DIRECTUM > Создание БД профайлинга». Выполнять создание лучше от имени доменного пользователя, имеющего право создавать базы данных на сервере, где лежит БД DIRECTUM. Можно сделать специального служебного пользователя, обладающего нужными правами, он нам в дальнейшем пригодится.

После того, как БД создана, в нее можно начать переносить данные из логов профайлинга. Но предварительно для настройки переноса необходимо создать запись справочника «Настройки анализа профайлинга», согласно инструкции в Руководстве Администратора, в разделе «Мониторинг и профайлинг системы DIRECTUM > Профайлинг системы DIRECTUM > Настройка параметров анализа профайлинга > Порядок настройки параметров анализа профайлинга». В карточке справочника указываем следующие значения реквизитов:

- в реквизите «Имя базы» указываем имя БД профайлинга, которую мы создали в предыдущем абзаце;

- в реквизите «Путь для файлов трассировок» указываем путь, где лежат наши логи профайлинга.

После  этого – мы полностью готовы переносить данные из файлов в базу.

Это производится при помощи сценария, который называется «Заполнение таблицы c историей логов профайлинга (FillProfilingLogsHistoryTable)». Для своих нужд, я модифицировал сценарий следующим образом: заменил участок, где определяются переменные «BeginOfPeriodParam» и «EndOfPeriodParam», на строки:

BeginOfPeriodParam = today()-1

EndOfPeriodParam = today()

Тем самым, сценарий будет «хватать» из логов данные только за вчера.

На всякий случай, не стоит действительно модифицировать стандартный сценарий, а лучше скопировать его в новый и ковырять его, сколько душе угодно.

Теперь у нас есть подготовленный сценарий, осталось сделать так, чтобы он запускался ежедневно. Это можно сделать при помощи назначенного задания Windows. Вот тут и пригодится нам тот самый служебный доменный пользователь, от имени которого бы будем запускать это самое назначенное задание.

Запускать будем: "c:\program files (x86)\Directum company\directum <версия>\sblauncher.exe" с арументами «-S="directum" -d="directum_dev" -W -ct="Script" -F="FillProfilingLogsHistoryTable_bvs"», где FillProfilingLogsHistoryTable_bvs – это имя модифицированного сценария.

На компьютере, где будем настраивать выполнение задания, пользователь, от имени которого стартует задание, должен будет входить в локальную политику безопасности «Вход в качестве пакетного задания»

При настройке задания не забываем на первой странице указать пункт «Выполнять вне зависимости от регистрации пользователя», иначе задание будет запускаться только в том случае, если пользователь, от имени которого запускается задание, в момент запуска будет залогинен на сервер.

Я настроил выполнение данного сценария ежедневно на 3:00.

Теперь, после 3:00 мы имеем базу данных, в таблице SBClientProfilingLog которой лежат логи клиентского профайлинга за вчера, свежие и горячие, полностью готовые к тому, чтобы их кто-нибудь проанализировал.

Делать это мы будем при помощи специально придуманного и сделанного SQL-Job’а. Назвал я его «Send Daily Profiling Info». Содержит мой Job следующий сценарий SQL:

declare @myTable table

(

    ProfilingOperation nvarchar(256),

    cnt int,

    time_avg int,

    time_min int,

    time_max int,

    deviation int)

DECLARE @tableHTML  NVARCHAR(MAX) ;

declare @subject as nvarchar(255)

   

insert into @myTable

    exec (N'WITH    Logs ( ProfilingOperation, [MAX], [Min], [Avg], [Count] )

          AS ( SELECT   ProfilingOperation, MAX(Duration) AS [Max], MIN(Duration) AS [Min], AVG(Duration) AS [AVG], COUNT(1) AS [COUNT]

               FROM     dbo.SBClientProfilingLog

               WHERE    dbo.SBClientProfilingLog.Duration IS NOT NULL

               GROUP BY dbo.SBClientProfilingLog.ProfilingOperation

             )

    SELECT  Logs.ProfilingOperation, logs.[count],Logs.[avg], Logs.[min], Logs.[max],

            ( SELECT    COUNT(1)

              FROM      dbo.SBClientProfilingLog

              WHERE     Duration > logs.[avg]

                        AND dbo.SBClientProfilingLog.ProfilingOperation = Logs.ProfilingOperation

            ) AS Otk

    FROM    Logs

 ORDER BY  Logs.ProfilingOperation

OPTION (MAXDOP 1, FAST 10)

')



set @subject = 'Статистика скорости выполнения операций системой DIRECTUM за ' + convert(varchar, getdate()-1, 101)

SET @tableHTML =

    N'

' + @subject + '

' + N'' + N'' + N'' + N'' + CAST (( SELECT td = ProfilingOperation,'', td = cnt,'', td = time_avg, '', td = time_min, '', td = time_max,'', td = deviation FROM @myTable FOR XML PATH('tr'), TYPE) AS NVARCHAR(MAX) ) + N'
Тип операцииКоличествоСреднее, мсМинимум, мсМаксимум, мсОтклонение*

* - количество значений, скорость выполнения которых превышает среднее значение

' ; exec msdb.dbo.sp_send_dbmail @profile_name='Server Mail', @recipients='admin@mail.ru', @subject = @subject, @body_format = 'HTML', @body = @tableHTML

В данном сценарии необходимо заменить в строке «@profile_name='Server Mail'» значение на имя почтового аккаунта, настроенного для Microsoft SQL Server (Management – Database Mail в Microsoft SQL Management Studio). Процедура настройки такого аккаунта описана в документации Microsoft SQL Server. От имени этого аккаунта будем отправлять на ящик(и), указанный в строке «@recipients='admin@mail.ru'» сообщение, содержащее статистику вида:

 

Статистика скорости выполнения операций системой DIRECTUM за 09/12/2013

Тип операции

Количество

Среднее, мс

Минимум, мс

Максимум, мс

Отклонение*

poEDocumentCreate

504

3270

406

84814

115

poEDocumentDelete

9

492

140

1061

5

poEDocumentOpenCard

920

150

32

5719

252

poEDocumentOpenVersion

2521

220

31

25078

339

poEDocumentSaveCard

866

1508

0

20249

299

poEDocumentSaveVersion

97

157

15

5132

18

poEDocumentShowAccessRightsDialog

143

195

78

1264

57

poEDocumentSignVersion

3

9115

4290

12105

2

poEDocumentVerifySignatures

9

416

0

2824

2

poEDocumentVersionTransformation

1

12746

12746

12746

0

poExplorerExecuteSearch

1307

138

15

5429

603

poExplorerInitSystemTools

2142

605

0

5057

1156

poExplorerLoadImages

1119

305

31

16255

192

poExplorerOpen

1224

6840

1248

131358

377

poFolderCreate

14

185

156

297

6

poFolderGetContent

6525

115

0

5268

2049

poFolderModifyContent

321

54

0

4274

49

poFolderOpenCard

17

101

78

140

8

poFolderSave

10

96

16

140

5

poFolderShowAccessRightsDialog

7

153

62

234

4

poInstantMessaging

19098

0

0

437

712

poReferenceBuildHierarchy

655

688

47

2262

120

poReferenceCreate

667

2080

32

34282

202

poReferenceDelete

18

735

15

1575

7

poReferenceOpen

8811

245

0

15865

2033

poReferenceOpenCard

3244

1169

0

13244

1286

poReferenceSave

1628

1072

0

27454

562

poReportExecute

817

5883

0

1920824

34

poScriptExecute

115

6479

0

114893

22

poTaskTreeBuild

5874

27

0

1139

2370

poWorkAccept

112

277

0

2325

32

poWorkCreate

196

646

343

2527

66

poWorkCreateAllRouteBlocks

6324

168

0

5015

2966

poWorkflowBlockProcessing

178

119

0

1638

23

poWorkOpen

4361

806

62

19672

1000

poWorkPerform

1717

2613

93

75302

576

poWorkSave

58

178

0

1123

14

poWorkShowAccessRightsDialog

96

278

109

827

50

poWorkSign

24

3595

780

27019

5

poWorkStart

246

469

78

5912

113

* - количество значений, скорость выполнения которых превышает среднее значение

Настроить выполнение такого JOBa можно например, ежедневно в 03:30.

Естественно, Job должен быть настроен на SQL-сервере, где лежит база профайлинга.

Если все сделано правильно, то ежедневно примерно в 03:30 мы будем получать на указанные ящики электронной почты статистику, с какой длительностью выполнялись те или иные операции в системе DIRECTUM.

При необходимости, можно всю систему модифицировать как угодно, можно собирать статистику за другие периоды, по разным разрезам.

Но главное – это автоматика. Можно держать руку на пульсе системы, не вставая с любимого кресла (или даже с любимой кровати: лично я читаю утреннюю почту со смартфона ранним утром).

Удачи вам, администраторы, и с праздником!

Олег Быков

можно уведомлять отчетом о текущих и просроченных заданиях, удобно.

Александр Афанасьев

Здравствуйте. Не подскажите, у меня в сценарии FillProfilingLogsHistoryTable в коде функции CreateSQLProfilingDatabaseConnection() и GetProfilingLogPath() подсвечены красным, т е их нет в системе? Что можно сделать?

Иван Чурбаков
Здравствуйте. Не подскажите, у меня в сценарии FillProfilingLogsHistoryTable в коде функции CreateSQLProfilingDatabaseConnection() и GetProfilingLogPath() подсвечены красным, т е их нет в системе? Что можно сделать?

Это нормально. Просто они не заведены в компоненте Функции, реально работать будут.

Авторизуйтесь, чтобы написать комментарий