текст перекладу
У сучасних архітектурах програмного забезпечення, зокрема в мікросервісах, керування логуванням, моніторингом та іншими аспектами, що стосуються різних частин системи, може бути викликом. Одним із елегантних рішень цієї проблеми є Шаблон 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