Обзор

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

Поэтому очень важно иметь идентификатор трассировки для каждого журнала, генерируемого каждым микросервисом, чтобы мы могли сопоставить журналы.

Это одна из основных спецификаций для создания микросервиса. Решение указанной выше проблемы очень простое.

Проблема

Многие проекты с открытым исходным кодом поддерживают это прямо из коробки. Но проблема в том, что большинство из них связаны со своей экосистемой. Например: если вы используете Kubernetes, вы можете использовать Istio (envoy) для передачи идентификатора запроса другому микросервису. Но это не так просто. Во-первых, вам нужно понять шаблон sidecar и попробовать настроить Istio и envoy, что само по себе является сложной задачей. И тогда вам также нужно изменить свой генератор журналов. В двух словах много чего реализовать.

Наиболее очевидное решение - реализовать его, но реализация этого также вызывает множество проблем, таких как реструктуризация кода, построение текущего контекста, переопределение регистратора и т. Д. Если вы видите шаги, которые нужно сделать, чтобы это произошло, просто, как указано ниже.

Решение:

  1. Создайте общий заголовок для передачи / хранения идентификатора запроса (например: X-REQUEST-ID
  2. Создавать уникальный идентификатор запроса для каждого входящего запроса, если он не присутствует в текущем контексте / заголовке.
  3. Каждый сгенерированный журнал должен иметь идентификатор запроса из их контекста.
  4. Передайте текущий идентификатор запроса другой микросервисе при удаленном вызове (обычно HTTP).

Когда я решил реализовать это самостоятельно, я думал переопределить только регистратор и планировал использовать Istio с Envoy для передачи идентификатора запроса в сервисах. Но это была непростая задача. Для нас хорошо то, что большинство сервисов написано с использованием ExpressJ. Поэтому я решил написать библиотеку для управления распределенным логированием.

Эта библиотека использует следующие зависимости:

  1. express-http-context используется для хранения идентификатора трассировки для каждой области запроса
  2. axios используется для звонков по протоколу Http
  3. log4js используется для создания журналов с идентификатором трассировки

Используя перехватчики запросов axios, становится легко добавлять заголовок X-REQUEST-ID для каждого исходящего вызова Http.

Шаги

установить экспресс-стакан

npm install express-glass

Добавить конфигурацию регистратора

создайте файл конфигурации в вашем текущем рабочем каталоге, например:

vim config/index.js и вставьте следующий конфиг для логгера log4js

const config = {
  logging: {
    appenders: { out: { type: 'stdout', layout: { type: 'basic'} } },
    categories: { default: { appenders: ['out'], level: 'info' } }
  }
}
module.exports = config

Присоедините промежуточное ПО к экспресс-серверу

const express = require('express');
const {httpContext, contextMiddleware} = require('express-glass');
var app = express();
app.use(httpContext.middleware);
app.use(contextMiddleware)

Использование

Мы можем зарегистрировать идентификатор-запроса-трассировки в любом месте вашего экспресс-проекта. если идентификатор запроса присутствует, он будет зарегистрирован.

// import anywhere in the project
const {logger, restClient} = require('express-glass');
//it will log the curren request trace id
function foo() {
  logger().info('it's a fun');
}

//it will forward the current request id to user service
function fetchUser(user_id) {
  //as we are using axios under the hood, we can use all available function provided by axios
  return await restClient.create({url: 'foo'}).get(user_id)
}

Заключение:

Надеюсь, я объяснил все достаточно ясно, чтобы вы поняли. Если у вас есть вопросы, не стесняйтесь спросить. Вы можете найти меня в твиттере.

Убедитесь, что вы нажали на зеленое сердце внизу, и подписывайтесь на меня, чтобы узнать больше о технологиях :)