Повышение качества разработок и онлайн контроль ошибок
























Анализ ошибок и сбор ошибок журнала регистраций из десятков и сотен баз в одном месте.

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

О чем я хочу поговорить сегодня ? Если я скажу о том, что я хочу говорить про то, как интегрировать 1С с неким “100500” сервисом, то вряд ли кто-то отнесется к этому с той серьезностью, которую бы мне хотелось получить.

Поэтому я скажу по другому:

Я хочу поговорить про качество обслуживания баз 1С

Заинтриговал? Но поверьте, я не хочу говорить про то, что надо делать тестирование, отладку, писать сценарии и прочее прочее прочее. Все и так про это уже давно знают. А хотелось бы мне поговорить про те проблемы, которые уже случились, они есть, но никто о них не знает.

Позвольте задать вопрос — как часто вы пролистываете журнал регистраций на поиск ошибок?

Задел за живое? 🙂 Я столько раз слышал от разработчиков — какой этот журнал не удобный, что надо писать свои системы логирования и анализа, что надо делать то и это, а в итоге — никто ничего не делает.
Проще всего — мобильным разработчикам, так как у них нет журнала регистрации, и они не могут подключиться удаленно и посмотреть на эти все ошибки.

Почему я решился на написание именно этой статьи?

Честно? Мне надоело нытье моих собратьев о том, что клиенты жалуются, говорят что в программе много ошибок, что 50 раз в день они нарываются на какие-то баги, а по факту — это всего лишь 2-3 ошибки в день.
Что коллегам по цеху не удобно листать эти полотнища в виде ЖР и искать в них зерно истины. Что вот прям завтра, они поднимут свою систему для этих целей и вот тогда то…

И так, для кого эта статья предназначена?

  1. Для администраторов баз данных клиента (как внутренних, так и внешних)
  2. Для специалистов тех поддержки
  3. Для разработчиков (наконец).

 

Теперь предлагаю пофантазировать и ответить на вопрос “А следили ли Вы бы за ошибками?”, если:

  1. Была подписка на все ошибки
  2. Можно было бы в онлайне отлавливать ошибки по всем клиентам, по всем базам данных, по 500 РИБам, по мобильным устройствам? И видеть это все в браузере/телефоне/телевизоре?
  3. Если бы ошибки можно было группировать, смотреть когда они появились в первый раз, когда был последний раз, сколько пользователей с ними столкнулись, как часто это было?
  4. Если бы сервис показывал в каких версиях расширения/конфигурации эта ошибка была ранее?
  5. Если бы для реализации всего этого — не надо было бы платить ни копейки и иметь квоту в 170 000 запросов в день? (во всяком случае — пока)
  6. Если бы вы могли взять любую базу клиента, прописать пару строк, потратить 10 минут времени на перекур и собрать анализ по всем ошибкам этого клиента, которые попали в журнал регистраций за последних 30 дней?
  7. Если бы можно было дать доступ клиенту к спискам именно его ошибок, чтобы он сам отмечал те ошибки, которые являются критичными, и мог “затыкать” рот Марьи Ивановне, которая говорит, что у нее 100500 ошибок в день, а по факту всего 2-3?
  8. Если бы на внедрение всего этого — надо было бы потратить всего 15 минут времени?
  9. Если бы этот ресурс предоставлял гигант IT мира?
  10. Если бы вы были клиентом, а не программистом, и вы хотели бы “втихаря” собирать реальную статистику ошибок в базе данных, для того, чтобы дать нагоняя IT отделу, или компании, которая обслуживает, и вам бы для этого не понадобилось владеть огромными навыками программирования?
  11. … куча всяких других рекламных если…

Надеюсь, что ответ — “да”. И я уже не один…

Раскрываем карты

Сервис Google Cloud Platform

Размещается по адресу https://console.cloud.google.com

Там появился новый сервис, который позволяет отлавливать баги. Сейчас он находится в статусе беты, так что им можно пользоваться почти безвозмездно. Кроме этого — Google дает нам бесплатный бонус на 300$ на один год, который можно активировать уже после того, как сервис выйдет из беты. Пока Google дает 170 000 запросов в день бесплатно, про остальное — надо с ними списываться и решать, цен в открытом доступе пока нет.

Выглядит это все в итоге вот так:


По пунктам:

  1. Выбор проекта, т.е. можно завести под каждого клиента отдельный проект
  2. Сервисы, мы их используем в качестве имени конфигурации/расширения где произошла ошибка
  3. Версии — версии конфигурации или расширения
  4. Фильтр по типам задач
  5. Автоматическое обновление страницы ошибок. Очень помогает, когда в офисе на стене висит телевизор и в нем появляются все ошибки за текущий день.
  6. Можно включить уведомления, которые бы отправлялись в случае новых ошибок
  7. Период анализа ошибок.

Посмотрим одну ошибку детальнее:

Тут есть — описание ошибки, где она возникла, в какой строке, в каком модуле.
Кроме этого — четко видно, сколько раз она проявлялась и сколько РАЗНЫХ пользователей было затронуто ею.
Так же видно, где она проявлялась, в каких расширениях/конфигурациях и их версиях.
Ну и когда она была зарегистрирована первый раз и последний.
Ну и вишенка на торте, для тех, кто уже перешел в гит — если нажать на ссылку ошибки, там где ее путь слева вверху, то появится вот такое окно:

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

Краткий план действий

Понравилось? Если да, то чтобы это все реализовать, нам необходимо проделать несколько шагов:

  1. Зарегистрировать Google аккаунт (если еще есть те, у кого его нет)
  2. Зайти в консоль Google Cloud Platform
  3. Создать нужный проект
  4. Включить использование API Stackdriver Error Reporting
  5. Сгенерировать ключ для API
  6. Накатить расширение на базу и прописать в модуле настроек ID проекта и ключ
  7. Нажать кнопку — выгрузить данные ЖР
  8. Выпить кофе
  9. Посмотреть на результат в консоле

Если знать что и как делать — все шаги занимают 10 минут. Приступим.

Создание проекта для выгрузки

Я надеюсь, что обычный Google аккаунт есть уже у всех, так что идем сразу дальше.
Переходим по ссылке: https://console.cloud.google.com
Соглашаемся с условиями.
Идем в раздел регистрации ошибок:

Нас попросят создать проект:

Нажимаем на создание, и пишем имя проекта, оно нам надо будет далее. Я называю их как “ua-company-db”, т.е. страна, внутренне названии компании и имя базы, если я их разделяю.
Если все будет хорошо, то мы увидим вот такую картинку:

 

Теперь нам надо активировать API, для этого идем по этой ссылке: https://cloud.google.com/error-reporting/reference/
И нажимаем вот на эту кнопку:

Нас перекинет потом вот на эту страницу:


Где мы выбираем ранее созданный проект. И жмем Далее.
Теперь нас просят создать ключи, по которым мы будем подключаться к сервису:

Теперь нам надо создать ключ доступа через API, для этого идем в нужный раздел:

И создаем ключ для доступа к API:


Указываем имя ключа, а так же можем настроить ограничение использования, это надо, если разнесены сервер 1С центральный и тестовый, и чтобы случайно не послать с тестового сервера ошибки — можно указать конкретный адрес/подсеть, откуда будут приниматься уведомления. Плюс, это безопасность. Но мы никаких ограничений не ставим, во всяком случае для теста, ключ потом можно удалить и создать новый:

И жмем на кнопку Создать.
После этого — появится окошко с ключем:

Копируем его куда-то и закрываем окно.

В итоге у нас должно быть вот такое:

И последнее что нам надо — это ID проекта:


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

Итого, все это мы проделывали для двух вещей:

  • ID проекта, в нашем случае это test-1c-log
  • Ключ доступа, в нашем случае это AIzaSyB3cq1-9TksRyzP_r00wYlwi1pL-d2G7x4

Тестирование

Для теста нам понадобится просто платформа 8.3.10 или новее. Создадим пустую базу, и подключим туда расширение.
Вообще — механизмы будут работать везде, но, платформа должна уметь формировать JSON, хотя, можно и собрать его руками, через СтрШаблон. Кроме этого — платформа должна будет уметь отправлять POST запросы, но опять таки, есть cURL, так что по большому счету — этот сервис можно интегрировать даже с 7.7. При желании. При достаточном желании.

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

Сюда мы потом пропишем ключи доступа. НО! Пока ничего не пишем. Запускаем в режиме предприятия, открываем обработку GCP тест:

И жмите пару раз на кнопку Тест ошибки, в этот момент программа попробует отправить ошибку в сервис, но, так как мы не указали данные подключения, программа зафиксирует ошибки в журнал регистрации, а нам этого и надо для тестов.
Нажатие на эту кнопку вызывает вот эту функцию:

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

Теперь возвращаемся в конфигуратор, в модуль настроек, и заполняем данными:

Обновляем, запускаем режим предприятия, жмем кнопку теста еще один раз, и идем уже теперь на наш трекер ошибок, и почти сразу видим (иногда, для отображения первой ошибки нового проекта может пройти от минуты до 5, так что не ожидайте увидеть первую ошибку через секунду):

Видим количество ошибок = 1, теперь выбираем в обработке теста сегодняшнюю дату и жмем Выгрузить журнал регистрации. Ждем немного, и у нас появляются все эти ошибки.
Вот и все.

Итого

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

Кейс. Обращается ко мне клиент, хочет чтобы его взяли на обслуживание. Я создаю новый проект, подключаю к базе расширение, или выношу весь функционал во внешнюю обработку, запускаю выгрузку ТЖ. Иду курить и пить кофе. Прихожу через 15 минут и показываю ему “весь ужас” его базы. Где количество ошибок может достигать сотен, а одни и те же ошибки — тысяч, а то и десятков.

Кстати, если вы посмотрите функцию НеОшибки, то она так раз и сделала чтобы отлавливать не ошибки конфигурации:

Если в комментарии есть встречающиеся строки из этого массива, то я их пропускаю как не ошибки. Также пропускаются ошибки, у которых нету комментария.

Где это реально используется? Мы используем это у клиентов где сотни РИБ узлов, для анализа ошибок.

Как мы это используем — в двух вариантах, есть проект, куда сливается именно журнал регистраций, а есть проект, куда сливаются предвиденные ошибки.
Так как в журнале регистрации не всегда есть возможность адекватно распарсить ошибку, а там где мы отлавливаем ошибки попытками — мы сливаем их в конкретный проект, и после этого — связываем с жирой.

P.S.

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

P.P.S. Сервис бесплатный, по крайней мере пока он находится в стадии теста, но даже если он станет платным, есть возможность активировать 300$ бонуса на один год, и таки год им пользоваться бесплатно, а дальше уже решать.
Ну и конечно, просмотреть текущий уровень квот можно в специальном разделе


И тут красиво показывается сколько запросов за текущий день было сделано.


Заключение

Надеюсь, что теперь качество ваших продуктов и скорость реакции возрастет в разы. Но, это всего лишь один из маленьких пунктов в технологиях, которые дает Google.

Кроме этого, мы используем еще и FireBase и Google Analitics, где мы строим карты пользования магазинами 1С, вычисляем каким функционалом пользуются часто, а какой надо удалить, какие есть бест практики, как быстро в среднем отрабатывает функционал, и многое многое другое.

Кстати, про Google Analitics будет доклад на майском хакатоне . https://isthisdesign.org/

Цель подобного подхода

На самом деле на ближайшем хакатоне (если кто не в курсе он пройдет в мае в Москве), будет второй день для разбора проблем https://isthisdesign.org/shedule#day2

Я предполагаю, что проблема “Мониторинг 1С” на ней возникнет, и если возникнет я поделюсь вот этими своими наработками и/или расскажу — как мы с этим работаем. Видь просто выгрузить куда то это одно, а уметь читать и использовать — это уже другое. Возможно это не похоже на пропагандируемый ЦУП и elasticSearch, но проблему ведь решает и результат отличный. Тем более, что для этого не надо иметь свою инфраструктуру и специализированные знания.

 

47 Comments

  1. infosoft-v

    Спасибо.

    Reply
  2. vlad.frost

    Герман Клименко:

    Технически российское государство готово к отключению от мировой глобальной паутины.
    Reply
  3. MaCCapAkIII

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

    И еще. Есть информация, что физикам в принципе нельзя использовать теперь GCP… https://goo.gl/ior7gh

    Reply
  4. DitriX

    (4) если не будут доступны сервисы гугла, то я боюсь, что не работающая онлайн система ошибок — будет наименьшей проблемой из всех 🙂

    (5)Уникального ничего нету, просто пост запросы с парсингом ЖР. Я этот модуль с нуля написал за 2 часа (так как мы используем более глобальные вещи, и объяснять их тут заняло бы кучу времени).

    На счет физиков — вы же не можете работать с клиентами как физик 😉 Вы либо сотрудник компании (ЧП, ООО и т.д.) или сами являетесь этой компанией. А физика можно использовать просто для тестов 🙂

    Reply
  5. Scorpion4eg

    Все больше убеждаюсь что Google это корпорация добра. Столько всего предоставляет на бесплатной или почти бесплатной основе.

    Google Analytics(а я думаю почему я икаю), Google Vision(распозновалка фото), естественно Google Maps, Google shortner, такая еще штука.

    Reply
  6. support

    Супер!

    Reply
  7. lustin

    (7) Еще firebase — мы тут её к OScript прикручиваем, ваще вещь

    Reply
  8. DitriX

    (9)и че я не в теме и не при делах. Давай кооперироваться 🙂 Я сейчас тоже это делаю.

    Reply
  9. spezc

    Божественно! Держи звезду.

    Reply
  10. Alias

    Можете уточнить, как «дать доступ клиенту к спискам именно его ошибок, чтобы он сам отмечал те ошибки, которые являются критичными, и мог “затыкать” рот Марьи Ивановне, которая говорит, что у нее 100500 ошибок в день«?

    Или, иначе говоря, даже по скриншоту видно — есть общее количество ошибок, есть количество затронутых пользователей. И если провалиться в ошибку, то видно список последних ошибок, опять в них провалиться и увидеть пользователя. А как сделать фильтр по ошибкам одного пользователя? Как посмотреть не «список последних ошибок», а полный?

    Reply
  11. DitriX

    (12) не одного пользователя, а по проекту. Вы создаете на каждого клиента свой проект, и даете доступ только к их проекту.

    Reply
  12. mitia.mackarevich

    В транзакции также вставляете обращение к сервису напрямую, при записи документа например?))

    Вопрос снят, перечитал статью, под вечер голова не варит=)

    Reply
  13. lustin

    (10) это кстати тема доклада Алексея Соснового + моя на блиц докладах. Я покажу код. Тебе как докладчику могу показать чуть раньше 😉

    Я хочу чтобы к октябрьской конференции это было готово вкупе с наработками Андрюхи по Oscript Web — тогда к октябрю для Инфостарта мы сделаем самый крутой Веб фреймворк в мире ;-).

    а чтобы быть в теме 😉 надо следить за моим facebook акаунтом — я там выкладываю гифки того над чем работаю.

    Reply
  14. Gladkov_Anton

    Без изменения кода конфигурации и без конструкции «попытка» логирование ошибок в googole будет?

    Reply
  15. TreeDogNight

    Никак не могу понять, по какому принципу происходит группировка ошибок?

    Reply
  16. JohnyDeath

    (17) может по тексту самой ошибки?

    Reply
  17. TreeDogNight

    (18) Тоже так думал. Но при открытии ошибки, внутри отображаются другие ошибки…

    Reply
  18. Adam12345678

    Отлично!

    Reply
  19. vova329

    (19) Я так понял в группировке участвуют и метаданные, копай сюда

    Reply
  20. vano-ekt

    (7) а еще Cloud Messaging 🙂

    Reply
  21. Adam12345678

    Позволил себе добавку в коде, иначе не выводит нужную информацию

    Если ОшибкаИТекст.Количество() > 1 Тогда
    //Обработка пути ошибки
    РасширениеИПуть = СтрРазделить(ОшибкаИТекст[0], » «, Ложь);
    Если РасширениеИПуть.Количество() > 1 Тогда
    ………оригинальный код
    Иначе   //добавка по смыслу, иначе не заполняет важную информацию об ошибке
    ПутьОшибки =  РасширениеИПуть[0];
    ПутьИСтрокаОшибки = СтрРазделить(ПутьОшибки, «()», Ложь);
    Если ПутьИСтрокаОшибки.Количество() > 1 Тогда
    Попытка
    reportLocation.lineNumber = Число(ПутьИСтрокаОшибки[1]);
    Исключение
    КонецПопытки;
    
    СоставПутиОшибки = СтрРазделить(ПутьИСтрокаОшибки[0], «.», Ложь);
    reportLocation.functionName = СоставПутиОшибки[СоставПутиОшибки.ВГраница()];
    СоставПутиОшибки.Удалить(СоставПутиОшибки.ВГраница());
    reportLocation.filePath = СтрСоединить(СоставПутиОшибки,».»);
    КонецЕсли;
    //конец добавки
    КонецЕсли;
    
    

    Показать

    Reply
  22. DitriX

    (15)увы, соцсети не мое, нет на них время. Лучшая соцсеть — бокал пива и беседа 🙂

    Reply
  23. DitriX

    (16) собираются данные из ЖР. В этом варианте.

    Reply
  24. DitriX

    (23) спасибо. Писалось это на коленке, я думаю по стилю кода видно 🙂 Так, в целях обучения. Реальный код много сложнее.

    Reply
  25. TreeDogNight
    Reply
  26. Gladkov_Anton

    (25) Прошу прощения, но я так и не понял.

    Есть базы данных без доработок.

    В них происходит исключение. В ЖР оно НЕ попадает.

    Я правильно понимаю, что таки ошибки НЕ попадут в google?

    Reply
  27. DitriX

    (28) все верно.

    Reply
  28. devlabnn

    Спасибо! Теперь используем у себя (РИБ 170 узлов).

    Группируются ошибки по сочетанию functionName + filePath (без учета ineNumber)

    Пришлось включить lineNumber в filePath

    reportLocation.functionName = reportLocation.functionName + «_» + reportLocation.lineNumber;

    Есть еще проблема — при нажатии Подробнее… на странице ошибки переходим на страницу 404.

    Из-за этого использую юзер-цсс (во вложении), чтобы можно было посмотреть текст ошибки полностью, непосредственно в списке ошибок.

    Reply
  29. DitriX

    (30) будет отлично — если напишите встречную статью о том, как вам это все помогло, или не помогло 🙂

    Reply
  30. TreeDogNight

    (30)

    nName + «_» + reportLocation.lineNumber;

    Можете подробнее рассказать как вы используете этот «юзер-цсс»?

    Reply
  31. devlabnn

    (32)

    1. Установить расширение user css или аналог (есть для всех браузеров). Например, для Chrome / Яндекс браузера я использую это

    2. Скопировать текст в окно расширения, как на скриншоте:

    3. Результат

    Reply
  32. devlabnn

    (31) Ощущения смешанные. С одной стороны — очень удобно видеть агрегированные данные по количеству инцидентов и затронутых узлов.

    С другой — пока прикладная польза не понятна. Но прикольно :).

    Reply
  33. TreeDogNight

    (33) Благодарю!

    Reply
  34. DitriX

    (34)мы этот механизм часто используем при внерении нового функционала в 200 рибах. Когда мы оперативно ловим ошибки и сразу шлем обновления. Благо мы все стараемся через расширения. Так что одна кнопка, 5 минут и 200 касс работают с обновленной версией 🙂

    Reply
  35. sergathome

    (6) Счастье в другом. Вся эта красотища влёгкую нарушает практически любое соглашение с клиентом о конфиденциальности…

    Reply
  36. DitriX

    (37)например? Я не знаком ни с одним соглашением, которое бы можно было нарушить этим сервисом.

    С каких это пор — код конфигурации, а точнее не код, а его эпизоды — стали конфеденциальной информацией?

    Или название расширения это запрещенные данные?

    Конечно, если вы туда будете выгружать цифр по рентабельности, долгам и прочее — тогда да, но сервис как бы не для того.

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

    С другой стороны, скорее проще взломать сервер клиента и получить доступ к базе, чем взломать гугл аккаунт и получить доступ к списку багов 🙂

    Reply
  37. Avliyarov

    «Исчерпан доступный лимит развертываний. Показаны данные только для последних развертываний.» — выдает при создании проекта

    это я так понимаю — косяк тестовой среды?

    Reply
  38. sergathome

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

    Reply
  39. DitriX

    (40) А вы собираетесь такое проделывать без согласия пользователя?

    Reply
  40. DitriX

    (39) где и когда возникает ошибка?

    Reply
  41. sergathome

    (41) я — нет, но знаю тех, кто об этом даже не задумывается ;))

    Reply
  42. pbabincev

    Это просто великолепная работа!

    Автор, Дмитрий, спасибо!

    Включаем с ребятами для своей РИБ-12.

    Reply
  43. yarsort

    (4) Голову пусть себе отключат…

    Reply
  44. Region102

    (7) Google уже давно корпорация бабла

    Reply
  45. elephant_x

    (42) При переходе в стакдрайвер отчеты по ошибкам.

    Reply
  46. elephant_x

    (42) картинку ещё добавил)

    Reply
  47. elephant_x

    (42) Разобрался, все получилось.

    1. Не то api создал

    2. Такая картинка выходит когда в отчете нет данных.

    Спасибо большое за статью, пойду внедрять на продакшн)

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *