Охватить спонсируемый этот пост.
Это первая из двух частей.
За последние несколько лет Openelemetry была, по моему мнению, одним из самых привлекательных разработок в сообществе программного обеспечения. Это доказано невероятно ценным для инструментальных распределенных систем, микросервисов и сложных архитектур. Из -за этого команды могут понимать свои системы с повышением эффективности и делиться этим пониманием в организации.
Благодаря его быстрому внедрению, Opentelemetry также становится все более распространенной на фронте. Тем не менее, мы сталкиваемся с проблемой: это неловко использовать, особенно в браузере.
Это не обязательно чья -то вина. Это естественное следствие наличия так много разных языков с использованием одного API; Что -то обязательно почувствует. Спецификация OpenElemetry утверждает, что API должны чувствовать себя идиоматическим для языка, но неловкость дизайна сохраняется. Я не уверен, почему, но я полагаю, что когда вы устанавливаете потребности каждого сообщества вместе с общим знаменателем языковых функций, вы неизбежно получаете то, что не чувствует себя вполне естественно ни на одном языке.
Тем не менее, есть огромная возможность построить на вершине этого основания и предоставить что -то, что застройщики, занимающиеся фронтом, найдут более эргономичные. Несколько языков уже проделали аналогичную работу: например, Ruby, Go и Java имеют довольно эргономичную интеграцию Opentelemetry.
Эти эргономические реализации имеют общие факторы: функциональность, специфичная для языка, используется для создания удобств поверх общего API, а общие паттерны потока управления естественным образом вписываются в машину состояния, которую ожидает Opentelemetry.
Иногда язык не имеет особенно распространенных моделей потока управления (например, Haskell или Ruby), но оба языка имеют гибкость для формирования потока управления способами, которые позволяют библиотекам инструментов оставаться эргономичным, несмотря на это потенциальное трение.
Мы получим огромную выгоду от дезагрегирования контекста, управления контекстом, инструментов данных и потока управления в наших системах.
На самом деле, я собираюсь заявить о смелом утверждении: сердцем Opentelemetry является управление контекстом, которая является концепцией, которая намеренно отделена от остальной части спецификации, чтобы контекст мог быть реализован наиболее разумным способом для среды выполнения. Несмотря на намерение, мы, кажется, не достигаем преимуществ этого разделения проблем в реальности.
Если мы хотим получить эти преимущества и разблокировать по -настоящему эргономичную телеметрическую инструментацию, разработка способности разделять поток управления, который ожидает Opentelemetry от потока управления, который имеет смысл в вашей программе. Если есть одна вещь, которую я бы хотел, чтобы люди отняли у этой статьи, это то, что мы бы отличились от дезагрегации контекста, управления контекстом, инструментов данных и потока управления в наших системах.
Здесь есть компромисс, и это может быть сложно ориентироваться. Если вы возьмете статусную машину желаемого потока управления Opentelemetry и подтолкните его в сами библиотеки, они могут стать чрезвычайно громоздкими в использовании. С другой стороны, если вы полагаетесь на неявное распространение этого потока управления, вы столкнетесь с проблемами, когда требуемый поток управления Opentelemetry отличается от естественного потока управления вашей программой.
API трению в Opentelemetry
Когда поток управления привязан к тому, как вы аннотируете и придаете свой код, вы должны изменить структуру кода, чтобы соответствовать тому, что ожидает Opentelemetry. Для JavaScript это просто не то, что он делает хорошо, особенно на фронте.
JavaScript также имеет уникальное ограничение необходимости предоставить «тот же» язык в браузере, а также в Node.js. На фронте у вас есть время выполнения браузера, управляемое событиями, которая предназначена для тяжелой работы для вас. Из-за этого это довольно ограничено с точки зрения асинхронного кода, контекста потока и управления деталями низкого уровня. В конце концов, браузер должен справиться со всем этим, и API -интерфейсы браузеров были изначально разработаны в мире, где код frontend был очень простым.
Теперь, когда у нас есть сложный код на фронте, вы можете столкнуться с несоответствиями между тем, что вы хотели бы сделать, и тем, что облегчает браузер. На бэкэнде у вас есть node.js, который быстро отклонился от браузера, чтобы добавить определенные API, которые были необходимы для работы в операционной системе, таких как обработка процессов и контекст потока; Эти отклонения оказываются значительно проще, но не имеют дополнения к фронте (пока).
Если мы отступим и подумаем о том, что мы можем сделать, не меняя языка, мне нравится создавать его вокруг двух концепций: «аннотация без структуры» и «не заставляйте меня думать».
Несмотря на то, что node.js может иметь лучшие средства для обеспечения эргономической реализации Openelemetry, JavaScript по-прежнему глубоко ориентирован на цикл событий, основанный на дизайне. Модель пролетов и трассов OpentereLemetry действительно не вписывается в этот шаблон. Как следствие, трудно эффективно настроить Opentelemetry в JavaScript.
Самые большие улучшения, вероятно, потребуют языковых изменений. Но если мы отступим и подумаем о том, что мы можем сделать, не меняя языка, мне нравится создавать его вокруг двух концепций: «аннотация без структуры» и «не заставляйте меня думать».
Одним из самых естественных API для Opentelemetry является запуск пролета, выполнить работу внутри этого пролета и иметь целый промежуток чистого заполнения внутри родительской функции. Если у вас очень чистый, синхронный код, ваша жизнь будет довольно хорошей. Тем не менее, JavaScript был разработан первоначально для выполнения на определенном мероприятии, вызванной временем выполнения браузера, а затем выходом. Следовательно, наиболее естественным API инструментов для JavaScript является консоль.log. Каждый раз, когда вы отклоняетесь от эргономики консоли. Log, вы усложняете свою жизнь и боретесь с естественными моделями языка.
Go, напротив, имеет ключевое слово «отсрочки», которое позволяет вам создавать неявную область в полуэкспонировании, не нарушая управляющего потока вашего языка. Он также предоставляет контекстный объект, который позволяет вам проточить контекст через ваше приложение без ручного распространения. Это идеально подходит для OpenteLemetry (и инструментов в целом). Java поддерживает нити-локальное состояние, декораторы и метапрограммирование, которое позволяет создавать эргономичный API на вершине фундаментов базового API Opentelemetry.
Вы можете увидеть довольно резкую разницу между эргономикой со следующими (несколько заинтересованными выбранными) примерами:
// var (tracer = otel.tracer (name)) func rolldice (w http.responsewriter, r *http.request) {ctx, span: = tracer.start (r.context (), «roll») defer span.end () // rest funct Rolldice (w http.responsewriter, r *http.request) {ctx, span: = tracer.start (r.context (), «roll») defer span.end () // остальное функцию}
против
// const webtracerwithzone = providerwithzone.gettracer (‘example-tracer-web’); const singlespan = webtracerwithzone.startspan (‘files-series-info’); context.with (trace.setspan (context.active (), singlespan), () => {getData (url) .then ((_ data) => {trace.getspan (context.active ()). addevent (‘fetching-span-span-comploed’); singlespan.end ();}); // rest off-span ‘);); 1234567891011 // const webtracerwithzone = providerwithzone.gettracer (‘example-tracer-web’); const singlespan = webtracerwithzone.startspan (‘files-series-info’); context.with (trace.setspan (context.active (), singlespan), () => {getData (url) .Then ((_ Data) => {trace.getSpan (context.Active ().). SinglePan.end ();
Хотя этот пример выбран для демонстрации болевых точек, мы можем увидеть, что происходит, когда происходит трение между набором признаков языка и спецификацией API. В идеале мы хотели бы, чтобы код для примера GO и пример JavaScript был почти идентичен эргономике.
Аннотация без структуры
Итак, как мы можем облегчить идею о том, что самые простые инструменты в JavaScript должны чувствовать себя как консоль. Log, особенно если у вас нет хорошего способа проточить контекст? Асинхронный контекст в JavaScript несколько не хватает на бэкэнде и полностью отсутствует на бренде. У вас также нет примитивов или примитивов или способности неявно делиться состоянием на языке. Итак, что вы можете сделать?
Я думаю, что ключ состоит в том, чтобы взглянуть на основные спецификации и протоколы Opentelemetry. Оказывается, что прослеживает, охватывает, охватывает события и регистрирует, все строятся на вершине основного примитива … то есть все они в основном просто события. На самом деле, почти все в Opentelemetry — это события вниз.
- Журналы — это события, которые отсутствуют, например, имени событий. (Педантически говоря, в спецификациях события являются Logrocords с непустым событием).
- Пролеты — это события с определенными типами метаданных и семантикой о том, как вы должны составлять и построить их.
- Следы представляют собой серию пролетов, которые, опять же, просто события.
Другими словами, семантика о том, как вы должны написать события, какой приказ отправлять их и какую информацию для событий по сути, является единственной вещью, вызывающей это трение в API Openelemetry. Если вы удалите некоторые из ограничений, связанных с тем, как вы структурируете свои события, и позволите SDK OpenteLemetry, чтобы выдвинуть некоторые бремени метаданных на коллектор, вы можете решить большую сложность, перемещая управление машинами штата из вашего потока управления кодом в SDK, или, возможно, даже само время выполнения языка. Вы могли бы даже сделать это таким образом, чтобы поднять бремя сшивания пролетов и прослеживаться на что -то, что можно было бы спроектировать, чтобы быть государственным; В то время как коллекционер Opentelemetry в настоящее время не имеет состояния, это было бы естественным местом для обработки этого состояния.
Моя большая идея здесь, которая может показаться противоречивой, заключается в следующем: что, если мы отбросят идею о том, что пролеты и трассы должны иметь определенную структуру начала и конец, которая соответствует структуре кода? Вместо этого, что, если мы аннотируем все таким образом, что позволяет государственной машине начала и окончания пролета в коллекционере?
Скажем так, если бы этот кусок был пролетом, я был бы беспокоиться о способности Opentelemetry справляться с этим. Так как у меня есть гораздо больше, чтобы покрыть, я разбил его на две части. В следующей статье я поделюсь своей второй концепцией для создания более эргономичной Opentelemetry для JavaScript: «Не заставляйте меня думать». Затем я пойду в некоторые идеи для будущего состояния телеметрии, а также то, что мы можем сделать сегодня, чтобы создать лучшую поддержку для Opentelemetry в браузере.
В то же время, если вы хотите узнать больше о том, над чем работает группа по особым интересам браузера (SIG), ознакомьтесь с этим вебинаром по требованию. Как всегда, магия Opentelemetry для меня была в его сообществе, и особенно в готовности этого сообщества собраться вместе и создать лучшее будущее для всех. Присоединяйтесь к вечеринке!
Emprace-это ориентированная на пользователь платформа наблюдения, которая связывает технические характеристики с воздействием конечного пользователя. Embrace, оснащенная OpenElemetry, предоставляет реальное мониторинг пользователей для мобильных устройств и веб -сайтов, поэтому инженерные команды могут быстрее решать проблемы, повысить производительность и обеспечить исключительные цифровые впечатления. Узнайте больше последних из Embrace Trending Stories youtube.com/thenewstack Tech Moving быстро, не пропустите эпизод. Подпишитесь на наш канал YouTube, чтобы транслировать все наши подкасты, интервью, демонстрации и многое другое. Группа подпишитесь с эскизом. Хейзел слабо проводит свои дни, создавая команды людей, а также инфраструктуру, системы, автоматизацию и инструменты, чтобы сделать жизнь лучше для других. Она работала в различных компаниях, в широком спектре технологий и знает … Подробнее о Хейзел слабо