Простые регулярные выражения

11.04.20

База данных - HighLoad оптимизация

Шпаргалка к экзамену "Эксперт по технологическим вопросам".

Существует несколько хороших статей про регулярные выражения.

https://its.1c.ru/db/metod8dev#content:5927:hdoc (Статья на ИТС недавно обновилась)

//infostart.ru/public/693103/

Постараюсь написать проще и подробнее - как для себя. Для начинающих, которые уже прочитали Джеффри Фридл "Регулярные выражения" или Бен Форта "Регулярные выражения 10 минут на урок" и установили Cygwin64 GitBash с ресурса https://git-scm.com/download/win.

Предупреждение 1. При копировании примеров из статьи в bash могут возникнуть проблемы. Из-за этого выходит сообщение «Binary file (standard input) matches». Поэтому текстовые файлы примеров команд и фрагмент журнала приложу в архиве. Кто захочет – скачает.

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

Скрипт обработки ТЖ сильно зависит от настроек. Универсальных скриптов не бывает. Поэтому пара слов про ТЖ.

 
 Будем использовать такие настройки.

Длительность более 10 миллисекунд позволяет отсечь служебные запросы. Пользовательские запросы дольше. Данные журнала накапливаются за од      ин час. Это лучшая настройка поскольку собирать журнал можно только на диске сервера (если использовать сетевой диск – возможны дикие тормоза), а место на диске сервера очень дорогое.  Чтобы собирать журнал с нескольких серверов на свой рабочий компьютер, ежечасно запускайте помощью Планировщик заданий Windows командный файл *.bat, пример содержимого:

xcopy \\SERVERName1\F\*.* D:\$log$\*.* /S /E /Y

xcopy \\SERVERName2\F\*.* D:\$log$\*.* /S /E /Y

 
 Ниже примерный фрагмент ТЖ, каждая новая строка пронумерована чтобы обозначить конец строки

 

Задача 1. Подсчитать количество дедлоков (управляемые блокировки) за ночь с 00 по 06 часов

Выбираем содержимое файлов из подкаталогов текущего каталога cat rphost*/ *0[0-6].log |

Символы

Значение

rphost

Используем, что дедлок содержится только в логах rphost. Выбрать все файлы проще: cat */*.log

*

любое количество символов в имени файла. Вообще, любое количество символов в регулярных выражениях означается «.*», но создателей команды cat это не смущает.

/

Спуск к подкаталогам. Я бы удивился, если бы увидел привычный «\».

0[0-6]

Числа 00, 01,02,03,04,05,06. На каждый час создается свой файл

.log

Точка здесь означает точку. Расширение файла – log.

|

Нам всем привычны временные таблицы. Чтобы поместить результат запроса в аналог временной таблицы, ставим знак «|» (pipe, труба). Следующая команда использует этот результат.

Почти каждый запрос начинается с команды cat.

Чтобы выбрать строки, содержащие дедлок, нужно составить шаблон. Смотрим строка 1 файла ТЖ, записываем ^[0-9][0-9]:.{10,20}DEADLOCK.

Символы

Значение

^

Начало строки

[0-9]

один цифровой символ

:

двоеточие

.

означает любой символ

{10,20}

от 15 до 20 повторений предыдущего символа

DEADLOCK

должно быть написано большими буквами. Если у вас не дедлоков – считайте другое слово, например SDBL

Профессионалы применяют более сложные шаблоны начала строки – выбирайте сами. На мой взгляд, в шаблоне должно быть начало строки и расстояние от начала строки до DEADLOCK было ограничено. Иначе объем чтения сильно возрастает.

Чтобы выбрать все строки, содержащие шаблон – используем команду egrep. Следующая команда выведет все строки, подобные шаблону, на экран

cat */rphost*0[0-6].log | egrep ‘^[0-9][0-9]:.{10,20}DEADLOCK’

команда выведет количество.

cat */rphost*0[0-6].log | egrep ‘^[0-9][0-9]:.{10,20}DEADLOCK’ -c

Символы

Значение

(обязательно прописная), показывает количество строк. Без этой опции результат выйдет на экран. Обычно дедлоков немного, строки можно подсчитать визуально.

> имяфайла

Перенаправить вывод в файл

- -help

(два тире help). получить подсказку

 

Иногда можно не использовать cat:

egrep ‘^[0-9][0-9]:.{15,20}DEADLOCK’ –d recurse

Символы

Значение

–d recurse

Рекурсивный обход поддиректорий. При этом в результат может добавляться имя файла, которое содержит час и дату. профессионалы используют –r.

Можно задавать имя файла.

–H

Добавляет имя файла в результат.

-h

Подавляет вывод имени файла в результат

- - color

(два тире color) выделяет цветом шаблон поиска

 

Задача 2. Подсчитать количество взаимоблокировок СУБД

Количество взаимоблокировок СУБД считается примерно также. Нужно учитывать, что в ТЖ это событие EXCP с пояснением «Конфликт блокировок при выполнении транзакции».  (К сожалению, в примерном ТЖ управляемые блокировки.) Для вывода на экран используйте скрипт

egrep ‘^[0-9][0-9]:.{10,20}EXCP.*блокировок при выполнении транзакции’ -d recurse

Символы

Значение

.*

Несколько (или нисколько) любых символов. Сравните .+ или .{1,2}

 

Задача 3. Найти TLOCK жертвы (виновника) взаимоблокировки.

egrep –A2 ‘^[0-9][0-9]:.{15,20}DEADLOCK’ –d recurse

Символы

Значение

-A2

Две строки после строки, подобной шаблону. Есть похожие опции –B2, -C2

Если журнал настроен только по событиям TLOCK, TTIMEOUT, TDEADLOCK, то TLOCK жертвы должен быть следующим после TDEADLOCK.

В случае, если первый способ не подойдет, можно решить в два приема:

1. Найти строки, содержащие TDEADLOCK, запомнить время, connectID жертвы, пространство блокировок (Regions), измерения пространства блокировок (Здесь я не отображаю измерения, но их нужно сравнивать. Они обычно начинаются Fld). Выполняем

cat */*.log | egrep '^[0-9][0-9].{10,25}TDEADLOCK’, получаем

29:46.696046-0,TDEADLOCK,5,process=rphost,p:processName= processName,t:clientID=5008,t:applicationName=BackgroundJob,t:computerName= computerName,t:connectID=6520,SessionID=52328,Usr=.Регламентные задания,DeadlockConnectionIntersections='6520 6171 AccumRg10307.DIMS Exclusive Fld10308=44:8cbcf07d2b194ea349f50188353e0a15 Fld10309=32:80bb000c293fb1b711e5cef51b92cf25 Context='

2. По запомненным параметрам с учетом времени искать TLOCK жертвы.

Выполняем

cat */*.log | egrep –A1 '^29.{10,25}TLOCK.*connectID=6520.*Regions= AccumRg10307.DIMS', получаем две строки

29:47.259006-187992,TLOCK,4,process=rphost,p:processName= processName,t:clientID=5008,t:applicationName=BackgroundJob,t:computerName= computerName,t:connectID=6520,SessionID=52328,Usr=.Регламентные задания,Regions=AccumRg10307.DIMS,Locks='AccumRg10307.DIMS Exclusive  ,Context='

              ОбщийМодуль.МодульРегламентныхЗаданий.Модуль : 1350 : РегистрыСведений. ДокументыДляПерепроведения.ПерепровестиДокументы();

TLOCK виновника нужно искать раньше TDEADLOCK, по запомненным параметрам с учетом времени. В нашем случае connectID=6171

Задача 4. Найти топ-5 запросов с максимальной длительностью.

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

Команда egrep ищет внутри одной строки. Поэтому строки нужно «склеить» (убрать переход строки), фильтровать нужный контекст, длительность переместить на первое место, сортировать по длительности, выбрать первые 5 по длительности.

Для «склеивания» строк применим скрипт

cat *.log |\

awk -vORS= '{

if ($0~"^[0-9][0-9].{8,30}SDBL|DBMSSQL") { print "\n"$0;} \

else if ($0~"^[0-9][0-9].{8,30}Context") { print $0; } \

else if ($0~"^[0-9][0-9]") { print "\n"; } \

else { print "-"$0; }

}' |\

Символы

Значение

\

Здесь означает, что команда продолжается на следующей строке. Используем для наглядности.

awk ‘{}’

Это сложная  и мощная команда, но здесь для каждой строки она просто выводит данные в зависимости от условий

-vORS=

Парамeтры команды awk. Убирает непечатаемые символы.

If(){}

Если истинно условие() выполнить программу {}

$0

Текст обрабатываемой строки, без конца строки

$0~”шаблон1”

Текст обрабатываемой строки, без конца строки подобен шаблон1

SDBL|DBMSSQL

Символ | означает ИЛИ. Этот шаблон равен SDBL или DBMSSQL. Для наглядности можно заключать в скобки ().

«\n»

Начало строки в кавычках. Символ конца строки \$

print "\n"$0

Вывести начало строки, текст обрабатываемой строки, без конца строки

else if ($0~"^[0-9][0-9].{8,30}Context") { print $0; }

Если не выполняется первое условие, но в строке есть слово Context, строка приклеивается к предыдущей.

else if ($0~"^[0-9][0-9]") { print "\n"; } \

 

Если не выполняются предыдущие условия, но строка начинается с цифр, то вывести перевод строки. Эта команда заменяет на перевод строки все события кроме Context, SDBL и DBMSSQL

else { print "-"$0; }\

Если не выполняются предыдущие условия, «приклеить» строку к предыдущей, но перед ней вставить тире. Эта команда обрабатывает контекст который начинается с пробелов.

}' |\

Закрываются командные скобки команды awk, данные передаются через pipe следующей команде, которая будет на следующей строке.

 

Фильтруем нужный контекст командой egrep ',(DBMSSQL|SDBL),.*,Context=' |\

 
 Выполним этот скрипт на примерном фрагменте ТЖ, посмотрим результат

Применим команду awk -F',(DBMSSQL|SDBL),.*?(,Context=)' '{print $1 "-" $2}' |\

Символы

Значение

awk –F’’ ‘{}’

Команда обрабатывает строки, используя разделитель заданный –F’’. Например, для файла csv удобно использовать разделитель «;». Но в данном случае разделителем объявлен огромный шаблон, это приводит к тому, что он исчезает из строки.

.*?

Ленивый квантор. Выбирает минимальное число символов, чтобы строка подходила под шаблон.

$1

Первая колонка с учетом разделителя.

NF

Количество колонок

$NF

Последняя колонка

NS

Количество обработанных строк

 

 
 Посмотрим результат.

Применим команду awk -F'-' '{print $2, $NF}' | sort –rnb | head 5

Символы

Значение

-F'-'

Используем разделитель “-”

{print $2, $NF}

Вывести вторую и последнюю колонку контекста

sort –rnb

Сортировать

head 5

Вывести первые пять записей. Последние пять записей tail 5

Посмотрим результат. Первая колонка – длительность.

186991          РегистрСведений.МойРегистр.МодульМенеджера : 285 : ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);'

15947           РегистрСведений. МойРегистр.МодульМенеджера : 285 : ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);'

14975           РегистрСведений. МойРегистр.МодульМенеджера : 285 : ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);'

 

Итоговый скрипт:

time cat *.log \
| awk -vORS= '{if ($0~"^[0-9][0-9].{8,30}SDBL|DBMSSQL") \
{ print "\n"$0;} \
else if ($0~"^[0-9][0-9].{8,30}Context") { print $0; } \
else if ($0~"^[0-9][0-9]") { print "\n"; } \
else { print "-"$0; } \
}' \
| egrep ',(DBMSSQL|SDBL),.*,Context=' \
| awk -F',(DBMSSQL|SDBL),.*?(,Context=)' '{print $1 "-" $2}' \
| awk -F'-' '{print $2, $NF}' \
| sort –rnb \
| head 5

Вариант скрипта, если выводить без контекста, только имя файла и время:

time egrep '^[0-9][0-9].{8,30}(SDBL|DBMSSQL)' -d recurse \
| awk -F',' '{print $1}' \
| awk -F'-' '{print $2/1000000 " -длительность секунд. Имя файла:Минут:Секунд " $1}' \
| sort -rnb \
| head -n10

Вариант скрипта: ищем объектные чтения

time cat *.log \
|awk -vORS= '{ \
if ($0~"^[0-9][0-9].{8,30}(SDBL|DBMSSQL).{180,220}SELECT ID, Version, Marked, PredefinedID") \
{ print "\n"$0; } \
else if ($0~"^[0-9][0-9].{8,30}Context") { print $0; } \
else if ($0~"^[0-9][0-9]") { print "\n"; } \
else { print "-"$0; } \
}' \
| egrep '(SDBL|DBMSSQL).*?Context=' \
| awk -F'(SDBL|DBMSSQL).*?,Context=' '{print $1 "-" $2}' \
| awk -F'-' '{duration[$NF]+=$2; count[$NF]+=1;} \
END {for (i in count) {print "\n" duration[i] / 1000000 " секунд " count[i] " выполнений " duration[i] / (count[i]*1000000) " среднее время    " i}}' \
| sort -rnb \
| head -n20

Используем, что объектное чтение элемента справочника имеет вид: SELECT ID, Version, Marked, PredefinedID

Кстати, запросы получения данных в форме списка при включенном "Динамическом считывании" содержат "TOP 45". Чаще всего опцию "Динамическое считывание следует отключить.

Вариант скрипта: ищем наиболее частые ошибки

time cat *.log 
| awk -vORS= '{ \
if ($0~"^[0-9][0-9].{6,30},EXCP.*?Descr=") { print "\n"$0;} \
else if ($0~"^[0-9][0-9].{6,30},[A-D,F-Z]") { print "\n"; } \
else { print $0; } \
}' \
| egrep '^[0-9][0-9].{6,30}EXCP.*?Descr=' \
| awk -F'^.*Descr[^А-Я]*?' '{print $2;}' \
| awk -F'[A-Z]*?' '{count[$1]+=1;} \
END {for (i in count) {print "\n" count[i] " ошибок " i}}' \
| sort -rnb \
| head

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

 

Задача 5. Найти такие события, которые в сумме имеют максимальную длительность.

Например, система оповещения пользователей, подключается при старте программы командой «ПодключитьОбработчикОжидания(,60)» и потребляет серьезные ресурсы при большом количестве пользователей.

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

awk -F'-' '{count[$NF]+=$2;} END {for (i in count) {print "\n" "длительность " count[i] " контекст вызова " i}}' | sort -rnb | head -n5

Символы

Значение

count[$NF] +=$2

Определяем структуру, ключ – содержимое последнего столбца, значение – содержимое второго столбца, если в структуре ничего не было. Если такой ключ в структуре уже существовал - то сумма существующего и нового значений.

END {}

После обработки всех строк выполнить

for (i in count) {print "\n" count[i] " контекст вызова " i}

Вывести каждое значение структуры и ключ структуры

 

 
 Посмотрим результат.

 длительность 217913 контекст вызова             РегистрСведений.МойРегистр.МодульМенеджера : 285 : ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);' 

 

Итоговый скрипт

time cat *.log \
| awk -vORS= '{if ($0~"^[0-9][0-9].{8,30}SDBL|DBMSSQL") \
{ print "\n"$0;} \
else if ($0~"^[0-9][0-9].{8,30}Context") { print $0; } \
else if ($0~"^[0-9][0-9]") { print "\n"; } \
else { print "-"$0; } \
}' \
| egrep ',(DBMSSQL|SDBL),.*,Context=' \
| awk -F',(DBMSSQL|SDBL),.*?(,Context=)' '{print $1 "-" $2}' \
| awk -F'-' '{count[$NF]+=$2;} END {for (i in count) \
{print "\n" count[i]  "<--Длительность; Контекст-->" i}}' \
| sort -rnb \
| head -n20 \
| sed 's/[ \t]//g'

Задача 6. Найти TLOCK, которые ожидали

 

cat *.log | egrep 'TLOCK.*WaitConnections=[0-9]'

 

Задача 7. Найти все управляемые разделяемые блокировки

 

cat *.log | egrep 'TLOCK.*\bShared\b'

Символы

Значение

\b граница слова

 

Задача 8. Найти топ самых долгих транзакций

 

cat *.log | egrep 'SDBL.*Func=Commit' | gawk -F'-' '{print $2}' | sort -rnb | head

 

Задача 9. Посчитать количество событий в каждом файле

egrep '^[0-9][0-9].{8,30},' -H -d recurse |\

awk -F',' '{print $1 "log" $2}' |\

awk -F'log' '{ count[$1, $3]++ } END {for (i in count) {print count[i] "." i}}'

Символы

Значение

count[$1, $3]++

Добавляет счетчик в структуру вида 

Имя файла. Имя события

 

Результат работы - на экране в формате количество событий, имя файла, имя события. Пример:

2495.19032013.EXCP
2632.19031908.SDBL

Копируем в Excel (Calc), меню Данные - Текст по столбцам, сортируем, рисуем диаграмму )

Задача 10. Подсчитать определенный фрагмент по часам

cat *.* | egrep ',EXCP' -d recurse -c

 

Задача 11. Вывести в файл строки, которые не начинаются "(".

cat 19050709.log | egrep '^[^\(]' >> file1.log

Такое преобразование нужно, если в файл журнала попал текст Insert-запроса, который "раздувает" файл лога в разы.

Символы

Значение

'^[]' Начало строки ^ диапазон []
^\(

Не ^ знак скобки \(

Bash регулярные выражения Виктор Богачев Эксперт подготовка экзамен технологический журнал grep egrep awk gawk cat sed print printf echo sort

См. также

HighLoad оптимизация Технологический журнал Системный администратор Программист Бесплатно (free)

Обсудим поиск и разбор причин длительных серверных вызовов CALL, SCALL.

24.06.2024    5306    ivanov660    12    

56

HighLoad оптимизация Программист Платформа 1С v8.3 Бесплатно (free)

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

06.06.2024    9465    Evg-Lylyk    61    

44

HighLoad оптимизация Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Анализ простого плана запроса. Оптимизация нагрузки на ЦП сервера СУБД используя типовые индексы.

13.03.2024    5179    spyke    28    

49

HighLoad оптимизация Инструменты администратора БД Системный администратор Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Обработка для простого и удобного анализа настроек, нагрузки и проблем с SQL сервером с упором на использование оного для 1С. Анализ текущих запросов на sql, ожиданий, конвертация запроса в 1С и рекомендации, где может тормозить.

2 стартмани

15.02.2024    12592    250    ZAOSTG    83    

115

HighLoad оптимизация Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Встал вопрос: как быстро удалить строки из ТЗ? Рассмотрел пять вариантов реализации этой задачи. Сравнил их друг с другом на разных объёмах данных с разным процентом удаляемых строк. Также сравнил с выгрузкой с отбором по структуре.

09.01.2024    14551    doom2good    49    

71

HighLoad оптимизация Системный администратор Программист Бесплатно (free)

При переводе типовой конфигурации 1C ERP/УТ/КА на PostgreSQL придется вложить ресурсы в доработку и оптимизацию запросов. Расскажем, на что обратить внимание при потерях производительности и какие инструменты/подходы помогут расследовать проблемы после перехода.

20.11.2023    13769    ivanov660    6    

82

HighLoad оптимизация Бесплатно (free)

Казалось бы, КОРП-системы должны быть устойчивы, быстры и надёжны. Но, работая в рамках РКЛ, мы видим немного другую картину. Об основных болевых точках КОРП-систем и подходах к их решению пойдет речь в статье.

15.11.2023    7269    a.doroshkevich    22    

75
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. tormozit 7238 01.05.18 07:30 Сейчас в теме
Это точно для 1сников? =)
Уж очень сложно и неудобно.
TerveRus; +1 Ответить
2. vasilev2015 2725 01.05.18 09:12 Сейчас в теме
(1) Здравствуйте, Сергей ! Когда я смотрел другие статьи про регулярные выражения, где упор делается на использование perl, у меня возникал тот же вопрос. Постарался упростить ))).

Регулярные выражения примечательны тем, что позволяют парсить файлы технологического журнала общим объемом порядка 100 Гигабайт за время порядка 5 минут. Других таких инструментов нет. ЦУП медленнее на порядки.

P.S. Пользуюсь инструментами разработчика каждый день. Спасибо Вам.
user865160; +1 Ответить
3. tormozit 7238 01.05.18 13:14 Сейчас в теме
(2) Кажется обычно более разумно настроить фильтр записи журнала (logcfg.xml), чтобы он собирал то, что нужно. А не собирать в 10-100 раз больше логовов, чем нужно, неоправдано нагружая сервер и вынуждая себя пользоваться в разы менее удобными инструментами. В анализе техножурнала (ИР) непосредственно при чтении логов сейчас доступен только отбор по дате и он уже в большинстве случаев в разы ускоряет загрузку логов. Планирую туда же добавить фильтр по типу события (на этапе чтения). Он позволит еще ускорить логов в ряде случаев. Но конечно с выборкой описанной в статье анализ техножурнала (ИР) не сравнится по скорости.
starik-2005; ivanov660; Spartacus; +3 Ответить
4. vasilev2015 2725 01.05.18 13:26 Сейчас в теме
(3) Да, согласен. Поэтому позиционирую статью не как инструменты парсинга ТЖ, а как шпаргалку к экзамену. С нетерпением ждем улучшений ИР. :-))
5. palsergeich 01.05.18 20:37 Сейчас в теме
(3)
(2) Кажется обычно более разумно настроить фильтр записи журнала (logcfg.xml), чтобы он собирал то, что нужно. А не собирать в 10-100 раз больше логовов, чем нужно, неоправдано нагружая сервер и вынуждая себя пользоваться в разы менее удобными инструментами. В анализе техножурнала (ИР) непосредственно при чтении логов сейчас доступен только отбор по дате и он уже в большинстве случаев в разы ускоряет загрузку логов. Планирую туда же добавить фильтр по типу события (на этапе чтения). Он позволит еще ускорить логов в ряде случаев. Но конечно с выборкой описанной в статье анализ техножурнала (ИР) не сравнится по скорости.

Иногда, особенно когда не знаешь почему все работает медленно, надо собрать всё, убрать главные проблемы, и после этого уже работать с ограниченным ТЖ.
Ваш инструмент, я пользовался в том числе и им, в нем действительно удобно сводить данные, но для первичного анализа - regex, ибо в ИР к сожалению уже на 200+ тыс записях (точное число не скажу) вылетает, а клеить анализ за каждые 5 минут - не вариант.
Очень простой пример. На прошлой неделе разбирал один ТЖ, там, помимо тех проблем о которых я догадывался, за час из сервера приложений было больше полумиллиона вызовов НайтиПоКоду в цикле в регламентном задании. С фильтром на длительность эту проблему обнаружить не удастся. НайтиПоКоду вынесен за цикл, стало сразу лучше.
6. tormozit 7238 01.05.18 21:18 Сейчас в теме
(5) Частые и одновременно легкие запросы, создающие в сумме большую нагрузку, эффективнее всего ловить через новый инструмент "Статистика запросов MSSQL", который использует не требующую включения и не создающую нагрузки статистику по запросам из процедурного кэша MSSQL. После обнаружения такого запроса в статистике MSSQL человек уже настраивает фильтр в техножурнале по тексту оператора SQL (имеется соответствующая команда в окне "Конвертор текста СУБД") и далее анализирует собранный техножурнал для выявления отправляющих этот запрос контекстов встроенного языка. Сразу через техножурнал выявлять такие запросы в разы менее непродуктивно.
mvxyz; palsergeich; +2 Ответить
8. headMade 144 02.05.18 09:19 Сейчас в теме
(6) а что это за инструмент такой "Статистика запросов MSSQL". Где про него можно прочитать подробнее ?
9. tormozit 7238 02.05.18 13:07 Сейчас в теме
(8)
Статистика

Инструмент "Статистика по запросам MSSQL" появился в последней выпущенной версии и пока не имеет страницы с описанием. Она появится в ближайшее время. Как искать инструмент по названию, показано на картинке
Прикрепленные файлы:
Spartacus; CSiER; fancy; palsergeich; headMade; +5 Ответить
12. tormozit 7238 02.05.18 16:25 Сейчас в теме
(8) Добавил описание на основном сайте
26. Dach 383 04.05.18 10:17 Сейчас в теме
(12) Извините за оффтоп, но раз уж тут пошла речь...

Если в конфигурацию не встроена обработка ирАнализТехноЖурнала - отчет сбора статистики не запускается.

Имею ввиду из портативной версии ИР.

Пришлось найти все вхождения и закомментить:

ПриКомпоновкеРезультата(
......

АнализТехножурнала = Обработки.ирАнализТехножурнала.Создать();
29. tormozit 7238 04.05.18 20:10 Сейчас в теме
(26) Было бы классно увидеть багрепорт там, где все ожидают его увидеть и подробно оформленный. Проблему воспроизвел.
11. palsergeich 02.05.18 13:48 Сейчас в теме
7. tormozit 7238 01.05.18 21:27 Сейчас в теме
(5)
в ИР к сожалению уже на 200+ тыс записях (точное число не скажу) вылетает

1. Для предотвращения вылетов в 32-разрядном приложении можно использовать ограничитель по количеству загружаемых событий.
2. Можно использовать 64-разрядное клиентское приложение, где такой проблемы, полагаю, не должно быть (не проверял тщательно).
10. palsergeich 02.05.18 13:41 Сейчас в теме
(7)
в ИР к сожалению уже на 200+ тыс записях (точное число не скажу) вылетает

1. Для предотвращения вылетов в 32-разрядном приложении можно использовать ограничитель по количеству загружаемых событий.
2. Можно использовать 64-разрядное клиентское приложение, где такой проблемы, полагаю, не должно быть (не проверял тщательно).

1) Знаю, но даже 500 000 это мало. Пример совершенно реальной проблемы - я привел выше, можно бесконечно сидеть и делать оптимизацию в запросах дольше 0.1 секунды (чем ранее коллеги и занимались) пытаться оптимизировать, а толку будет мало.
2) Версию клиента посмотрю, может быть и правда проблема была в версии клиента у меня и x86 и x64 стоят, спасибо за наводку.
13. пользователь 02.05.18 20:07
Сообщение было скрыто модератором.
...
14. sanjakaiser 03.05.18 12:21 Сейчас в теме
Еще по этой теме есть вебинар на три часа от Виктора Богачева (экзаменатор, принимающий Эксперта). Гуглить например так: регулярные выражения Богачев
15. starik-2005 3090 03.05.18 12:32 Сейчас в теме
(0)
Вообще, любое количество символов в регулярных выражениях означается «.*», но создателей команды cat это не смущает.
Ну тут автор попутал маску файла и шаблон регулярного выражения. Автор, не нужно путать эти два в общем-то неодинаковых по синтаксису "языка".
[0-9][0-9]:.{15,20}
Ну как вариант, хотя, конечно, "\d{2}:.{,20}" на мой взгляд выглядит лаконичнее и нагляднее, да и вообще я сомневаюсь, что "{15,20}" даже в обрезанном варианте здесь нужно - достаточно использовать нежадный модификатор.

Если бы я не знал, что такое регулярные выражения, то вряд ли я с помощью данной статьи в них смог бы разобраться. Да, это очень простой и эффективный инструмент, просто необходимо разобраться в его элементах с несколькими кейсами. В этой статье кейсы есть, а теоретической части нет (да, она, конечно, выходит за рамки статьи, но т.к. занимает мало, то могли бы и включить).

По-сути, регулярные выражения очень хорошо позволяют извлекать текст из текста и модифицировать текст, что зачастую даже важнее поиска (по поводу простого сравнения с шаблоном по регулярке, то в 1С есть механизм XDTO, который может с этим справиться на любой поддерживаемой ОС без внешних компонент). А вот менять он не умеет. При том простой кейс замены даты, выгруженной в обычном формате 1С (ДД-ММ-ГГГГ чч:мм) можно поменять на XML-формат (YYYY-MM-DD) с помощью групп вот таким образом:
Шаблон поиска:
>(\d\d).(\d\d).(\d{4})( \d\d:\d\d)<

Шаблон замены:
>\3-\2-\1<

Т.е. определяются группы (то. что в скобках). Дальше эти группы по номеру используются в шаблоне замены, в итоге сначала выводится 3-я группа с годом, потом вторая, потом первая. Таких шаблончиков разобрать штук десять - и все, регулярки освоены. Дальше можно делать с ними все на свете.
17. vasilev2015 2725 03.05.18 12:46 Сейчас в теме
(15) Про регулярные выражения лучше прочитать в книге Джеффри Фридла «Регулярные выражения». В статье - приложение на практике, приближенное к экзамену.
18. starik-2005 3090 03.05.18 12:52 Сейчас в теме
(17)
Про регулярные выражения лучше прочитать в книге
Вы читали в книге? Как оно там? Сколько страничек? Если читали, то зачем пишите "[0-9]" вместо "\d"?

На мой взгляд, сначала лучше в ВИКИ читнуть, поиграться с notepad++, потом с grep (кстати, никогда не юзал egrep - чем он отличается?), потом с sed. В итоге за пару дней освоится основной функционал, которого уже будет для большинства задач за глаза. А дальше, если хочется стать экспертом не только в 1С, а еще и в регулярных выражениях, можно перейти к книгам (но я бы, лично, из книг порекомендовал "Бытие и Время", а то все хотят стать экспертами, а зачем - не знают )))
19. vasilev2015 2725 03.05.18 12:59 Сейчас в теме
(18) да, читал. Использую [0-9] вместо "\d" поскольку [0-9] работает там, где иногда не работает "\d". Egrep равносилен grep с ключом -e. Экспертом хочу стать по-приколу: могу себе позволить.
user865160; +1 Ответить
20. starik-2005 3090 03.05.18 16:17 Сейчас в теме
(19) в вики написано, что это одно и то же, только синтаксис регулярок упрощен, а для полного нужно заэкранировать спецсимволы.

Интересно стало, где "[0-9]" работает, а "\d" - нет... Сходу не смог ничего такого придумать. Подскажете?
21. leemuar 21 03.05.18 18:17 Сейчас в теме
(20) Насколько я помню \d не является метасимволом в posix, только в pcre. Шанс нарваться сегодня на утилиту, не умеющую pcre довольно мал.

За написание [0-9] вместо \d есть большой аргумент: удобочитаемость. Регулярки очень сложно читать. Помнить и расшифровывать все метасимволы достаточно неудобно. Использование простого диапазона повышает "понимаемость" регулярки.

А так, конечно, разницы в получаемом результате нет
Darklight; +1 Ответить
16. kudlach 13 03.05.18 12:42 Сейчас в теме
Извиняюсь, но термин "регулярные выражения" - это немного не к журналу регистрации изначально. Это к стыку мат.анализа , теории множеств и азам программирования.
Отдельная тема к экзаменам второго курса ВУЗа.
Думается мне, более правильно тема звучала бы "Применение регулярных выражений в решении задач таких-то"
22. mvxyz 326 03.05.18 21:47 Сейчас в теме
(16) Нормальное название статьи. Тем кто готовится к экзамену на эксперта сразу понятно о чем речь. Автору спасибо.
23. starik-2005 3090 03.05.18 22:28 Сейчас в теме
(22)
За написание [0-9] вместо \d есть большой аргумент: удобочитаемость. Регулярки очень сложно читать. Помнить и расшифровывать все метасимволы достаточно неудобно. Использование простого диапазона повышает "понимаемость" регулярки.
А мне, лично, кажется, что короче - в данном конкретном случае лучше. Я тут видел в XBRL ЦБ таких регулярок в шаблоны наклал, что страшно становится. Например, они написали полное выражения для корректного диапазона дат (при том для текстового элемента открытой оси). И вот этот огород в двести символов (а может и больше) определенным образом напрягает. Они там все феврали вырисовали с учетом високосных лет, например. И все это мельтешит через "|" и цифры.
24. sanjakaiser 04.05.18 07:31 Сейчас в теме
К сожалению, отредактировать предыдущий мой пост уже нельзя, вот видео Богачева

https://www.youtube.com/watch?v=pV8wgI8haf4.

(Не реклама) Автор дает представление о том, что такое регулярки, почему их надо использовать при анализе ТЖ, ну и на практике показывает, куда это запрягать + Это тот человек, который принимает у вас экзамен 1С:Эксперт
TerveRus; RustIG; Grigoripal; +3 Ответить
25. vasilev2015 2725 04.05.18 08:56 Сейчас в теме
(24) спасибо, полезная информация.
27. Dach 383 04.05.18 10:22 Сейчас в теме
Пользуясь случаем (простите за оффтоп еще раз), раз в ветке отметились мастера разбора ТЖ, хочу посоветоваться...

Есть большая БД, РИБ. Я верно понимаю, что если настраивать ТЖ, то это придется делать во всех узлах и потом выполнять некий сводный анализ? Втом числе, наверное и с помощью регулярок.

И еще момент... Мы встроили в конфу БСП и подсистему "Оценка производительности". Планируем выявить самые "нехорошие места" сначала ей, а потом, как мне кажется - можно уже и ТЖ более детально настроить... Может кто-то пользовался подсистемой? Поделитесь впечатлениями, плз.
28. vasilev2015 2725 04.05.18 12:32 Сейчас в теме
(27) я не очень мастер, но поскольку ветка моя - постараюсь ответить. Если у вас есть планы парсить, проводить анализ и искать узкие места в дочерних базах, то настраивайте там ТЖ. Если нет планов - "впрок" не делайте. Обязательно следите за местом, которое потребляет ТЖ.

Оценка производительности незаменима для общения с заказчиком: у вас апдекс был 0,6 а теперь 0,85 - извольте заплатить. Для себя апдекс тоже интересен: смотреть, что операторы проводят заказы по 59 секунд и удивляться их терпению. Или постфактум обосновать полезность приобретения нового raid. Менеджеры привыкли верить цифрам и красивым графикам.
30. lustin 05.05.18 02:19 Сейчас в теме
я конечно понимаю что регулярные выражения это просто - но точно не для 1С-ников. А вот ниже регулярки уже для них.

#Использовать verbal-expressions

// Проверим корректность формирования URL. Допустимые схемы - http[s] и ftp

ЭкранироватьПереданноеЗначение = Ложь;

ВербальноеВыражение = Новый ВербальноеВыражение()
    .НачалоСтроки()
    .Затем(
        Новый ВербальноеВыражение()
            .Найти("http")
            .МожетБыть("s")
            .Либо("ftp")
            .ВСтроку(),
        ЭкранироватьПереданноеЗначение
    )
    .Затем("://")
    .ЧтоНибудьНоНе(" ")
    .КонецСтроки();
    
ТекстРегулярногоВыражения = ВербальноеВыражение.ВСтроку();
Сообщить(ТекстРегулярногоВыражения); 

Показать



P.S. а вы никогда не задумывались над тем почему вместо изучения регулярок и сдачи их на экзамене просто не поменять формат журнала технологического. Сюрррреализм.
user865160; Romazan; Yakud3a; RustIG; olegtymko; +5 Ответить
31. starik-2005 3090 06.05.18 13:57 Сейчас в теме
(30)
P.S. а вы никогда не задумывались над тем почему вместо изучения регулярок и сдачи их на экзамене просто не поменять формат журнала технологического. Сюрррреализм.
А какой формат ТЖ поможет сделать его анализ без поиска текста? Даже интересно стало...
32. Darklight 33 10.04.20 10:41 Сейчас в теме
(31)Возможно, в формате JSON или YAML (как это сейчас достаточно популярно в других системах, формирующих логи - в основном в WEB; да и готовых шин данных и парсеров логов в в таком формате уже создано полно) - когда за парсинг строки будет отвечать уже встроенная библиотека разбора данного формата. Хотя это не отменяет того, что уже в разобранных "сообщениях" не нужно делать поиск по регуляркам в их полях. Ну даже если не по регуляркам - то просто на поиск по ключу(ам) для наложения фильтров отбора и ветвления. Впрочем, такой поиск уже куда проще описать даже с регулярками, чем парсить исходные строки Т/Ж. Но, скорость, разбора тут конечно немного снизится (из за нескольких прогонов одного и того же текста; не знаю насколько существенно - если не рассматривать алгоритм разбора на 1С - на 1С то явно заметно просядет).

Хотя я, вот, не считаю такое проседание производительности существенным недостатком. Ибо - разово можно и подождать. А для регулярной массовой обработки - лучше перейти на применение "специализированных" инструментов обработки больших объёмов текстовых данных - от ElasticSearch до, скажем, Яндекс ClickHouse (да даже MS SQLServer или PostgreSQL тут подойдут - если объёмы исходных данных не измеряются терабайтами в месяц) - куда логи проще загнать целиком - и уже там запросами их анализировать - особенно учитывая что загонять можно в реальном времени или в условно нерабочее время - о того скорость их парсинга не будет существенной. А вот анализировать будет куда удобнее и быстрее запросами (в расширенных диалектах этих СУБД), чем регулярными выражениями

P.S.
Прошу прощения за то, что написал этот ответ спустя 2 года после сообщения - я просветился за это время ;-) Тем более никто так и не ответил ранее :-( а статью эту сейчас подняли из небытия и её снова читают
33. starik-2005 3090 10.04.20 11:45 Сейчас в теме
(32) я про JSON на прошлой неделе (если не на этой) писал, что было бы не плохо, ибо: Elastic, jsonb postgres, ...
С другой стороны, сейчас ТЖ - 'это CSV, а для него есть уже кем-то написанные утилиты, которые преобразуют CSV в JSON.
С третьей стороны, есть мнение, что ТЖ - информация эфемерная, которую не нужно хранить постоянно, ибо завтра код поменялся и производительность просела в другом месте. Хранить это нет никакого смысла после того, как произведен анализ, а уж после найденного решения и подавно. Поэтому нужен формат, который бы максимально просто подвергался исследованию, а тут CSV уже действительно без всех этих парсеров на awk со сложной для обычного админа структурой слабо подходит для исследования.
34. Darklight 33 10.04.20 12:11 Сейчас в теме
(33)Да - самописные инструменты парсинга и преобразования текущего формата Т/Ж есть - я не спорю, просто это всё лишнее время на конвертацию, посему и написал, что не вижу в этом проблем по производительности - на больших объёмах куда важнее наладить эффективный сбор и консолидацию логов (и их эффективное хранение) - чем чахнуть над повышением эффективности парсинга и сложных регулярках. Вот только на экзамене по эксперту пока ещё требуют чтобы испытуемые непременно умели чахнуть над регулярками. Впрочем, изучить их конечно надо. Как и некоторые юниксовые утилиты - перекачевавшие и в windows по разбору текстовых файлов. И это действительно может быть полезно при выездном анализе производительности такими специалистами. Но к реальной стационарной практике анализа Т/Ж это имеет мало общего. Тут применяются совсем иные инструменты. Куда лучше - запихнуть лог в СУБД разными готовыми утилитами (ну или анализировать его налету запросами а-ля SQL при помощи, так же, имеющихся самописных утилит), чем парсить его сложными регулярками (учитывая что формат лога Т/Ж к парсингу регулярками не особо благоволит).

Но всё же, мировая тенденция сейчас - это формирование логово в формате JSON (тенденция не значит правило), и хорошо было бы компании 1С всё-таки добавить поддержку этого формата тоже (пусть в cfg файле бы это настраивалось - CSV или JSON, JSONB, YAML), а если бы ещё можно было бы настроить сразу трансляцию в сервис (WEB, HTTP, в т.ч. c указанием формата преобразования исходного сообщения - ну это я про возможности FileBeat намекаю только со встроенной поддержкой в платформу) или в БД (по заданной настройке подключения и формату запроса на вставку) - то вообще было бы очень круто!
Ну и стыдно должно быть - когда в продукте до сих пор нет встроенного средства хотя бы примитивного разбора а и анализа логов Т/Ж - для как раз выездных случаев разбора специалистами - когда нет возможности поднять более мощную инфраструктуру по их разбору и анализу во внешних программах (в том числе, упомянутых мной выше).

А по поводу хранения - зачастую даже в изменчивой природе конфигураций и, как следствие, данных в логах, имеет смысл хранить логи некоторое время - чтобы иметь возможность делать кросс-анализ (как было и как стало). Да и в крупных компаниях даже за сутки объёмы логово могут быть достаточно велики - чтобы сразу направлять их в условно "колоночную" СУБД, чтобы сократить занимаемое ими место и повысить скорость анализа.
Ну и зачастую, лучше писать в логи информации побольше (подетальнее) - чтобы было что потом анализировать (пусть это и снижает производительность сервера 1С - SSD тут в помощь). Просто делать это можно лишь периодически, хотя можно и постоянно - это уже зависит от того, как грамотно этими логами смогут потом распорядиться специалисты
35. starik-2005 3090 10.04.20 13:57 Сейчас в теме
(34) Про JSON я тут как раз не спорю, а идея передавать это сразу чем-нибудь через HTTP - просто бомба, ибо сэкономила бы кучу времени и средств для доставки данных в целевую систему анализа.

С другой стороны, у 1С есть тот же APDEX, который бы уже давно нужно встроить в платформу, чтобы она сама эту информацию о времени записи документа, открытии формы, проведении и прочем - фактически выбранным событиям - записывала в идеале в очередь или куда там (с настраиваемым интерфейсом). Я даже на С/Питоне/Прочем когда разрабатываю приложения, то периодически озабочиваюсь регистрацией времени для тех или иных вызовов (хотя там, слава богу, с профилированием и утилитами для этого и так проблем нет).

И вот исходя из показателей APDEX следует в идеале запускать механизм мониторинга в автоматическом режиме, дальше уже собирается ТЖ для соответствующих объектов, по которым произошла просадка APDEX, и уже готовый отчет с первичным анализом должен прилететь на хелп-деск или куда там процесс маршрутизирован в организации. Ну и, вообще в идеале, к нему должны цепляться данные о графике регламентных работ, которые производятся в интервал просадки, если они есть. А чтобы были именно они, то все регламенты должны быть "бюрократически" согласованы и акцептованы у всех ключевых стейкхолдеров.
Darklight; +1 Ответить
36. Darklight 33 10.04.20 15:26 Сейчас в теме
(35)Полностью разделяю Ваши взгляды на эту тему
37. check2 380 11.04.20 20:41 Сейчас в теме
Регулярные выражение это отлично, но не в этом сложность ИМХО. Их достаточно легко освоить. Проблема в другом в "№;*;%:№;ом количестве параметров для команд perl, sed, grep, awk. Мало того, эти параметры различаются в bash Linux и MIGW64. Да и синтаксис grep не совсем соответствует спецификации регулярки в Википедии. Например у меня было не понимание - зачем соединять строки в одну чтобы искать то что нужно? Ведь есть модификатор (?s) Оказывается, ни в одном варианте grep или egrep этот модификатор не поддерживается. Ну и в чистом виде поиска и вытаскивания выражений в скобках (some expression) и подстановка их в другой шаблон как в notepad++ нет ни в одной из перечисленных команд выше. Авторы Морозов и другие зачем то предлагают заменять переносы строк через perl, хотя достаточно tr. А и ещё... \w+ для русских идентификаторов не работает. НИКОГДА. Только [А-Яа-я]{1,}. В общем даже зная регулярки по спецификации как в википедии (наиболее полно реализованы в notepad++ и, спасибо разработчикам Эклипса в EDT НО \w+ тоже не пашет в EDT).
И каждый раз набрав регулярное выражение вспоминаю стишок.
Стою на асфальте я в лыжи обутый
То ли лыжи не едут, то ли я ?*%;*№*тый

Есть и ещё один важный момент. Я начал плотно работать с регулярными выражениями не так давно - года 3-4 назад. Вот эти последовательности cat rphost*/*.log | perl -n -e 'if (/^\d\d:\d\d\.\d+/) {$event =~ s/.\n/<line>/g; print $event."\n"; $event = "";} $event .= $_; END{print $event};' | perl -pe 's/\xef\xbb\xbf//g' | grep -P "SDBL.*Func=(Commit|Rollback)Transaction.*Context" | perl -pe 's/^\d+:\d+.\d+-//g' | perl -pe 's/,SDBL,.*Context.*<line>[ \t]+/,Context=/g' | perl -pe 's/,SDBL,.*Context=/,Context=/g' | sed 's/<line>//g' | head - бесполезно заучивать если у вас нет записной книжки под рукой. Моск не дом советов. Мой не запоминает. Проще коран выучить не зная арабского.
Только понимание каждой из команд и ежедневное использование позволят "с лёгкостью" пропарсить ТЖ. Заметил - 3 дня не использовал и уже забыл опции для perl чтобы заменить шило на мыло, вот не помню чтоб поставить между perl и 's/мыло/шило/g'. И начинается: --help а дальше почти перебор. Потому что букв две: -pe.
38. vasilev2015 2725 11.04.20 23:07 Сейчас в теме
(37) Здравствуйте !

у меня в общем, такие же ощущения, поэтому я хочу создать библиотеку скриптов Bash для парсинга ТЖ. И закрыть этот вопрос. Посмотрите пожалуйста другие мои статьи, например https://infostart.ru/public/1217031/. Буду рад любой конструктивной критике.
39. check2 380 12.04.20 14:57 Сейчас в теме
(38) Николай, я не сколько не сомневаюсь что готовые фрагменты анализа ТЖ за$bash'енные в своё время и опубликованные здесь - реально круты :) Но, Саша (М) говорил так. Прихали на секретный завод. Интернета нет. Телефон отобрали на входе. Нет ничего, ТЖ, голые руки - и bash. Вот как хочешь - так и $bash :). Поэтому всё что выше было - это не критика, а лишь призыв к пониманию, что если не будет доступа к копипасту - выручат лишь глубокие знания и понимания команд bash. Статьи посмотрел, они будут полезны при самостоятельном разборе, чтобы в голове отложилось "что вот ещё так можно" но заучивать и копипастить их, увы, будет бесполезно (по крайней мере для меня). У меня был случай (года 2 назад), который описывал Александр М. У меня был телефон, и о чудо даже работал интернет на нём! Я раз 5 перебивал строчки с мобилы на клаве компа. И всё безнадёжно - не вероятно неудобно, я терял строку, ошибался. Только понимание, только хардкор.
40. Hatson 536 09.10.20 11:48 Сейчас в теме
Забавная вещь (точно присутствует на платформе 8.3.13.1644)

Объектное чтение

Для документа:
SELECT ID,Version,Marked,Date_Time,NumberPrefix,Number,Posted,

Для справочника:
SELECT ID, Version, Marked, PredefinedID, ParentID, Code, Description,

Обратите внимание на наличие пробелов ))) в документе первые поля идут без пробелов, а в справочнике - с пробелами! Возможно в других объектах тоже присутствуют подобные артефакты.

Будьте внимательны при установке фильтров в logcfg.xml и разборе ТЖ
41. пользователь 27.11.20 11:02
Сообщение было скрыто модератором.
...
Оставьте свое сообщение