@gati-framework/observability
Version:
Observability stack for Gati framework - Prometheus, Grafana, Loki, and Tracing
66 lines (65 loc) • 2.16 kB
JavaScript
export * from './prometheus/metrics.js';
export * from './loki/logger.js';
export * from './tracing/distributed-tracing.js';
export * from './adapters/index.js';
import { PrometheusMetrics, createPrometheusMiddleware } from './prometheus/metrics.js';
import { LokiLogger, createLokiMiddleware } from './loki/logger.js';
import { DistributedTracing, createTracingMiddleware } from './tracing/distributed-tracing.js';
export class ObservabilityStack {
metrics;
logger;
tracing;
constructor(config) {
if (config.prometheus !== false) {
this.metrics = new PrometheusMetrics();
}
if (config.loki) {
this.logger = new LokiLogger({
...config.loki,
labels: {
service: config.serviceName,
version: config.serviceVersion || '1.0.0',
environment: config.environment || 'production',
...config.loki.labels,
},
});
}
if (config.tracing) {
this.tracing = new DistributedTracing({
...config.tracing,
serviceVersion: config.serviceVersion,
environment: config.environment,
});
}
}
getMiddleware() {
const middleware = [];
if (this.metrics) {
middleware.push(createPrometheusMiddleware(this.metrics));
}
if (this.logger) {
middleware.push(createLokiMiddleware(this.logger));
}
if (this.tracing) {
middleware.push(createTracingMiddleware(this.tracing));
}
return middleware;
}
async getMetricsHandler() {
if (!this.metrics) {
throw new Error('Prometheus metrics not enabled');
}
return async (_req, res) => {
res.setHeader('Content-Type', 'text/plain');
res.send(await this.metrics.getMetrics());
};
}
async shutdown() {
if (this.logger) {
await this.logger.flush();
}
if (this.tracing) {
await this.tracing.shutdown();
}
}
}