diff --git a/CHANGELOG.md b/CHANGELOG.md index f019c5f301..337059ea75 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,11 @@ ## unreleased +## 3.3.1 / 2025-05-02 + +* [BUGFIX] Azure SD: Fix panic on malformed log message. #16434 #16210 +* [BUGFIX] Config: Update GOGC before loading TSDB. #16491 + ## 3.3.0 / 2025-04-15 * [FEATURE] PromQL: Implement `idelta()` and `irate()` for native histograms. #15853 diff --git a/VERSION b/VERSION index 15a2799817..bea438e9ad 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -3.3.0 +3.3.1 diff --git a/cmd/prometheus/main.go b/cmd/prometheus/main.go index 4559d51837..28e072363d 100644 --- a/cmd/prometheus/main.go +++ b/cmd/prometheus/main.go @@ -141,6 +141,7 @@ var ( func init() { // This can be removed when the default validation scheme in common is updated. + //nolint:staticcheck model.NameValidationScheme = model.UTF8Validation prometheus.MustRegister(versioncollector.NewCollector(strings.ReplaceAll(appName, "-", "_"))) @@ -617,6 +618,31 @@ func main() { cfg.tsdb.OutOfOrderTimeWindow = cfgFile.StorageConfig.TSDBConfig.OutOfOrderTimeWindow } + // Set Go runtime parameters before we get too far into initialization. + updateGoGC(cfgFile, logger) + if cfg.maxprocsEnable { + l := func(format string, a ...interface{}) { + logger.Info(fmt.Sprintf(strings.TrimPrefix(format, "maxprocs: "), a...), "component", "automaxprocs") + } + if _, err := maxprocs.Set(maxprocs.Logger(l)); err != nil { + logger.Warn("Failed to set GOMAXPROCS automatically", "component", "automaxprocs", "err", err) + } + } + + if cfg.memlimitEnable { + if _, err := memlimit.SetGoMemLimitWithOpts( + memlimit.WithRatio(cfg.memlimitRatio), + memlimit.WithProvider( + memlimit.ApplyFallback( + memlimit.FromCgroup, + memlimit.FromSystem, + ), + ), + ); err != nil { + logger.Warn("automemlimit", "msg", "Failed to set GOMEMLIMIT automatically", "err", err) + } + } + // Now that the validity of the config is established, set the config // success metrics accordingly, although the config isn't really loaded // yet. This will happen later (including setting these metrics again), @@ -763,29 +789,6 @@ func main() { ruleManager *rules.Manager ) - if cfg.maxprocsEnable { - l := func(format string, a ...interface{}) { - logger.Info(fmt.Sprintf(strings.TrimPrefix(format, "maxprocs: "), a...), "component", "automaxprocs") - } - if _, err := maxprocs.Set(maxprocs.Logger(l)); err != nil { - logger.Warn("Failed to set GOMAXPROCS automatically", "component", "automaxprocs", "err", err) - } - } - - if cfg.memlimitEnable { - if _, err := memlimit.SetGoMemLimitWithOpts( - memlimit.WithRatio(cfg.memlimitRatio), - memlimit.WithProvider( - memlimit.ApplyFallback( - memlimit.FromCgroup, - memlimit.FromSystem, - ), - ), - ); err != nil { - logger.Warn("automemlimit", "msg", "Failed to set GOMEMLIMIT automatically", "err", err) - } - } - if !agentMode { opts := promql.EngineOpts{ Logger: logger.With("component", "query engine"), @@ -1471,6 +1474,14 @@ func reloadConfig(filename string, enableExemplarStorage bool, logger *slog.Logg return fmt.Errorf("one or more errors occurred while applying the new configuration (--config.file=%q)", filename) } + updateGoGC(conf, logger) + + noStepSuqueryInterval.Set(conf.GlobalConfig.EvaluationInterval) + timingsLogger.Info("Completed loading of configuration file", "filename", filename, "totalDuration", time.Since(start)) + return nil +} + +func updateGoGC(conf *config.Config, logger *slog.Logger) { oldGoGC := debug.SetGCPercent(conf.Runtime.GoGC) if oldGoGC != conf.Runtime.GoGC { logger.Info("updated GOGC", "old", oldGoGC, "new", conf.Runtime.GoGC) @@ -1481,10 +1492,6 @@ func reloadConfig(filename string, enableExemplarStorage bool, logger *slog.Logg } else { os.Setenv("GOGC", "off") } - - noStepSuqueryInterval.Set(conf.GlobalConfig.EvaluationInterval) - timingsLogger.Info("Completed loading of configuration file", "filename", filename, "totalDuration", time.Since(start)) - return nil } func startsOrEndsWithQuote(s string) bool { diff --git a/cmd/prometheus/main_test.go b/cmd/prometheus/main_test.go index 6f9b8a2e41..cef927f980 100644 --- a/cmd/prometheus/main_test.go +++ b/cmd/prometheus/main_test.go @@ -45,6 +45,7 @@ import ( func init() { // This can be removed when the default validation scheme in common is updated. + //nolint:staticcheck model.NameValidationScheme = model.UTF8Validation } diff --git a/cmd/promtool/main.go b/cmd/promtool/main.go index 81fdd8f4ff..68f8978283 100644 --- a/cmd/promtool/main.go +++ b/cmd/promtool/main.go @@ -64,6 +64,7 @@ import ( func init() { // This can be removed when the default validation scheme in common is updated. + //nolint:staticcheck model.NameValidationScheme = model.UTF8Validation } diff --git a/cmd/promtool/main_test.go b/cmd/promtool/main_test.go index 5d36a66fcd..ed71f8148f 100644 --- a/cmd/promtool/main_test.go +++ b/cmd/promtool/main_test.go @@ -41,6 +41,7 @@ import ( func init() { // This can be removed when the default validation scheme in common is updated. + //nolint:staticcheck model.NameValidationScheme = model.UTF8Validation } diff --git a/config/config.go b/config/config.go index a395c3f53e..9c74ef7736 100644 --- a/config/config.go +++ b/config/config.go @@ -840,6 +840,7 @@ func (c *ScrapeConfig) Validate(globalConfig GlobalConfig) error { switch globalConfig.MetricNameValidationScheme { case LegacyValidationConfig: case "", UTF8ValidationConfig: + //nolint:staticcheck if model.NameValidationScheme != model.UTF8Validation { panic("utf8 name validation requested but model.NameValidationScheme is not set to UTF8") } diff --git a/config/config_test.go b/config/config_test.go index faca7dda12..a076a4fb8e 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -64,6 +64,7 @@ import ( func init() { // This can be removed when the default validation scheme in common is updated. + //nolint:staticcheck model.NameValidationScheme = model.UTF8Validation } @@ -2181,8 +2182,10 @@ var expectedErrors = []struct { } func TestBadConfigs(t *testing.T) { + //nolint:staticcheck model.NameValidationScheme = model.LegacyValidation defer func() { + //nolint:staticcheck model.NameValidationScheme = model.UTF8Validation }() for _, ee := range expectedErrors { @@ -2193,8 +2196,10 @@ func TestBadConfigs(t *testing.T) { } func TestBadStaticConfigsJSON(t *testing.T) { + //nolint:staticcheck model.NameValidationScheme = model.LegacyValidation defer func() { + //nolint:staticcheck model.NameValidationScheme = model.UTF8Validation }() content, err := os.ReadFile("testdata/static_config.bad.json") @@ -2205,8 +2210,10 @@ func TestBadStaticConfigsJSON(t *testing.T) { } func TestBadStaticConfigsYML(t *testing.T) { + //nolint:staticcheck model.NameValidationScheme = model.LegacyValidation defer func() { + //nolint:staticcheck model.NameValidationScheme = model.UTF8Validation }() content, err := os.ReadFile("testdata/static_config.bad.yml") @@ -2453,8 +2460,10 @@ func TestScrapeConfigDisableCompression(t *testing.T) { } func TestScrapeConfigNameValidationSettings(t *testing.T) { + //nolint:staticcheck model.NameValidationScheme = model.UTF8Validation defer func() { + //nolint:staticcheck model.NameValidationScheme = model.LegacyValidation }() diff --git a/go.mod b/go.mod index acaf9aa291..a2abdabf7a 100644 --- a/go.mod +++ b/go.mod @@ -53,7 +53,7 @@ require ( github.com/prometheus/alertmanager v0.28.0 github.com/prometheus/client_golang v1.21.0-rc.0 github.com/prometheus/client_model v0.6.1 - github.com/prometheus/common v0.62.0 + github.com/prometheus/common v0.63.0 github.com/prometheus/common/assets v0.2.0 github.com/prometheus/exporter-toolkit v0.14.0 github.com/prometheus/sigv4 v0.1.2 diff --git a/go.sum b/go.sum index ebc7eee143..b379fb0d25 100644 --- a/go.sum +++ b/go.sum @@ -441,8 +441,8 @@ github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= -github.com/prometheus/common v0.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ2Io= -github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I= +github.com/prometheus/common v0.63.0 h1:YR/EIY1o3mEFP/kZCD7iDMnLPlGyuU2Gb3HIcXnA98k= +github.com/prometheus/common v0.63.0/go.mod h1:VVFF/fBIoToEnWRVkYoXEkq3R3paCoxG9PXP74SnV18= github.com/prometheus/common/assets v0.2.0 h1:0P5OrzoHrYBOSM1OigWL3mY8ZvV2N4zIE/5AahrSrfM= github.com/prometheus/common/assets v0.2.0/go.mod h1:D17UVUE12bHbim7HzwUvtqm6gwBEaDQ0F+hIGbFbccI= github.com/prometheus/exporter-toolkit v0.14.0 h1:NMlswfibpcZZ+H0sZBiTjrA3/aBFHkNZqE+iCj5EmRg= diff --git a/model/labels/labels_common.go b/model/labels/labels_common.go index a232eeea5d..7cf1dfb897 100644 --- a/model/labels/labels_common.go +++ b/model/labels/labels_common.go @@ -104,6 +104,7 @@ func (ls Labels) IsValid(validationScheme model.ValidationScheme) bool { if l.Name == model.MetricNameLabel { // If the default validation scheme has been overridden with legacy mode, // we need to call the special legacy validation checker. + //nolint:staticcheck if validationScheme == model.LegacyValidation && model.NameValidationScheme == model.UTF8Validation && !model.IsValidLegacyMetricName(string(model.LabelValue(l.Value))) { return strconv.ErrSyntax } @@ -111,6 +112,7 @@ func (ls Labels) IsValid(validationScheme model.ValidationScheme) bool { return strconv.ErrSyntax } } + //nolint:staticcheck if validationScheme == model.LegacyValidation && model.NameValidationScheme == model.UTF8Validation { if !model.LabelName(l.Name).IsValidLegacy() || !model.LabelValue(l.Value).IsValid() { return strconv.ErrSyntax diff --git a/model/labels/labels_test.go b/model/labels/labels_test.go index 06802d6f3e..d486d6765d 100644 --- a/model/labels/labels_test.go +++ b/model/labels/labels_test.go @@ -352,6 +352,7 @@ func TestLabels_ValidationModes(t *testing.T) { expected: false, }, } { + //nolint:staticcheck model.NameValidationScheme = test.globalMode require.Equal(t, test.expected, test.input.IsValid(test.callMode)) } diff --git a/model/relabel/relabel.go b/model/relabel/relabel.go index 1373484426..8c95d81c27 100644 --- a/model/relabel/relabel.go +++ b/model/relabel/relabel.go @@ -135,6 +135,7 @@ func (c *Config) Validate() error { // Design escaping mechanism to allow that, once valid use case appears. return model.LabelName(value).IsValid() } + //nolint:staticcheck if model.NameValidationScheme == model.LegacyValidation { isValidLabelNameWithRegexVarFn = func(value string) bool { return relabelTargetLegacy.MatchString(value) diff --git a/model/textparse/openmetricsparse_test.go b/model/textparse/openmetricsparse_test.go index 7d3591d33d..1c198b8d01 100644 --- a/model/textparse/openmetricsparse_test.go +++ b/model/textparse/openmetricsparse_test.go @@ -469,9 +469,12 @@ foobar{quantile="0.99"} 150.1` } func TestUTF8OpenMetricsParse(t *testing.T) { + //nolint:staticcheck oldValidationScheme := model.NameValidationScheme + //nolint:staticcheck model.NameValidationScheme = model.UTF8Validation defer func() { + //nolint:staticcheck model.NameValidationScheme = oldValidationScheme }() diff --git a/model/textparse/promparse_test.go b/model/textparse/promparse_test.go index e8cf66f539..77b4780c21 100644 --- a/model/textparse/promparse_test.go +++ b/model/textparse/promparse_test.go @@ -205,9 +205,12 @@ testmetric{le="10"} 1` } func TestUTF8PromParse(t *testing.T) { + //nolint:staticcheck oldValidationScheme := model.NameValidationScheme + //nolint:staticcheck model.NameValidationScheme = model.UTF8Validation defer func() { + //nolint:staticcheck model.NameValidationScheme = oldValidationScheme }() diff --git a/promql/parser/parse_test.go b/promql/parser/parse_test.go index 3445fce067..0e1b377591 100644 --- a/promql/parser/parse_test.go +++ b/promql/parser/parse_test.go @@ -3970,6 +3970,7 @@ func TestParseExpressions(t *testing.T) { EnableExperimentalFunctions = false }) + //nolint:staticcheck model.NameValidationScheme = model.UTF8Validation for _, test := range testExpr { t.Run(readable(test.input), func(t *testing.T) { diff --git a/promql/parser/printer_test.go b/promql/parser/printer_test.go index ce06d6ec4b..29cfc953b0 100644 --- a/promql/parser/printer_test.go +++ b/promql/parser/printer_test.go @@ -170,6 +170,7 @@ func TestExprString(t *testing.T) { }, } + //nolint:staticcheck model.NameValidationScheme = model.UTF8Validation for _, test := range inputs { diff --git a/promql/promqltest/test.go b/promql/promqltest/test.go index e84eeebe6a..c16d11e5e2 100644 --- a/promql/promqltest/test.go +++ b/promql/promqltest/test.go @@ -58,6 +58,7 @@ const ( ) func init() { + //nolint:staticcheck model.NameValidationScheme = model.UTF8Validation } diff --git a/scrape/manager_test.go b/scrape/manager_test.go index 96381fa736..11a2b73c9a 100644 --- a/scrape/manager_test.go +++ b/scrape/manager_test.go @@ -57,6 +57,7 @@ import ( func init() { // This can be removed when the default validation scheme in common is updated. + //nolint:staticcheck model.NameValidationScheme = model.UTF8Validation } diff --git a/scrape/scrape_test.go b/scrape/scrape_test.go index e38a3fc4a8..248d076512 100644 --- a/scrape/scrape_test.go +++ b/scrape/scrape_test.go @@ -1325,6 +1325,7 @@ func TestScrapeLoopSeriesAdded(t *testing.T) { } func TestScrapeLoopFailWithInvalidLabelsAfterRelabel(t *testing.T) { + //nolint:staticcheck model.NameValidationScheme = model.LegacyValidation s := teststorage.New(t) defer s.Close() @@ -1357,8 +1358,10 @@ func TestScrapeLoopFailWithInvalidLabelsAfterRelabel(t *testing.T) { func TestScrapeLoopFailLegacyUnderUTF8(t *testing.T) { // Test that scrapes fail when default validation is utf8 but scrape config is // legacy. + //nolint:staticcheck model.NameValidationScheme = model.UTF8Validation defer func() { + //nolint:staticcheck model.NameValidationScheme = model.LegacyValidation }() s := teststorage.New(t) @@ -3885,7 +3888,9 @@ func TestScrapeReportLimit(t *testing.T) { func TestScrapeUTF8(t *testing.T) { s := teststorage.New(t) defer s.Close() + //nolint:staticcheck model.NameValidationScheme = model.UTF8Validation + //nolint:staticcheck t.Cleanup(func() { model.NameValidationScheme = model.LegacyValidation }) cfg := &config.ScrapeConfig{ diff --git a/storage/remote/codec_test.go b/storage/remote/codec_test.go index 3557a87eb5..a6b8893350 100644 --- a/storage/remote/codec_test.go +++ b/storage/remote/codec_test.go @@ -165,9 +165,12 @@ func TestWriteV2RequestFixture(t *testing.T) { } func TestValidateLabelsAndMetricName(t *testing.T) { + //nolint:staticcheck oldScheme := model.NameValidationScheme + //nolint:staticcheck model.NameValidationScheme = model.LegacyValidation defer func() { + //nolint:staticcheck model.NameValidationScheme = oldScheme }() tests := []struct { diff --git a/storage/remote/write_handler.go b/storage/remote/write_handler.go index f34ee371fd..2d7b672e94 100644 --- a/storage/remote/write_handler.go +++ b/storage/remote/write_handler.go @@ -250,6 +250,7 @@ func (h *writeHandler) write(ctx context.Context, req *prompb.WriteRequest) (err // TODO(bwplotka): Even as per 1.0 spec, this should be a 400 error, while other samples are // potentially written. Perhaps unify with fixed writeV2 implementation a bit. + //nolint:staticcheck if !ls.Has(labels.MetricName) || !ls.IsValid(model.NameValidationScheme) { h.logger.Warn("Invalid metric names or labels", "got", ls.String()) samplesWithInvalidLabels++ @@ -391,6 +392,7 @@ func (h *writeHandler) appendV2(app storage.Appender, req *writev2.Request, rs * // Validate series labels early. // NOTE(bwplotka): While spec allows UTF-8, Prometheus Receiver may impose // specific limits and follow https://prometheus.io/docs/specs/remote_write_spec_2_0/#invalid-samples case. + //nolint:staticcheck if !ls.Has(labels.MetricName) || !ls.IsValid(model.NameValidationScheme) { badRequestErrs = append(badRequestErrs, fmt.Errorf("invalid metric name or labels, got %v", ls.String())) samplesWithInvalidLabels += len(ts.Samples) + len(ts.Histograms) diff --git a/util/logging/file.go b/util/logging/file.go index 27fdec2758..3f97b17f09 100644 --- a/util/logging/file.go +++ b/util/logging/file.go @@ -45,7 +45,7 @@ func NewJSONFileLogger(s string) (*JSONFileLogger, error) { return nil, fmt.Errorf("can't create json log file: %w", err) } - jsonFmt := &promslog.AllowedFormat{} + jsonFmt := promslog.NewFormat() _ = jsonFmt.Set("json") return &JSONFileLogger{ handler: promslog.New(&promslog.Config{Format: jsonFmt, Writer: f}).Handler(), diff --git a/web/api/v1/api_test.go b/web/api/v1/api_test.go index 98c0e741a7..3a873d0dfb 100644 --- a/web/api/v1/api_test.go +++ b/web/api/v1/api_test.go @@ -480,15 +480,15 @@ func TestEndpoints(t *testing.T) { u, err := url.Parse(server.URL) require.NoError(t, err) - al := promslog.AllowedLevel{} + al := promslog.NewLevel() require.NoError(t, al.Set("debug")) - af := promslog.AllowedFormat{} + af := promslog.NewFormat() require.NoError(t, af.Set("logfmt")) promslogConfig := promslog.Config{ - Level: &al, - Format: &af, + Level: al, + Format: af, } dbDir := t.TempDir() @@ -3706,6 +3706,7 @@ func testEndpoints(t *testing.T, api *API, tr *testTargetRetriever, es storage.E ctx = route.WithParam(ctx, p, v) } + //nolint:staticcheck model.NameValidationScheme = test.nameValidationScheme req, err := request(method, test.query) diff --git a/web/ui/mantine-ui/package.json b/web/ui/mantine-ui/package.json index 0a1eeb185d..732f493b5e 100644 --- a/web/ui/mantine-ui/package.json +++ b/web/ui/mantine-ui/package.json @@ -1,7 +1,7 @@ { "name": "@prometheus-io/mantine-ui", "private": true, - "version": "0.303.0", + "version": "0.303.1", "type": "module", "scripts": { "start": "vite", @@ -28,7 +28,7 @@ "@microsoft/fetch-event-source": "^2.0.1", "@nexucis/fuzzy": "^0.5.1", "@nexucis/kvsearch": "^0.9.1", - "@prometheus-io/codemirror-promql": "0.303.0", + "@prometheus-io/codemirror-promql": "0.303.1", "@reduxjs/toolkit": "^2.5.0", "@tabler/icons-react": "^3.28.1", "@tanstack/react-query": "^5.67.1", diff --git a/web/ui/module/codemirror-promql/package.json b/web/ui/module/codemirror-promql/package.json index 474cc7dd2e..45ef1c2305 100644 --- a/web/ui/module/codemirror-promql/package.json +++ b/web/ui/module/codemirror-promql/package.json @@ -1,6 +1,6 @@ { "name": "@prometheus-io/codemirror-promql", - "version": "0.303.0", + "version": "0.303.1", "description": "a CodeMirror mode for the PromQL language", "types": "dist/esm/index.d.ts", "module": "dist/esm/index.js", @@ -29,7 +29,7 @@ }, "homepage": "https://github.com/prometheus/prometheus/blob/main/web/ui/module/codemirror-promql/README.md", "dependencies": { - "@prometheus-io/lezer-promql": "0.303.0", + "@prometheus-io/lezer-promql": "0.303.1", "lru-cache": "^11.0.2" }, "devDependencies": { diff --git a/web/ui/module/lezer-promql/package.json b/web/ui/module/lezer-promql/package.json index a5c1c35327..148443c6fb 100644 --- a/web/ui/module/lezer-promql/package.json +++ b/web/ui/module/lezer-promql/package.json @@ -1,6 +1,6 @@ { "name": "@prometheus-io/lezer-promql", - "version": "0.303.0", + "version": "0.303.1", "description": "lezer-based PromQL grammar", "main": "dist/index.cjs", "type": "module", diff --git a/web/ui/package-lock.json b/web/ui/package-lock.json index d18d019fbf..54759e4d5c 100644 --- a/web/ui/package-lock.json +++ b/web/ui/package-lock.json @@ -1,12 +1,12 @@ { "name": "prometheus-io", - "version": "0.303.0", + "version": "0.303.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "prometheus-io", - "version": "0.303.0", + "version": "0.303.1", "workspaces": [ "mantine-ui", "module/*" @@ -24,7 +24,7 @@ }, "mantine-ui": { "name": "@prometheus-io/mantine-ui", - "version": "0.303.0", + "version": "0.303.1", "dependencies": { "@codemirror/autocomplete": "^6.18.4", "@codemirror/language": "^6.10.8", @@ -42,7 +42,7 @@ "@microsoft/fetch-event-source": "^2.0.1", "@nexucis/fuzzy": "^0.5.1", "@nexucis/kvsearch": "^0.9.1", - "@prometheus-io/codemirror-promql": "0.303.0", + "@prometheus-io/codemirror-promql": "0.303.1", "@reduxjs/toolkit": "^2.5.0", "@tabler/icons-react": "^3.28.1", "@tanstack/react-query": "^5.67.1", @@ -156,10 +156,10 @@ }, "module/codemirror-promql": { "name": "@prometheus-io/codemirror-promql", - "version": "0.303.0", + "version": "0.303.1", "license": "Apache-2.0", "dependencies": { - "@prometheus-io/lezer-promql": "0.303.0", + "@prometheus-io/lezer-promql": "0.303.1", "lru-cache": "^11.0.2" }, "devDependencies": { @@ -189,7 +189,7 @@ }, "module/lezer-promql": { "name": "@prometheus-io/lezer-promql", - "version": "0.303.0", + "version": "0.303.1", "license": "Apache-2.0", "devDependencies": { "@lezer/generator": "^1.7.2", diff --git a/web/ui/package.json b/web/ui/package.json index cc56c134b3..2c9bc658af 100644 --- a/web/ui/package.json +++ b/web/ui/package.json @@ -1,7 +1,7 @@ { "name": "prometheus-io", "description": "Monorepo for the Prometheus UI", - "version": "0.303.0", + "version": "0.303.1", "private": true, "scripts": { "build": "bash build_ui.sh --all",