پرش به مطلب اصلی

اتصال اپ های NodeJS به لاگ نگار

· خواندن 5 دقیقه
نیما نکوئی نیا
Software Developer

اتصال اپلیکیشن‌های Node.js به لاگ نگار

این مقاله راهنمایی جامع برای توسعه‌دهندگان فراهم می‌کند تا بتوانند اپلیکیشن‌های Node.js خود را به سرویس لاگ نگار متصل کنند. با استفاده از این راهنما، شما می‌توانید داده‌های لاگ خود را به لاگ نگار ارسال و به شکلی کارآمد مدیریت و مشاهده کنید.

علاوه بر راهنمای متنی به شما پیشنهاد میشود ویدیو یوتیوب همین آموزش را مشاهده کنید:



  1. برای ایجاد دیتای مانیتورینگ مانند لاگ، تریس و متریک در ابتدا نیاز به نصب پکیج های Open Telemetry داریم. برای نصب پکیج های مورد نیاز میتوانید از دستور زیر استفاده کنید:

npm install @opentelemetry/api @opentelemetry/api-logs @opentelemetry/auto-instrumentations-node @opentelemetry/exporter-logs-otlp-http @opentelemetry/exporter-metrics-otlp-proto @opentelemetry/exporter-trace-otlp-http @opentelemetry/resources @opentelemetry/sdk-logs @opentelemetry/sdk-metrics @opentelemetry/sdk-node @opentelemetry/semantic-conventions



  1. سپس کانفیگ زیر را در یک فایل در پروژه خود اضافه میکنیم:
// otel.ts

import { getNodeAutoInstrumentations } from "@opentelemetry/auto-instrumentations-node";
import { OTLPLogExporter } from "@opentelemetry/exporter-logs-otlp-http";
import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-http";
import { OTLPMetricExporter } from "@opentelemetry/exporter-metrics-otlp-proto";
import { Resource } from "@opentelemetry/resources";
import { BatchLogRecordProcessor } from "@opentelemetry/sdk-logs";
import { NodeSDK } from "@opentelemetry/sdk-node";
import { ATTR_SERVICE_NAME } from "@opentelemetry/semantic-conventions";
import env from "./configs/env";
import { PeriodicExportingMetricReader } from "@opentelemetry/sdk-metrics/build/src";

const OTEL_URL = env.OTEL_URL ?? "";

const resource = new Resource({
[ATTR_SERVICE_NAME]: "Lognegar",
});

const logExporter = new OTLPLogExporter({
url: OTEL_URL + "/logs",
});

const traceExporter = new OTLPTraceExporter({
url: OTEL_URL + "/traces",
});

const metricExporter = new OTLPMetricExporter({
url: OTEL_URL + "/metrics",
});

const metricReader = new PeriodicExportingMetricReader({
exporter: metricExporter,
exportIntervalMillis: 10_000, // ms
});

const OTEL_SDK = new NodeSDK({
resource,
metricReader,
traceExporter,
instrumentations: [getNodeAutoInstrumentations()],
logRecordProcessors: [new BatchLogRecordProcessor(logExporter)],
});

// Graceful shutdown for OTEL
process.on("SIGTERM", () => {
OTEL_SDK.shutdown().then(() => console.log("Observation terminated"));
});

export default OTEL_SDK;


  1. برای استفاده از این کانفیگ باید اون رو در جایی که اپلیکیشن شروع به کار میکنه فعال کنیم:

نکته: با کانفیگ زیر به صورت اتوماتیک برای همه درخواست هایی که به سمت سرور ما میاد، تریس و متریک تولید میشه و به سمت Open Telemetry Collector ارسال میشه.

// app.ts

import express from "express";
import OTEL_SDK from "./otel";
import todoRouter from "./routes/todo.route";
import bodyParser from "body-parser";
import { errorHandler } from "./middlewares/errors.middleware";

const app = express();
const port = 3090;

app.use(bodyParser.json());
app.use("/todos", todoRouter);

app.get("/", (req, res) => {
res.status(200).json({ message: "Hello World" });
});

app.use(errorHandler);

app.listen(port, () => {
// Start OTEL SDK
OTEL_SDK.start();

console.log(`App listening on http://localhost:${port}`);
});

  1. برای ایجاد لاگ در سیستم ما باید یک Logger ایجاد کنیم و هر جایی که نیاز داریم یک داده ای رو به صورت لاگ ذخیره کنیم از اون استفاده کنیم. برای این کار کانفیگ زیر را در یک فایل قرار میدهیم:

نکته: برای اینکه دیتا تریس شما در لاگ های شما ذخیره شود مقدار includeTraceContext را true قرار می دهیم تا راحت تر بتوانید تریس لاگ های ایجاد شده را در پنل لاگ نگار مشاهده کنیم.

// otel-logger.ts

import { logs } from "@opentelemetry/api-logs";

const OTEL_LOGGER = logs.getLogger("default", "1.0.0", {
includeTraceContext: true,
});

export default OTEL_LOGGER;

  1. سپس برای لاگ کردن همه درخواست هایی که به سمت سرور میاد میتونیم یک middleware ایجاد کنیم:
// middlewares/logger.middleware.ts

import { Request, Response, NextFunction } from "express";
import OTEL_LOGGER from "../otel-logger";
import { SeverityNumber } from "@opentelemetry/api-logs/build/src";

const requestLogger = (
req: Request,
res: Response,
next: NextFunction
): void => {
const { method, url, body } = req;

OTEL_LOGGER.emit({
severityText: "INFO",
severityNumber: SeverityNumber.INFO,
body: `${method.toUpperCase()} - ${url}`,
attributes: { method, url, body },
});

next();
};

export default requestLogger;
  1. این middleware را در فایل app.ts فعال میکنیم.
// app.ts

import express from "express";
import OTEL_SDK from "./otel";
import todoRouter from "./routes/todo.route";
import bodyParser from "body-parser";
import requestLogger from "./middlewares/logger.middleware";
import { errorHandler } from "./middlewares/errors.middleware";

const app = express();
const port = 3090;

app.use(bodyParser.json());
app.use(requestLogger); // use logger middleware here
app.use("/todos", todoRouter);

app.get("/", (req, res) => {
res.status(200).json({ message: "Hello World" });
});

app.use(errorHandler);

app.listen(port, () => {
// Start OTEL SDK
OTEL_SDK.start();

console.log(`App listening on http://localhost:${port}`);
});

  1. برای کانفیگ کردن Open Telemetry Collector باید در ابتدا در پنل لاگ نگار در قسمت اپلیکیشن ها یک اپ جدید ایجاد و برای اپ خود یک API KEY جدید ایجاد کنید و در کانفیگ خود مانند زیر قرار دهید:
receivers:
otlp:
protocols:
http:
endpoint: 0.0.0.0:4318
grpc:
endpoint: 0.0.0.0:4317

processors:
batch:
timeout: 10s

exporters:
debug:
verbosity: detailed
otlphttp/logs:
endpoint: https://api.lognegar.ir/api
headers:
lognegar-api-key: <YOUR_API_KEY>
otlphttp/traces:
endpoint: https://api.lognegar.ir/api
encoding: json
headers:
lognegar-api-key: <YOUR_API_KEY>
otlphttp/metrics:
endpoint: https://api.lognegar.ir/api
encoding: json
headers:
lognegar-api-key: <YOUR_API_KEY>
service:
pipelines:
logs:
receivers: [otlp]
processors: [batch]
exporters: [otlphttp/logs]
traces:
receivers: [otlp]
processors: [batch]
exporters: [otlphttp/traces]
metrics:
receivers: [otlp]
processors: [batch]
exporters: [otlphttp/metrics]

در انتها شما میتوانید اپلیکیشن خود را اجرا کرده و لاگ ها و تریس و متریک هایی که تولید شده اند را در پنل لاگ نگار در قسمت های مربوطه مشاهده کنید

لینک ریپازیتوری پروژه:

Gihtub