- PVSM.RU - https://www.pvsm.ru -
Около 6 лет назад я участвовал в проекте по изготовлению железа и софта для одной крупной Североамериканской медицинской компании. Стоя возле тестовой стойки, в которой под нагрузкой было несколько устройств, я задал себе вопрос: «Если что-то пойдет не так, как нам ускорить поиск и исправление ошибки?»
С момента возникновения этого вопроса и до сегодняшнего дня было сделано очень много, и я хотел бы поделиться с вами тем как сбор и анализ телеметрии в софте и железе помог значительно снизить время обнаружения и исправления ошибок в целом спектре проектов, в которых я участвовал.
Телеметрия происходит от древнегреческого τῆλε «далеко» + μέτρεω — «измеряю».
Все очень просто, любые измерения, какие только может выдумать штат различных инженеров и возможно ученых, целевая система шлет в центр обработки для визуального и автоматического контроля и обработки.
Приблизительно вот так:
Когда на стороне сервера это может например выглядеть вот так:
Как то, наблюдая за работой наших QA инженеров, я задался вопросом – почему сложные устройства вроде спутников, ракет, машин имеют телеметрию, а мы, создавая, по сути, программные части операционных комнат, роботов, сложных программных решений, даже не задумываемся об этом направлении?
Количество кода колоссально, а способов понять, что что-то пошло не так меньше чем пальцев на одной руке:
Параллельно наблюдая за работой наших QA инженеров, я смотрел на один из экранов, по которому бежали кривые сердцебиения пациента, его давления, температуры и кучи других параметров и мне захотелось, чтоб наши продукты были как этот пациент – под надежным присмотром. Чтоб даже если что-то пойдет не так, можно было отмотать время вспять и посмотреть, при каком стечении обстоятельств это произошло.
Как нас учили: велосипеды — это познавательно и увлекательно, но сначала поищите существующие решения, чем я и занялся.
По хорошей традиции начал с требований:
Искал я долго и вдумчиво… но увы, все было не просто плохо, было все ужасно!
Под эти требования на момент начала 2011 года не попадал ни один проект, который я нашел, даже близко, даже половина требований.
Телеметрия для софта в виде готовых и открытых решений почти отсутствовала как класс, большие игроки делали для себя все сами и не особо спешили делиться.
Второй неожиданностью была реакция коллег – безразличие или в худшем случае неприятие, но, к счастью – это продлилось не долго, до первых результатов.
Единственное решение, которое я нашел на тот момент (2011 год), была библиотека P7 располагавшаяся в то время на google code. Функционал был беден, из платформ был только X86, на сервер было сложно смотреть без слез, но были и плюсы:
После ряда раздумий, изучения, было решено попробовать прокатиться на чужом велосипеде.
Встраивание библиотеки в наш код прошло легко и без проблем, но тут же возник вопрос: какие красивые графики мы хотим видеть и какие показания записывать? Это только, кажется, что вопрос прост, на самом деле – он сложен и коварен.
На первых порах и без опыта мы стали писать сравнительно ничтожное количество телеметрии:
К сожалению, скриншотов тех лет не сохранилось, и я приведу наиболее близкое приближение:
Первое же боевое крещение дало прекрасные результаты: после пары дней незаметной работы и воспроизведения нескольких багов мы, наконец-то, смогли понять природу многих из них:
[3]
На графике (кликабельно) видно, что задержки в потоке, читающем с HDD, удивительным образом совпадают с задержками в другом потоке, через 10 минут вглядывания в код был найден кусок, который вызывал такую зависимость.
Оказалось, что тестовый код с машины одного из инженеров попал в производство и регулярно подвешивал один из потоков, на пол секунды, на секунду. Эта проблема тоже была на графиках отчетливо видна – взлет CPU, memory, бешенная работа менеджера памяти и вдруг посередине он зависал на несколько сот миллисекунд (иногда до нескольких секунд):
Были еще какие-то, исправленные в первый-второй день, но за давностью лет я уже не могу вспомнить, что это было.
После того как мы увлеченно с коллегами тыкали пальцами в монитор и вопрошали «¿Qué pasa?», находили ответ и радовались как дети – вопрос о полезности больше не стоял, мы получили новую игрушку и хотели играть дальше.
После первого успеха мы начали последовательно увеличивать количество обязательных счётчиков:
Далее мы разбили счетчики на 3 группы:
И заключительным шагом было обновление процесса тестирования и внедрения практики, что ошибку, зафиксированную QA, должно сопровождать не только формальное описание, по возможности способ воспроизведения и лог файлы, но так же и телеметрия.
В качестве заключения позвольте представить несколько фактов:
Эта статья достаточно поверхностна и оставляет за кадром многие технические вопросы «а как получить загрузку CPU моим потоком», «а как сделать циклограмму моего потока», «а как вы делаете плагины» и тд и тп. Но если тема будет достаточно интересна – по всем этим пунктам можно сделать отдельные статьи.
Хотел бы надеяться, что эта статья позволит Вам задаться тем же вопросом что и мне «поможет ли телеметрия нашему продукту?», то можно сказать, что писал я ее не зря, так как в индустрии программного обеспечения этот вопрос невероятно редко звучит, бытует мнение, что это удел космоса и оборонки.
Спасибо за чтение!
PS: я намеренно не стал рассказывать про то нашу компанию и не буду — эта статья не о ней.
PPS: если вам интересно мы используем связку Jenkins + Baical + P7 (www.baical.net [5]), для наших нужд она подходит хорошо, автор проекта за годы сотрудничества реализовал по нашей просьбе не одно и не два улучшения, помимо этого мы используем P7 для логирования (https://habrahabr.ru/post/313686/ [6])
Автор: Lau
Источник [7]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/c-2/266703
Ссылки в тексте:
[1] Image: https://habrastorage.org/webt/59/ef/87/59ef879402b08290191918.png
[2] Image: https://habrastorage.org/webt/59/ef/8d/59ef8d77ae53c044998362.png
[3] Image: https://habrastorage.org/webt/59/ef/8e/59ef8e81090a1285188687.png
[4] Image: https://habrastorage.org/webt/59/ef/8d/59ef8df860961861196280.png
[5] www.baical.net: http://www.baical.net
[6] https://habrahabr.ru/post/313686/: https://habrahabr.ru/post/313686/
[7] Источник: https://habrahabr.ru/post/340882/
Нажмите здесь для печати.