88 lines
2.8 KiB
TypeScript
88 lines
2.8 KiB
TypeScript
/**
|
|
* Monitoring configuration using Zod
|
|
* Prometheus metrics, Grafana visualization, and Loki logging
|
|
*/
|
|
import { cleanEnv, envValidators } from './env-utils';
|
|
|
|
const { str, port, bool, num, strWithChoices } = envValidators;
|
|
|
|
/**
|
|
* Prometheus configuration with validation and defaults
|
|
*/
|
|
export const prometheusConfig = cleanEnv(process.env, {
|
|
// Prometheus Server
|
|
PROMETHEUS_HOST: str('localhost', 'Prometheus host'),
|
|
PROMETHEUS_PORT: port(9090, 'Prometheus port'),
|
|
PROMETHEUS_URL: str('', 'Complete Prometheus URL (overrides host/port)'),
|
|
|
|
// Authentication
|
|
PROMETHEUS_USERNAME: str('', 'Prometheus username (if auth enabled)'),
|
|
PROMETHEUS_PASSWORD: str('', 'Prometheus password (if auth enabled)'),
|
|
|
|
// Metrics Collection
|
|
PROMETHEUS_SCRAPE_INTERVAL: str('15s', 'Default scrape interval'),
|
|
PROMETHEUS_EVALUATION_INTERVAL: str('15s', 'Rule evaluation interval'),
|
|
PROMETHEUS_RETENTION_TIME: str('15d', 'Data retention time'),
|
|
|
|
// TLS Settings
|
|
PROMETHEUS_TLS_ENABLED: bool(false, 'Enable TLS for Prometheus'),
|
|
PROMETHEUS_TLS_INSECURE: bool(false, 'Skip TLS verification'),
|
|
});
|
|
|
|
/**
|
|
* Grafana configuration with validation and defaults
|
|
*/
|
|
export const grafanaConfig = cleanEnv(process.env, {
|
|
// Grafana Server
|
|
GRAFANA_HOST: str('localhost', 'Grafana host'),
|
|
GRAFANA_PORT: port(3000, 'Grafana port'),
|
|
GRAFANA_URL: str('', 'Complete Grafana URL (overrides host/port)'),
|
|
|
|
// Authentication
|
|
GRAFANA_ADMIN_USER: str('admin', 'Grafana admin username'),
|
|
GRAFANA_ADMIN_PASSWORD: str('admin', 'Grafana admin password'),
|
|
|
|
// Security Settings
|
|
GRAFANA_ALLOW_SIGN_UP: bool(false, 'Allow user sign up'),
|
|
GRAFANA_SECRET_KEY: str('', 'Grafana secret key for encryption'),
|
|
|
|
// Database Settings
|
|
GRAFANA_DATABASE_TYPE: strWithChoices(['mysql', 'postgres', 'sqlite3'], 'sqlite3', 'Grafana database type'),
|
|
GRAFANA_DATABASE_URL: str('', 'Grafana database URL'),
|
|
|
|
// Feature Flags
|
|
GRAFANA_DISABLE_GRAVATAR: bool(true, 'Disable Gravatar avatars'),
|
|
GRAFANA_ENABLE_GZIP: bool(true, 'Enable gzip compression'),
|
|
});
|
|
|
|
// Export typed configuration objects
|
|
export type PrometheusConfig = typeof prometheusConfig;
|
|
export type GrafanaConfig = typeof grafanaConfig;
|
|
|
|
// Export individual config values for convenience
|
|
export const {
|
|
PROMETHEUS_HOST,
|
|
PROMETHEUS_PORT,
|
|
PROMETHEUS_URL,
|
|
PROMETHEUS_USERNAME,
|
|
PROMETHEUS_PASSWORD,
|
|
PROMETHEUS_SCRAPE_INTERVAL,
|
|
PROMETHEUS_EVALUATION_INTERVAL,
|
|
PROMETHEUS_RETENTION_TIME,
|
|
PROMETHEUS_TLS_ENABLED,
|
|
PROMETHEUS_TLS_INSECURE,
|
|
} = prometheusConfig;
|
|
|
|
export const {
|
|
GRAFANA_HOST,
|
|
GRAFANA_PORT,
|
|
GRAFANA_URL,
|
|
GRAFANA_ADMIN_USER,
|
|
GRAFANA_ADMIN_PASSWORD,
|
|
GRAFANA_ALLOW_SIGN_UP,
|
|
GRAFANA_SECRET_KEY,
|
|
GRAFANA_DATABASE_TYPE,
|
|
GRAFANA_DATABASE_URL,
|
|
GRAFANA_DISABLE_GRAVATAR,
|
|
GRAFANA_ENABLE_GZIP,
|
|
} = grafanaConfig;
|