Предыстория: в один прекрасный момент, когда я делал очередной анализ логов профайлинга системы DIRECTUM для одной достаточно масштабной системы, у меня в голове промелькнула совершенно логичная мысль сделать так, чтобы этот анализ делался «по нажатию одной кнопки». Следующая мысль была – сделать так, чтобы «кнопка нажималась» тоже как-нибудь самостоятельно (в конце концов, лень – это большой друг системного администратора, если ей пользоваться грамотно).
В итоге родилась система автоматической отчетности о производительности, которая успешно работает без внешнего вмешательства уже почти год, и о которой я расскажу далее.
Для успешного внедрения и запуска такой системы необходимы следующие условия:
Итак, представим, что все логи клиентского профайлинга со всех рабочих мест (ну или с их большинства) лежат в едином общедоступном месте.
Для анализа логов удобнее всего предварительно поместить их в специальную базу данных. Предварительно эту базу необходимо подготовить, согласно инструкции, представленной в Руководстве Администратора, в разделе «Мониторинг и профайлинг системы 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() подсвечены красным, т е их нет в системе? Что можно сделать?
Это нормально. Просто они не заведены в компоненте Функции, реально работать будут.
Авторизуйтесь, чтобы написать комментарий