Будування масштабованої, централізованої системи логування в Node.js за допомогою патерну Sidecar.

текст перекладу
pic

У сучасних архітектурах програмного забезпечення, зокрема в мікросервісах, керування логуванням, моніторингом та іншими аспектами, що стосуються різних частин системи, може бути викликом. Одним із елегантних рішень цієї проблеми є Шаблон Sidecar.

Цей шаблон дозволяє розробникам відокремлювати логіку своїх мікросервісів від завдань, таких як логування, моніторинг і безпека. У цьому пості ми розглянемо Шаблон Sidecar з акцентом на логування та покажемо, як реалізувати його за допомогою Node Js та Fluentd для агрегації логів.

Що таке Шаблон Sidecar?

Шаблон Sidecar передбачає запуск допоміжного сервісу поряд з основним додатком (основним сервісом), зазвичай на тому ж хості або в тому ж контейнері.
текст перекладу
Цей сервіс sidecar займається задачами, що не пов'язані з бізнес-логікою, такими як логування, моніторинг, безпека або навіть проксинг.

Уявіть собі sidecar як супутника, який виконує конкретні завдання для основного додатку, дозволяючи йому зосередитися лише на його основній функціональності.

У контексті логування, sidecar може:

  • Збирати логи з додатку.
  • Обробляти та трансформувати дані логів.
  • Пересилати логи до центральної системи логування, такої як Elasticsearch, Logstash або Splunk.

Чому варто використовувати Шаблон Sidecar для логування?

Ось кілька причин, чому варто розглянути використання Шаблону Sidecar для логування у вашій архітектурі мікросервісів:

  • Розділення відповідальностей: Логіка додатку залишається зосередженою на бізнес-функціональності, тоді як sidecar займається логуванням.
    текст перекладу
    Це дозволяє зберігати ваш код чистим і більш підтримуваним.
  • Централізоване логування: Sidecar може збирати логи з кількох сервісів і відправляти їх до центральної системи для зручнішого моніторингу та усунення неполадок.
  • Масштабованість: Sidecar може масштабуватись незалежно від вашого додатку, що дозволяє ефективно обробляти збільшений трафік логів без впливу на продуктивність додатку.

Як працює Шаблон Sidecar для логування?

Крок 1: Налаштування Node.js додатку з Winston

npm install express winston fluent-logger
const express = require('express');  
const winston = require('winston');  

// конфігурація логера  
const config = {  
 host: 'fluentd',  
 port: 24224,  
 timeout: 3.0,  
 requireAckResponse: true, // Додати цю опцію для отримання відповіді від Fluentd  
 tag: 'nodejs.logs'  
};  
const fluentTransport = require('fluent-logger').support.winstonTransport();  
const fluent = new fluentTransport('nodejs.logs', config);  
const logger = winston.createLogger({  
 transports: [fluent, new (winston.transports.Console)()]  
});  

logger.on('flush', () => {  
 console.log("flush");  
})  

logger.on('finish', () => {  
 console.log("finish");  
 fluent.sender.end("end", {}, () => {})  
});  


// Створення Express додатку  
const app = express();  
// Приклад маршруту з логуванням  
app.get('/', (req, res) => {  
 logger.info('Отримано запит на головну сторінку');  
 res.send('Привіт, світе!');  
});  

app.get('/error', (req, res) => {  
 logger.error('Сталася помилка на маршруті /error');  
 res.status(500).send('Внутрішня помилка сервера');  
});  

// Запуск сервера Express  
app.listen(3000, () => {  
 logger.info('Express додаток працює на порту 3000');  
});
  • Fluentd Transport: Логи відправляються до Fluentd для централізованої агрегації.
  • Console Transport: Логи також виводяться в консоль (корисно для локальної розробки).

Крок 2: Налаштування Fluentd

Fluentd буде виконувати роль sidecar в цій архітектурі, збираючи логи з Express додатку і передаючи їх до центральної системи логування.

# Конфігурація Fluentd  


 @type forward  
 port 24224 # Порт, на якому слухає Fluentd  


 @type stdout # Пересилає логи до stdout (виведення в консоль)  

Вищезгадана конфігурація слухає вхідні логи на порту 24224 і пересилає їх до stdout для тестових цілей.

  • ****: Розділ, що слухає вхідні логи на порту 24224.
  • ****: Розділ, що обробляє та пересилає логи з тегом nodejs.logs до консолі.

Крок 3: Запуск Node.js та Fluentd за допомогою Docker Compose

Щоб спростити процес, ми можемо використати Docker Compose для запуску як Node.js додатку, так і Fluentd в окремих контейнерах.
текст перекладу
Ось проста конфігурація docker-compose.yaml:

Docker файл для Node Js додатку

# Використовуємо офіційний образ Node.js як базовий образ  
FROM node:18  

# Встановлюємо робочий каталог всередині контейнера  
WORKDIR /usr/src/app  

# Копіюємо package.json і package-lock.json (якщо вони є)  
COPY package*.json ./  

# Встановлюємо залежності  
RUN npm install  

# Копіюємо інші файли вашого додатку  
COPY . . 

текст перекладу

Відкриваємо порт, на якому буде працювати ваш додаток

EXPOSE 3000

Визначаємо команду для запуску вашого додатку

CMD ["npm", "start"]
```

version: '3'  

services:  
 node-app:  
 build:  
 context: ./app  
 dockerfile: Dockerfile  
 container_name: node-app  
 ports:  
 - "3000:3000"  
 depends_on:  
 - fluentd  
 networks:  
 - side-car-logging  

 fluentd:  
 image: fluent/fluentd:v1.14-1  
 container_name: fluentd  
 volumes:  
 - ./fluentd.conf:/fluentd/etc/fluentd.conf  
 ports:  
 - "24224:24224" # Fluentd слухає на цьому порту  
 environment:  
 - FLUENTD_CONF=fluentd.conf  
 networks:  
 - side-car-logging  

networks:  
 side-car-logging:  
 driver: bridge

Ця конфігурація Docker Compose забезпечує:

  • Node.js додаток відправляє логи до Fluentd через Fluentd logging driver.
  • Fluentd наразі передає логи до консолі, але ви можете налаштувати його для пересилання до інших цілей, таких як Elasticsearch або Logstash.

Крок 4: Перегляд логів

Після налаштування всього, ви можете запустити Docker контейнери

docker-compose up --build

Після того, як сервіси будуть запущені, ви зможете доступитись до Express додатку за адресою http://localhost:3000.

  • Коли ви звертаєтесь до кореневого маршруту (/), він записує інформаційне повідомлення: Received a request to the home page.
  • Коли ви відвідуєте маршрут /error, він записує помилкове повідомлення: An error occurred on the /error route.

Ви побачите логи, виведені в терміналі Fluentd (оскільки Fluentd передає їх до stdout).

Розширена конфігурація Fluentd (необов’язково)


 @type elasticsearch  
 host elasticsearch_host # Замініть на ваш хост Elasticsearch  
 port 9200  
 logstash_format true  
 logstash_prefix fluentd  
 flush_interval 5s  

Висновок

Sidecar Pattern є чудовим способом відокремити кросс-функціональні аспекти, такі як логування, моніторинг і безпека, від основної логіки вашого додатку.
текст перекладу
Використовуючи sidecar, ви можете передати ці обов’язки спеціалізованому сервісу, зберігаючи ваш код чистим та масштабованим.

Чи то ви будуєте мікросервіси, чи керуєте великомасштабною розподіленою системою, Sidecar Pattern може значно покращити спостережуваність та підтримуваність вашої системи.

Перекладено з: Building Scalable, Centralized Logging in Node.js Using the Sidecar Pattern

Leave a Reply

Your email address will not be published. Required fields are marked *