diff --git a/cmd/crowdsec-cli/collections.go b/cmd/crowdsec-cli/collections.go index f81cf4690..c3bcf9b7a 100644 --- a/cmd/crowdsec-cli/collections.go +++ b/cmd/crowdsec-cli/collections.go @@ -235,13 +235,15 @@ func NewCollectionsUpgradeCmd() *cobra.Command { func runCollectionsInspect(cmd *cobra.Command, args []string) error { flags := cmd.Flags() - var err error - // XXX: set global - prometheusURL, err = flags.GetString("url") + url, err := flags.GetString("url") if err != nil { return err } + if url != "" { + csConfig.Cscli.PrometheusUrl = url + } + for _, name := range args { InspectItem(name, cwhub.COLLECTIONS) } diff --git a/cmd/crowdsec-cli/main.go b/cmd/crowdsec-cli/main.go index d0320ac36..e80e8cb41 100644 --- a/cmd/crowdsec-cli/main.go +++ b/cmd/crowdsec-cli/main.go @@ -29,8 +29,6 @@ var dbClient *database.Client var OutputFormat string var OutputColor string -var prometheusURL string - var mergedConfig string func initConfig() { diff --git a/cmd/crowdsec-cli/metrics.go b/cmd/crowdsec-cli/metrics.go index 0e4926b72..d8f7d0f84 100644 --- a/cmd/crowdsec-cli/metrics.go +++ b/cmd/crowdsec-cli/metrics.go @@ -284,7 +284,23 @@ var noUnit bool func runMetrics(cmd *cobra.Command, args []string) error { - if err := csConfig.LoadPrometheus(); err != nil { + flags := cmd.Flags() + + url, err := flags.GetString("url") + if err != nil { + return err + } + + if url != "" { + csConfig.Cscli.PrometheusUrl = url + } + + noUnit, err = flags.GetBool("no-unit") + if err != nil { + return err + } + + if err = csConfig.LoadPrometheus(); err != nil { return fmt.Errorf("failed to load prometheus config: %w", err) } @@ -296,16 +312,7 @@ func runMetrics(cmd *cobra.Command, args []string) error { return fmt.Errorf("prometheus is not enabled, can't show metrics") } - if prometheusURL == "" { - prometheusURL = csConfig.Cscli.PrometheusUrl - } - - if prometheusURL == "" { - return fmt.Errorf("no prometheus url, please specify in %s or via -u", *csConfig.FilePath) - } - - err := FormatPrometheusMetrics(color.Output, prometheusURL+"/metrics", csConfig.Cscli.Output) - if err != nil { + if err = FormatPrometheusMetrics(color.Output, csConfig.Cscli.PrometheusUrl, csConfig.Cscli.Output); err != nil { return err } return nil @@ -321,8 +328,10 @@ func NewMetricsCmd() *cobra.Command { DisableAutoGenTag: true, RunE: runMetrics, } - cmdMetrics.PersistentFlags().StringVarP(&prometheusURL, "url", "u", "", "Prometheus url (http://:/metrics)") - cmdMetrics.PersistentFlags().BoolVar(&noUnit, "no-unit", false, "Show the real number instead of formatted with units") + + flags := cmdMetrics.PersistentFlags() + flags.StringP("url", "u", "", "Prometheus url (http://:/metrics)") + flags.Bool("no-unit", false, "Show the real number instead of formatted with units") return cmdMetrics } diff --git a/cmd/crowdsec-cli/parsers.go b/cmd/crowdsec-cli/parsers.go index c1f33e804..0f7e0d4f8 100644 --- a/cmd/crowdsec-cli/parsers.go +++ b/cmd/crowdsec-cli/parsers.go @@ -223,13 +223,15 @@ func NewParsersUpgradeCmd() *cobra.Command { func runParsersInspect(cmd *cobra.Command, args []string) error { flags := cmd.Flags() - var err error - // XXX: set global - prometheusURL, err = flags.GetString("url") + url, err := flags.GetString("url") if err != nil { return err } + if url != "" { + csConfig.Cscli.PrometheusUrl = url + } + InspectItem(args[0], cwhub.PARSERS) return nil diff --git a/cmd/crowdsec-cli/postoverflows.go b/cmd/crowdsec-cli/postoverflows.go index 6c3aa6c80..f94169f56 100644 --- a/cmd/crowdsec-cli/postoverflows.go +++ b/cmd/crowdsec-cli/postoverflows.go @@ -223,13 +223,15 @@ func NewPostOverflowsUpgradeCmd() *cobra.Command { func runPostOverflowsInspect(cmd *cobra.Command, args []string) error { flags := cmd.Flags() - var err error - // XXX: set global - prometheusURL, err = flags.GetString("url") + url, err := flags.GetString("url") if err != nil { return err } + if url != "" { + csConfig.Cscli.PrometheusUrl = url + } + InspectItem(args[0], cwhub.PARSERS_OVFLW) return nil diff --git a/cmd/crowdsec-cli/scenarios.go b/cmd/crowdsec-cli/scenarios.go index 553ffa472..9a9aa825f 100644 --- a/cmd/crowdsec-cli/scenarios.go +++ b/cmd/crowdsec-cli/scenarios.go @@ -223,13 +223,15 @@ func NewCmdScenariosUpgrade() *cobra.Command { func runScenariosInspect(cmd *cobra.Command, args []string) error { flags := cmd.Flags() - var err error - // XXX: set global - prometheusURL, err = flags.GetString("url") + url, err := flags.GetString("url") if err != nil { return err } + if url != "" { + csConfig.Cscli.PrometheusUrl = url + } + InspectItem(args[0], cwhub.SCENARIOS) return nil diff --git a/cmd/crowdsec-cli/support.go b/cmd/crowdsec-cli/support.go index 7d80d6471..15c53d004 100644 --- a/cmd/crowdsec-cli/support.go +++ b/cmd/crowdsec-cli/support.go @@ -69,13 +69,13 @@ func collectMetrics() ([]byte, []byte, error) { } humanMetrics := bytes.NewBuffer(nil) - err = FormatPrometheusMetrics(humanMetrics, csConfig.Cscli.PrometheusUrl+"/metrics", "human") + err = FormatPrometheusMetrics(humanMetrics, csConfig.Cscli.PrometheusUrl, "human") if err != nil { return nil, nil, fmt.Errorf("could not fetch promtheus metrics: %s", err) } - req, err := http.NewRequest(http.MethodGet, csConfig.Cscli.PrometheusUrl+"/metrics", nil) + req, err := http.NewRequest(http.MethodGet, csConfig.Cscli.PrometheusUrl, nil) if err != nil { return nil, nil, fmt.Errorf("could not create requests to prometheus endpoint: %s", err) } diff --git a/cmd/crowdsec-cli/utils.go b/cmd/crowdsec-cli/utils.go index 3cf427c89..82b98cbef 100644 --- a/cmd/crowdsec-cli/utils.go +++ b/cmd/crowdsec-cli/utils.go @@ -210,15 +210,6 @@ func InspectItem(name string, objecitemType string) { return } - if prometheusURL == "" { - //This is technically wrong to do this, as the prometheus section contains a listen address, not an URL to query prometheus - //But for ease of use, we will use the listen address as the prometheus URL because it will be 127.0.0.1 in the default case - listenAddr := csConfig.Prometheus.ListenAddr - listenPort := csConfig.Prometheus.ListenPort - prometheusURL = fmt.Sprintf("http://%s:%d/metrics", listenAddr, listenPort) - log.Debugf("No prometheus URL provided using: %s", prometheusURL) - } - fmt.Printf("\nCurrent metrics : \n") ShowMetrics(hubItem) } @@ -256,18 +247,18 @@ func manageCliDecisionAlerts(ip *string, ipRange *string, scope *string, value * func ShowMetrics(hubItem *cwhub.Item) { switch hubItem.Type { case cwhub.PARSERS: - metrics := GetParserMetric(prometheusURL, hubItem.Name) + metrics := GetParserMetric(hubItem.Name) parserMetricsTable(color.Output, hubItem.Name, metrics) case cwhub.SCENARIOS: - metrics := GetScenarioMetric(prometheusURL, hubItem.Name) + metrics := GetScenarioMetric(hubItem.Name) scenarioMetricsTable(color.Output, hubItem.Name, metrics) case cwhub.COLLECTIONS: for _, item := range hubItem.Parsers { - metrics := GetParserMetric(prometheusURL, item) + metrics := GetParserMetric(item) parserMetricsTable(color.Output, item, metrics) } for _, item := range hubItem.Scenarios { - metrics := GetScenarioMetric(prometheusURL, item) + metrics := GetScenarioMetric(item) scenarioMetricsTable(color.Output, item, metrics) } for _, item := range hubItem.Collections { @@ -283,10 +274,10 @@ func ShowMetrics(hubItem *cwhub.Item) { } // GetParserMetric is a complete rip from prom2json -func GetParserMetric(url string, itemName string) map[string]map[string]int { +func GetParserMetric(itemName string) map[string]map[string]int { stats := make(map[string]map[string]int) - result := GetPrometheusMetric(url) + result := GetPrometheusMetric() for idx, fam := range result { if !strings.HasPrefix(fam.Name, "cs_") { continue @@ -364,7 +355,7 @@ func GetParserMetric(url string, itemName string) map[string]map[string]int { return stats } -func GetScenarioMetric(url string, itemName string) map[string]int { +func GetScenarioMetric(itemName string) map[string]int { stats := make(map[string]int) stats["instantiation"] = 0 @@ -373,7 +364,7 @@ func GetScenarioMetric(url string, itemName string) map[string]int { stats["pour"] = 0 stats["underflow"] = 0 - result := GetPrometheusMetric(url) + result := GetPrometheusMetric() for idx, fam := range result { if !strings.HasPrefix(fam.Name, "cs_") { continue @@ -419,7 +410,7 @@ func GetScenarioMetric(url string, itemName string) map[string]int { return stats } -func GetPrometheusMetric(url string) []*prom2json.Family { +func GetPrometheusMetric() []*prom2json.Family { mfChan := make(chan *dto.MetricFamily, 1024) // Start with the DefaultTransport for sane defaults. @@ -432,7 +423,7 @@ func GetPrometheusMetric(url string) []*prom2json.Family { go func() { defer trace.CatchPanic("crowdsec/GetPrometheusMetric") - err := prom2json.FetchMetricFamilies(url, mfChan, transport) + err := prom2json.FetchMetricFamilies(csConfig.Cscli.PrometheusUrl, mfChan, transport) if err != nil { log.Fatalf("failed to fetch prometheus metrics : %v", err) } diff --git a/pkg/csconfig/prometheus.go b/pkg/csconfig/prometheus.go index eea768ab7..f92771bb1 100644 --- a/pkg/csconfig/prometheus.go +++ b/pkg/csconfig/prometheus.go @@ -12,7 +12,7 @@ type PrometheusCfg struct { func (c *Config) LoadPrometheus() error { if c.Cscli != nil && c.Cscli.PrometheusUrl == "" && c.Prometheus != nil { if c.Prometheus.ListenAddr != "" && c.Prometheus.ListenPort != 0 { - c.Cscli.PrometheusUrl = fmt.Sprintf("http://%s:%d", c.Prometheus.ListenAddr, c.Prometheus.ListenPort) + c.Cscli.PrometheusUrl = fmt.Sprintf("http://%s:%d/metrics", c.Prometheus.ListenAddr, c.Prometheus.ListenPort) } } return nil diff --git a/pkg/csconfig/prometheus_test.go b/pkg/csconfig/prometheus_test.go index 79c9ec58f..c16002221 100644 --- a/pkg/csconfig/prometheus_test.go +++ b/pkg/csconfig/prometheus_test.go @@ -26,7 +26,7 @@ func TestLoadPrometheus(t *testing.T) { }, Cscli: &CscliCfg{}, }, - expectedURL: "http://127.0.0.1:6060", + expectedURL: "http://127.0.0.1:6060/metrics", }, }