{"record":{"id":"28c87c3447b51364","repo":"crowdsecurity/crowdsec","slug":"errinvalidmetricslevel","errorCode":"ErrInvalidMetricsLevel","errorMessage":"invalid metrics level","messagePattern":"invalid metrics level","errorType":"error_code","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/metrics/metrics.go","lineNumber":20,"sourceCode":"\nimport (\n\t\"errors\"\n\t\"fmt\"\n\n\t\"github.com/prometheus/client_golang/prometheus\"\n)\n\ntype MetricsLevelConfig string\n\nconst (\n\tMetricsLevelNone       MetricsLevelConfig = \"none\"\n\tMetricsLevelAggregated MetricsLevelConfig = \"aggregated\"\n\tMetricsLevelFull       MetricsLevelConfig = \"full\"\n\t// MetricsLevelDefault is the default metrics level.\n\tMetricsLevelDefault MetricsLevelConfig = MetricsLevelFull\n)\n\nvar ErrInvalidMetricsLevel = errors.New(\"invalid metrics level\")\n\ntype AcquisitionMetricsLevel int\n\nconst (\n\tAcquisitionMetricsLevelNone       AcquisitionMetricsLevel       = iota // No metrics\n\tAcquisitionMetricsLevelAggregated                                      // Aggregated metrics\n\tAcquisitionMetricsLevelFull                                            // Full metrics\n\tAcquisitionMetricsLevelDefault    = AcquisitionMetricsLevelFull        // Default metrics level\n)\n\nfunc RegisterMetrics(metricsLevel MetricsLevelConfig) error {\n\tswitch metricsLevel {\n\tcase MetricsLevelNone:\n\t\t// Do not register any metrics\n\tcase MetricsLevelAggregated:\n\t\tprometheus.MustRegister(GlobalParserHits, GlobalParserHitsOk, GlobalParserHitsKo,\n\t\t\tGlobalCsInfo, GlobalParsingHistogram, GlobalPourHistogram,\n\t\t\tBucketsUnderflow, BucketsCanceled, BucketsInstantiation, BucketsOverflow,","sourceCodeStart":2,"sourceCodeEnd":38,"githubUrl":"https://github.com/crowdsecurity/crowdsec/blob/909b5157986a2b2c2163300fdaef5ed01289f7d2/pkg/metrics/metrics.go#L2-L38","documentation":"RegisterMetrics validates the configured metrics level string. Only 'full' and 'aggregated' (MetricsLevelFull / MetricsLevelAggregated; default 'full') are accepted; any other value makes RegisterMetrics return ErrInvalidMetricsLevel wrapped with the offending string.","triggerScenarios":"Calling metrics.RegisterMetrics with a metrics_level config string not in {\"full\", \"aggregated\"} — e.g. 'basic', 'none', 'verbose', or a value with different casing ('Full').","commonSituations":"Typo in prometheus/metrics_level config key, copying config from another product with different level names, or env-var driven configuration feeding an unexpected string.","solutions":["Set metrics level to 'full' (default) or 'aggregated' in the configuration.","Check for typos and casing; values are lowercase and compared exactly.","Validate user input against metrics.MetricsLevelFull / MetricsLevelAggregated before calling RegisterMetrics."],"exampleFix":"// before\nmetricsLevel := strings.ToLower(cfg.Prometheus.MetricsLevel) // \"verbose\"\n// after\nif metricsLevel != string(metrics.MetricsLevelFull) && metricsLevel != string(metrics.MetricsLevelAggregated) {\n    metricsLevel = string(metrics.MetricsLevelDefault)\n}","handlingStrategy":"validation","validationCode":"switch metricsLevel {\ncase string(metrics.MetricsLevelFull), string(metrics.MetricsLevelAggregated):\n    // ok\ndefault:\n    metricsLevel = string(metrics.MetricsLevelDefault)\n}","typeGuard":"func validMetricsLevel(s string) bool {\n    return s == string(metrics.MetricsLevelFull) || s == string(metrics.MetricsLevelAggregated)\n}","tryCatchPattern":"if err := metrics.RegisterMetrics(level); err != nil {\n    if errors.Is(err, metrics.ErrInvalidMetricsLevel) {\n        log.Warnf(\"bad metrics level %q, using default\", level)\n        metrics.RegisterMetrics(string(metrics.MetricsLevelDefault))\n    }\n}","preventionTips":["Only allow 'full' or 'aggregated' in config docs and schema validation","Reference the exported MetricsLevel* constants, never raw strings","Handle case-insensitivity in config loading before passing the value down"],"tags":["metrics","configuration","validation","enum"],"backgroundTag":"invalid-enum-value","analyzedSha":"909b5157986a2b2c2163300fdaef5ed01289f7d2","analyzedAt":"2026-09-06T12:27:26.012Z","contentChangedAt":"2026-09-06T12:27:26.012Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}