ALT Linux Team development discussions
 help / color / mirror / Atom feed
* [devel] I: утилита logoved-report для обработки логов. 1-введение.
@ 2018-09-21 17:33 Igor Vlasenko
  2018-09-21 17:52 ` Igor Vlasenko
  2019-06-25  8:36 ` [devel] I: утилита logoved-report для обработки логов. 1-введение Michael Shigorin
  0 siblings, 2 replies; 6+ messages in thread
From: Igor Vlasenko @ 2018-09-21 17:33 UTC (permalink / raw)
  To: devel

Уважаемые коллеги, 

Предлагаю вашему вниманию утилиту logoved-report
для обработки логов неудавшихся сборок.

Принцип работы:
утилита создает папку отчета (Уважаемые коллеги, 

Предлагаю вашему вниманию утилиту logoved-report
для обработки логов неудавшихся сборок.

Принцип работы:
утилита создает папку отчета (./LOGS) с подпапками,
внутри которых линки на логи с однотипной ошибкой,
полезная статистика, а также входной скрипт
для утилиты автопочинки пакетов logoved-batchfix.

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

Сейчас применять эту утилиту стоит на объемах от 20 failed лог файлов,
(а в будущем, в расчете на то, что база Логовед будет только расти,
а с функцией автопочинки пакетов - то будет стоить попробовать и от 5-10 файлов)
а уже на объемах от 100-200 failed лог файлов без нее как без рук.

Утилита рассчитана на тех наших героев, которые разбирают
beehive логи неудавшейся пересборки (FTBS: Fails To Build From Source)
репозиториев Sisyphus, и тех дважды героев, которые смотрят в
FTBS бранча, для выпускающих репозитории для дополнительных
архитектур, и для делающих NMU/пересборки с большим числом
затронутых пакетов.

Самым крупным пользователем и активным контрибьютером, естественно,
буду я сам - в autoimports объемы уже сейчас захлестывают за тысячи.

Я решил сначала выпустить релиз в виде git репозитория,
а не в виде пакета в Сизифе.
Выложив в Сизиф, пришлось бы слишком часто слать обновления,
так как сейчас база в состоянии активного наполнения.
Кроме того, пользователям возможно понадобится дополнять
базу своими образцами сообщений о проблемах,
и внести запись в базу в git под рукой удобнее.

Так как данный пост у меня получился слишком длинным,
более 20.000 знаков, то для рассылки разбил
его на 3 части:

* Введение (эта часть)
* Установка и работа
* Правила Логовед.
OGS) с подпапками,
внутри которых линки на логи с однотипной ошибкой,
полезная статистика, а также входной скрипт
для утилиты автопочинки пакетов logoved-batchfix.

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

Сейчас применять эту утилиту стоит на объемах от 20 failed лог файлов,
(а в будущем, в расчете на то, что база Логовед будет только расти,
а с функцией автопочинки пакетов - то будет стоить попробовать и от 5-10 файлов)
а уже на объемах от 100-200 failed лог файлов без нее как без рук.

Утилита рассчитана на тех наших героев, которые разбирают
beehive логи неудавшейся пересборки (FTBS: Fails To Build From Source)
репозиториев Sisyphus, и тех дважды героев, которые смотрят в
FTBS бранча, для выпускающих репозитории для дополнительных
архитектур, и для делающих NMU/пересборки с большим числом
затронутых пакетов.

Самым крупным пользователем и активным контрибьютером, естественно,
буду я сам - в autoimports объемы уже сейчас захлестывают за тысячи.

Я решил сначала выпустить релиз в виде git репозитория,
а не в виде пакета в Сизифе.
Выложив в Сизиф, пришлось бы слишком часто слать обновления,
так как сейчас база в состоянии активного наполнения.
Кроме того, пользователям возможно понадобится дополнять
базу своими образцами сообщений о проблемах,
и внести запись в базу в git под рукой удобнее.

Так как данный пост у меня получился слишком длинным,
более 20.000 знаков, то для рассылки разбил
его на 3 части:

* Введение (эта часть)
* Установка и работа
* Правила Логовед.

-- 

I V


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [devel] I: утилита logoved-report для обработки логов. 2-Установка и работа
@ 2018-09-21 17:34     ` Igor Vlasenko
  0 siblings, 0 replies; 6+ messages in thread
From: Igor Vlasenko @ 2018-09-21 17:34 UTC (permalink / raw)
  To: devel

Установка и работа.

1. Установка.
 git clone git://git.altlinux.org/people/viy/packages/logoved.git logoved.git
для работы нужно установить noarch пакет perl-Logoved-Stream из Сизифа.

2. Работа с утилитой на примере beehive.

Переходим в склонированный logoved.git.
Копируем себе beehive-logs
 rsync -avp --delete-after git.altlinux.org::beehive-logs/Sisyphus-x86_64/latest/error .

2.1 Запускаем утилиту.
 time ./logoved-report -v error/*
так как в beehive более 500 логов, запускаем с опцией -v,
чтобы не скучать, следя за сообщениями
[...]
parsing error/zoneminder-1.30.4-alt3.S1 ...
parsing error/zrtpcpp-2.3.4-alt2.1 ...  
./logoved-report -v error/*  206,93s user 3,37s system 99% cpu 3:32,32 total

три минуты, и все 500+ логов разобраны.

Замечание.
Таким образом мы обрабатываем все логи, которые есть в beehive.
Если же есть желание разобрать только свои логи, (пакетов, где leader <ваш логин>)
то поможет perl-ALTLinux-ACL >= 0.20 .
команда в таком случае будет иметь вид
 time ./logoved-report `ls error/* | altlinux-acl-filter-list-by-access --nvr --leader --user <ваш логин>`
сокращенно
 time ./logoved-report `ls error/* | altlinux-acl-filter-list-by-access --nvr -l -u <ваш логин>`

2.2 Результат запуска.

Итак, после запуска ./logoved-report
в текущем каталоге появилась папка LOGS
а в ней файл

00FIXSCRIPT

и большое количество папок

apt-E-broken
apt-E-ghost
apt-E-package-not-found
apt-E-version-not-found
brp-alt-028-check_contents
brp-alt-032-compres-man-page-broken-reference
brp-alt-verify-elf-error
build-compile-error
build-Werror
check-failed
conf-automake-version
conf-c++
conf-c-compiler
conf-cmake-configure-failed
conf-configure-error
conf-configure-error-C-compiler-cant-create
conf-configure-error-fortran-dont-compile
conf-gir-vala
conf-pkgconfig
[...]
и т.д.

Пройдемся по подпапкам.
В каждой папке собраны символические ссылки (опция по умолчанию)
на лог файлы с ошибкой одного типа,
а также служебные файлы, такие, как 00statistics.

К примеру:

$ ls apt-E-broken 
00statistics
gnustep-FortyTwo-0.2.0-alt4
gnustep-BDB-0.2.1-alt4
libctl-3.2.2-alt1_3
skytools-2.1.13-alt1

$ cat apt-E-broken/00statistics 
E: Broken packages:
  2: Package perl-devel has broken dep on libdb4-devel
  1: Package guile22-devel has broken dep on guile18-devel
  1: Package postgresql9.6-server has broken dep on postgresql9.6

ls apt-E-package-not-found|wc -l
36

$ cat apt-E-package-not-found/00statistics 
E: Невозможно найти пакет:
  5: gnustep-Etoile-DocGenerator
  5: gdk-pixbuf-devel
  4: python-module-setuptools-tests
[...]
  1: kdepim-devel

и т. д.

Разбивка по подпапкам выполняется по правилам, хранящимся
в базе Логовед. База хранится рядом с logoved-report,
в подпапке db:

$ ls -1 db/
apt
brp-alt
build
check
[...]

$ ls -1 db/apt
00default
E-broken.logoved
E-conflict.logoved
E-ghost.logoved
E-package-not-found.logoved
E-version-not-found.logoved

В базе Логовед хранятся правила Логовед
(в файлах с расширением .logoved)
и значения по умолчанию в файлах 00default.

Каждый файл .logoved содержит правило,
по которому можно выделить внутри лог файла некоторое сообщение об ошибке.
Чтобы узнать, какие правила logoved сработали на лог файл и на что именно,
можно воспользоваться утилитой logoved-grep (в том же git):

$ ./logoved-grep LOGS/apt-E-package-not-found/xmds2-2.2.3-alt1 
LOGS0/apt-E-package-not-found/xmds2-2.2.3-alt1 matches apt::E-package-not-found[error] in line 405:
E: Couldn't find package python-module-cheetah

Легко догадаться, что подпапка LOGS/apt-E-broken
порождена правилом db/apt/E-broken.logoved,
подпапка LOGS/apt-E-package-not-found
порождена правилом db/apt/E-package-not-found.logoved,
и т. д.

Пример правила Логовед.
$ cat db/apt/E-package-not-found.logoved 

# E: Couldn't find package libtau-common
PATTERN=^E: Couldn't find package (\S+)
PATTERN=^E: Невозможно найти пакет (\S+)
STATISTICS=%{GROUP:1}
STATISTICS_HEADER=E: Невозможно найти пакет:


Кроме подпапок, порожденных правилами, в LOGS/
находятся "служебные" подпапки отчета Логовед,
 LOGOVED-not-matched
 LOGOVED-overcome
 LOGOVED-fixable

В папке LOGOVED-not-matched собраны ссылки на
"нераспознанные" лог файлы, для которых ни одно правило
логовед не сработало. Если увидите в этой папке повторяющиеся
ошибки, стоит создать для них новое правило логовед.

Если сообщение об ошибке фатальное, то после сообщения об ошибке
соответствующий этап сборки должен в итоге аварийно завершиться.
Однако это бывает не всегда.

В папке LOGOVED-overcome собраны и разложены по соответствующим подпапкам
ошибки, которые вроде бы были преодолены на соответствующем этапе сборки,
т.е. они встретилсь в секции, к примеру, %build,
тем не менее сборка пошла дальше, "преодолела" (overcome)
эту ошибку и в итоге упала, к примеру, на %files,
как в примере

$ ./logoved-grep error/ftimes-3.10.0-alt2
error/ftimes-3.10.0-alt2 matches run::command-not-found::other[success] in line 254:
/bin/sh: line 1: pod2html: command not found
error/ftimes-3.10.0-alt2 matches ld::DSO-missing[success] in line 698:
collect2: error: ld returned 1 exit status
error/ftimes-3.10.0-alt2 matches ld::DSO-missing[success] in line 755:
collect2: error: ld returned 1 exit status
error/ftimes-3.10.0-alt2 matches ld::DSO-missing[success] in line 817:
collect2: error: ld returned 1 exit status
error/ftimes-3.10.0-alt2 matches perl::cant-locate-in-inc[success] in line 906:
Can't locate Digest/SHA1.pm in @INC (you may need to install the Digest::SHA1 module) (@INC contains: /usr/local/lib64/perl/5.26 /usr/local/share/perl/5.26 /usr/lib64/perl5 /usr/share/perl5 /usr/lib64/perl5 /usr/share/perl5 /etc/perl5 /usr/lib/perl5/vendor_perl .) at ../../../../../utils/tree_builder line 158.
error/ftimes-3.10.0-alt2 matches rpmbuild-error::file-not-found-by-glob[error] in line 952:
    File not found by glob: /usr/src/tmp/ftimes-buildroot/usr/bin/*

Причины для такого поведения могут быть разные. От кривого Makefile, который
не выпустил ошибку наружу, до безвредных сотрясений воздуха.
В любом случае, разбираться надо более тщательно, поэтому они выделены
внутрь отдельной подпапки LOGOVED-overcome.

Подпапка LOGOVED-fixable сейчас дополнительно содержит ссылки на логи,
для которых сгенерировано автоисправление. При этом эти же каталоги
и ссылки содержатся и обычным порядком в LOGS/.
Это, возможно, временное поведение. В зависимости от опций командной
строки LOGOVED-fixable либо не будет создаваться вообще (все чиним руками)
либо, логи, там упомянутые, будут удаляться из других папок в LOGS/,
чтобы разделить логи, которые скормим роботу от логов, которые будем чинить руками.

Сгенерированное автоисправление представляет собой файл LOGS/00FIXSCRIPT.

wc -l 00FIXSCRIPT
42

Т.е. из 500+ пакетов beehive робот попытался бы починить сборку 42.
00FIXSCRIPT представляет собой таблицу
<имя srpm,обязательно><tab><имя srpm,опционально><tab>команда на починку

Пример:

head 00FIXSCRIPT
acct	acct-6.6.1-alt1	buildrequires --add makeinfo
bacula7	bacula7-7.4.7-alt3.S1	buildrequires --add /proc
bacula	bacula-5.2.13-alt11	buildrequires --add /proc
bacula	bacula-5.2.13-alt11	sourcedep --add-devel-lib gssapi_krb5
cairo-dock-plugins	cairo-dock-plugins-3.4.1-alt10.S1	buildrequires --add pkgconfig(libdrm)
cairo-dock-plugins	cairo-dock-plugins-3.4.1-alt10.S1	buildrequires --add python2.7(multiprocessing)
chromium	chromium-69.0.3497.81-alt1	buildrequires --add python2.7(multiprocessing)
clisp	clisp-2.48-alt1.qa1	buildrequires --add groff-ps
compiz	compiz-0.9.13.1-alt1	buildrequires --add pkgconfig(libdrm)
emacs-chess	emacs-chess-2.0-alt5.b6.qa1	sourcedep --add-path makeinfo
emacs-elib	emacs-elib-1.0-alt8	sourcedep --add-path makeinfo
[...]

00FIXSCRIPT -- это скрипт для утилиты logoved-batchfix,
которая пока в разработке. Я не включал ее в этот
релиз, так как утилита пока не поддерживает работу с gear репозиториями,
но с src.srpm она уже успешно работает, и я ей активно пользуюсь
в autoimports/fcimport, autoimports/mgaimport и т. д.

Пример запуска:

$ cd ../logoved.git
$ time ./logoved-report fcimport-aupd/TASK.BAD   
./logoved-report fcimport-aupd/TASK.BAD  27,41s user 1,19s system 93% cpu 30,593 total

$ cd ../logoved-batchfix.git
$ ./logoved-batchfix --batch ../logoved.git/LOGS/00FIXSCRIPT --srpmdir ../fcimport.git/OUT
Записан: OUT.FIXED/FlightGear-Atlas-0.5.0-alt1_0.47.cvs20141002.src.rpm
Записан: OUT.FIXED/avr-gdb-8.1-alt1_2.src.rpm
Записан: OUT.FIXED/boxes-1.1.1-alt1_13.src.rpm
[...]
Записан: OUT.FIXED/rwall-0.17-alt1_53.src.rpm
Записан: OUT.FIXED/sshuttle-0.78.4-alt1_5.src.rpm
Записан: OUT.FIXED/steadyflow-0.2.0-alt1_4.src.rpm
(36 пакетов)

Замечание.
По умолчанию в ./logoved-report включен --flat mode.
Есть еще nested mode, который включается опцией --nested.

flat mode хорош для десктопа и больших экранов.
В nested mode ./logoved-report переводит путь в базе Логовед
к файлу правил в подкаталоги.

ls LOGS/
00FIXSCRIPT
error
fixable
not-matched
overcome

LOGS/
  error/
    apt/
      E-package-not-found/
      E-ghost/
      E-version-not-found/
      E-broken/
      ...

Во flat mode цепочки подкаталогов 2-го уровня распрямляются
в один каталог, (заменяем в пути '/' на '-')
каталог 1-го уровня error/ убирается, а его содержимое переносится на 1-й уровень,
остальные каталоги 1-го уровня получают приставку 'LOGOVED-'.


-- 

I V


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [devel] I: утилита logoved-report для обработки логов. 3-Правила Логовед.
@ 2018-09-21 17:49   ` Igor Vlasenko
  2018-09-21 17:34     ` [devel] I: утилита logoved-report для обработки логов. 2-Установка и работа Igor Vlasenko
  2018-09-21 18:38     ` [devel] I: утилита logoved-report для обработки логов. 3-Правила Логовед Igor Vlasenko
  0 siblings, 2 replies; 6+ messages in thread
From: Igor Vlasenko @ 2018-09-21 17:49 UTC (permalink / raw)
  To: devel

3. Создание своих правил Логовед.

Работая с утилитой logoved-report, вы наверняка столкнетесь
с ошибками, которые хотелось бы распознать,
но logoved-report о них не знает.

Нет проблем - просто создаем свое правило .logoved в ./db/.

3.1 Синтаксис правил Логовед.

Для начала посмотрим, как выглядит какое-то простое правило Логовед.

$ cat db/sisyphus_check/summary.logoved 
PATTERN=^sisyphus_check: check-summary ERROR: invalid package summary

Мы видим однострочный файл с PATTERN=...,
аргумент для PATTERN без кавычек.
Легко догадаться, что с таким правилом логовед выполнит некий аналог
запуска утилиты pcregrep "$PATTERN" /path/to/logs.

Синтаксис текущей версии достаточно прост.
#==============================================
# допускаются комментарии;
# записи имеют вид 
KEY=VAL
# где VAL не берется в кавычки и может содержать пробелы,
# где KEY могут повторяться, а допустимые KEY это
TYPE=
SCOPE=
PATTERN=
PATTERN_SEQ=
MULTILINE_PATTERN_BEGIN=
MULTILINE_PATTERN_BODY=
MULTILINE_PATTERN_END=
DESCRIPTION=
STATISTICS=
STATISTICS_HEADER=
FIX=
# после ключевого слова __END__ все остальное игнорируется.
__END__
после ключевого слова __END__
может быть фрагмент лог файла для примера.
#==============================================

Однако с правилом db/sisyphus_check/summary.logoved не все так просто.
В каждом правиле Логовед должны присутствовать 
TYPE= и SCOPE=.
Тем не менее, в summary.logoved эти значения явно не указаны.
Откуда они берутся? При загрузке базы Логовед используются
файлы 00default для установки значений по умолчанию.

Для db/sisyphus_check/summary.logoved
это файл db/00default, откуда берутся

TYPE=error
SCOPE=run

и файл db/sisyphus_check/00default
где SCOPE переопределяется в

SCOPE=hasher::sisyphus_check

Таким образом, после загрузки, с учетом файлов 00default,
внутри программы правило db/sisyphus_check/summary.logoved
выглядит как

TYPE=error
SCOPE=hasher::sisyphus_check
PATTERN=^sisyphus_check: check-summary ERROR: invalid package summary

но при наличии файлов 00default мы можем писать только
PATTERN=^sisyphus_check: check-summary ERROR: invalid package summary
остальное придет от файлов 00default как значения по умолчанию.

3.2 Параметры правил Логовед.

3.2.1 Параметр SCOPE.

Поговорим сначала о параметре SCOPE.
Поиск по всему лог файлу -- плохая идея.
Подходящий аналог -- искать макрос в спек-файле и найти его в %changelog.
Для лог-файла тоже есть ряд примеров, когда
поиск находит совсем не то, что нужно.

библиотека Logoved-Stream разбивает на секции

 hasher::chroot::users
 hasher::chroot::install
 hasher::chroot::srpm::repack
 hasher::chroot::srpm
 rpmbuild::prep
 rpmbuild::build
 rpmbuild::install
 rpmbuild::install::brp
 rpmbuild::check
 rpmbuild::files
   rpmbuild::files::processing
   rpmbuild::files::find_requires
   rpmbuild::files::requires
   rpmbuild::files::listed_twice
 rpmbuild::write
 hasher::time
 hasher::sisyphus_check
 beehive::time
а в случае ошибок еще возникают секции
 hasher::chroot::error
 hasher::chroot::apt
 hasher::chroot::file_conflict
 rpmbuild::error

Чтобы указать нужную нам область поиска,
используется параметр SCOPE.

Просто перечислим нужные нам секции 
с помощью SCOPE. Например, для сообщений
в процессе сборки (не для сообщений от
от скриптов, входящих в rpmbuild)
нам понадобится

SCOPE=rpmbuild::prep
SCOPE=rpmbuild::build
SCOPE=rpmbuild::install
SCOPE=rpmbuild::check
SCOPE=rpmbuild::error

Конечно, такая запись довольно громоздка,
даже если ее указывать только в файлах 00default.
В Логовед БД в модуле lib/Logoved/DB/Stream/Listener/Factory.pm
определены следующие сокращения для наборов секций:

    apt
	hasher::chroot::apt
	hasher::chroot::file_conflict
    run
	rpmbuild::prep
	rpmbuild::build
	rpmbuild::install
	rpmbuild::check
	rpmbuild::error
    conf
	rpmbuild::prep
	rpmbuild::build
	rpmbuild::error
    build
	rpmbuild::prep
	rpmbuild::build
	rpmbuild::install
	rpmbuild::error
    check
	rpmbuild::build
	rpmbuild::install
	rpmbuild::check
	rpmbuild::error


Также в базе логовед этим сокращениям соответствуют
наборы правил (подкаталоги), для которых файл 00default
содержит соответствующий SCOPE.

 db/run - сообщения об ошибке при запуске
 db/conf - сообщения при конфигурировании, от configure, cmake.
 db/build - сообщения от компилятора, линковщика, других сборочных утилит
 db/check - сообщения о неудаче тестирования

в
 db/sisyphus_check/
 как мы видели, по умолчанию указан
SCOPE=hasher::sisyphus_check

Параметры SCOPE=
можно себе представить как команды редактирования.
Мы удаляем из лог файла все лишнее, оставляя только
те секции, которые указаны в SCOPE,
и производим поиск в полученном урезанном файле.

3.2.1 Параметры PATTERN* и связанные с ними FIX и STATISTICS.

Параметры PATTERN* позволяют указать нам шаблоны поиска.
значение - регулярное выражение perl,
что значит, что надо экранировать @$%(){}*+,
если они используются как простые символы:
\@, \$ \%, \(, \), \{, \}, \*, \+

Чтобы упростить регулярные выражения perl,
из входящих строк лог файла перед применением
регулярных выражений удаляется конец - символ перевода строки "\n".

3.2.1.1 однострочный PATTERN=

Самый простой вариант -- однострочный PATTERN=

Пример:

$ cat db/run/command-not-found/perldoc.logoved 
PATTERN=perldoc: command not found
FIX=buildrequires --add /usr/bin/perldoc

В одном правиле можно указать несколько PATTERN,
достаточно, чтобы сработал только один из них:

$ cat db/apt/E-package-not-found.logoved 

# E: Couldn't find package libtau-common
PATTERN=^E: Couldn't find package (\S+)
PATTERN=^E: Невозможно найти пакет (\S+)
STATISTICS=%{GROUP:1}
STATISTICS_HEADER=E: Невозможно найти пакет:

3.2.1.2 многострочный PATTERN_SEQ=

Более сложный - многострочный шаблон PATTERN_SEQ=
фиксированной длинны.

последовательность
PATTERN_SEQ=
PATTERN_SEQ=
PATTERN_SEQ=
совпадает, если 1я строка совпадет с 1м паттерном,
2-я со вторым и т.д.

Пример1:

$ cat db/conf/automake-version/1.logoved 
PATTERN_SEQ=you need automake version \S+ or later
PATTERN_SEQ=^error: Bad exit status from /\S+ \(\%
__END__
./bootstrap: you need automake version 1.5 or later
error: Bad exit status from /usr/src/tmp/rpm-tmp.3287 (%build)

Пример2:

$ cat db/conf/automake-version/2.logoved
PATTERN_SEQ=You must have automake \S+ installed to compile
PATTERN_SEQ=Install the appropriate package for your distribution,
PATTERN_SEQ=or get the source tarball
PATTERN_SEQ=^error: Bad exit status from /\S+ \(\%
__END__
You must have automake 1.7.x installed to compile .
Install the appropriate package for your distribution,
or get the source tarball at http://ftp.gnu.org/gnu/automake/
error: Bad exit status from /usr/src/tmp/rpm-tmp.64887 (%prep)

В отличие от PATTERN, в правиле логовед из-за ограничений
синтаксиса может быть только одна последовательность PATTERN_SEQ=.
Но есть синтаксический сахар. Во flat режиме подпути,
состоящие из одних цифр, отбрасываются. Поэтому
лог файлы, подпадающие под правила
conf/automake-version/1.logoved
conf/automake-version/2.logoved
в отчете попадут в одну и ту же папку
LOGS/conf-automake-version .

3.2.1.3 шаблон MULTILINE_PATTERN_* переменной длинны.

многострочный шаблон 
MULTILINE_PATTERN_BEGIN=
MULTILINE_PATTERN_BODY=
[...]
MULTILINE_PATTERN_BODY=
MULTILINE_PATTERN_END=
применяется, когда образец может иметь переменное число строк.

Начало сопоставления задается шаблоном MULTILINE_PATTERN_BEGIN,
затем может идти что угодно, лишь бы оно подпадало хотя бы
под один из шаблонов вида MULTILINE_PATTERN_BODY=,
окончание сопоставления задается шаблоном MULTILINE_PATTERN_END.

Пример 1:
# python2/import-error.logoved
MULTILINE_PATTERN_BEGIN=^Traceback \(most recent call last\):
MULTILINE_PATTERN_BODY=^\s\s
MULTILINE_PATTERN_END=^ImportError: No module named (\S+)
FIX=buildrequires --add python2.7(%{MULTILINE_END_GROUP:1})
__END__
Traceback (most recent call last):
  File "/usr/lib/python2.7/site-packages/nose/suite.py", line 207, in run
    self.setUp()
  File "/usr/lib/python2.7/site-packages/nose/suite.py", line 290, in setUp
    self.setupContext(ancestor)
  File "/usr/lib/python2.7/site-packages/nose/suite.py", line 313, in setupContext
    try_run(context, names)
  File "/usr/lib/python2.7/site-packages/nose/util.py", line 471, in try_run
    return func()
  File "/usr/src/RPM/BUILD/python-module-fs-2.0.17/tests/test_ftpfs.py", line 90, in setUpClass
    from pyftpdlib.test import ThreadedTestFTPd
  File "/usr/lib/python2.7/site-packages/pyftpdlib/test/__init__.py", line 40, in <module>
    import sendfile
ImportError: No module named sendfile

Пример 2:
# python3/import-error-module.logoved
MULTILINE_PATTERN_BEGIN=^Traceback \(most recent call last\):
MULTILINE_PATTERN_BODY=^\s\s
MULTILINE_PATTERN_END=^ModuleNotFoundError: No module named '(\S+)'
FIX=buildrequires --add python3(%{MULTILINE_END_GROUP:1})
__END__
cd /usr/src/RPM/BUILD/ibus-table-chinese-1.8.2-Source/tables/array && /usr/bin/ibus-table-createdb -n array30-big.db -s /usr/src/RPM/BUILD/ibus-table-chinese-1.8.2-Source/tables/array/array30-big.tab
Traceback (most recent call last):
  File "/usr/share/ibus-table/engine/tabcreatedb.py", line 29, in <module>
    import tabsqlitedb
  File "/usr/share/ibus-table/engine/tabsqlitedb.py", line 32, in <module>
    import sqlite3
ModuleNotFoundError: No module named 'sqlite3'
make[2]: *** [tables/array/CMakeFiles/convert_array.dir/build.make:69: tables/array/array30-big.db] Error 1
make[2]: Leaving directory '/usr/src/RPM/BUILD/ibus-table-chinese-1.8.2-Source'
make[1]: *** [CMakeFiles/Makefile2:897: tables/array/CMakeFiles/convert_array.dir/all] Error 2
make: *** [Makefile:154: all] Error 2
error: Bad exit status from /usr/src/tmp/rpm-tmp.11890 (%build)

3.2.2 Параметры FIX и STATISTICS.

Раз у нас есть регулярное выражение, то мы можем выделить в образце
нужный нам фрагмент текста как ГРУППУ, просто взяв его в регулярном
выражении в простые круглые скобки.

Вернемся к правилу apt/E-package-not-found.logoved
там есть 
PATTERN=^E: Couldn't find package (\S+)
PATTERN=^E: Невозможно найти пакет (\S+)
в которых выделена одна группа (группа №1,
к ней можно обращаться как %{GROUP:1}).
к примеру, для образца
E: Couldn't find package libtau-common
значением группы №1 станет libtau-common.

Что мы можем сделать со значением группы?
можем сосчитать частоту (статистка по умолчанию)
добавим в правило параметр
STATISTICS=%{GROUP:1}
и для красоты заголовок - строку перед статистикой
STATISTICS_HEADER=E: Невозможно найти пакет:

получим в LOGS/apt-E-package-not-found
файл статистики, и сразу станет ясно, что чинить в первую очередь.

$ cat apt-E-package-not-found/00statistics 
E: Невозможно найти пакет:
  5: gnustep-Etoile-DocGenerator
  5: gdk-pixbuf-devel
  4: python-module-setuptools-tests
[...]
  1: kdepim-devel

Пример2:
db/conf/pkgconfig.logoved
содержит набор
PATTERN=^Package (\S+) was not found in the pkg-config search path
PATTERN=^configure: error: Package requirements \((\S+)\) were not met:
PATTERN=^No package '(\S+)' found
ругани на отсутствующий .pc файл.

В каждом из шаблонов выделена группа №1.

Простую статистику по частоте для нее считать не имеет смысла.
Имело бы смысл разделить .pc файлы на отсутствующие в Сизифе
и присутствующие в Сизифе, затем уже отдельно
в каждой группе статистику по частоте. Но это пока не реализовано.
Зато легко указать правило, как улучшить
(а то и починить) пакет.
Имя .pc файла -- готовый компонент для добавления в 
BuildRequires пакета. Соответствующая опция FIX имеет вид

FIX=buildrequires --add pkgconfig(%{GROUP:1})

В случае набора PATTERN_SEQ все группы в наборе
получают сплошную нумерацию. 

Набор
PATTERN_SEQ=bla (\S+) was (\S+)
PATTERN_SEQ=error: 
PATTERN_SEQ=foo '(\S+)' 

содержит группы
%{GROUP:1}
%{GROUP:2}
%{GROUP:3}

В случае MULTILINE_PATTERN_*,
%{GROUP:xx} нет, а есть отдельно
%{MULTILINE_BEGIN_GROUP:хх}
%{MULTILINE_END_GROUP:хх}

в python3/import-error-module.logoved, к примеру, будет
для
MULTILINE_PATTERN_BEGIN=^Traceback \(most recent call last\):
MULTILINE_PATTERN_BODY=^\s\s
MULTILINE_PATTERN_END=^ModuleNotFoundError: No module named '(\S+)'

FIX=buildrequires --add python3(%{MULTILINE_END_GROUP:1})

3.2.3 Параметр DESCRIPTION.

DESCRIPTION=В каких-то случаях сообщения об ошибках
DESCRIPTION=могут быть недостаточно информативными.
DESCRIPTION=В таких случаях хорошо бы составить описание
DESCRIPTION=ошибки для пользователя.
DESCRIPTION=
DESCRIPTION=Для этого просто добавим DESCRIPTION=
DESCRIPTION=перед каждой строкой.
DESCRIPTION=
DESCRIPTION=Исходное сообщение будет сохранено в файл
DESCRIPTION=00description в каталоге отчета.

3.2.4 Ключевое слово __END__

После ключевого слова
__END__
обработка файла .logoved прекращается,
и все остальное его содержимое игнорируется.
Поэтому после __END__ удобно хранить
образцы сообщений, для поиска которых
создавался логовед, чтобы можно было
проверить, не сломали ли мы часом
регулярное выражение.

4. За пределами правил Логовед.

В некоторых случаях возможностей правил Логовед
может не хватить. В таком случае можно спуститься
на уровень ниже, в библиотеку Logoved-Stream.
Там можно зарегистрировать обработчик
(Listener) для указанного SCOPE=
с нужным кодом, что занимается
программным анализом поступающего потока.
в интерфейсе 4 метода:
write (<линия лог файла>)
commit () - вызывается после окончания данных
success() - когда секция завершилась успешно.
error() - когда секция завершилась неуспешно.

Успешной работы!


-- 

I V


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [devel] I: утилита logoved-report для обработки логов. 1-введение.
  2018-09-21 17:33 [devel] I: утилита logoved-report для обработки логов. 1-введение Igor Vlasenko
@ 2018-09-21 17:52 ` Igor Vlasenko
  2018-09-21 17:49   ` [devel] I: утилита logoved-report для обработки логов. 3-Правила Логовед Igor Vlasenko
  2019-06-25  8:36 ` [devel] I: утилита logoved-report для обработки логов. 1-введение Michael Shigorin
  1 sibling, 1 reply; 6+ messages in thread
From: Igor Vlasenko @ 2018-09-21 17:52 UTC (permalink / raw)
  To: devel

Опс, сорри, что-то не то в vim нажал :(

Пощу еще раз:
#=====================================

Уважаемые коллеги, 

Предлагаю вашему вниманию утилиту logoved-report
для обработки логов неудавшихся сборок.

Принцип работы:
утилита создает папку отчета (./LOGS) с подпапками,
внутри которых линки на логи с однотипной ошибкой,
полезная статистика, а также входной скрипт
для утилиты автопочинки пакетов logoved-batchfix.

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

Сейчас применять эту утилиту стоит на объемах от 20 failed лог файлов,
(а в будущем, в расчете на то, что база Логовед будет только расти,
а с функцией автопочинки пакетов - то будет стоить попробовать и от 5-10 файлов)
а уже на объемах от 100-200 failed лог файлов без нее как без рук.

Утилита рассчитана на тех наших героев, которые разбирают
beehive логи неудавшейся пересборки (FTBS: Fails To Build From Source)
репозиториев Sisyphus, и тех дважды героев, которые смотрят в
FTBS бранча, для выпускающих репозитории для дополнительных
архитектур, и для делающих NMU/пересборки с большим числом
затронутых пакетов.

Самым крупным пользователем и активным контрибьютером, естественно,
буду я сам - в autoimports объемы уже сейчас захлестывают за тысячи.

Я решил сначала выпустить релиз в виде git репозитория,
а не в виде пакета в Сизифе.
Выложив в Сизиф, пришлось бы слишком часто слать обновления,
так как сейчас база в состоянии активного наполнения.
Кроме того, пользователям возможно понадобится дополнять
базу своими образцами сообщений о проблемах,
и внести запись в базу в git под рукой удобнее.

Так как данный пост у меня получился слишком длинным,
более 20.000 знаков, то для рассылки разбил
его на 3 части:

* Введение (эта часть)
* Установка и работа
* Правила Логовед.



-- 

I V


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [devel] I: утилита logoved-report для обработки логов. 3-Правила Логовед.
  2018-09-21 17:49   ` [devel] I: утилита logoved-report для обработки логов. 3-Правила Логовед Igor Vlasenko
  2018-09-21 17:34     ` [devel] I: утилита logoved-report для обработки логов. 2-Установка и работа Igor Vlasenko
@ 2018-09-21 18:38     ` Igor Vlasenko
  1 sibling, 0 replies; 6+ messages in thread
From: Igor Vlasenko @ 2018-09-21 18:38 UTC (permalink / raw)
  To: devel

Вдогонку: 

3.2.4 Параметр TYPE.

В текущей реализации logoved-report между правилами Логовед
возможен конфликт за строку, когда на одной строке
срабатывает несколько правил. Надо каким-то образом
указать, какое из них самое релевантное.

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

Для этого используется параметр TYPE.

TYPE=error -- самое релевантное.
TYPE=fallback -- менее релевантное.
TYPE=fallback2 -- еще менее релевантное.
TYPE=fallback3 -- ну, вы поняли логику.

Пример, где это используется.

db/findreq/shebang.req/emacs-var.logoved
 PATTERN=Unrecognized switch: -\*-
 FIX=hook set_kill_shabang-env-perl.pl

db/findreq/shebang.req/env.logoved
 PATTERN=too many arguments:.*/bin/env
 FIX=hook set_kill_shabang-env-perl.pl

db/findreq/shebang.req/trailing-cr.logoved
 PATTERN=trailing <CR> in interpreter
 FIX=hook set_kill_cr_shabang.pl

3 конкретных случая, для каждого из которых
у робота есть лечение.

Общий случай, не знаем что делать, ловим для ручной обработки.
db/findreq/shebang.req/other.logoved
 TYPE=fallback
 PATTERN=shebang.req: ERROR

TYPE=fallback означает, что это правило Логовед будет
считаться сработавшим только тогда, когда ни одно
другое правило с TYPE=error не сработало.

И еще более общий случай,
db/findreq/other.logoved
 TYPE=fallback2
 PATTERN=^find-requires: ERROR: /usr/lib/rpm/.*\.req failed
сработает уже только, если ни TYPE=error, ни TYPE=fallback
не сработал и не распознал конкретную причину.


-- 

I V


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [devel] I: утилита logoved-report для обработки логов. 1-введение.
  2018-09-21 17:33 [devel] I: утилита logoved-report для обработки логов. 1-введение Igor Vlasenko
  2018-09-21 17:52 ` Igor Vlasenko
@ 2019-06-25  8:36 ` Michael Shigorin
  1 sibling, 0 replies; 6+ messages in thread
From: Michael Shigorin @ 2019-06-25  8:36 UTC (permalink / raw)
  To: devel

On Fri, Sep 21, 2018 at 08:33:13PM +0300, Igor Vlasenko wrote:
On Fri, Sep 21, 2018 at 08:34:21PM +0300, Igor Vlasenko wrote:
On Fri, Sep 21, 2018 at 08:49:25PM +0300, Igor Vlasenko wrote:
> Предлагаю вашему вниманию утилиту logoved-report
> для обработки логов неудавшихся сборок.

А этот трёхтомник попал сюда:
http://altlinux.org/logoved-report

On Fri, Sep 21, 2018 at 08:52:09PM +0300, Igor Vlasenko wrote:

...с учётом поправок.

-- 
 ---- WBR, Michael Shigorin / http://altlinux.org
  ------ http://opennet.ru / http://anna-news.info


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2019-06-25  8:36 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-09-21 17:33 [devel] I: утилита logoved-report для обработки логов. 1-введение Igor Vlasenko
2018-09-21 17:52 ` Igor Vlasenko
2018-09-21 17:49   ` [devel] I: утилита logoved-report для обработки логов. 3-Правила Логовед Igor Vlasenko
2018-09-21 17:34     ` [devel] I: утилита logoved-report для обработки логов. 2-Установка и работа Igor Vlasenko
2018-09-21 18:38     ` [devel] I: утилита logoved-report для обработки логов. 3-Правила Логовед Igor Vlasenko
2019-06-25  8:36 ` [devel] I: утилита logoved-report для обработки логов. 1-введение Michael Shigorin

ALT Linux Team development discussions

This inbox may be cloned and mirrored by anyone:

	git clone --mirror http://lore.altlinux.org/devel/0 devel/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 devel devel/ http://lore.altlinux.org/devel \
		devel@altlinux.org devel@altlinux.ru devel@lists.altlinux.org devel@lists.altlinux.ru devel@linux.iplabs.ru mandrake-russian@linuxteam.iplabs.ru sisyphus@linuxteam.iplabs.ru
	public-inbox-index devel

Example config snippet for mirrors.
Newsgroup available over NNTP:
	nntp://lore.altlinux.org/org.altlinux.lists.devel


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git