Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Антон Палий. Как я из python-разработчика стал первым SRE-инженером в своей команде

Антон Палий. Как я из python-разработчика стал первым SRE-инженером в своей команде

У каждого разработчика есть свой прод. Сервис на проде должен обеспечивать высокий уровень доступности.
Некоторые команды составляют график дежурств, кто-то нанимает админов или devops’ов. В Тинькофф мы поняли, что когда человек с экспертизой разработчика работает над стабильностью прода каждый день, результат получается гораздо круче. Такие люди называются SRE-инженерами. Они занимаются разбором инцидентов, построением полезного мониторинга и согласовывают требуемый уровень доступности сервиса с бизнесом. В своем докладе я расскажу:
- как я из python-разработчика стал первым SRE-инженером в своей команде;
- какой опыт и знания я получил в процессе поддержки кода, который раньше писал.

More Decks by Python Community Chelyabinsk

Other Decks in Programming

Transcript

  1. КАК Я ИЗ PYTHON-РАЗРАБОТЧИКА КАК Я ИЗ PYTHON-РАЗРАБОТЧИКА СТАЛ ПЕРВЫМ

    SRE В КОМАНДЕ СТАЛ ПЕРВЫМ SRE В КОМАНДЕ Палий Антон
  2. ОБО МНЕ ОБО МНЕ 5 лет работаю с python 2.5

    года в tinkoff 1 год в команде развития надежности сервисов
  3. Чатботы Голосовые роботы

  4. ПЛАН ПЛАН Предыстория Профессия SRE Где пригождались навыки программирования

  5. ПРЕДЫСТОРИЯ ПРЕДЫСТОРИЯ

  6. ВСЕ ДЕЛАЮТ РАЗРАБЫ ВСЕ ДЕЛАЮТ РАЗРАБЫ Пишут код Поднимают инфраструктуру

    Разбирают инциденты etc
  7. ТРЕБОВАНИЯ РАСТУТ ТРЕБОВАНИЯ РАСТУТ система становится сложнее ~200 деплойментов в

    k8s множество бизнес-линий
  8. ЧАСТЕНЬКО ЗАГЛЯДЫВАЮ НА ОГОНЕК ЧАСТЕНЬКО ЗАГЛЯДЫВАЮ НА ОГОНЕК

  9. ПЕРЕХОЖУ В SRE ПЕРЕХОЖУ В SRE

  10. SRE SRE

  11. SITE SITE RELIABILITY RELIABILITY ENGINEERING ENGINEERING

  12. НАДЕЖДА — ЭТО НЕ СТРАТЕГИЯ НАДЕЖДА — ЭТО НЕ СТРАТЕГИЯ

    sre.google/sre-book
  13. КОГДА В ПРОЕКТЕ НУЖНО КОГДА В ПРОЕКТЕ НУЖНО SRE? SRE?

    Сложный Нагруженный Географически распространенный
  14. SRE ЗАНИМАЕТСЯ SRE ЗАНИМАЕТСЯ Обеспечением отказоустойчивости системы Производительностью, оптимальным использованием

    ресурсов Улучшением системы Разбором инцидентов Предотвращением новых Дежурством
  15. ОСТАНОВИМСЯ ПОДРОБНЕЕ НА КАЖДОМ ОСТАНОВИМСЯ ПОДРОБНЕЕ НА КАЖДОМ ИЗ ПУНКТОВ

    ИЗ ПУНКТОВ
  16. ОБЕСПЕЧЕНИЕ ОТКАЗОУСТОЙЧИВОСТИ ОБЕСПЕЧЕНИЕ ОТКАЗОУСТОЙЧИВОСТИ СИСТЕМЫ СИСТЕМЫ

  17. ПРОИЗВОДИТЕЛЬНОСТЬ, ОПТИМАЛЬНОЕ ПРОИЗВОДИТЕЛЬНОСТЬ, ОПТИМАЛЬНОЕ ИСПОЛЬЗОВАНИЕ РЕСУРСОВ ИСПОЛЬЗОВАНИЕ РЕСУРСОВ Всегда есть

    риск того, что нам будут мешать шумные соседи Мы окажемся шумными соседями Ограничения на CPU Ограничения на RAM
  18. УЛУЧШЕНИЕ СИСТЕМЫ УЛУЧШЕНИЕ СИСТЕМЫ процесса доставки приложения в бой мониторинга

    логгирования алертинга процессы
  19. РАЗБОР ИНЦИДЕНТОВ РАЗБОР ИНЦИДЕНТОВ Поиск причин Выработка действий для предотвращения

  20. ДЕЖУРСТВА ДЕЖУРСТВА

  21. oncall

  22. РЕДКИЕ ГОСТИ НА DEV СТЕНДАХ РЕДКИЕ ГОСТИ НА DEV СТЕНДАХ

  23. ВСЁ ЭТО ДЕЛАЕТСЯ ВО БЛАГО ВСЁ ЭТО ДЕЛАЕТСЯ ВО БЛАГО

    СТАБИЛЬНОСТИ ПРОДА, НО СТАБИЛЬНОСТИ ПРОДА, НО СТАБИЛЬНОСТЬ НУЖНО СЧИТАТЬ СТАБИЛЬНОСТЬ НУЖНО СЧИТАТЬ
  24. SLA SLA

  25. SLA SLA Service Level Agreement

  26. SLI SLI Service Level Indicator

  27. SLO SLO Service Level Objectives

  28. SLA downtime day downtime week downtime month 99 14 min

    24 sec 1 hour 40 min 7 hours 12 min 99.9 1 min 26 sec 10 min 5 sec 43 min 12 sec 99.99 9 sec 1 min 4 min 19 sec 99.999 Less than 1 sec 6 sec 26 sec
  29. ЧТО ЖЕ ПРИХОДИЛОСЬ ДЕЛАТЬ, ГДЕ БЫЛИ ЧТО ЖЕ ПРИХОДИЛОСЬ ДЕЛАТЬ,

    ГДЕ БЫЛИ НЕОБХОДИМЫ НАВЫКИ НЕОБХОДИМЫ НАВЫКИ ПРОГРАММИРОВАНИЯ ПРОГРАММИРОВАНИЯ
  30. ВНОСИЛ ВКЛАД В ДРУГИЕ ПРОЕКТЫ ВНОСИЛ ВКЛАД В ДРУГИЕ ПРОЕКТЫ

  31. ЛОГИРОВАНИЕ ЛОГИРОВАНИЕ

  32. было import threading class ThreadLocalCtx(threading.local): trace_id: Optional[UUID] = None application_name:

    Optional[str] = None thread_name: Optional[str] = None
  33. стало class Context(ContextVarStorage): trace_id: Optional[UUID] = ContextVarAttribute[UUID]("trace_id", initial=None) application_name: Optional[str]

    = ContextVarAttribute[str]( "application_name", initial=None ) thread_name: Optional[str] = ContextVarAttribute[str]("thread_name", initial=None)
  34. from contextvars import ContextVar from typing import Generic from pydantic

    import BaseSettings T = TypeVar('T') class ContextVarAttribute(Generic[T]): def __init__(self, name: str, initial: T) -> None: self._name = name self._context_var: ContextVar[T] = ContextVar(name, default=initial) def __get__(self, instance: Any, owner: Any) -> T: return self._context_var.get() def __set__(self, instance: Any, value: T) -> None: self._context_var.set(value)
  35. УМЕНЬШАЕМ КОЛИЧЕСТВО МИН ПРИ УМЕНЬШАЕМ КОЛИЧЕСТВО МИН ПРИ РАЗРАБОТКЕ РАЗРАБОТКЕ

  36. from pydantic import BaseSettings class BaseHttpClientSettings(BaseSettings): url: Url def __init_subclass__(cls,

    **kwargs: Any) -> None: if cls.__fields__['url'].default is not None: raise RuntimeError("NOPE!")
  37. АВТОМАТИЗАЦИЯ, ВЕЗДЕ АВТОМАТИЗАЦИЯ АВТОМАТИЗАЦИЯ, ВЕЗДЕ АВТОМАТИЗАЦИЯ

  38. МОНИТОРИНГ МОНИТОРИНГ

  39. САМОПИСНЫЕ АЛЕРТЫ САМОПИСНЫЕ АЛЕРТЫ

  40. АВТОГЕНЕРАЦИЯ ДОСОК АВТОГЕНЕРАЦИЯ ДОСОК

  41. РАБОТА С МЕТРИКАМИ РАБОТА С МЕТРИКАМИ

  42. ВЫВОДЫ ВЫВОДЫ

  43. ОПЫТ РАЗРАБОТКИ ПОМОГАЛ В РАЗБОРЕ И ОПЫТ РАЗРАБОТКИ ПОМОГАЛ В

    РАЗБОРЕ И ПОЧИНКЕ ТЕХ ИЛИ ИНЫХ КОМПОНЕНТОВ ПОЧИНКЕ ТЕХ ИЛИ ИНЫХ КОМПОНЕНТОВ
  44. РАЗРАБ В ИНФРАСТРУКТУРЕ - ХОРОШО, РАЗРАБ В ИНФРАСТРУКТУРЕ - ХОРОШО,

    ЕСЛИ ОН ПОДХОДИТ К ИНФРАСТРУКТУРЕ, ЕСЛИ ОН ПОДХОДИТ К ИНФРАСТРУКТУРЕ, КАК К СВОЕМУ КОДУ КАК К СВОЕМУ КОДУ
  45. ИЗМЕРЯЙТЕ РАБОТУ ВАШЕГО ПРОДА ИЗМЕРЯЙТЕ РАБОТУ ВАШЕГО ПРОДА

  46. ДЕЛАЙТЕ КОД, КОТОРЫЙ МОЖНО ДЕЛАЙТЕ КОД, КОТОРЫЙ МОЖНО МОНИТОРИТЬ МОНИТОРИТЬ

  47. ВОПРОСЫ ВОПРОСЫ