Как реализовать наблюдаемость (как описано Charity Majors) в приложении Asp.Net Core?

В https://charity.wtf/tag/observability/ в разделе КАК СОБИРАТЬ И СТРУКТУРИРОВАТЬ ВАШИ ДАННЫЕ Charity Majors представляет следующую схему:

  1. В начале конвейера инициализируйте «блоб», доступный повсюду в коде, с каждым запросом, имеющим свою собственную копию (фактически привязанную к HttpContext)
  2. Любой код, который хочет записать некоторую информацию, добавляет пары ключ-значение к этому «блобу».
  3. Когда запрос выходит, «большой двоичный объект» доставляется на сервер наблюдаемости в виде структурированного события.

Эта схема имеет большой смысл и довольно элегантна. Это позволяет избежать словесного поноса штатных логов. Однако он также слишком упрощен, поскольку игнорирует запросы на пакетную обработку, где запрос должен обрабатывать N записей, что, вероятно, создаст N наборов подобных структурированных событий, вложенных в родительское структурированное событие, соответствующее самому запросу. В этом случае у нас есть выбор: либо отправить событие пакетной записи, как только запись будет обработана, либо накопить вложенные события в «большом двоичном объекте», которые будут отправлены после завершения запроса. В любом случае это осложнение не обсуждается в посте.

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

  1. Мы используем Azure, и его API Application Insights TrackEvent кажется идеальным в качестве низкоуровневого API. Он поддерживает события вида <Event Name, string-to-string map, string-to-float map>который кажется достаточно богатым. Собранные события можно затем запрашивать во всех измерениях, как нам нравится. Так что сервер наблюдаемости для меня не проблема.
  2. Реализация "blob" - проблема. Я искал реализацию Honeycomb для .Net Core и наткнулся на эту страницу — https://docs.honeycomb.io/getting-data-in/dotnet/ . Однако представленные там 2 варианта кажутся недостаточно зрелыми:
    • HoneyComb .NET оставляет нам самим решать, как обращаться с вложенными событиями.
    • OpenTelemetry .NET , похоже, вообще не о наблюдаемости, а о «3 столпах наблюдаемости» — логировании, метриках и трассировке. Которые не дают наблюдаемости согласно https://www.infoq.com/news/2019/02/rethinking-observability/
  3. Интерфейс Microsoft.Extensions.Logging.ILogger кажется адекватным интерфейсом. Похоже, что метод BeginScope существует явно для разграничения разных пакетов. Но это всего лишь интерфейс.

Итак, мой вопрос: существует ли реализация Asp.Net Core для наблюдения в виде структурированных событий, которая так или иначе учитывает вложенные события и которую можно настроить для доставки в корзину Application Insights?

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

0 ответов

Другие вопросы по тегам