@aegislog/transports
v0.2.5
Published
OpenTelemetry OTLP and batching cloud transports for AegisLog.
Downloads
1,164
Readme
@aegislog/transports 📡
Production transports and ingestion sinks for AegisLog.
- 📊
LokiBatchSink/GrafanaLokiSink: Batched buffer queue pushing to Grafana Loki/loki/api/v1/pushwith LogQL query engine (lokiSink.query). - 📈
PrometheusMetricsSink: Zero-dependency Prometheus exposition format exporter tracking log volumes, error counters, compliance audits, and AI token/cost metrics. - 🍃
MongoBatchSink: Batched buffer queue writing into MongoDB viainsertMany({ ordered: false }). - 📡
OpenTelemetrySink: Native OpenTelemetry OTLP/v1/logsHTTP transport. - ⚡
HttpBatchSink/AxiomSink: Batched HTTP log ingestion with periodic timer flushes.
Installation
pnpm add @aegislog/transports aegislogQuickstart
MongoDB Batched Sink & Query Engine
import { createLogger } from "aegislog";
import { MongoBatchSink } from "@aegislog/transports";
const mongoSink = new MongoBatchSink({
model: SystemLogsModel, // Direct Mongoose model or db.collection("system_logs")
batchSize: 100,
flushIntervalMs: 2000,
});
const logger = createLogger({
sinks: [mongoSink],
gracefulShutdown: true, // Auto-flushes on SIGTERM
});
// Query historical logs
const { items, total } = await mongoSink.query({
level: "error",
actorId: "usr_123",
limit: 20,
});OpenTelemetry OTLP Sink
import { createLogger } from "aegislog";
import { OpenTelemetrySink } from "@aegislog/transports";
const otelSink = new OpenTelemetrySink({
endpoint: "http://localhost:4318/v1/logs",
serviceName: "order-service",
});
const logger = createLogger({
sinks: [otelSink],
});Grafana & Grafana Loki Batched Sink & LogQL Engine
import { createLogger } from "aegislog";
import { LokiBatchSink } from "@aegislog/transports";
const lokiSink = new LokiBatchSink({
host: "http://localhost:3100", // Or https://logs-prod-us-central1.grafana.net
labels: { app: "order-service", env: "production" },
batchSize: 50,
flushIntervalMs: 2000,
});
const logger = createLogger({
sinks: [lokiSink],
gracefulShutdown: true,
});
// Query historical logs using LogQL directly from Node.js
const { items, total } = await lokiSink.query({
level: "error",
search: "payment failed",
limit: 20,
});Prometheus Metrics Sink (Zero-Dependency Exposition)
import express from "express";
import { createLogger } from "aegislog";
import { PrometheusMetricsSink } from "@aegislog/transports";
const app = express();
const metricsSink = new PrometheusMetricsSink();
const logger = createLogger({ sinks: [metricsSink] });
logger.info("Order processed");
// Expose standard Prometheus /metrics endpoint
app.get("/metrics", (_req, res) => {
res.type(metricsSink.contentType).send(metricsSink.getMetrics());
});