config/flags.go
Rama main · réplica de lectura del repositorio original.
package config
import (
"maps"
"github.com/coroot/coroot/db"
"github.com/coroot/coroot/timeseries"
"gopkg.in/alecthomas/kingpin.v2"
)
var (
configFile = kingpin.Flag("config", "Configuration file").Envar("CONFIG").String()
listen = kingpin.Flag("listen", "Listen address - ip:port or :port").Envar("LISTEN").String()
httpsListen = kingpin.Flag("https-listen", "HTTPS listen address - ip:port or :port").Envar("HTTPS_LISTEN").String()
httpDisabled = kingpin.Flag("http-disabled", "Disable HTTP server").Envar("HTTP_DISABLED").Bool()
grpcDisabled = kingpin.Flag("grpc-disabled", "Disable gRPC server").Envar("GRPC_DISABLED").Bool()
grpcListen = kingpin.Flag("grpc-listen", "gRPC listen address - ip:port or :port").Envar("GRPC_LISTEN").String()
tlsCertFile = kingpin.Flag("tls-cert-file", "Path to the TLS certificate file").Envar("TLS_CERT_FILE").String()
tlsKeyFile = kingpin.Flag("tls-key-file", "Path to the TLS private key file").Envar("TLS_KEY_FILE").String()
urlBasePath = kingpin.Flag("url-base-path", "The base URL to run Coroot at a sub-path, e.g. /coroot/").Envar("URL_BASE_PATH").String()
dataDir = kingpin.Flag("data-dir", `Path to the data directory`).Envar("DATA_DIR").String()
defaultTimeRange = timeseries.DurationFlag(kingpin.Flag("default-time-range", "Default time range for the UI and API when no explicit range is given (e.g. 30m, 1h, 3h; default 1h)").Envar("DEFAULT_TIME_RANGE"))
cacheTTL = timeseries.DurationFlag(kingpin.Flag("cache-ttl", "Cache TTL (e.g. 8h, 2d, 1w; default 30d)").Envar("CACHE_TTL"))
cacheGcInterval = timeseries.DurationFlag(kingpin.Flag("cache-gc-interval", "Cache GC interval").Envar("CACHE_GC_INTERVAL"))
tracesTTL = timeseries.DurationFlag(kingpin.Flag("traces-ttl", "Traces TTL (e.g. 8h, 3d, 2w; default 7d)").Envar("TRACES_TTL"))
logsTTL = timeseries.DurationFlag(kingpin.Flag("logs-ttl", "Logs TTL (e.g. 8h, 3d, 2w; default 7d)").Envar("LOGS_TTL"))
profilesTTL = timeseries.DurationFlag(kingpin.Flag("profiles-ttl", "Profiles TTL (e.g. 8h, 3d, 2w; default 7d)").Envar("PROFILES_TTL"))
metricsTTL = timeseries.DurationFlag(kingpin.Flag("metrics-ttl", "Metrics TTL (e.g. 8h, 30d, 1y; default 7d)").Envar("METRICS_TTL"))
pgConnectionString = kingpin.Flag("pg-connection-string", "Postgres connection string (sqlite is used if not set)").Envar("PG_CONNECTION_STRING").String()
doNotCheckForDeployments = kingpin.Flag("do-not-check-for-deployments", "Don't check for new deployments").Envar("DO_NOT_CHECK_FOR_DEPLOYMENTS").Bool()
doNotCheckForUpdates = kingpin.Flag("do-not-check-for-updates", "Don't check for new versions").Envar("DO_NOT_CHECK_FOR_UPDATES").Bool()
disableUsageStatistics = kingpin.Flag("disable-usage-statistics", "Disable usage statistics").Envar("DISABLE_USAGE_STATISTICS").Bool()
disableBuiltinAlerts = kingpin.Flag("disable-builtin-alerts", "Disable all built-in alerting rules").Envar("DISABLE_BUILTIN_ALERTS").Bool()
authAnonymousRole = kingpin.Flag("auth-anonymous-role", "Disable authentication and assign one of the following roles to the anonymous user: Admin, Editor, or Viewer.").Envar("AUTH_ANONYMOUS_ROLE").String()
authBootstrapAdminPassword = kingpin.Flag("auth-bootstrap-admin-password", "Password for the default Admin user").Envar("AUTH_BOOTSTRAP_ADMIN_PASSWORD").String()
developerMode = kingpin.Flag("developer-mode", "If enabled, Coroot will not use embedded static assets").Envar("DEVELOPER_MODE").Bool()
clickHouseSpaceManagerDisabled = kingpin.Flag("disable-clickhouse-space-manager", "Disable ClickHouse space manager that automatically cleans up old partitions").Envar("CLICKHOUSE_SPACE_MANAGER_DISABLED").Bool()
clickHouseSpaceManagerUsageThresholdPercent = kingpin.Flag("clickhouse-space-manager-usage-threshold", "Disk usage percentage threshold for triggering partition cleanup in ClickHouse").Envar("CLICKHOUSE_SPACE_MANAGER_USAGE_THRESHOLD").Int()
clickHouseSpaceManagerMinPartitions = kingpin.Flag("clickhouse-space-manager-min-partitions", "Minimum number of partitions to keep when cleaning up ClickHouse disk space").Envar("CLICKHOUSE_SPACE_MANAGER_MIN_PARTITIONS").Int()
globalClickhouseAddress = kingpin.Flag("global-clickhouse-address", "").Envar("GLOBAL_CLICKHOUSE_ADDRESS").String()
globalClickhouseUser = kingpin.Flag("global-clickhouse-user", "").Envar("GLOBAL_CLICKHOUSE_USER").String()
globalClickhousePassword = kingpin.Flag("global-clickhouse-password", "").Envar("GLOBAL_CLICKHOUSE_PASSWORD").String()
globalClickhouseInitialDatabase = kingpin.Flag("global-clickhouse-initial-database", "").Envar("GLOBAL_CLICKHOUSE_INITIAL_DATABASE").String()
globalClickhouseTlsEnabled = kingpin.Flag("global-clickhouse-tls-enabled", "").Envar("GLOBAL_CLICKHOUSE_TLS_ENABLED").Bool()
globalClickhouseTlsSkipVerify = kingpin.Flag("global-clickhouse-tls-skip-verify", "").Envar("GLOBAL_CLICKHOUSE_TLS_SKIP_VERIFY").Bool()
globalClickhouseTlsCAFile = kingpin.Flag("global-clickhouse-tls-ca-file", "Path to the CA certificate file for ClickHouse TLS verification").Envar("GLOBAL_CLICKHOUSE_TLS_CA_FILE").String()
globalPrometheusUrl = kingpin.Flag("global-prometheus-url", "").Envar("GLOBAL_PROMETHEUS_URL").String()
globalPrometheusTlsSkipVerify = kingpin.Flag("global-prometheus-tls-skip-verify", "").Envar("GLOBAL_PROMETHEUS_TLS_SKIP_VERIFY").Bool()
globalRefreshInterval = timeseries.DurationFlag(kingpin.Flag("global-refresh-interval", "").Envar("GLOBAL_REFRESH_INTERVAL"))
globalPrometheusUser = kingpin.Flag("global-prometheus-user", "").Envar("GLOBAL_PROMETHEUS_USER").String()
globalPrometheusPassword = kingpin.Flag("global-prometheus-password", "").Envar("GLOBAL_PROMETHEUS_PASSWORD").String()
globalPrometheusCustomHeaders = kingpin.Flag("global-prometheus-custom-headers", "").Envar("GLOBAL_PROMETHEUS_CUSTOM_HEADERS").StringMap()
globalPrometheusRemoteWriteUrl = kingpin.Flag("global-prometheus-remote-write-url", "").Envar("GLOBAL_PROMETHEUS_REMOTE_WRITE_URL").String()
globalPrometheusUseClickHouse = kingpin.Flag("global-prometheus-use-clickhouse", "Use ClickHouse instead of Prometheus for metrics storage").Envar("GLOBAL_PROMETHEUS_USE_CLICKHOUSE").Bool()
bootstrapPrometheusUrl = kingpin.Flag("bootstrap-prometheus-url", "").Envar("BOOTSTRAP_PROMETHEUS_URL").String()
bootstrapRefreshInterval = timeseries.DurationFlag(kingpin.Flag("bootstrap-refresh-interval", "").Envar("BOOTSTRAP_REFRESH_INTERVAL"))
bootstrapPrometheusExtraSelector = kingpin.Flag("bootstrap-prometheus-extra-selector", "").Envar("BOOTSTRAP_PROMETHEUS_EXTRA_SELECTOR").String()
bootstrapPrometheusRemoteWriteUrl = kingpin.Flag("bootstrap-prometheus-remote-write-url", "").Envar("BOOTSTRAP_PROMETHEUS_REMOTE_WRITE_URL").String()
bootstrapPrometheusUseClickHouse = kingpin.Flag("bootstrap-prometheus-use-clickhouse", "Use ClickHouse instead of Prometheus for metrics storage").Envar("BOOTSTRAP_PROMETHEUS_USE_CLICKHOUSE").Bool()
bootstrapClickhouseAddress = kingpin.Flag("bootstrap-clickhouse-address", "").Envar("BOOTSTRAP_CLICKHOUSE_ADDRESS").String()
bootstrapClickhouseUser = kingpin.Flag("bootstrap-clickhouse-user", "").Envar("BOOTSTRAP_CLICKHOUSE_USER").String()
bootstrapClickhousePassword = kingpin.Flag("bootstrap-clickhouse-password", "").Envar("BOOTSTRAP_CLICKHOUSE_PASSWORD").String()
bootstrapClickhouseDatabase = kingpin.Flag("bootstrap-clickhouse-database", "").Envar("BOOTSTRAP_CLICKHOUSE_DATABASE").String()
)
func (cfg *Config) ApplyFlags() {
if *listen != "" {
cfg.ListenAddress = *listen
}
if *httpsListen != "" {
cfg.HTTPSListenAddress = *httpsListen
}
if *httpDisabled {
cfg.HTTPDisabled = *httpDisabled
}
cfg.GRPC.Disabled = cfg.GRPC.Disabled || *grpcDisabled
if *grpcListen != "" {
cfg.GRPC.ListenAddress = *grpcListen
}
if *tlsCertFile != "" && *tlsKeyFile != "" {
if cfg.TLS == nil {
cfg.TLS = &TLS{}
}
cfg.TLS.CertFile = *tlsCertFile
cfg.TLS.KeyFile = *tlsKeyFile
}
if *urlBasePath != "" {
cfg.UrlBasePath = *urlBasePath
}
if *dataDir != "" {
cfg.DataDir = *dataDir
}
if *defaultTimeRange > 0 {
cfg.DefaultTimeRange = *defaultTimeRange
}
if *cacheTTL > 0 {
cfg.Cache.TTL = *cacheTTL
}
if *cacheGcInterval > 0 {
cfg.Cache.GCInterval = *cacheGcInterval
}
if *tracesTTL > 0 {
cfg.Traces.TTL = *tracesTTL
}
if *logsTTL > 0 {
cfg.Logs.TTL = *logsTTL
}
if *profilesTTL > 0 {
cfg.Profiles.TTL = *profilesTTL
}
if *metricsTTL > 0 {
cfg.Metrics.TTL = *metricsTTL
}
if *pgConnectionString != "" {
cfg.Postgres = &Postgres{ConnectionString: *pgConnectionString}
}
if *doNotCheckForDeployments {
cfg.DoNotCheckForDeployments = *doNotCheckForDeployments
}
if *doNotCheckForUpdates {
cfg.DoNotCheckForUpdates = *doNotCheckForUpdates
}
if *disableUsageStatistics {
cfg.DisableUsageStatistics = *disableUsageStatistics
}
if *disableBuiltinAlerts {
cfg.DisableBuiltinAlerts = *disableBuiltinAlerts
}
if *authAnonymousRole != "" {
cfg.Auth.AnonymousRole = *authAnonymousRole
}
if *authBootstrapAdminPassword != "" {
cfg.Auth.BootstrapAdminPassword = *authBootstrapAdminPassword
}
if *developerMode {
cfg.DeveloperMode = *developerMode
}
if *clickHouseSpaceManagerDisabled {
cfg.ClickHouseSpaceManager.Enabled = false
}
if *clickHouseSpaceManagerUsageThresholdPercent > 0 {
cfg.ClickHouseSpaceManager.UsageThresholdPercent = *clickHouseSpaceManagerUsageThresholdPercent
}
if *clickHouseSpaceManagerMinPartitions > 0 {
cfg.ClickHouseSpaceManager.MinPartitions = *clickHouseSpaceManagerMinPartitions
}
keep := cfg.GlobalClickhouse != nil || *globalClickhouseAddress != ""
if cfg.GlobalClickhouse == nil {
cfg.GlobalClickhouse = &Clickhouse{}
}
if *globalClickhouseAddress != "" {
cfg.GlobalClickhouse.Address = *globalClickhouseAddress
}
if *globalClickhouseUser != "" {
cfg.GlobalClickhouse.User = *globalClickhouseUser
}
if *globalClickhousePassword != "" {
cfg.GlobalClickhouse.Password = *globalClickhousePassword
}
if *globalClickhouseInitialDatabase != "" {
cfg.GlobalClickhouse.Database = *globalClickhouseInitialDatabase
}
if *globalClickhouseTlsEnabled {
cfg.GlobalClickhouse.TlsEnable = *globalClickhouseTlsEnabled
}
if *globalClickhouseTlsSkipVerify {
cfg.GlobalClickhouse.TlsSkipVerify = *globalClickhouseTlsSkipVerify
}
if *globalClickhouseTlsCAFile != "" {
cfg.GlobalClickhouse.TlsCAFile = *globalClickhouseTlsCAFile
}
if !keep {
cfg.GlobalClickhouse = nil
}
keep = cfg.GlobalPrometheus != nil || *globalPrometheusUrl != "" || *globalPrometheusUseClickHouse
if cfg.GlobalPrometheus == nil {
cfg.GlobalPrometheus = &Prometheus{
CustomHeaders: map[string]string{},
}
}
if *globalPrometheusUrl != "" {
cfg.GlobalPrometheus.Url = *globalPrometheusUrl
}
if *globalPrometheusTlsSkipVerify {
cfg.GlobalPrometheus.TlsSkipVerify = *globalPrometheusTlsSkipVerify
}
if *globalRefreshInterval > 0 {
cfg.GlobalPrometheus.RefreshInterval = *globalRefreshInterval
}
if *globalPrometheusUser != "" {
cfg.GlobalPrometheus.User = *globalPrometheusUser
}
if *globalPrometheusPassword != "" {
cfg.GlobalPrometheus.Password = *globalPrometheusPassword
}
if *globalPrometheusRemoteWriteUrl != "" {
cfg.GlobalPrometheus.RemoteWriteUrl = *globalPrometheusRemoteWriteUrl
}
if *globalPrometheusUseClickHouse {
cfg.GlobalPrometheus.UseClickHouse = *globalPrometheusUseClickHouse
}
if len(*globalPrometheusCustomHeaders) > 0 {
if cfg.GlobalPrometheus.CustomHeaders == nil {
cfg.GlobalPrometheus.CustomHeaders = map[string]string{}
}
maps.Copy(cfg.GlobalPrometheus.CustomHeaders, *globalPrometheusCustomHeaders)
}
if !keep {
cfg.GlobalPrometheus = nil
}
if *bootstrapPrometheusUrl != "" {
cfg.BootstrapPrometheus = &Prometheus{
Url: *bootstrapPrometheusUrl,
RefreshInterval: *bootstrapRefreshInterval,
ExtraSelector: *bootstrapPrometheusExtraSelector,
RemoteWriteUrl: *bootstrapPrometheusRemoteWriteUrl,
UseClickHouse: *bootstrapPrometheusUseClickHouse,
}
if cfg.BootstrapPrometheus.RefreshInterval <= 0 {
cfg.BootstrapPrometheus.RefreshInterval = db.DefaultRefreshInterval
}
}
if *bootstrapClickhouseAddress != "" {
cfg.BootstrapClickhouse = &Clickhouse{
Address: *bootstrapClickhouseAddress,
User: *bootstrapClickhouseUser,
Password: *bootstrapClickhousePassword,
Database: *bootstrapClickhouseDatabase,
}
}
}