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

Что OpenTelemetry нам готовит?

Что OpenTelemetry нам готовит?

Ilya Kaznacheev

March 04, 2020
Tweet

More Decks by Ilya Kaznacheev

Other Decks in Programming

Transcript

  1. Что нам готовит?

  2. что такое distributed tracing?

  3. 2009/11/10 23:00:01 starting application... 2009/11/10 23:00:02 connecting to database 2009/11/10

    23:00:03 connecting to file storage 2009/11/10 23:00:04 connecting to meow API 1... 2009/11/10 23:00:05 connecting to meow API 2... 2009/11/10 23:00:06 connecting to meow API 3... 2009/11/10 23:00:22 GET /meow -> [200] "meow" 2009/11/10 23:00:33 GET /meow -> [200] "meow" 2009/11/10 23:00:44 GET /woof -> [400] "bad request"
  4. 2009/11/10 23:00:01 starting application... 2009/11/10 23:00:02 connecting to database 2009/11/10

    23:00:03 connecting to file storage 2009/11/10 23:00:04 connecting to meow API 1... 2009/11/10 23:00:05 connecting to meow API 2... 2009/11/10 23:00:06 connecting to meow API 3... 2009/11/10 23:00:22 GET /meow -> [200] "meow" 2009/11/10 23:00:33 GET /meow -> [200] "meow" 2009/11/10 23:00:44 GET /woof -> [400] "bad request" 2009/11/10 23:00:01 starting application... 2009/11/10 23:00:02 connecting to database 2009/11/10 23:00:03 connecting to file storage 2009/11/10 23:00:04 connecting to meow API 1... 2009/11/10 23:00:05 connecting to meow API 2... 2009/11/10 23:00:06 connecting to meow API 3... 2009/11/10 23:00:22 GET /meow -> [200] "meow" 2009/11/10 23:00:33 GET /meow -> [200] "meow" 2009/11/10 23:00:44 GET /woof -> [400] "bad request" 2009/11/10 23:00:01 starting application... 2009/11/10 23:00:02 connecting to database 2009/11/10 23:00:03 connecting to file storage 2009/11/10 23:00:04 connecting to meow API 1... 2009/11/10 23:00:05 connecting to meow API 2... 2009/11/10 23:00:06 connecting to meow API 3... 2009/11/10 23:00:22 GET /meow -> [200] "meow" 2009/11/10 23:00:33 GET /meow -> [200] "meow" 2009/11/10 23:00:44 GET /woof -> [400] "bad request"
  5. 2009/11/10 23:00:01 starting application... 2009/11/10 23:00:02 connecting to database 2009/11/10

    23:00:03 connecting to file storage 2009/11/10 23:00:04 connecting to meow API 1... 2009/11/10 23:00:05 connecting to meow API 2... 2009/11/10 23:00:06 connecting to meow API 3... 2009/11/10 23:00:22 GET /meow -> [200] "meow" 2009/11/10 23:00:33 GET /meow -> [200] "meow" 2009/11/10 23:00:44 GET /woof -> [400] "bad request" 2009/11/10 23:00:01 starting application... 2009/11/10 23:00:02 connecting to database 2009/11/10 23:00:03 connecting to file storage 2009/11/10 23:00:04 connecting to meow API 1... 2009/11/10 23:00:05 connecting to meow API 2... 2009/11/10 23:00:06 connecting to meow API 3... 2009/11/10 23:00:22 GET /meow -> [200] "meow" 2009/11/10 23:00:33 GET /meow -> [200] "meow" 2009/11/10 23:00:44 GET /woof -> [400] "bad request" 2009/11/10 23:00:01 starting application... 2009/11/10 23:00:02 connecting to database 2009/11/10 23:00:03 connecting to file storage 2009/11/10 23:00:04 connecting to meow API 1... 2009/11/10 23:00:05 connecting to meow API 2... 2009/11/10 23:00:06 connecting to meow API 3... 2009/11/10 23:00:22 GET /meow -> [200] "meow" 2009/11/10 23:00:33 GET /meow -> [200] "meow" 2009/11/10 23:00:44 GET /woof -> [400] "bad request" 2009/11/10 23:00:01 starting application... 2009/11/10 23:00:02 connecting to database 2009/11/10 23:00:03 connecting to file storage 2009/11/10 23:00:04 connecting to meow API 1... 2009/11/10 23:00:05 connecting to meow API 2... 2009/11/10 23:00:06 connecting to meow API 3... 2009/11/10 23:00:22 GET /meow -> [200] "meow" 2009/11/10 23:00:33 GET /meow -> [200] "meow" 2009/11/10 23:00:44 GET /woof -> [400] "bad request" 2009/11/10 23:00:01 starting application... 2009/11/10 23:00:02 connecting to database 2009/11/10 23:00:03 connecting to file storage 2009/11/10 23:00:04 connecting to meow API 1... 2009/11/10 23:00:05 connecting to meow API 2... 2009/11/10 23:00:06 connecting to meow API 3... 2009/11/10 23:00:22 GET /meow -> [200] "meow" 2009/11/10 23:00:33 GET /meow -> [200] "meow" 2009/11/10 23:00:44 GET /woof -> [400] "bad request" 2009/11/10 23:00:01 starting application... 2009/11/10 23:00:02 connecting to database 2009/11/10 23:00:03 connecting to file storage 2009/11/10 23:00:04 connecting to meow API 1... 2009/11/10 23:00:05 connecting to meow API 2... 2009/11/10 23:00:06 connecting to meow API 3... 2009/11/10 23:00:22 GET /meow -> [200] "meow" 2009/11/10 23:00:33 GET /meow -> [200] "meow" 2009/11/10 23:00:44 GET /woof -> [400] "bad request" 2009/11/10 23:00:01 starting application... 2009/11/10 23:00:02 connecting to database 2009/11/10 23:00:03 connecting to file storage 2009/11/10 23:00:04 connecting to meow API 1... 2009/11/10 23:00:05 connecting to meow API 2... 2009/11/10 23:00:06 connecting to meow API 3... 2009/11/10 23:00:22 GET /meow -> [200] "meow" 2009/11/10 23:00:33 GET /meow -> [200] "meow" 2009/11/10 23:00:44 GET /woof -> [400] "bad request" 2009/11/10 23:00:01 starting application... 2009/11/10 23:00:02 connecting to database 2009/11/10 23:00:03 connecting to file storage 2009/11/10 23:00:04 connecting to meow API 1... 2009/11/10 23:00:05 connecting to meow API 2... 2009/11/10 23:00:06 connecting to meow API 3... 2009/11/10 23:00:22 GET /meow -> [200] "meow" 2009/11/10 23:00:33 GET /meow -> [200] "meow" 2009/11/10 23:00:44 GET /woof -> [400] "bad request" 2009/11/10 23:00:01 starting application... 2009/11/10 23:00:02 connecting to database 2009/11/10 23:00:03 connecting to file storage 2009/11/10 23:00:04 connecting to meow API 1... 2009/11/10 23:00:05 connecting to meow API 2... 2009/11/10 23:00:06 connecting to meow API 3... 2009/11/10 23:00:22 GET /meow -> [200] "meow" 2009/11/10 23:00:33 GET /meow -> [200] "meow" 2009/11/10 23:00:44 GET /woof -> [400] "bad request" 2009/11/10 23:00:01 starting application... 2009/11/10 23:00:02 connecting to database 2009/11/10 23:00:03 connecting to file storage 2009/11/10 23:00:04 connecting to meow API 1... 2009/11/10 23:00:05 connecting to meow API 2... 2009/11/10 23:00:06 connecting to meow API 3... 2009/11/10 23:00:22 GET /meow -> [200] "meow" 2009/11/10 23:00:33 GET /meow -> [200] "meow" 2009/11/10 23:00:44 GET /woof -> [400] "bad request" 2009/11/10 23:00:01 starting application... 2009/11/10 23:00:02 connecting to database 2009/11/10 23:00:03 connecting to file storage 2009/11/10 23:00:04 connecting to meow API 1... 2009/11/10 23:00:05 connecting to meow API 2... 2009/11/10 23:00:06 connecting to meow API 3... 2009/11/10 23:00:22 GET /meow -> [200] "meow" 2009/11/10 23:00:33 GET /meow -> [200] "meow" 2009/11/10 23:00:44 GET /woof -> [400] "bad request" 2009/11/10 23:00:01 starting application... 2009/11/10 23:00:02 connecting to database 2009/11/10 23:00:03 connecting to file storage 2009/11/10 23:00:04 connecting to meow API 1... 2009/11/10 23:00:05 connecting to meow API 2... 2009/11/10 23:00:06 connecting to meow API 3... 2009/11/10 23:00:22 GET /meow -> [200] "meow" 2009/11/10 23:00:33 GET /meow -> [200] "meow" 2009/11/10 23:00:44 GET /woof -> [400] "bad request"
  6. None
  7. None
  8. None
  9. None
  10. distributed tracing

  11. None
  12. None
  13. None
  14. None
  15. vs

  16. - Создан CNCF в конце 2016 - Только API -

    Разрабатывается LightStep, Uber, NewRelic, Datadog, RedHat… - Широко используется
  17. - Создан Google в начале 2018 - API и имплементация

    - Разработчики Google, Microsoft, Splunk, Honeykomb… - Широко используется
  18. Проблемы - Усиление связанности микросервисов - Vendor lock - OSS

    библиотеки тоже хотят делать трейсинг, но не быть vendor-specific - Как разработчик библиотеки (возможно) вы тоже не хотите привязываться к какому-то вендору, а хотите дать пользователю возможность самому выбирать
  19. Решение

  20. None
  21. - Создан теми же в середине 2019 - API и

    имплементация - API отделена от имплементаций (spec + libs) - lib dev может использовать API - app dev может использовать API и имплементацию - “каноничная” имплементация для каждого ЯП - Vendor-agnostic - Pluggable - Содержит все, что надо - tracing - monitoring - logging
  22. Архитектура OpenTracing

  23. обратная совместимость - сначала через bridges - потом через API

    - изменения: - tags -> attributes - logs -> events - сначала через bridges - сначала как часть OC но через API - потом отдельно через API
  24. Поддержка - OpenTelemetry - новая версия OpenTracing и OpenCensus -

    OpenTelemetry обратно совместим с OpenTracing и OpenCensus - После выхода стабильной версии OpenTelemetry в каждом ЯП разработка OpenTracing и OpenCensus прекращается - Поддержка OpenTracing и OpenCensus 2 года (с лета 2019) - Переход на OpenTelemetry возможен сразу через Bridges - В новых проектах предполагается использование API
  25. Поддерживаемые языки - Python - Java - JS (Node+browser) -

    Go - PHP - Ruby - .Net - Erlang - C++ - Rust Статус: - pre-release - Prod-ready вторая половина 2020 - в разных ЯП сроки отличаются
  26. None
  27. Tracing API Metrics API

  28. Tracing API Tracer - отслеживание активного Span. Функционал - создает

    новый Span - возвращает активный Span - делает указанный Span активным SpanContext - серилиазируемые данные, передаваемые между уровнями приложения (между разными Span) Содержит TraceId, SpanId, TraceFlags и др. поля.
  29. Tracing API Span - представляет одну операцию в трейсе (функция,

    метод, и т.п.) Вкладывается один в другой по стеку (дереву) прохождения запроса. Включает - Имя - Родительский Span (Span, SpanContext или null) - timestamp начала - timestamp окончания - Map Attribute - Список Events - Ссылки на другие Spanы - Статус и прочие метаданные
  30. Tracing API Span имеет функционал: - Добавлять Attribute (key-value) -

    атрибуты/параметры Span - Доабвлять Event (имя, набор Attribute, timestamp) - лог внутри Span - Устанавливать статус (Ok, Cancelled, NotFound и еще 14) - Изменять имя - Возвращать контекст
  31. Metrics API Instruments - инструменты сбора метрик, на стороне приложения

    - Counter - счетчик, суммирующий значения синхронно - Add() function - Measure - измерения изменяющейся величины синхронно - Record() function - Observer - срезы/наблюдения величины асинхронно - Observe() callback
  32. Metrics API Metric Event Format - Context (Span или иное)

    - timestamp (неявно собирается на стороне SDK) - instrument definition (имя, тип, опции) - label set (key-value для использования потом) - value (signed integer или floating point)
  33. Metrics API Aggregations - инструменты обработки метрик, на стороне SDK

    - Sum для Counter - MinMaxSumCount для Measure - LastValue для Observer
  34. Pluggable instrumentation - можно инструментировать код без подключения коллектора -

    можно писать код сразу с трейсингом, а подключить его потом - меньше работы разработчика, больше переиспользования, стандартные практики - одинаковый API для разных сервисов, уменьшение связанности - меньше работы DevOps, разные сервисы (tracing, monitoring) ходят через один API для разных сервисов и ЯП - Vendor-agnostic - библиотеки могут быть инструментированы без привязки к вендору -> не нужно жертвовать observability, подключая 3rd party библиотеки
  35. Ссылки https:/ /github.com/open-telemetry/opentelemetry-specification https:/ /medium.com/opentelemetry https:/ /opentelemetry.io

  36. Контакты kaznacheev.me github.com/ilyakaznacheev dev.to/ilyakaznacheev linkedin.com/in/ilyakaznacheev t.me/ilyakaznacheev t.me/kaznacheev_feed