Рубрики
Uncategorized

Прагматическое отслеживание

Введение Распределенная система — это, в которой сбой компьютера вы не е … Помечено с Go, DevOps, мониторинг, наблюдаемости.

Введение

Распределенная система — это, в которой отсутствие компьютера вы даже не знали, сможет сделать свой собственный компьютер Неиспользуемый — Leslie lamport

Факт жизни мы строят больше, более сложные и распределенные системы. То, что раньше было одиночным сервером, обслуживающим личные домашние страницы старого стиля, превратились в опосредованное сообщением в блоге Medile.com и различные другие экосистемы. Простая доска объявлений, превращая огромные системы Amazon, eBay и других онлайн-розничных продавцов. Эта эволюция сродни самой жизни, так как мы прогрессируемся от одиночных клеточных бактерий для людей, которые мы сегодня усложнялись. Более мощный, но сложный.

Теперь давайте поговорим о вашей текущей системе. Скорее всего, не все новое. Сегодня почти каждая система использует численные процедуры, написанные в Фортране несколько десятилетий назад. Аналогичным образом, в ваших телах базовый сотовый метаболизм не изменился последние 100 миллионов лет.

Хотя с дополнительной сложностью некоторые вещи изменились. Помимо превосходных вагонов, например Видение, речь, сознание мы развиваем расширенное мониторинговое оборудование. Просто один нейрон, действующий и прото-глаз, не режет его, но полноценный глаз делает.

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

Сообщения отправляются и получены по гормонам на гигантской очереди сообщений под названием «Система циркуляции», то есть кровь. Гораздо большая сложность, чем простой однолетний организм и осмос рассеянные операции.

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

Нащуп наблюдательности

В этой главе я кратко охвачу от основных инструментов наблюдаемости в нашем распоряжении. Я также буду использовать футбольную аналогию в качестве метафоры для более четкого объяснения. Для тех знакомых не стесняйтесь пропустить последний раздел, отслеживая.

Журналы

Журнал — официальная запись событий во время путешествия корабля или самолета.

Это самый простой и самый базовый инструмент в нашем распоряжении. Один журнал представляет некоторое событие, происходящее со связанными метаданными.

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

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

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

Существуют системы управления журналами для сбора и поиска журналов. Один из проще — это логика с GREP, более сложное существование в системе Systemd, а для производственных распределенных систем вы обычно используете стек ELK или Graylog.

В футбольной аналогии, игра за счет гола будет отличным журналом. Что-то типа:

Msg = «Иван забил цель»

Данные журнала полезны для уникальных, редких событий или как-то значимых событий. Для частых событий необходимо отказаться от того, чтобы не убить систему управления журналом. Например, вы хотите войти каждый раз, когда вы получили IP-пакет на сервере?

Метрики

Метрика — система или стандарт измерения.

В контексте наблюдаемости метрика — это скалярное значение со временем. Это скалярное значение обычно является счетчиком (например, количество забитых целей, HTTP-запросов), датчика (например, температура, использование процессоров), гистограмма (например, количество кодов ответов HTTP, 2xx, 3xx, 4xx, 5xx) или оценка рейтинга (например, 95% латентности в процентах реагирования).

Они отлично подходят для определения узкого места, необычного поведения и установки SLOS (целей уровня обслуживания). Обычно аварийные сигналы привязаны к какой-то метрике, то есть всякий раз, когда указанная метрика снаружи задана за пределами, выполнит действие — автоматическое заживление или уведомить оператора.

Например, на человека у нас действительно важная метрика — уровень глюкозы в крови. У здорового человека слишком высокое значение выполняет автоматическую операцию заживления и выпустить больше инсулина в наш кровоток. Другая человеческая метрика будет больными на левой ноге. Обычно это около 0, но над определенным порогом вы ярко осознаете это — Это тревоги поднимается.

Для компьютерных систем обычные метрики связаны с пропускной способностью, частотой ошибок, задержкой, ресурсом (CPU/GPU/Network/…). Обычные упомянутые системы являются Statsd, графит, графана и прометей.

PPROF & FLAMEGRAPHS.

Этот инструмент лучше всего для профилирования интенсивных приложений CPU. Прежде чем я объясню, что он предлагает вам, я хочу покрыть, как это работает. X раз в секунду он останавливает вашу программу и проверяет, какая строка выполняется на машине. Он собирает все образцы исполнения в ведра в строку/функцию, а затем на реконструированных функциях/линию была выполнена в течение того, что время%. Как будто вы смягчаете футбольный матч и посмотрите, у кого есть мяч каждые 10 секунд, и от этого реконструируя, у которого был какой процент владения мячом.

Следы

Если вы помните что-нибудь из этого в блоге, запомните это изображение Comet:

Как горит через атмосферу Земли, она оставляет трассировка над своим путем. Из этого трассировка Мы можем вывести, где это было и сколько времени проводится там. Аналогичная ситуация находится в наших программах.

Трассировка представляет собой единое выполнение запроса/работы. След состоит из нескольких пролетов. SPAN — это значимая единица работы в вашей системе — например Запрос базы данных, RPC вызов, расчет. Продолжительность может быть связана, например родитель/ребенок пролета. Таким образом, след образует дерево пролетов, или в целом Dag (если вы ввели комплекс, за которым следует отношения и другие улоски).

Каждый пролет может иметь полезные метаданные, прикрепленные к нему — как индексированные меченные клавиши/Value Pair, такие как userId, http.statuscode, hostname или дополнительные данные журнала e.g. Точная база данных запроса. Отслеживание Backend предоставляет ожидаемые возможности поиска, сортируя по времени, фильтрацию по тегам и т. Д.

В футбольном примере мы могли бы иметь трассировку, представляющую оценку цели. Он состоит из 3 охвата:

  • Иван пинает мяч
  • Мяч катится к цели
  • Мяч входит в почту ворот

Общие случаи использования

В этом разделе я собираюсь охватывать часы наилучшего использования для трассировки. По сравнению с другими методами, такими как PPROF, отслеживание может обнаружить, когда ваша программа была поставлена спать из-за ожидания IO, противодействия ресурсам или другой причине.

Общий обзор запроса

Это позволяет сделать тематическое исследование от индивидуального следа. Совокупность метрик, в то время как след фокусирует историю по индивидуальному запросу. Какие услуги поступил ли этот индивидуальный запрос? Сколько времени это там потратило? Каково пробование времени на CPU, GPU, сетевые звонки и т. Д.

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

Большое медленное узкое место

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

Причины для большого медленного узкого места могут быть разными. Возможно, вы переусервируете замок, и программа ждет на одну. Или запрос базы данных undertimizes/отсутствует индекс. Наконец, ваш алгоритм работал на 10 пользователей, но после роста до 10 000 пользователей это слишком медленно.

Найдите это, наблюдайте его, проанализируйте его и почините его.

Фанат

Вентилятор — это количество исходящих запросов Сервис делает для каждой входящей входящие запросы. Чем больше вентилирует большую задержку. Иногда вентилятор предназначен специально и полезно, однако в этом контексте мы в первую очередь говорим о вызове одинакового обслуживания снова и снова, когда оптовая операция будет более подходящей.

Это разница между:

SELECT id, name
FROM users
WHERE ... 

против циркуляции ID Список и запрос для каждого ID :

SELECT name
FROM users
WHERE id = $1 AND ... 

Это может произойти непреднамеренно, например, Используя ORM Framework, решив сделать эту вещь. Вы получили свои удостоверения личности, и теперь вы счастливо свяжитесь с ними, не зная, что вы выпускаете новый запрос баз данных каждый раз.

В других случаях это проблема с дизайном API. Если у вас есть внутренний API конечная точка, такая как: /api/v1/user/{id} Для получения пользовательских данных, но требуется объем экспорта, это та же проблема.

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

Вероятность, которую вы собираетесь наблюдать за задержкой P-TH Proctile для вызовов сервисов, каплятся экспоненциально с градусом веена. Вот простая фигура, иллюстрирующая ее.

Формат хромированного отслеживания

Это Простой спецификация формата JSON для отслеживания одного процесса. Catapult Проект включает в себя оказанные для этой спецификации. Тот же рендер, доступный в Chrome под Chrome://Tracing/ Ур Существует различная поддержка для выпивки этого формата, например Исполнение Tensorflow, отслеживание Голанга, сам хромированный рендеринг и т. Д. И легко включить его в ваше приложение, если нет необходимости для распределенного трассировки, и ваши требования просты.

Например, этот простой файл:

[
  {
    "name": "Asub",
    "cat": "PERF",
    "ph": "B",
    "pid": 22630,
    "tid": 22630,
    "ts": 829
  },
  {
    "name": "Asub",
    "cat": "PERF",
    "ph": "E",
    "pid": 22630,
    "tid": 22630,
    "ts": 833
  }
]

Оказывает как:

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

Распределенная трассировка

Все хорошо и денди на одном узле, но проблемы начинаются с распределенных систем. Проблема в том, как подключить/коррелировать следы, исходящие из нескольких узлов. Какие промежутки принадлежат какому след и как связаны эти охватывания?

Сегодня большинство решений принимают заметки из Dapper Google бумага . Каждый след имеет свой уникальный уникальный TraceID и каждый уникальный промежуток, который распространяется через границы узла.

Хотя существует множество представлений о том, как этот контекст должен распространяться и включать ли дополнительные данные во время этого распространения (то есть багаж). Кроме того, каждая бэкэнда имеет свои идеи, как вы должны доставить данные трассировки/охвата им.

Первая доступная бэкэнда была Zipkin, в настоящее время Jaeger Uber теперь является инкубирующим проектом CNCF и хорошее место для начала. Кроме того, различные облачные поставщики имеют собственный внутренний отслеживание SaaS (Google Stackdriver, AWS рентген и т. Д.)

Вот скриншот от Jaeger Frestend для поиска и глядя на ваши следы:

С момента написания против конкретной бэкинги может быть заблокирован жестким поставщиком, появились два клиентских поставщика-нейтральных API — открытая трассировка и открытая перепись.

Клиент боковой поставщика — нейтральные API

В этом подразделе я собираюсь сравнить открытую перепись и стандарт открытого трассировки. Оба являются развивающимися проектом с высоким началом GitHub, многоязычная поддержка с различными реализациями промежуточного программного обеспечения для баз данных, RPC HTTP, GRPC и т. Д.

Открытая трассировка в настоящее время является инкубирующим проектом CNCF, в то время как открытая перепись появилась от внутреннего трассировки Google. В настоящее время открытая перепись имеет свою собственную поставку-нейтральную организацию.

Что касается набора функций, открытая перепись включает метрики внутри своей API, в то время как открытая трассировка только метрики.

В открытой переписи вы добавляете Trace Exports в глобальный набор, в то время как в открытом трассе вы должны указать их в каждой итерации. У них есть глобальная концепция трассировки, но, по крайней мере, в том, что они не предлагают по умолчанию на нем, но вы должны вызвать его. Кроме того, открытое отслеживание API чувствует себя более неуместным и менее полированным по сравнению с открытой переписью.

Для формата распространения открытая перепись указывает стандарт. Открытая трассировка с другой стороны только указывает API, и каждая поддержанная бэкэнда много реализует стандартное распространение API.

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

Пример открытой переписи

Этот подраздел должен описывать базовые блоки здания открытых переписей. Для полных примеров см. Их официальная документация, это довольно хорошо! Они даже отлично подходят Примеры . Мои примеры находятся, но они поддерживают несколько других языков. Для оператора импорта Brevity не может быть опущено.

Сначала мы начнем с определения трассировки экспортера:

j, err := jaeger.NewExporter(jaeger.Options{
        Endpoint:    "http://localhost:14268",
        ServiceName: "opencensus-tracing",
})
trace.RegisterExporter(j)

Мы можем легко начать его, используя Docker. От их начала страница

docker run -d --name jaeger \
  -e COLLECTOR_ZIPKIN_HTTP_PORT=9411 \
  -p 5775:5775/udp \
  -p 6831:6831/udp \
  -p 6832:6832/udp \
  -p 5778:5778 \
  -p 16686:16686 \
  -p 14268:14268 \
  -p 9411:9411 \
  jaegertracing/all-in-one:1.7

Затем мы начнем некоторое место:

ctx, span := trace.StartSpan(ctx, "some/useful/name")
defer span.End()

CTX является экземпляром библиотеки стандарта Context.context.

Мы можем прикрепить некоторые индексированные метаданные с меткой/значением/значением значения к этому диапазону:

span.AddAttribute(trace.StringAttribute("key", "value"))

Открытая трассировка на самом деле указывает некоторые стандартизированные клавиши (E.g. Ошибка, http.statusCode, …). Если вы можете, я смогу использовать их, несмотря на открытую перепись, не указав.

Или мы могли бы добавить некоторые данные журнала, то есть аннотации:

span.Annotate(nil, "some useful annotation")
span.Annotate(
    []trace.Attribute{trace.BoolAttribute("key", true)},
    "some useful log data",
)

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

client = &http.Client{Transport: &ochttp.Transport{}}  // client
http.ListenAndServe(addr, &ochttp.Handler{Handler: handler}) //server

Для клиентской стороны нам нужно только включить правильный контекст в наш запрос:

req = req.WithContext(ctx)
resp, err := client.Do(req)

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

func HandleXXX (w http.ResponseWriter, req *http.Request) {
    ctx := req.Context() 
    // ...
}

Эта глава может быть обобщена в качестве курса CARD CARD/CHEEN/CHEET/через 5 минут.

Резюме

Чтобы обобщить этот пост блога, я рекомендую отслеживать для этих случаев использования наиболее:

  • Рассуждение об общем обзоре производительности
  • Обнаружение больших медленных операций
  • Обнаружение вентилятора

Здесь я представил различные инструменты, такие как формат хромированного отслеживания, открытая трассировка и открытая перепись. Из тех, которые я рекомендую начать с открытой переписи и запустить JAEGER в контейнере Docker. Используйте промежуточное ПО где возможно.

Наконец, пожинать преимущества! Посмотрите, как вы пользы вам и как можно лучше использовать его к вашему успеху.

Ссылка и ссылки

Оригинал: «https://dev.to/nmiculinic/pragmatic-tracing-cnf»