diff --git a/MAINTAINERS.md b/MAINTAINERS.md index 9f24ddf8c3..f45fa6b346 100644 --- a/MAINTAINERS.md +++ b/MAINTAINERS.md @@ -1,7 +1,7 @@ Julien Pivotto ( / @roidelapluie) and Levi Harrison ( / @LeviHarrison) are the main/default maintainers, some parts of the codebase have other maintainers: * `cmd` - * `promtool`: David Leadbeater ( / @dgl), Jessica Grebenschikov ( / @jessicagreben) + * `promtool`: David Leadbeater ( / @dgl), Jessica Grebenschikov ( / @jessicagreben) * `discovery` * `k8s`: Frederic Branczyk ( / @brancz) * `documentation` diff --git a/cmd/prometheus/main_test.go b/cmd/prometheus/main_test.go index c3915c7ca4..1f161d26be 100644 --- a/cmd/prometheus/main_test.go +++ b/cmd/prometheus/main_test.go @@ -288,12 +288,7 @@ func TestMaxBlockChunkSegmentSizeBounds(t *testing.T) { } func TestTimeMetrics(t *testing.T) { - tmpDir, err := ioutil.TempDir("", "time_metrics_e2e") - require.NoError(t, err) - - defer func() { - require.NoError(t, os.RemoveAll(tmpDir)) - }() + tmpDir := t.TempDir() reg := prometheus.NewRegistry() db, err := openDBWithMetrics(tmpDir, log.NewNopLogger(), reg, nil, nil) diff --git a/cmd/prometheus/query_log_test.go b/cmd/prometheus/query_log_test.go index 1b2bd4f974..844bde1c96 100644 --- a/cmd/prometheus/query_log_test.go +++ b/cmd/prometheus/query_log_test.go @@ -248,11 +248,7 @@ func (p *queryLogTest) run(t *testing.T) { p.setQueryLog(t, "") } - dir, err := ioutil.TempDir("", "query_log_test") - require.NoError(t, err) - defer func() { - require.NoError(t, os.RemoveAll(dir)) - }() + dir := t.TempDir() params := append([]string{ "-test.main", diff --git a/cmd/promtool/backfill_test.go b/cmd/promtool/backfill_test.go index c9493f134c..c4e6c6b7c0 100644 --- a/cmd/promtool/backfill_test.go +++ b/cmd/promtool/backfill_test.go @@ -15,9 +15,7 @@ package main import ( "context" - "io/ioutil" "math" - "os" "sort" "testing" "time" @@ -687,13 +685,9 @@ after_eof 1 2 t.Run(test.Description, func(t *testing.T) { t.Logf("Test:%s", test.Description) - outputDir, err := ioutil.TempDir("", "myDir") - require.NoError(t, err) - defer func() { - require.NoError(t, os.RemoveAll(outputDir)) - }() + outputDir := t.TempDir() - err = backfill(test.MaxSamplesInAppender, []byte(test.ToParse), outputDir, false, false, test.MaxBlockDuration) + err := backfill(test.MaxSamplesInAppender, []byte(test.ToParse), outputDir, false, false, test.MaxBlockDuration) if !test.IsOk { require.Error(t, err, test.Description) diff --git a/cmd/promtool/rules_test.go b/cmd/promtool/rules_test.go index 10d59d5cc5..decda0fe38 100644 --- a/cmd/promtool/rules_test.go +++ b/cmd/promtool/rules_test.go @@ -17,7 +17,6 @@ import ( "context" "io/ioutil" "math" - "os" "path/filepath" "testing" "time" @@ -72,11 +71,7 @@ func TestBackfillRuleIntegration(t *testing.T) { } for _, tt := range testCases { t.Run(tt.name, func(t *testing.T) { - tmpDir, err := ioutil.TempDir("", "backfilldata") - require.NoError(t, err) - defer func() { - require.NoError(t, os.RemoveAll(tmpDir)) - }() + tmpDir := t.TempDir() ctx := context.Background() // Execute the test more than once to simulate running the rule importer twice with the same data. @@ -219,11 +214,7 @@ func createMultiRuleTestFiles(path string) error { // TestBackfillLabels confirms that the labels in the rule file override the labels from the metrics // received from Prometheus Query API, including the __name__ label. func TestBackfillLabels(t *testing.T) { - tmpDir, err := ioutil.TempDir("", "backfilldata") - require.NoError(t, err) - defer func() { - require.NoError(t, os.RemoveAll(tmpDir)) - }() + tmpDir := t.TempDir() ctx := context.Background() start := time.Date(2009, time.November, 10, 6, 34, 0, 0, time.UTC) diff --git a/docs/configuration/configuration.md b/docs/configuration/configuration.md index bfe23e9160..95fc0ff8de 100644 --- a/docs/configuration/configuration.md +++ b/docs/configuration/configuration.md @@ -1023,8 +1023,8 @@ address defaults to the `host_ip` attribute of the hypervisor. The following meta labels are available on targets during [relabeling](#relabel_config): * `__meta_openstack_hypervisor_host_ip`: the hypervisor node's IP address. +* `__meta_openstack_hypervisor_hostname`: the hypervisor node's name. * `__meta_openstack_hypervisor_id`: the hypervisor node's ID. -* `__meta_openstack_hypervisor_name`: the hypervisor node's name. * `__meta_openstack_hypervisor_state`: the hypervisor node's state. * `__meta_openstack_hypervisor_status`: the hypervisor node's status. * `__meta_openstack_hypervisor_type`: the hypervisor node's type. diff --git a/documentation/examples/prometheus-kubernetes.yml b/documentation/examples/prometheus-kubernetes.yml index e2de9cdc06..3d3861ab4f 100644 --- a/documentation/examples/prometheus-kubernetes.yml +++ b/documentation/examples/prometheus-kubernetes.yml @@ -185,10 +185,10 @@ scrape_configs: regex: __meta_kubernetes_service_label_(.+) - source_labels: [__meta_kubernetes_namespace] action: replace - target_label: kubernetes_namespace + target_label: namespace - source_labels: [__meta_kubernetes_service_name] action: replace - target_label: kubernetes_name + target_label: service # Example scrape config for probing services via the Blackbox Exporter. # @@ -217,9 +217,9 @@ scrape_configs: - action: labelmap regex: __meta_kubernetes_service_label_(.+) - source_labels: [__meta_kubernetes_namespace] - target_label: kubernetes_namespace + target_label: namespace - source_labels: [__meta_kubernetes_service_name] - target_label: kubernetes_name + target_label: service # Example scrape config for probing ingresses via the Blackbox Exporter. # @@ -255,9 +255,9 @@ scrape_configs: - action: labelmap regex: __meta_kubernetes_ingress_label_(.+) - source_labels: [__meta_kubernetes_namespace] - target_label: kubernetes_namespace + target_label: namespace - source_labels: [__meta_kubernetes_ingress_name] - target_label: kubernetes_name + target_label: ingress # Example scrape config for pods # @@ -294,7 +294,7 @@ scrape_configs: regex: __meta_kubernetes_pod_label_(.+) - source_labels: [__meta_kubernetes_namespace] action: replace - target_label: kubernetes_namespace + target_label: namespace - source_labels: [__meta_kubernetes_pod_name] action: replace - target_label: kubernetes_pod_name + target_label: pod diff --git a/documentation/prometheus-mixin/alerts.libsonnet b/documentation/prometheus-mixin/alerts.libsonnet index baf2f2f0fd..0f9b4b3d62 100644 --- a/documentation/prometheus-mixin/alerts.libsonnet +++ b/documentation/prometheus-mixin/alerts.libsonnet @@ -391,7 +391,7 @@ and ( count by (%(prometheusHAGroupLabels)s) ( - changes(process_start_time_seconds{%(prometheusSelector)s}[30m]) > 1 + changes(process_start_time_seconds{%(prometheusSelector)s}[1h]) > 1 ) / count by (%(prometheusHAGroupLabels)s) ( @@ -418,7 +418,7 @@ }, annotations: { summary: 'More than half of the Prometheus instances within the same HA group are crashlooping.', - description: '{{ $value | humanizePercentage }} of Prometheus instances within the %(prometheusHAGroupName)s HA group have had at least 5 total restarts or 2 unclean restarts in the last 30m.' % $._config, + description: '{{ $value | humanizePercentage }} of Prometheus instances within the %(prometheusHAGroupName)s HA group have had at least 5 total restarts in the last 30m or 2 unclean restarts in the last 1h.' % $._config, }, }, ], diff --git a/go.mod b/go.mod index 6413d2ada4..6b58e238c1 100644 --- a/go.mod +++ b/go.mod @@ -9,13 +9,13 @@ require ( github.com/Azure/go-autorest/autorest/to v0.4.0 // indirect github.com/Azure/go-autorest/autorest/validation v0.3.1 // indirect github.com/alecthomas/units v0.0.0-20210927113745-59d0afb8317a - github.com/aws/aws-sdk-go v1.42.6 + github.com/aws/aws-sdk-go v1.42.10 github.com/cespare/xxhash/v2 v2.1.2 github.com/containerd/containerd v1.5.7 // indirect github.com/dennwc/varint v1.0.0 github.com/dgryski/go-sip13 v0.0.0-20200911182023-62edffca9245 github.com/digitalocean/godo v1.71.0 - github.com/docker/docker v20.10.10+incompatible + github.com/docker/docker v20.10.11+incompatible github.com/docker/go-connections v0.4.0 // indirect github.com/edsrzf/mmap-go v1.0.0 github.com/envoyproxy/go-control-plane v0.10.1 @@ -71,9 +71,9 @@ require ( gopkg.in/alecthomas/kingpin.v2 v2.2.6 gopkg.in/yaml.v2 v2.4.0 gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b - k8s.io/api v0.22.3 - k8s.io/apimachinery v0.22.3 - k8s.io/client-go v0.22.3 + k8s.io/api v0.22.4 + k8s.io/apimachinery v0.22.4 + k8s.io/client-go v0.22.4 k8s.io/klog v1.0.0 k8s.io/klog/v2 v2.20.0 ) diff --git a/go.sum b/go.sum index c1e15b89b8..824edb52c3 100644 --- a/go.sum +++ b/go.sum @@ -187,8 +187,8 @@ github.com/aws/aws-sdk-go v1.30.12/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZve github.com/aws/aws-sdk-go v1.34.28/go.mod h1:H7NKnBqNVzoTJpGfLrQkkD+ytBA93eiDYi/+8rV9s48= github.com/aws/aws-sdk-go v1.38.35/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= github.com/aws/aws-sdk-go v1.40.11/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q= -github.com/aws/aws-sdk-go v1.42.6 h1:CiJmv8Fdc7wLZhfWy1ZA9TNoOQrFtUC0mhpgyJTaKOs= -github.com/aws/aws-sdk-go v1.42.6/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q= +github.com/aws/aws-sdk-go v1.42.10 h1:PW9G/hnsuKttbFtOcgNKD0vQrp4yfNrtACA+X0p9mjM= +github.com/aws/aws-sdk-go v1.42.10/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= github.com/benbjohnson/immutable v0.2.1/go.mod h1:uc6OHo6PN2++n98KHLxW8ef4W42ylHiQSENghE1ezxI= github.com/benbjohnson/tmpl v1.0.0/go.mod h1:igT620JFIi44B6awvU9IsDhR77IXWtFigTLil/RPdps= @@ -381,8 +381,8 @@ github.com/docker/distribution v0.0.0-20190905152932-14b96e55d84c/go.mod h1:0+TT github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/distribution v2.7.1+incompatible h1:a5mlkVzth6W5A4fOsS3D2EO5BUmsJpcB+cRlLU7cSug= github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v20.10.10+incompatible h1:GKkP0T7U4ks6X3lmmHKC2QDprnpRJor2Z5a8m62R9ZM= -github.com/docker/docker v20.10.10+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v20.10.11+incompatible h1:OqzI/g/W54LczvhnccGqniFoQghHx3pklbLuhfXpqGo= +github.com/docker/docker v20.10.11+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-events v0.0.0-20170721190031-9461782956ad/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= @@ -2006,14 +2006,14 @@ k8s.io/api v0.17.5/go.mod h1:0zV5/ungglgy2Rlm3QK8fbxkXVs+BSJWpJP/+8gUVLY= k8s.io/api v0.20.1/go.mod h1:KqwcCVogGxQY3nBlRpwt+wpAMF/KjaCc7RpywacvqUo= k8s.io/api v0.20.4/go.mod h1:++lNL1AJMkDymriNniQsWRkMDzRaX2Y/POTUi8yvqYQ= k8s.io/api v0.20.6/go.mod h1:X9e8Qag6JV/bL5G6bU8sdVRltWKmdHsFUGS3eVndqE8= -k8s.io/api v0.22.3 h1:wOoES2GoSkUsdped2RB4zYypPqWtvprGoKCENTOOjP4= -k8s.io/api v0.22.3/go.mod h1:azgiXFiXqiWyLCfI62/eYBOu19rj2LKmIhFPP4+33fs= +k8s.io/api v0.22.4 h1:UvyHW0ezB2oIgHAxlYoo6UJQObYXU7awuNarwoHEOjw= +k8s.io/api v0.22.4/go.mod h1:Rgs+9gIGYC5laXQSZZ9JqT5NevNgoGiOdVWi1BAB3qk= k8s.io/apimachinery v0.17.5/go.mod h1:ioIo1G/a+uONV7Tv+ZmCbMG1/a3kVw5YcDdncd8ugQ0= k8s.io/apimachinery v0.20.1/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= k8s.io/apimachinery v0.20.4/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= k8s.io/apimachinery v0.20.6/go.mod h1:ejZXtW1Ra6V1O5H8xPBGz+T3+4gfkTCeExAHKU57MAc= -k8s.io/apimachinery v0.22.3 h1:mrvBG5CZnEfwgpVqWcrRKvdsYECTrhAR6cApAgdsflk= -k8s.io/apimachinery v0.22.3/go.mod h1:O3oNtNadZdeOMxHFVxOreoznohCpy0z6mocxbZr7oJ0= +k8s.io/apimachinery v0.22.4 h1:9uwcvPpukBw/Ri0EUmWz+49cnFtaoiyEhQTK+xOe7Ck= +k8s.io/apimachinery v0.22.4/go.mod h1:yU6oA6Gnax9RrxGzVvPFFJ+mpnW6PBSqp0sx0I0HHW0= k8s.io/apiserver v0.20.1/go.mod h1:ro5QHeQkgMS7ZGpvf4tSMx6bBOgPfE+f52KwvXfScaU= k8s.io/apiserver v0.20.4/go.mod h1:Mc80thBKOyy7tbvFtB4kJv1kbdD0eIH8k8vianJcbFM= k8s.io/apiserver v0.20.6/go.mod h1:QIJXNt6i6JB+0YQRNcS0hdRHJlMhflFmsBDeSgT1r8Q= @@ -2021,8 +2021,8 @@ k8s.io/client-go v0.17.5/go.mod h1:S8uZpBpjJJdEH/fEyxcqg7Rn0P5jH+ilkgBHjriSmNo= k8s.io/client-go v0.20.1/go.mod h1:/zcHdt1TeWSd5HoUe6elJmHSQ6uLLgp4bIJHVEuy+/Y= k8s.io/client-go v0.20.4/go.mod h1:LiMv25ND1gLUdBeYxBIwKpkSC5IsozMMmOOeSJboP+k= k8s.io/client-go v0.20.6/go.mod h1:nNQMnOvEUEsOzRRFIIkdmYOjAZrC8bgq0ExboWSU1I0= -k8s.io/client-go v0.22.3 h1:6onkOSc+YNdwq5zXE0wFXicq64rrym+mXwHu/CPVGO4= -k8s.io/client-go v0.22.3/go.mod h1:ElDjYf8gvZsKDYexmsmnMQ0DYO8W9RwBjfQ1PI53yow= +k8s.io/client-go v0.22.4 h1:aAQ1Wk+I3bjCNk35YWUqbaueqrIonkfDPJSPDDe8Kfg= +k8s.io/client-go v0.22.4/go.mod h1:Yzw4e5e7h1LNHA4uqnMVrpEpUs1hJOiuBsJKIlRCHDA= k8s.io/component-base v0.20.1/go.mod h1:guxkoJnNoh8LNrbtiQOlyp2Y2XFCZQmrcg2n/DeYNLk= k8s.io/component-base v0.20.4/go.mod h1:t4p9EdiagbVCJKrQ1RsA5/V4rFQNDfRlevJajlGwgjI= k8s.io/component-base v0.20.6/go.mod h1:6f1MPBAeI+mvuts3sIdtpjljHWBQ2cIy38oBIWMYnrM= @@ -2034,8 +2034,8 @@ k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8 k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/kube-openapi v0.0.0-20200316234421-82d701f24f9d/go.mod h1:F+5wygcW0wmRTnM3cOgIqGivxkwSWIWT5YdsDbeAOaU= k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= -k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e h1:KLHHjkdQFomZy8+06csTWZ0m1343QqxZhR2LJ1OxCYM= -k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= +k8s.io/kube-openapi v0.0.0-20211109043538-20434351676c h1:jvamsI1tn9V0S8jicyX82qaFC0H/NKxv2e5mbqsgR80= +k8s.io/kube-openapi v0.0.0-20211109043538-20434351676c/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= k8s.io/utils v0.0.0-20200414100711-2df71ebbae66/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= diff --git a/promql/value.go b/promql/value.go index 81af1ad9da..176b856960 100644 --- a/promql/value.go +++ b/promql/value.go @@ -77,6 +77,9 @@ func (s Series) String() string { } // Point represents a single data point for a given timestamp. +// +// Note that Point's JSON marshaling is done in an optimized fashion in +// web/api/v1/api.go. Therefore, no MarshalJSON method is provided here. type Point struct { T int64 V float64 @@ -87,12 +90,6 @@ func (p Point) String() string { return fmt.Sprintf("%v @[%v]", v, p.T) } -// MarshalJSON implements json.Marshaler. -func (p Point) MarshalJSON() ([]byte, error) { - v := strconv.FormatFloat(p.V, 'f', -1, 64) - return json.Marshal([...]interface{}{float64(p.T) / 1000, v}) -} - // Sample is a single sample belonging to a metric. type Sample struct { Point diff --git a/storage/remote/queue_manager_test.go b/storage/remote/queue_manager_test.go index 64a3d6462b..65d59b028b 100644 --- a/storage/remote/queue_manager_test.go +++ b/storage/remote/queue_manager_test.go @@ -75,11 +75,7 @@ func TestSampleDelivery(t *testing.T) { // batch timeout case. n := 3 - dir, err := ioutil.TempDir("", "TestSampleDelivery") - require.NoError(t, err) - defer func() { - require.NoError(t, os.RemoveAll(dir)) - }() + dir := t.TempDir() s := NewStorage(nil, nil, nil, dir, defaultFlushDeadline, nil) defer s.Close() @@ -154,9 +150,7 @@ func TestSampleDelivery(t *testing.T) { func TestMetadataDelivery(t *testing.T) { c := NewTestWriteClient() - dir, err := ioutil.TempDir("", "TestMetadataDelivery") - require.NoError(t, err) - defer os.RemoveAll(dir) + dir := t.TempDir() cfg := config.DefaultQueueConfig mcfg := config.DefaultMetadataConfig @@ -198,11 +192,7 @@ func TestSampleDeliveryTimeout(t *testing.T) { cfg.MaxShards = 1 cfg.BatchSendDeadline = model.Duration(100 * time.Millisecond) - dir, err := ioutil.TempDir("", "TestSampleDeliveryTimeout") - require.NoError(t, err) - defer func() { - require.NoError(t, os.RemoveAll(dir)) - }() + dir := t.TempDir() metrics := newQueueManagerMetrics(nil, "", "") m := NewQueueManager(metrics, nil, nil, nil, dir, newEWMARate(ewmaWeight, shardUpdateDuration), cfg, mcfg, nil, nil, c, defaultFlushDeadline, newPool(), newHighestTimestampMetric(), nil, false) @@ -241,11 +231,7 @@ func TestSampleDeliveryOrder(t *testing.T) { c := NewTestWriteClient() c.expectSamples(samples, series) - dir, err := ioutil.TempDir("", "TestSampleDeliveryOrder") - require.NoError(t, err) - defer func() { - require.NoError(t, os.RemoveAll(dir)) - }() + dir := t.TempDir() cfg := config.DefaultQueueConfig mcfg := config.DefaultMetadataConfig @@ -265,11 +251,7 @@ func TestShutdown(t *testing.T) { deadline := 1 * time.Second c := NewTestBlockedWriteClient() - dir, err := ioutil.TempDir("", "TestShutdown") - require.NoError(t, err) - defer func() { - require.NoError(t, os.RemoveAll(dir)) - }() + dir := t.TempDir() cfg := config.DefaultQueueConfig mcfg := config.DefaultMetadataConfig @@ -308,11 +290,7 @@ func TestSeriesReset(t *testing.T) { numSegments := 4 numSeries := 25 - dir, err := ioutil.TempDir("", "TestSeriesReset") - require.NoError(t, err) - defer func() { - require.NoError(t, os.RemoveAll(dir)) - }() + dir := t.TempDir() cfg := config.DefaultQueueConfig mcfg := config.DefaultMetadataConfig @@ -343,11 +321,7 @@ func TestReshard(t *testing.T) { mcfg := config.DefaultMetadataConfig cfg.MaxShards = 1 - dir, err := ioutil.TempDir("", "TestReshard") - require.NoError(t, err) - defer func() { - require.NoError(t, os.RemoveAll(dir)) - }() + dir := t.TempDir() metrics := newQueueManagerMetrics(nil, "", "") m := NewQueueManager(metrics, nil, nil, nil, dir, newEWMARate(ewmaWeight, shardUpdateDuration), cfg, mcfg, nil, nil, c, defaultFlushDeadline, newPool(), newHighestTimestampMetric(), nil, false) @@ -740,9 +714,7 @@ func BenchmarkSampleDelivery(b *testing.B) { cfg.BatchSendDeadline = model.Duration(100 * time.Millisecond) cfg.MaxShards = 1 - dir, err := ioutil.TempDir("", "BenchmarkSampleDelivery") - require.NoError(b, err) - defer os.RemoveAll(dir) + dir := b.TempDir() metrics := newQueueManagerMetrics(nil, "", "") m := NewQueueManager(metrics, nil, nil, nil, dir, newEWMARate(ewmaWeight, shardUpdateDuration), cfg, mcfg, nil, nil, c, defaultFlushDeadline, newPool(), newHighestTimestampMetric(), nil, false) @@ -865,11 +837,7 @@ func TestCalculateDesiredShards(t *testing.T) { cfg := config.DefaultQueueConfig mcfg := config.DefaultMetadataConfig - dir, err := ioutil.TempDir("", "TestCalculateDesiredShards") - require.NoError(t, err) - defer func() { - require.NoError(t, os.RemoveAll(dir)) - }() + dir := t.TempDir() metrics := newQueueManagerMetrics(nil, "", "") samplesIn := newEWMARate(ewmaWeight, shardUpdateDuration) diff --git a/storage/remote/read_test.go b/storage/remote/read_test.go index bf3bff1de3..e2d4e18092 100644 --- a/storage/remote/read_test.go +++ b/storage/remote/read_test.go @@ -15,9 +15,7 @@ package remote import ( "context" - "io/ioutil" "net/url" - "os" "sort" "testing" @@ -33,9 +31,7 @@ import ( ) func TestNoDuplicateReadConfigs(t *testing.T) { - dir, err := ioutil.TempDir("", "TestNoDuplicateReadConfigs") - require.NoError(t, err) - defer os.RemoveAll(dir) + dir := t.TempDir() cfg1 := config.RemoteReadConfig{ Name: "write-1", diff --git a/storage/remote/storage_test.go b/storage/remote/storage_test.go index 29fc67e0d0..6254c69196 100644 --- a/storage/remote/storage_test.go +++ b/storage/remote/storage_test.go @@ -14,9 +14,7 @@ package remote import ( - "io/ioutil" "net/url" - "os" "testing" common_config "github.com/prometheus/common/config" @@ -26,9 +24,7 @@ import ( ) func TestStorageLifecycle(t *testing.T) { - dir, err := ioutil.TempDir("", "TestStorageLifecycle") - require.NoError(t, err) - defer os.RemoveAll(dir) + dir := t.TempDir() s := NewStorage(nil, nil, nil, dir, defaultFlushDeadline, nil) conf := &config.Config{ @@ -60,14 +56,12 @@ func TestStorageLifecycle(t *testing.T) { // make sure remote write has a queue. require.Equal(t, 1, len(s.queryables)) - err = s.Close() + err := s.Close() require.NoError(t, err) } func TestUpdateRemoteReadConfigs(t *testing.T) { - dir, err := ioutil.TempDir("", "TestUpdateRemoteReadConfigs") - require.NoError(t, err) - defer os.RemoveAll(dir) + dir := t.TempDir() s := NewStorage(nil, nil, nil, dir, defaultFlushDeadline, nil) @@ -83,6 +77,6 @@ func TestUpdateRemoteReadConfigs(t *testing.T) { require.NoError(t, s.ApplyConfig(conf)) require.Equal(t, 1, len(s.queryables)) - err = s.Close() + err := s.Close() require.NoError(t, err) } diff --git a/storage/remote/write_test.go b/storage/remote/write_test.go index f2545337b8..d92b65852a 100644 --- a/storage/remote/write_test.go +++ b/storage/remote/write_test.go @@ -14,9 +14,7 @@ package remote import ( - "io/ioutil" "net/url" - "os" "testing" "time" @@ -44,11 +42,7 @@ func testRemoteWriteConfig() *config.RemoteWriteConfig { } func TestNoDuplicateWriteConfigs(t *testing.T) { - dir, err := ioutil.TempDir("", "TestNoDuplicateWriteConfigs") - require.NoError(t, err) - defer func() { - require.NoError(t, os.RemoveAll(dir)) - }() + dir := t.TempDir() cfg1 := config.RemoteWriteConfig{ Name: "write-1", @@ -132,11 +126,7 @@ func TestNoDuplicateWriteConfigs(t *testing.T) { } func TestRestartOnNameChange(t *testing.T) { - dir, err := ioutil.TempDir("", "TestRestartOnNameChange") - require.NoError(t, err) - defer func() { - require.NoError(t, os.RemoveAll(dir)) - }() + dir := t.TempDir() cfg := testRemoteWriteConfig() @@ -166,11 +156,7 @@ func TestRestartOnNameChange(t *testing.T) { } func TestUpdateWithRegisterer(t *testing.T) { - dir, err := ioutil.TempDir("", "TestRestartWithRegisterer") - require.NoError(t, err) - defer func() { - require.NoError(t, os.RemoveAll(dir)) - }() + dir := t.TempDir() s := NewWriteStorage(nil, prometheus.NewRegistry(), dir, time.Millisecond, nil) c1 := &config.RemoteWriteConfig{ @@ -205,16 +191,12 @@ func TestUpdateWithRegisterer(t *testing.T) { require.Equal(t, 10, queue.cfg.MaxShards) } - err = s.Close() + err := s.Close() require.NoError(t, err) } func TestWriteStorageLifecycle(t *testing.T) { - dir, err := ioutil.TempDir("", "TestWriteStorageLifecycle") - require.NoError(t, err) - defer func() { - require.NoError(t, os.RemoveAll(dir)) - }() + dir := t.TempDir() s := NewWriteStorage(nil, nil, dir, defaultFlushDeadline, nil) conf := &config.Config{ @@ -226,16 +208,12 @@ func TestWriteStorageLifecycle(t *testing.T) { require.NoError(t, s.ApplyConfig(conf)) require.Equal(t, 1, len(s.queues)) - err = s.Close() + err := s.Close() require.NoError(t, err) } func TestUpdateExternalLabels(t *testing.T) { - dir, err := ioutil.TempDir("", "TestUpdateExternalLabels") - require.NoError(t, err) - defer func() { - require.NoError(t, os.RemoveAll(dir)) - }() + dir := t.TempDir() s := NewWriteStorage(nil, prometheus.NewRegistry(), dir, time.Second, nil) @@ -264,11 +242,7 @@ func TestUpdateExternalLabels(t *testing.T) { } func TestWriteStorageApplyConfigsIdempotent(t *testing.T) { - dir, err := ioutil.TempDir("", "TestWriteStorageApplyConfigsIdempotent") - require.NoError(t, err) - defer func() { - require.NoError(t, os.RemoveAll(dir)) - }() + dir := t.TempDir() s := NewWriteStorage(nil, nil, dir, defaultFlushDeadline, nil) @@ -305,11 +279,7 @@ func TestWriteStorageApplyConfigsIdempotent(t *testing.T) { } func TestWriteStorageApplyConfigsPartialUpdate(t *testing.T) { - dir, err := ioutil.TempDir("", "TestWriteStorageApplyConfigsPartialUpdate") - require.NoError(t, err) - defer func() { - require.NoError(t, os.RemoveAll(dir)) - }() + dir := t.TempDir() s := NewWriteStorage(nil, nil, dir, defaultFlushDeadline, nil) @@ -383,7 +353,7 @@ func TestWriteStorageApplyConfigsPartialUpdate(t *testing.T) { secondClient := s.queues[hashes[1]].client() // Update c1. c1.HTTPClientConfig.BearerToken = "bar" - err = s.ApplyConfig(conf) + err := s.ApplyConfig(conf) require.NoError(t, err) require.Equal(t, 3, len(s.queues)) diff --git a/tsdb/db_test.go b/tsdb/db_test.go index a6e85f90cb..063a90abaf 100644 --- a/tsdb/db_test.go +++ b/tsdb/db_test.go @@ -1013,6 +1013,92 @@ func TestWALSegmentSizeOptions(t *testing.T) { } } +// https://github.com/prometheus/prometheus/issues/9846 +// https://github.com/prometheus/prometheus/issues/9859 +func TestWALReplayRaceOnSamplesLoggedBeforeSeries(t *testing.T) { + const ( + numRuns = 1 + numSamplesBeforeSeriesCreation = 1000 + ) + + // We test both with few and many samples appended after series creation. If samples are < 120 then there's no + // mmap-ed chunk, otherwise there's at least 1 mmap-ed chunk when replaying the WAL. + for _, numSamplesAfterSeriesCreation := range []int{1, 1000} { + for run := 1; run <= numRuns; run++ { + t.Run(fmt.Sprintf("samples after series creation = %d, run = %d", numSamplesAfterSeriesCreation, run), func(t *testing.T) { + testWALReplayRaceOnSamplesLoggedBeforeSeries(t, numSamplesBeforeSeriesCreation, numSamplesAfterSeriesCreation) + }) + } + } +} + +func testWALReplayRaceOnSamplesLoggedBeforeSeries(t *testing.T, numSamplesBeforeSeriesCreation, numSamplesAfterSeriesCreation int) { + const numSeries = 1000 + + db := openTestDB(t, nil, nil) + db.DisableCompactions() + + for seriesRef := 1; seriesRef <= numSeries; seriesRef++ { + // Log samples before the series is logged to the WAL. + var enc record.Encoder + var samples []record.RefSample + + for ts := 0; ts < numSamplesBeforeSeriesCreation; ts++ { + samples = append(samples, record.RefSample{ + Ref: chunks.HeadSeriesRef(uint64(seriesRef)), + T: int64(ts), + V: float64(ts), + }) + } + + err := db.Head().wal.Log(enc.Samples(samples, nil)) + require.NoError(t, err) + + // Add samples via appender so that they're logged after the series in the WAL. + app := db.Appender(context.Background()) + lbls := labels.FromStrings("series_id", strconv.Itoa(seriesRef)) + + for ts := numSamplesBeforeSeriesCreation; ts < numSamplesBeforeSeriesCreation+numSamplesAfterSeriesCreation; ts++ { + _, err := app.Append(0, lbls, int64(ts), float64(ts)) + require.NoError(t, err) + } + require.NoError(t, app.Commit()) + } + + require.NoError(t, db.Close()) + + // Reopen the DB, replaying the WAL. + reopenDB, err := Open(db.Dir(), log.NewLogfmtLogger(os.Stderr), nil, nil, nil) + require.NoError(t, err) + t.Cleanup(func() { + require.NoError(t, reopenDB.Close()) + }) + + // Query back chunks for all series. + q, err := reopenDB.ChunkQuerier(context.Background(), math.MinInt64, math.MaxInt64) + require.NoError(t, err) + + set := q.Select(false, nil, labels.MustNewMatcher(labels.MatchRegexp, "series_id", ".+")) + actualSeries := 0 + + for set.Next() { + actualSeries++ + actualChunks := 0 + + chunksIt := set.At().Iterator() + for chunksIt.Next() { + actualChunks++ + } + require.NoError(t, chunksIt.Err()) + + // We expect 1 chunk every 120 samples after series creation. + require.Equalf(t, (numSamplesAfterSeriesCreation/120)+1, actualChunks, "series: %s", set.At().Labels().String()) + } + + require.NoError(t, set.Err()) + require.Equal(t, numSeries, actualSeries) +} + func TestTombstoneClean(t *testing.T) { numSamples := int64(10) diff --git a/tsdb/head_wal.go b/tsdb/head_wal.go index 5d5c995b3c..8191284932 100644 --- a/tsdb/head_wal.go +++ b/tsdb/head_wal.go @@ -51,13 +51,10 @@ func (h *Head) loadWAL(r *wal.Reader, multiRef map[chunks.HeadSeriesRef]chunks.H var mmapOverlappingChunks uint64 // Start workers that each process samples for a partition of the series ID space. - // They are connected through a ring of channels which ensures that all sample batches - // read from the WAL are processed in order. var ( wg sync.WaitGroup n = runtime.GOMAXPROCS(0) - inputs = make([]chan []record.RefSample, n) - outputs = make([]chan []record.RefSample, n) + processors = make([]walSubsetProcessor, n) exemplarsInput chan record.RefExemplar dec record.Decoder @@ -92,9 +89,7 @@ func (h *Head) loadWAL(r *wal.Reader, multiRef map[chunks.HeadSeriesRef]chunks.H _, ok := err.(*wal.CorruptionErr) if ok || seriesCreationErr != nil { for i := 0; i < n; i++ { - close(inputs[i]) - for range outputs[i] { - } + processors[i].closeAndDrain() } close(exemplarsInput) wg.Wait() @@ -103,14 +98,13 @@ func (h *Head) loadWAL(r *wal.Reader, multiRef map[chunks.HeadSeriesRef]chunks.H wg.Add(n) for i := 0; i < n; i++ { - outputs[i] = make(chan []record.RefSample, 300) - inputs[i] = make(chan []record.RefSample, 300) + processors[i].setup() - go func(input <-chan []record.RefSample, output chan<- []record.RefSample) { - unknown := h.processWALSamples(h.minValidTime.Load(), input, output) + go func(wp *walSubsetProcessor) { + unknown := wp.processWALSamples(h) unknownRefs.Add(unknown) wg.Done() - }(inputs[i], outputs[i]) + }(&processors[i]) } wg.Add(1) @@ -212,11 +206,20 @@ Outer: h.lastSeriesID.Store(uint64(walSeries.Ref)) } + idx := uint64(mSeries.ref) % uint64(n) + // It is possible that some old sample is being processed in processWALSamples that + // could cause race below. So we wait for the goroutine to empty input the buffer and finish + // processing all old samples after emptying the buffer. + processors[idx].waitUntilIdle() + // Lock the subset so we can modify the series object + processors[idx].mx.Lock() + mmc := mmappedChunks[walSeries.Ref] if created { // This is the first WAL series record for this series. - h.setMMappedChunks(mSeries, mmc) + h.resetSeriesWithMMappedChunks(mSeries, mmc) + processors[idx].mx.Unlock() continue } @@ -226,23 +229,6 @@ Outer: multiRef[walSeries.Ref] = mSeries.ref - idx := uint64(mSeries.ref) % uint64(n) - // It is possible that some old sample is being processed in processWALSamples that - // could cause race below. So we wait for the goroutine to empty input the buffer and finish - // processing all old samples after emptying the buffer. - select { - case <-outputs[idx]: // allow output side to drain to avoid deadlock - default: - } - inputs[idx] <- []record.RefSample{} - for len(inputs[idx]) != 0 { - time.Sleep(1 * time.Millisecond) - select { - case <-outputs[idx]: // allow output side to drain to avoid deadlock - default: - } - } - // Checking if the new m-mapped chunks overlap with the already existing ones. if len(mSeries.mmappedChunks) > 0 && len(mmc) > 0 { if overlapsClosedInterval( @@ -266,12 +252,9 @@ Outer: } // Replacing m-mapped chunks with the new ones (could be empty). - h.setMMappedChunks(mSeries, mmc) + h.resetSeriesWithMMappedChunks(mSeries, mmc) - // Any samples replayed till now would already be compacted. Resetting the head chunk. - mSeries.nextAt = 0 - mSeries.headChunk = nil - mSeries.app = nil + processors[idx].mx.Unlock() } //nolint:staticcheck // Ignore SA6002 relax staticcheck verification. seriesPool.Put(v) @@ -287,12 +270,7 @@ Outer: m = len(samples) } for i := 0; i < n; i++ { - var buf []record.RefSample - select { - case buf = <-outputs[i]: - default: - } - shards[i] = buf[:0] + shards[i] = processors[i].reuseBuf() } for _, sam := range samples[:m] { if r, ok := multiRef[sam.Ref]; ok { @@ -302,7 +280,7 @@ Outer: shards[mod] = append(shards[mod], sam) } for i := 0; i < n; i++ { - inputs[i] <- shards[i] + processors[i].input <- shards[i] } samples = samples[m:] } @@ -346,9 +324,7 @@ Outer: // Signal termination to each worker and wait for it to close its output channel. for i := 0; i < n; i++ { - close(inputs[i]) - for range outputs[i] { - } + processors[i].closeAndDrain() } close(exemplarsInput) wg.Wait() @@ -366,7 +342,8 @@ Outer: return nil } -func (h *Head) setMMappedChunks(mSeries *memSeries, mmc []*mmappedChunk) { +// resetSeriesWithMMappedChunks is only used during the WAL replay. +func (h *Head) resetSeriesWithMMappedChunks(mSeries *memSeries, mmc []*mmappedChunk) { h.metrics.chunksCreated.Add(float64(len(mmc))) h.metrics.chunksRemoved.Add(float64(len(mSeries.mmappedChunks))) h.metrics.chunks.Add(float64(len(mmc) - len(mSeries.mmappedChunks))) @@ -378,20 +355,51 @@ func (h *Head) setMMappedChunks(mSeries *memSeries, mmc []*mmappedChunk) { mSeries.mmMaxTime = mmc[len(mmc)-1].maxTime h.updateMinMaxTime(mmc[0].minTime, mSeries.mmMaxTime) } + + // Any samples replayed till now would already be compacted. Resetting the head chunk. + mSeries.nextAt = 0 + mSeries.headChunk = nil + mSeries.app = nil +} + +type walSubsetProcessor struct { + mx sync.Mutex // Take this lock while modifying series in the subset. + input chan []record.RefSample + output chan []record.RefSample +} + +func (wp *walSubsetProcessor) setup() { + wp.output = make(chan []record.RefSample, 300) + wp.input = make(chan []record.RefSample, 300) +} + +func (wp *walSubsetProcessor) closeAndDrain() { + close(wp.input) + for range wp.output { + } +} + +// If there is a buffer in the output chan, return it for reuse, otherwise return nil. +func (wp *walSubsetProcessor) reuseBuf() []record.RefSample { + select { + case buf := <-wp.output: + return buf[:0] + default: + } + return nil } // processWALSamples adds the samples it receives to the head and passes // the buffer received to an output channel for reuse. // Samples before the minValidTime timestamp are discarded. -func (h *Head) processWALSamples( - minValidTime int64, - input <-chan []record.RefSample, output chan<- []record.RefSample, -) (unknownRefs uint64) { - defer close(output) +func (wp *walSubsetProcessor) processWALSamples(h *Head) (unknownRefs uint64) { + defer close(wp.output) + minValidTime := h.minValidTime.Load() mint, maxt := int64(math.MaxInt64), int64(math.MinInt64) - for samples := range input { + for samples := range wp.input { + wp.mx.Lock() for _, s := range samples { if s.T < minValidTime { continue @@ -415,13 +423,29 @@ func (h *Head) processWALSamples( mint = s.T } } - output <- samples + wp.mx.Unlock() + wp.output <- samples } h.updateMinMaxTime(mint, maxt) return unknownRefs } +func (wp *walSubsetProcessor) waitUntilIdle() { + select { + case <-wp.output: // Allow output side to drain to avoid deadlock. + default: + } + wp.input <- []record.RefSample{} + for len(wp.input) != 0 { + time.Sleep(1 * time.Millisecond) + select { + case <-wp.output: // Allow output side to drain to avoid deadlock. + default: + } + } +} + const ( chunkSnapshotRecordTypeSeries uint8 = 1 chunkSnapshotRecordTypeTombstones uint8 = 2 diff --git a/tsdb/index/index.go b/tsdb/index/index.go index ee5244f37d..8427a95447 100644 --- a/tsdb/index/index.go +++ b/tsdb/index/index.go @@ -18,6 +18,7 @@ import ( "bytes" "context" "encoding/binary" + "fmt" "hash" "hash/crc32" "io" @@ -1853,7 +1854,13 @@ func (dec *Decoder) Postings(b []byte) (int, Postings, error) { d := encoding.Decbuf{B: b} n := d.Be32int() l := d.Get() - return n, newBigEndianPostings(l), d.Err() + if d.Err() != nil { + return 0, nil, d.Err() + } + if len(l) != 4*n { + return 0, nil, fmt.Errorf("unexpected postings length, should be %d bytes for %d postings, got %d bytes", 4*n, n, len(l)) + } + return n, newBigEndianPostings(l), nil } // LabelNamesOffsetsFor decodes the offsets of the name symbols for a given series. diff --git a/tsdb/index/index_test.go b/tsdb/index/index_test.go index eb5ae2053f..c1c66008e6 100644 --- a/tsdb/index/index_test.go +++ b/tsdb/index/index_test.go @@ -674,3 +674,8 @@ func BenchmarkReader_ShardedPostings(b *testing.B) { }) } } + +func TestDecoder_Postings_WrongInput(t *testing.T) { + _, _, err := (&Decoder{}).Postings([]byte("the cake is a lie")) + require.Error(t, err) +} diff --git a/web/api/v1/api.go b/web/api/v1/api.go index 39d07383c3..a8888a17b1 100644 --- a/web/api/v1/api.go +++ b/web/api/v1/api.go @@ -1155,15 +1155,15 @@ type RuleGroup struct { // In order to preserve rule ordering, while exposing type (alerting or recording) // specific properties, both alerting and recording rules are exposed in the // same array. - Rules []rule `json:"rules"` + Rules []Rule `json:"rules"` Interval float64 `json:"interval"` EvaluationTime float64 `json:"evaluationTime"` LastEvaluation time.Time `json:"lastEvaluation"` } -type rule interface{} +type Rule interface{} -type alertingRule struct { +type AlertingRule struct { // State can be "pending", "firing", "inactive". State string `json:"state"` Name string `json:"name"` @@ -1180,7 +1180,7 @@ type alertingRule struct { Type string `json:"type"` } -type recordingRule struct { +type RecordingRule struct { Name string `json:"name"` Query string `json:"query"` Labels labels.Labels `json:"labels,omitempty"` @@ -1209,12 +1209,12 @@ func (api *API) rules(r *http.Request) apiFuncResult { Name: grp.Name(), File: grp.File(), Interval: grp.Interval().Seconds(), - Rules: []rule{}, + Rules: []Rule{}, EvaluationTime: grp.GetEvaluationTime().Seconds(), LastEvaluation: grp.GetLastEvaluation(), } for _, r := range grp.Rules() { - var enrichedRule rule + var enrichedRule Rule lastError := "" if r.LastError() != nil { @@ -1225,7 +1225,7 @@ func (api *API) rules(r *http.Request) apiFuncResult { if !returnAlerts { break } - enrichedRule = alertingRule{ + enrichedRule = AlertingRule{ State: rule.State().String(), Name: rule.Name(), Query: rule.Query().String(), @@ -1243,7 +1243,7 @@ func (api *API) rules(r *http.Request) apiFuncResult { if !returnRecording { break } - enrichedRule = recordingRule{ + enrichedRule = RecordingRule{ Name: rule.Name(), Query: rule.Query().String(), Labels: rule.Labels(), diff --git a/web/api/v1/api_test.go b/web/api/v1/api_test.go index 5112201f44..be21a61baf 100644 --- a/web/api/v1/api_test.go +++ b/web/api/v1/api_test.go @@ -1472,8 +1472,8 @@ func testEndpoints(t *testing.T, api *API, tr *testTargetRetriever, es storage.E Name: "grp", File: "/path/to/file", Interval: 1, - Rules: []rule{ - alertingRule{ + Rules: []Rule{ + AlertingRule{ State: "inactive", Name: "test_metric3", Query: "absent(test_metric3) != 1", @@ -1484,7 +1484,7 @@ func testEndpoints(t *testing.T, api *API, tr *testTargetRetriever, es storage.E Health: "unknown", Type: "alerting", }, - alertingRule{ + AlertingRule{ State: "inactive", Name: "test_metric4", Query: "up == 1", @@ -1495,7 +1495,7 @@ func testEndpoints(t *testing.T, api *API, tr *testTargetRetriever, es storage.E Health: "unknown", Type: "alerting", }, - recordingRule{ + RecordingRule{ Name: "recording-rule-1", Query: "vector(1)", Labels: labels.Labels{}, @@ -1518,8 +1518,8 @@ func testEndpoints(t *testing.T, api *API, tr *testTargetRetriever, es storage.E Name: "grp", File: "/path/to/file", Interval: 1, - Rules: []rule{ - alertingRule{ + Rules: []Rule{ + AlertingRule{ State: "inactive", Name: "test_metric3", Query: "absent(test_metric3) != 1", @@ -1530,7 +1530,7 @@ func testEndpoints(t *testing.T, api *API, tr *testTargetRetriever, es storage.E Health: "unknown", Type: "alerting", }, - alertingRule{ + AlertingRule{ State: "inactive", Name: "test_metric4", Query: "up == 1", @@ -1557,8 +1557,8 @@ func testEndpoints(t *testing.T, api *API, tr *testTargetRetriever, es storage.E Name: "grp", File: "/path/to/file", Interval: 1, - Rules: []rule{ - recordingRule{ + Rules: []Rule{ + RecordingRule{ Name: "recording-rule-1", Query: "vector(1)", Labels: labels.Labels{}, diff --git a/web/ui/module/codemirror-promql/package.json b/web/ui/module/codemirror-promql/package.json index ee6ee543cf..e400a4df73 100644 --- a/web/ui/module/codemirror-promql/package.json +++ b/web/ui/module/codemirror-promql/package.json @@ -39,26 +39,26 @@ "@codemirror/highlight": "^0.19.6", "@codemirror/language": "^0.19.5", "@codemirror/lint": "^0.19.3", - "@codemirror/state": "^0.19.5", - "@codemirror/view": "^0.19.19", + "@codemirror/state": "^0.19.6", + "@codemirror/view": "^0.19.20", "@lezer/common": "^0.15.8", "@lezer/generator": "^0.15.2", "@types/chai": "^4.2.22", "@types/lru-cache": "^5.1.0", "@types/mocha": "^9.0.0", - "@types/node": "^16.11.7", + "@types/node": "^16.11.9", "@typescript-eslint/eslint-plugin": "^5.3.1", "@typescript-eslint/parser": "^5.3.1", "chai": "^4.2.0", "codecov": "^3.8.1", - "eslint": "^8.2.0", + "eslint": "^8.3.0", "eslint-config-prettier": "^8.3.0", "eslint-plugin-flowtype": "^8.0.3", "eslint-plugin-import": "^2.25.3", "eslint-plugin-prettier": "^4.0.0", "isomorphic-fetch": "^3.0.0", "mocha": "^8.4.0", - "nock": "^13.0.11", + "nock": "^13.2.1", "nyc": "^15.1.0", "prettier": "^2.4.1", "ts-loader": "^7.0.4", @@ -71,8 +71,8 @@ "@codemirror/highlight": "^0.19.6", "@codemirror/language": "^0.19.5", "@codemirror/lint": "^0.19.3", - "@codemirror/state": "^0.19.5", - "@codemirror/view": "^0.19.19", + "@codemirror/state": "^0.19.6", + "@codemirror/view": "^0.19.20", "@lezer/common": "^0.15.8" }, "prettier": { diff --git a/web/ui/package-lock.json b/web/ui/package-lock.json index 8905a70bad..a4f6408924 100644 --- a/web/ui/package-lock.json +++ b/web/ui/package-lock.json @@ -25,26 +25,26 @@ "@codemirror/highlight": "^0.19.6", "@codemirror/language": "^0.19.5", "@codemirror/lint": "^0.19.3", - "@codemirror/state": "^0.19.5", - "@codemirror/view": "^0.19.19", + "@codemirror/state": "^0.19.6", + "@codemirror/view": "^0.19.20", "@lezer/common": "^0.15.8", "@lezer/generator": "^0.15.2", "@types/chai": "^4.2.22", "@types/lru-cache": "^5.1.0", "@types/mocha": "^9.0.0", - "@types/node": "^16.11.7", + "@types/node": "^16.11.9", "@typescript-eslint/eslint-plugin": "^5.3.1", "@typescript-eslint/parser": "^5.3.1", "chai": "^4.2.0", "codecov": "^3.8.1", - "eslint": "^8.2.0", + "eslint": "^8.3.0", "eslint-config-prettier": "^8.3.0", "eslint-plugin-flowtype": "^8.0.3", "eslint-plugin-import": "^2.25.3", "eslint-plugin-prettier": "^4.0.0", "isomorphic-fetch": "^3.0.0", "mocha": "^8.4.0", - "nock": "^13.0.11", + "nock": "^13.2.1", "nyc": "^15.1.0", "prettier": "^2.4.1", "ts-loader": "^7.0.4", @@ -60,8 +60,8 @@ "@codemirror/highlight": "^0.19.6", "@codemirror/language": "^0.19.5", "@codemirror/lint": "^0.19.3", - "@codemirror/state": "^0.19.5", - "@codemirror/view": "^0.19.19", + "@codemirror/state": "^0.19.6", + "@codemirror/view": "^0.19.20", "@lezer/common": "^0.15.8" } }, @@ -159,26 +159,6 @@ "eslint": "*" } }, - "module/codemirror-promql/node_modules/@typescript-eslint/experimental-utils/node_modules/eslint-scope": { - "version": "5.1.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "module/codemirror-promql/node_modules/@typescript-eslint/experimental-utils/node_modules/estraverse": { - "version": "4.3.0", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, "module/codemirror-promql/node_modules/@typescript-eslint/parser": { "version": "5.4.0", "dev": true, @@ -276,9 +256,10 @@ } }, "module/codemirror-promql/node_modules/acorn": { - "version": "8.5.0", + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.6.0.tgz", + "integrity": "sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw==", "dev": true, - "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -323,9 +304,10 @@ } }, "module/codemirror-promql/node_modules/eslint": { - "version": "8.2.0", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.3.0.tgz", + "integrity": "sha512-aIay56Ph6RxOTC7xyr59Kt3ewX185SaGnAr8eWukoPLeriCrvGjvAubxuvaXOfsxhtwV5g0uBOsyhAom4qJdww==", "dev": true, - "license": "MIT", "dependencies": { "@eslint/eslintrc": "^1.0.4", "@humanwhocodes/config-array": "^0.6.0", @@ -336,10 +318,10 @@ "doctrine": "^3.0.0", "enquirer": "^2.3.5", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^6.0.0", + "eslint-scope": "^7.1.0", "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.0.0", - "espree": "^9.0.0", + "eslint-visitor-keys": "^3.1.0", + "espree": "^9.1.0", "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -393,18 +375,6 @@ "eslint": "^8.1.0" } }, - "module/codemirror-promql/node_modules/eslint-scope": { - "version": "6.0.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, "module/codemirror-promql/node_modules/eslint-visitor-keys": { "version": "3.1.0", "dev": true, @@ -413,14 +383,28 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "module/codemirror-promql/node_modules/espree": { - "version": "9.0.0", + "module/codemirror-promql/node_modules/eslint/node_modules/eslint-scope": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz", + "integrity": "sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.5.0", + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "module/codemirror-promql/node_modules/espree": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.1.0.tgz", + "integrity": "sha512-ZgYLvCS1wxOczBYGcQT9DDWgicXwJ4dbocr9uYN+/eresBAUuBu+O4WzB21ufQ/JqQT8gyp7hJ3z8SHii32mTQ==", + "dev": true, + "dependencies": { + "acorn": "^8.6.0", "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^3.0.0" + "eslint-visitor-keys": "^3.1.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -428,8 +412,9 @@ }, "module/codemirror-promql/node_modules/estraverse": { "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -1324,20 +1309,22 @@ } }, "node_modules/@codemirror/search": { - "version": "0.19.2", - "license": "MIT", + "version": "0.19.3", + "resolved": "https://registry.npmjs.org/@codemirror/search/-/search-0.19.3.tgz", + "integrity": "sha512-T8AcSGNYuYtmOUXzI0VtCa9SMA0C90/Zk7fxnabgy0dpViwokucCMY2+aBZMPncIatkgojzbiRn7d5Qo1Ugx9w==", "dependencies": { "@codemirror/panel": "^0.19.0", "@codemirror/rangeset": "^0.19.0", - "@codemirror/state": "^0.19.2", + "@codemirror/state": "^0.19.3", "@codemirror/text": "^0.19.0", "@codemirror/view": "^0.19.0", "crelt": "^1.0.5" } }, "node_modules/@codemirror/state": { - "version": "0.19.5", - "license": "MIT", + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-0.19.6.tgz", + "integrity": "sha512-sqIQZE9VqwQj7D4c2oz9mfLhlT1ElAzGB5lO1lE33BPyrdNy1cJyCIOecT4cn4VeJOFrnjOeu+IftZ3zqdFETw==", "dependencies": { "@codemirror/text": "^0.19.0" } @@ -1356,8 +1343,9 @@ } }, "node_modules/@codemirror/view": { - "version": "0.19.19", - "license": "MIT", + "version": "0.19.20", + "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-0.19.20.tgz", + "integrity": "sha512-j4cI/Egdhha77pMfKQQWZmpkcF7vhe21LqdZs8hsG09OtvsPVCHUXmfB0u7nMpcX1JR8aZ3ob9g6FMr+OVtjgA==", "dependencies": { "@codemirror/rangeset": "^0.19.0", "@codemirror/state": "^0.19.3", @@ -1406,6 +1394,39 @@ "node": "^10.12.0 || >=12.0.0" } }, + "node_modules/@fortawesome/fontawesome-common-types": { + "version": "0.2.36", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.36.tgz", + "integrity": "sha512-a/7BiSgobHAgBWeN7N0w+lAhInrGxksn13uK7231n2m8EDPE3BMCl9NZLTGrj9ZXfCmC6LM0QLqXidIizVQ6yg==", + "hasInstallScript": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/fontawesome-svg-core": { + "version": "1.2.36", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.36.tgz", + "integrity": "sha512-YUcsLQKYb6DmaJjIHdDWpBIGCcyE/W+p/LMGvjQem55Mm2XWVAP5kWTMKWLv9lwpCVjpLxPyOMOyUocP1GxrtA==", + "hasInstallScript": true, + "dependencies": { + "@fortawesome/fontawesome-common-types": "^0.2.36" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/react-fontawesome": { + "version": "0.1.16", + "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.16.tgz", + "integrity": "sha512-aLmzDwC9rEOAJv2UJdMns89VZR5Ry4IHu5dQQh24Z/lWKEm44lfQr1UNalZlkUaQN8d155tNh+CS7ntntj1VMA==", + "dependencies": { + "prop-types": "^15.7.2" + }, + "peerDependencies": { + "@fortawesome/fontawesome-svg-core": "~1 || >=1.3.0-beta1", + "react": ">=16.x" + } + }, "node_modules/@humanwhocodes/config-array": { "version": "0.5.0", "dev": true, @@ -1606,6 +1627,23 @@ "@sinonjs/commons": "^1.7.0" } }, + "node_modules/@sinonjs/samsam": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.0.2.tgz", + "integrity": "sha512-jxPRPp9n93ci7b8hMfJOFDPRLFYadN6FSpeROFTR4UNF4i5b+EK6m4QXPO46BDhFgRy1JuS87zAnFOzCUwMJcQ==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.6.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" + } + }, + "node_modules/@sinonjs/text-encoding": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", + "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", + "dev": true + }, "node_modules/@tootallnate/once": { "version": "1.1.2", "dev": true, @@ -1698,9 +1736,9 @@ } }, "node_modules/@types/jest": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.0.2.tgz", - "integrity": "sha512-4dRxkS/AFX0c5XW6IPMNOydLn2tEhNhJV7DnYK+0bjoJZ+QTmfucBlihX7aoEsh/ocYtkLC73UbnBXBXIxsULA==", + "version": "27.0.3", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.0.3.tgz", + "integrity": "sha512-cmmwv9t7gBYt7hNKH5Spu7Kuu/DotGa+Ff+JGRKZ4db5eh8PnKS4LuebJ3YLUoyOyIHraTGyULn23YtEAm0VSg==", "dev": true, "dependencies": { "jest-diff": "^27.0.0", @@ -1708,9 +1746,10 @@ } }, "node_modules/@types/jquery": { - "version": "3.5.8", + "version": "3.5.9", + "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.9.tgz", + "integrity": "sha512-B8pDk+sH/tSv/HKdx6EQER6BfUOb2GtKs0LOmozziS4h7cbe8u/eYySfUAeTwD+J09SqV3man7AMWIA5mgzCBA==", "dev": true, - "license": "MIT", "dependencies": { "@types/sizzle": "*" } @@ -1736,9 +1775,10 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "16.11.7", - "dev": true, - "license": "MIT" + "version": "16.11.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.9.tgz", + "integrity": "sha512-MKmdASMf3LtPzwLyRrFjtFFZ48cMf8jmX5VRYrDQiJa8Ybu5VAmkqBWqKU8fdCwD8ysw4mQ9nrEHvzg6gunR7A==", + "dev": true }, "node_modules/@types/prop-types": { "version": "15.7.4", @@ -1746,9 +1786,10 @@ "license": "MIT" }, "node_modules/@types/react": { - "version": "17.0.35", + "version": "17.0.36", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.36.tgz", + "integrity": "sha512-CUFUp01OdfbpN/76v4koqgcpcRGT3sYOq3U3N6q0ZVGcyeP40NUdVU+EWe3hs34RNaTefiYyBzOpxBBidCc5zw==", "dev": true, - "license": "MIT", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -2421,6 +2462,19 @@ "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", "dev": true }, + "node_modules/bootstrap": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.6.1.tgz", + "integrity": "sha512-0dj+VgI9Ecom+rvvpNZ4MUZJz8dcX7WCX+eTID9+/8HgOkv3dsRzi8BGeZJCQU6flWQVYxwTQnEZFrmJSEO7og==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + }, + "peerDependencies": { + "jquery": "1.9.1 - 3", + "popper.js": "^1.16.1" + } + }, "node_modules/brace-expansion": { "version": "1.1.11", "dev": true, @@ -4543,6 +4597,11 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/jquery": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz", + "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==" + }, "node_modules/js-tokens": { "version": "4.0.0", "license": "MIT" @@ -4604,6 +4663,12 @@ "node": ">=6" } }, + "node_modules/just-extend": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", + "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", + "dev": true + }, "node_modules/levn": { "version": "0.4.1", "dev": true, @@ -4677,6 +4742,12 @@ "dev": true, "license": "MIT" }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "dev": true + }, "node_modules/lodash.isequal": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", @@ -5072,10 +5143,24 @@ "url": "https://nearley.js.org/#give-to-nearley" } }, - "node_modules/nock": { - "version": "13.1.3", + "node_modules/nise": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.0.tgz", + "integrity": "sha512-W5WlHu+wvo3PaKLsJJkgPup2LrsXCcm7AWwyNZkUnn5rwPkuPBi3Iwk5SQtN0mv+K65k7nKKjwNQ30wg3wLAQQ==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.7.0", + "@sinonjs/fake-timers": "^7.0.4", + "@sinonjs/text-encoding": "^0.7.1", + "just-extend": "^4.0.2", + "path-to-regexp": "^1.7.0" + } + }, + "node_modules/nock": { + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/nock/-/nock-13.2.1.tgz", + "integrity": "sha512-CoHAabbqq/xZEknubuyQMjq6Lfi5b7RtK6SoNK6m40lebGp3yiMagWtIoYaw2s9sISD7wPuCfwFpivVHX/35RA==", "dev": true, - "license": "MIT", "dependencies": { "debug": "^4.1.0", "json-stringify-safe": "^5.0.1", @@ -5561,6 +5646,19 @@ "dev": true, "license": "MIT" }, + "node_modules/path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/path-to-regexp/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, "node_modules/path-type": { "version": "4.0.0", "dev": true, @@ -5609,6 +5707,16 @@ "node": ">=4" } }, + "node_modules/popper.js": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", + "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==", + "deprecated": "You can find the new Popper v2 at @popperjs/core, this package is dedicated to the legacy v1", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, "node_modules/postcss": { "version": "8.3.11", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.11.tgz", @@ -6136,6 +6244,33 @@ "dev": true, "license": "ISC" }, + "node_modules/sinon": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-12.0.1.tgz", + "integrity": "sha512-iGu29Xhym33ydkAT+aNQFBINakjq69kKO6ByPvTsm3yyIACfyQttRTP03aBP/I8GfhFmLzrnKwNNkr0ORb1udg==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.8.3", + "@sinonjs/fake-timers": "^8.1.0", + "@sinonjs/samsam": "^6.0.2", + "diff": "^5.0.0", + "nise": "^5.1.0", + "supports-color": "^7.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/sinon" + } + }, + "node_modules/sinon/node_modules/@sinonjs/fake-timers": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", + "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, "node_modules/slash": { "version": "3.0.0", "dev": true, @@ -7081,15 +7216,15 @@ "@codemirror/language": "^0.19.5", "@codemirror/lint": "^0.19.3", "@codemirror/matchbrackets": "^0.19.3", - "@codemirror/search": "^0.19.2", - "@codemirror/state": "^0.19.5", - "@codemirror/view": "^0.19.19", + "@codemirror/search": "^0.19.3", + "@codemirror/state": "^0.19.6", + "@codemirror/view": "^0.19.20", "@forevolve/bootstrap-dark": "^1.0.0", "@fortawesome/fontawesome-svg-core": "^1.2.14", "@fortawesome/free-solid-svg-icons": "^5.7.1", - "@fortawesome/react-fontawesome": "^0.1.4", + "@fortawesome/react-fontawesome": "^0.1.16", "@nexucis/fuzzy": "^0.3.0", - "bootstrap": "^5.1.3", + "bootstrap": "^4.6.1", "codemirror-promql": "0.18.0", "css.escape": "^1.5.1", "downshift": "^6.1.7", @@ -7115,10 +7250,10 @@ "@testing-library/react-hooks": "^7.0.1", "@types/enzyme": "^3.10.10", "@types/flot": "0.0.32", - "@types/jest": "^27.0.2", - "@types/jquery": "^3.5.8", - "@types/node": "^16.11.7", - "@types/react": "^17.0.35", + "@types/jest": "^27.0.3", + "@types/jquery": "^3.5.9", + "@types/node": "^16.11.9", + "@types/react": "^17.0.36", "@types/react-copy-to-clipboard": "^5.0.2", "@types/react-dom": "^17.0.11", "@types/react-resize-detector": "^6.1.0", @@ -7136,7 +7271,7 @@ "mutationobserver-shim": "^0.3.7", "prettier": "^2.4.1", "react-scripts": "4.0.3", - "sinon": "^11.1.2", + "sinon": "^12.0.1", "typescript": "^4.5.2" }, "optionalDependencies": { @@ -8523,25 +8658,6 @@ "popper.js": "^1.16.1" } }, - "react-app/node_modules/@fortawesome/fontawesome-common-types": { - "version": "0.2.36", - "hasInstallScript": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "react-app/node_modules/@fortawesome/fontawesome-svg-core": { - "version": "1.2.36", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "@fortawesome/fontawesome-common-types": "^0.2.36" - }, - "engines": { - "node": ">=6" - } - }, "react-app/node_modules/@fortawesome/free-solid-svg-icons": { "version": "5.15.4", "hasInstallScript": true, @@ -8553,17 +8669,6 @@ "node": ">=6" } }, - "react-app/node_modules/@fortawesome/react-fontawesome": { - "version": "0.1.15", - "license": "MIT", - "dependencies": { - "prop-types": "^15.7.2" - }, - "peerDependencies": { - "@fortawesome/fontawesome-svg-core": "^1.2.32", - "react": ">=16.x" - } - }, "react-app/node_modules/@gar/promisify": { "version": "1.1.2", "dev": true, @@ -9941,21 +10046,6 @@ "dev": true, "license": "MIT" }, - "react-app/node_modules/@sinonjs/samsam": { - "version": "6.0.2", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@sinonjs/commons": "^1.6.0", - "lodash.get": "^4.4.2", - "type-detect": "^4.0.8" - } - }, - "react-app/node_modules/@sinonjs/text-encoding": { - "version": "0.7.1", - "dev": true, - "license": "(Unlicense OR Apache-2.0)" - }, "react-app/node_modules/@surma/rollup-plugin-off-main-thread": { "version": "1.4.2", "dev": true, @@ -11652,18 +11742,6 @@ "multicast-dns-service-types": "^1.1.0" } }, - "react-app/node_modules/bootstrap": { - "version": "4.6.0", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/bootstrap" - }, - "peerDependencies": { - "jquery": "1.9.1 - 3", - "popper.js": "^1.16.1" - } - }, "react-app/node_modules/brorand": { "version": "1.1.0", "dev": true, @@ -11801,11 +11879,6 @@ "dev": true, "license": "MIT" }, - "react-app/node_modules/buffer/node_modules/isarray": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, "react-app/node_modules/builtin-modules": { "version": "3.2.0", "dev": true, @@ -15870,10 +15943,6 @@ "node": ">=8" } }, - "react-app/node_modules/isarray": { - "version": "0.0.1", - "license": "MIT" - }, "react-app/node_modules/isobject": { "version": "3.0.1", "dev": true, @@ -19187,10 +19256,6 @@ "node": ">=8" } }, - "react-app/node_modules/jquery": { - "version": "3.6.0", - "license": "MIT" - }, "react-app/node_modules/jquery.flot.tooltip": { "version": "0.9.0", "license": "MIT" @@ -19284,11 +19349,6 @@ "node": ">=4.0" } }, - "react-app/node_modules/just-extend": { - "version": "4.2.1", - "dev": true, - "license": "MIT" - }, "react-app/node_modules/killable": { "version": "1.0.1", "dev": true, @@ -19379,11 +19439,6 @@ "dev": true, "license": "MIT" }, - "react-app/node_modules/lodash.get": { - "version": "4.4.2", - "dev": true, - "license": "MIT" - }, "react-app/node_modules/lodash.memoize": { "version": "4.1.2", "dev": true, @@ -19886,18 +19941,6 @@ "dev": true, "license": "MIT" }, - "react-app/node_modules/nise": { - "version": "5.1.0", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@sinonjs/commons": "^1.7.0", - "@sinonjs/fake-timers": "^7.0.4", - "@sinonjs/text-encoding": "^0.7.1", - "just-extend": "^4.0.2", - "path-to-regexp": "^1.7.0" - } - }, "react-app/node_modules/no-case": { "version": "3.0.4", "dev": true, @@ -20378,13 +20421,6 @@ "dev": true, "license": "(WTFPL OR MIT)" }, - "react-app/node_modules/path-to-regexp": { - "version": "1.8.0", - "license": "MIT", - "dependencies": { - "isarray": "0.0.1" - } - }, "react-app/node_modules/pbkdf2": { "version": "3.1.2", "dev": true, @@ -20449,14 +20485,6 @@ "node": ">=6" } }, - "react-app/node_modules/popper.js": { - "version": "1.16.1", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, "react-app/node_modules/portfinder": { "version": "1.0.28", "dev": true, @@ -23425,42 +23453,6 @@ "dev": true, "license": "MIT" }, - "react-app/node_modules/sinon": { - "version": "11.1.2", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@sinonjs/commons": "^1.8.3", - "@sinonjs/fake-timers": "^7.1.2", - "@sinonjs/samsam": "^6.0.2", - "diff": "^5.0.0", - "nise": "^5.1.0", - "supports-color": "^7.2.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/sinon" - } - }, - "react-app/node_modules/sinon/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "react-app/node_modules/sinon/node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "react-app/node_modules/sisteransi": { "version": "1.0.5", "dev": true, @@ -24925,11 +24917,6 @@ "node": ">=0.10.0" } }, - "react-app/node_modules/unset-value/node_modules/isarray": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, "react-app/node_modules/upath": { "version": "1.2.0", "dev": true, @@ -27456,18 +27443,22 @@ } }, "@codemirror/search": { - "version": "0.19.2", + "version": "0.19.3", + "resolved": "https://registry.npmjs.org/@codemirror/search/-/search-0.19.3.tgz", + "integrity": "sha512-T8AcSGNYuYtmOUXzI0VtCa9SMA0C90/Zk7fxnabgy0dpViwokucCMY2+aBZMPncIatkgojzbiRn7d5Qo1Ugx9w==", "requires": { "@codemirror/panel": "^0.19.0", "@codemirror/rangeset": "^0.19.0", - "@codemirror/state": "^0.19.2", + "@codemirror/state": "^0.19.3", "@codemirror/text": "^0.19.0", "@codemirror/view": "^0.19.0", "crelt": "^1.0.5" } }, "@codemirror/state": { - "version": "0.19.5", + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-0.19.6.tgz", + "integrity": "sha512-sqIQZE9VqwQj7D4c2oz9mfLhlT1ElAzGB5lO1lE33BPyrdNy1cJyCIOecT4cn4VeJOFrnjOeu+IftZ3zqdFETw==", "requires": { "@codemirror/text": "^0.19.0" } @@ -27485,7 +27476,9 @@ } }, "@codemirror/view": { - "version": "0.19.19", + "version": "0.19.20", + "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-0.19.20.tgz", + "integrity": "sha512-j4cI/Egdhha77pMfKQQWZmpkcF7vhe21LqdZs8hsG09OtvsPVCHUXmfB0u7nMpcX1JR8aZ3ob9g6FMr+OVtjgA==", "requires": { "@codemirror/rangeset": "^0.19.0", "@codemirror/state": "^0.19.3", @@ -27524,6 +27517,27 @@ "strip-json-comments": "^3.1.1" } }, + "@fortawesome/fontawesome-common-types": { + "version": "0.2.36", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.36.tgz", + "integrity": "sha512-a/7BiSgobHAgBWeN7N0w+lAhInrGxksn13uK7231n2m8EDPE3BMCl9NZLTGrj9ZXfCmC6LM0QLqXidIizVQ6yg==" + }, + "@fortawesome/fontawesome-svg-core": { + "version": "1.2.36", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.36.tgz", + "integrity": "sha512-YUcsLQKYb6DmaJjIHdDWpBIGCcyE/W+p/LMGvjQem55Mm2XWVAP5kWTMKWLv9lwpCVjpLxPyOMOyUocP1GxrtA==", + "requires": { + "@fortawesome/fontawesome-common-types": "^0.2.36" + } + }, + "@fortawesome/react-fontawesome": { + "version": "0.1.16", + "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.16.tgz", + "integrity": "sha512-aLmzDwC9rEOAJv2UJdMns89VZR5Ry4IHu5dQQh24Z/lWKEm44lfQr1UNalZlkUaQN8d155tNh+CS7ntntj1VMA==", + "requires": { + "prop-types": "^15.7.2" + } + }, "@humanwhocodes/config-array": { "version": "0.5.0", "dev": true, @@ -27659,6 +27673,23 @@ "@sinonjs/commons": "^1.7.0" } }, + "@sinonjs/samsam": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.0.2.tgz", + "integrity": "sha512-jxPRPp9n93ci7b8hMfJOFDPRLFYadN6FSpeROFTR4UNF4i5b+EK6m4QXPO46BDhFgRy1JuS87zAnFOzCUwMJcQ==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.6.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" + } + }, + "@sinonjs/text-encoding": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", + "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", + "dev": true + }, "@tootallnate/once": { "version": "1.1.2", "dev": true @@ -27742,9 +27773,9 @@ } }, "@types/jest": { - "version": "27.0.2", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.0.2.tgz", - "integrity": "sha512-4dRxkS/AFX0c5XW6IPMNOydLn2tEhNhJV7DnYK+0bjoJZ+QTmfucBlihX7aoEsh/ocYtkLC73UbnBXBXIxsULA==", + "version": "27.0.3", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.0.3.tgz", + "integrity": "sha512-cmmwv9t7gBYt7hNKH5Spu7Kuu/DotGa+Ff+JGRKZ4db5eh8PnKS4LuebJ3YLUoyOyIHraTGyULn23YtEAm0VSg==", "dev": true, "requires": { "jest-diff": "^27.0.0", @@ -27752,7 +27783,9 @@ } }, "@types/jquery": { - "version": "3.5.8", + "version": "3.5.9", + "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.9.tgz", + "integrity": "sha512-B8pDk+sH/tSv/HKdx6EQER6BfUOb2GtKs0LOmozziS4h7cbe8u/eYySfUAeTwD+J09SqV3man7AMWIA5mgzCBA==", "dev": true, "requires": { "@types/sizzle": "*" @@ -27775,7 +27808,9 @@ "dev": true }, "@types/node": { - "version": "16.11.7", + "version": "16.11.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.9.tgz", + "integrity": "sha512-MKmdASMf3LtPzwLyRrFjtFFZ48cMf8jmX5VRYrDQiJa8Ybu5VAmkqBWqKU8fdCwD8ysw4mQ9nrEHvzg6gunR7A==", "dev": true }, "@types/prop-types": { @@ -27783,7 +27818,9 @@ "dev": true }, "@types/react": { - "version": "17.0.35", + "version": "17.0.36", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.36.tgz", + "integrity": "sha512-CUFUp01OdfbpN/76v4koqgcpcRGT3sYOq3U3N6q0ZVGcyeP40NUdVU+EWe3hs34RNaTefiYyBzOpxBBidCc5zw==", "dev": true, "requires": { "@types/prop-types": "*", @@ -28196,6 +28233,12 @@ "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", "dev": true }, + "bootstrap": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.6.1.tgz", + "integrity": "sha512-0dj+VgI9Ecom+rvvpNZ4MUZJz8dcX7WCX+eTID9+/8HgOkv3dsRzi8BGeZJCQU6flWQVYxwTQnEZFrmJSEO7og==", + "requires": {} + }, "brace-expansion": { "version": "1.1.11", "dev": true, @@ -28363,19 +28406,19 @@ "@codemirror/highlight": "^0.19.6", "@codemirror/language": "^0.19.5", "@codemirror/lint": "^0.19.3", - "@codemirror/state": "^0.19.5", - "@codemirror/view": "^0.19.19", + "@codemirror/state": "^0.19.6", + "@codemirror/view": "^0.19.20", "@lezer/common": "^0.15.8", "@lezer/generator": "^0.15.2", "@types/chai": "^4.2.22", "@types/lru-cache": "^5.1.0", "@types/mocha": "^9.0.0", - "@types/node": "^16.11.7", + "@types/node": "^16.11.9", "@typescript-eslint/eslint-plugin": "^5.3.1", "@typescript-eslint/parser": "^5.3.1", "chai": "^4.2.0", "codecov": "^3.8.1", - "eslint": "^8.2.0", + "eslint": "^8.3.0", "eslint-config-prettier": "^8.3.0", "eslint-plugin-flowtype": "^8.0.3", "eslint-plugin-import": "^2.25.3", @@ -28383,7 +28426,7 @@ "isomorphic-fetch": "^3.0.0", "lru-cache": "^6.0.0", "mocha": "^8.4.0", - "nock": "^13.0.11", + "nock": "^13.2.1", "nyc": "^15.1.0", "prettier": "^2.4.1", "ts-loader": "^7.0.4", @@ -28446,20 +28489,6 @@ "@typescript-eslint/typescript-estree": "5.4.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" - }, - "dependencies": { - "eslint-scope": { - "version": "5.1.1", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "estraverse": { - "version": "4.3.0", - "dev": true - } } }, "@typescript-eslint/parser": { @@ -28506,7 +28535,9 @@ } }, "acorn": { - "version": "8.5.0", + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.6.0.tgz", + "integrity": "sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw==", "dev": true }, "argparse": { @@ -28537,7 +28568,9 @@ } }, "eslint": { - "version": "8.2.0", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.3.0.tgz", + "integrity": "sha512-aIay56Ph6RxOTC7xyr59Kt3ewX185SaGnAr8eWukoPLeriCrvGjvAubxuvaXOfsxhtwV5g0uBOsyhAom4qJdww==", "dev": true, "requires": { "@eslint/eslintrc": "^1.0.4", @@ -28549,10 +28582,10 @@ "doctrine": "^3.0.0", "enquirer": "^2.3.5", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^6.0.0", + "eslint-scope": "^7.1.0", "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.0.0", - "espree": "^9.0.0", + "eslint-visitor-keys": "^3.1.0", + "espree": "^9.1.0", "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -28578,6 +28611,18 @@ "strip-json-comments": "^3.1.0", "text-table": "^0.2.0", "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "eslint-scope": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz", + "integrity": "sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + } } }, "eslint-plugin-flowtype": { @@ -28588,29 +28633,25 @@ "string-natural-compare": "^3.0.1" } }, - "eslint-scope": { - "version": "6.0.0", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, "eslint-visitor-keys": { "version": "3.1.0", "dev": true }, "espree": { - "version": "9.0.0", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.1.0.tgz", + "integrity": "sha512-ZgYLvCS1wxOczBYGcQT9DDWgicXwJ4dbocr9uYN+/eresBAUuBu+O4WzB21ufQ/JqQT8gyp7hJ3z8SHii32mTQ==", "dev": true, "requires": { - "acorn": "^8.5.0", + "acorn": "^8.6.0", "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^3.0.0" + "eslint-visitor-keys": "^3.1.0" } }, "estraverse": { "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true }, "find-up": { @@ -29591,21 +29632,21 @@ "@codemirror/language": "^0.19.5", "@codemirror/lint": "^0.19.3", "@codemirror/matchbrackets": "^0.19.3", - "@codemirror/search": "^0.19.2", - "@codemirror/state": "^0.19.5", - "@codemirror/view": "^0.19.19", + "@codemirror/search": "^0.19.3", + "@codemirror/state": "^0.19.6", + "@codemirror/view": "^0.19.20", "@forevolve/bootstrap-dark": "^1.0.0", "@fortawesome/fontawesome-svg-core": "^1.2.14", "@fortawesome/free-solid-svg-icons": "^5.7.1", - "@fortawesome/react-fontawesome": "^0.1.4", + "@fortawesome/react-fontawesome": "^0.1.16", "@nexucis/fuzzy": "^0.3.0", "@testing-library/react-hooks": "^7.0.1", "@types/enzyme": "^3.10.10", "@types/flot": "0.0.32", - "@types/jest": "^27.0.2", - "@types/jquery": "^3.5.8", - "@types/node": "^16.11.7", - "@types/react": "^17.0.35", + "@types/jest": "^27.0.3", + "@types/jquery": "^3.5.9", + "@types/node": "^16.11.9", + "@types/react": "^17.0.36", "@types/react-copy-to-clipboard": "^5.0.2", "@types/react-dom": "^17.0.11", "@types/react-resize-detector": "^6.1.0", @@ -29613,7 +29654,7 @@ "@types/sanitize-html": "^2.5.0", "@types/sinon": "^10.0.6", "@wojtekmaj/enzyme-adapter-react-17": "^0.6.5", - "bootstrap": "^5.1.3", + "bootstrap": "^4.6.1", "codemirror-promql": "0.18.0", "css.escape": "^1.5.1", "downshift": "^6.1.7", @@ -29643,7 +29684,7 @@ "reactstrap": "^8.9.0", "sanitize-html": "^2.5.3", "sass": "1.43.4", - "sinon": "^11.1.2", + "sinon": "^12.0.1", "tempusdominus-bootstrap-4": "^5.1.2", "tempusdominus-core": "^5.0.3", "typescript": "^4.5.2" @@ -30471,27 +30512,12 @@ "popper.js": "^1.16.1" } }, - "@fortawesome/fontawesome-common-types": { - "version": "0.2.36" - }, - "@fortawesome/fontawesome-svg-core": { - "version": "1.2.36", - "requires": { - "@fortawesome/fontawesome-common-types": "^0.2.36" - } - }, "@fortawesome/free-solid-svg-icons": { "version": "5.15.4", "requires": { "@fortawesome/fontawesome-common-types": "^0.2.36" } }, - "@fortawesome/react-fontawesome": { - "version": "0.1.15", - "requires": { - "prop-types": "^15.7.2" - } - }, "@gar/promisify": { "version": "1.1.2", "dev": true @@ -31405,19 +31431,6 @@ } } }, - "@sinonjs/samsam": { - "version": "6.0.2", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.6.0", - "lodash.get": "^4.4.2", - "type-detect": "^4.0.8" - } - }, - "@sinonjs/text-encoding": { - "version": "0.7.1", - "dev": true - }, "@surma/rollup-plugin-off-main-thread": { "version": "1.4.2", "dev": true, @@ -32618,10 +32631,6 @@ "multicast-dns-service-types": "^1.1.0" } }, - "bootstrap": { - "version": "4.6.0", - "requires": {} - }, "brorand": { "version": "1.1.0", "dev": true @@ -32720,12 +32729,6 @@ "base64-js": "^1.0.2", "ieee754": "^1.1.4", "isarray": "^1.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "dev": true - } } }, "buffer-indexof": { @@ -35506,9 +35509,6 @@ "is-docker": "^2.0.0" } }, - "isarray": { - "version": "0.0.1" - }, "isobject": { "version": "3.0.1", "dev": true @@ -37702,9 +37702,6 @@ } } }, - "jquery": { - "version": "3.6.0" - }, "jquery.flot.tooltip": { "version": "0.9.0" }, @@ -37771,10 +37768,6 @@ "object.assign": "^4.1.2" } }, - "just-extend": { - "version": "4.2.1", - "dev": true - }, "killable": { "version": "1.0.1", "dev": true @@ -37835,10 +37828,6 @@ "version": "3.0.0", "dev": true }, - "lodash.get": { - "version": "4.4.2", - "dev": true - }, "lodash.memoize": { "version": "4.1.2", "dev": true @@ -38192,17 +38181,6 @@ "version": "1.0.5", "dev": true }, - "nise": { - "version": "5.1.0", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.7.0", - "@sinonjs/fake-timers": "^7.0.4", - "@sinonjs/text-encoding": "^0.7.1", - "just-extend": "^4.0.2", - "path-to-regexp": "^1.7.0" - } - }, "no-case": { "version": "3.0.4", "dev": true, @@ -38535,12 +38513,6 @@ "version": "1.0.2", "dev": true }, - "path-to-regexp": { - "version": "1.8.0", - "requires": { - "isarray": "0.0.1" - } - }, "pbkdf2": { "version": "3.1.2", "dev": true, @@ -38581,9 +38553,6 @@ "ts-pnp": "^1.1.6" } }, - "popper.js": { - "version": "1.16.1" - }, "portfinder": { "version": "1.0.28", "dev": true, @@ -40720,31 +40689,6 @@ } } }, - "sinon": { - "version": "11.1.2", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.8.3", - "@sinonjs/fake-timers": "^7.1.2", - "@sinonjs/samsam": "^6.0.2", - "diff": "^5.0.0", - "nise": "^5.1.0", - "supports-color": "^7.2.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, "sisteransi": { "version": "1.0.5", "dev": true @@ -41747,10 +41691,6 @@ "has-values": { "version": "0.1.4", "dev": true - }, - "isarray": { - "version": "1.0.0", - "dev": true } } }, @@ -43595,6 +43535,11 @@ "integrity": "sha512-+Ilqi8hgHSAdhlQ3s12CAVNd8H96ZkQBfYoXmArzZnOfAtVAJEiPDBirjByEblvG/4LPJmkL+nBqPO3A1YJAEg==", "dev": true }, + "jquery": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz", + "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==" + }, "js-tokens": { "version": "4.0.0" }, @@ -43633,6 +43578,12 @@ "minimist": "^1.2.5" } }, + "just-extend": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", + "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", + "dev": true + }, "levn": { "version": "0.4.1", "dev": true, @@ -43688,6 +43639,12 @@ "version": "4.4.0", "dev": true }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "dev": true + }, "lodash.isequal": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", @@ -43948,8 +43905,23 @@ "randexp": "0.4.6" } }, + "nise": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.0.tgz", + "integrity": "sha512-W5WlHu+wvo3PaKLsJJkgPup2LrsXCcm7AWwyNZkUnn5rwPkuPBi3Iwk5SQtN0mv+K65k7nKKjwNQ30wg3wLAQQ==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0", + "@sinonjs/fake-timers": "^7.0.4", + "@sinonjs/text-encoding": "^0.7.1", + "just-extend": "^4.0.2", + "path-to-regexp": "^1.7.0" + } + }, "nock": { - "version": "13.1.3", + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/nock/-/nock-13.2.1.tgz", + "integrity": "sha512-CoHAabbqq/xZEknubuyQMjq6Lfi5b7RtK6SoNK6m40lebGp3yiMagWtIoYaw2s9sISD7wPuCfwFpivVHX/35RA==", "dev": true, "requires": { "debug": "^4.1.0", @@ -44281,6 +44253,21 @@ "version": "1.0.7", "dev": true }, + "path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "requires": { + "isarray": "0.0.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + } + } + }, "path-type": { "version": "4.0.0", "dev": true @@ -44310,6 +44297,11 @@ "find-up": "^2.1.0" } }, + "popper.js": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", + "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==" + }, "postcss": { "version": "8.3.11", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.11.tgz", @@ -44651,6 +44643,31 @@ "version": "3.0.3", "dev": true }, + "sinon": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-12.0.1.tgz", + "integrity": "sha512-iGu29Xhym33ydkAT+aNQFBINakjq69kKO6ByPvTsm3yyIACfyQttRTP03aBP/I8GfhFmLzrnKwNNkr0ORb1udg==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.8.3", + "@sinonjs/fake-timers": "^8.1.0", + "@sinonjs/samsam": "^6.0.2", + "diff": "^5.0.0", + "nise": "^5.1.0", + "supports-color": "^7.2.0" + }, + "dependencies": { + "@sinonjs/fake-timers": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", + "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + } + } + } + }, "slash": { "version": "3.0.0", "dev": true diff --git a/web/ui/react-app/package.json b/web/ui/react-app/package.json index 794e340b2f..0a7254be62 100644 --- a/web/ui/react-app/package.json +++ b/web/ui/react-app/package.json @@ -12,15 +12,15 @@ "@codemirror/language": "^0.19.5", "@codemirror/lint": "^0.19.3", "@codemirror/matchbrackets": "^0.19.3", - "@codemirror/search": "^0.19.2", - "@codemirror/state": "^0.19.5", - "@codemirror/view": "^0.19.19", + "@codemirror/search": "^0.19.3", + "@codemirror/state": "^0.19.6", + "@codemirror/view": "^0.19.20", "@forevolve/bootstrap-dark": "^1.0.0", "@fortawesome/fontawesome-svg-core": "^1.2.14", "@fortawesome/free-solid-svg-icons": "^5.7.1", - "@fortawesome/react-fontawesome": "^0.1.4", + "@fortawesome/react-fontawesome": "^0.1.16", "@nexucis/fuzzy": "^0.3.0", - "bootstrap": "^5.1.3", + "bootstrap": "^4.6.1", "codemirror-promql": "0.18.0", "css.escape": "^1.5.1", "downshift": "^6.1.7", @@ -67,10 +67,10 @@ "@testing-library/react-hooks": "^7.0.1", "@types/enzyme": "^3.10.10", "@types/flot": "0.0.32", - "@types/jest": "^27.0.2", - "@types/jquery": "^3.5.8", - "@types/node": "^16.11.7", - "@types/react": "^17.0.35", + "@types/jest": "^27.0.3", + "@types/jquery": "^3.5.9", + "@types/node": "^16.11.9", + "@types/react": "^17.0.36", "@types/react-copy-to-clipboard": "^5.0.2", "@types/react-dom": "^17.0.11", "@types/react-resize-detector": "^6.1.0", @@ -88,7 +88,7 @@ "mutationobserver-shim": "^0.3.7", "prettier": "^2.4.1", "react-scripts": "4.0.3", - "sinon": "^11.1.2", + "sinon": "^12.0.1", "typescript": "^4.5.2" }, "proxy": "http://localhost:9090", diff --git a/web/ui/react-app/src/pages/graph/CMTheme.tsx b/web/ui/react-app/src/pages/graph/CMTheme.tsx index 87de82ba36..cd2aa69a4c 100644 --- a/web/ui/react-app/src/pages/graph/CMTheme.tsx +++ b/web/ui/react-app/src/pages/graph/CMTheme.tsx @@ -2,7 +2,7 @@ import { HighlightStyle, tags } from '@codemirror/highlight'; import { EditorView } from '@codemirror/view'; export const baseTheme = EditorView.theme({ - '&': { + '&.cm-editor': { '&.cm-focused': { outline: 'none', outline_fallback: 'none', diff --git a/web/web.go b/web/web.go index d777917ed4..01014f4266 100644 --- a/web/web.go +++ b/web/web.go @@ -594,7 +594,7 @@ func (h *Handler) Run(ctx context.Context, listener net.Listener, webConfig stri ReadTimeout: h.options.ReadTimeout, } - errCh := make(chan error) + errCh := make(chan error, 1) go func() { errCh <- toolkit_web.Serve(listener, httpSrv, webConfig, h.logger) }()