Начало работы
Начинаем работу с установки приложения и получения лицензии. Приложение подключается к серверу и по указанному адресу электронной почты посылает код активации, который нужно ввести в приложении. Код введён — приложение готово к работе.
Следующий шаг — загрузка данных. В главном меню «Файл» нажмите «Загрузка журнала». В открывшемся окне выберите папку, в которой лежит журнал. Если нужно дополнительно ограничить загрузку, укажите окно дат, а также установите галочку, если нужно подгружать поле «План запроса» (если оно есть в журнале).
Отдельно следует отметить возможность фильтровать загрузку по папкам локации, которые настраиваются в самом файле настроек технологического журнала. В настройках это выглядит так:
<log location="C:\tj\SQL" history="1"> <log location="C:\tj\TLOCK" history="1">
Внутри архивного файла лога события будут храниться отдельно по указанным папкам. Фильтр по этим папкам помогает сильно ускорить загрузку, если вам нет необходимости загружать всё подряд. Например, вам нужно посмотреть транзакции, чтение данных и блокировки — вам не нужно для этого грузить события CONN, которые занимают большую часть журнала.
Далее нажмите «Загрузить». После загрузки будут рассчитаны индексы и дополнительные таблицы. Если вы прервёте загрузку, то для их расчёта нужно нажать кнопку «Рассчитать». Также эта кнопка сделает пересчёт уже рассчитанных.
Элементы главной формы
Главная форма приложения содержит несколько важных элементов.
В нижней части формы расположена главная таблица приложения BaseTable — это и есть сам журнал:
- в настройках формы можно настроить список полей, шрифты и выравнивание текста;
- контекстное меню позволяет создать из выделенных строк таблицу IdSet или выгрузить их в файл Excel;
- в колонках таблицы можно установить дополнительный отбор по значению.
Справа вверху — вертикальный индикатор распределения и панель маркеров с горизонтальным отображением группировки и представлением в виде графика баров. Это часть механизма распределения маркеров, о котором расскажу подробно ниже.
Слева — панель просмотра полей. Она разделена на две горизонтальные части, и в каждой до пяти вертикальных панелей, итого до десяти панелей. Эти панели нужны для отображения полей, которые вы хотите видеть отдельно и в полном объёме. Например, поле Context смотреть в таблице неудобно: кликнув по записи, вы увидите это поле в отдельном окне. Настройки формы позволяют настроить каждую панель индивидуально и в одной панели для разных типов событий задать своё поле. Например, по умолчанию показываем поле Context, но для события EXCP покажем поле Descr. Также можно установить регулярное выражение, которое сразу срежет лишнее.
Фильтр
Основным инструментом приложения является форма фильтра, которая открывается по кнопке «Фильтр» на главной форме.
Форма содержит две панели: левая — иерархическая таблица наборов, правая — содержание каждого из них. Она работает по тому же принципу, что и отбор в СКД, но в него добавлены регулярные выражения. В настройках формы есть возможность выбрать состав полей фильтра, чтобы не отображать весь список неиспользуемых полей. Если создать пустой набор без значений фильтра, будут отображаться все записи базы.
Фильтр работает так, что на этапе отбора создаётся таблица ID записей (кроме полного отбора). Это позволяет использовать этот фильтр в графиках и при использовании агента, при этом само условие уже не рассчитывается дважды: фильтрация происходит наложением таблицы идентификаторов. В приложении эта таблица называется «BaseFilter».
Для фильтрации данных также предусмотрены таблицы IdSet. Так же, как и «BaseFilter», это просто таблицы ID записей. Это удобно, потому что их можно хранить, строить по ним графики, передавать агенту в качестве параметра и получать результат работы агента в виде таких таблиц.
Менеджер таблиц
Для работы с таблицами в приложении предусмотрен менеджер таблиц. Его смысл в том, чтобы не записывать и не запоминать какие-то наборы записей где-то «на листочке», а простым кликом создавать их и передавать агенту или строить по ним графики.
Поддерживаются несколько типов таблиц:
- IdSet (BaseFilter — тот же тип). При клике по такой таблице она становится основным фильтром для главной таблицы и графиков: они моментально перестраиваются. Например, агент выдал вам такую таблицу как результат. Вы кликаете по ней, и таблица с графиками отображает её содержимое.
- Agg — это таблицы-агрегаты. В основном их создаёт агент для отчётности. Они открываются в специальной форме, в которой отображаются сам агрегат и его графическое представление в виде горизонтальных баров.
- WrkTab — это таблицы агентов для формирования промежуточных результатов их расчётов. Состав произвольный и определяется самим агентом. Их также можно открыть в отдельной форме и посмотреть содержимое, а также передать агенту как входной параметр.
Графики
В приложении есть несколько типов графиков. На панели быстрого доступа расположены три кнопки:
- 3D-график баров пользователей по выбранному фильтру покажет почасовую активность каждого пользователя;
- 3D-график баров маркеров по выбранному фильтру так же почасово покажет содержимое по маркерам, если маркеры уже распределены;
- 2D-график баров, общий по выбранному фильтру, так же почасово.
Диаграмма Ганта нужна для отображения событий TDEADLOCK и TTIMEOUT и связанных с ними событий SDBL. Она открывается по клику на конкретное событие и показывает ситуацию вокруг него.
Например, если кликнуть по событию TDEADLOCK, откроется форма, которая показывает само событие в виде флажка и связанные с ним события SDBL. Это пара: блокиратор (выжившая транзакция) и жертва (транзакция, которую система убила). Используются два цвета: голубой — rollback, песочный — commit.
Стоит обратить внимание, что блокиратор, который выжил в конкретной ситуации, может оказаться rollback, то есть сам стать жертвой в следующем инциденте. Такие ситуации часто идут каскадом. Если кликнуть в самой диаграмме, например по блокиратору, диаграмма перестроит события: покажет само это событие, его жертвы и его блокиратора, если они есть. Так, как по ступенькам, можно пройти весь каскад цепочки.
Похожая ситуация и с событиями TTIMEOUT. При клике по такому событию форма покажет его и все события SDBL, у которых ConnectID взят из поля WaitConnection и которые попали в окно времени таймаута. События группируются в потоки, и анализ становится нагляднее. Клик по событию SDBL также перестроит связку, и если это событие затронуло несколько таймаутов, отобразятся все они. Это не классический способ определять связки, но он оправдан, особенно когда в рабочей базе нет событий короче, например, одной секунды и в журнале есть не все события TLOCK.
Также можно построить диаграмму Ганта просто по таблице IdSet, то есть посмотреть, как лежат группы событий. У события при этом должна быть длительность. Этой возможностью лучше пользоваться аккуратно: если открыть диаграмму Ганта по набору из 100 млн записей, не факт, что вы дождётесь, пока она сформируется. Этот вариант нужен для заранее подготовленного набора. Ограничьте выборку фильтром или попросите агента собрать записи в определённом окне времени по определённым условиям, затем откройте Ганта и посмотрите, как события расположены относительно друг друга. Функция доступна из контекстного меню менеджера таблиц и из такого же меню в форме чата агента.
Механизм распределения маркеров
Основная цель распределения маркеров — соотнести конкретную запись с какой-то функциональностью и сгруппировать такие записи.
Группировка, например в ЦУП, по первой или последней строке либо целиком, во-первых, не отвечает на вопрос, к какой функциональности отнести запись. Во-вторых, очень близкие по смыслу контексты не группируются из-за различия текста хотя бы на один символ.
Сам контекст, как правило, имеет несколько уровней вложенности процедур и объектов метаданных, и однозначно соотнести его с одной функциональностью трудно. В зависимости от угла зрения это можно сделать по-разному. Для повседневного анализа и быстрого поиска аномальных отклонений в работе системы я пришёл к следующему:
Я присваиваю записи маркер. Как правило, это часть текста из поля. В приложении для этого есть два способа.
1. Регулярные выражения
С помощью регулярных выражений я привязываю контексты, которые можно одной формулой соотнести сразу с группой, например такие как внешние обработки, формы, длительные операции, HTTP-сервис, веб-сервис и т. д.
На странице загрузки я положу свои регулярные выражения: вы сможете подгрузить их из файла и увидеть, как это работает.
Уже эти несколько позиций перекрывают 50% всех записей по полю Context. Да, в таком виде мы не видим механизма внутри этих объектов, но видим, что запись относится к конкретному объекту метаданных, например к «Заказу клиента». Этого достаточно, чтобы сгруппировать эти записи. Если там будут отклонения, мы это увидим, и ничто не мешает нам разобрать эту группу подробнее.
Плюс работы с регулярными выражениями заключается в том, что процесс полностью автоматизирован: один раз создали выражение и дальше запускаете распределение списком.
2. Ручное распределение
Ручное распределение подразумевает другой подход: мы разбираем контексты по количеству или длительности событий от большего к меньшему, то есть самые значимые распределяем первыми.
Для работы с данной формой нужно немного наработать навык. Вы смотрите на контекст и видите ключевое слово, которое определяет всю запись. Ошибиться не страшно: даже если соотнесение неточное, отклонения на графике всё равно будут видны.
Пример ручного распределения. Контекст:
ОбщийМодуль.Вызов : ОбщийМодуль.ОбщегоНазначенияУТВызовСервера.Модуль.УстановитьСтатусДокументовТест_Расш ОбщийМодуль.ОбщегоНазначенияУТВызовСервера.Модуль : 12 : Результат = ПродолжитьВызов(МассивДокументов, НовыйСтатус, ДополнительныеПараметры); ОбщийМодуль.ОбщегоНазначенияУТВызовСервера.Модуль : 131 : Объект.Записать(?(Выборка.ЗаписьПроведением, РежимЗаписиДокумента.Проведение, РежимЗаписиДокумента.Запись)); Документ.ДвижениеПродукцииИМатериалов.МодульОбъекта : 355 : ПроведениеДокументов.ОбработкаПроведенияДокумента(ЭтотОбъект, Отказ); ОбщийМодуль.ПроведениеДокументов.Модуль : 246 : ПровестиДокумент(Документ, Отказ, ДопПараметры); ОбщийМодуль.ПроведениеДокументов.Модуль : 1748 : ТаблицыДляДвижений = ТаблицыДляДвижений(Документ, МенеджерДокумента, ДвижимыеРегистры, ДопПараметры); ОбщийМодуль.ПроведениеДокументов.Модуль : 2114 : ТаблицыДляДвижений = МенеджерДокумента.ДанныеДокументаДляПроведения(Документ, ДвижимыеРегистры, ДопПараметры); Документ.ДвижениеПродукцииИМатериалов.МодульМенеджера : 98 : Возврат ПроведениеДокументов.ИнициализироватьДанныеДокументаДляПроведения(Запрос, ТекстыЗапроса, ДопПараметры); ОбщийМодуль.ПроведениеДокументов.Модуль : 501 : ДанныеДокументаДляПроведения = ИнициализироватьТаблицыДляДвижений(Запрос, ОбщийМодуль.ПроведениеДокументов.Модуль : 1810 : Возврат ВыгрузитьРезультатыЗапросаПроведения(Запрос, ТекстыЗапроса); ОбщийМодуль.ПроведениеДокументов.Модуль : 1820 : Результаты = ОбщегоНазначенияУТ.ВыполнитьПакетЗапросов(Запрос, ТекстыЗапроса); ОбщийМодуль.ОбщегоНазначенияУТ.Модуль : 5475 : Результаты = Запрос.ВыполнитьПакет();
Когда смотришь на такой текст, глаза разбегаются, но это как раз простой вариант. Я соотношу его с «УстановитьСтатусДокументов». Важно взять именно подстроку из этого текста: система ищет записи по условию «Содержит».
Если вариантов контекста много, но в каждом есть подстрока «УстановитьСтатусДокументов», система привяжет эти записи к одному маркеру, и вы увидите агрегат по этому ключевому слову.
Если вы работаете с одними и теми же конфигурациями, ручное распределение не нужно повторять при каждой новой загрузке. Вы создаёте маркеры, они сохраняются в справочнике и выстраиваются в том же порядке, как вы их распределяли. При повторном распределении достаточно запустить его ещё раз: маркеры распределятся из справочника, где хранится сам маркер, его очередность и поле, по которому он распределяется. В системе может появиться что-то новое, и тогда ручное распределение покажет остаток, который можно дораспределить.
Сначала я распределял только поле Context, но позже добавил возможность распределять любое поле и делать это для разных полей. То есть можно установить фильтр на одном типе записей, распределить их по полю Context, затем поставить другой фильтр и продолжить по другому полю, и так далее.
У одной записи может быть только один маркер. Если запись уже связана с маркером, она больше не участвует в распределении, пока вы не удалите распределённые маркеры.
Механизм находится на вкладке «Маркеры» и включает четыре формы:
- Распределённые маркеры — то, что уже распределено. Это значит, что маркер рассчитан хотя бы для одной записи.
- Форма регулярных выражений. Здесь можно составить список выражений, сгруппировать их и отмечать к распределению целой группой.
- Справочник маркеров — маркеры, созданные ручным распределением. Они тоже группируются, и распределяются группой.
- Форма ручного распределения. В ней есть настраиваемые параметры:
- поле, по которому нужно распределить события;
- операция «Содержит» или «Равно»: «Содержит» — когда берём часть текста, «Равно» — когда берём содержимое целиком, например поле computerName;
- количество событий или их длительность при группировке.
Чтобы начать, выберите параметры и нажмите «Обновить». Получите поля, сгруппированные по полному тексту. Результат упорядочен по убыванию. В верхнем окне виден сам текст поля, например Context. Выделите в нём ключевое слово, подстроку, которая станет маркером, и нажмите «Добавить». Маркер появится в левой колонке. В этот момент из группировки уходят все записи, в которых есть эта подстрока: та группа, по которой вы распределяли, и все группы ниже, где подстрока тоже встречается. Поэтому ключ должен соотносить событие с этим маркером по смыслу.
Имейте в виду: распределение внутри формы на первом этапе виртуальное. Оно работает с группировками на форме и раскладывает данные в таблице этой формы. Реальное распределение произойдёт после нажатия на кнопку «Распределить». Группировка, например, 100 млн записей занимает много времени. При обновлении группировки рассчитаются один раз. Дальше не нужно после каждого маркера ждать нового распределения и пересчёта агрегата: система раскладывает маркеры по уже сгруппированным контекстам внутри формы. Результат тот же, но без ожидания обновления формы после каждого добавления.
Практическая польза формы регулярных выражений и справочника маркеров в том, что после загрузки новой базы связи теряются, но выражения и справочник уже заполнены. Достаточно запустить распределение по ним ещё раз, и маркеры заново привяжутся к новым записям. Регулярные выражения и справочник маркеров можно выгружать в файл и загружать из файла.
Важный момент: в каждой из форм распределения есть чекбокс «Полное». Истина означает, что распределение будет происходить без учёта установленного фильтра на главной форме. Ложь применит распределение только к записям, которые попадают в отбор.
Работа с агентами
Для работы с агентами есть основная форма, которую можно вынести на отдельный монитор. В ней три панели:
- Менеджер таблиц. Он повторяет возможности отдельной формы менеджера таблиц. В форме агента он нужен потому, что общение с агентом во многом идёт через таблицы.
- Список чатов. Здесь история чатов с агентом: можно открыть старый чат и отчёт в нём или продолжить работу.
- Сам чат с агентом.
В чате есть привычные «пузыри» и состояния работы агента. Агент настраивается отдельно: есть список агентов и форма настроек. В настройках выбираются модель, API-ключ и список подключаемых файлов. Туда можно положить дополнительную информацию, например файл настройки технологического журнала, чтобы модель понимала, какие события в журнале есть, а какие искать не стоит. Если стоят фильтры по длительности и типам событий, это помогает делать верные выводы. Туда же можно положить свой промпт о том, как агенту работать.
Из коробки у агента уже есть системный промпт: как работать с таблицами, какой состав полей, индексов и дополнительных таблиц есть в базе, какие события встречаются в технологическом журнале и как они связаны. Агент умеет читать базу и записывать таблицы, поэтому эти вещи ему объяснять не нужно. Можно сразу заниматься конкретной задачей.
При разборе инцидентов всего предусмотреть нельзя, и знания модели не всегда достаточны. Чуда от моделей ждать не стоит: даже сильные модели делают бестолковые шаги и просто тратят деньги. Агента лучше держать не за гуру, который знает и умеет всё, а за помощника, которого вы направляете. Давайте ему предельно ясные формулировки и просите вести расследование по шагам, которые описываете сами.
В приложении два режима работы агента. Режим «Аналитик» включён по умолчанию. Он нужен для задач, с которыми вы сталкиваетесь впервые, и для действий с базой, например когда просите собрать данные в таблицу. Модель выбирайте по сложности задачи. На практике дешёвые модели справляются не хуже дорогих.
Второй режим — агент-функция. Так я сам называю этот режим, по смыслу его работы. Здесь агент работает буквально как функция: шаги расписаны, входные параметры и результат определены, вы только запускаете его. Режим нужен для повторяющихся задач, методику которых вы уже нашли вместе с аналитиком. Для агента-функции тоже задаётся модель, лучше дешёвая: решение уже описано, и дешёвые модели с этим справляются. Дальше вы даёте, например, таблицу или другой параметр и ждёте результат. Действия при этом предсказуемы. Запускайте его, когда нужно разобрать конкретный паттерн.
Агенты-функции можно вкладывать друг в друга, без ограничения по числу уровней. Так собираются сложные сценарии. Например, одна функция нашла набор событий, а дальше нужно размотать цепочку от каждого из них. Имеет смысл пользоваться агентом-функцией только тогда, когда методика уже отработана: тогда конкретную ситуацию можно пройти быстро и одинаково.
Агент-функцию можно запустить прямо из списка агентов. Тогда она сразу в чате попросит параметры, которые в ней описаны. Можно и попросить аналитика собрать для неё параметры и запустить её, или запустить последовательность таких функций.
По итогам работы система формирует HTML-отчёт. В нём обязательные разделы: постановка задачи, факты, выводы. Отчёт можно выгрузить в PDF. Можно попросить агента создать итоговые таблицы IdSet и Agg. Рабочие таблицы он создаёт сам, и вы тоже можете попросить создать их на нужном шаге как промежуточный результат, на который он будет опираться. Содержимое этих таблиц можно посмотреть и поправить ход работы. Кто пишет отчёт, зависит от того, кого вы запустили. Если запущен аналитик, отчёт формирует он, даже когда данные внутри собрала функция. Если функция запущена прямо из списка, отчёт формирует она.
Несколько полезных функций, о которых нужно знать
Почти на каждой форме есть значок шестерёнки. Он открывает настройки формы: шрифты, состав полей и дополнительные настройки.
При запуске длительной операции после первой секунды открывается небольшое окно ожидания, и в заголовке формы идёт счёт времени. Когда операция заканчивается, время остаётся видимым до первого клика. Так видно, сколько шла операция, даже если вы за ней не следили.
На главной форме клик по бару на панели маркеров открывает в гриде записи, которые в этот бар входят. То же самое делает клик по вертикальному индикатору распределения. Так работает и любой график: клик по бару показывает его содержимое в основной таблице.
В заголовке главной формы показано число записей в основной таблице и «Основной фильтр», который выбран в текущий момент. Если вы кликнули по бару и отбор сузился до значений бара, но вы хотите вернуться к установленному фильтру, кликните по нему в заголовке. Основная таблица снова покажет отбор по BaseFilter или по IdSet, если вы им пользовались.
В менеджере таблиц выбор таблицы IdSet делает её основной таблицей отбора. Таблица BaseFilter там есть всегда, она не удаляется, и клик по ней возвращает настройки ручного фильтра.
В главной таблице можно сузить видимые записи по значениям полей. Заголовок такого поля подсвечивается жёлтым. Клик по заголовку снимает отбор по этому полю.
После фильтрации можно выделить часть записей или все сразу, создать таблицу IdSet по ним и передать её агенту для расследования.
Заключение
Я создавал это приложение как собственный инструмент, чтобы быстро и удобно разбирать инциденты и деградацию производительности в рабочей базе. Важной отличительной особенностью разбора журнала в рабочей базе является то, что список событий заведомо неполный, потому что события срезаны настройками. Само логирование технологического журнала является значимой нагрузкой, и вы не можете себе позволить включить полное логирование для повседневной работы в высоконагруженных системах.
В приложении есть форма обратной связи. В случае обнаружения багов или, например, не хватает полей, которые есть в вашем журнале, но нет в приложении, или есть идея функции, которую хотелось бы видеть. Буду рад, если напишете. На агента тоже можно пожаловаться. Возможно, с какими-то моделями ИИ могут возникнуть проблемы формата сообщений (все их попробовать у меня не было возможности).
По возможности буду выпускать обновления. Критические ошибки постараюсь разбирать оперативно.
Надеюсь приложение станет повседневным полезным помощником в вашей работе.