Все три Go-сервиса (ingest, device-control, rule-engine) отдают /metrics в формате Prometheus: счётчики MQTT/RabbitMQ/ClickHouse операций, гистограммы длительности батч-флашей и диспатча правил, переходы устройств online/offline. Добавлены сервисы prometheus и grafana в docker-compose с провижининг конфигом (datasource + два готовых дашборда: "Ingest & Telemetry" и "Automation & Devices").
90 lines
1.9 KiB
Go
90 lines
1.9 KiB
Go
// Package config loads rule-engine-service settings from environment
|
|
// variables, matching the names used in the repo-root .env.example.
|
|
package config
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"strconv"
|
|
"time"
|
|
)
|
|
|
|
type Config struct {
|
|
PostgresDSN string
|
|
|
|
DeviceControlGRPCTarget string
|
|
|
|
RabbitMQURL string
|
|
|
|
RuleCacheRefreshInterval time.Duration
|
|
|
|
MetricsPort int
|
|
}
|
|
|
|
func Load() (Config, error) {
|
|
cfg := Config{
|
|
PostgresDSN: fmt.Sprintf("postgres://%s:%s@%s:%s/%s",
|
|
getEnv("POSTGRES_USER", "home_automation"),
|
|
getEnv("POSTGRES_PASSWORD", ""),
|
|
getEnv("POSTGRES_HOST", "localhost"),
|
|
getEnv("POSTGRES_PORT", "5432"),
|
|
getEnv("POSTGRES_DB", "home_automation"),
|
|
),
|
|
|
|
DeviceControlGRPCTarget: fmt.Sprintf("%s:%s",
|
|
getEnv("DEVICE_CONTROL_HOST", "localhost"),
|
|
getEnv("DEVICE_CONTROL_GRPC_PORT", "50051"),
|
|
),
|
|
|
|
RabbitMQURL: fmt.Sprintf("amqp://%s:%s@%s:%s/",
|
|
getEnv("RABBITMQ_USER", "guest"),
|
|
getEnv("RABBITMQ_PASSWORD", "guest"),
|
|
getEnv("RABBITMQ_HOST", "localhost"),
|
|
getEnv("RABBITMQ_PORT", "5672"),
|
|
),
|
|
}
|
|
|
|
interval, err := getEnvDuration("RULE_ENGINE_CACHE_REFRESH_INTERVAL", 15*time.Second)
|
|
if err != nil {
|
|
return Config{}, err
|
|
}
|
|
cfg.RuleCacheRefreshInterval = interval
|
|
|
|
if cfg.MetricsPort, err = getEnvInt("RULE_ENGINE_METRICS_PORT", 9102); err != nil {
|
|
return Config{}, err
|
|
}
|
|
|
|
return cfg, nil
|
|
}
|
|
|
|
func getEnv(key, fallback string) string {
|
|
if v := os.Getenv(key); v != "" {
|
|
return v
|
|
}
|
|
return fallback
|
|
}
|
|
|
|
func getEnvInt(key string, fallback int) (int, error) {
|
|
v := os.Getenv(key)
|
|
if v == "" {
|
|
return fallback, nil
|
|
}
|
|
n, err := strconv.Atoi(v)
|
|
if err != nil {
|
|
return 0, fmt.Errorf("%s: %w", key, err)
|
|
}
|
|
return n, nil
|
|
}
|
|
|
|
func getEnvDuration(key string, fallback time.Duration) (time.Duration, error) {
|
|
v := os.Getenv(key)
|
|
if v == "" {
|
|
return fallback, nil
|
|
}
|
|
d, err := time.ParseDuration(v)
|
|
if err != nil {
|
|
return 0, fmt.Errorf("%s: %w", key, err)
|
|
}
|
|
return d, nil
|
|
}
|