MiddlePython Developer > Основы Python > API и контракты
Короткий ответ Рассинхронизацию версий API диагностируют по логам ошибок десериализации/валидации, коррелируя их с версией клиента и с историей изменений контракта по времени, чтобы найти клиентов, которые не обновились после breaking change. Как это работает подробнее Если сервис выпустил несовместимое изменение контракта без должного версионирования, старые клиенты продолжают отправлять/ожидать старый формат и начинают получать ошибки парсинга или некорректное поведение. Пример кода Что использовать на практике Практика. Смотрят метрики ошибок по эндпоинту в разрезе версии клиента, ищут всплеск, совпадающий по времени с последним деплоем, и проверяют changelog схемы API за релиз; решение — откатить изменение или временно восстановить обратную совместимость. Подводные камни Риск. Деплоить breaking change без поэтапного раскатывания (canary), из-за чего проблема сразу затрагивает 100% трафика; не версионировать внутренние API между своими сервисами.
apiapi-design
MiddlePython Developer > Основы Python > Внешние интеграции
Короткий ответ N+1 проявляется, когда для одного списка из N объектов сериализатор выполняет по отдельному запросу на связанные данные для каждого элемента; диагностируют по логам SQL-запросов (один запрос на список + N похожих запросов), а устраняют через предварительную загрузку связанных данных одним batched-запросом (eager loading / join / IN-запрос). Как это работает подробнее если эндпоинт возвращает список заказов с полем "имя клиента", а код наивно обращается к order.customer.name для каждого заказа в цикле, при ленивой загрузке ORM это превращается в отдельный SQL-запрос на каждого клиента — при 100 заказах это 1 + 100 запросов вместо одного-двух. Пример кода Что использовать на практике Рекомендация. включить в логи или EXPLAIN количество выполненных запросов на один вызов эндпоинта, сравнить его с ожидаемым (константным, не зависящим от размера списка); в SQLAlchemy использовать joinedload/selectinload, в Django ORM — select_related/prefetch_related, либо вручную собрать все нужные ID и одним запро
eager-loadingn-plus-one
MiddleDevOps Engineer > Контейнеры и доставка > Kubernetes и оркестрация
Короткий ответ Диагностику начинают с проверки, резолвится ли имя вообще из отладочного пода (nslookup/dig на ..svc.cluster.local), затем проверяют статус подов CoreDNS (kube-system), их логи на ошибки, и конфигурацию /etc/resolv.conf внутри проблемного пода — несовпадение search domain или временная перегрузка CoreDNS часто остаются незамеченными при поверхностной проверке. Как это работает подробнее каждый под по умолчанию получает resolv.conf с nameserver, указывающим на ClusterIP сервиса CoreDNS, и search-путями, достраивающими короткие имена до полного FQDN (svc.cluster.local и т.п.). Если CoreDNS перегружен, его поды падают, либо NetworkPolicy блокирует трафик к порту 53 — резолвинг начинает сбоить случайным образом, что внешне похоже на "нестабильную сеть". Пример кода Что использовать на практике Практика. полезно сравнить поведение короткого имени (backend) и полного FQDN (backend.prod.svc.cluster.local) — если полное имя резолвится, а короткое нет, проблема в search-путях или в т
dnskubernetes
MiddleData Analyst > SQL и данные > Статистика и теория вероятностей
Короткий ответ Резкий скачок или провал метрики, который начинается точно в день релиза/изменения в системе трекинга (а не постепенно) и не сопровождается аналогичным изменением в смежных, независимо собираемых метриках — явный признак технического разрыва, а не реального поведенческого изменения. Как это работает подробнее изменение способа сбора данных (новая версия SDK, смена атрибуции событий, фильтр ботов, изменение логики дедупликации) может резко сдвинуть абсолютные значения метрики, при этом реальное поведение пользователей не изменилось. Пример кода Что использовать на практике На практике. первый шаг диагностики — сопоставить дату скачка с журналом релизов и деплоев (не только продуктовых, но и инфраструктурных/аналитических). Второй шаг — проверить, согласуется ли изменение с независимым источником (например, если выручка по данным платёжного шлюза не изменилась, а «выручка» по внутренней аналитике скакнула — проблема в трекинге). Третий шаг — посмотреть, меняется ли структура данных (появились нов
change-pointdata-quality
MiddlePerformance Marketer > Google Ads > Тестирование гипотез и запуск изменений
Короткий ответ Нужно последовательно проверить модель атрибуции (разные окна и логика в кабинете и в GA4), различия в определении конверсии/события, потери данных из-за cookie-блокировщиков и ITP, а также то, учитывает ли кабинет те же варианты теста, что и GA4 (например, через UTM или параметр эксперимента). Как это работает подробнее Рекламные кабинеты обычно используют собственное окно атрибуции (например, клик за 7 дней, просмотр за 1 день) и свою модель последнего клика по этой платформе, тогда как GA4 по умолчанию использует data-driven атрибуцию по нескольким каналам — у них разные правила «засчитывания» конверсии одному и тому же пользователю. Дополнительным источником расхождения может быть разное определение самого события «конверсия» — кабинет считает конверсией клик по кнопке, а GA4 — только успешную отправку формы. Пример. Вариант A: кабинет показывает 50 конверсий, GA4 показывает 38 Вариант B: кабинет показывает 55 конверсий, GA4 показывает 52 Разный процент расхождения (24% vs 5%) между вариант
ab-testingconversion-tracking
MiddleData Analyst > SQL и данные > Статистика и теория вероятностей
Короткий ответ Нужно последовательно сравнить определения метрики (та ли формула, тот же ли фильтр по статусам/датам), часовые пояса и границы периодов, этапы ETL-пайплайна (дедупликация, фильтры, джойны) и момент снятия снимка данных (дашборд мог закэшироваться раньше, чем обновился источник). Как это работает подробнее расхождение почти никогда не возникает "само по себе" — оно всегда объясняется конкретным отличием в способе расчёта или моменте среза данных; задача диагностики — методично исключать гипотезы от простых (другой часовой пояс) к сложным (ошибка в логике трансформации). Sanity check: пересчитать метрику дашборда вручную по тем же фильтрам и часовому поясу, что в первоисточнике — если числа сходятся, причина расхождения найдена и её нужно задокументировать для обеих сторон. Пример кода Что использовать на практике Эффективный порядок проверки: (1) сравнить SQL-определение метрики на дашборде с определением в первоисточнике — часто разница в фильтре статусов заказа (включены ли отменённые/возврат
dashboarddata-quality
MiddleSMM Manager > Общее > Рекламные платформы и медиазакупка
Короткий ответ Признаки усталости — рост частоты показов при падении CTR и росте CPC/CPA на стабильной аудитории без изменения прочих условий; решение — обновить креативы, расширить или обновить аудиторию, ограничить частотный кап или временно приостановить показ на перегретый сегмент. Как это работает подробнее по мере роста частоты показов одного и того же креатива реакция аудитории снижается (баннерная слепота, раздражение), что отражается в падении CTR при неизменном или растущем охвате. Что использовать на практике Подход. мониторинг частоты и CTR в динамике по неделям позволяет заметить усталость до того, как она серьёзно повлияет на CPA; ротация креативов на регулярной основе снижает риск усталости. Пример. Ретаргетинг на «посетители сайта за 30 дней» показывает частоту 12 и падение CTR с 2,2% до 0,6% за месяц. Вводится ротация из 3 новых креативов и сокращение окна ретаргетинга до 14 дней — CTR восстанавливается до 1,5% за две недели. Подводные камни Ошибка. продолжать показ одного и того же креатива
audience-targetingcampaign-optimization
MiddleDevOps Engineer > Контейнеры и доставка > Сети Docker
Короткий ответ Диагностику ведут последовательно: сначала проверяют DNS-резолв внутри контейнера и конфигурацию встроенного Docker DNS (127.0.0.11), затем правила iptables на хосте (цепочка DOCKER), и отдельно — параметр MTU сети, который часто является причиной обрывов соединений именно в overlay/VPN-окружениях. Как это работает подробнее контейнер по умолчанию использует встроенный DNS-резолвер Docker, который проксирует запросы либо к DNS-серверам хоста, либо резолвит имена других контейнеров в той же пользовательской сети; сбой на этом уровне проявляется как ошибка резолва конкретного имени при рабочей сети в целом. Отдельно от DNS, Docker управляет сетевой связностью через динамически создаваемые правила iptables (цепочки DOCKER, DOCKER-USER и др.) — их конфликт с другими правилами файрвола хоста может блокировать исходящий или входящий трафик контейнера. Третий слой — несовпадение MTU между виртуальным сетевым интерфейсом контейнера/сети Docker и реальным сетевым путём (особенно при VPN или overlay-сетя
containersdns
MiddleDevOps Engineer > Контейнеры и доставка > Мониторинг, логирование и observability
Короткий ответ Диагностика через встроенные метрики prometheus_tsdb_head_series, prometheus_tsdb_symbol_table_size_bytes и запросы вида topk(10, count by (__name__)({__name__=~".+"})), показывающие метрики с наибольшим числом рядов; смягчить можно через metric_relabel_configs с drop/labeldrop для проблемных labels без изменения кода приложения. Как это работает подробнее резкий рост prometheus_tsdb_head_series (число активных временных рядов в памяти) при том же количестве сервисов обычно означает, что кто-то начал слать метрику с новым высококардинальным label (например, после деплоя новой версии приложения). Запрос topk(10, count by (__name__)({__name__=~".+"})) в самом Prometheus показывает, какие именно метрики дают наибольшее число рядов, что сразу сужает область поиска до конкретного job/метрики. Пример кода Что использовать на практике Практика. быстрое смягчение без изменения кода приложения — добавить metric_relabel_configs в scrape_config с действием labeldrop для убийственного label или drop для це
cardinalitymetrics
MiddleDevOps Engineer > Контейнеры и доставка > systemd
Короткий ответ After/Before задают только порядок запуска относительно другого юнита, не создавая зависимости по факту успеха; Requires создаёт жёсткую зависимость — если требуемый юнит не запустился или упал, текущий юнит тоже останавливается; Wants создаёт мягкую зависимость — пытается запустить требуемый юнit, но продолжает работу, даже если тот не стартовал. Как это работает подробнее systemd строит граф зависимостей на основе всех этих директив и параллельно запускает независимые ветки юнитов, соблюдая порядок там, где он явно задан; важно помнить, что сама по себе директива Requires без After не гарантирует порядок запуска — она гарантирует только то, что оба юнита будут активны (или оба остановлены при сбое), а не последовательность их старта. Пример кода Что использовать на практике Практика. для сервиса, зависящего от базы данных на том же хосте, типично сочетание After=postgresql.service и Wants=postgresql.service (мягкая зависимость с порядком, не роняющая сервис, если БД временно недоступна при ст
linuxservice-management