From 05c65bd83f4a414b043d4f330c7e3f60a5b62a62 Mon Sep 17 00:00:00 2001
From: Aliaksandr Valialkin
Date: Sat, 3 Dec 2022 20:57:19 -0800
Subject: [PATCH 01/38] lib/storage: speed up search for data block for the
given tsids
Use binary search instead of linear scan for looking up the needed
data block inside index block.
Updates https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3425
---
lib/storage/part_search.go | 31 ++++++++++++++++++-------------
1 file changed, 18 insertions(+), 13 deletions(-)
diff --git a/lib/storage/part_search.go b/lib/storage/part_search.go
index 1ceacd8284..88e92c501b 100644
--- a/lib/storage/part_search.go
+++ b/lib/storage/part_search.go
@@ -228,24 +228,29 @@ func (ps *partSearch) readIndexBlock(mr *metaindexRow) (*indexBlock, error) {
}
func (ps *partSearch) searchBHS() bool {
- for i := range ps.bhs {
- bh := &ps.bhs[i]
-
- nextTSID:
- if bh.TSID.Less(&ps.BlockRef.bh.TSID) {
- // Skip blocks with small tsid values.
- continue
+ bhs := ps.bhs
+ for len(bhs) > 0 {
+ // Skip block headers with tsids smaller than the given tsid.
+ tsid := &ps.BlockRef.bh.TSID
+ n := sort.Search(len(bhs), func(i int) bool {
+ return !bhs[i].TSID.Less(tsid)
+ })
+ if n == len(bhs) {
+ // Nothing found.
+ break
}
+ bhs = bhs[n:]
- // Invariant: ps.BlockRef.bh.TSID <= bh.TSID
+ // Invariant: tsid <= bh.TSID
- if bh.TSID.MetricID != ps.BlockRef.bh.TSID.MetricID {
- // ps.BlockRef.bh.TSID < bh.TSID: no more blocks with the given tsid.
+ bh := &bhs[0]
+ if bh.TSID.MetricID != tsid.MetricID {
+ // tsid < bh.TSID: no more blocks with the given tsid.
// Proceed to the next (bigger) tsid.
if !ps.nextTSID() {
return false
}
- goto nextTSID
+ continue
}
// Found the block with the given tsid. Verify timestamp range.
@@ -254,6 +259,7 @@ func (ps *partSearch) searchBHS() bool {
// So use linear search instead of binary search.
if bh.MaxTimestamp < ps.tr.MinTimestamp {
// Skip the block with too small timestamps.
+ bhs = bhs[1:]
continue
}
if bh.MinTimestamp > ps.tr.MaxTimestamp {
@@ -269,10 +275,9 @@ func (ps *partSearch) searchBHS() bool {
// Read it.
ps.BlockRef.init(ps.p, bh)
- ps.bhs = ps.bhs[i+1:]
+ ps.bhs = bhs[1:]
return true
}
-
ps.bhs = nil
return false
}
From ddc3d6b5c3604b77ccad128b8334c948bf06c2f2 Mon Sep 17 00:00:00 2001
From: Aliaksandr Valialkin
Date: Sat, 3 Dec 2022 21:17:27 -0800
Subject: [PATCH 02/38] lib/mergeset: drop the crufty code responsible for
direct upgrade from releases prior v1.28.0
Upgrade to v1.84.0, wait until the "finished round 2 of background conversion" message
appears in the log and then upgrade to newer release.
---
docs/CHANGELOG.md | 2 ++
lib/mergeset/table.go | 84 +++----------------------------------------
2 files changed, 7 insertions(+), 79 deletions(-)
diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md
index eb4d4d9434..d1b5507a27 100644
--- a/docs/CHANGELOG.md
+++ b/docs/CHANGELOG.md
@@ -15,6 +15,8 @@ The following tip changes can be tested by building VictoriaMetrics components f
## tip
+**Update note 1:** this release drops support for direct upgrade from VictoriaMetrics versions prior [v1.28.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.28.0). Please upgrade to `v1.84.0`, wait until `finished round 2 of background conversion` line is emitted to log by single-node VictoriaMetrics or by `vmstorage`, and then upgrade to newer releases.
+
* FEATURE: [vmagent](https://docs.victoriametrics.com/vmagent.html): improve [service discovery](https://docs.victoriametrics.com/sd_configs.html) performance when discovering big number of targets (10K and more).
* FEATURE: [vmagent](https://docs.victoriametrics.com/vmagent.html): add `exported_` prefix to metric names exported by scrape targets if these metric names clash with [automatically generated metrics](https://docs.victoriametrics.com/vmagent.html#automatically-generated-metrics) such as `up`, `scrape_samples_scraped`, etc. This prevents from corruption of automatically generated metrics. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3406).
* FEATURE: [VictoriaMetrics cluster](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html): improve error message when the requested path cannot be properly parsed, so users could identify the issue and properly fix the path. Now the error message links to [url format docs](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#url-format). See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3402).
diff --git a/lib/mergeset/table.go b/lib/mergeset/table.go
index aa4b595cca..87e4f56437 100644
--- a/lib/mergeset/table.go
+++ b/lib/mergeset/table.go
@@ -112,8 +112,6 @@ type Table struct {
rawItemsFlusherWG sync.WaitGroup
- convertersWG sync.WaitGroup
-
// Use syncwg instead of sync, since Add/Wait may be called from concurrent goroutines.
rawItemsPendingFlushesWG syncwg.WaitGroup
}
@@ -306,12 +304,6 @@ func OpenTable(path string, flushCallback func(), prepareBlock PrepareBlockCallb
logger.Infof("table %q has been opened in %.3f seconds; partsCount: %d; blocksCount: %d, itemsCount: %d; sizeBytes: %d",
path, time.Since(startTime).Seconds(), m.PartsCount, m.BlocksCount, m.ItemsCount, m.SizeBytes)
- tb.convertersWG.Add(1)
- go func() {
- tb.convertToV1280()
- tb.convertersWG.Done()
- }()
-
if flushCallback != nil {
tb.flushCallbackWorkerWG.Add(1)
go func() {
@@ -345,11 +337,6 @@ func (tb *Table) MustClose() {
tb.rawItemsFlusherWG.Wait()
logger.Infof("raw items flusher stopped in %.3f seconds on %q", time.Since(startTime).Seconds(), tb.path)
- logger.Infof("waiting for converters to stop on %q...", tb.path)
- startTime = time.Now()
- tb.convertersWG.Wait()
- logger.Infof("converters stopped in %.3f seconds on %q", time.Since(startTime).Seconds(), tb.path)
-
logger.Infof("waiting for part mergers to stop on %q...", tb.path)
startTime = time.Now()
tb.partMergersWG.Wait()
@@ -376,7 +363,7 @@ func (tb *Table) MustClose() {
}
tb.partsLock.Unlock()
- if err := tb.mergePartsOptimal(pws, nil); err != nil {
+ if err := tb.mergePartsOptimal(pws); err != nil {
logger.Panicf("FATAL: cannot flush inmemory parts to files in %q: %s", tb.path, err)
}
logger.Infof("%d inmemory parts have been flushed to files in %.3f seconds on %q", len(pws), time.Since(startTime).Seconds(), tb.path)
@@ -533,63 +520,11 @@ func (tb *Table) rawItemsFlusher() {
}
}
-const convertToV1280FileName = "converted-to-v1.28.0"
-
-func (tb *Table) convertToV1280() {
- // Convert tag->metricID rows into tag->metricIDs rows when upgrading to v1.28.0+.
- flagFilePath := tb.path + "/" + convertToV1280FileName
- if fs.IsPathExist(flagFilePath) {
- // The conversion has been already performed.
- return
- }
-
- getAllPartsForMerge := func() []*partWrapper {
- var pws []*partWrapper
- tb.partsLock.Lock()
- for _, pw := range tb.parts {
- if pw.isInMerge {
- continue
- }
- pw.isInMerge = true
- pws = append(pws, pw)
- }
- tb.partsLock.Unlock()
- return pws
- }
- pws := getAllPartsForMerge()
- if len(pws) > 0 {
- logger.Infof("started round 1 of background conversion of %q to v1.28.0 format; merge %d parts", tb.path, len(pws))
- startTime := time.Now()
- if err := tb.mergePartsOptimal(pws, tb.stopCh); err != nil {
- logger.Errorf("failed round 1 of background conversion of %q to v1.28.0 format: %s", tb.path, err)
- return
- }
- logger.Infof("finished round 1 of background conversion of %q to v1.28.0 format in %.3f seconds", tb.path, time.Since(startTime).Seconds())
-
- // The second round is needed in order to merge small blocks
- // with tag->metricIDs rows left after the first round.
- pws = getAllPartsForMerge()
- logger.Infof("started round 2 of background conversion of %q to v1.28.0 format; merge %d parts", tb.path, len(pws))
- startTime = time.Now()
- if len(pws) > 0 {
- if err := tb.mergePartsOptimal(pws, tb.stopCh); err != nil {
- logger.Errorf("failed round 2 of background conversion of %q to v1.28.0 format: %s", tb.path, err)
- return
- }
- }
- logger.Infof("finished round 2 of background conversion of %q to v1.28.0 format in %.3f seconds", tb.path, time.Since(startTime).Seconds())
- }
-
- if err := fs.WriteFileAtomically(flagFilePath, []byte("ok"), false); err != nil {
- logger.Panicf("FATAL: cannot create %q: %s", flagFilePath, err)
- }
-}
-
-func (tb *Table) mergePartsOptimal(pws []*partWrapper, stopCh <-chan struct{}) error {
+func (tb *Table) mergePartsOptimal(pws []*partWrapper) error {
for len(pws) > defaultPartsToMerge {
pwsChunk := pws[:defaultPartsToMerge]
pws = pws[defaultPartsToMerge:]
- if err := tb.mergeParts(pwsChunk, stopCh, false); err != nil {
+ if err := tb.mergeParts(pwsChunk, nil, false); err != nil {
tb.releasePartsToMerge(pws)
return fmt.Errorf("cannot merge %d parts: %w", defaultPartsToMerge, err)
}
@@ -597,7 +532,7 @@ func (tb *Table) mergePartsOptimal(pws []*partWrapper, stopCh <-chan struct{}) e
if len(pws) == 0 {
return nil
}
- if err := tb.mergeParts(pws, stopCh, false); err != nil {
+ if err := tb.mergeParts(pws, nil, false); err != nil {
return fmt.Errorf("cannot merge %d parts: %w", len(pws), err)
}
return nil
@@ -1188,16 +1123,7 @@ func (tb *Table) CreateSnapshotAt(dstDir string) error {
for _, fi := range fis {
fn := fi.Name()
if !fs.IsDirOrSymlink(fi) {
- switch fn {
- case convertToV1280FileName:
- srcPath := srcDir + "/" + fn
- dstPath := dstDir + "/" + fn
- if err := os.Link(srcPath, dstPath); err != nil {
- return fmt.Errorf("cannot hard link from %q to %q: %w", srcPath, dstPath, err)
- }
- default:
- // Skip other non-directories.
- }
+ // Skip non-directories.
continue
}
if isSpecialDir(fn) {
From 14660d4df5914fba15f1979caed7139edd708e18 Mon Sep 17 00:00:00 2001
From: Aliaksandr Valialkin
Date: Sat, 3 Dec 2022 21:53:01 -0800
Subject: [PATCH 03/38] all: typo fix: `the the` -> `the`
---
app/vmagent/remotewrite/remotewrite.go | 2 +-
lib/promrelabel/graphite.go | 2 +-
lib/promscrape/config.go | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/app/vmagent/remotewrite/remotewrite.go b/app/vmagent/remotewrite/remotewrite.go
index ae5234ff4c..d64d381138 100644
--- a/app/vmagent/remotewrite/remotewrite.go
+++ b/app/vmagent/remotewrite/remotewrite.go
@@ -251,7 +251,7 @@ func Stop() {
// Push sends wr to remote storage systems set via `-remoteWrite.url`.
//
// If at is nil, then the data is pushed to the configured `-remoteWrite.url`.
-// If at isn't nil, the the data is pushed to the configured `-remoteWrite.multitenantURL`.
+// If at isn't nil, the data is pushed to the configured `-remoteWrite.multitenantURL`.
//
// Note that wr may be modified by Push due to relabeling and rounding.
func Push(at *auth.Token, wr *prompbmarshal.WriteRequest) {
diff --git a/lib/promrelabel/graphite.go b/lib/promrelabel/graphite.go
index 015f6bcdc2..de39634b2e 100644
--- a/lib/promrelabel/graphite.go
+++ b/lib/promrelabel/graphite.go
@@ -106,7 +106,7 @@ func (gmt *graphiteMatchTemplate) Match(dst []string, s string) ([]string, bool)
dst = append(dst, s)
return dst, true
}
- // Search for the the start of the next part.
+ // Search for the start of the next part.
p = parts[i+1]
i++
n := strings.Index(s, p)
diff --git a/lib/promscrape/config.go b/lib/promscrape/config.go
index aaa6f8a8a6..eba623caec 100644
--- a/lib/promscrape/config.go
+++ b/lib/promscrape/config.go
@@ -137,7 +137,7 @@ func (cfg *Config) mustRestart(prevCfg *Config) {
// See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/2884
needGlobalRestart := !areEqualGlobalConfigs(&cfg.Global, &prevCfg.Global)
- // Loop over the the new jobs, start new ones and restart updated ones.
+ // Loop over the new jobs, start new ones and restart updated ones.
var started, stopped, restarted int
currentJobNames := make(map[string]struct{}, len(cfg.ScrapeConfigs))
for i, sc := range cfg.ScrapeConfigs {
From 7c3c08d102e0da93778950127699ecaa676cfda8 Mon Sep 17 00:00:00 2001
From: Aliaksandr Valialkin
Date: Sat, 3 Dec 2022 21:55:06 -0800
Subject: [PATCH 04/38] lib/backup: remove logging duplicate path values in a
single error message
---
lib/backup/fscommon/fscommon.go | 2 +-
lib/backup/fslocal/fslocal.go | 2 +-
lib/backup/fsremote/fsremote.go | 6 +++---
3 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/lib/backup/fscommon/fscommon.go b/lib/backup/fscommon/fscommon.go
index fd9e3506b9..37d688aeb9 100644
--- a/lib/backup/fscommon/fscommon.go
+++ b/lib/backup/fscommon/fscommon.go
@@ -45,7 +45,7 @@ func fsync(path string) error {
func AppendFiles(dst []string, dir string) ([]string, error) {
d, err := os.Open(dir)
if err != nil {
- return nil, fmt.Errorf("cannot open %q: %w", dir, err)
+ return nil, fmt.Errorf("cannot open directory: %w", err)
}
dst, err = appendFilesInternal(dst, d)
if err1 := d.Close(); err1 != nil {
diff --git a/lib/backup/fslocal/fslocal.go b/lib/backup/fslocal/fslocal.go
index 051182a624..055c38123c 100644
--- a/lib/backup/fslocal/fslocal.go
+++ b/lib/backup/fslocal/fslocal.go
@@ -159,7 +159,7 @@ func (fs *FS) DeletePath(path string) (uint64, error) {
// The file could be deleted earlier via symlink.
return 0, nil
}
- return 0, fmt.Errorf("cannot open %q at %q: %w", path, fullPath, err)
+ return 0, fmt.Errorf("cannot open %q: %w", path, err)
}
fi, err := f.Stat()
_ = f.Close()
diff --git a/lib/backup/fsremote/fsremote.go b/lib/backup/fsremote/fsremote.go
index 4e4939f912..d2a7ce8512 100644
--- a/lib/backup/fsremote/fsremote.go
+++ b/lib/backup/fsremote/fsremote.go
@@ -107,12 +107,12 @@ func (fs *FS) CopyPart(srcFS common.OriginFS, p common.Part) error {
// Cannot create hardlink. Just copy file contents
srcFile, err := os.Open(srcPath)
if err != nil {
- return fmt.Errorf("cannot open file %q: %w", srcPath, err)
+ return fmt.Errorf("cannot open source file: %w", err)
}
dstFile, err := os.Create(dstPath)
if err != nil {
_ = srcFile.Close()
- return fmt.Errorf("cannot create file %q: %w", dstPath, err)
+ return fmt.Errorf("cannot create destination file: %w", err)
}
n, err := io.Copy(dstFile, srcFile)
if err1 := dstFile.Close(); err1 != nil {
@@ -141,7 +141,7 @@ func (fs *FS) DownloadPart(p common.Part, w io.Writer) error {
path := fs.path(p)
r, err := os.Open(path)
if err != nil {
- return fmt.Errorf("cannot open %q: %w", path, err)
+ return err
}
n, err := io.Copy(w, r)
if err1 := r.Close(); err1 != nil && err == nil {
From 4f28513b1a06207ff3113c1e224fd33b1de11a84 Mon Sep 17 00:00:00 2001
From: Aliaksandr Valialkin
Date: Sat, 3 Dec 2022 22:00:20 -0800
Subject: [PATCH 05/38] lib/fs: remove logging redundant path values in a
single error message
---
lib/fs/fs.go | 57 +++++++++++++++++++++++++++++---------------
lib/fs/fs_solaris.go | 4 ++--
lib/fs/fs_unix.go | 4 ++--
lib/fs/reader_at.go | 2 +-
4 files changed, 43 insertions(+), 24 deletions(-)
diff --git a/lib/fs/fs.go b/lib/fs/fs.go
index 14ae2d6823..92ae1e67d5 100644
--- a/lib/fs/fs.go
+++ b/lib/fs/fs.go
@@ -25,11 +25,38 @@ func MustSyncPath(path string) {
mustSyncPath(path)
}
+// WriteFileAndSync writes data to the file at path and then calls fsync on the created file.
+//
+// The fsync guarantees that the written data survives hardware reset after successful call.
+//
+// This function may leave the file at the path in inconsistent state on app crash
+// in the middle of the write.
+// Use WriteFileAtomically if the file at the path must be either written in full
+// or not written at all on app crash in the middle of the write.
+func WriteFileAndSync(path string, data []byte) error {
+ f, err := filestream.Create(path, false)
+ if err != nil {
+ return err
+ }
+ if _, err := f.Write(data); err != nil {
+ f.MustClose()
+ // Do not call MustRemoveAll(path), so the user could inpsect
+ // the file contents during investigation of the issue.
+ return fmt.Errorf("cannot write %d bytes to %q: %w", len(data), path, err)
+ }
+ // Sync and close the file.
+ f.MustClose()
+ return nil
+}
+
// WriteFileAtomically atomically writes data to the given file path.
//
-// WriteFileAtomically returns only after the file is fully written and synced
+// This function returns only after the file is fully written and synced
// to the underlying storage.
//
+// This function guarantees that the file at path either fully written or not written at all on app crash
+// in the middle of the write.
+//
// If the file at path already exists, then the file is overwritten atomically if canOverwrite is true.
// Otherwise error is returned.
func WriteFileAtomically(path string, data []byte, canOverwrite bool) error {
@@ -40,26 +67,18 @@ func WriteFileAtomically(path string, data []byte, canOverwrite bool) error {
return fmt.Errorf("cannot create file %q, since it already exists", path)
}
+ // Write data to a temporary file.
n := atomic.AddUint64(&tmpFileNum, 1)
tmpPath := fmt.Sprintf("%s.tmp.%d", path, n)
- f, err := filestream.Create(tmpPath, false)
- if err != nil {
- return fmt.Errorf("cannot create file %q: %w", tmpPath, err)
- }
- if _, err := f.Write(data); err != nil {
- f.MustClose()
- MustRemoveAll(tmpPath)
- return fmt.Errorf("cannot write %d bytes to file %q: %w", len(data), tmpPath, err)
+ if err := WriteFileAndSync(tmpPath, data); err != nil {
+ return fmt.Errorf("cannot write data to temporary file: %w", err)
}
- // Sync and close the file.
- f.MustClose()
-
- // Atomically move the file from tmpPath to path.
+ // Atomically move the temporary file from tmpPath to path.
if err := os.Rename(tmpPath, path); err != nil {
// do not call MustRemoveAll(tmpPath) here, so the user could inspect
- // the file contents during investigating the issue.
- return fmt.Errorf("cannot move %q to %q: %w", tmpPath, path, err)
+ // the file contents during investigation of the issue.
+ return fmt.Errorf("cannot move temporary file %q to %q: %w", tmpPath, path, err)
}
// Sync the containing directory, so the file is guaranteed to appear in the directory.
@@ -123,7 +142,7 @@ func RemoveDirContents(dir string) {
}
d, err := os.Open(dir)
if err != nil {
- logger.Panicf("FATAL: cannot open dir %q: %s", dir, err)
+ logger.Panicf("FATAL: cannot open dir: %s", err)
}
defer MustClose(d)
names, err := d.Readdirnames(-1)
@@ -185,7 +204,7 @@ func IsEmptyDir(path string) bool {
// See https://stackoverflow.com/a/30708914/274937
f, err := os.Open(path)
if err != nil {
- logger.Panicf("FATAL: unexpected error when opening directory %q: %s", path, err)
+ logger.Panicf("FATAL: cannot open dir: %s", err)
}
_, err = f.Readdirnames(1)
MustClose(f)
@@ -230,7 +249,7 @@ var atomicDirRemoveCounter = uint64(time.Now().UnixNano())
func MustRemoveTemporaryDirs(dir string) {
d, err := os.Open(dir)
if err != nil {
- logger.Panicf("FATAL: cannot open dir %q: %s", dir, err)
+ logger.Panicf("FATAL: cannot open dir: %s", err)
}
defer MustClose(d)
fis, err := d.Readdir(-1)
@@ -259,7 +278,7 @@ func HardLinkFiles(srcDir, dstDir string) error {
d, err := os.Open(srcDir)
if err != nil {
- return fmt.Errorf("cannot open srcDir=%q: %w", srcDir, err)
+ return fmt.Errorf("cannot open srcDir: %w", err)
}
defer func() {
if err := d.Close(); err != nil {
diff --git a/lib/fs/fs_solaris.go b/lib/fs/fs_solaris.go
index 8cddca829d..ac94ea406c 100644
--- a/lib/fs/fs_solaris.go
+++ b/lib/fs/fs_solaris.go
@@ -19,7 +19,7 @@ func mUnmap(data []byte) error {
func mustSyncPath(path string) {
d, err := os.Open(path)
if err != nil {
- logger.Panicf("FATAL: cannot open %q: %s", path, err)
+ logger.Panicf("FATAL: cannot open file for fsync: %s", err)
}
if err := d.Sync(); err != nil {
_ = d.Close()
@@ -51,7 +51,7 @@ func createFlockFile(flockFile string) (*os.File, error) {
func mustGetFreeSpace(path string) uint64 {
d, err := os.Open(path)
if err != nil {
- logger.Panicf("FATAL: cannot determine free disk space on %q: %s", path, err)
+ logger.Panicf("FATAL: cannot open dir for determining free disk space: %s", err)
}
defer MustClose(d)
diff --git a/lib/fs/fs_unix.go b/lib/fs/fs_unix.go
index 20cf6f6c08..bcb789c94a 100644
--- a/lib/fs/fs_unix.go
+++ b/lib/fs/fs_unix.go
@@ -22,7 +22,7 @@ func mUnmap(data []byte) error {
func mustSyncPath(path string) {
d, err := os.Open(path)
if err != nil {
- logger.Panicf("FATAL: cannot open %q: %s", path, err)
+ logger.Panicf("FATAL: cannot open file for fsync: %s", err)
}
if err := d.Sync(); err != nil {
_ = d.Close()
@@ -47,7 +47,7 @@ func createFlockFile(flockFile string) (*os.File, error) {
func mustGetFreeSpace(path string) uint64 {
d, err := os.Open(path)
if err != nil {
- logger.Panicf("FATAL: cannot determine free disk space on %q: %s", path, err)
+ logger.Panicf("FATAL: cannot open dir for determining free disk space: %s", err)
}
defer MustClose(d)
diff --git a/lib/fs/reader_at.go b/lib/fs/reader_at.go
index 53ccb44c37..abc1c46990 100644
--- a/lib/fs/reader_at.go
+++ b/lib/fs/reader_at.go
@@ -89,7 +89,7 @@ func (r *ReaderAt) MustFadviseSequentialRead(prefetch bool) {
func MustOpenReaderAt(path string) *ReaderAt {
f, err := os.Open(path)
if err != nil {
- logger.Panicf("FATAL: cannot open file %q for reading: %s", path, err)
+ logger.Panicf("FATAL: cannot open file for reading: %s", err)
}
var r ReaderAt
r.f = f
From 93764746c27c19a05e6eabc5b7559eae48639056 Mon Sep 17 00:00:00 2001
From: Aliaksandr Valialkin
Date: Sat, 3 Dec 2022 22:01:51 -0800
Subject: [PATCH 06/38] lib/filestream: remove logging redundant path values in
a single error message
---
lib/filestream/filestream.go | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/lib/filestream/filestream.go b/lib/filestream/filestream.go
index 8af10f5cec..2f0e4e5953 100644
--- a/lib/filestream/filestream.go
+++ b/lib/filestream/filestream.go
@@ -79,7 +79,7 @@ func OpenReaderAt(path string, offset int64, nocache bool) (*Reader, error) {
func Open(path string, nocache bool) (*Reader, error) {
f, err := os.Open(path)
if err != nil {
- return nil, fmt.Errorf("cannot open file %q: %w", path, err)
+ return nil, err
}
r := &Reader{
f: f,
@@ -179,7 +179,7 @@ type Writer struct {
func OpenWriterAt(path string, offset int64, nocache bool) (*Writer, error) {
f, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE, 0600)
if err != nil {
- return nil, fmt.Errorf("cannot open %q: %w", path, err)
+ return nil, err
}
n, err := f.Seek(offset, io.SeekStart)
if err != nil {
From 152ac564ab82dca8011f2df3160bc1afe8bf89ca Mon Sep 17 00:00:00 2001
From: Aliaksandr Valialkin
Date: Sat, 3 Dec 2022 22:13:13 -0800
Subject: [PATCH 07/38] lib/storage: remove logging redundant path values in a
single error message
---
lib/storage/block_stream_reader.go | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/lib/storage/block_stream_reader.go b/lib/storage/block_stream_reader.go
index aa3149d5b2..2f9e6fc59d 100644
--- a/lib/storage/block_stream_reader.go
+++ b/lib/storage/block_stream_reader.go
@@ -252,7 +252,7 @@ func (bsr *blockStreamReader) readBlock() error {
if err == io.EOF {
return io.EOF
}
- return fmt.Errorf("cannot read index block from index data: %w", err)
+ return fmt.Errorf("cannot read index block: %w", err)
}
}
@@ -354,11 +354,11 @@ func (bsr *blockStreamReader) readIndexBlock() error {
// Read index block.
bsr.compressedIndexData = bytesutil.ResizeNoCopyMayOverallocate(bsr.compressedIndexData, int(bsr.mr.IndexBlockSize))
if err := fs.ReadFullData(bsr.indexReader, bsr.compressedIndexData); err != nil {
- return fmt.Errorf("cannot read index block from index data at offset %d: %w", bsr.indexBlockOffset, err)
+ return fmt.Errorf("cannot read index block at offset %d: %w", bsr.indexBlockOffset, err)
}
tmpData, err := encoding.DecompressZSTD(bsr.indexData[:0], bsr.compressedIndexData)
if err != nil {
- return fmt.Errorf("cannot decompress index block read at offset %d: %w", bsr.indexBlockOffset, err)
+ return fmt.Errorf("cannot decompress index block at offset %d: %w", bsr.indexBlockOffset, err)
}
bsr.indexData = tmpData
bsr.indexCursor = bsr.indexData
From 5ca58cc4fb6c313a43ab305d8a8242580a47dc5f Mon Sep 17 00:00:00 2001
From: Aliaksandr Valialkin
Date: Sat, 3 Dec 2022 22:14:12 -0800
Subject: [PATCH 08/38] lib/storage: optimization: do not scan block for rows
outside retention if it is covered by the retention
---
lib/storage/merge.go | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/lib/storage/merge.go b/lib/storage/merge.go
index 7207fd2135..8759c09926 100644
--- a/lib/storage/merge.go
+++ b/lib/storage/merge.go
@@ -178,6 +178,10 @@ func mergeBlocks(ob, ib1, ib2 *Block, retentionDeadline int64, rowsDeleted *uint
}
func skipSamplesOutsideRetention(b *Block, retentionDeadline int64, rowsDeleted *uint64) {
+ if b.bh.MinTimestamp >= retentionDeadline {
+ // Fast path - the block contains only samples with timestamps bigger than retentionDeadline.
+ return
+ }
timestamps := b.timestamps
nextIdx := b.nextIdx
nextIdxOrig := nextIdx
From 45299efe22ed9a1a800d04c1fc6d56c1e2e4702f Mon Sep 17 00:00:00 2001
From: Aliaksandr Valialkin
Date: Sat, 3 Dec 2022 22:17:46 -0800
Subject: [PATCH 09/38] lib/{storage,mergeset}: consistency rename:
`flushRaw{Rows,Items} -> flushPending{Rows,Items}
---
lib/mergeset/table.go | 10 +++++-----
lib/storage/partition.go | 8 ++++----
lib/storage/partition_search_test.go | 2 +-
lib/storage/storage.go | 2 +-
lib/storage/table.go | 6 +++---
lib/storage/table_search_test.go | 2 +-
6 files changed, 15 insertions(+), 15 deletions(-)
diff --git a/lib/mergeset/table.go b/lib/mergeset/table.go
index 87e4f56437..4f1e224ae6 100644
--- a/lib/mergeset/table.go
+++ b/lib/mergeset/table.go
@@ -346,7 +346,7 @@ func (tb *Table) MustClose() {
startTime = time.Now()
// Flush raw items the last time before exit.
- tb.flushRawItems(true)
+ tb.flushPendingItems(true)
// Flush inmemory parts to disk.
var pws []*partWrapper
@@ -515,7 +515,7 @@ func (tb *Table) rawItemsFlusher() {
case <-tb.stopCh:
return
case <-ticker.C:
- tb.flushRawItems(false)
+ tb.flushPendingItems(false)
}
}
}
@@ -543,13 +543,13 @@ func (tb *Table) mergePartsOptimal(pws []*partWrapper) error {
//
// This function is only for debugging and testing.
func (tb *Table) DebugFlush() {
- tb.flushRawItems(true)
+ tb.flushPendingItems(true)
// Wait for background flushers to finish.
tb.rawItemsPendingFlushesWG.Wait()
}
-func (tb *Table) flushRawItems(isFinal bool) {
+func (tb *Table) flushPendingItems(isFinal bool) {
tb.rawItems.flush(tb, isFinal)
}
@@ -1099,7 +1099,7 @@ func (tb *Table) CreateSnapshotAt(dstDir string) error {
}
// Flush inmemory items to disk.
- tb.flushRawItems(true)
+ tb.flushPendingItems(true)
// The snapshot must be created under the lock in order to prevent from
// concurrent modifications via runTransaction.
diff --git a/lib/storage/partition.go b/lib/storage/partition.go
index 6f91cba1c2..296b8af68a 100644
--- a/lib/storage/partition.go
+++ b/lib/storage/partition.go
@@ -649,7 +649,7 @@ func (pt *partition) MustClose() {
startTime = time.Now()
// Flush raw rows the last time before exit.
- pt.flushRawRows(true)
+ pt.flushPendingRows(true)
// Flush inmemory parts to disk.
var pws []*partWrapper
@@ -710,12 +710,12 @@ func (pt *partition) rawRowsFlusher() {
case <-pt.stopCh:
return
case <-ticker.C:
- pt.flushRawRows(false)
+ pt.flushPendingRows(false)
}
}
}
-func (pt *partition) flushRawRows(isFinal bool) {
+func (pt *partition) flushPendingRows(isFinal bool) {
pt.rawRows.flush(pt, isFinal)
}
@@ -1639,7 +1639,7 @@ func (pt *partition) CreateSnapshotAt(smallPath, bigPath string) error {
startTime := time.Now()
// Flush inmemory data to disk.
- pt.flushRawRows(true)
+ pt.flushPendingRows(true)
if _, err := pt.flushInmemoryParts(nil, true); err != nil {
return fmt.Errorf("cannot flush inmemory parts: %w", err)
}
diff --git a/lib/storage/partition_search_test.go b/lib/storage/partition_search_test.go
index 9649770dfd..b0e39ef7d0 100644
--- a/lib/storage/partition_search_test.go
+++ b/lib/storage/partition_search_test.go
@@ -185,7 +185,7 @@ func testPartitionSearchEx(t *testing.T, ptt int64, tr TimeRange, partsCount, ma
pt.AddRows(rows)
// Flush just added rows to a separate partition.
- pt.flushRawRows(true)
+ pt.flushPendingRows(true)
}
testPartitionSearch(t, pt, tsids, tr, rbsExpected, -1)
pt.MustClose()
diff --git a/lib/storage/storage.go b/lib/storage/storage.go
index 1a50316f3c..9971db2b50 100644
--- a/lib/storage/storage.go
+++ b/lib/storage/storage.go
@@ -306,7 +306,7 @@ func (s *Storage) updateDeletedMetricIDs(metricIDs *uint64set.Set) {
// DebugFlush flushes recently added storage data, so it becomes visible to search.
func (s *Storage) DebugFlush() {
- s.tb.flushRawRows()
+ s.tb.flushPendingRows()
s.idb().tb.DebugFlush()
}
diff --git a/lib/storage/table.go b/lib/storage/table.go
index 5b7ffbce71..e4b6030449 100644
--- a/lib/storage/table.go
+++ b/lib/storage/table.go
@@ -215,15 +215,15 @@ func (tb *table) MustClose() {
}
}
-// flushRawRows flushes all the pending rows, so they become visible to search.
+// flushPendingRows flushes all the pending rows, so they become visible to search.
//
// This function is for debug purposes only.
-func (tb *table) flushRawRows() {
+func (tb *table) flushPendingRows() {
ptws := tb.GetPartitions(nil)
defer tb.PutPartitions(ptws)
for _, ptw := range ptws {
- ptw.pt.flushRawRows(true)
+ ptw.pt.flushPendingRows(true)
}
}
diff --git a/lib/storage/table_search_test.go b/lib/storage/table_search_test.go
index c9b1119dcf..17e1f5b86c 100644
--- a/lib/storage/table_search_test.go
+++ b/lib/storage/table_search_test.go
@@ -197,7 +197,7 @@ func testTableSearchEx(t *testing.T, trData, trSearch TimeRange, partitionsCount
}
// Flush rows to parts.
- tb.flushRawRows()
+ tb.flushPendingRows()
}
testTableSearch(t, tb, tsids, trSearch, rbsExpected, -1)
tb.MustClose()
From c4150995ad5a003f0cbce436cb42acddc7a5eeca Mon Sep 17 00:00:00 2001
From: Aliaksandr Valialkin
Date: Sat, 3 Dec 2022 22:26:33 -0800
Subject: [PATCH 10/38] lib/mergeset: reduce the time needed for the slowest
tests
---
lib/mergeset/encoding.go | 4 +++-
lib/mergeset/encoding_test.go | 2 +-
lib/mergeset/table_test.go | 26 ++++++++++----------------
3 files changed, 14 insertions(+), 18 deletions(-)
diff --git a/lib/mergeset/encoding.go b/lib/mergeset/encoding.go
index 09d1e0f762..b93383e817 100644
--- a/lib/mergeset/encoding.go
+++ b/lib/mergeset/encoding.go
@@ -47,7 +47,9 @@ func (it Item) String(data []byte) string {
return *(*string)(unsafe.Pointer(sh))
}
-func (ib *inmemoryBlock) Len() int { return len(ib.items) }
+func (ib *inmemoryBlock) Len() int {
+ return len(ib.items)
+}
func (ib *inmemoryBlock) Less(i, j int) bool {
items := ib.items
diff --git a/lib/mergeset/encoding_test.go b/lib/mergeset/encoding_test.go
index 48398ae2fc..8e6ecffd0f 100644
--- a/lib/mergeset/encoding_test.go
+++ b/lib/mergeset/encoding_test.go
@@ -115,7 +115,7 @@ func TestInmemoryBlockMarshalUnmarshal(t *testing.T) {
var itemsLen uint32
var mt marshalType
- for i := 0; i < 1000; i++ {
+ for i := 0; i < 1000; i += 10 {
var items []string
totalLen := 0
ib.Reset()
diff --git a/lib/mergeset/table_test.go b/lib/mergeset/table_test.go
index f99ab937c2..0756a13c79 100644
--- a/lib/mergeset/table_test.go
+++ b/lib/mergeset/table_test.go
@@ -31,7 +31,7 @@ func TestTableOpenClose(t *testing.T) {
tb.MustClose()
// Re-open created table multiple times.
- for i := 0; i < 10; i++ {
+ for i := 0; i < 4; i++ {
tb, err := OpenTable(path, nil, nil, &isReadOnly)
if err != nil {
t.Fatalf("cannot open created table: %s", err)
@@ -53,7 +53,7 @@ func TestTableOpenMultipleTimes(t *testing.T) {
}
defer tb1.MustClose()
- for i := 0; i < 10; i++ {
+ for i := 0; i < 4; i++ {
tb2, err := OpenTable(path, nil, nil, &isReadOnly)
if err == nil {
tb2.MustClose()
@@ -62,8 +62,8 @@ func TestTableOpenMultipleTimes(t *testing.T) {
}
}
-func TestTableAddItemSerial(t *testing.T) {
- const path = "TestTableAddItemSerial"
+func TestTableAddItemsSerial(t *testing.T) {
+ const path = "TestTableAddItemsSerial"
if err := os.RemoveAll(path); err != nil {
t.Fatalf("cannot remove %q: %s", path, err)
}
@@ -81,7 +81,7 @@ func TestTableAddItemSerial(t *testing.T) {
t.Fatalf("cannot open %q: %s", path, err)
}
- const itemsCount = 1e5
+ const itemsCount = 10e3
testAddItemsSerial(tb, itemsCount)
// Verify items count after pending items flush.
@@ -98,7 +98,7 @@ func TestTableAddItemSerial(t *testing.T) {
tb.MustClose()
- // Re-open the table and make sure ItemsCount remains the same.
+ // Re-open the table and make sure itemsCount remains the same.
testReopenTable(t, path, itemsCount)
// Add more items in order to verify merge between inmemory parts and file-based parts.
@@ -110,7 +110,7 @@ func TestTableAddItemSerial(t *testing.T) {
testAddItemsSerial(tb, moreItemsCount)
tb.MustClose()
- // Re-open the table and verify ItemsCount again.
+ // Re-open the table and verify itemsCount again.
testReopenTable(t, path, itemsCount+moreItemsCount)
}
@@ -221,9 +221,7 @@ func TestTableAddItemsConcurrent(t *testing.T) {
flushCallback := func() {
atomic.AddUint64(&flushes, 1)
}
- var itemsMerged uint64
prepareBlock := func(data []byte, items []Item) ([]byte, []Item) {
- atomic.AddUint64(&itemsMerged, uint64(len(items)))
return data, items
}
var isReadOnly uint32
@@ -232,7 +230,7 @@ func TestTableAddItemsConcurrent(t *testing.T) {
t.Fatalf("cannot open %q: %s", path, err)
}
- const itemsCount = 1e5
+ const itemsCount = 10e3
testAddItemsConcurrent(tb, itemsCount)
// Verify items count after pending items flush.
@@ -240,10 +238,6 @@ func TestTableAddItemsConcurrent(t *testing.T) {
if atomic.LoadUint64(&flushes) == 0 {
t.Fatalf("unexpected zero flushes")
}
- n := atomic.LoadUint64(&itemsMerged)
- if n < itemsCount {
- t.Fatalf("too low number of items merged; got %v; must be at least %v", n, itemsCount)
- }
var m TableMetrics
tb.UpdateMetrics(&m)
@@ -253,7 +247,7 @@ func TestTableAddItemsConcurrent(t *testing.T) {
tb.MustClose()
- // Re-open the table and make sure ItemsCount remains the same.
+ // Re-open the table and make sure itemsCount remains the same.
testReopenTable(t, path, itemsCount)
// Add more items in order to verify merge between inmemory parts and file-based parts.
@@ -265,7 +259,7 @@ func TestTableAddItemsConcurrent(t *testing.T) {
testAddItemsConcurrent(tb, moreItemsCount)
tb.MustClose()
- // Re-open the table and verify ItemsCount again.
+ // Re-open the table and verify itemsCount again.
testReopenTable(t, path, itemsCount+moreItemsCount)
}
From f3e3a3daeb78bfc0e06e13f0fbe782d3ae17e44f Mon Sep 17 00:00:00 2001
From: Aliaksandr Valialkin
Date: Sat, 3 Dec 2022 22:30:30 -0800
Subject: [PATCH 11/38] lib/{mergeset,storage}: take into account byte slice
capacity when returning the size of in-memory part
This results in more correct reporting of memory usage for in-memory parts
---
lib/mergeset/inmemory_part.go | 5 ++---
lib/storage/inmemory_part.go | 9 ++++++---
2 files changed, 8 insertions(+), 6 deletions(-)
diff --git a/lib/mergeset/inmemory_part.go b/lib/mergeset/inmemory_part.go
index 9b41faca82..012d6dcc20 100644
--- a/lib/mergeset/inmemory_part.go
+++ b/lib/mergeset/inmemory_part.go
@@ -76,9 +76,8 @@ var inmemoryPartBytePool bytesutil.ByteBufferPool
// It is safe calling NewPart multiple times.
// It is unsafe re-using mp while the returned part is in use.
func (mp *inmemoryPart) NewPart() *part {
- ph := mp.ph
size := mp.size()
- p, err := newPart(&ph, "", size, mp.metaindexData.NewReader(), &mp.indexData, &mp.itemsData, &mp.lensData)
+ p, err := newPart(&mp.ph, "", size, mp.metaindexData.NewReader(), &mp.indexData, &mp.itemsData, &mp.lensData)
if err != nil {
logger.Panicf("BUG: cannot create a part from inmemoryPart: %s", err)
}
@@ -86,5 +85,5 @@ func (mp *inmemoryPart) NewPart() *part {
}
func (mp *inmemoryPart) size() uint64 {
- return uint64(len(mp.metaindexData.B) + len(mp.indexData.B) + len(mp.itemsData.B) + len(mp.lensData.B))
+ return uint64(cap(mp.metaindexData.B) + cap(mp.indexData.B) + cap(mp.itemsData.B) + cap(mp.lensData.B))
}
diff --git a/lib/storage/inmemory_part.go b/lib/storage/inmemory_part.go
index 3f78e24b7b..b0681c9849 100644
--- a/lib/storage/inmemory_part.go
+++ b/lib/storage/inmemory_part.go
@@ -49,9 +49,12 @@ func (mp *inmemoryPart) InitFromRows(rows []rawRow) {
// It is safe calling NewPart multiple times.
// It is unsafe re-using mp while the returned part is in use.
func (mp *inmemoryPart) NewPart() (*part, error) {
- ph := mp.ph
- size := uint64(len(mp.timestampsData.B) + len(mp.valuesData.B) + len(mp.indexData.B) + len(mp.metaindexData.B))
- return newPart(&ph, "", size, mp.metaindexData.NewReader(), &mp.timestampsData, &mp.valuesData, &mp.indexData)
+ size := mp.size()
+ return newPart(&mp.ph, "", size, mp.metaindexData.NewReader(), &mp.timestampsData, &mp.valuesData, &mp.indexData)
+}
+
+func (mp *inmemoryPart) size() uint64 {
+ return uint64(cap(mp.timestampsData.B) + cap(mp.valuesData.B) + cap(mp.indexData.B) + cap(mp.metaindexData.B))
}
func getInmemoryPart() *inmemoryPart {
From 6d87462f4b7e703dad3f780ad86eb594e77ef86b Mon Sep 17 00:00:00 2001
From: Aliaksandr Valialkin
Date: Sat, 3 Dec 2022 22:34:43 -0800
Subject: [PATCH 12/38] lib/mergeset: use the given compressLevel for index and
metaindex compression in in-memory part
Previously only data was compressed with the given compressLevel
---
lib/mergeset/inmemory_part.go | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/lib/mergeset/inmemory_part.go b/lib/mergeset/inmemory_part.go
index 012d6dcc20..c3caca201c 100644
--- a/lib/mergeset/inmemory_part.go
+++ b/lib/mergeset/inmemory_part.go
@@ -60,14 +60,14 @@ func (mp *inmemoryPart) Init(ib *inmemoryBlock) {
bb := inmemoryPartBytePool.Get()
bb.B = mp.bh.Marshal(bb.B[:0])
- mp.indexData.B = encoding.CompressZSTDLevel(mp.indexData.B[:0], bb.B, 0)
+ mp.indexData.B = encoding.CompressZSTDLevel(mp.indexData.B[:0], bb.B, compressLevel)
mp.mr.firstItem = append(mp.mr.firstItem[:0], mp.bh.firstItem...)
mp.mr.blockHeadersCount = 1
mp.mr.indexBlockOffset = 0
mp.mr.indexBlockSize = uint32(len(mp.indexData.B))
bb.B = mp.mr.Marshal(bb.B[:0])
- mp.metaindexData.B = encoding.CompressZSTDLevel(mp.metaindexData.B[:0], bb.B, 0)
+ mp.metaindexData.B = encoding.CompressZSTDLevel(mp.metaindexData.B[:0], bb.B, compressLevel)
inmemoryPartBytePool.Put(bb)
}
From 343c69fc153591a914f2636bc1076e8386fb44e9 Mon Sep 17 00:00:00 2001
From: Aliaksandr Valialkin
Date: Sat, 3 Dec 2022 22:45:53 -0800
Subject: [PATCH 13/38] lib/{mergeset,storage}: pass compressLevel to
blockStreamWriter.InitFromInmemoryPart
This allows packing in-memory blocks with different compression levels
depending on its contents. This may save memory usage.
---
lib/mergeset/block_stream_writer.go | 7 ++-----
lib/mergeset/merge_test.go | 10 +++++-----
lib/mergeset/part_search_test.go | 2 +-
lib/mergeset/table.go | 14 +++++++++-----
lib/storage/block_stream_writer.go | 7 ++-----
lib/storage/block_stream_writer_timing_test.go | 2 +-
lib/storage/merge_test.go | 4 ++--
lib/storage/merge_timing_test.go | 2 +-
lib/storage/partition.go | 4 ++--
lib/storage/raw_row.go | 5 ++++-
10 files changed, 29 insertions(+), 28 deletions(-)
diff --git a/lib/mergeset/block_stream_writer.go b/lib/mergeset/block_stream_writer.go
index b25e473257..9c348fbc23 100644
--- a/lib/mergeset/block_stream_writer.go
+++ b/lib/mergeset/block_stream_writer.go
@@ -63,13 +63,10 @@ func (bsw *blockStreamWriter) reset() {
bsw.mrFirstItemCaught = false
}
-func (bsw *blockStreamWriter) InitFromInmemoryPart(mp *inmemoryPart) {
+func (bsw *blockStreamWriter) InitFromInmemoryPart(mp *inmemoryPart, compressLevel int) {
bsw.reset()
- // Use the minimum compression level for in-memory blocks,
- // since they are going to be re-compressed during the merge into file-based blocks.
- bsw.compressLevel = -5 // See https://github.com/facebook/zstd/releases/tag/v1.3.4
-
+ bsw.compressLevel = compressLevel
bsw.metaindexWriter = &mp.metaindexData
bsw.indexWriter = &mp.indexData
bsw.itemsWriter = &mp.itemsData
diff --git a/lib/mergeset/merge_test.go b/lib/mergeset/merge_test.go
index f042bae0fc..6ba874a676 100644
--- a/lib/mergeset/merge_test.go
+++ b/lib/mergeset/merge_test.go
@@ -30,14 +30,14 @@ func TestMultilevelMerge(t *testing.T) {
// First level merge
var dstIP1 inmemoryPart
var bsw1 blockStreamWriter
- bsw1.InitFromInmemoryPart(&dstIP1)
+ bsw1.InitFromInmemoryPart(&dstIP1, -5)
if err := mergeBlockStreams(&dstIP1.ph, &bsw1, bsrs[:5], nil, nil, &itemsMerged); err != nil {
t.Fatalf("cannot merge first level part 1: %s", err)
}
var dstIP2 inmemoryPart
var bsw2 blockStreamWriter
- bsw2.InitFromInmemoryPart(&dstIP2)
+ bsw2.InitFromInmemoryPart(&dstIP2, -5)
if err := mergeBlockStreams(&dstIP2.ph, &bsw2, bsrs[5:], nil, nil, &itemsMerged); err != nil {
t.Fatalf("cannot merge first level part 2: %s", err)
}
@@ -54,7 +54,7 @@ func TestMultilevelMerge(t *testing.T) {
newTestBlockStreamReader(&dstIP1),
newTestBlockStreamReader(&dstIP2),
}
- bsw.InitFromInmemoryPart(&dstIP)
+ bsw.InitFromInmemoryPart(&dstIP, 1)
if err := mergeBlockStreams(&dstIP.ph, &bsw, bsrsTop, nil, nil, &itemsMerged); err != nil {
t.Fatalf("cannot merge second level: %s", err)
}
@@ -73,7 +73,7 @@ func TestMergeForciblyStop(t *testing.T) {
bsrs, _ := newTestInmemoryBlockStreamReaders(20, 4000)
var dstIP inmemoryPart
var bsw blockStreamWriter
- bsw.InitFromInmemoryPart(&dstIP)
+ bsw.InitFromInmemoryPart(&dstIP, 1)
ch := make(chan struct{})
var itemsMerged uint64
close(ch)
@@ -120,7 +120,7 @@ func testMergeBlockStreamsSerial(blocksToMerge, maxItemsPerBlock int) error {
var itemsMerged uint64
var dstIP inmemoryPart
var bsw blockStreamWriter
- bsw.InitFromInmemoryPart(&dstIP)
+ bsw.InitFromInmemoryPart(&dstIP, -4)
if err := mergeBlockStreams(&dstIP.ph, &bsw, bsrs, nil, nil, &itemsMerged); err != nil {
return fmt.Errorf("cannot merge block streams: %w", err)
}
diff --git a/lib/mergeset/part_search_test.go b/lib/mergeset/part_search_test.go
index fb178bcde0..c042d44acd 100644
--- a/lib/mergeset/part_search_test.go
+++ b/lib/mergeset/part_search_test.go
@@ -149,7 +149,7 @@ func newTestPart(blocksCount, maxItemsPerBlock int) (*part, []string, error) {
var itemsMerged uint64
var ip inmemoryPart
var bsw blockStreamWriter
- bsw.InitFromInmemoryPart(&ip)
+ bsw.InitFromInmemoryPart(&ip, -3)
if err := mergeBlockStreams(&ip.ph, &bsw, bsrs, nil, nil, &itemsMerged); err != nil {
return nil, nil, fmt.Errorf("cannot merge blocks: %w", err)
}
diff --git a/lib/mergeset/table.go b/lib/mergeset/table.go
index 4f1e224ae6..25fc20cc41 100644
--- a/lib/mergeset/table.go
+++ b/lib/mergeset/table.go
@@ -661,6 +661,11 @@ func (tb *Table) mergeInmemoryBlocks(ibs []*inmemoryBlock) *partWrapper {
atomic.AddUint64(&tb.activeMerges, 1)
defer atomic.AddUint64(&tb.activeMerges, ^uint64(0))
+ outItemsCount := uint64(0)
+ for _, ib := range ibs {
+ outItemsCount += uint64(ib.Len())
+ }
+
// Prepare blockStreamReaders for source blocks.
bsrs := make([]*blockStreamReader, 0, len(ibs))
for _, ib := range ibs {
@@ -688,9 +693,10 @@ func (tb *Table) mergeInmemoryBlocks(ibs []*inmemoryBlock) *partWrapper {
}
// Prepare blockStreamWriter for destination part.
+ compressLevel := getCompressLevel(outItemsCount)
bsw := getBlockStreamWriter()
mpDst := &inmemoryPart{}
- bsw.InitFromInmemoryPart(mpDst)
+ bsw.InitFromInmemoryPart(mpDst, compressLevel)
// Merge parts.
// The merge shouldn't be interrupted by stopCh,
@@ -869,7 +875,7 @@ func (tb *Table) mergeParts(pws []*partWrapper, stopCh <-chan struct{}, isOuterP
mergeIdx := tb.nextMergeIdx()
tmpPartPath := fmt.Sprintf("%s/tmp/%016X", tb.path, mergeIdx)
bsw := getBlockStreamWriter()
- compressLevel := getCompressLevelForPartItems(outItemsCount, outBlocksCount)
+ compressLevel := getCompressLevel(outItemsCount)
if err := bsw.InitFromFilePart(tmpPartPath, nocache, compressLevel); err != nil {
return fmt.Errorf("cannot create destination part %q: %w", tmpPartPath, err)
}
@@ -958,9 +964,7 @@ func (tb *Table) mergeParts(pws []*partWrapper, stopCh <-chan struct{}, isOuterP
return nil
}
-func getCompressLevelForPartItems(itemsCount, blocksCount uint64) int {
- // There is no need in using blocksCount here, since mergeset blocks are usually full.
-
+func getCompressLevel(itemsCount uint64) int {
if itemsCount <= 1<<16 {
// -5 is the minimum supported compression for zstd.
// See https://github.com/facebook/zstd/releases/tag/v1.3.4
diff --git a/lib/storage/block_stream_writer.go b/lib/storage/block_stream_writer.go
index 790c363668..ff43aa3cd2 100644
--- a/lib/storage/block_stream_writer.go
+++ b/lib/storage/block_stream_writer.go
@@ -80,13 +80,10 @@ func (bsw *blockStreamWriter) reset() {
}
// InitFromInmemoryPart initialzes bsw from inmemory part.
-func (bsw *blockStreamWriter) InitFromInmemoryPart(mp *inmemoryPart) {
+func (bsw *blockStreamWriter) InitFromInmemoryPart(mp *inmemoryPart, compressLevel int) {
bsw.reset()
- // Use the minimum compression level for in-memory blocks,
- // since they are going to be re-compressed during the merge into file-based blocks.
- bsw.compressLevel = -5 // See https://github.com/facebook/zstd/releases/tag/v1.3.4
-
+ bsw.compressLevel = compressLevel
bsw.timestampsWriter = &mp.timestampsData
bsw.valuesWriter = &mp.valuesData
bsw.indexWriter = &mp.indexData
diff --git a/lib/storage/block_stream_writer_timing_test.go b/lib/storage/block_stream_writer_timing_test.go
index 8e51d06a20..95ecbbe358 100644
--- a/lib/storage/block_stream_writer_timing_test.go
+++ b/lib/storage/block_stream_writer_timing_test.go
@@ -47,7 +47,7 @@ func benchmarkBlockStreamWriter(b *testing.B, ebs []Block, rowsCount int, writeR
}
}
- bsw.InitFromInmemoryPart(&mp)
+ bsw.InitFromInmemoryPart(&mp, -5)
for i := range ebsCopy {
bsw.WriteExternalBlock(&ebsCopy[i], &ph, &rowsMerged)
}
diff --git a/lib/storage/merge_test.go b/lib/storage/merge_test.go
index 189935c41f..276abd3aa5 100644
--- a/lib/storage/merge_test.go
+++ b/lib/storage/merge_test.go
@@ -361,7 +361,7 @@ func TestMergeForciblyStop(t *testing.T) {
var mp inmemoryPart
var bsw blockStreamWriter
- bsw.InitFromInmemoryPart(&mp)
+ bsw.InitFromInmemoryPart(&mp, -5)
ch := make(chan struct{})
var rowsMerged, rowsDeleted uint64
close(ch)
@@ -384,7 +384,7 @@ func testMergeBlockStreams(t *testing.T, bsrs []*blockStreamReader, expectedBloc
var mp inmemoryPart
var bsw blockStreamWriter
- bsw.InitFromInmemoryPart(&mp)
+ bsw.InitFromInmemoryPart(&mp, -5)
strg := newTestStorage()
var rowsMerged, rowsDeleted uint64
diff --git a/lib/storage/merge_timing_test.go b/lib/storage/merge_timing_test.go
index 5cbbe54552..cfc440c705 100644
--- a/lib/storage/merge_timing_test.go
+++ b/lib/storage/merge_timing_test.go
@@ -41,7 +41,7 @@ func benchmarkMergeBlockStreams(b *testing.B, mps []*inmemoryPart, rowsPerLoop i
bsrs[i].InitFromInmemoryPart(mp)
}
mpOut.Reset()
- bsw.InitFromInmemoryPart(&mpOut)
+ bsw.InitFromInmemoryPart(&mpOut, -5)
if err := mergeBlockStreams(&mpOut.ph, &bsw, bsrs, nil, strg, 0, &rowsMerged, &rowsDeleted); err != nil {
panic(fmt.Errorf("cannot merge block streams: %w", err))
}
diff --git a/lib/storage/partition.go b/lib/storage/partition.go
index 296b8af68a..d73a69837d 100644
--- a/lib/storage/partition.go
+++ b/lib/storage/partition.go
@@ -1181,7 +1181,7 @@ func (pt *partition) mergeParts(pws []*partWrapper, stopCh <-chan struct{}) erro
mergeIdx := pt.nextMergeIdx()
tmpPartPath := fmt.Sprintf("%s/tmp/%016X", ptPath, mergeIdx)
bsw := getBlockStreamWriter()
- compressLevel := getCompressLevelForRowsCount(outRowsCount, outBlocksCount)
+ compressLevel := getCompressLevel(outRowsCount, outBlocksCount)
if err := bsw.InitFromFilePart(tmpPartPath, nocache, compressLevel); err != nil {
return fmt.Errorf("cannot create destination part %q: %w", tmpPartPath, err)
}
@@ -1301,7 +1301,7 @@ func (pt *partition) mergeParts(pws []*partWrapper, stopCh <-chan struct{}) erro
return nil
}
-func getCompressLevelForRowsCount(rowsCount, blocksCount uint64) int {
+func getCompressLevel(rowsCount, blocksCount uint64) int {
avgRowsPerBlock := rowsCount / blocksCount
// See https://github.com/facebook/zstd/releases/tag/v1.3.4 about negative compression levels.
if avgRowsPerBlock <= 10 {
diff --git a/lib/storage/raw_row.go b/lib/storage/raw_row.go
index b1d978d333..206805d628 100644
--- a/lib/storage/raw_row.go
+++ b/lib/storage/raw_row.go
@@ -86,7 +86,10 @@ func (rrm *rawRowsMarshaler) marshalToInmemoryPart(mp *inmemoryPart, rows []rawR
logger.Panicf("BUG: rows count must be smaller than 2^32; got %d", len(rows))
}
- rrm.bsw.InitFromInmemoryPart(mp)
+ // Use the minimum compression level for first-level in-memory blocks,
+ // since they are going to be re-compressed during subsequent merges.
+ const compressLevel = -5 // See https://github.com/facebook/zstd/releases/tag/v1.3.4
+ rrm.bsw.InitFromInmemoryPart(mp, compressLevel)
ph := &mp.ph
ph.Reset()
From 28e6d9e1fffbfcd9c6ed66dc8bf4a8ad74b51579 Mon Sep 17 00:00:00 2001
From: Aliaksandr Valialkin
Date: Sat, 3 Dec 2022 23:02:10 -0800
Subject: [PATCH 14/38] lib/storage: properly pass retentionMsecs to
OpenStorage() at TestIndexDBRepopulateAfterRotation
---
lib/storage/index_db_test.go | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/lib/storage/index_db_test.go b/lib/storage/index_db_test.go
index 9f00a579cb..b0dbb8a2c6 100644
--- a/lib/storage/index_db_test.go
+++ b/lib/storage/index_db_test.go
@@ -1549,11 +1549,10 @@ func TestMatchTagFilters(t *testing.T) {
func TestIndexDBRepopulateAfterRotation(t *testing.T) {
path := "TestIndexRepopulateAfterRotation"
- s, err := OpenStorage(path, 0, 1e5, 1e5)
+ s, err := OpenStorage(path, msecsPerMonth, 1e5, 1e5)
if err != nil {
t.Fatalf("cannot open storage: %s", err)
}
- s.retentionMsecs = msecsPerMonth
defer func() {
s.MustClose()
if err := os.RemoveAll(path); err != nil {
From cb449767162a5b1ed1bf19ee58d3419236d75188 Mon Sep 17 00:00:00 2001
From: Aliaksandr Valialkin
Date: Sat, 3 Dec 2022 23:03:05 -0800
Subject: [PATCH 15/38] lib/{storage,mergeset}: use a single sync.WaitGroup for
all background workers
This simplifies the code
---
lib/mergeset/table.go | 26 +++++++-------------
lib/storage/partition.go | 52 +++++++++++-----------------------------
2 files changed, 22 insertions(+), 56 deletions(-)
diff --git a/lib/mergeset/table.go b/lib/mergeset/table.go
index 25fc20cc41..f0203eabd2 100644
--- a/lib/mergeset/table.go
+++ b/lib/mergeset/table.go
@@ -107,10 +107,7 @@ type Table struct {
stopCh chan struct{}
- // Use syncwg instead of sync, since Add/Wait may be called from concurrent goroutines.
- partMergersWG syncwg.WaitGroup
-
- rawItemsFlusherWG sync.WaitGroup
+ wg sync.WaitGroup
// Use syncwg instead of sync, since Add/Wait may be called from concurrent goroutines.
rawItemsPendingFlushesWG syncwg.WaitGroup
@@ -332,15 +329,10 @@ func OpenTable(path string, flushCallback func(), prepareBlock PrepareBlockCallb
func (tb *Table) MustClose() {
close(tb.stopCh)
- logger.Infof("waiting for raw items flusher to stop on %q...", tb.path)
+ logger.Infof("waiting for background workers to stop on %q...", tb.path)
startTime := time.Now()
- tb.rawItemsFlusherWG.Wait()
- logger.Infof("raw items flusher stopped in %.3f seconds on %q", time.Since(startTime).Seconds(), tb.path)
-
- logger.Infof("waiting for part mergers to stop on %q...", tb.path)
- startTime = time.Now()
- tb.partMergersWG.Wait()
- logger.Infof("part mergers stopped in %.3f seconds on %q", time.Since(startTime).Seconds(), tb.path)
+ tb.wg.Wait()
+ logger.Infof("background workers stopped in %.3f seconds on %q", time.Since(startTime).Seconds(), tb.path)
logger.Infof("flushing inmemory parts to files on %q...", tb.path)
startTime = time.Now()
@@ -500,10 +492,10 @@ func (tb *Table) putParts(pws []*partWrapper) {
}
func (tb *Table) startRawItemsFlusher() {
- tb.rawItemsFlusherWG.Add(1)
+ tb.wg.Add(1)
go func() {
tb.rawItemsFlusher()
- tb.rawItemsFlusherWG.Done()
+ tb.wg.Done()
}()
}
@@ -592,8 +584,6 @@ func (tb *Table) mergeRawItemsBlocks(ibs []*inmemoryBlock, isFinal bool) {
if len(ibs) == 0 {
return
}
- tb.partMergersWG.Add(1)
- defer tb.partMergersWG.Done()
pws := make([]*partWrapper, 0, (len(ibs)+defaultPartsToMerge-1)/defaultPartsToMerge)
var pwsLock sync.Mutex
@@ -720,12 +710,12 @@ func (tb *Table) mergeInmemoryBlocks(ibs []*inmemoryBlock) *partWrapper {
func (tb *Table) startPartMergers() {
for i := 0; i < mergeWorkersCount; i++ {
- tb.partMergersWG.Add(1)
+ tb.wg.Add(1)
go func() {
if err := tb.partMerger(); err != nil {
logger.Panicf("FATAL: unrecoverable error when merging parts in %q: %s", tb.path, err)
}
- tb.partMergersWG.Done()
+ tb.wg.Done()
}()
}
}
diff --git a/lib/storage/partition.go b/lib/storage/partition.go
index d73a69837d..57354802b9 100644
--- a/lib/storage/partition.go
+++ b/lib/storage/partition.go
@@ -145,11 +145,7 @@ type partition struct {
stopCh chan struct{}
- smallPartsMergerWG sync.WaitGroup
- bigPartsMergerWG sync.WaitGroup
- rawRowsFlusherWG sync.WaitGroup
- inmemoryPartsFlusherWG sync.WaitGroup
- stalePartsRemoverWG sync.WaitGroup
+ wg sync.WaitGroup
}
// partWrapper is a wrapper for the part.
@@ -620,30 +616,10 @@ func (pt *partition) MustClose() {
// Wait until all the pending transaction deletions are finished.
pendingTxnDeletionsWG.Wait()
- logger.Infof("waiting for stale parts remover to stop on %q...", pt.smallPartsPath)
+ logger.Infof("waiting for service workers to stop on %q...", pt.smallPartsPath)
startTime := time.Now()
- pt.stalePartsRemoverWG.Wait()
- logger.Infof("stale parts remover stopped in %.3f seconds on %q", time.Since(startTime).Seconds(), pt.smallPartsPath)
-
- logger.Infof("waiting for inmemory parts flusher to stop on %q...", pt.smallPartsPath)
- startTime = time.Now()
- pt.inmemoryPartsFlusherWG.Wait()
- logger.Infof("inmemory parts flusher stopped in %.3f seconds on %q", time.Since(startTime).Seconds(), pt.smallPartsPath)
-
- logger.Infof("waiting for raw rows flusher to stop on %q...", pt.smallPartsPath)
- startTime = time.Now()
- pt.rawRowsFlusherWG.Wait()
- logger.Infof("raw rows flusher stopped in %.3f seconds on %q", time.Since(startTime).Seconds(), pt.smallPartsPath)
-
- logger.Infof("waiting for small part mergers to stop on %q...", pt.smallPartsPath)
- startTime = time.Now()
- pt.smallPartsMergerWG.Wait()
- logger.Infof("small part mergers stopped in %.3f seconds on %q", time.Since(startTime).Seconds(), pt.smallPartsPath)
-
- logger.Infof("waiting for big part mergers to stop on %q...", pt.bigPartsPath)
- startTime = time.Now()
- pt.bigPartsMergerWG.Wait()
- logger.Infof("big part mergers stopped in %.3f seconds on %q", time.Since(startTime).Seconds(), pt.bigPartsPath)
+ pt.wg.Wait()
+ logger.Infof("service workers stopped in %.3f seconds on %q", time.Since(startTime).Seconds(), pt.smallPartsPath)
logger.Infof("flushing inmemory parts to files on %q...", pt.smallPartsPath)
startTime = time.Now()
@@ -695,10 +671,10 @@ func (pt *partition) MustClose() {
}
func (pt *partition) startRawRowsFlusher() {
- pt.rawRowsFlusherWG.Add(1)
+ pt.wg.Add(1)
go func() {
pt.rawRowsFlusher()
- pt.rawRowsFlusherWG.Done()
+ pt.wg.Done()
}()
}
@@ -748,10 +724,10 @@ func (rrs *rawRowsShard) appendRawRowsToFlush(dst []rawRow, pt *partition, isFin
}
func (pt *partition) startInmemoryPartsFlusher() {
- pt.inmemoryPartsFlusherWG.Add(1)
+ pt.wg.Add(1)
go func() {
pt.inmemoryPartsFlusher()
- pt.inmemoryPartsFlusherWG.Done()
+ pt.wg.Done()
}()
}
@@ -909,17 +885,17 @@ func SetSmallMergeWorkersCount(n int) {
func (pt *partition) startMergeWorkers() {
for i := 0; i < smallMergeWorkersCount; i++ {
- pt.smallPartsMergerWG.Add(1)
+ pt.wg.Add(1)
go func() {
pt.smallPartsMerger()
- pt.smallPartsMergerWG.Done()
+ pt.wg.Done()
}()
}
for i := 0; i < bigMergeWorkersCount; i++ {
- pt.bigPartsMergerWG.Add(1)
+ pt.wg.Add(1)
go func() {
pt.bigPartsMerger()
- pt.bigPartsMergerWG.Done()
+ pt.wg.Done()
}()
}
}
@@ -1346,10 +1322,10 @@ func removeParts(pws []*partWrapper, partsToRemove map[*partWrapper]bool, isBig
}
func (pt *partition) startStalePartsRemover() {
- pt.stalePartsRemoverWG.Add(1)
+ pt.wg.Add(1)
go func() {
pt.stalePartsRemover()
- pt.stalePartsRemoverWG.Done()
+ pt.wg.Done()
}()
}
From 044a304adb4a2ccaa7d0773dd16bcbc7a225f6f8 Mon Sep 17 00:00:00 2001
From: Aliaksandr Valialkin
Date: Sat, 3 Dec 2022 23:10:16 -0800
Subject: [PATCH 16/38] lib/storage: pass a single arg - rowsPerBlock - to
getCompressLevel() function instead of two args
---
lib/storage/partition.go | 20 ++++++++++----------
1 file changed, 10 insertions(+), 10 deletions(-)
diff --git a/lib/storage/partition.go b/lib/storage/partition.go
index 57354802b9..5c28f9a97d 100644
--- a/lib/storage/partition.go
+++ b/lib/storage/partition.go
@@ -1157,7 +1157,8 @@ func (pt *partition) mergeParts(pws []*partWrapper, stopCh <-chan struct{}) erro
mergeIdx := pt.nextMergeIdx()
tmpPartPath := fmt.Sprintf("%s/tmp/%016X", ptPath, mergeIdx)
bsw := getBlockStreamWriter()
- compressLevel := getCompressLevel(outRowsCount, outBlocksCount)
+ rowsPerBlock := float64(outRowsCount) / float64(outBlocksCount)
+ compressLevel := getCompressLevel(rowsPerBlock)
if err := bsw.InitFromFilePart(tmpPartPath, nocache, compressLevel); err != nil {
return fmt.Errorf("cannot create destination part %q: %w", tmpPartPath, err)
}
@@ -1277,28 +1278,27 @@ func (pt *partition) mergeParts(pws []*partWrapper, stopCh <-chan struct{}) erro
return nil
}
-func getCompressLevel(rowsCount, blocksCount uint64) int {
- avgRowsPerBlock := rowsCount / blocksCount
+func getCompressLevel(rowsPerBlock float64) int {
// See https://github.com/facebook/zstd/releases/tag/v1.3.4 about negative compression levels.
- if avgRowsPerBlock <= 10 {
+ if rowsPerBlock <= 10 {
return -5
}
- if avgRowsPerBlock <= 50 {
+ if rowsPerBlock <= 50 {
return -2
}
- if avgRowsPerBlock <= 200 {
+ if rowsPerBlock <= 200 {
return -1
}
- if avgRowsPerBlock <= 500 {
+ if rowsPerBlock <= 500 {
return 1
}
- if avgRowsPerBlock <= 1000 {
+ if rowsPerBlock <= 1000 {
return 2
}
- if avgRowsPerBlock <= 2000 {
+ if rowsPerBlock <= 2000 {
return 3
}
- if avgRowsPerBlock <= 4000 {
+ if rowsPerBlock <= 4000 {
return 4
}
return 5
From 932c1f90ae76eea4805cca0910508f85a5d587ce Mon Sep 17 00:00:00 2001
From: Aliaksandr Valialkin
Date: Sat, 3 Dec 2022 23:15:22 -0800
Subject: [PATCH 17/38] lib/storage: remove duplicate logging for filepath on
errors
---
lib/storage/storage.go | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/lib/storage/storage.go b/lib/storage/storage.go
index 9971db2b50..f7fb6169cb 100644
--- a/lib/storage/storage.go
+++ b/lib/storage/storage.go
@@ -378,13 +378,13 @@ func (s *Storage) ListSnapshots() ([]string, error) {
snapshotsPath := s.path + "/snapshots"
d, err := os.Open(snapshotsPath)
if err != nil {
- return nil, fmt.Errorf("cannot open %q: %w", snapshotsPath, err)
+ return nil, fmt.Errorf("cannot open snapshots directory: %w", err)
}
defer fs.MustClose(d)
fnames, err := d.Readdirnames(-1)
if err != nil {
- return nil, fmt.Errorf("cannot read contents of %q: %w", snapshotsPath, err)
+ return nil, fmt.Errorf("cannot read snapshots directory at %q: %w", snapshotsPath, err)
}
snapshotNames := make([]string, 0, len(fnames))
for _, fname := range fnames {
From 33dda2809b63f990dce03211722903146ed13c8c Mon Sep 17 00:00:00 2001
From: Aliaksandr Valialkin
Date: Sat, 3 Dec 2022 23:30:31 -0800
Subject: [PATCH 18/38] lib/mergeset: panic when too long item is passed to
Table.AddItems()
---
lib/mergeset/table.go | 38 ++++++-----
lib/mergeset/table_search_test.go | 4 +-
lib/mergeset/table_test.go | 14 +---
lib/storage/index_db.go | 42 ++++--------
lib/storage/index_db_test.go | 103 +-----------------------------
lib/storage/storage.go | 7 +-
6 files changed, 38 insertions(+), 170 deletions(-)
diff --git a/lib/mergeset/table.go b/lib/mergeset/table.go
index f0203eabd2..5dbbb4ad90 100644
--- a/lib/mergeset/table.go
+++ b/lib/mergeset/table.go
@@ -138,12 +138,11 @@ func (riss *rawItemsShards) init() {
riss.shards = make([]rawItemsShard, rawItemsShardsPerTable)
}
-func (riss *rawItemsShards) addItems(tb *Table, items [][]byte) error {
+func (riss *rawItemsShards) addItems(tb *Table, items [][]byte) {
n := atomic.AddUint32(&riss.shardIdx, 1)
shards := riss.shards
idx := n % uint32(len(shards))
- shard := &shards[idx]
- return shard.addItems(tb, items)
+ shards[idx].addItems(tb, items)
}
func (riss *rawItemsShards) Len() int {
@@ -180,8 +179,7 @@ func (ris *rawItemsShard) Len() int {
return n
}
-func (ris *rawItemsShard) addItems(tb *Table, items [][]byte) error {
- var err error
+func (ris *rawItemsShard) addItems(tb *Table, items [][]byte) {
var blocksToFlush []*inmemoryBlock
ris.mu.Lock()
@@ -193,17 +191,18 @@ func (ris *rawItemsShard) addItems(tb *Table, items [][]byte) error {
}
ib := ibs[len(ibs)-1]
for _, item := range items {
- if !ib.Add(item) {
- ib = getInmemoryBlock()
- if !ib.Add(item) {
- putInmemoryBlock(ib)
- err = fmt.Errorf("cannot insert an item %q into an empty inmemoryBlock; it looks like the item is too large? len(item)=%d", item, len(item))
- break
- }
- ibs = append(ibs, ib)
- ris.ibs = ibs
+ if ib.Add(item) {
+ continue
}
+ ib = getInmemoryBlock()
+ if ib.Add(item) {
+ ibs = append(ibs, ib)
+ continue
+ }
+ putInmemoryBlock(ib)
+ logger.Panicf("BUG: cannot insert too big item into an empty inmemoryBlock len(item)=%d; the caller should be responsible for avoiding too big items", len(item))
}
+ ris.ibs = ibs
if len(ibs) >= maxBlocksPerShard {
blocksToFlush = append(blocksToFlush, ibs...)
for i := range ibs {
@@ -215,7 +214,6 @@ func (ris *rawItemsShard) addItems(tb *Table, items [][]byte) error {
ris.mu.Unlock()
tb.mergeRawItemsBlocks(blocksToFlush, false)
- return err
}
type partWrapper struct {
@@ -457,17 +455,17 @@ func (tb *Table) UpdateMetrics(m *TableMetrics) {
}
// AddItems adds the given items to the tb.
-func (tb *Table) AddItems(items [][]byte) error {
- if err := tb.rawItems.addItems(tb, items); err != nil {
- return fmt.Errorf("cannot insert data into %q: %w", tb.path, err)
- }
+//
+// The function panics when items contains an item with length exceeding maxInmemoryBlockSize.
+// It is caller's responsibility to make sure there are no too long items.
+func (tb *Table) AddItems(items [][]byte) {
+ tb.rawItems.addItems(tb, items)
atomic.AddUint64(&tb.itemsAdded, uint64(len(items)))
n := 0
for _, item := range items {
n += len(item)
}
atomic.AddUint64(&tb.itemsAddedSizeBytes, uint64(n))
- return nil
}
// getParts appends parts snapshot to dst and returns it.
diff --git a/lib/mergeset/table_search_test.go b/lib/mergeset/table_search_test.go
index 249aa3109a..f0ec1f8882 100644
--- a/lib/mergeset/table_search_test.go
+++ b/lib/mergeset/table_search_test.go
@@ -161,9 +161,7 @@ func newTestTable(path string, itemsCount int) (*Table, []string, error) {
items := make([]string, itemsCount)
for i := 0; i < itemsCount; i++ {
item := fmt.Sprintf("%d:%d", rand.Intn(1e9), i)
- if err := tb.AddItems([][]byte{[]byte(item)}); err != nil {
- return nil, nil, fmt.Errorf("cannot add item: %w", err)
- }
+ tb.AddItems([][]byte{[]byte(item)})
items[i] = item
}
tb.DebugFlush()
diff --git a/lib/mergeset/table_test.go b/lib/mergeset/table_test.go
index 0756a13c79..6a79685378 100644
--- a/lib/mergeset/table_test.go
+++ b/lib/mergeset/table_test.go
@@ -7,8 +7,6 @@ import (
"sync"
"sync/atomic"
"testing"
-
- "github.com/VictoriaMetrics/VictoriaMetrics/lib/logger"
)
func TestTableOpenClose(t *testing.T) {
@@ -120,9 +118,7 @@ func testAddItemsSerial(tb *Table, itemsCount int) {
if len(item) > maxInmemoryBlockSize {
item = item[:maxInmemoryBlockSize]
}
- if err := tb.AddItems([][]byte{item}); err != nil {
- logger.Panicf("BUG: cannot add item to table: %s", err)
- }
+ tb.AddItems([][]byte{item})
}
}
@@ -146,9 +142,7 @@ func TestTableCreateSnapshotAt(t *testing.T) {
const itemsCount = 3e5
for i := 0; i < itemsCount; i++ {
item := []byte(fmt.Sprintf("item %d", i))
- if err := tb.AddItems([][]byte{item}); err != nil {
- t.Fatalf("cannot add item to table: %s", err)
- }
+ tb.AddItems([][]byte{item})
}
tb.DebugFlush()
@@ -276,9 +270,7 @@ func testAddItemsConcurrent(tb *Table, itemsCount int) {
if len(item) > maxInmemoryBlockSize {
item = item[:maxInmemoryBlockSize]
}
- if err := tb.AddItems([][]byte{item}); err != nil {
- logger.Panicf("BUG: cannot add item to table: %s", err)
- }
+ tb.AddItems([][]byte{item})
}
}()
}
diff --git a/lib/storage/index_db.go b/lib/storage/index_db.go
index 29658f4144..a28a8492f4 100644
--- a/lib/storage/index_db.go
+++ b/lib/storage/index_db.go
@@ -400,12 +400,8 @@ func (is *indexSearch) maybeCreateIndexes(tsid *TSID, metricNameRaw []byte, date
return false, fmt.Errorf("cannot unmarshal metricNameRaw %q: %w", metricNameRaw, err)
}
mn.sortTags()
- if err := is.createGlobalIndexes(tsid, mn); err != nil {
- return false, fmt.Errorf("cannot create global indexes: %w", err)
- }
- if err := is.createPerDayIndexes(date, tsid.MetricID, mn); err != nil {
- return false, fmt.Errorf("cannot create per-day indexes for date=%s: %w", dateToString(date), err)
- }
+ is.createGlobalIndexes(tsid, mn)
+ is.createPerDayIndexes(date, tsid.MetricID, mn)
PutMetricName(mn)
atomic.AddUint64(&is.db.timeseriesRepopulated, 1)
return true, nil
@@ -599,12 +595,8 @@ func (is *indexSearch) createTSIDByName(dst *TSID, metricName, metricNameRaw []b
if err := is.db.s.registerSeriesCardinality(dst.MetricID, metricNameRaw); err != nil {
return err
}
- if err := is.createGlobalIndexes(dst, mn); err != nil {
- return fmt.Errorf("cannot create global indexes: %w", err)
- }
- if err := is.createPerDayIndexes(date, dst.MetricID, mn); err != nil {
- return fmt.Errorf("cannot create per-day indexes for date=%s: %w", dateToString(date), err)
- }
+ is.createGlobalIndexes(dst, mn)
+ is.createPerDayIndexes(date, dst.MetricID, mn)
// There is no need in invalidating tag cache, since it is invalidated
// on db.tb flush via invalidateTagFiltersCache flushCallback passed to OpenTable.
@@ -668,7 +660,7 @@ func generateTSID(dst *TSID, mn *MetricName) {
dst.MetricID = generateUniqueMetricID()
}
-func (is *indexSearch) createGlobalIndexes(tsid *TSID, mn *MetricName) error {
+func (is *indexSearch) createGlobalIndexes(tsid *TSID, mn *MetricName) {
// The order of index items is important.
// It guarantees index consistency.
@@ -699,7 +691,7 @@ func (is *indexSearch) createGlobalIndexes(tsid *TSID, mn *MetricName) error {
ii.registerTagIndexes(prefix.B, mn, tsid.MetricID)
kbPool.Put(prefix)
- return is.db.tb.AddItems(ii.Items)
+ is.db.tb.AddItems(ii.Items)
}
type indexItems struct {
@@ -1640,9 +1632,7 @@ func (db *indexDB) searchMetricNameWithCache(dst []byte, metricID uint64) ([]byt
// Mark the metricID as deleted, so it will be created again when new data point
// for the given time series will arrive.
- if err := db.deleteMetricIDs([]uint64{metricID}); err != nil {
- return dst, fmt.Errorf("cannot delete metricID for missing metricID->metricName entry; metricID=%d; error: %w", metricID, err)
- }
+ db.deleteMetricIDs([]uint64{metricID})
return dst, io.EOF
}
@@ -1669,9 +1659,7 @@ func (db *indexDB) DeleteTSIDs(qt *querytracer.Tracer, tfss []*TagFilters) (int,
if err != nil {
return 0, err
}
- if err := db.deleteMetricIDs(metricIDs); err != nil {
- return 0, err
- }
+ db.deleteMetricIDs(metricIDs)
// Delete TSIDs in the extDB.
deletedCount := len(metricIDs)
@@ -1689,10 +1677,10 @@ func (db *indexDB) DeleteTSIDs(qt *querytracer.Tracer, tfss []*TagFilters) (int,
return deletedCount, nil
}
-func (db *indexDB) deleteMetricIDs(metricIDs []uint64) error {
+func (db *indexDB) deleteMetricIDs(metricIDs []uint64) {
if len(metricIDs) == 0 {
// Nothing to delete
- return nil
+ return
}
// atomically add deleted metricIDs to an inmemory map.
@@ -1717,9 +1705,8 @@ func (db *indexDB) deleteMetricIDs(metricIDs []uint64) error {
items.B = encoding.MarshalUint64(items.B, metricID)
items.Next()
}
- err := db.tb.AddItems(items.Items)
+ db.tb.AddItems(items.Items)
putIndexItems(items)
- return err
}
func (db *indexDB) loadDeletedMetricIDs() (*uint64set.Set, error) {
@@ -2793,7 +2780,7 @@ const (
int64Max = int64((1 << 63) - 1)
)
-func (is *indexSearch) createPerDayIndexes(date, metricID uint64, mn *MetricName) error {
+func (is *indexSearch) createPerDayIndexes(date, metricID uint64, mn *MetricName) {
ii := getIndexItems()
defer putIndexItems(ii)
@@ -2808,11 +2795,8 @@ func (is *indexSearch) createPerDayIndexes(date, metricID uint64, mn *MetricName
kb.B = marshalCommonPrefix(kb.B[:0], nsPrefixDateTagToMetricIDs)
kb.B = encoding.MarshalUint64(kb.B, date)
ii.registerTagIndexes(kb.B, mn, metricID)
- if err := is.db.tb.AddItems(ii.Items); err != nil {
- return fmt.Errorf("cannot add per-day entires for metricID %d: %w", metricID, err)
- }
+ is.db.tb.AddItems(ii.Items)
is.db.s.dateMetricIDCache.Set(date, metricID)
- return nil
}
func (ii *indexItems) registerTagIndexes(prefix []byte, mn *MetricName, metricID uint64) {
diff --git a/lib/storage/index_db_test.go b/lib/storage/index_db_test.go
index b0dbb8a2c6..5268a24fb5 100644
--- a/lib/storage/index_db_test.go
+++ b/lib/storage/index_db_test.go
@@ -523,22 +523,13 @@ func TestIndexDB(t *testing.T) {
}
}()
- if err := testIndexDBBigMetricName(db); err != nil {
- t.Fatalf("unexpected error: %s", err)
- }
mns, tsids, err := testIndexDBGetOrCreateTSIDByName(db, metricGroups)
if err != nil {
t.Fatalf("unexpected error: %s", err)
}
- if err := testIndexDBBigMetricName(db); err != nil {
- t.Fatalf("unexpected error: %s", err)
- }
if err := testIndexDBCheckTSIDByName(db, mns, tsids, false); err != nil {
t.Fatalf("unexpected error: %s", err)
}
- if err := testIndexDBBigMetricName(db); err != nil {
- t.Fatalf("unexpected error: %s", err)
- }
// Re-open the db and verify it works as expected.
db.MustClose()
@@ -546,15 +537,9 @@ func TestIndexDB(t *testing.T) {
if err != nil {
t.Fatalf("cannot open indexDB: %s", err)
}
- if err := testIndexDBBigMetricName(db); err != nil {
- t.Fatalf("unexpected error: %s", err)
- }
if err := testIndexDBCheckTSIDByName(db, mns, tsids, false); err != nil {
t.Fatalf("unexpected error: %s", err)
}
- if err := testIndexDBBigMetricName(db); err != nil {
- t.Fatalf("unexpected error: %s", err)
- }
})
t.Run("concurrent", func(t *testing.T) {
@@ -577,27 +562,15 @@ func TestIndexDB(t *testing.T) {
ch := make(chan error, 3)
for i := 0; i < cap(ch); i++ {
go func() {
- if err := testIndexDBBigMetricName(db); err != nil {
- ch <- err
- return
- }
mns, tsid, err := testIndexDBGetOrCreateTSIDByName(db, metricGroups)
if err != nil {
ch <- err
return
}
- if err := testIndexDBBigMetricName(db); err != nil {
- ch <- err
- return
- }
if err := testIndexDBCheckTSIDByName(db, mns, tsid, true); err != nil {
ch <- err
return
}
- if err := testIndexDBBigMetricName(db); err != nil {
- ch <- err
- return
- }
ch <- nil
}()
}
@@ -618,74 +591,6 @@ func TestIndexDB(t *testing.T) {
})
}
-func testIndexDBBigMetricName(db *indexDB) error {
- var bigBytes []byte
- for i := 0; i < 128*1000; i++ {
- bigBytes = append(bigBytes, byte(i))
- }
- var mn MetricName
- var tsid TSID
-
- is := db.getIndexSearch(noDeadline)
- defer db.putIndexSearch(is)
-
- // Try creating too big metric group
- mn.Reset()
- mn.MetricGroup = append(mn.MetricGroup[:0], bigBytes...)
- mn.sortTags()
- metricName := mn.Marshal(nil)
- metricNameRaw := mn.marshalRaw(nil)
- if err := is.GetOrCreateTSIDByName(&tsid, metricName, metricNameRaw, 0); err == nil {
- return fmt.Errorf("expecting non-nil error on an attempt to insert metric with too big MetricGroup")
- }
-
- // Try creating too big tag key
- mn.Reset()
- mn.MetricGroup = append(mn.MetricGroup[:0], "xxx"...)
- mn.Tags = []Tag{{
- Key: append([]byte(nil), bigBytes...),
- Value: []byte("foobar"),
- }}
- mn.sortTags()
- metricName = mn.Marshal(nil)
- metricNameRaw = mn.marshalRaw(nil)
- if err := is.GetOrCreateTSIDByName(&tsid, metricName, metricNameRaw, 0); err == nil {
- return fmt.Errorf("expecting non-nil error on an attempt to insert metric with too big tag key")
- }
-
- // Try creating too big tag value
- mn.Reset()
- mn.MetricGroup = append(mn.MetricGroup[:0], "xxx"...)
- mn.Tags = []Tag{{
- Key: []byte("foobar"),
- Value: append([]byte(nil), bigBytes...),
- }}
- mn.sortTags()
- metricName = mn.Marshal(nil)
- metricNameRaw = mn.marshalRaw(nil)
- if err := is.GetOrCreateTSIDByName(&tsid, metricName, metricNameRaw, 0); err == nil {
- return fmt.Errorf("expecting non-nil error on an attempt to insert metric with too big tag value")
- }
-
- // Try creating metric name with too many tags
- mn.Reset()
- mn.MetricGroup = append(mn.MetricGroup[:0], "xxx"...)
- for i := 0; i < 60000; i++ {
- mn.Tags = append(mn.Tags, Tag{
- Key: []byte(fmt.Sprintf("foobar %d", i)),
- Value: []byte(fmt.Sprintf("sdfjdslkfj %d", i)),
- })
- }
- mn.sortTags()
- metricName = mn.Marshal(nil)
- metricNameRaw = mn.marshalRaw(nil)
- if err := is.GetOrCreateTSIDByName(&tsid, metricName, metricNameRaw, 0); err == nil {
- return fmt.Errorf("expecting non-nil error on an attempt to insert metric with too many tags")
- }
-
- return nil
-}
-
func testIndexDBGetOrCreateTSIDByName(db *indexDB, metricGroups int) ([]MetricName, []TSID, error) {
// Create tsids.
var mns []MetricName
@@ -727,9 +632,7 @@ func testIndexDBGetOrCreateTSIDByName(db *indexDB, metricGroups int) ([]MetricNa
date := uint64(timestampFromTime(time.Now())) / msecPerDay
for i := range tsids {
tsid := &tsids[i]
- if err := is.createPerDayIndexes(date, tsid.MetricID, &mns[i]); err != nil {
- return nil, nil, fmt.Errorf("error in createPerDayIndexes(%d, %d): %w", date, tsid.MetricID, err)
- }
+ is.createPerDayIndexes(date, tsid.MetricID, &mns[i])
}
// Flush index to disk, so it becomes visible for search
@@ -1720,9 +1623,7 @@ func TestSearchTSIDWithTimeRange(t *testing.T) {
for i := range tsids {
tsid := &tsids[i]
metricIDs.Add(tsid.MetricID)
- if err := is.createPerDayIndexes(date, tsid.MetricID, &mns[i]); err != nil {
- t.Fatalf("error in createPerDayIndexes(%d, %d): %s", date, tsid.MetricID, err)
- }
+ is.createPerDayIndexes(date, tsid.MetricID, &mns[i])
}
allMetricIDs.Union(&metricIDs)
perDayMetricIDs[date] = &metricIDs
diff --git a/lib/storage/storage.go b/lib/storage/storage.go
index f7fb6169cb..1b686140bb 100644
--- a/lib/storage/storage.go
+++ b/lib/storage/storage.go
@@ -2070,12 +2070,7 @@ func (s *Storage) updatePerDateData(rows []rawRow, mrs []*MetricRow) error {
continue
}
mn.sortTags()
- if err := is.createPerDayIndexes(date, metricID, mn); err != nil {
- if firstError == nil {
- firstError = fmt.Errorf("error when storing per-date inverted index for (date=%s, metricID=%d): %w", dateToString(date), metricID, err)
- }
- continue
- }
+ is.createPerDayIndexes(date, metricID, mn)
}
dateMetricIDsForCache = append(dateMetricIDsForCache, dateMetricID{
date: date,
From 544ea89f91cb5b74f2ee423d26a023bbf79e07b5 Mon Sep 17 00:00:00 2001
From: Aliaksandr Valialkin
Date: Sun, 4 Dec 2022 00:01:04 -0800
Subject: [PATCH 19/38] lib/{mergeset,storage}: add start background workers
via startBackgroundWorkers() function
---
lib/mergeset/table.go | 8 ++++++--
lib/storage/partition.go | 17 +++++++++--------
2 files changed, 15 insertions(+), 10 deletions(-)
diff --git a/lib/mergeset/table.go b/lib/mergeset/table.go
index 5dbbb4ad90..d88cba7cb1 100644
--- a/lib/mergeset/table.go
+++ b/lib/mergeset/table.go
@@ -291,8 +291,7 @@ func OpenTable(path string, flushCallback func(), prepareBlock PrepareBlockCallb
stopCh: make(chan struct{}),
}
tb.rawItems.init()
- tb.startPartMergers()
- tb.startRawItemsFlusher()
+ tb.startBackgroundWorkers()
var m TableMetrics
tb.UpdateMetrics(&m)
@@ -323,6 +322,11 @@ func OpenTable(path string, flushCallback func(), prepareBlock PrepareBlockCallb
return tb, nil
}
+func (tb *Table) startBackgroundWorkers() {
+ tb.startPartMergers()
+ tb.startRawItemsFlusher()
+}
+
// MustClose closes the table.
func (tb *Table) MustClose() {
close(tb.stopCh)
diff --git a/lib/storage/partition.go b/lib/storage/partition.go
index 5c28f9a97d..17e8aa8baa 100644
--- a/lib/storage/partition.go
+++ b/lib/storage/partition.go
@@ -204,16 +204,20 @@ func createPartition(timestamp int64, smallPartitionsPath, bigPartitionsPath str
pt := newPartition(name, smallPartsPath, bigPartsPath, s)
pt.tr.fromPartitionTimestamp(timestamp)
- pt.startMergeWorkers()
- pt.startRawRowsFlusher()
- pt.startInmemoryPartsFlusher()
- pt.startStalePartsRemover()
+ pt.startBackgroundWorkers()
logger.Infof("partition %q has been created", name)
return pt, nil
}
+func (pt *partition) startBackgroundWorkers() {
+ pt.startMergeWorkers()
+ pt.startRawRowsFlusher()
+ pt.startInmemoryPartsFlusher()
+ pt.startStalePartsRemover()
+}
+
// Drop drops all the data on the storage for the given pt.
//
// The pt must be detached from table before calling pt.Drop.
@@ -258,10 +262,7 @@ func openPartition(smallPartsPath, bigPartsPath string, s *Storage) (*partition,
if err := pt.tr.fromPartitionName(name); err != nil {
return nil, fmt.Errorf("cannot obtain partition time range from smallPartsPath %q: %w", smallPartsPath, err)
}
- pt.startMergeWorkers()
- pt.startRawRowsFlusher()
- pt.startInmemoryPartsFlusher()
- pt.startStalePartsRemover()
+ pt.startBackgroundWorkers()
return pt, nil
}
From 91a8afa17295e456c461cc7fe2ad131490888e04 Mon Sep 17 00:00:00 2001
From: Roman Khavronenko
Date: Mon, 5 Dec 2022 08:34:54 +0100
Subject: [PATCH 20/38] vmalert: reduce allocations for Prometheus resp parse
(#3435)
Method `metrics()` now pre-allocates slices for labels
and results from query responses. This reduces the number
of allocations on the hot path for instant requests.
Signed-off-by: hagen1778
---
app/vmalert/datasource/datasource.go | 13 ++++++
app/vmalert/datasource/vm_prom_api.go | 8 ++--
app/vmalert/datasource/vm_prom_api_test.go | 20 ++++++++++
app/vmalert/datasource/vm_test.go | 46 ++++++++++++++++------
4 files changed, 70 insertions(+), 17 deletions(-)
create mode 100644 app/vmalert/datasource/vm_prom_api_test.go
diff --git a/app/vmalert/datasource/datasource.go b/app/vmalert/datasource/datasource.go
index 898061fe76..6792efb56e 100644
--- a/app/vmalert/datasource/datasource.go
+++ b/app/vmalert/datasource/datasource.go
@@ -54,6 +54,19 @@ func (m *Metric) SetLabel(key, value string) {
m.AddLabel(key, value)
}
+// SetLabels sets the given map as Metric labels
+func (m *Metric) SetLabels(ls map[string]string) {
+ var i int
+ m.Labels = make([]Label, len(ls))
+ for k, v := range ls {
+ m.Labels[i] = Label{
+ Name: k,
+ Value: v,
+ }
+ i++
+ }
+}
+
// AddLabel appends the given label to the label set
func (m *Metric) AddLabel(key, value string) {
m.Labels = append(m.Labels, Label{Name: key, Value: value})
diff --git a/app/vmalert/datasource/vm_prom_api.go b/app/vmalert/datasource/vm_prom_api.go
index 1b5fd59155..7689626fbd 100644
--- a/app/vmalert/datasource/vm_prom_api.go
+++ b/app/vmalert/datasource/vm_prom_api.go
@@ -32,19 +32,17 @@ type promInstant struct {
}
func (r promInstant) metrics() ([]Metric, error) {
- var result []Metric
+ result := make([]Metric, len(r.Result))
for i, res := range r.Result {
f, err := strconv.ParseFloat(res.TV[1].(string), 64)
if err != nil {
return nil, fmt.Errorf("metric %v, unable to parse float64 from %s: %w", res, res.TV[1], err)
}
var m Metric
- for k, v := range r.Result[i].Labels {
- m.AddLabel(k, v)
- }
+ m.SetLabels(res.Labels)
m.Timestamps = append(m.Timestamps, int64(res.TV[0].(float64)))
m.Values = append(m.Values, f)
- result = append(result, m)
+ result[i] = m
}
return result, nil
}
diff --git a/app/vmalert/datasource/vm_prom_api_test.go b/app/vmalert/datasource/vm_prom_api_test.go
new file mode 100644
index 0000000000..0a0105810a
--- /dev/null
+++ b/app/vmalert/datasource/vm_prom_api_test.go
@@ -0,0 +1,20 @@
+package datasource
+
+import (
+ "encoding/json"
+ "testing"
+)
+
+func BenchmarkMetrics(b *testing.B) {
+ payload := []byte(`[{"metric":{"__name__":"vm_rows"},"value":[1583786142,"13763"]},{"metric":{"__name__":"vm_requests", "foo":"bar", "baz": "qux"},"value":[1583786140,"2000"]}]`)
+
+ var pi promInstant
+ if err := json.Unmarshal(payload, &pi.Result); err != nil {
+ b.Fatalf(err.Error())
+ }
+ b.Run("Instant", func(b *testing.B) {
+ for i := 0; i < b.N; i++ {
+ _, _ = pi.metrics()
+ }
+ })
+}
diff --git a/app/vmalert/datasource/vm_test.go b/app/vmalert/datasource/vm_test.go
index 1932b892de..e9d7287638 100644
--- a/app/vmalert/datasource/vm_test.go
+++ b/app/vmalert/datasource/vm_test.go
@@ -7,6 +7,7 @@ import (
"net/http/httptest"
"net/url"
"reflect"
+ "sort"
"strconv"
"strings"
"testing"
@@ -74,7 +75,7 @@ func TestVMInstantQuery(t *testing.T) {
case 5:
w.Write([]byte(`{"status":"success","data":{"resultType":"matrix"}}`))
case 6:
- w.Write([]byte(`{"status":"success","data":{"resultType":"vector","result":[{"metric":{"__name__":"vm_rows"},"value":[1583786142,"13763"]},{"metric":{"__name__":"vm_requests"},"value":[1583786140,"2000"]}]}}`))
+ w.Write([]byte(`{"status":"success","data":{"resultType":"vector","result":[{"metric":{"__name__":"vm_rows","foo":"bar"},"value":[1583786142,"13763"]},{"metric":{"__name__":"vm_requests","foo":"baz"},"value":[1583786140,"2000"]}]}}`))
case 7:
w.Write([]byte(`{"status":"success","data":{"resultType":"scalar","result":[1583786142, "1"]}}`))
}
@@ -115,19 +116,17 @@ func TestVMInstantQuery(t *testing.T) {
}
expected := []Metric{
{
- Labels: []Label{{Value: "vm_rows", Name: "__name__"}},
+ Labels: []Label{{Value: "vm_rows", Name: "__name__"}, {Value: "bar", Name: "foo"}},
Timestamps: []int64{1583786142},
Values: []float64{13763},
},
{
- Labels: []Label{{Value: "vm_requests", Name: "__name__"}},
+ Labels: []Label{{Value: "vm_requests", Name: "__name__"}, {Value: "baz", Name: "foo"}},
Timestamps: []int64{1583786140},
Values: []float64{2000},
},
}
- if !reflect.DeepEqual(m, expected) {
- t.Fatalf("unexpected metric %+v want %+v", m, expected)
- }
+ metricsEqual(t, m, expected)
m, req, err := pq.Query(ctx, query, ts) // 7 - scalar
if err != nil {
@@ -158,13 +157,36 @@ func TestVMInstantQuery(t *testing.T) {
if len(m) != 1 {
t.Fatalf("expected 1 metric got %d in %+v", len(m), m)
}
- exp := Metric{
- Labels: []Label{{Value: "constantLine(10)", Name: "name"}},
- Timestamps: []int64{1611758403},
- Values: []float64{10},
+ exp := []Metric{
+ {
+ Labels: []Label{{Value: "constantLine(10)", Name: "name"}},
+ Timestamps: []int64{1611758403},
+ Values: []float64{10},
+ },
}
- if !reflect.DeepEqual(m[0], exp) {
- t.Fatalf("unexpected metric %+v want %+v", m[0], expected)
+ metricsEqual(t, m, exp)
+}
+
+func metricsEqual(t *testing.T, gotM, expectedM []Metric) {
+ for i, exp := range expectedM {
+ got := gotM[i]
+ gotTS, expTS := got.Timestamps, exp.Timestamps
+ if !reflect.DeepEqual(gotTS, expTS) {
+ t.Fatalf("unexpected timestamps %+v want %+v", gotTS, expTS)
+ }
+ gotV, expV := got.Values, exp.Values
+ if !reflect.DeepEqual(gotV, expV) {
+ t.Fatalf("unexpected values %+v want %+v", gotV, expV)
+ }
+ sort.Slice(got.Labels, func(i, j int) bool {
+ return got.Labels[i].Name < got.Labels[j].Name
+ })
+ sort.Slice(exp.Labels, func(i, j int) bool {
+ return exp.Labels[i].Name < exp.Labels[j].Name
+ })
+ if !reflect.DeepEqual(exp.Labels, got.Labels) {
+ t.Fatalf("unexpected labels %+v want %+v", got.Labels, exp.Labels)
+ }
}
}
From 6801b37e538b3e55e0c7dc1afdc516adf2015ec1 Mon Sep 17 00:00:00 2001
From: Roman Khavronenko
Date: Mon, 5 Dec 2022 08:35:33 +0100
Subject: [PATCH 21/38] dashboards: add `Disk space usage %` and `Disk space
usage % by type` panels (#3436)
The new panels have been added to the vmstorage and drilldown rows.
`Disk space usage %` is supposed to show disk space usage percentage.
This panel is now also referred by `DiskRunsOutOfSpace` alerting rule.
This panel has Drilldown option to show absolute values.
`Disk space usage % by type` shows the relation between datapoints
and indexdb size. It supposed to help identify cases when indexdb
starts to take too much disk space.
This panel has Drilldown option to show absolute values.
Signed-off-by: hagen1778
---
dashboards/victoriametrics-cluster.json | 507 ++++++++++++++++++------
deployment/docker/alerts-cluster.yml | 2 +-
2 files changed, 392 insertions(+), 117 deletions(-)
diff --git a/dashboards/victoriametrics-cluster.json b/dashboards/victoriametrics-cluster.json
index 75be1b925e..1274cd6f27 100644
--- a/dashboards/victoriametrics-cluster.json
+++ b/dashboards/victoriametrics-cluster.json
@@ -1612,8 +1612,7 @@
"mode": "absolute",
"steps": [
{
- "color": "green",
- "value": null
+ "color": "green"
},
{
"color": "red",
@@ -1629,7 +1628,7 @@
"h": 8,
"w": 12,
"x": 0,
- "y": 14
+ "y": 30
},
"id": 66,
"links": [],
@@ -1724,8 +1723,7 @@
"mode": "absolute",
"steps": [
{
- "color": "green",
- "value": null
+ "color": "green"
},
{
"color": "red",
@@ -1741,7 +1739,7 @@
"h": 8,
"w": 12,
"x": 12,
- "y": 14
+ "y": 30
},
"id": 138,
"links": [],
@@ -1835,8 +1833,7 @@
"mode": "absolute",
"steps": [
{
- "color": "green",
- "value": null
+ "color": "green"
},
{
"color": "red",
@@ -1852,7 +1849,7 @@
"h": 8,
"w": 12,
"x": 0,
- "y": 22
+ "y": 38
},
"id": 64,
"links": [],
@@ -1942,8 +1939,7 @@
"mode": "absolute",
"steps": [
{
- "color": "green",
- "value": null
+ "color": "green"
},
{
"color": "red",
@@ -1972,7 +1968,7 @@
"h": 8,
"w": 12,
"x": 12,
- "y": 22
+ "y": 38
},
"id": 122,
"links": [],
@@ -2080,8 +2076,7 @@
"mode": "absolute",
"steps": [
{
- "color": "green",
- "value": null
+ "color": "green"
},
{
"color": "red",
@@ -2113,7 +2108,7 @@
"h": 8,
"w": 12,
"x": 0,
- "y": 30
+ "y": 46
},
"id": 117,
"links": [],
@@ -2201,8 +2196,7 @@
"mode": "absolute",
"steps": [
{
- "color": "green",
- "value": null
+ "color": "green"
},
{
"color": "red",
@@ -2218,7 +2212,7 @@
"h": 8,
"w": 12,
"x": 12,
- "y": 30
+ "y": 46
},
"id": 119,
"options": {
@@ -2306,8 +2300,7 @@
"mode": "absolute",
"steps": [
{
- "color": "green",
- "value": null
+ "color": "green"
},
{
"color": "red",
@@ -2323,7 +2316,7 @@
"h": 8,
"w": 12,
"x": 0,
- "y": 38
+ "y": 54
},
"id": 68,
"links": [],
@@ -2411,8 +2404,7 @@
"mode": "absolute",
"steps": [
{
- "color": "green",
- "value": null
+ "color": "green"
},
{
"color": "red",
@@ -2428,7 +2420,7 @@
"h": 8,
"w": 12,
"x": 12,
- "y": 38
+ "y": 54
},
"id": 120,
"options": {
@@ -2516,8 +2508,7 @@
"mode": "absolute",
"steps": [
{
- "color": "green",
- "value": null
+ "color": "green"
},
{
"color": "red",
@@ -2533,7 +2524,7 @@
"h": 8,
"w": 12,
"x": 0,
- "y": 46
+ "y": 62
},
"id": 70,
"links": [],
@@ -2675,7 +2666,7 @@
"h": 8,
"w": 12,
"x": 0,
- "y": 15
+ "y": 31
},
"id": 102,
"options": {
@@ -2789,7 +2780,7 @@
"h": 8,
"w": 12,
"x": 12,
- "y": 15
+ "y": 31
},
"id": 108,
"options": {
@@ -2890,7 +2881,7 @@
"h": 8,
"w": 12,
"x": 0,
- "y": 23
+ "y": 39
},
"id": 142,
"links": [
@@ -3001,7 +2992,7 @@
"h": 8,
"w": 12,
"x": 12,
- "y": 23
+ "y": 39
},
"id": 107,
"options": {
@@ -3100,7 +3091,7 @@
"h": 8,
"w": 12,
"x": 0,
- "y": 31
+ "y": 47
},
"id": 170,
"links": [],
@@ -3206,7 +3197,7 @@
"h": 8,
"w": 12,
"x": 12,
- "y": 31
+ "y": 47
},
"id": 116,
"links": [],
@@ -3308,7 +3299,7 @@
"h": 9,
"w": 12,
"x": 0,
- "y": 39
+ "y": 55
},
"id": 144,
"options": {
@@ -3411,7 +3402,7 @@
"h": 9,
"w": 12,
"x": 12,
- "y": 39
+ "y": 55
},
"id": 58,
"links": [],
@@ -3515,7 +3506,7 @@
"h": 7,
"w": 24,
"x": 0,
- "y": 48
+ "y": 64
},
"id": 183,
"options": {
@@ -3663,7 +3654,7 @@
"h": 9,
"w": 12,
"x": 0,
- "y": 5
+ "y": 21
},
"id": 76,
"links": [],
@@ -3779,7 +3770,7 @@
"h": 9,
"w": 12,
"x": 12,
- "y": 5
+ "y": 21
},
"id": 86,
"links": [],
@@ -3904,7 +3895,7 @@
"h": 8,
"w": 12,
"x": 0,
- "y": 14
+ "y": 30
},
"id": 80,
"links": [],
@@ -4009,7 +4000,7 @@
"h": 8,
"w": 12,
"x": 12,
- "y": 14
+ "y": 30
},
"id": 78,
"links": [],
@@ -4125,7 +4116,7 @@
"h": 8,
"w": 12,
"x": 0,
- "y": 22
+ "y": 38
},
"id": 82,
"options": {
@@ -4232,7 +4223,7 @@
"h": 8,
"w": 12,
"x": 12,
- "y": 22
+ "y": 38
},
"id": 74,
"options": {
@@ -4334,7 +4325,8 @@
"mode": "absolute",
"steps": [
{
- "color": "green"
+ "color": "green",
+ "value": null
},
{
"color": "red",
@@ -4445,7 +4437,8 @@
"mode": "absolute",
"steps": [
{
- "color": "green"
+ "color": "green",
+ "value": null
},
{
"color": "red",
@@ -4557,7 +4550,8 @@
"mode": "absolute",
"steps": [
{
- "color": "green"
+ "color": "green",
+ "value": null
},
{
"color": "red",
@@ -4702,7 +4696,8 @@
"mode": "absolute",
"steps": [
{
- "color": "green"
+ "color": "green",
+ "value": null
},
{
"color": "red",
@@ -4839,7 +4834,8 @@
"mode": "absolute",
"steps": [
{
- "color": "green"
+ "color": "green",
+ "value": null
},
{
"color": "red",
@@ -4942,7 +4938,8 @@
"mode": "absolute",
"steps": [
{
- "color": "green"
+ "color": "green",
+ "value": null
},
{
"color": "red",
@@ -5084,7 +5081,8 @@
"mode": "absolute",
"steps": [
{
- "color": "green"
+ "color": "green",
+ "value": null
},
{
"color": "red",
@@ -5187,7 +5185,8 @@
"mode": "absolute",
"steps": [
{
- "color": "green"
+ "color": "green",
+ "value": null
},
{
"color": "red",
@@ -5246,7 +5245,7 @@
"type": "prometheus",
"uid": "$ds"
},
- "description": "Shows amount of on-disk space occupied by data points.",
+ "description": "Shows the percentage of used disk space. It is recommended to have at least 20% of free disk space for the best performance.",
"fieldConfig": {
"defaults": {
"color": {
@@ -5259,7 +5258,7 @@
"axisPlacement": "auto",
"barAlignment": 0,
"drawStyle": "line",
- "fillOpacity": 10,
+ "fillOpacity": 0,
"gradientMode": "none",
"hideFrom": {
"legend": false,
@@ -5276,20 +5275,27 @@
"spanNulls": false,
"stacking": {
"group": "A",
- "mode": "normal"
+ "mode": "none"
},
"thresholdsStyle": {
- "mode": "off"
+ "mode": "line"
}
},
- "links": [],
+ "links": [
+ {
+ "targetBlank": true,
+ "title": "Drilldown",
+ "url": "/d/oS7Bi_0Wz?viewPanel=200&var-ds=$ds&var-instance=$instance&${__url_time_range}"
+ }
+ ],
"mappings": [],
"min": 0,
"thresholds": {
"mode": "absolute",
"steps": [
{
- "color": "green"
+ "color": "green",
+ "value": null
},
{
"color": "red",
@@ -5297,7 +5303,7 @@
}
]
},
- "unit": "bytes"
+ "unit": "percentunit"
},
"overrides": []
},
@@ -5307,7 +5313,7 @@
"x": 0,
"y": 37
},
- "id": 18,
+ "id": 20,
"links": [],
"options": {
"legend": {
@@ -5324,7 +5330,7 @@
},
"tooltip": {
"mode": "multi",
- "sort": "none"
+ "sort": "desc"
}
},
"pluginVersion": "9.1.0",
@@ -5335,15 +5341,43 @@
"uid": "$ds"
},
"editorMode": "code",
- "expr": "sum(vm_data_size_bytes{job=~\"$job_storage\", instance=~\"$instance\", type!=\"indexdb\"}) ",
+ "expr": "max(\n sum(vm_data_size_bytes{job=~\"$job\", instance=~\"$instance\"}) by(job, instance) /\n (\n sum(vm_free_disk_space_bytes{job=~\"$job\", instance=~\"$instance\"}) by(job, instance) +\n sum(vm_data_size_bytes{job=~\"$job\", instance=~\"$instance\"}) by(job, instance)\n ) \n)",
"format": "time_series",
"intervalFactor": 1,
- "legendFormat": "disk usage",
+ "legendFormat": "max",
"range": true,
"refId": "A"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "$ds"
+ },
+ "editorMode": "code",
+ "expr": "min(\n sum(vm_data_size_bytes{job=~\"$job\", instance=~\"$instance\"}) by(job, instance) /\n (\n sum(vm_free_disk_space_bytes{job=~\"$job\", instance=~\"$instance\"}) by(job, instance) +\n sum(vm_data_size_bytes{job=~\"$job\", instance=~\"$instance\"}) by(job, instance)\n ) \n)",
+ "format": "time_series",
+ "hide": false,
+ "intervalFactor": 1,
+ "legendFormat": "min",
+ "range": true,
+ "refId": "B"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "$ds"
+ },
+ "editorMode": "code",
+ "expr": "avg(\n sum(vm_data_size_bytes{job=~\"$job\", instance=~\"$instance\"}) by(job, instance) /\n (\n sum(vm_free_disk_space_bytes{job=~\"$job\", instance=~\"$instance\"}) by(job, instance) +\n sum(vm_data_size_bytes{job=~\"$job\", instance=~\"$instance\"}) by(job, instance)\n ) \n)",
+ "format": "time_series",
+ "hide": false,
+ "intervalFactor": 1,
+ "legendFormat": "avg",
+ "range": true,
+ "refId": "C"
}
],
- "title": "Disk space usage (datapoints) ($instance)",
+ "title": "Disk space usage % ($instance)",
"type": "timeseries"
},
{
@@ -5394,7 +5428,8 @@
"mode": "absolute",
"steps": [
{
- "color": "green"
+ "color": "green",
+ "value": null
},
{
"color": "red",
@@ -5457,7 +5492,7 @@
"type": "prometheus",
"uid": "$ds"
},
- "description": "Shows amount of on-disk space occupied by inverted index.",
+ "description": "Shows the percentage of used disk space by type: datapoints or indexdb. Normally, indexdb takes much less space comparing to datapoints. But with high churn rate the size of the indexdb could grow significantly.\n\nThe sum of the % can be > 100% since panel shows max % per-job and per-instance. It means different instance can have different ratio between datapoints and indexdb size.",
"fieldConfig": {
"defaults": {
"color": {
@@ -5470,7 +5505,7 @@
"axisPlacement": "auto",
"barAlignment": 0,
"drawStyle": "line",
- "fillOpacity": 10,
+ "fillOpacity": 0,
"gradientMode": "none",
"hideFrom": {
"legend": false,
@@ -5487,28 +5522,31 @@
"spanNulls": false,
"stacking": {
"group": "A",
- "mode": "normal"
+ "mode": "none"
},
"thresholdsStyle": {
- "mode": "off"
+ "mode": "line"
}
},
- "links": [],
+ "links": [
+ {
+ "targetBlank": true,
+ "title": "Drilldown",
+ "url": "/d/oS7Bi_0Wz?viewPanel=201&var-ds=$ds&var-instance=$instance&${__url_time_range}"
+ }
+ ],
"mappings": [],
"min": 0,
"thresholds": {
"mode": "absolute",
"steps": [
{
- "color": "green"
- },
- {
- "color": "red",
- "value": 80
+ "color": "green",
+ "value": null
}
]
},
- "unit": "bytes"
+ "unit": "percentunit"
},
"overrides": []
},
@@ -5518,7 +5556,7 @@
"x": 0,
"y": 45
},
- "id": 20,
+ "id": 202,
"links": [],
"options": {
"legend": {
@@ -5535,7 +5573,7 @@
},
"tooltip": {
"mode": "multi",
- "sort": "none"
+ "sort": "desc"
}
},
"pluginVersion": "9.1.0",
@@ -5546,15 +5584,29 @@
"uid": "$ds"
},
"editorMode": "code",
- "expr": "sum(vm_data_size_bytes{job=~\"$job_storage\", instance=~\"$instance\", type=\"indexdb\"})",
+ "expr": "max(\n sum(vm_data_size_bytes{job=~\"$job\", instance=~\"$instance\", type=\"indexdb\"}) by(job, instance)\n / \n sum(vm_data_size_bytes{job=~\"$job\", instance=~\"$instance\"}) by(job, instance)\n)",
"format": "time_series",
"intervalFactor": 1,
- "legendFormat": "disk usage",
+ "legendFormat": "indexdb",
"range": true,
"refId": "A"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "$ds"
+ },
+ "editorMode": "code",
+ "expr": "max(\n sum(vm_data_size_bytes{job=~\"$job\", instance=~\"$instance\", type!=\"indexdb\"}) by(job, instance)\n / \n sum(vm_data_size_bytes{job=~\"$job\", instance=~\"$instance\"}) by(job, instance)\n)",
+ "format": "time_series",
+ "hide": false,
+ "intervalFactor": 1,
+ "legendFormat": "datapoints",
+ "range": true,
+ "refId": "B"
}
],
- "title": "Disk space usage (index) ($instance)",
+ "title": "Disk space usage % by type ($instance)",
"type": "timeseries"
},
{
@@ -5605,7 +5657,8 @@
"mode": "absolute",
"steps": [
{
- "color": "green"
+ "color": "green",
+ "value": null
},
{
"color": "red",
@@ -5740,7 +5793,8 @@
"mode": "absolute",
"steps": [
{
- "color": "green"
+ "color": "green",
+ "value": null
},
{
"color": "red",
@@ -5755,7 +5809,7 @@
"gridPos": {
"h": 8,
"w": 12,
- "x": 12,
+ "x": 0,
"y": 53
},
"id": 135,
@@ -5862,8 +5916,7 @@
"mode": "absolute",
"steps": [
{
- "color": "green",
- "value": null
+ "color": "green"
},
{
"color": "red",
@@ -5879,7 +5932,7 @@
"h": 8,
"w": 12,
"x": 0,
- "y": 82
+ "y": 98
},
"id": 92,
"links": [],
@@ -5969,8 +6022,7 @@
"mode": "absolute",
"steps": [
{
- "color": "green",
- "value": null
+ "color": "green"
},
{
"color": "red",
@@ -6006,7 +6058,7 @@
"h": 8,
"w": 12,
"x": 12,
- "y": 82
+ "y": 98
},
"id": 95,
"links": [],
@@ -6112,8 +6164,7 @@
"mode": "absolute",
"steps": [
{
- "color": "green",
- "value": null
+ "color": "green"
},
{
"color": "red",
@@ -6129,7 +6180,7 @@
"h": 8,
"w": 12,
"x": 0,
- "y": 90
+ "y": 106
},
"id": 163,
"links": [],
@@ -6257,8 +6308,7 @@
"mode": "absolute",
"steps": [
{
- "color": "green",
- "value": null
+ "color": "green"
},
{
"color": "red",
@@ -6274,7 +6324,7 @@
"h": 8,
"w": 12,
"x": 12,
- "y": 90
+ "y": 106
},
"id": 165,
"links": [],
@@ -6398,8 +6448,7 @@
"mode": "absolute",
"steps": [
{
- "color": "green",
- "value": null
+ "color": "green"
},
{
"color": "red",
@@ -6415,7 +6464,7 @@
"h": 8,
"w": 12,
"x": 0,
- "y": 98
+ "y": 114
},
"id": 178,
"links": [],
@@ -6506,8 +6555,7 @@
"mode": "absolute",
"steps": [
{
- "color": "green",
- "value": null
+ "color": "green"
},
{
"color": "red",
@@ -6523,7 +6571,7 @@
"h": 8,
"w": 12,
"x": 12,
- "y": 98
+ "y": 114
},
"id": 180,
"links": [],
@@ -6630,7 +6678,7 @@
"h": 8,
"w": 12,
"x": 0,
- "y": 106
+ "y": 122
},
"id": 179,
"links": [],
@@ -6737,7 +6785,7 @@
"h": 8,
"w": 12,
"x": 12,
- "y": 106
+ "y": 122
},
"id": 181,
"links": [],
@@ -6855,7 +6903,7 @@
"h": 8,
"w": 24,
"x": 0,
- "y": 114
+ "y": 130
},
"id": 93,
"links": [],
@@ -6991,7 +7039,7 @@
"h": 8,
"w": 12,
"x": 0,
- "y": 8
+ "y": 24
},
"id": 97,
"links": [],
@@ -7117,7 +7165,7 @@
"h": 8,
"w": 12,
"x": 12,
- "y": 8
+ "y": 24
},
"id": 99,
"links": [],
@@ -7241,7 +7289,7 @@
"h": 8,
"w": 12,
"x": 0,
- "y": 16
+ "y": 32
},
"id": 185,
"links": [],
@@ -7385,7 +7433,7 @@
"h": 8,
"w": 12,
"x": 12,
- "y": 16
+ "y": 32
},
"id": 187,
"links": [],
@@ -7523,7 +7571,7 @@
"h": 8,
"w": 12,
"x": 0,
- "y": 24
+ "y": 40
},
"id": 90,
"links": [],
@@ -7631,7 +7679,7 @@
"h": 8,
"w": 12,
"x": 12,
- "y": 24
+ "y": 40
},
"id": 88,
"links": [],
@@ -7738,7 +7786,7 @@
"h": 8,
"w": 12,
"x": 0,
- "y": 32
+ "y": 48
},
"id": 139,
"links": [],
@@ -7845,7 +7893,7 @@
"h": 8,
"w": 12,
"x": 12,
- "y": 32
+ "y": 48
},
"id": 114,
"links": [],
@@ -7911,10 +7959,15 @@
},
"id": 198,
"options": {
+ "code": {
+ "language": "plaintext",
+ "showLineNumbers": false,
+ "showMiniMap": false
+ },
"content": "Drilldown row is used by other panels on the dashboard to show more detailed metrics per-instance.",
"mode": "markdown"
},
- "pluginVersion": "9.1.0",
+ "pluginVersion": "9.2.6",
"transparent": true,
"type": "text"
},
@@ -7966,7 +8019,8 @@
"mode": "absolute",
"steps": [
{
- "color": "green"
+ "color": "green",
+ "value": null
}
]
},
@@ -8067,7 +8121,8 @@
"mode": "absolute",
"steps": [
{
- "color": "green"
+ "color": "green",
+ "value": null
}
]
},
@@ -8168,7 +8223,8 @@
"mode": "absolute",
"steps": [
{
- "color": "green"
+ "color": "green",
+ "value": null
}
]
},
@@ -8271,7 +8327,8 @@
"mode": "absolute",
"steps": [
{
- "color": "green"
+ "color": "green",
+ "value": null
},
{
"color": "red",
@@ -8328,6 +8385,224 @@
],
"title": "Storage full ETA ($instance)",
"type": "timeseries"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "$ds"
+ },
+ "description": "Shows the percentage of used disk space. It is recommended to have at least 20% of free disk space for the best performance.",
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 0,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "line"
+ }
+ },
+ "links": [],
+ "mappings": [],
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ }
+ ]
+ },
+ "unit": "decbytes"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 8,
+ "w": 12,
+ "x": 0,
+ "y": 26
+ },
+ "id": 200,
+ "links": [],
+ "options": {
+ "legend": {
+ "calcs": [
+ "mean",
+ "lastNotNull",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true,
+ "sortBy": "Last *",
+ "sortDesc": true
+ },
+ "tooltip": {
+ "mode": "multi",
+ "sort": "desc"
+ }
+ },
+ "pluginVersion": "9.1.0",
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "$ds"
+ },
+ "editorMode": "code",
+ "expr": "sum(vm_data_size_bytes{job=~\"$job\", instance=~\"$instance\"}) by(job, instance)",
+ "format": "time_series",
+ "intervalFactor": 1,
+ "legendFormat": "",
+ "range": true,
+ "refId": "A"
+ }
+ ],
+ "title": "Disk space usage ($instance)",
+ "type": "timeseries"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "$ds"
+ },
+ "description": "",
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 0,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "line"
+ }
+ },
+ "links": [],
+ "mappings": [],
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ }
+ ]
+ },
+ "unit": "decbytes"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 8,
+ "w": 12,
+ "x": 12,
+ "y": 26
+ },
+ "id": 201,
+ "links": [],
+ "options": {
+ "legend": {
+ "calcs": [
+ "mean",
+ "lastNotNull",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true,
+ "sortBy": "Last *",
+ "sortDesc": true
+ },
+ "tooltip": {
+ "mode": "multi",
+ "sort": "desc"
+ }
+ },
+ "pluginVersion": "9.1.0",
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "$ds"
+ },
+ "editorMode": "code",
+ "expr": "sum(vm_data_size_bytes{job=~\"$job\", instance=~\"$instance\", type=\"indexdb\"}) by(job, instance)",
+ "format": "time_series",
+ "intervalFactor": 1,
+ "legendFormat": "{{job}}:{{instance}} (indexdb)",
+ "range": true,
+ "refId": "A"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "$ds"
+ },
+ "editorMode": "code",
+ "expr": "sum(vm_data_size_bytes{job=~\"$job\", instance=~\"$instance\", type!=\"indexdb\"}) by(job, instance)",
+ "format": "time_series",
+ "hide": false,
+ "intervalFactor": 1,
+ "legendFormat": "{{job}}:{{instance}} (datapoints)",
+ "range": true,
+ "refId": "B"
+ }
+ ],
+ "title": "Disk space usage by type ($instance)",
+ "type": "timeseries"
}
],
"title": "Drilldown",
diff --git a/deployment/docker/alerts-cluster.yml b/deployment/docker/alerts-cluster.yml
index 1a99a08fb4..15c305452c 100644
--- a/deployment/docker/alerts-cluster.yml
+++ b/deployment/docker/alerts-cluster.yml
@@ -43,7 +43,7 @@ groups:
labels:
severity: critical
annotations:
- dashboard: http://localhost:3000/d/oS7Bi_0Wz?viewPanel=110&var-instance={{ $labels.instance }}"
+ dashboard: http://localhost:3000/d/oS7Bi_0Wz?viewPanel=200&var-instance={{ $labels.instance }}"
summary: "Instance {{ $labels.instance }} will run out of disk space soon"
description: "Disk utilisation on instance {{ $labels.instance }} is more than 80%.\n
Having less than 20% of free disk space could cripple merges processes and overall performance.
From 461158a4376ee81856c7423d9752dbf3ed686aa7 Mon Sep 17 00:00:00 2001
From: Yury Molodov
Date: Mon, 5 Dec 2022 08:50:34 +0100
Subject: [PATCH 22/38] fix: add word-break for tooltip (#3437)
---
.../packages/vmui/src/components/Chart/ChartTooltip/style.scss | 1 +
1 file changed, 1 insertion(+)
diff --git a/app/vmui/packages/vmui/src/components/Chart/ChartTooltip/style.scss b/app/vmui/packages/vmui/src/components/Chart/ChartTooltip/style.scss
index 5d1a9fe5e8..640697d83e 100644
--- a/app/vmui/packages/vmui/src/components/Chart/ChartTooltip/style.scss
+++ b/app/vmui/packages/vmui/src/components/Chart/ChartTooltip/style.scss
@@ -76,5 +76,6 @@ $chart-tooltip-y: -1 * ($padding-small + $chart-tooltip-half-icon);
&-info {
display: grid;
grid-gap: 4px;
+ word-break: break-all;
}
}
From e509552e92c9aa23f36d2af4ba2a7c4dc1ce3566 Mon Sep 17 00:00:00 2001
From: Aliaksandr Valialkin
Date: Mon, 5 Dec 2022 01:01:57 -0800
Subject: [PATCH 23/38] vendor: `make vendor-update`
---
go.mod | 62 +-
go.sum | 122 ++--
.../go/compute/internal/version.go | 2 +-
.../go/compute/metadata/CHANGES.md | 7 +
.../go/compute/metadata/metadata.go | 1 +
vendor/cloud.google.com/go/storage/CHANGES.md | 7 +
.../go/storage/grpc_client.go | 33 +-
.../internal/apiv2/stubs/storage.pb.go | 138 ++---
.../go/storage/internal/version.go | 2 +-
vendor/cloud.google.com/go/storage/storage.go | 13 +-
.../github.com/aws/aws-sdk-go-v2/CHANGELOG.md | 568 ++++++++++++++++++
vendor/github.com/aws/aws-sdk-go-v2/Makefile | 1 +
.../aws-sdk-go-v2/aws/go_module_metadata.go | 2 +-
.../aws/protocol/eventstream/CHANGELOG.md | 4 +
.../eventstream/go_module_metadata.go | 2 +-
.../aws/aws-sdk-go-v2/config/CHANGELOG.md | 4 +
.../config/go_module_metadata.go | 2 +-
.../aws-sdk-go-v2/credentials/CHANGELOG.md | 4 +
.../credentials/go_module_metadata.go | 2 +-
.../feature/ec2/imds/CHANGELOG.md | 4 +
.../feature/ec2/imds/go_module_metadata.go | 2 +-
.../feature/s3/manager/CHANGELOG.md | 4 +
.../feature/s3/manager/go_module_metadata.go | 2 +-
.../internal/configsources/CHANGELOG.md | 4 +
.../configsources/go_module_metadata.go | 2 +-
.../internal/endpoints/v2/CHANGELOG.md | 4 +
.../endpoints/v2/go_module_metadata.go | 2 +-
.../aws-sdk-go-v2/internal/ini/CHANGELOG.md | 4 +
.../internal/ini/go_module_metadata.go | 2 +-
.../aws-sdk-go-v2/internal/v4a/CHANGELOG.md | 4 +
.../internal/v4a/go_module_metadata.go | 2 +-
.../github.com/aws/aws-sdk-go-v2/modman.toml | 4 +-
.../internal/accept-encoding/CHANGELOG.md | 4 +
.../accept-encoding/go_module_metadata.go | 2 +-
.../service/internal/checksum/CHANGELOG.md | 4 +
.../internal/checksum/go_module_metadata.go | 2 +-
.../internal/presigned-url/CHANGELOG.md | 4 +
.../presigned-url/go_module_metadata.go | 2 +-
.../service/internal/s3shared/CHANGELOG.md | 4 +
.../internal/s3shared/go_module_metadata.go | 2 +-
.../aws/aws-sdk-go-v2/service/s3/CHANGELOG.md | 4 +
.../service/s3/go_module_metadata.go | 2 +-
.../aws-sdk-go-v2/service/sso/CHANGELOG.md | 4 +
.../service/sso/go_module_metadata.go | 2 +-
.../service/ssooidc/CHANGELOG.md | 4 +
.../service/ssooidc/go_module_metadata.go | 2 +-
.../aws-sdk-go-v2/service/sts/CHANGELOG.md | 4 +
.../service/sts/go_module_metadata.go | 2 +-
.../aws/aws-sdk-go/aws/endpoints/defaults.go | 135 ++++-
.../github.com/aws/aws-sdk-go/aws/version.go | 2 +-
vendor/github.com/aws/smithy-go/CHANGELOG.md | 4 +
vendor/github.com/aws/smithy-go/README.md | 2 +-
.../aws/smithy-go/encoding/xml/doc.go | 2 +-
.../aws/smithy-go/go_module_metadata.go | 2 +-
vendor/github.com/cespare/xxhash/v2/README.md | 31 +-
.../github.com/cespare/xxhash/v2/testall.sh | 10 +
vendor/github.com/cespare/xxhash/v2/xxhash.go | 47 +-
.../cespare/xxhash/v2/xxhash_amd64.s | 308 +++++-----
.../cespare/xxhash/v2/xxhash_arm64.s | 183 ++++++
.../v2/{xxhash_amd64.go => xxhash_asm.go} | 2 +
.../cespare/xxhash/v2/xxhash_other.go | 22 +-
.../cespare/xxhash/v2/xxhash_safe.go | 1 +
.../cespare/xxhash/v2/xxhash_unsafe.go | 3 +-
.../golang/protobuf/ptypes/empty/empty.pb.go | 62 --
.../prometheus/tsdb/chunkenc/histogram.go | 4 +-
vendor/github.com/urfave/cli/v2/app.go | 4 +
vendor/github.com/urfave/cli/v2/command.go | 2 +-
vendor/github.com/urfave/cli/v2/flag.go | 9 +-
.../urfave/cli/v2/godoc-current.txt | 2 +
.../x/sys/windows/syscall_windows.go | 1 +
.../x/sys/windows/zsyscall_windows.go | 7 +
.../golang.org/x/text/unicode/bidi/trieval.go | 12 -
vendor/golang.org/x/time/rate/rate.go | 20 +-
.../protobuf/field_mask/field_mask.go | 23 -
vendor/modules.txt | 64 +-
75 files changed, 1441 insertions(+), 587 deletions(-)
create mode 100644 vendor/github.com/cespare/xxhash/v2/testall.sh
create mode 100644 vendor/github.com/cespare/xxhash/v2/xxhash_arm64.s
rename vendor/github.com/cespare/xxhash/v2/{xxhash_amd64.go => xxhash_asm.go} (73%)
delete mode 100644 vendor/github.com/golang/protobuf/ptypes/empty/empty.pb.go
delete mode 100644 vendor/google.golang.org/genproto/protobuf/field_mask/field_mask.go
diff --git a/go.mod b/go.mod
index 8f6bd3b901..164b550bd8 100644
--- a/go.mod
+++ b/go.mod
@@ -3,7 +3,7 @@ module github.com/VictoriaMetrics/VictoriaMetrics
go 1.19
require (
- cloud.google.com/go/storage v1.28.0
+ cloud.google.com/go/storage v1.28.1
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.2.0
github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.5.1
github.com/VictoriaMetrics/fastcache v1.12.0
@@ -13,19 +13,19 @@ require (
github.com/VictoriaMetrics/fasthttp v1.1.0
github.com/VictoriaMetrics/metrics v1.23.0
github.com/VictoriaMetrics/metricsql v0.49.1
- github.com/aws/aws-sdk-go-v2 v1.17.1
- github.com/aws/aws-sdk-go-v2/config v1.18.3
- github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.42
- github.com/aws/aws-sdk-go-v2/service/s3 v1.29.4
- github.com/cespare/xxhash/v2 v2.1.2
+ github.com/aws/aws-sdk-go-v2 v1.17.2
+ github.com/aws/aws-sdk-go-v2/config v1.18.4
+ github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.43
+ github.com/aws/aws-sdk-go-v2/service/s3 v1.29.5
+ github.com/cespare/xxhash/v2 v2.2.0
github.com/cheggaaa/pb/v3 v3.1.0
github.com/gogo/protobuf v1.3.2
github.com/golang/snappy v0.0.4
github.com/googleapis/gax-go/v2 v2.7.0
github.com/influxdata/influxdb v1.10.0
github.com/klauspost/compress v1.15.12
- github.com/prometheus/prometheus v0.40.4
- github.com/urfave/cli/v2 v2.23.5
+ github.com/prometheus/prometheus v0.40.5
+ github.com/urfave/cli/v2 v2.23.6
github.com/valyala/fastjson v1.6.3
github.com/valyala/fastrand v1.1.0
github.com/valyala/fasttemplate v1.2.2
@@ -33,35 +33,35 @@ require (
github.com/valyala/quicktemplate v1.7.0
golang.org/x/net v0.2.0
golang.org/x/oauth2 v0.2.0
- golang.org/x/sys v0.2.0
+ golang.org/x/sys v0.3.0
google.golang.org/api v0.103.0
gopkg.in/yaml.v2 v2.4.0
)
require (
cloud.google.com/go v0.107.0 // indirect
- cloud.google.com/go/compute v1.12.1 // indirect
- cloud.google.com/go/compute/metadata v0.2.1 // indirect
+ cloud.google.com/go/compute v1.13.0 // indirect
+ cloud.google.com/go/compute/metadata v0.2.2 // indirect
cloud.google.com/go/iam v0.7.0 // indirect
github.com/Azure/azure-sdk-for-go/sdk/internal v1.1.1 // indirect
github.com/VividCortex/ewma v1.2.0 // indirect
github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 // indirect
- github.com/aws/aws-sdk-go v1.44.149 // indirect
- github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.9 // indirect
- github.com/aws/aws-sdk-go-v2/credentials v1.13.3 // indirect
- github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.19 // indirect
- github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.25 // indirect
- github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.19 // indirect
- github.com/aws/aws-sdk-go-v2/internal/ini v1.3.26 // indirect
- github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.16 // indirect
- github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.10 // indirect
- github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.20 // indirect
- github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.19 // indirect
- github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.19 // indirect
- github.com/aws/aws-sdk-go-v2/service/sso v1.11.25 // indirect
- github.com/aws/aws-sdk-go-v2/service/ssooidc v1.13.8 // indirect
- github.com/aws/aws-sdk-go-v2/service/sts v1.17.5 // indirect
- github.com/aws/smithy-go v1.13.4 // indirect
+ github.com/aws/aws-sdk-go v1.44.152 // indirect
+ github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.10 // indirect
+ github.com/aws/aws-sdk-go-v2/credentials v1.13.4 // indirect
+ github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.20 // indirect
+ github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.26 // indirect
+ github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.20 // indirect
+ github.com/aws/aws-sdk-go-v2/internal/ini v1.3.27 // indirect
+ github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.17 // indirect
+ github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.11 // indirect
+ github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.21 // indirect
+ github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.20 // indirect
+ github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.20 // indirect
+ github.com/aws/aws-sdk-go-v2/service/sso v1.11.26 // indirect
+ github.com/aws/aws-sdk-go-v2/service/ssooidc v1.13.9 // indirect
+ github.com/aws/aws-sdk-go-v2/service/sts v1.17.6 // indirect
+ github.com/aws/smithy-go v1.13.5 // indirect
github.com/beorn7/perks v1.0.1 // indirect
github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
@@ -108,13 +108,13 @@ require (
go.opentelemetry.io/otel/trace v1.11.1 // indirect
go.uber.org/atomic v1.10.0 // indirect
go.uber.org/goleak v1.2.0 // indirect
- golang.org/x/exp v0.0.0-20221126150942-6ab00d035af9 // indirect
+ golang.org/x/exp v0.0.0-20221204150635-6dcec336b2bb // indirect
golang.org/x/sync v0.1.0 // indirect
- golang.org/x/text v0.4.0 // indirect
- golang.org/x/time v0.2.0 // indirect
+ golang.org/x/text v0.5.0 // indirect
+ golang.org/x/time v0.3.0 // indirect
golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect
google.golang.org/appengine v1.6.7 // indirect
- google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6 // indirect
+ google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd // indirect
google.golang.org/grpc v1.51.0 // indirect
google.golang.org/protobuf v1.28.1 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
diff --git a/go.sum b/go.sum
index e3f7ed40c4..a942cb491d 100644
--- a/go.sum
+++ b/go.sum
@@ -21,10 +21,10 @@ cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvf
cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=
cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
-cloud.google.com/go/compute v1.12.1 h1:gKVJMEyqV5c/UnpzjjQbo3Rjvvqpr9B1DFSbJC4OXr0=
-cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU=
-cloud.google.com/go/compute/metadata v0.2.1 h1:efOwf5ymceDhK6PKMnnrTHP4pppY5L22mle96M1yP48=
-cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM=
+cloud.google.com/go/compute v1.13.0 h1:AYrLkB8NPdDRslNp4Jxmzrhdr03fUAIDbiGFjLWowoU=
+cloud.google.com/go/compute v1.13.0/go.mod h1:5aPTS0cUNMIc1CE546K+Th6weJUNQErARyZtRXDJ8GE=
+cloud.google.com/go/compute/metadata v0.2.2 h1:aWKAjYaBaOSrpKl57+jnS/3fJRQnxL7TvR/u1VVbt6k=
+cloud.google.com/go/compute/metadata v0.2.2/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM=
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
cloud.google.com/go/iam v0.7.0 h1:k4MuwOsS7zGJJ+QfZ5vBK8SgHBAvYN/23BWsiihJ1vs=
@@ -39,8 +39,8 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo
cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
-cloud.google.com/go/storage v1.28.0 h1:DLrIZ6xkeZX6K70fU/boWx5INJumt6f+nwwWSHXzzGY=
-cloud.google.com/go/storage v1.28.0/go.mod h1:qlgZML35PXA3zoEnIkiPLY4/TOkUleufRlu6qmcf7sI=
+cloud.google.com/go/storage v1.28.1 h1:F5QDG5ChchaAVQhINh24U99OWHURqrW8OmQcGKXcbgI=
+cloud.google.com/go/storage v1.28.1/go.mod h1:Qnisd4CqDdo6BGs2AD5LLnEsmSQ80wQ5ogcBBKhU86Y=
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
github.com/Azure/azure-sdk-for-go v65.0.0+incompatible h1:HzKLt3kIwMm4KeJYTdx9EbjRYTySD/t8i1Ee/W5EGXw=
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.2.0 h1:sVW/AFBTGyJxDaMYlq0ct3jUXTtj12tQ6zE2GZUgVQw=
@@ -89,54 +89,55 @@ github.com/andybalholm/brotli v1.0.2/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu
github.com/andybalholm/brotli v1.0.3/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
github.com/armon/go-metrics v0.3.10 h1:FR+drcQStOe+32sYyJYyZ7FIdgoGGBnwLl+flodp8Uo=
github.com/aws/aws-sdk-go v1.38.35/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro=
-github.com/aws/aws-sdk-go v1.44.149 h1:zTWaUTbSjgMHvwhaQ91s/6ER8wMb3mA8M1GCZFO9QIo=
-github.com/aws/aws-sdk-go v1.44.149/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI=
-github.com/aws/aws-sdk-go-v2 v1.17.1 h1:02c72fDJr87N8RAC2s3Qu0YuvMRZKNZJ9F+lAehCazk=
-github.com/aws/aws-sdk-go-v2 v1.17.1/go.mod h1:JLnGeGONAyi2lWXI1p0PCIOIy333JMVK1U7Hf0aRFLw=
-github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.9 h1:RKci2D7tMwpvGpDNZnGQw9wk6v7o/xSwFcUAuNPoB8k=
-github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.9/go.mod h1:vCmV1q1VK8eoQJ5+aYE7PkK1K6v41qJ5pJdK3ggCDvg=
-github.com/aws/aws-sdk-go-v2/config v1.18.3 h1:3kfBKcX3votFX84dm00U8RGA1sCCh3eRMOGzg5dCWfU=
-github.com/aws/aws-sdk-go-v2/config v1.18.3/go.mod h1:BYdrbeCse3ZnOD5+2/VE/nATOK8fEUpBtmPMdKSyhMU=
-github.com/aws/aws-sdk-go-v2/credentials v1.13.3 h1:ur+FHdp4NbVIv/49bUjBW+FE7e57HOo03ELodttmagk=
-github.com/aws/aws-sdk-go-v2/credentials v1.13.3/go.mod h1:/rOMmqYBcFfNbRPU0iN9IgGqD5+V2yp3iWNmIlz0wI4=
-github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.19 h1:E3PXZSI3F2bzyj6XxUXdTIfvp425HHhwKsFvmzBwHgs=
-github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.19/go.mod h1:VihW95zQpeKQWVPGkwT+2+WJNQV8UXFfMTWdU6VErL8=
-github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.42 h1:bxgBYvvBh+W1RnNYP4ROXEB8N+HSSucDszfE7Rb+kfU=
-github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.42/go.mod h1:LHOsygMiW/14CkFxdXxvzKyMh3jbk/QfZVaDtCbLkl8=
-github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.25 h1:nBO/RFxeq/IS5G9Of+ZrgucRciie2qpLy++3UGZ+q2E=
-github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.25/go.mod h1:Zb29PYkf42vVYQY6pvSyJCJcFHlPIiY+YKdPtwnvMkY=
-github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.19 h1:oRHDrwCTVT8ZXi4sr9Ld+EXk7N/KGssOr2ygNeojEhw=
-github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.19/go.mod h1:6Q0546uHDp421okhmmGfbxzq2hBqbXFNpi4k+Q1JnQA=
-github.com/aws/aws-sdk-go-v2/internal/ini v1.3.26 h1:Mza+vlnZr+fPKFKRq/lKGVvM6B/8ZZmNdEopOwSQLms=
-github.com/aws/aws-sdk-go-v2/internal/ini v1.3.26/go.mod h1:Y2OJ+P+MC1u1VKnavT+PshiEuGPyh/7DqxoDNij4/bg=
-github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.16 h1:2EXB7dtGwRYIN3XQ9qwIW504DVbKIw3r89xQnonGdsQ=
-github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.16/go.mod h1:XH+3h395e3WVdd6T2Z3mPxuI+x/HVtdqVOREkTiyubs=
-github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.10 h1:dpiPHgmFstgkLG07KaYAewvuptq5kvo52xn7tVSrtrQ=
-github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.10/go.mod h1:9cBNUHI2aW4ho0A5T87O294iPDuuUOSIEDjnd1Lq/z0=
-github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.20 h1:KSvtm1+fPXE0swe9GPjc6msyrdTT0LB/BP8eLugL1FI=
-github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.20/go.mod h1:Mp4XI/CkWGD79AQxZ5lIFlgvC0A+gl+4BmyG1F+SfNc=
-github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.19 h1:GE25AWCdNUPh9AOJzI9KIJnja7IwUc1WyUqz/JTyJ/I=
-github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.19/go.mod h1:02CP6iuYP+IVnBX5HULVdSAku/85eHB2Y9EsFhrkEwU=
-github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.19 h1:piDBAaWkaxkkVV3xJJbTehXCZRXYs49kvpi/LG6LR2o=
-github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.19/go.mod h1:BmQWRVkLTmyNzYPFAZgon53qKLWBNSvonugD1MrSWUs=
-github.com/aws/aws-sdk-go-v2/service/s3 v1.29.4 h1:QgmmWifaYZZcpaw3y1+ccRlgH6jAvLm4K/MBGUc7cNM=
-github.com/aws/aws-sdk-go-v2/service/s3 v1.29.4/go.mod h1:/NHbqPRiwxSPVOB2Xr+StDEH+GWV/64WwnUjv4KYzV0=
-github.com/aws/aws-sdk-go-v2/service/sso v1.11.25 h1:GFZitO48N/7EsFDt8fMa5iYdmWqkUDDB3Eje6z3kbG0=
-github.com/aws/aws-sdk-go-v2/service/sso v1.11.25/go.mod h1:IARHuzTXmj1C0KS35vboR0FeJ89OkEy1M9mWbK2ifCI=
-github.com/aws/aws-sdk-go-v2/service/ssooidc v1.13.8 h1:jcw6kKZrtNfBPJkaHrscDOZoe5gvi9wjudnxvozYFJo=
-github.com/aws/aws-sdk-go-v2/service/ssooidc v1.13.8/go.mod h1:er2JHN+kBY6FcMfcBBKNGCT3CarImmdFzishsqBmSRI=
-github.com/aws/aws-sdk-go-v2/service/sts v1.17.5 h1:60SJ4lhvn///8ygCzYy2l53bFW/Q15bVfyjyAWo6zuw=
-github.com/aws/aws-sdk-go-v2/service/sts v1.17.5/go.mod h1:bXcN3koeVYiJcdDU89n3kCYILob7Y34AeLopUbZgLT4=
-github.com/aws/smithy-go v1.13.4 h1:/RN2z1txIJWeXeOkzX+Hk/4Uuvv7dWtCjbmVJcrskyk=
-github.com/aws/smithy-go v1.13.4/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA=
+github.com/aws/aws-sdk-go v1.44.152 h1:L9aaepO8wHB67gwuGD8VgIYH/cmQDxieCt7FeLa0+fI=
+github.com/aws/aws-sdk-go v1.44.152/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI=
+github.com/aws/aws-sdk-go-v2 v1.17.2 h1:r0yRZInwiPBNpQ4aDy/Ssh3ROWsGtKDwar2JS8Lm+N8=
+github.com/aws/aws-sdk-go-v2 v1.17.2/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw=
+github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.10 h1:dK82zF6kkPeCo8J1e+tGx4JdvDIQzj7ygIoLg8WMuGs=
+github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.10/go.mod h1:VeTZetY5KRJLuD/7fkQXMU6Mw7H5m/KP2J5Iy9osMno=
+github.com/aws/aws-sdk-go-v2/config v1.18.4 h1:VZKhr3uAADXHStS/Gf9xSYVmmaluTUfkc0dcbPiDsKE=
+github.com/aws/aws-sdk-go-v2/config v1.18.4/go.mod h1:EZxMPLSdGAZ3eAmkqXfYbRppZJTzFTkv8VyEzJhKko4=
+github.com/aws/aws-sdk-go-v2/credentials v1.13.4 h1:nEbHIyJy7mCvQ/kzGG7VWHSBpRB4H6sJy3bWierWUtg=
+github.com/aws/aws-sdk-go-v2/credentials v1.13.4/go.mod h1:/Cj5w9LRsNTLSwexsohwDME32OzJ6U81Zs33zr2ZWOM=
+github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.20 h1:tpNOglTZ8kg9T38NpcGBxudqfUAwUzyUnLQ4XSd0CHE=
+github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.20/go.mod h1:d9xFpWd3qYwdIXM0fvu7deD08vvdRXyc/ueV+0SqaWE=
+github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.43 h1:+bkAMTd5OGyHu2nwNOangjEsP65fR0uhMbZJA52sZ64=
+github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.43/go.mod h1:sS2tu0VEspKuY5eM1vQgy7P/hpZX8F62o6qsghZExWc=
+github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.26 h1:5WU31cY7m0tG+AiaXuXGoMzo2GBQ1IixtWa8Yywsgco=
+github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.26/go.mod h1:2E0LdbJW6lbeU4uxjum99GZzI0ZjDpAb0CoSCM0oeEY=
+github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.20 h1:WW0qSzDWoiWU2FS5DbKpxGilFVlCEJPwx4YtjdfI0Jw=
+github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.20/go.mod h1:/+6lSiby8TBFpTVXZgKiN/rCfkYXEGvhlM4zCgPpt7w=
+github.com/aws/aws-sdk-go-v2/internal/ini v1.3.27 h1:N2eKFw2S+JWRCtTt0IhIX7uoGGQciD4p6ba+SJv4WEU=
+github.com/aws/aws-sdk-go-v2/internal/ini v1.3.27/go.mod h1:RdwFVc7PBYWY33fa2+8T1mSqQ7ZEK4ILpM0wfioDC3w=
+github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.17 h1:5tXbMJ7Jq0iG65oiMg6tCLsHkSaO2xLXa2EmZ29vaTA=
+github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.17/go.mod h1:twV0fKMQuqLY4klyFH56aXNq3AFiA5LO0/frTczEOFE=
+github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.11 h1:y2+VQzC6Zh2ojtV2LoC0MNwHWc6qXv/j2vrQtlftkdA=
+github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.11/go.mod h1:iV4q2hsqtNECrfmlXyord9u4zyuFEJX9eLgLpSPzWA8=
+github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.21 h1:77b1GfaSuIok5yB/3HYbG+ypWvOJDQ2rVdq943D17R4=
+github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.21/go.mod h1:sPOz31BVdqeeurKEuUpLNSve4tdCNPluE+070HNcEHI=
+github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.20 h1:jlgyHbkZQAgAc7VIxJDmtouH8eNjOk2REVAQfVhdaiQ=
+github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.20/go.mod h1:Xs52xaLBqDEKRcAfX/hgjmD3YQ7c/W+BEyfamlO/W2E=
+github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.20 h1:4K6dbmR0mlp3o4Bo78PnpvzHtYAqEeVMguvEenpMGsI=
+github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.20/go.mod h1:1XpDcReIEOHsjwNToDKhIAO3qwLo1BnfbtSqWJa8j7g=
+github.com/aws/aws-sdk-go-v2/service/s3 v1.29.5 h1:nRSEQj1JergKTVc8RGkhZvOEGgcvo4fWpDPwGDeg2ok=
+github.com/aws/aws-sdk-go-v2/service/s3 v1.29.5/go.mod h1:wcaJTmjKFDW0s+Se55HBNIds6ghdAGoDDw+SGUdrfAk=
+github.com/aws/aws-sdk-go-v2/service/sso v1.11.26 h1:ActQgdTNQej/RuUJjB9uxYVLDOvRGtUreXF8L3c8wyg=
+github.com/aws/aws-sdk-go-v2/service/sso v1.11.26/go.mod h1:uB9tV79ULEZUXc6Ob18A46KSQ0JDlrplPni9XW6Ot60=
+github.com/aws/aws-sdk-go-v2/service/ssooidc v1.13.9 h1:wihKuqYUlA2T/Rx+yu2s6NDAns8B9DgnRooB1PVhY+Q=
+github.com/aws/aws-sdk-go-v2/service/ssooidc v1.13.9/go.mod h1:2E/3D/mB8/r2J7nK42daoKP/ooCwbf0q1PznNc+DZTU=
+github.com/aws/aws-sdk-go-v2/service/sts v1.17.6 h1:VQFOLQVL3BrKM/NLO/7FiS4vcp5bqK0mGMyk09xLoAY=
+github.com/aws/aws-sdk-go-v2/service/sts v1.17.6/go.mod h1:Az3OXXYGyfNwQNsK/31L4R75qFYnO641RZGAoV3uH1c=
+github.com/aws/smithy-go v1.13.5 h1:hgz0X/DX0dGqTYpGALqXJoRKRj5oQ7150i5FdTePzO8=
+github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA=
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
-github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE=
github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
+github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/cheggaaa/pb/v3 v3.1.0 h1:3uouEsl32RL7gTiQsuaXD4Bzbfl5tGztXGUvXbs4O04=
github.com/cheggaaa/pb/v3 v3.1.0/go.mod h1:YjrevcBqadFDaGQKRdmZxTY42pXEqda48Ea3lt0K/BE=
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
@@ -407,8 +408,8 @@ github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1
github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo=
github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4=
-github.com/prometheus/prometheus v0.40.4 h1:6aLtQSvnhmC/uo5Tx910AQm3Fxq1nzaJA6uiYtsA6So=
-github.com/prometheus/prometheus v0.40.4/go.mod h1:bxgdmtoSNLmmIVPGmeTJ3OiP67VmuY4yalE4ZP6L/j8=
+github.com/prometheus/prometheus v0.40.5 h1:wmk5yNrQlkQ2OvZucMhUB4k78AVfG34szb1UtopS8Vc=
+github.com/prometheus/prometheus v0.40.5/go.mod h1:bxgdmtoSNLmmIVPGmeTJ3OiP67VmuY4yalE4ZP6L/j8=
github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
github.com/rivo/uniseg v0.4.3 h1:utMvzDsuh3suAEnhH0RdHmoPbU648o6CvXxTx4SBMOw=
@@ -434,8 +435,8 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
-github.com/urfave/cli/v2 v2.23.5 h1:xbrU7tAYviSpqeR3X4nEFWUdB/uDZ6DE+HxmRU7Xtyw=
-github.com/urfave/cli/v2 v2.23.5/go.mod h1:GHupkWPMM0M/sj1a2b4wUrWBPzazNrIjouW6fmdJLxc=
+github.com/urfave/cli/v2 v2.23.6 h1:iWmtKD+prGo1nKUtLO0Wg4z9esfBM4rAV4QRLQiEmJ4=
+github.com/urfave/cli/v2 v2.23.6/go.mod h1:GHupkWPMM0M/sj1a2b4wUrWBPzazNrIjouW6fmdJLxc=
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
github.com/valyala/fasthttp v1.30.0/go.mod h1:2rsYD01CKFrjjsvFxx75KlEUNpWNBY9JWD3K/7o2Cus=
@@ -498,8 +499,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0
golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
-golang.org/x/exp v0.0.0-20221126150942-6ab00d035af9 h1:yZNXmy+j/JpX19vZkVktWqAo7Gny4PBWYYK3zskGpx4=
-golang.org/x/exp v0.0.0-20221126150942-6ab00d035af9/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc=
+golang.org/x/exp v0.0.0-20221204150635-6dcec336b2bb h1:QIsP/NmClBICkqnJ4rSIhnrGiGR7Yv9ZORGGnmmLTPk=
+golang.org/x/exp v0.0.0-20221204150635-6dcec336b2bb/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc=
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
@@ -634,8 +635,8 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.2.0 h1:ljd4t30dBnAvMZaQCevtY0xLLD0A+bRZXbgLMLU1F/A=
-golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.3.0 h1:w8ZOecv6NaNa/zC8944JTU3vz4u6Lagfk4RPQxv92NQ=
+golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
@@ -647,13 +648,14 @@ golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
-golang.org/x/text v0.4.0 h1:BrVqGRd7+k1DiOgtnFvAkoQEWQvBc25ouMJM6429SFg=
golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
+golang.org/x/text v0.5.0 h1:OLmvp0KP+FVG99Ct/qFiL/Fhk4zp4QQnZ7b2U+5piUM=
+golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/time v0.2.0 h1:52I/1L54xyEQAYdtcSuxtiT84KGYTBGXwayxmIpNJhE=
-golang.org/x/time v0.2.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=
+golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
@@ -759,8 +761,8 @@ google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7Fc
google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6 h1:a2S6M0+660BgMNl++4JPlcAO/CjkqYItDEZwkoDQK7c=
-google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg=
+google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd h1:OjndDrsik+Gt+e6fs45z9AxiewiKyLKYpA45W5Kpkks=
+google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd/go.mod h1:cTsE614GARnxrLsqKREzmNYJACSWWpAWdNMwnD7c2BE=
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
diff --git a/vendor/cloud.google.com/go/compute/internal/version.go b/vendor/cloud.google.com/go/compute/internal/version.go
index 5ac4a843e1..efedadbea2 100644
--- a/vendor/cloud.google.com/go/compute/internal/version.go
+++ b/vendor/cloud.google.com/go/compute/internal/version.go
@@ -15,4 +15,4 @@
package internal
// Version is the current tagged release of the library.
-const Version = "1.12.1"
+const Version = "1.13.0"
diff --git a/vendor/cloud.google.com/go/compute/metadata/CHANGES.md b/vendor/cloud.google.com/go/compute/metadata/CHANGES.md
index 8631b6d6d2..6e3ee8d6ab 100644
--- a/vendor/cloud.google.com/go/compute/metadata/CHANGES.md
+++ b/vendor/cloud.google.com/go/compute/metadata/CHANGES.md
@@ -1,5 +1,12 @@
# Changes
+## [0.2.2](https://github.com/googleapis/google-cloud-go/compare/compute/metadata/v0.2.1...compute/metadata/v0.2.2) (2022-12-01)
+
+
+### Bug Fixes
+
+* **compute/metadata:** Set IdleConnTimeout for http.Client ([#7084](https://github.com/googleapis/google-cloud-go/issues/7084)) ([766516a](https://github.com/googleapis/google-cloud-go/commit/766516aaf3816bfb3159efeea65aa3d1d205a3e2)), refs [#5430](https://github.com/googleapis/google-cloud-go/issues/5430)
+
## [0.1.0] (2022-10-26)
Initial release of metadata being it's own module.
diff --git a/vendor/cloud.google.com/go/compute/metadata/metadata.go b/vendor/cloud.google.com/go/compute/metadata/metadata.go
index 50538b1d34..d4aad9bf39 100644
--- a/vendor/cloud.google.com/go/compute/metadata/metadata.go
+++ b/vendor/cloud.google.com/go/compute/metadata/metadata.go
@@ -70,6 +70,7 @@ func newDefaultHTTPClient() *http.Client {
Timeout: 2 * time.Second,
KeepAlive: 30 * time.Second,
}).Dial,
+ IdleConnTimeout: 60 * time.Second,
},
Timeout: 5 * time.Second,
}
diff --git a/vendor/cloud.google.com/go/storage/CHANGES.md b/vendor/cloud.google.com/go/storage/CHANGES.md
index 580202cf84..f12da250ef 100644
--- a/vendor/cloud.google.com/go/storage/CHANGES.md
+++ b/vendor/cloud.google.com/go/storage/CHANGES.md
@@ -1,6 +1,13 @@
# Changes
+## [1.28.1](https://github.com/googleapis/google-cloud-go/compare/storage/v1.28.0...storage/v1.28.1) (2022-12-02)
+
+
+### Bug Fixes
+
+* **storage:** downgrade some dependencies ([7540152](https://github.com/googleapis/google-cloud-go/commit/754015236d5af7c82a75da218b71a87b9ead6eb5))
+
## [1.28.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.27.0...storage/v1.28.0) (2022-11-03)
diff --git a/vendor/cloud.google.com/go/storage/grpc_client.go b/vendor/cloud.google.com/go/storage/grpc_client.go
index f1e551b6fd..4a44cee8b6 100644
--- a/vendor/cloud.google.com/go/storage/grpc_client.go
+++ b/vendor/cloud.google.com/go/storage/grpc_client.go
@@ -792,14 +792,15 @@ func (c *grpcStorageClient) RewriteObject(ctx context.Context, req *rewriteObjec
s := callSettings(c.settings, opts...)
obj := req.dstObject.attrs.toProtoObject("")
call := &storagepb.RewriteObjectRequest{
- SourceBucket: bucketResourceName(globalProjectAlias, req.srcObject.bucket),
- SourceObject: req.srcObject.name,
- RewriteToken: req.token,
- DestinationBucket: bucketResourceName(globalProjectAlias, req.dstObject.bucket),
- DestinationName: req.dstObject.name,
- Destination: obj,
- DestinationKmsKey: req.dstObject.keyName,
- DestinationPredefinedAcl: req.predefinedACL,
+ SourceBucket: bucketResourceName(globalProjectAlias, req.srcObject.bucket),
+ SourceObject: req.srcObject.name,
+ RewriteToken: req.token,
+ DestinationBucket: bucketResourceName(globalProjectAlias, req.dstObject.bucket),
+ DestinationName: req.dstObject.name,
+ Destination: obj,
+ DestinationKmsKey: req.dstObject.keyName,
+ DestinationPredefinedAcl: req.predefinedACL,
+ CommonObjectRequestParams: toProtoCommonObjectRequestParams(req.dstObject.encryptionKey),
}
// The userProject, whether source or destination project, is decided by the code calling the interface.
@@ -863,10 +864,10 @@ func (c *grpcStorageClient) NewRangeReader(ctx context.Context, params *newRange
}
b := bucketResourceName(globalProjectAlias, params.bucket)
- // TODO(noahdietz): Use encryptionKey to set relevant request fields.
req := &storagepb.ReadObjectRequest{
- Bucket: b,
- Object: params.object,
+ Bucket: b,
+ Object: params.object,
+ CommonObjectRequestParams: toProtoCommonObjectRequestParams(params.encryptionKey),
}
// The default is a negative value, which means latest.
if params.gen >= 0 {
@@ -1008,8 +1009,6 @@ func (c *grpcStorageClient) OpenWriter(params *openWriterParams, opts ...storage
return
}
- // TODO(noahdietz): Send encryption key via CommonObjectRequestParams.
-
// The chunk buffer is full, but there is no end in sight. This
// means that a resumable upload will need to be used to send
// multiple chunks, until we are done reading data. Start a
@@ -1499,7 +1498,8 @@ func (w *gRPCWriter) startResumableUpload() error {
}
return run(w.ctx, func() error {
upres, err := w.c.raw.StartResumableWrite(w.ctx, &storagepb.StartResumableWriteRequest{
- WriteObjectSpec: spec,
+ WriteObjectSpec: spec,
+ CommonObjectRequestParams: toProtoCommonObjectRequestParams(w.encryptionKey),
})
w.upid = upres.GetUploadId()
return err
@@ -1511,7 +1511,9 @@ func (w *gRPCWriter) startResumableUpload() error {
func (w *gRPCWriter) queryProgress() (int64, error) {
var persistedSize int64
err := run(w.ctx, func() error {
- q, err := w.c.raw.QueryWriteStatus(w.ctx, &storagepb.QueryWriteStatusRequest{UploadId: w.upid})
+ q, err := w.c.raw.QueryWriteStatus(w.ctx, &storagepb.QueryWriteStatusRequest{
+ UploadId: w.upid,
+ })
persistedSize = q.GetPersistedSize()
return err
}, w.settings.retry, true, setRetryHeaderGRPC(w.ctx))
@@ -1582,6 +1584,7 @@ func (w *gRPCWriter) uploadBuffer(recvd int, start int64, doneReading bool) (*st
req.FirstMessage = &storagepb.WriteObjectRequest_WriteObjectSpec{
WriteObjectSpec: spec,
}
+ req.CommonObjectRequestParams = toProtoCommonObjectRequestParams(w.encryptionKey)
}
// TODO: Currently the checksums are only sent on the first message
diff --git a/vendor/cloud.google.com/go/storage/internal/apiv2/stubs/storage.pb.go b/vendor/cloud.google.com/go/storage/internal/apiv2/stubs/storage.pb.go
index 13bbdb4c96..c36634b1a1 100644
--- a/vendor/cloud.google.com/go/storage/internal/apiv2/stubs/storage.pb.go
+++ b/vendor/cloud.google.com/go/storage/internal/apiv2/stubs/storage.pb.go
@@ -15,7 +15,7 @@
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.26.0
-// protoc v3.12.2
+// protoc v3.21.9
// source: google/storage/v2/storage.proto
package storage
@@ -25,17 +25,17 @@ import (
reflect "reflect"
sync "sync"
- empty "github.com/golang/protobuf/ptypes/empty"
- timestamp "github.com/golang/protobuf/ptypes/timestamp"
_ "google.golang.org/genproto/googleapis/api/annotations"
v1 "google.golang.org/genproto/googleapis/iam/v1"
date "google.golang.org/genproto/googleapis/type/date"
- field_mask "google.golang.org/genproto/protobuf/field_mask"
grpc "google.golang.org/grpc"
codes "google.golang.org/grpc/codes"
status "google.golang.org/grpc/status"
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+ emptypb "google.golang.org/protobuf/types/known/emptypb"
+ fieldmaskpb "google.golang.org/protobuf/types/known/fieldmaskpb"
+ timestamppb "google.golang.org/protobuf/types/known/timestamppb"
)
const (
@@ -264,7 +264,7 @@ type GetBucketRequest struct {
// Mask specifying which fields to read.
// A "*" field may be used to indicate all fields.
// If no mask is specified, will default to all fields.
- ReadMask *field_mask.FieldMask `protobuf:"bytes,5,opt,name=read_mask,json=readMask,proto3,oneof" json:"read_mask,omitempty"`
+ ReadMask *fieldmaskpb.FieldMask `protobuf:"bytes,5,opt,name=read_mask,json=readMask,proto3,oneof" json:"read_mask,omitempty"`
}
func (x *GetBucketRequest) Reset() {
@@ -320,7 +320,7 @@ func (x *GetBucketRequest) GetIfMetagenerationNotMatch() int64 {
return 0
}
-func (x *GetBucketRequest) GetReadMask() *field_mask.FieldMask {
+func (x *GetBucketRequest) GetReadMask() *fieldmaskpb.FieldMask {
if x != nil {
return x.ReadMask
}
@@ -443,7 +443,7 @@ type ListBucketsRequest struct {
// If no mask is specified, will default to all fields except items.owner,
// items.acl, and items.default_object_acl.
// * may be used to mean "all fields".
- ReadMask *field_mask.FieldMask `protobuf:"bytes,5,opt,name=read_mask,json=readMask,proto3,oneof" json:"read_mask,omitempty"`
+ ReadMask *fieldmaskpb.FieldMask `protobuf:"bytes,5,opt,name=read_mask,json=readMask,proto3,oneof" json:"read_mask,omitempty"`
}
func (x *ListBucketsRequest) Reset() {
@@ -506,7 +506,7 @@ func (x *ListBucketsRequest) GetPrefix() string {
return ""
}
-func (x *ListBucketsRequest) GetReadMask() *field_mask.FieldMask {
+func (x *ListBucketsRequest) GetReadMask() *fieldmaskpb.FieldMask {
if x != nil {
return x.ReadMask
}
@@ -664,7 +664,7 @@ type UpdateBucketRequest struct {
// Not specifying any fields is an error.
// Not specifying a field while setting that field to a non-default value is
// an error.
- UpdateMask *field_mask.FieldMask `protobuf:"bytes,6,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"`
+ UpdateMask *fieldmaskpb.FieldMask `protobuf:"bytes,6,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"`
}
func (x *UpdateBucketRequest) Reset() {
@@ -734,7 +734,7 @@ func (x *UpdateBucketRequest) GetPredefinedDefaultObjectAcl() string {
return ""
}
-func (x *UpdateBucketRequest) GetUpdateMask() *field_mask.FieldMask {
+func (x *UpdateBucketRequest) GetUpdateMask() *fieldmaskpb.FieldMask {
if x != nil {
return x.UpdateMask
}
@@ -1408,7 +1408,7 @@ type ReadObjectRequest struct {
// If no mask is specified, will default to all fields except metadata.owner
// and metadata.acl.
// * may be used to mean "all fields".
- ReadMask *field_mask.FieldMask `protobuf:"bytes,12,opt,name=read_mask,json=readMask,proto3,oneof" json:"read_mask,omitempty"`
+ ReadMask *fieldmaskpb.FieldMask `protobuf:"bytes,12,opt,name=read_mask,json=readMask,proto3,oneof" json:"read_mask,omitempty"`
}
func (x *ReadObjectRequest) Reset() {
@@ -1513,7 +1513,7 @@ func (x *ReadObjectRequest) GetCommonObjectRequestParams() *CommonObjectRequestP
return nil
}
-func (x *ReadObjectRequest) GetReadMask() *field_mask.FieldMask {
+func (x *ReadObjectRequest) GetReadMask() *fieldmaskpb.FieldMask {
if x != nil {
return x.ReadMask
}
@@ -1554,7 +1554,7 @@ type GetObjectRequest struct {
// If no mask is specified, will default to all fields except metadata.acl and
// metadata.owner.
// * may be used to mean "all fields".
- ReadMask *field_mask.FieldMask `protobuf:"bytes,10,opt,name=read_mask,json=readMask,proto3,oneof" json:"read_mask,omitempty"`
+ ReadMask *fieldmaskpb.FieldMask `protobuf:"bytes,10,opt,name=read_mask,json=readMask,proto3,oneof" json:"read_mask,omitempty"`
}
func (x *GetObjectRequest) Reset() {
@@ -1645,7 +1645,7 @@ func (x *GetObjectRequest) GetCommonObjectRequestParams() *CommonObjectRequestPa
return nil
}
-func (x *GetObjectRequest) GetReadMask() *field_mask.FieldMask {
+func (x *GetObjectRequest) GetReadMask() *fieldmaskpb.FieldMask {
if x != nil {
return x.ReadMask
}
@@ -2158,7 +2158,7 @@ type ListObjectsRequest struct {
// If no mask is specified, will default to all fields except items.acl and
// items.owner.
// * may be used to mean "all fields".
- ReadMask *field_mask.FieldMask `protobuf:"bytes,8,opt,name=read_mask,json=readMask,proto3,oneof" json:"read_mask,omitempty"`
+ ReadMask *fieldmaskpb.FieldMask `protobuf:"bytes,8,opt,name=read_mask,json=readMask,proto3,oneof" json:"read_mask,omitempty"`
// Filter results to objects whose names are lexicographically equal to or
// after lexicographic_start. If lexicographic_end is also set, the objects
// listed have names between lexicographic_start (inclusive) and
@@ -2252,7 +2252,7 @@ func (x *ListObjectsRequest) GetVersions() bool {
return false
}
-func (x *ListObjectsRequest) GetReadMask() *field_mask.FieldMask {
+func (x *ListObjectsRequest) GetReadMask() *fieldmaskpb.FieldMask {
if x != nil {
return x.ReadMask
}
@@ -2952,7 +2952,7 @@ type UpdateObjectRequest struct {
// Not specifying any fields is an error.
// Not specifying a field while setting that field to a non-default value is
// an error.
- UpdateMask *field_mask.FieldMask `protobuf:"bytes,7,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"`
+ UpdateMask *fieldmaskpb.FieldMask `protobuf:"bytes,7,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"`
// A set of parameters common to Storage API requests concerning an object.
CommonObjectRequestParams *CommonObjectRequestParams `protobuf:"bytes,8,opt,name=common_object_request_params,json=commonObjectRequestParams,proto3" json:"common_object_request_params,omitempty"`
}
@@ -3031,7 +3031,7 @@ func (x *UpdateObjectRequest) GetPredefinedAcl() string {
return ""
}
-func (x *UpdateObjectRequest) GetUpdateMask() *field_mask.FieldMask {
+func (x *UpdateObjectRequest) GetUpdateMask() *fieldmaskpb.FieldMask {
if x != nil {
return x.UpdateMask
}
@@ -3497,7 +3497,7 @@ type UpdateHmacKeyRequest struct {
// Update mask for hmac_key.
// Not specifying any fields will mean only the `state` field is updated to
// the value specified in `hmac_key`.
- UpdateMask *field_mask.FieldMask `protobuf:"bytes,3,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"`
+ UpdateMask *fieldmaskpb.FieldMask `protobuf:"bytes,3,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"`
}
func (x *UpdateHmacKeyRequest) Reset() {
@@ -3539,7 +3539,7 @@ func (x *UpdateHmacKeyRequest) GetHmacKey() *HmacKeyMetadata {
return nil
}
-func (x *UpdateHmacKeyRequest) GetUpdateMask() *field_mask.FieldMask {
+func (x *UpdateHmacKeyRequest) GetUpdateMask() *fieldmaskpb.FieldMask {
if x != nil {
return x.UpdateMask
}
@@ -3716,14 +3716,14 @@ type Bucket struct {
// Output only. The creation time of the bucket.
// Attempting to set or update this field will result in a
// [FieldViolation][google.rpc.BadRequest.FieldViolation].
- CreateTime *timestamp.Timestamp `protobuf:"bytes,11,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"`
+ CreateTime *timestamppb.Timestamp `protobuf:"bytes,11,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"`
// The bucket's [https://www.w3.org/TR/cors/][Cross-Origin Resource Sharing]
// (CORS) config.
Cors []*Bucket_Cors `protobuf:"bytes,12,rep,name=cors,proto3" json:"cors,omitempty"`
// Output only. The modification time of the bucket.
// Attempting to set or update this field will result in a
// [FieldViolation][google.rpc.BadRequest.FieldViolation].
- UpdateTime *timestamp.Timestamp `protobuf:"bytes,13,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"`
+ UpdateTime *timestamppb.Timestamp `protobuf:"bytes,13,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"`
// The default value for event-based hold on newly created objects in this
// bucket. Event-based hold is a way to retain objects indefinitely until an
// event occurs, signified by the
@@ -3894,7 +3894,7 @@ func (x *Bucket) GetLifecycle() *Bucket_Lifecycle {
return nil
}
-func (x *Bucket) GetCreateTime() *timestamp.Timestamp {
+func (x *Bucket) GetCreateTime() *timestamppb.Timestamp {
if x != nil {
return x.CreateTime
}
@@ -3908,7 +3908,7 @@ func (x *Bucket) GetCors() []*Bucket_Cors {
return nil
}
-func (x *Bucket) GetUpdateTime() *timestamp.Timestamp {
+func (x *Bucket) GetUpdateTime() *timestamppb.Timestamp {
if x != nil {
return x.UpdateTime
}
@@ -4296,9 +4296,9 @@ type HmacKeyMetadata struct {
// Writable, can be updated by UpdateHmacKey operation.
State string `protobuf:"bytes,5,opt,name=state,proto3" json:"state,omitempty"`
// Output only. The creation time of the HMAC key.
- CreateTime *timestamp.Timestamp `protobuf:"bytes,6,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"`
+ CreateTime *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"`
// Output only. The last modification time of the HMAC key metadata.
- UpdateTime *timestamp.Timestamp `protobuf:"bytes,7,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"`
+ UpdateTime *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"`
// The etag of the HMAC key.
Etag string `protobuf:"bytes,8,opt,name=etag,proto3" json:"etag,omitempty"`
}
@@ -4370,14 +4370,14 @@ func (x *HmacKeyMetadata) GetState() string {
return ""
}
-func (x *HmacKeyMetadata) GetCreateTime() *timestamp.Timestamp {
+func (x *HmacKeyMetadata) GetCreateTime() *timestamppb.Timestamp {
if x != nil {
return x.CreateTime
}
return nil
}
-func (x *HmacKeyMetadata) GetUpdateTime() *timestamp.Timestamp {
+func (x *HmacKeyMetadata) GetUpdateTime() *timestamppb.Timestamp {
if x != nil {
return x.UpdateTime
}
@@ -4624,7 +4624,7 @@ type Object struct {
// version of the object has been deleted.
// Attempting to set or update this field will result in a
// [FieldViolation][google.rpc.BadRequest.FieldViolation].
- DeleteTime *timestamp.Timestamp `protobuf:"bytes,12,opt,name=delete_time,json=deleteTime,proto3" json:"delete_time,omitempty"`
+ DeleteTime *timestamppb.Timestamp `protobuf:"bytes,12,opt,name=delete_time,json=deleteTime,proto3" json:"delete_time,omitempty"`
// Content-Type of the object data, matching
// [https://tools.ietf.org/html/rfc7231#section-3.1.1.5][RFC 7231 §3.1.1.5].
// If an object is stored without a Content-Type, it is served as
@@ -4633,7 +4633,7 @@ type Object struct {
// Output only. The creation time of the object.
// Attempting to set or update this field will result in a
// [FieldViolation][google.rpc.BadRequest.FieldViolation].
- CreateTime *timestamp.Timestamp `protobuf:"bytes,14,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"`
+ CreateTime *timestamppb.Timestamp `protobuf:"bytes,14,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"`
// Output only. Number of underlying components that make up this object. Components are
// accumulated by compose operations.
// Attempting to set or update this field will result in a
@@ -4649,7 +4649,7 @@ type Object struct {
// Object Lifecycle Configuration.
// Attempting to set or update this field will result in a
// [FieldViolation][google.rpc.BadRequest.FieldViolation].
- UpdateTime *timestamp.Timestamp `protobuf:"bytes,17,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"`
+ UpdateTime *timestamppb.Timestamp `protobuf:"bytes,17,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"`
// Cloud KMS Key used to encrypt this object, if the object is encrypted by
// such a key.
KmsKey string `protobuf:"bytes,18,opt,name=kms_key,json=kmsKey,proto3" json:"kms_key,omitempty"`
@@ -4657,7 +4657,7 @@ type Object struct {
// object is initially created, it will be set to time_created.
// Attempting to set or update this field will result in a
// [FieldViolation][google.rpc.BadRequest.FieldViolation].
- UpdateStorageClassTime *timestamp.Timestamp `protobuf:"bytes,19,opt,name=update_storage_class_time,json=updateStorageClassTime,proto3" json:"update_storage_class_time,omitempty"`
+ UpdateStorageClassTime *timestamppb.Timestamp `protobuf:"bytes,19,opt,name=update_storage_class_time,json=updateStorageClassTime,proto3" json:"update_storage_class_time,omitempty"`
// Whether an object is under temporary hold. While this flag is set to true,
// the object is protected against deletion and overwrites. A common use case
// of this flag is regulatory investigations where objects need to be retained
@@ -4671,7 +4671,7 @@ type Object struct {
// Note 2: This value can be provided even when temporary hold is set (so that
// the user can reason about policy without having to first unset the
// temporary hold).
- RetentionExpireTime *timestamp.Timestamp `protobuf:"bytes,21,opt,name=retention_expire_time,json=retentionExpireTime,proto3" json:"retention_expire_time,omitempty"`
+ RetentionExpireTime *timestamppb.Timestamp `protobuf:"bytes,21,opt,name=retention_expire_time,json=retentionExpireTime,proto3" json:"retention_expire_time,omitempty"`
// User-provided metadata, in key/value pairs.
Metadata map[string]string `protobuf:"bytes,22,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
// Whether an object is under event-based hold.
@@ -4694,7 +4694,7 @@ type Object struct {
// such a key.
CustomerEncryption *CustomerEncryption `protobuf:"bytes,25,opt,name=customer_encryption,json=customerEncryption,proto3" json:"customer_encryption,omitempty"`
// A user-specified timestamp set on an object.
- CustomTime *timestamp.Timestamp `protobuf:"bytes,26,opt,name=custom_time,json=customTime,proto3" json:"custom_time,omitempty"`
+ CustomTime *timestamppb.Timestamp `protobuf:"bytes,26,opt,name=custom_time,json=customTime,proto3" json:"custom_time,omitempty"`
}
func (x *Object) Reset() {
@@ -4813,7 +4813,7 @@ func (x *Object) GetContentLanguage() string {
return ""
}
-func (x *Object) GetDeleteTime() *timestamp.Timestamp {
+func (x *Object) GetDeleteTime() *timestamppb.Timestamp {
if x != nil {
return x.DeleteTime
}
@@ -4827,7 +4827,7 @@ func (x *Object) GetContentType() string {
return ""
}
-func (x *Object) GetCreateTime() *timestamp.Timestamp {
+func (x *Object) GetCreateTime() *timestamppb.Timestamp {
if x != nil {
return x.CreateTime
}
@@ -4848,7 +4848,7 @@ func (x *Object) GetChecksums() *ObjectChecksums {
return nil
}
-func (x *Object) GetUpdateTime() *timestamp.Timestamp {
+func (x *Object) GetUpdateTime() *timestamppb.Timestamp {
if x != nil {
return x.UpdateTime
}
@@ -4862,7 +4862,7 @@ func (x *Object) GetKmsKey() string {
return ""
}
-func (x *Object) GetUpdateStorageClassTime() *timestamp.Timestamp {
+func (x *Object) GetUpdateStorageClassTime() *timestamppb.Timestamp {
if x != nil {
return x.UpdateStorageClassTime
}
@@ -4876,7 +4876,7 @@ func (x *Object) GetTemporaryHold() bool {
return false
}
-func (x *Object) GetRetentionExpireTime() *timestamp.Timestamp {
+func (x *Object) GetRetentionExpireTime() *timestamppb.Timestamp {
if x != nil {
return x.RetentionExpireTime
}
@@ -4911,7 +4911,7 @@ func (x *Object) GetCustomerEncryption() *CustomerEncryption {
return nil
}
-func (x *Object) GetCustomTime() *timestamp.Timestamp {
+func (x *Object) GetCustomTime() *timestamppb.Timestamp {
if x != nil {
return x.CustomTime
}
@@ -5845,7 +5845,7 @@ type Bucket_RetentionPolicy struct {
// Server-determined value that indicates the time from which policy was
// enforced and effective.
- EffectiveTime *timestamp.Timestamp `protobuf:"bytes,1,opt,name=effective_time,json=effectiveTime,proto3" json:"effective_time,omitempty"`
+ EffectiveTime *timestamppb.Timestamp `protobuf:"bytes,1,opt,name=effective_time,json=effectiveTime,proto3" json:"effective_time,omitempty"`
// Once locked, an object retention policy cannot be modified.
IsLocked bool `protobuf:"varint,2,opt,name=is_locked,json=isLocked,proto3" json:"is_locked,omitempty"`
// The duration in seconds that objects need to be retained. Retention
@@ -5887,7 +5887,7 @@ func (*Bucket_RetentionPolicy) Descriptor() ([]byte, []int) {
return file_google_storage_v2_storage_proto_rawDescGZIP(), []int{40, 6}
}
-func (x *Bucket_RetentionPolicy) GetEffectiveTime() *timestamp.Timestamp {
+func (x *Bucket_RetentionPolicy) GetEffectiveTime() *timestamppb.Timestamp {
if x != nil {
return x.EffectiveTime
}
@@ -6089,7 +6089,7 @@ type Bucket_Autoclass struct {
// disabled/unconfigured or set to false after being enabled. If Autoclass
// is enabled when the bucket is created, the toggle_time is set to the
// bucket creation time.
- ToggleTime *timestamp.Timestamp `protobuf:"bytes,2,opt,name=toggle_time,json=toggleTime,proto3" json:"toggle_time,omitempty"`
+ ToggleTime *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=toggle_time,json=toggleTime,proto3" json:"toggle_time,omitempty"`
}
func (x *Bucket_Autoclass) Reset() {
@@ -6131,7 +6131,7 @@ func (x *Bucket_Autoclass) GetEnabled() bool {
return false
}
-func (x *Bucket_Autoclass) GetToggleTime() *timestamp.Timestamp {
+func (x *Bucket_Autoclass) GetToggleTime() *timestamppb.Timestamp {
if x != nil {
return x.ToggleTime
}
@@ -6150,7 +6150,7 @@ type Bucket_IamConfig_UniformBucketLevelAccess struct {
// The deadline time for changing
// `iamConfig.uniformBucketLevelAccess.enabled` from `true` to `false`.
// Mutable until the specified deadline is reached, but not afterward.
- LockTime *timestamp.Timestamp `protobuf:"bytes,2,opt,name=lock_time,json=lockTime,proto3" json:"lock_time,omitempty"`
+ LockTime *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=lock_time,json=lockTime,proto3" json:"lock_time,omitempty"`
}
func (x *Bucket_IamConfig_UniformBucketLevelAccess) Reset() {
@@ -6192,7 +6192,7 @@ func (x *Bucket_IamConfig_UniformBucketLevelAccess) GetEnabled() bool {
return false
}
-func (x *Bucket_IamConfig_UniformBucketLevelAccess) GetLockTime() *timestamp.Timestamp {
+func (x *Bucket_IamConfig_UniformBucketLevelAccess) GetLockTime() *timestamppb.Timestamp {
if x != nil {
return x.LockTime
}
@@ -8184,13 +8184,13 @@ var file_google_storage_v2_storage_proto_goTypes = []interface{}{
(*Bucket_Lifecycle_Rule_Condition)(nil), // 72: google.storage.v2.Bucket.Lifecycle.Rule.Condition
nil, // 73: google.storage.v2.Notification.CustomAttributesEntry
nil, // 74: google.storage.v2.Object.MetadataEntry
- (*field_mask.FieldMask)(nil), // 75: google.protobuf.FieldMask
- (*timestamp.Timestamp)(nil), // 76: google.protobuf.Timestamp
+ (*fieldmaskpb.FieldMask)(nil), // 75: google.protobuf.FieldMask
+ (*timestamppb.Timestamp)(nil), // 76: google.protobuf.Timestamp
(*date.Date)(nil), // 77: google.type.Date
(*v1.GetIamPolicyRequest)(nil), // 78: google.iam.v1.GetIamPolicyRequest
(*v1.SetIamPolicyRequest)(nil), // 79: google.iam.v1.SetIamPolicyRequest
(*v1.TestIamPermissionsRequest)(nil), // 80: google.iam.v1.TestIamPermissionsRequest
- (*empty.Empty)(nil), // 81: google.protobuf.Empty
+ (*emptypb.Empty)(nil), // 81: google.protobuf.Empty
(*v1.Policy)(nil), // 82: google.iam.v1.Policy
(*v1.TestIamPermissionsResponse)(nil), // 83: google.iam.v1.TestIamPermissionsResponse
}
@@ -9272,7 +9272,7 @@ const _ = grpc.SupportPackageIsVersion6
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type StorageClient interface {
// Permanently deletes an empty bucket.
- DeleteBucket(ctx context.Context, in *DeleteBucketRequest, opts ...grpc.CallOption) (*empty.Empty, error)
+ DeleteBucket(ctx context.Context, in *DeleteBucketRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
// Returns metadata for the specified bucket.
GetBucket(ctx context.Context, in *GetBucketRequest, opts ...grpc.CallOption) (*Bucket, error)
// Creates a new bucket.
@@ -9291,7 +9291,7 @@ type StorageClient interface {
// Updates a bucket. Equivalent to JSON API's storage.buckets.patch method.
UpdateBucket(ctx context.Context, in *UpdateBucketRequest, opts ...grpc.CallOption) (*Bucket, error)
// Permanently deletes a notification subscription.
- DeleteNotification(ctx context.Context, in *DeleteNotificationRequest, opts ...grpc.CallOption) (*empty.Empty, error)
+ DeleteNotification(ctx context.Context, in *DeleteNotificationRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
// View a notification config.
GetNotification(ctx context.Context, in *GetNotificationRequest, opts ...grpc.CallOption) (*Notification, error)
// Creates a notification subscription for a given bucket.
@@ -9306,7 +9306,7 @@ type StorageClient interface {
ComposeObject(ctx context.Context, in *ComposeObjectRequest, opts ...grpc.CallOption) (*Object, error)
// Deletes an object and its metadata. Deletions are permanent if versioning
// is not enabled for the bucket, or if the `generation` parameter is used.
- DeleteObject(ctx context.Context, in *DeleteObjectRequest, opts ...grpc.CallOption) (*empty.Empty, error)
+ DeleteObject(ctx context.Context, in *DeleteObjectRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
// Cancels an in-progress resumable upload.
CancelResumableWrite(ctx context.Context, in *CancelResumableWriteRequest, opts ...grpc.CallOption) (*CancelResumableWriteResponse, error)
// Retrieves an object's metadata.
@@ -9397,7 +9397,7 @@ type StorageClient interface {
// Creates a new HMAC key for the given service account.
CreateHmacKey(ctx context.Context, in *CreateHmacKeyRequest, opts ...grpc.CallOption) (*CreateHmacKeyResponse, error)
// Deletes a given HMAC key. Key must be in an INACTIVE state.
- DeleteHmacKey(ctx context.Context, in *DeleteHmacKeyRequest, opts ...grpc.CallOption) (*empty.Empty, error)
+ DeleteHmacKey(ctx context.Context, in *DeleteHmacKeyRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
// Gets an existing HMAC key metadata for the given id.
GetHmacKey(ctx context.Context, in *GetHmacKeyRequest, opts ...grpc.CallOption) (*HmacKeyMetadata, error)
// Lists HMAC keys under a given project with the additional filters provided.
@@ -9414,8 +9414,8 @@ func NewStorageClient(cc grpc.ClientConnInterface) StorageClient {
return &storageClient{cc}
}
-func (c *storageClient) DeleteBucket(ctx context.Context, in *DeleteBucketRequest, opts ...grpc.CallOption) (*empty.Empty, error) {
- out := new(empty.Empty)
+func (c *storageClient) DeleteBucket(ctx context.Context, in *DeleteBucketRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+ out := new(emptypb.Empty)
err := c.cc.Invoke(ctx, "/google.storage.v2.Storage/DeleteBucket", in, out, opts...)
if err != nil {
return nil, err
@@ -9495,8 +9495,8 @@ func (c *storageClient) UpdateBucket(ctx context.Context, in *UpdateBucketReques
return out, nil
}
-func (c *storageClient) DeleteNotification(ctx context.Context, in *DeleteNotificationRequest, opts ...grpc.CallOption) (*empty.Empty, error) {
- out := new(empty.Empty)
+func (c *storageClient) DeleteNotification(ctx context.Context, in *DeleteNotificationRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+ out := new(emptypb.Empty)
err := c.cc.Invoke(ctx, "/google.storage.v2.Storage/DeleteNotification", in, out, opts...)
if err != nil {
return nil, err
@@ -9540,8 +9540,8 @@ func (c *storageClient) ComposeObject(ctx context.Context, in *ComposeObjectRequ
return out, nil
}
-func (c *storageClient) DeleteObject(ctx context.Context, in *DeleteObjectRequest, opts ...grpc.CallOption) (*empty.Empty, error) {
- out := new(empty.Empty)
+func (c *storageClient) DeleteObject(ctx context.Context, in *DeleteObjectRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+ out := new(emptypb.Empty)
err := c.cc.Invoke(ctx, "/google.storage.v2.Storage/DeleteObject", in, out, opts...)
if err != nil {
return nil, err
@@ -9696,8 +9696,8 @@ func (c *storageClient) CreateHmacKey(ctx context.Context, in *CreateHmacKeyRequ
return out, nil
}
-func (c *storageClient) DeleteHmacKey(ctx context.Context, in *DeleteHmacKeyRequest, opts ...grpc.CallOption) (*empty.Empty, error) {
- out := new(empty.Empty)
+func (c *storageClient) DeleteHmacKey(ctx context.Context, in *DeleteHmacKeyRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
+ out := new(emptypb.Empty)
err := c.cc.Invoke(ctx, "/google.storage.v2.Storage/DeleteHmacKey", in, out, opts...)
if err != nil {
return nil, err
@@ -9735,7 +9735,7 @@ func (c *storageClient) UpdateHmacKey(ctx context.Context, in *UpdateHmacKeyRequ
// StorageServer is the server API for Storage service.
type StorageServer interface {
// Permanently deletes an empty bucket.
- DeleteBucket(context.Context, *DeleteBucketRequest) (*empty.Empty, error)
+ DeleteBucket(context.Context, *DeleteBucketRequest) (*emptypb.Empty, error)
// Returns metadata for the specified bucket.
GetBucket(context.Context, *GetBucketRequest) (*Bucket, error)
// Creates a new bucket.
@@ -9754,7 +9754,7 @@ type StorageServer interface {
// Updates a bucket. Equivalent to JSON API's storage.buckets.patch method.
UpdateBucket(context.Context, *UpdateBucketRequest) (*Bucket, error)
// Permanently deletes a notification subscription.
- DeleteNotification(context.Context, *DeleteNotificationRequest) (*empty.Empty, error)
+ DeleteNotification(context.Context, *DeleteNotificationRequest) (*emptypb.Empty, error)
// View a notification config.
GetNotification(context.Context, *GetNotificationRequest) (*Notification, error)
// Creates a notification subscription for a given bucket.
@@ -9769,7 +9769,7 @@ type StorageServer interface {
ComposeObject(context.Context, *ComposeObjectRequest) (*Object, error)
// Deletes an object and its metadata. Deletions are permanent if versioning
// is not enabled for the bucket, or if the `generation` parameter is used.
- DeleteObject(context.Context, *DeleteObjectRequest) (*empty.Empty, error)
+ DeleteObject(context.Context, *DeleteObjectRequest) (*emptypb.Empty, error)
// Cancels an in-progress resumable upload.
CancelResumableWrite(context.Context, *CancelResumableWriteRequest) (*CancelResumableWriteResponse, error)
// Retrieves an object's metadata.
@@ -9860,7 +9860,7 @@ type StorageServer interface {
// Creates a new HMAC key for the given service account.
CreateHmacKey(context.Context, *CreateHmacKeyRequest) (*CreateHmacKeyResponse, error)
// Deletes a given HMAC key. Key must be in an INACTIVE state.
- DeleteHmacKey(context.Context, *DeleteHmacKeyRequest) (*empty.Empty, error)
+ DeleteHmacKey(context.Context, *DeleteHmacKeyRequest) (*emptypb.Empty, error)
// Gets an existing HMAC key metadata for the given id.
GetHmacKey(context.Context, *GetHmacKeyRequest) (*HmacKeyMetadata, error)
// Lists HMAC keys under a given project with the additional filters provided.
@@ -9873,7 +9873,7 @@ type StorageServer interface {
type UnimplementedStorageServer struct {
}
-func (*UnimplementedStorageServer) DeleteBucket(context.Context, *DeleteBucketRequest) (*empty.Empty, error) {
+func (*UnimplementedStorageServer) DeleteBucket(context.Context, *DeleteBucketRequest) (*emptypb.Empty, error) {
return nil, status.Errorf(codes.Unimplemented, "method DeleteBucket not implemented")
}
func (*UnimplementedStorageServer) GetBucket(context.Context, *GetBucketRequest) (*Bucket, error) {
@@ -9900,7 +9900,7 @@ func (*UnimplementedStorageServer) TestIamPermissions(context.Context, *v1.TestI
func (*UnimplementedStorageServer) UpdateBucket(context.Context, *UpdateBucketRequest) (*Bucket, error) {
return nil, status.Errorf(codes.Unimplemented, "method UpdateBucket not implemented")
}
-func (*UnimplementedStorageServer) DeleteNotification(context.Context, *DeleteNotificationRequest) (*empty.Empty, error) {
+func (*UnimplementedStorageServer) DeleteNotification(context.Context, *DeleteNotificationRequest) (*emptypb.Empty, error) {
return nil, status.Errorf(codes.Unimplemented, "method DeleteNotification not implemented")
}
func (*UnimplementedStorageServer) GetNotification(context.Context, *GetNotificationRequest) (*Notification, error) {
@@ -9915,7 +9915,7 @@ func (*UnimplementedStorageServer) ListNotifications(context.Context, *ListNotif
func (*UnimplementedStorageServer) ComposeObject(context.Context, *ComposeObjectRequest) (*Object, error) {
return nil, status.Errorf(codes.Unimplemented, "method ComposeObject not implemented")
}
-func (*UnimplementedStorageServer) DeleteObject(context.Context, *DeleteObjectRequest) (*empty.Empty, error) {
+func (*UnimplementedStorageServer) DeleteObject(context.Context, *DeleteObjectRequest) (*emptypb.Empty, error) {
return nil, status.Errorf(codes.Unimplemented, "method DeleteObject not implemented")
}
func (*UnimplementedStorageServer) CancelResumableWrite(context.Context, *CancelResumableWriteRequest) (*CancelResumableWriteResponse, error) {
@@ -9951,7 +9951,7 @@ func (*UnimplementedStorageServer) GetServiceAccount(context.Context, *GetServic
func (*UnimplementedStorageServer) CreateHmacKey(context.Context, *CreateHmacKeyRequest) (*CreateHmacKeyResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method CreateHmacKey not implemented")
}
-func (*UnimplementedStorageServer) DeleteHmacKey(context.Context, *DeleteHmacKeyRequest) (*empty.Empty, error) {
+func (*UnimplementedStorageServer) DeleteHmacKey(context.Context, *DeleteHmacKeyRequest) (*emptypb.Empty, error) {
return nil, status.Errorf(codes.Unimplemented, "method DeleteHmacKey not implemented")
}
func (*UnimplementedStorageServer) GetHmacKey(context.Context, *GetHmacKeyRequest) (*HmacKeyMetadata, error) {
diff --git a/vendor/cloud.google.com/go/storage/internal/version.go b/vendor/cloud.google.com/go/storage/internal/version.go
index 50f34dc83c..008568b405 100644
--- a/vendor/cloud.google.com/go/storage/internal/version.go
+++ b/vendor/cloud.google.com/go/storage/internal/version.go
@@ -15,4 +15,4 @@
package internal
// Version is the current tagged release of the library.
-const Version = "1.28.0"
+const Version = "1.28.1"
diff --git a/vendor/cloud.google.com/go/storage/storage.go b/vendor/cloud.google.com/go/storage/storage.go
index 855792f474..b5c10efc8a 100644
--- a/vendor/cloud.google.com/go/storage/storage.go
+++ b/vendor/cloud.google.com/go/storage/storage.go
@@ -1412,12 +1412,13 @@ func newObjectFromProto(o *storagepb.Object) *ObjectAttrs {
Generation: o.Generation,
Metageneration: o.Metageneration,
StorageClass: o.StorageClass,
- CustomerKeySHA256: string(o.GetCustomerEncryption().GetKeySha256Bytes()),
- KMSKeyName: o.GetKmsKey(),
- Created: convertProtoTime(o.GetCreateTime()),
- Deleted: convertProtoTime(o.GetDeleteTime()),
- Updated: convertProtoTime(o.GetUpdateTime()),
- CustomTime: convertProtoTime(o.GetCustomTime()),
+ // CustomerKeySHA256 needs to be presented as base64 encoded, but the response from gRPC is not.
+ CustomerKeySHA256: base64.StdEncoding.EncodeToString(o.GetCustomerEncryption().GetKeySha256Bytes()),
+ KMSKeyName: o.GetKmsKey(),
+ Created: convertProtoTime(o.GetCreateTime()),
+ Deleted: convertProtoTime(o.GetDeleteTime()),
+ Updated: convertProtoTime(o.GetUpdateTime()),
+ CustomTime: convertProtoTime(o.GetCustomTime()),
}
}
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/CHANGELOG.md
index 56b641cf7b..fcf2947ba5 100644
--- a/vendor/github.com/aws/aws-sdk-go-v2/CHANGELOG.md
+++ b/vendor/github.com/aws/aws-sdk-go-v2/CHANGELOG.md
@@ -1,3 +1,571 @@
+# Release (2022-12-02)
+
+## General Highlights
+* **Dependency Update**: Updated to the latest SDK module versions
+
+## Module Highlights
+* `github.com/aws/aws-sdk-go-v2/service/appsync`: [v1.17.0](service/appsync/CHANGELOG.md#v1170-2022-12-02)
+ * **Feature**: Fixes the URI for the evaluatecode endpoint to include the /v1 prefix (ie. "/v1/dataplane-evaluatecode").
+* `github.com/aws/aws-sdk-go-v2/service/ecs`: [v1.20.1](service/ecs/CHANGELOG.md#v1201-2022-12-02)
+ * **Documentation**: Documentation updates for Amazon ECS
+* `github.com/aws/aws-sdk-go-v2/service/fms`: [v1.21.0](service/fms/CHANGELOG.md#v1210-2022-12-02)
+ * **Feature**: AWS Firewall Manager now supports Fortigate Cloud Native Firewall as a Service as a third-party policy type.
+* `github.com/aws/aws-sdk-go-v2/service/mediaconvert`: [v1.28.0](service/mediaconvert/CHANGELOG.md#v1280-2022-12-02)
+ * **Feature**: The AWS Elemental MediaConvert SDK has added support for configurable ID3 eMSG box attributes and the ability to signal them with InbandEventStream tags in DASH and CMAF outputs.
+* `github.com/aws/aws-sdk-go-v2/service/medialive`: [v1.25.0](service/medialive/CHANGELOG.md#v1250-2022-12-02)
+ * **Feature**: Updates to Event Signaling and Management (ESAM) API and documentation.
+* `github.com/aws/aws-sdk-go-v2/service/polly`: [v1.21.0](service/polly/CHANGELOG.md#v1210-2022-12-02)
+ * **Feature**: Add language code for Finnish (fi-FI)
+* `github.com/aws/aws-sdk-go-v2/service/proton`: [v1.18.0](service/proton/CHANGELOG.md#v1180-2022-12-02)
+ * **Feature**: CreateEnvironmentAccountConnection RoleArn input is now optional
+* `github.com/aws/aws-sdk-go-v2/service/redshiftserverless`: [v1.3.0](service/redshiftserverless/CHANGELOG.md#v130-2022-12-02)
+ * **Feature**: Add Table Level Restore operations for Amazon Redshift Serverless. Add multi-port support for Amazon Redshift Serverless endpoints. Add Tagging support to Snapshots and Recovery Points in Amazon Redshift Serverless.
+* `github.com/aws/aws-sdk-go-v2/service/sns`: [v1.18.7](service/sns/CHANGELOG.md#v1187-2022-12-02)
+ * **Documentation**: This release adds the message payload-filtering feature to the SNS Subscribe, SetSubscriptionAttributes, and GetSubscriptionAttributes API actions
+
+# Release (2022-12-01)
+
+## Module Highlights
+* `github.com/aws/aws-sdk-go-v2/service/codecatalyst`: [v1.0.0](service/codecatalyst/CHANGELOG.md#v100-2022-12-01)
+ * **Release**: New AWS service client module
+ * **Feature**: This release adds operations that support customers using the AWS Toolkits and Amazon CodeCatalyst, a unified software development service that helps developers develop, deploy, and maintain applications in the cloud. For more information, see the documentation.
+* `github.com/aws/aws-sdk-go-v2/service/comprehend`: [v1.20.0](service/comprehend/CHANGELOG.md#v1200-2022-12-01)
+ * **Feature**: Comprehend now supports semi-structured documents (such as PDF files or image files) as inputs for custom analysis using the synchronous APIs (ClassifyDocument and DetectEntities).
+* `github.com/aws/aws-sdk-go-v2/service/gamelift`: [v1.16.0](service/gamelift/CHANGELOG.md#v1160-2022-12-01)
+ * **Feature**: GameLift introduces a new feature, GameLift Anywhere. GameLift Anywhere allows you to integrate your own compute resources with GameLift. You can also use GameLift Anywhere to iteratively test your game servers without uploading the build to GameLift for every iteration.
+* `github.com/aws/aws-sdk-go-v2/service/pipes`: [v1.0.0](service/pipes/CHANGELOG.md#v100-2022-12-01)
+ * **Release**: New AWS service client module
+ * **Feature**: AWS introduces new Amazon EventBridge Pipes which allow you to connect sources (SQS, Kinesis, DDB, Kafka, MQ) to Targets (14+ EventBridge Targets) without any code, with filtering, batching, input transformation, and an optional Enrichment stage (Lambda, StepFunctions, ApiGateway, ApiDestinations)
+* `github.com/aws/aws-sdk-go-v2/service/sfn`: [v1.16.0](service/sfn/CHANGELOG.md#v1160-2022-12-01)
+ * **Feature**: This release adds support for the AWS Step Functions Map state in Distributed mode. The changes include a new MapRun resource and several new and modified APIs.
+
+# Release (2022-11-30)
+
+## Module Highlights
+* `github.com/aws/aws-sdk-go-v2/service/accessanalyzer`: [v1.18.0](service/accessanalyzer/CHANGELOG.md#v1180-2022-11-30)
+ * **Feature**: This release adds support for S3 cross account access points. IAM Access Analyzer will now produce public or cross account findings when it detects bucket delegation to external account access points.
+* `github.com/aws/aws-sdk-go-v2/service/athena`: [v1.20.0](service/athena/CHANGELOG.md#v1200-2022-11-30)
+ * **Feature**: This release includes support for using Apache Spark in Amazon Athena.
+* `github.com/aws/aws-sdk-go-v2/service/dataexchange`: [v1.17.0](service/dataexchange/CHANGELOG.md#v1170-2022-11-30)
+ * **Feature**: This release enables data providers to license direct access to data in their Amazon S3 buckets or AWS Lake Formation data lakes through AWS Data Exchange. Subscribers get read-only access to the data and can use it in downstream AWS services, like Amazon Athena, without creating or managing copies.
+* `github.com/aws/aws-sdk-go-v2/service/docdbelastic`: [v1.0.0](service/docdbelastic/CHANGELOG.md#v100-2022-11-30)
+ * **Release**: New AWS service client module
+ * **Feature**: Launched Amazon DocumentDB Elastic Clusters. You can now use the SDK to create, list, update and delete Amazon DocumentDB Elastic Cluster resources
+* `github.com/aws/aws-sdk-go-v2/service/glue`: [v1.37.0](service/glue/CHANGELOG.md#v1370-2022-11-30)
+ * **Feature**: This release adds support for AWS Glue Data Quality, which helps you evaluate and monitor the quality of your data and includes the API for creating, deleting, or updating data quality rulesets, runs and evaluations.
+* `github.com/aws/aws-sdk-go-v2/service/s3control`: [v1.28.0](service/s3control/CHANGELOG.md#v1280-2022-11-30)
+ * **Feature**: Amazon S3 now supports cross-account access points. S3 bucket owners can now allow trusted AWS accounts to create access points associated with their bucket.
+* `github.com/aws/aws-sdk-go-v2/service/sagemaker`: [v1.56.0](service/sagemaker/CHANGELOG.md#v1560-2022-11-30)
+ * **Feature**: Added Models as part of the Search API. Added Model shadow deployments in realtime inference, and shadow testing in managed inference. Added support for shared spaces, geospatial APIs, Model Cards, AutoMLJobStep in pipelines, Git repositories on user profiles and domains, Model sharing in Jumpstart.
+* `github.com/aws/aws-sdk-go-v2/service/sagemakergeospatial`: [v1.0.0](service/sagemakergeospatial/CHANGELOG.md#v100-2022-11-30)
+ * **Release**: New AWS service client module
+ * **Feature**: This release provides Amazon SageMaker geospatial APIs to build, train, deploy and visualize geospatial models.
+
+# Release (2022-11-29.2)
+
+## Module Highlights
+* `github.com/aws/aws-sdk-go-v2/service/ec2`: [v1.74.0](service/ec2/CHANGELOG.md#v1740-2022-11-292)
+ * **Feature**: This release adds support for AWS Verified Access and the Hpc6id Amazon EC2 compute optimized instance type, which features 3rd generation Intel Xeon Scalable processors.
+* `github.com/aws/aws-sdk-go-v2/service/firehose`: [v1.15.0](service/firehose/CHANGELOG.md#v1150-2022-11-292)
+ * **Feature**: Allow support for the Serverless offering for Amazon OpenSearch Service as a Kinesis Data Firehose delivery destination.
+* `github.com/aws/aws-sdk-go-v2/service/kms`: [v1.19.0](service/kms/CHANGELOG.md#v1190-2022-11-292)
+ * **Feature**: AWS KMS introduces the External Key Store (XKS), a new feature for customers who want to protect their data with encryption keys stored in an external key management system under their control.
+* `github.com/aws/aws-sdk-go-v2/service/omics`: [v1.0.0](service/omics/CHANGELOG.md#v100-2022-11-292)
+ * **Release**: New AWS service client module
+ * **Feature**: Amazon Omics is a new, purpose-built service that can be used by healthcare and life science organizations to store, query, and analyze omics data. The insights from that data can be used to accelerate scientific discoveries and improve healthcare.
+* `github.com/aws/aws-sdk-go-v2/service/opensearchserverless`: [v1.0.0](service/opensearchserverless/CHANGELOG.md#v100-2022-11-292)
+ * **Release**: New AWS service client module
+ * **Feature**: Publish SDK for Amazon OpenSearch Serverless
+* `github.com/aws/aws-sdk-go-v2/service/securitylake`: [v1.0.0](service/securitylake/CHANGELOG.md#v100-2022-11-292)
+ * **Release**: New AWS service client module
+ * **Feature**: Amazon Security Lake automatically centralizes security data from cloud, on-premises, and custom sources into a purpose-built data lake stored in your account. Security Lake makes it easier to analyze security data, so you can improve the protection of your workloads, applications, and data
+* `github.com/aws/aws-sdk-go-v2/service/simspaceweaver`: [v1.0.0](service/simspaceweaver/CHANGELOG.md#v100-2022-11-292)
+ * **Release**: New AWS service client module
+ * **Feature**: AWS SimSpace Weaver is a new service that helps customers build spatial simulations at new levels of scale - resulting in virtual worlds with millions of dynamic entities. See the AWS SimSpace Weaver developer guide for more details on how to get started. https://docs.aws.amazon.com/simspaceweaver
+
+# Release (2022-11-29)
+
+## Module Highlights
+* `github.com/aws/aws-sdk-go-v2/service/arczonalshift`: [v1.0.0](service/arczonalshift/CHANGELOG.md#v100-2022-11-29)
+ * **Release**: New AWS service client module
+ * **Feature**: Amazon Route 53 Application Recovery Controller Zonal Shift is a new service that makes it easy to shift traffic away from an Availability Zone in a Region. See the developer guide for more information: https://docs.aws.amazon.com/r53recovery/latest/dg/what-is-route53-recovery.html
+* `github.com/aws/aws-sdk-go-v2/service/computeoptimizer`: [v1.18.0](service/computeoptimizer/CHANGELOG.md#v1180-2022-11-29)
+ * **Feature**: Adds support for a new recommendation preference that makes it possible for customers to optimize their EC2 recommendations by utilizing an external metrics ingestion service to provide metrics.
+* `github.com/aws/aws-sdk-go-v2/service/configservice`: [v1.28.0](service/configservice/CHANGELOG.md#v1280-2022-11-29)
+ * **Feature**: With this release, you can use AWS Config to evaluate your resources for compliance with Config rules before they are created or updated. Using Config rules in proactive mode enables you to test and build compliant resource templates or check resource configurations at the time they are provisioned.
+* `github.com/aws/aws-sdk-go-v2/service/ec2`: [v1.73.0](service/ec2/CHANGELOG.md#v1730-2022-11-29)
+ * **Feature**: Introduces ENA Express, which uses AWS SRD and dynamic routing to increase throughput and minimize latency, adds support for trust relationships between Reachability Analyzer and AWS Organizations to enable cross-account analysis, and adds support for Infrastructure Performance metric subscriptions.
+* `github.com/aws/aws-sdk-go-v2/service/eks`: [v1.24.0](service/eks/CHANGELOG.md#v1240-2022-11-29)
+ * **Feature**: Adds support for additional EKS add-ons metadata and filtering fields
+* `github.com/aws/aws-sdk-go-v2/service/fsx`: [v1.26.0](service/fsx/CHANGELOG.md#v1260-2022-11-29)
+ * **Feature**: This release adds support for 4GB/s / 160K PIOPS FSx for ONTAP file systems and 10GB/s / 350K PIOPS FSx for OpenZFS file systems (Single_AZ_2). For FSx for ONTAP, this also adds support for DP volumes, snapshot policy, copy tags to backups, and Multi-AZ route table updates.
+* `github.com/aws/aws-sdk-go-v2/service/glue`: [v1.36.0](service/glue/CHANGELOG.md#v1360-2022-11-29)
+ * **Feature**: This release allows the creation of Custom Visual Transforms (Dynamic Transforms) to be created via AWS Glue CLI/SDK.
+* `github.com/aws/aws-sdk-go-v2/service/inspector2`: [v1.9.0](service/inspector2/CHANGELOG.md#v190-2022-11-29)
+ * **Feature**: This release adds support for Inspector to scan AWS Lambda.
+* `github.com/aws/aws-sdk-go-v2/service/lambda`: [v1.26.0](service/lambda/CHANGELOG.md#v1260-2022-11-29)
+ * **Feature**: Adds support for Lambda SnapStart, which helps improve the startup performance of functions. Customers can now manage SnapStart based functions via CreateFunction and UpdateFunctionConfiguration APIs
+* `github.com/aws/aws-sdk-go-v2/service/licensemanagerusersubscriptions`: [v1.1.0](service/licensemanagerusersubscriptions/CHANGELOG.md#v110-2022-11-29)
+ * **Feature**: AWS now offers fully-compliant, Amazon-provided licenses for Microsoft Office Professional Plus 2021 Amazon Machine Images (AMIs) on Amazon EC2. These AMIs are now available on the Amazon EC2 console and on AWS Marketplace to launch instances on-demand without any long-term licensing commitments.
+* `github.com/aws/aws-sdk-go-v2/service/macie2`: [v1.24.0](service/macie2/CHANGELOG.md#v1240-2022-11-29)
+ * **Feature**: Added support for configuring Macie to continually sample objects from S3 buckets and inspect them for sensitive data. Results appear in statistics, findings, and other data that Macie provides.
+* `github.com/aws/aws-sdk-go-v2/service/quicksight`: [v1.28.0](service/quicksight/CHANGELOG.md#v1280-2022-11-29)
+ * **Feature**: This release adds new Describe APIs and updates Create and Update APIs to support the data model for Dashboards, Analyses, and Templates.
+* `github.com/aws/aws-sdk-go-v2/service/s3control`: [v1.27.0](service/s3control/CHANGELOG.md#v1270-2022-11-29)
+ * **Feature**: Added two new APIs to support Amazon S3 Multi-Region Access Point failover controls: GetMultiRegionAccessPointRoutes and SubmitMultiRegionAccessPointRoutes. The failover control APIs are supported in the following Regions: us-east-1, us-west-2, eu-west-1, ap-southeast-2, and ap-northeast-1.
+* `github.com/aws/aws-sdk-go-v2/service/securityhub`: [v1.25.0](service/securityhub/CHANGELOG.md#v1250-2022-11-29)
+ * **Feature**: Adding StandardsManagedBy field to DescribeStandards API response
+
+# Release (2022-11-28)
+
+## Module Highlights
+* `github.com/aws/aws-sdk-go-v2/service/backup`: [v1.18.0](service/backup/CHANGELOG.md#v1180-2022-11-28)
+ * **Feature**: AWS Backup introduces support for legal hold and application stack backups. AWS Backup Audit Manager introduces support for cross-Region, cross-account reports.
+* `github.com/aws/aws-sdk-go-v2/service/cloudwatch`: [v1.22.0](service/cloudwatch/CHANGELOG.md#v1220-2022-11-28)
+ * **Feature**: Adds cross-account support to the GetMetricData API. Adds cross-account support to the ListMetrics API through the usage of the IncludeLinkedAccounts flag and the new OwningAccounts field.
+* `github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs`: [v1.17.0](service/cloudwatchlogs/CHANGELOG.md#v1170-2022-11-28)
+ * **Feature**: Updates to support CloudWatch Logs data protection and CloudWatch cross-account observability
+* `github.com/aws/aws-sdk-go-v2/service/drs`: [v1.9.0](service/drs/CHANGELOG.md#v190-2022-11-28)
+ * **Feature**: Non breaking changes to existing APIs, and additional APIs added to support in-AWS failing back using AWS Elastic Disaster Recovery.
+* `github.com/aws/aws-sdk-go-v2/service/ecs`: [v1.20.0](service/ecs/CHANGELOG.md#v1200-2022-11-28)
+ * **Feature**: This release adds support for ECS Service Connect, a new capability that simplifies writing and operating resilient distributed applications. This release updates the TaskDefinition, Cluster, Service mutation APIs with Service connect constructs and also adds a new ListServicesByNamespace API.
+* `github.com/aws/aws-sdk-go-v2/service/efs`: [v1.18.0](service/efs/CHANGELOG.md#v1180-2022-11-28)
+ * **Feature**: This release adds elastic as a new ThroughputMode value for EFS file systems and adds AFTER_1_DAY as a value for TransitionToIARules.
+* `github.com/aws/aws-sdk-go-v2/service/iot`: [v1.32.0](service/iot/CHANGELOG.md#v1320-2022-11-28)
+ * **Feature**: Job scheduling enables the scheduled rollout of a Job with start and end times and a customizable end behavior when end time is reached. This is available for continuous and snapshot jobs. Added support for MQTT5 properties to AWS IoT TopicRule Republish Action.
+* `github.com/aws/aws-sdk-go-v2/service/iotdataplane`: [v1.13.0](service/iotdataplane/CHANGELOG.md#v1130-2022-11-28)
+ * **Feature**: This release adds support for MQTT5 properties to AWS IoT HTTP Publish API.
+* `github.com/aws/aws-sdk-go-v2/service/iotwireless`: [v1.23.0](service/iotwireless/CHANGELOG.md#v1230-2022-11-28)
+ * **Feature**: This release includes a new feature for customers to calculate the position of their devices by adding three new APIs: UpdateResourcePosition, GetResourcePosition, and GetPositionEstimate.
+* `github.com/aws/aws-sdk-go-v2/service/kendra`: [v1.36.0](service/kendra/CHANGELOG.md#v1360-2022-11-28)
+ * **Feature**: Amazon Kendra now supports preview of table information from HTML tables in the search results. The most relevant cells with their corresponding rows, columns are displayed as a preview in the search result. The most relevant table cell or cells are also highlighted in table preview.
+* `github.com/aws/aws-sdk-go-v2/service/mgn`: [v1.16.0](service/mgn/CHANGELOG.md#v1160-2022-11-28)
+ * **Feature**: This release adds support for Application and Wave management. We also now support custom post-launch actions.
+* `github.com/aws/aws-sdk-go-v2/service/oam`: [v1.0.0](service/oam/CHANGELOG.md#v100-2022-11-28)
+ * **Release**: New AWS service client module
+ * **Feature**: Amazon CloudWatch Observability Access Manager is a new service that allows configuration of the CloudWatch cross-account observability feature.
+* `github.com/aws/aws-sdk-go-v2/service/organizations`: [v1.17.0](service/organizations/CHANGELOG.md#v1170-2022-11-28)
+ * **Feature**: This release introduces delegated administrator for AWS Organizations, a new feature to help you delegate the management of your Organizations policies, enabling you to govern your AWS organization in a decentralized way. You can now allow member accounts to manage Organizations policies.
+* `github.com/aws/aws-sdk-go-v2/service/rds`: [v1.31.0](service/rds/CHANGELOG.md#v1310-2022-11-28)
+ * **Feature**: This release enables new Aurora and RDS feature called Blue/Green Deployments that makes updates to databases safer, simpler and faster.
+* `github.com/aws/aws-sdk-go-v2/service/textract`: [v1.19.0](service/textract/CHANGELOG.md#v1190-2022-11-28)
+ * **Feature**: This release adds support for classifying and splitting lending documents by type, and extracting information by using the Analyze Lending APIs. This release also includes support for summarized information of the processed lending document package, in addition to per document results.
+* `github.com/aws/aws-sdk-go-v2/service/transcribe`: [v1.22.0](service/transcribe/CHANGELOG.md#v1220-2022-11-28)
+ * **Feature**: This release adds support for 'inputType' for post-call and real-time (streaming) Call Analytics within Amazon Transcribe.
+* `github.com/aws/aws-sdk-go-v2/service/transcribestreaming`: [v1.8.0](service/transcribestreaming/CHANGELOG.md#v180-2022-11-28)
+ * **Feature**: This release adds support for real-time (streaming) and post-call Call Analytics within Amazon Transcribe.
+
+# Release (2022-11-23)
+
+## Module Highlights
+* `github.com/aws/aws-sdk-go-v2/service/grafana`: [v1.10.0](service/grafana/CHANGELOG.md#v1100-2022-11-23)
+ * **Feature**: This release includes support for configuring a Grafana workspace to connect to a datasource within a VPC as well as new APIs for configuring Grafana settings.
+* `github.com/aws/aws-sdk-go-v2/service/rbin`: [v1.7.0](service/rbin/CHANGELOG.md#v170-2022-11-23)
+ * **Feature**: This release adds support for Rule Lock for Recycle Bin, which allows you to lock retention rules so that they can no longer be modified or deleted.
+
+# Release (2022-11-22)
+
+## General Highlights
+* **Dependency Update**: Updated to the latest SDK module versions
+
+## Module Highlights
+* `github.com/aws/aws-sdk-go-v2/service/appflow`: [v1.21.0](service/appflow/CHANGELOG.md#v1210-2022-11-22)
+ * **Feature**: Adding support for Amazon AppFlow to transfer the data to Amazon Redshift databases through Amazon Redshift Data API service. This feature will support the Redshift destination connector on both public and private accessible Amazon Redshift Clusters and Amazon Redshift Serverless.
+* `github.com/aws/aws-sdk-go-v2/service/kinesisanalyticsv2`: [v1.15.0](service/kinesisanalyticsv2/CHANGELOG.md#v1150-2022-11-22)
+ * **Feature**: Support for Apache Flink 1.15 in Kinesis Data Analytics.
+
+# Release (2022-11-21)
+
+## Module Highlights
+* `github.com/aws/aws-sdk-go-v2/service/route53`: [v1.25.0](service/route53/CHANGELOG.md#v1250-2022-11-21)
+ * **Feature**: Amazon Route 53 now supports the Asia Pacific (Hyderabad) Region (ap-south-2) for latency records, geoproximity records, and private DNS for Amazon VPCs in that region.
+
+# Release (2022-11-18.2)
+
+## Module Highlights
+* `github.com/aws/aws-sdk-go-v2/service/ssmsap`: [v1.0.1](service/ssmsap/CHANGELOG.md#v101-2022-11-182)
+ * **Bug Fix**: Removes old model file for ssm sap and uses the new model file to regenerate client
+
+# Release (2022-11-18)
+
+## General Highlights
+* **Dependency Update**: Updated to the latest SDK module versions
+
+## Module Highlights
+* `github.com/aws/aws-sdk-go-v2/service/appflow`: [v1.20.0](service/appflow/CHANGELOG.md#v1200-2022-11-18)
+ * **Feature**: AppFlow provides a new API called UpdateConnectorRegistration to update a custom connector that customers have previously registered. With this API, customers no longer need to unregister and then register a connector to make an update.
+* `github.com/aws/aws-sdk-go-v2/service/auditmanager`: [v1.21.0](service/auditmanager/CHANGELOG.md#v1210-2022-11-18)
+ * **Feature**: This release introduces a new feature for Audit Manager: Evidence finder. You can now use evidence finder to quickly query your evidence, and add the matching evidence results to an assessment report.
+* `github.com/aws/aws-sdk-go-v2/service/chimesdkvoice`: [v1.0.0](service/chimesdkvoice/CHANGELOG.md#v100-2022-11-18)
+ * **Release**: New AWS service client module
+ * **Feature**: Amazon Chime Voice Connector, Voice Connector Group and PSTN Audio Service APIs are now available in the Amazon Chime SDK Voice namespace. See https://docs.aws.amazon.com/chime-sdk/latest/dg/sdk-available-regions.html for more details.
+* `github.com/aws/aws-sdk-go-v2/service/cloudfront`: [v1.21.0](service/cloudfront/CHANGELOG.md#v1210-2022-11-18)
+ * **Feature**: CloudFront API support for staging distributions and associated traffic management policies.
+* `github.com/aws/aws-sdk-go-v2/service/connect`: [v1.38.0](service/connect/CHANGELOG.md#v1380-2022-11-18)
+ * **Feature**: Added AllowedAccessControlTags and TagRestrictedResource for Tag Based Access Control on Amazon Connect Webpage
+* `github.com/aws/aws-sdk-go-v2/service/dynamodb`: [v1.17.6](service/dynamodb/CHANGELOG.md#v1176-2022-11-18)
+ * **Documentation**: Updated minor fixes for DynamoDB documentation.
+* `github.com/aws/aws-sdk-go-v2/service/dynamodbstreams`: [v1.13.25](service/dynamodbstreams/CHANGELOG.md#v11325-2022-11-18)
+ * **Documentation**: Updated minor fixes for DynamoDB documentation.
+* `github.com/aws/aws-sdk-go-v2/service/ec2`: [v1.72.0](service/ec2/CHANGELOG.md#v1720-2022-11-18)
+ * **Feature**: This release adds support for copying an Amazon Machine Image's tags when copying an AMI.
+* `github.com/aws/aws-sdk-go-v2/service/glue`: [v1.35.0](service/glue/CHANGELOG.md#v1350-2022-11-18)
+ * **Feature**: AWSGlue Crawler - Adding support for Table and Column level Comments with database level datatypes for JDBC based crawler.
+* `github.com/aws/aws-sdk-go-v2/service/iotroborunner`: [v1.0.0](service/iotroborunner/CHANGELOG.md#v100-2022-11-18)
+ * **Release**: New AWS service client module
+ * **Feature**: AWS IoT RoboRunner is a new service that makes it easy to build applications that help multi-vendor robots work together seamlessly. See the IoT RoboRunner developer guide for more details on getting started. https://docs.aws.amazon.com/iotroborunner/latest/dev/iotroborunner-welcome.html
+* `github.com/aws/aws-sdk-go-v2/service/quicksight`: [v1.27.0](service/quicksight/CHANGELOG.md#v1270-2022-11-18)
+ * **Feature**: This release adds the following: 1) Asset management for centralized assets governance 2) QuickSight Q now supports public embedding 3) New Termination protection flag to mitigate accidental deletes 4) Athena data sources now accept a custom IAM role 5) QuickSight supports connectivity to Databricks
+* `github.com/aws/aws-sdk-go-v2/service/sagemaker`: [v1.55.0](service/sagemaker/CHANGELOG.md#v1550-2022-11-18)
+ * **Feature**: Added DisableProfiler flag as a new field in ProfilerConfig
+* `github.com/aws/aws-sdk-go-v2/service/servicecatalog`: [v1.15.0](service/servicecatalog/CHANGELOG.md#v1150-2022-11-18)
+ * **Feature**: This release 1. adds support for Principal Name Sharing with Service Catalog portfolio sharing. 2. Introduces repo sourced products which are created and managed with existing SC APIs. These products are synced to external repos and auto create new product versions based on changes in the repo.
+* `github.com/aws/aws-sdk-go-v2/service/sfn`: [v1.15.0](service/sfn/CHANGELOG.md#v1150-2022-11-18)
+ * **Feature**: This release adds support for using Step Functions service integrations to invoke any cross-account AWS resource, even if that service doesn't support resource-based policies or cross-account calls. See https://docs.aws.amazon.com/step-functions/latest/dg/concepts-access-cross-acct-resources.html
+* `github.com/aws/aws-sdk-go-v2/service/transfer`: [v1.25.0](service/transfer/CHANGELOG.md#v1250-2022-11-18)
+ * **Feature**: Adds a NONE encryption algorithm type to AS2 connectors, providing support for skipping encryption of the AS2 message body when a HTTPS URL is also specified.
+
+# Release (2022-11-17)
+
+## General Highlights
+* **Dependency Update**: Updated to the latest SDK module versions
+
+## Module Highlights
+* `github.com/aws/aws-sdk-go-v2/service/amplify`: [v1.12.0](service/amplify/CHANGELOG.md#v1120-2022-11-17)
+ * **Feature**: Adds a new value (WEB_COMPUTE) to the Platform enum that allows customers to create Amplify Apps with Server-Side Rendering support.
+* `github.com/aws/aws-sdk-go-v2/service/appflow`: [v1.19.0](service/appflow/CHANGELOG.md#v1190-2022-11-17)
+ * **Feature**: AppFlow simplifies the preparation and cataloging of SaaS data into the AWS Glue Data Catalog where your data can be discovered and accessed by AWS analytics and ML services. AppFlow now also supports data field partitioning and file size optimization to improve query performance and reduce cost.
+* `github.com/aws/aws-sdk-go-v2/service/appsync`: [v1.16.0](service/appsync/CHANGELOG.md#v1160-2022-11-17)
+ * **Feature**: This release introduces the APPSYNC_JS runtime, and adds support for JavaScript in AppSync functions and AppSync pipeline resolvers.
+* `github.com/aws/aws-sdk-go-v2/service/databasemigrationservice`: [v1.22.0](service/databasemigrationservice/CHANGELOG.md#v1220-2022-11-17)
+ * **Feature**: Adds support for Internet Protocol Version 6 (IPv6) on DMS Replication Instances
+* `github.com/aws/aws-sdk-go-v2/service/ec2`: [v1.71.0](service/ec2/CHANGELOG.md#v1710-2022-11-17)
+ * **Feature**: This release adds a new optional parameter "privateIpAddress" for the CreateNatGateway API. PrivateIPAddress will allow customers to select a custom Private IPv4 address instead of having it be auto-assigned.
+* `github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2`: [v1.18.25](service/elasticloadbalancingv2/CHANGELOG.md#v11825-2022-11-17)
+ * **Documentation**: Provides new target group attributes to turn on/off cross zone load balancing and configure target group health for Network Load Balancers and Application Load Balancers. Provides improvements to health check configuration for Network Load Balancers.
+* `github.com/aws/aws-sdk-go-v2/service/emrserverless`: [v1.4.0](service/emrserverless/CHANGELOG.md#v140-2022-11-17)
+ * **Feature**: Adds support for AWS Graviton2 based applications. You can now select CPU architecture when creating new applications or updating existing ones.
+* `github.com/aws/aws-sdk-go-v2/service/ivschat`: [v1.1.0](service/ivschat/CHANGELOG.md#v110-2022-11-17)
+ * **Feature**: Adds LoggingConfiguration APIs for IVS Chat - a feature that allows customers to store and record sent messages in a chat room to S3 buckets, CloudWatch logs, or Kinesis firehose.
+* `github.com/aws/aws-sdk-go-v2/service/lambda`: [v1.25.0](service/lambda/CHANGELOG.md#v1250-2022-11-17)
+ * **Feature**: Add Node 18 (nodejs18.x) support to AWS Lambda.
+* `github.com/aws/aws-sdk-go-v2/service/personalize`: [v1.22.0](service/personalize/CHANGELOG.md#v1220-2022-11-17)
+ * **Feature**: This release provides support for creation and use of metric attributions in AWS Personalize
+* `github.com/aws/aws-sdk-go-v2/service/polly`: [v1.20.0](service/polly/CHANGELOG.md#v1200-2022-11-17)
+ * **Feature**: Add two new neural voices - Ola (pl-PL) and Hala (ar-AE).
+* `github.com/aws/aws-sdk-go-v2/service/rum`: [v1.8.0](service/rum/CHANGELOG.md#v180-2022-11-17)
+ * **Feature**: CloudWatch RUM now supports custom events. To use custom events, create an app monitor or update an app monitor with CustomEvent Status as ENABLED.
+* `github.com/aws/aws-sdk-go-v2/service/s3control`: [v1.26.0](service/s3control/CHANGELOG.md#v1260-2022-11-17)
+ * **Feature**: Added 34 new S3 Storage Lens metrics to support additional customer use cases.
+* `github.com/aws/aws-sdk-go-v2/service/secretsmanager`: [v1.16.7](service/secretsmanager/CHANGELOG.md#v1167-2022-11-17)
+ * **Documentation**: Documentation updates for Secrets Manager.
+* `github.com/aws/aws-sdk-go-v2/service/securityhub`: [v1.24.0](service/securityhub/CHANGELOG.md#v1240-2022-11-17)
+ * **Feature**: Added SourceLayerArn and SourceLayerHash field for security findings. Updated AwsLambdaFunction Resource detail
+* `github.com/aws/aws-sdk-go-v2/service/servicecatalogappregistry`: [v1.15.0](service/servicecatalogappregistry/CHANGELOG.md#v1150-2022-11-17)
+ * **Feature**: This release adds support for tagged resource associations, which allows you to associate a group of resources with a defined resource tag key and value to the application.
+* `github.com/aws/aws-sdk-go-v2/service/sts`: [v1.17.4](service/sts/CHANGELOG.md#v1174-2022-11-17)
+ * **Documentation**: Documentation updates for AWS Security Token Service.
+* `github.com/aws/aws-sdk-go-v2/service/textract`: [v1.18.0](service/textract/CHANGELOG.md#v1180-2022-11-17)
+ * **Feature**: This release adds support for specifying and extracting information from documents using the Signatures feature within Analyze Document API
+* `github.com/aws/aws-sdk-go-v2/service/workspaces`: [v1.27.0](service/workspaces/CHANGELOG.md#v1270-2022-11-17)
+ * **Feature**: The release introduces CreateStandbyWorkspaces, an API that allows you to create standby WorkSpaces associated with a primary WorkSpace in another Region. DescribeWorkspaces now includes related WorkSpaces properties. DescribeWorkspaceBundles and CreateWorkspaceBundle now return more bundle details.
+
+# Release (2022-11-16)
+
+## General Highlights
+* **Dependency Update**: Updated to the latest SDK module versions
+
+## Module Highlights
+* `github.com/aws/aws-sdk-go-v2/service/batch`: [v1.19.1](service/batch/CHANGELOG.md#v1191-2022-11-16)
+ * **Documentation**: Documentation updates related to Batch on EKS
+* `github.com/aws/aws-sdk-go-v2/service/billingconductor`: [v1.2.0](service/billingconductor/CHANGELOG.md#v120-2022-11-16)
+ * **Feature**: This release adds a new feature BillingEntity pricing rule.
+* `github.com/aws/aws-sdk-go-v2/service/cloudformation`: [v1.24.0](service/cloudformation/CHANGELOG.md#v1240-2022-11-16)
+ * **Feature**: Added UnsupportedTarget HandlerErrorCode for use with CFN Resource Hooks
+* `github.com/aws/aws-sdk-go-v2/service/comprehendmedical`: [v1.14.0](service/comprehendmedical/CHANGELOG.md#v1140-2022-11-16)
+ * **Feature**: This release supports new set of entities and traits. It also adds new category (BEHAVIORAL_ENVIRONMENTAL_SOCIAL).
+* `github.com/aws/aws-sdk-go-v2/service/connect`: [v1.37.0](service/connect/CHANGELOG.md#v1370-2022-11-16)
+ * **Feature**: This release adds a new MonitorContact API for initiating monitoring of ongoing Voice and Chat contacts.
+* `github.com/aws/aws-sdk-go-v2/service/eks`: [v1.23.0](service/eks/CHANGELOG.md#v1230-2022-11-16)
+ * **Feature**: Adds support for customer-provided placement groups for Kubernetes control plane instances when creating local EKS clusters on Outposts
+* `github.com/aws/aws-sdk-go-v2/service/elasticache`: [v1.24.0](service/elasticache/CHANGELOG.md#v1240-2022-11-16)
+ * **Feature**: for Redis now supports AWS Identity and Access Management authentication access to Redis clusters starting with redis-engine version 7.0
+* `github.com/aws/aws-sdk-go-v2/service/iottwinmaker`: [v1.8.0](service/iottwinmaker/CHANGELOG.md#v180-2022-11-16)
+ * **Feature**: This release adds the following: 1) ExecuteQuery API allows users to query their AWS IoT TwinMaker Knowledge Graph 2) Pricing plan APIs allow users to configure and manage their pricing mode 3) Support for property groups and tabular property values in existing AWS IoT TwinMaker APIs.
+* `github.com/aws/aws-sdk-go-v2/service/personalizeevents`: [v1.12.0](service/personalizeevents/CHANGELOG.md#v1120-2022-11-16)
+ * **Feature**: This release provides support for creation and use of metric attributions in AWS Personalize
+* `github.com/aws/aws-sdk-go-v2/service/proton`: [v1.17.0](service/proton/CHANGELOG.md#v1170-2022-11-16)
+ * **Feature**: Add support for sorting and filtering in ListServiceInstances
+* `github.com/aws/aws-sdk-go-v2/service/rds`: [v1.30.0](service/rds/CHANGELOG.md#v1300-2022-11-16)
+ * **Feature**: This release adds support for container databases (CDBs) to Amazon RDS Custom for Oracle. A CDB contains one PDB at creation. You can add more PDBs using Oracle SQL. You can also customize your database installation by setting the Oracle base, Oracle home, and the OS user name and group.
+* `github.com/aws/aws-sdk-go-v2/service/ssm`: [v1.33.0](service/ssm/CHANGELOG.md#v1330-2022-11-16)
+ * **Feature**: This release adds support for cross account access in CreateOpsItem, UpdateOpsItem and GetOpsItem. It introduces new APIs to setup resource policies for SSM resources: PutResourcePolicy, GetResourcePolicies and DeleteResourcePolicy.
+* `github.com/aws/aws-sdk-go-v2/service/ssmincidents`: [v1.19.0](service/ssmincidents/CHANGELOG.md#v1190-2022-11-16)
+ * **Feature**: Add support for PagerDuty integrations on ResponsePlan, IncidentRecord, and RelatedItem APIs
+* `github.com/aws/aws-sdk-go-v2/service/transfer`: [v1.24.0](service/transfer/CHANGELOG.md#v1240-2022-11-16)
+ * **Feature**: Allow additional operations to throw ThrottlingException
+* `github.com/aws/aws-sdk-go-v2/service/xray`: [v1.15.0](service/xray/CHANGELOG.md#v1150-2022-11-16)
+ * **Feature**: This release adds new APIs - PutResourcePolicy, DeleteResourcePolicy, ListResourcePolicies for supporting resource based policies for AWS X-Ray.
+
+# Release (2022-11-15)
+
+## Module Highlights
+* `github.com/aws/aws-sdk-go-v2/service/connect`: [v1.36.0](service/connect/CHANGELOG.md#v1360-2022-11-15)
+ * **Feature**: This release updates the APIs: UpdateInstanceAttribute, DescribeInstanceAttribute, and ListInstanceAttributes. You can use it to programmatically enable/disable enhanced contact monitoring using attribute type ENHANCED_CONTACT_MONITORING on the specified Amazon Connect instance.
+* `github.com/aws/aws-sdk-go-v2/service/greengrassv2`: [v1.20.0](service/greengrassv2/CHANGELOG.md#v1200-2022-11-15)
+ * **Feature**: Adds new parent target ARN paramater to CreateDeployment, GetDeployment, and ListDeployments APIs for the new subdeployments feature.
+* `github.com/aws/aws-sdk-go-v2/service/route53`: [v1.24.0](service/route53/CHANGELOG.md#v1240-2022-11-15)
+ * **Feature**: Amazon Route 53 now supports the Europe (Spain) Region (eu-south-2) for latency records, geoproximity records, and private DNS for Amazon VPCs in that region.
+* `github.com/aws/aws-sdk-go-v2/service/ssmsap`: [v1.0.0](service/ssmsap/CHANGELOG.md#v100-2022-11-15)
+ * **Release**: New AWS service client module
+ * **Feature**: AWS Systems Manager for SAP provides simplified operations and management of SAP applications such as SAP HANA. With this release, SAP customers and partners can automate and simplify their SAP system administration tasks such as backup/restore of SAP HANA.
+* `github.com/aws/aws-sdk-go-v2/service/workspaces`: [v1.26.0](service/workspaces/CHANGELOG.md#v1260-2022-11-15)
+ * **Feature**: This release introduces ModifyCertificateBasedAuthProperties, a new API that allows control of certificate-based auth properties associated with a WorkSpaces directory. The DescribeWorkspaceDirectories API will now additionally return certificate-based auth properties in its responses.
+
+# Release (2022-11-14)
+
+## Module Highlights
+* `github.com/aws/aws-sdk-go-v2/service/customerprofiles`: [v1.20.0](service/customerprofiles/CHANGELOG.md#v1200-2022-11-14)
+ * **Feature**: This release enhances the SearchProfiles API by providing functionality to search for profiles using multiple keys and logical operators.
+* `github.com/aws/aws-sdk-go-v2/service/lakeformation`: [v1.18.0](service/lakeformation/CHANGELOG.md#v1180-2022-11-14)
+ * **Feature**: This release adds a new parameter "Parameters" in the DataLakeSettings.
+* `github.com/aws/aws-sdk-go-v2/service/managedblockchain`: [v1.13.3](service/managedblockchain/CHANGELOG.md#v1133-2022-11-14)
+ * **Documentation**: Updating the API docs data type: NetworkEthereumAttributes, and the operations DeleteNode, and CreateNode to also include the supported Goerli network.
+* `github.com/aws/aws-sdk-go-v2/service/proton`: [v1.16.0](service/proton/CHANGELOG.md#v1160-2022-11-14)
+ * **Feature**: Add support for CodeBuild Provisioning
+* `github.com/aws/aws-sdk-go-v2/service/rds`: [v1.29.0](service/rds/CHANGELOG.md#v1290-2022-11-14)
+ * **Feature**: This release adds support for restoring an RDS Multi-AZ DB cluster snapshot to a Single-AZ deployment or a Multi-AZ DB instance deployment.
+* `github.com/aws/aws-sdk-go-v2/service/workdocs`: [v1.12.0](service/workdocs/CHANGELOG.md#v1120-2022-11-14)
+ * **Feature**: Added 2 new document related operations, DeleteDocumentVersion and RestoreDocumentVersions.
+* `github.com/aws/aws-sdk-go-v2/service/xray`: [v1.14.0](service/xray/CHANGELOG.md#v1140-2022-11-14)
+ * **Feature**: This release enhances GetServiceGraph API to support new type of edge to represent links between SQS and Lambda in event-driven applications.
+
+# Release (2022-11-11)
+
+## General Highlights
+* **Dependency Update**: Updated to the latest SDK module versions
+
+## Module Highlights
+* `github.com/aws/aws-sdk-go-v2/config`: [v1.18.0](config/CHANGELOG.md#v1180-2022-11-11)
+ * **Announcement**: When using the SSOTokenProvider, a previous implementation incorrectly compensated for invalid SSOTokenProvider configurations in the shared profile. This has been fixed via PR #1903 and tracked in issue #1846
+ * **Feature**: Adds token refresh support (via SSOTokenProvider) when using the SSOCredentialProvider
+* `github.com/aws/aws-sdk-go-v2/credentials`: [v1.13.0](credentials/CHANGELOG.md#v1130-2022-11-11)
+ * **Announcement**: When using the SSOTokenProvider, a previous implementation incorrectly compensated for invalid SSOTokenProvider configurations in the shared profile. This has been fixed via PR #1903 and tracked in issue #1846
+ * **Feature**: Adds token refresh support (via SSOTokenProvider) when using the SSOCredentialProvider
+* `github.com/aws/aws-sdk-go-v2/service/glue`: [v1.34.1](service/glue/CHANGELOG.md#v1341-2022-11-11)
+ * **Documentation**: Added links related to enabling job bookmarks.
+* `github.com/aws/aws-sdk-go-v2/service/iot`: [v1.31.0](service/iot/CHANGELOG.md#v1310-2022-11-11)
+ * **Feature**: This release add new api listRelatedResourcesForAuditFinding and new member type IssuerCertificates for Iot device device defender Audit.
+* `github.com/aws/aws-sdk-go-v2/service/licensemanager`: [v1.16.0](service/licensemanager/CHANGELOG.md#v1160-2022-11-11)
+ * **Feature**: AWS License Manager now supports onboarded Management Accounts or Delegated Admins to view granted licenses aggregated from all accounts in the organization.
+* `github.com/aws/aws-sdk-go-v2/service/marketplacecatalog`: [v1.14.0](service/marketplacecatalog/CHANGELOG.md#v1140-2022-11-11)
+ * **Feature**: Added three new APIs to support tagging and tag-based authorization: TagResource, UntagResource, and ListTagsForResource. Added optional parameters to the StartChangeSet API to support tagging a resource while making a request to create it.
+* `github.com/aws/aws-sdk-go-v2/service/rekognition`: [v1.21.0](service/rekognition/CHANGELOG.md#v1210-2022-11-11)
+ * **Feature**: Adding support for ImageProperties feature to detect dominant colors and image brightness, sharpness, and contrast, inclusion and exclusion filters for labels and label categories, new fields to the API response, "aliases" and "categories"
+* `github.com/aws/aws-sdk-go-v2/service/securityhub`: [v1.23.8](service/securityhub/CHANGELOG.md#v1238-2022-11-11)
+ * **Documentation**: Documentation updates for Security Hub
+* `github.com/aws/aws-sdk-go-v2/service/ssmincidents`: [v1.18.0](service/ssmincidents/CHANGELOG.md#v1180-2022-11-11)
+ * **Feature**: RelatedItems now have an ID field which can be used for referencing them else where. Introducing event references in TimelineEvent API and increasing maximum length of "eventData" to 12K characters.
+
+# Release (2022-11-10)
+
+## General Highlights
+* **Dependency Update**: Updated to the latest SDK module versions
+
+## Module Highlights
+* `github.com/aws/aws-sdk-go-v2/service/autoscaling`: [v1.24.1](service/autoscaling/CHANGELOG.md#v1241-2022-11-10)
+ * **Documentation**: This release adds a new price capacity optimized allocation strategy for Spot Instances to help customers optimize provisioning of Spot Instances via EC2 Auto Scaling, EC2 Fleet, and Spot Fleet. It allocates Spot Instances based on both spare capacity availability and Spot Instance price.
+* `github.com/aws/aws-sdk-go-v2/service/ec2`: [v1.70.0](service/ec2/CHANGELOG.md#v1700-2022-11-10)
+ * **Feature**: This release adds a new price capacity optimized allocation strategy for Spot Instances to help customers optimize provisioning of Spot Instances via EC2 Auto Scaling, EC2 Fleet, and Spot Fleet. It allocates Spot Instances based on both spare capacity availability and Spot Instance price.
+* `github.com/aws/aws-sdk-go-v2/service/ecs`: [v1.19.0](service/ecs/CHANGELOG.md#v1190-2022-11-10)
+ * **Feature**: This release adds support for task scale-in protection with updateTaskProtection and getTaskProtection APIs. UpdateTaskProtection API can be used to protect a service managed task from being terminated by scale-in events and getTaskProtection API to get the scale-in protection status of a task.
+* `github.com/aws/aws-sdk-go-v2/service/elasticsearchservice`: [v1.17.0](service/elasticsearchservice/CHANGELOG.md#v1170-2022-11-10)
+ * **Feature**: Amazon OpenSearch Service now offers managed VPC endpoints to connect to your Amazon OpenSearch Service VPC-enabled domain in a Virtual Private Cloud (VPC). This feature allows you to privately access OpenSearch Service domain without using public IPs or requiring traffic to traverse the Internet.
+* `github.com/aws/aws-sdk-go-v2/service/resourceexplorer2`: [v1.0.1](service/resourceexplorer2/CHANGELOG.md#v101-2022-11-10)
+ * **Documentation**: Text only updates to some Resource Explorer descriptions.
+* `github.com/aws/aws-sdk-go-v2/service/scheduler`: [v1.0.0](service/scheduler/CHANGELOG.md#v100-2022-11-10)
+ * **Release**: New AWS service client module
+ * **Feature**: AWS introduces the new Amazon EventBridge Scheduler. EventBridge Scheduler is a serverless scheduler that allows you to create, run, and manage tasks from one central, managed service.
+
+# Release (2022-11-09)
+
+## Module Highlights
+* `github.com/aws/aws-sdk-go-v2/service/connect`: [v1.35.0](service/connect/CHANGELOG.md#v1350-2022-11-09)
+ * **Feature**: This release adds new fields SignInUrl, UserArn, and UserId to GetFederationToken response payload.
+* `github.com/aws/aws-sdk-go-v2/service/connectcases`: [v1.1.0](service/connectcases/CHANGELOG.md#v110-2022-11-09)
+ * **Feature**: This release adds the ability to disable templates through the UpdateTemplate API. Disabling templates prevents customers from creating cases using the template. For more information see https://docs.aws.amazon.com/cases/latest/APIReference/Welcome.html
+* `github.com/aws/aws-sdk-go-v2/service/ec2`: [v1.69.0](service/ec2/CHANGELOG.md#v1690-2022-11-09)
+ * **Feature**: Amazon EC2 Trn1 instances, powered by AWS Trainium chips, are purpose built for high-performance deep learning training. u-24tb1.112xlarge and u-18tb1.112xlarge High Memory instances are purpose-built to run large in-memory databases.
+* `github.com/aws/aws-sdk-go-v2/service/groundstation`: [v1.14.0](service/groundstation/CHANGELOG.md#v1140-2022-11-09)
+ * **Feature**: This release adds the preview of customer-provided ephemeris support for AWS Ground Station, allowing space vehicle owners to provide their own position and trajectory information for a satellite.
+* `github.com/aws/aws-sdk-go-v2/service/mediapackagevod`: [v1.19.0](service/mediapackagevod/CHANGELOG.md#v1190-2022-11-09)
+ * **Feature**: This release adds "IncludeIframeOnlyStream" for Dash endpoints.
+* `github.com/aws/aws-sdk-go-v2/service/transcribestreaming`: [v1.7.0](service/transcribestreaming/CHANGELOG.md#v170-2022-11-09)
+ * **Feature**: This will release hi-IN and th-TH
+
+# Release (2022-11-08)
+
+## Module Highlights
+* `github.com/aws/aws-sdk-go-v2/service/acm`: [v1.16.0](service/acm/CHANGELOG.md#v1160-2022-11-08)
+ * **Feature**: Support added for requesting elliptic curve certificate key algorithm types P-256 (EC_prime256v1) and P-384 (EC_secp384r1).
+* `github.com/aws/aws-sdk-go-v2/service/billingconductor`: [v1.1.0](service/billingconductor/CHANGELOG.md#v110-2022-11-08)
+ * **Feature**: This release adds the Recurring Custom Line Item feature along with a new API ListCustomLineItemVersions.
+* `github.com/aws/aws-sdk-go-v2/service/ec2`: [v1.68.0](service/ec2/CHANGELOG.md#v1680-2022-11-08)
+ * **Feature**: This release enables sharing of EC2 Placement Groups across accounts and within AWS Organizations using Resource Access Manager
+* `github.com/aws/aws-sdk-go-v2/service/fms`: [v1.20.0](service/fms/CHANGELOG.md#v1200-2022-11-08)
+ * **Feature**: AWS Firewall Manager now supports importing existing AWS Network Firewall firewalls into Firewall Manager policies.
+* `github.com/aws/aws-sdk-go-v2/service/lightsail`: [v1.24.0](service/lightsail/CHANGELOG.md#v1240-2022-11-08)
+ * **Feature**: This release adds support for Amazon Lightsail to automate the delegation of domains registered through Amazon Route 53 to Lightsail DNS management and to automate record creation for DNS validation of Lightsail SSL/TLS certificates.
+* `github.com/aws/aws-sdk-go-v2/service/opensearch`: [v1.11.0](service/opensearch/CHANGELOG.md#v1110-2022-11-08)
+ * **Feature**: Amazon OpenSearch Service now offers managed VPC endpoints to connect to your Amazon OpenSearch Service VPC-enabled domain in a Virtual Private Cloud (VPC). This feature allows you to privately access OpenSearch Service domain without using public IPs or requiring traffic to traverse the Internet.
+* `github.com/aws/aws-sdk-go-v2/service/polly`: [v1.19.0](service/polly/CHANGELOG.md#v1190-2022-11-08)
+ * **Feature**: Amazon Polly adds new voices: Elin (sv-SE), Ida (nb-NO), Laura (nl-NL) and Suvi (fi-FI). They are available as neural voices only.
+* `github.com/aws/aws-sdk-go-v2/service/resourceexplorer2`: [v1.0.0](service/resourceexplorer2/CHANGELOG.md#v100-2022-11-08)
+ * **Release**: New AWS service client module
+ * **Feature**: This is the initial SDK release for AWS Resource Explorer. AWS Resource Explorer lets your users search for and discover your AWS resources across the AWS Regions in your account.
+* `github.com/aws/aws-sdk-go-v2/service/route53`: [v1.23.0](service/route53/CHANGELOG.md#v1230-2022-11-08)
+ * **Feature**: Amazon Route 53 now supports the Europe (Zurich) Region (eu-central-2) for latency records, geoproximity records, and private DNS for Amazon VPCs in that region.
+
+# Release (2022-11-07)
+
+## Module Highlights
+* `github.com/aws/aws-sdk-go-v2/service/athena`: [v1.19.0](service/athena/CHANGELOG.md#v1190-2022-11-07)
+ * **Feature**: Adds support for using Query Result Reuse
+* `github.com/aws/aws-sdk-go-v2/service/autoscaling`: [v1.24.0](service/autoscaling/CHANGELOG.md#v1240-2022-11-07)
+ * **Feature**: This release adds support for two new attributes for attribute-based instance type selection - NetworkBandwidthGbps and AllowedInstanceTypes.
+* `github.com/aws/aws-sdk-go-v2/service/cloudtrail`: [v1.20.0](service/cloudtrail/CHANGELOG.md#v1200-2022-11-07)
+ * **Feature**: This release includes support for configuring a delegated administrator to manage an AWS Organizations organization CloudTrail trails and event data stores, and AWS Key Management Service encryption of CloudTrail Lake event data stores.
+* `github.com/aws/aws-sdk-go-v2/service/ec2`: [v1.67.0](service/ec2/CHANGELOG.md#v1670-2022-11-07)
+ * **Feature**: This release adds support for two new attributes for attribute-based instance type selection - NetworkBandwidthGbps and AllowedInstanceTypes.
+* `github.com/aws/aws-sdk-go-v2/service/elasticache`: [v1.23.0](service/elasticache/CHANGELOG.md#v1230-2022-11-07)
+ * **Feature**: Added support for IPv6 and dual stack for Memcached and Redis clusters. Customers can now launch new Redis and Memcached clusters with IPv6 and dual stack networking support.
+* `github.com/aws/aws-sdk-go-v2/service/lexmodelsv2`: [v1.26.0](service/lexmodelsv2/CHANGELOG.md#v1260-2022-11-07)
+ * **Feature**: Amazon Lex now supports new APIs for viewing and editing Custom Vocabulary in bots.
+* `github.com/aws/aws-sdk-go-v2/service/mediaconvert`: [v1.27.0](service/mediaconvert/CHANGELOG.md#v1270-2022-11-07)
+ * **Feature**: The AWS Elemental MediaConvert SDK has added support for setting the SDR reference white point for HDR conversions and conversion of HDR10 to DolbyVision without mastering metadata.
+* `github.com/aws/aws-sdk-go-v2/service/ssm`: [v1.32.0](service/ssm/CHANGELOG.md#v1320-2022-11-07)
+ * **Feature**: This release includes support for applying a CloudWatch alarm to multi account multi region Systems Manager Automation
+* `github.com/aws/aws-sdk-go-v2/service/wafv2`: [v1.23.1](service/wafv2/CHANGELOG.md#v1231-2022-11-07)
+ * **Documentation**: The geo match statement now adds labels for country and region. You can match requests at the region level by combining a geo match statement with label match statements.
+* `github.com/aws/aws-sdk-go-v2/service/wellarchitected`: [v1.17.0](service/wellarchitected/CHANGELOG.md#v1170-2022-11-07)
+ * **Feature**: This release adds support for integrations with AWS Trusted Advisor and AWS Service Catalog AppRegistry to improve workload discovery and speed up your workload reviews.
+* `github.com/aws/aws-sdk-go-v2/service/workspaces`: [v1.25.0](service/workspaces/CHANGELOG.md#v1250-2022-11-07)
+ * **Feature**: This release adds protocols attribute to workspaces properties data type. This enables customers to migrate workspaces from PC over IP (PCoIP) to WorkSpaces Streaming Protocol (WSP) using create and modify workspaces public APIs.
+
+# Release (2022-11-04)
+
+## Module Highlights
+* `github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs`: [v1.16.1](service/cloudwatchlogs/CHANGELOG.md#v1161-2022-11-04)
+ * **Documentation**: Doc-only update for bug fixes and support of export to buckets encrypted with SSE-KMS
+* `github.com/aws/aws-sdk-go-v2/service/ec2`: [v1.66.0](service/ec2/CHANGELOG.md#v1660-2022-11-04)
+ * **Feature**: This release adds API support for the recipient of an AMI account share to remove shared AMI launch permissions.
+* `github.com/aws/aws-sdk-go-v2/service/emrcontainers`: [v1.15.0](service/emrcontainers/CHANGELOG.md#v1150-2022-11-04)
+ * **Feature**: Adding support for Job templates. Job templates allow you to create and store templates to configure Spark applications parameters. This helps you ensure consistent settings across applications by reusing and enforcing configuration overrides in data pipelines.
+* `github.com/aws/aws-sdk-go-v2/service/internal/eventstreamtesting`: [v1.0.37](service/internal/eventstreamtesting/CHANGELOG.md#v1037-2022-11-04)
+ * **Dependency Update**: update golang.org/x/net dependency to 0.1.0
+
+# Release (2022-11-03)
+
+## Module Highlights
+* `github.com/aws/aws-sdk-go-v2/service/memorydb`: [v1.10.0](service/memorydb/CHANGELOG.md#v1100-2022-11-03)
+ * **Feature**: Adding support for r6gd instances for MemoryDB Redis with data tiering. In a cluster with data tiering enabled, when available memory capacity is exhausted, the least recently used data is automatically tiered to solid state drives for cost-effective capacity scaling with minimal performance impact.
+* `github.com/aws/aws-sdk-go-v2/service/sagemaker`: [v1.54.0](service/sagemaker/CHANGELOG.md#v1540-2022-11-03)
+ * **Feature**: Amazon SageMaker now supports running training jobs on ml.trn1 instance types.
+
+# Release (2022-11-02)
+
+## Module Highlights
+* `github.com/aws/aws-sdk-go-v2/service/iotsitewise`: [v1.26.0](service/iotsitewise/CHANGELOG.md#v1260-2022-11-02)
+ * **Feature**: This release adds the ListAssetModelProperties and ListAssetProperties APIs. You can list all properties that belong to a single asset model or asset using these two new APIs.
+* `github.com/aws/aws-sdk-go-v2/service/s3control`: [v1.25.0](service/s3control/CHANGELOG.md#v1250-2022-11-02)
+ * **Feature**: S3 on Outposts launches support for Lifecycle configuration for Outposts buckets. With S3 Lifecycle configuration, you can mange objects so they are stored cost effectively. You can manage objects using size-based rules and specify how many noncurrent versions bucket will retain.
+* `github.com/aws/aws-sdk-go-v2/service/sagemaker`: [v1.53.0](service/sagemaker/CHANGELOG.md#v1530-2022-11-02)
+ * **Feature**: This release updates Framework model regex for ModelPackage to support new Framework version xgboost, sklearn.
+* `github.com/aws/aws-sdk-go-v2/service/ssmincidents`: [v1.17.0](service/ssmincidents/CHANGELOG.md#v1170-2022-11-02)
+ * **Feature**: Adds support for tagging replication-set on creation.
+
+# Release (2022-11-01)
+
+## Module Highlights
+* `github.com/aws/aws-sdk-go-v2/service/rds`: [v1.28.0](service/rds/CHANGELOG.md#v1280-2022-11-01)
+ * **Feature**: Relational Database Service - This release adds support for configuring Storage Throughput on RDS database instances.
+* `github.com/aws/aws-sdk-go-v2/service/textract`: [v1.17.0](service/textract/CHANGELOG.md#v1170-2022-11-01)
+ * **Feature**: Add ocr results in AnalyzeIDResponse as blocks
+
+# Release (2022-10-31)
+
+## Module Highlights
+* `github.com/aws/aws-sdk-go-v2/service/apprunner`: [v1.15.0](service/apprunner/CHANGELOG.md#v1150-2022-10-31)
+ * **Feature**: This release adds support for private App Runner services. Services may now be configured to be made private and only accessible from a VPC. The changes include a new VpcIngressConnection resource and several new and modified APIs.
+* `github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs`: [v1.16.0](service/cloudwatchlogs/CHANGELOG.md#v1160-2022-10-31)
+ * **Feature**: SDK release to support tagging for destinations and log groups with TagResource. Also supports tag on create with PutDestination.
+* `github.com/aws/aws-sdk-go-v2/service/connect`: [v1.34.0](service/connect/CHANGELOG.md#v1340-2022-10-31)
+ * **Feature**: Amazon connect now support a new API DismissUserContact to dismiss or remove terminated contacts in Agent CCP
+* `github.com/aws/aws-sdk-go-v2/service/ec2`: [v1.65.0](service/ec2/CHANGELOG.md#v1650-2022-10-31)
+ * **Feature**: Elastic IP transfer is a new Amazon VPC feature that allows you to transfer your Elastic IP addresses from one AWS Account to another.
+* `github.com/aws/aws-sdk-go-v2/service/iot`: [v1.30.0](service/iot/CHANGELOG.md#v1300-2022-10-31)
+ * **Feature**: This release adds the Amazon Location action to IoT Rules Engine.
+* `github.com/aws/aws-sdk-go-v2/service/sesv2`: [v1.15.0](service/sesv2/CHANGELOG.md#v1150-2022-10-31)
+ * **Feature**: This release includes support for interacting with the Virtual Deliverability Manager, allowing you to opt in/out of the feature and to retrieve recommendations and metric data.
+* `github.com/aws/aws-sdk-go-v2/service/textract`: [v1.16.0](service/textract/CHANGELOG.md#v1160-2022-10-31)
+ * **Feature**: This release introduces additional support for 30+ normalized fields such as vendor address and currency. It also includes OCR output in the response and accuracy improvements for the already supported fields in previous version
+
+# Release (2022-10-28)
+
+## Module Highlights
+* `github.com/aws/aws-sdk-go-v2/service/apprunner`: [v1.14.0](service/apprunner/CHANGELOG.md#v1140-2022-10-28)
+ * **Feature**: AWS App Runner adds .NET 6, Go 1, PHP 8.1 and Ruby 3.1 runtimes.
+* `github.com/aws/aws-sdk-go-v2/service/appstream`: [v1.18.0](service/appstream/CHANGELOG.md#v1180-2022-10-28)
+ * **Feature**: This release includes CertificateBasedAuthProperties in CreateDirectoryConfig and UpdateDirectoryConfig.
+* `github.com/aws/aws-sdk-go-v2/service/cloud9`: [v1.16.20](service/cloud9/CHANGELOG.md#v11620-2022-10-28)
+ * **Documentation**: Update to the documentation section of the Cloud9 API Reference guide.
+* `github.com/aws/aws-sdk-go-v2/service/cloudformation`: [v1.23.0](service/cloudformation/CHANGELOG.md#v1230-2022-10-28)
+ * **Feature**: This release adds more fields to improves visibility of AWS CloudFormation StackSets information in following APIs: ListStackInstances, DescribeStackInstance, ListStackSetOperationResults, ListStackSetOperations, DescribeStackSetOperation.
+* `github.com/aws/aws-sdk-go-v2/service/mediatailor`: [v1.19.0](service/mediatailor/CHANGELOG.md#v1190-2022-10-28)
+ * **Feature**: This release introduces support for SCTE-35 segmentation descriptor messages which can be sent within time signal messages.
+
+# Release (2022-10-27)
+
+## Module Highlights
+* `github.com/aws/aws-sdk-go-v2/service/ec2`: [v1.64.0](service/ec2/CHANGELOG.md#v1640-2022-10-27)
+ * **Feature**: Feature supports the replacement of instance root volume using an updated AMI without requiring customers to stop their instance.
+* `github.com/aws/aws-sdk-go-v2/service/fms`: [v1.19.0](service/fms/CHANGELOG.md#v1190-2022-10-27)
+ * **Feature**: Add support NetworkFirewall Managed Rule Group Override flag in GetViolationDetails API
+* `github.com/aws/aws-sdk-go-v2/service/glue`: [v1.34.0](service/glue/CHANGELOG.md#v1340-2022-10-27)
+ * **Feature**: Added support for custom datatypes when using custom csv classifier.
+* `github.com/aws/aws-sdk-go-v2/service/redshift`: [v1.26.13](service/redshift/CHANGELOG.md#v12613-2022-10-27)
+ * **Documentation**: This release clarifies use for the ElasticIp parameter of the CreateCluster and RestoreFromClusterSnapshot APIs.
+* `github.com/aws/aws-sdk-go-v2/service/sagemaker`: [v1.52.0](service/sagemaker/CHANGELOG.md#v1520-2022-10-27)
+ * **Feature**: This change allows customers to provide a custom entrypoint script for the docker container to be run while executing training jobs, and provide custom arguments to the entrypoint script.
+* `github.com/aws/aws-sdk-go-v2/service/wafv2`: [v1.23.0](service/wafv2/CHANGELOG.md#v1230-2022-10-27)
+ * **Feature**: This release adds the following: Challenge rule action, to silently verify client browsers; rule group rule action override to any valid rule action, not just Count; token sharing between protected applications for challenge/CAPTCHA token; targeted rules option for Bot Control managed rule group.
+
+# Release (2022-10-26)
+
+## Module Highlights
+* `github.com/aws/aws-sdk-go-v2/service/iam`: [v1.18.23](service/iam/CHANGELOG.md#v11823-2022-10-26)
+ * **Documentation**: Doc only update that corrects instances of CLI not using an entity.
+* `github.com/aws/aws-sdk-go-v2/service/kafka`: [v1.18.0](service/kafka/CHANGELOG.md#v1180-2022-10-26)
+ * **Feature**: This release adds support for Tiered Storage. UpdateStorage allows you to control the Storage Mode for supported storage tiers.
+* `github.com/aws/aws-sdk-go-v2/service/neptune`: [v1.18.0](service/neptune/CHANGELOG.md#v1180-2022-10-26)
+ * **Feature**: Added a new cluster-level attribute to set the capacity range for Neptune Serverless instances.
+* `github.com/aws/aws-sdk-go-v2/service/sagemaker`: [v1.51.0](service/sagemaker/CHANGELOG.md#v1510-2022-10-26)
+ * **Feature**: Amazon SageMaker Automatic Model Tuning now supports specifying Grid Search strategy for tuning jobs, which evaluates all hyperparameter combinations exhaustively based on the categorical hyperparameters provided.
+
+# Release (2022-10-25)
+
+## Module Highlights
+* `github.com/aws/aws-sdk-go-v2/service/accessanalyzer`: [v1.17.0](service/accessanalyzer/CHANGELOG.md#v1170-2022-10-25)
+ * **Feature**: This release adds support for six new resource types in IAM Access Analyzer to help you easily identify public and cross-account access to your AWS resources. Updated service API, documentation, and paginators.
+* `github.com/aws/aws-sdk-go-v2/service/location`: [v1.19.3](service/location/CHANGELOG.md#v1193-2022-10-25)
+ * **Documentation**: Added new map styles with satellite imagery for map resources using HERE as a data provider.
+* `github.com/aws/aws-sdk-go-v2/service/mediatailor`: [v1.18.0](service/mediatailor/CHANGELOG.md#v1180-2022-10-25)
+ * **Feature**: This release is a documentation update
+* `github.com/aws/aws-sdk-go-v2/service/rds`: [v1.27.0](service/rds/CHANGELOG.md#v1270-2022-10-25)
+ * **Feature**: Relational Database Service - This release adds support for exporting DB cluster data to Amazon S3.
+* `github.com/aws/aws-sdk-go-v2/service/workspaces`: [v1.24.0](service/workspaces/CHANGELOG.md#v1240-2022-10-25)
+ * **Feature**: This release adds new enums for supporting Workspaces Core features, including creating Manual running mode workspaces, importing regular Workspaces Core images and importing g4dn Workspaces Core images.
+
# Release (2022-10-24)
## General Highlights
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/Makefile b/vendor/github.com/aws/aws-sdk-go-v2/Makefile
index 4b761e771a..4bc9dfaf01 100644
--- a/vendor/github.com/aws/aws-sdk-go-v2/Makefile
+++ b/vendor/github.com/aws/aws-sdk-go-v2/Makefile
@@ -120,6 +120,7 @@ gen-config-asserts:
gen-internal-codegen:
@echo "Generating internal/codegen"
cd internal/codegen \
+ && go mod tidy \
&& go generate
gen-repo-mod-replace:
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/aws/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/aws/go_module_metadata.go
index 41d23512a4..6d936cd505 100644
--- a/vendor/github.com/aws/aws-sdk-go-v2/aws/go_module_metadata.go
+++ b/vendor/github.com/aws/aws-sdk-go-v2/aws/go_module_metadata.go
@@ -3,4 +3,4 @@
package aws
// goModuleVersion is the tagged release for this module
-const goModuleVersion = "1.17.1"
+const goModuleVersion = "1.17.2"
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/CHANGELOG.md
index d81093cad4..c95d493ea8 100644
--- a/vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/CHANGELOG.md
+++ b/vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/CHANGELOG.md
@@ -1,3 +1,7 @@
+# v1.4.10 (2022-12-02)
+
+* No change notes available for this release.
+
# v1.4.9 (2022-10-24)
* No change notes available for this release.
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/go_module_metadata.go
index 35adfcc20c..0ca5492a3e 100644
--- a/vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/go_module_metadata.go
+++ b/vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/go_module_metadata.go
@@ -3,4 +3,4 @@
package eventstream
// goModuleVersion is the tagged release for this module
-const goModuleVersion = "1.4.9"
+const goModuleVersion = "1.4.10"
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/config/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/config/CHANGELOG.md
index 0386bcf7f4..e02d957c4a 100644
--- a/vendor/github.com/aws/aws-sdk-go-v2/config/CHANGELOG.md
+++ b/vendor/github.com/aws/aws-sdk-go-v2/config/CHANGELOG.md
@@ -1,3 +1,7 @@
+# v1.18.4 (2022-12-02)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
# v1.18.3 (2022-11-22)
* **Dependency Update**: Updated to the latest SDK module versions
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/config/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/config/go_module_metadata.go
index 1a1aaed58a..44b6e16dcd 100644
--- a/vendor/github.com/aws/aws-sdk-go-v2/config/go_module_metadata.go
+++ b/vendor/github.com/aws/aws-sdk-go-v2/config/go_module_metadata.go
@@ -3,4 +3,4 @@
package config
// goModuleVersion is the tagged release for this module
-const goModuleVersion = "1.18.3"
+const goModuleVersion = "1.18.4"
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/credentials/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/credentials/CHANGELOG.md
index 953ce67f3c..613d814926 100644
--- a/vendor/github.com/aws/aws-sdk-go-v2/credentials/CHANGELOG.md
+++ b/vendor/github.com/aws/aws-sdk-go-v2/credentials/CHANGELOG.md
@@ -1,3 +1,7 @@
+# v1.13.4 (2022-12-02)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
# v1.13.3 (2022-11-22)
* **Dependency Update**: Updated to the latest SDK module versions
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/credentials/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/credentials/go_module_metadata.go
index 0bcacb3963..9866ca36f8 100644
--- a/vendor/github.com/aws/aws-sdk-go-v2/credentials/go_module_metadata.go
+++ b/vendor/github.com/aws/aws-sdk-go-v2/credentials/go_module_metadata.go
@@ -3,4 +3,4 @@
package credentials
// goModuleVersion is the tagged release for this module
-const goModuleVersion = "1.13.3"
+const goModuleVersion = "1.13.4"
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/CHANGELOG.md
index 0dfb44be1a..f0ab4cd76d 100644
--- a/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/CHANGELOG.md
+++ b/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/CHANGELOG.md
@@ -1,3 +1,7 @@
+# v1.12.20 (2022-12-02)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
# v1.12.19 (2022-10-24)
* **Bug Fix**: Fixes an issue that prevented logging of the API request or responses when the respective log modes were enabled.
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/go_module_metadata.go
index 9fc713a7cb..4da2bd2c18 100644
--- a/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/go_module_metadata.go
+++ b/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/go_module_metadata.go
@@ -3,4 +3,4 @@
package imds
// goModuleVersion is the tagged release for this module
-const goModuleVersion = "1.12.19"
+const goModuleVersion = "1.12.20"
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/feature/s3/manager/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/feature/s3/manager/CHANGELOG.md
index 1602d22925..9f446c501c 100644
--- a/vendor/github.com/aws/aws-sdk-go-v2/feature/s3/manager/CHANGELOG.md
+++ b/vendor/github.com/aws/aws-sdk-go-v2/feature/s3/manager/CHANGELOG.md
@@ -1,3 +1,7 @@
+# v1.11.43 (2022-12-02)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
# v1.11.42 (2022-11-22)
* **Dependency Update**: Updated to the latest SDK module versions
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/feature/s3/manager/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/feature/s3/manager/go_module_metadata.go
index e481cd689d..475e01773b 100644
--- a/vendor/github.com/aws/aws-sdk-go-v2/feature/s3/manager/go_module_metadata.go
+++ b/vendor/github.com/aws/aws-sdk-go-v2/feature/s3/manager/go_module_metadata.go
@@ -3,4 +3,4 @@
package manager
// goModuleVersion is the tagged release for this module
-const goModuleVersion = "1.11.42"
+const goModuleVersion = "1.11.43"
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/CHANGELOG.md
index ab6184058b..41d589b381 100644
--- a/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/CHANGELOG.md
+++ b/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/CHANGELOG.md
@@ -1,3 +1,7 @@
+# v1.1.26 (2022-12-02)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
# v1.1.25 (2022-10-24)
* **Dependency Update**: Updated to the latest SDK module versions
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/go_module_metadata.go
index b9d5ca7fae..58b3ba7ad8 100644
--- a/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/go_module_metadata.go
+++ b/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/go_module_metadata.go
@@ -3,4 +3,4 @@
package configsources
// goModuleVersion is the tagged release for this module
-const goModuleVersion = "1.1.25"
+const goModuleVersion = "1.1.26"
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/CHANGELOG.md
index 90e3d662d0..678f6634f2 100644
--- a/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/CHANGELOG.md
+++ b/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/CHANGELOG.md
@@ -1,3 +1,7 @@
+# v2.4.20 (2022-12-02)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
# v2.4.19 (2022-10-24)
* **Dependency Update**: Updated to the latest SDK module versions
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/go_module_metadata.go
index d839c6d9b6..ec010e0aae 100644
--- a/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/go_module_metadata.go
+++ b/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/go_module_metadata.go
@@ -3,4 +3,4 @@
package endpoints
// goModuleVersion is the tagged release for this module
-const goModuleVersion = "2.4.19"
+const goModuleVersion = "2.4.20"
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/ini/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/internal/ini/CHANGELOG.md
index 2cac3297b3..fc5b9781b5 100644
--- a/vendor/github.com/aws/aws-sdk-go-v2/internal/ini/CHANGELOG.md
+++ b/vendor/github.com/aws/aws-sdk-go-v2/internal/ini/CHANGELOG.md
@@ -1,3 +1,7 @@
+# v1.3.27 (2022-12-02)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
# v1.3.26 (2022-10-24)
* **Dependency Update**: Updated to the latest SDK module versions
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/ini/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/internal/ini/go_module_metadata.go
index 6d796b3100..e4c947fecc 100644
--- a/vendor/github.com/aws/aws-sdk-go-v2/internal/ini/go_module_metadata.go
+++ b/vendor/github.com/aws/aws-sdk-go-v2/internal/ini/go_module_metadata.go
@@ -3,4 +3,4 @@
package ini
// goModuleVersion is the tagged release for this module
-const goModuleVersion = "1.3.26"
+const goModuleVersion = "1.3.27"
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/CHANGELOG.md
index cc8edf2eb5..bc55796348 100644
--- a/vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/CHANGELOG.md
+++ b/vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/CHANGELOG.md
@@ -1,3 +1,7 @@
+# v1.0.17 (2022-12-02)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
# v1.0.16 (2022-10-24)
* **Dependency Update**: Updated to the latest SDK module versions
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/go_module_metadata.go
index 2b1401a3fd..be1f79e20f 100644
--- a/vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/go_module_metadata.go
+++ b/vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/go_module_metadata.go
@@ -3,4 +3,4 @@
package v4a
// goModuleVersion is the tagged release for this module
-const goModuleVersion = "1.0.16"
+const goModuleVersion = "1.0.17"
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/modman.toml b/vendor/github.com/aws/aws-sdk-go-v2/modman.toml
index d869782145..b6d07cdd6d 100644
--- a/vendor/github.com/aws/aws-sdk-go-v2/modman.toml
+++ b/vendor/github.com/aws/aws-sdk-go-v2/modman.toml
@@ -1,10 +1,10 @@
[dependencies]
"github.com/aws/aws-sdk-go" = "v1.44.28"
- "github.com/aws/smithy-go" = "v1.13.4"
+ "github.com/aws/smithy-go" = "v1.13.5"
"github.com/google/go-cmp" = "v0.5.8"
"github.com/jmespath/go-jmespath" = "v0.4.0"
- "golang.org/x/net" = "v0.0.0-20220127200216-cd36cc0744dd"
+ "golang.org/x/net" = "v0.1.0"
[modules]
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding/CHANGELOG.md
index a92035e29b..b3998b28b2 100644
--- a/vendor/github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding/CHANGELOG.md
+++ b/vendor/github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding/CHANGELOG.md
@@ -1,3 +1,7 @@
+# v1.9.11 (2022-12-02)
+
+* No change notes available for this release.
+
# v1.9.10 (2022-10-24)
* No change notes available for this release.
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding/go_module_metadata.go
index 036a0c08e5..f49fa9218d 100644
--- a/vendor/github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding/go_module_metadata.go
+++ b/vendor/github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding/go_module_metadata.go
@@ -3,4 +3,4 @@
package acceptencoding
// goModuleVersion is the tagged release for this module
-const goModuleVersion = "1.9.10"
+const goModuleVersion = "1.9.11"
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/internal/checksum/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/service/internal/checksum/CHANGELOG.md
index 531f193805..27d70fe1fd 100644
--- a/vendor/github.com/aws/aws-sdk-go-v2/service/internal/checksum/CHANGELOG.md
+++ b/vendor/github.com/aws/aws-sdk-go-v2/service/internal/checksum/CHANGELOG.md
@@ -1,3 +1,7 @@
+# v1.1.21 (2022-12-02)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
# v1.1.20 (2022-10-24)
* **Dependency Update**: Updated to the latest SDK module versions
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/internal/checksum/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/service/internal/checksum/go_module_metadata.go
index 0cf97a5652..c923037772 100644
--- a/vendor/github.com/aws/aws-sdk-go-v2/service/internal/checksum/go_module_metadata.go
+++ b/vendor/github.com/aws/aws-sdk-go-v2/service/internal/checksum/go_module_metadata.go
@@ -3,4 +3,4 @@
package checksum
// goModuleVersion is the tagged release for this module
-const goModuleVersion = "1.1.20"
+const goModuleVersion = "1.1.21"
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/CHANGELOG.md
index 89832ca1d0..a2dfc457c1 100644
--- a/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/CHANGELOG.md
+++ b/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/CHANGELOG.md
@@ -1,3 +1,7 @@
+# v1.9.20 (2022-12-02)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
# v1.9.19 (2022-10-24)
* **Dependency Update**: Updated to the latest SDK module versions
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/go_module_metadata.go
index c10027df60..3b99e9c4f6 100644
--- a/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/go_module_metadata.go
+++ b/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/go_module_metadata.go
@@ -3,4 +3,4 @@
package presignedurl
// goModuleVersion is the tagged release for this module
-const goModuleVersion = "1.9.19"
+const goModuleVersion = "1.9.20"
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/internal/s3shared/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/service/internal/s3shared/CHANGELOG.md
index 782b3a3adc..5a91105868 100644
--- a/vendor/github.com/aws/aws-sdk-go-v2/service/internal/s3shared/CHANGELOG.md
+++ b/vendor/github.com/aws/aws-sdk-go-v2/service/internal/s3shared/CHANGELOG.md
@@ -1,3 +1,7 @@
+# v1.13.20 (2022-12-02)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
# v1.13.19 (2022-10-24)
* **Dependency Update**: Updated to the latest SDK module versions
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/internal/s3shared/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/service/internal/s3shared/go_module_metadata.go
index f0495ea2eb..b6e0f39a15 100644
--- a/vendor/github.com/aws/aws-sdk-go-v2/service/internal/s3shared/go_module_metadata.go
+++ b/vendor/github.com/aws/aws-sdk-go-v2/service/internal/s3shared/go_module_metadata.go
@@ -3,4 +3,4 @@
package s3shared
// goModuleVersion is the tagged release for this module
-const goModuleVersion = "1.13.19"
+const goModuleVersion = "1.13.20"
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/s3/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/service/s3/CHANGELOG.md
index 3fd73499d4..7ba549c467 100644
--- a/vendor/github.com/aws/aws-sdk-go-v2/service/s3/CHANGELOG.md
+++ b/vendor/github.com/aws/aws-sdk-go-v2/service/s3/CHANGELOG.md
@@ -1,3 +1,7 @@
+# v1.29.5 (2022-12-02)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
# v1.29.4 (2022-11-22)
* No change notes available for this release.
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/s3/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/service/s3/go_module_metadata.go
index d2204ecd02..0dbd3f1be8 100644
--- a/vendor/github.com/aws/aws-sdk-go-v2/service/s3/go_module_metadata.go
+++ b/vendor/github.com/aws/aws-sdk-go-v2/service/s3/go_module_metadata.go
@@ -3,4 +3,4 @@
package s3
// goModuleVersion is the tagged release for this module
-const goModuleVersion = "1.29.4"
+const goModuleVersion = "1.29.5"
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/CHANGELOG.md
index 2f8860d2f2..49b4e31d6b 100644
--- a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/CHANGELOG.md
+++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/CHANGELOG.md
@@ -1,3 +1,7 @@
+# v1.11.26 (2022-12-02)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
# v1.11.25 (2022-10-24)
* **Dependency Update**: Updated to the latest SDK module versions
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/go_module_metadata.go
index e2de3ea315..cbfe45ee1a 100644
--- a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/go_module_metadata.go
+++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/go_module_metadata.go
@@ -3,4 +3,4 @@
package sso
// goModuleVersion is the tagged release for this module
-const goModuleVersion = "1.11.25"
+const goModuleVersion = "1.11.26"
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/CHANGELOG.md
index 4245e8d9fd..b3b019177d 100644
--- a/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/CHANGELOG.md
+++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/CHANGELOG.md
@@ -1,3 +1,7 @@
+# v1.13.9 (2022-12-02)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
# v1.13.8 (2022-10-24)
* **Dependency Update**: Updated to the latest SDK module versions
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/go_module_metadata.go
index 9c79d16f41..a5a50c97fa 100644
--- a/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/go_module_metadata.go
+++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/go_module_metadata.go
@@ -3,4 +3,4 @@
package ssooidc
// goModuleVersion is the tagged release for this module
-const goModuleVersion = "1.13.8"
+const goModuleVersion = "1.13.9"
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/CHANGELOG.md
index 6255c0bc5d..106016915f 100644
--- a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/CHANGELOG.md
+++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/CHANGELOG.md
@@ -1,3 +1,7 @@
+# v1.17.6 (2022-12-02)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
# v1.17.5 (2022-11-22)
* No change notes available for this release.
diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/go_module_metadata.go
index 9e6b85cc41..ae6f9e766d 100644
--- a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/go_module_metadata.go
+++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/go_module_metadata.go
@@ -3,4 +3,4 @@
package sts
// goModuleVersion is the tagged release for this module
-const goModuleVersion = "1.17.5"
+const goModuleVersion = "1.17.6"
diff --git a/vendor/github.com/aws/aws-sdk-go/aws/endpoints/defaults.go b/vendor/github.com/aws/aws-sdk-go/aws/endpoints/defaults.go
index 0e53126722..76cba0656e 100644
--- a/vendor/github.com/aws/aws-sdk-go/aws/endpoints/defaults.go
+++ b/vendor/github.com/aws/aws-sdk-go/aws/endpoints/defaults.go
@@ -1456,6 +1456,26 @@ var awsPartition = partition{
},
},
},
+ "api.ecr-public": service{
+ Endpoints: serviceEndpoints{
+ endpointKey{
+ Region: "us-east-1",
+ }: endpoint{
+ Hostname: "api.ecr-public.us-east-1.amazonaws.com",
+ CredentialScope: credentialScope{
+ Region: "us-east-1",
+ },
+ },
+ endpointKey{
+ Region: "us-west-2",
+ }: endpoint{
+ Hostname: "api.ecr-public.us-west-2.amazonaws.com",
+ CredentialScope: credentialScope{
+ Region: "us-west-2",
+ },
+ },
+ },
+ },
"api.elastic-inference": service{
Endpoints: serviceEndpoints{
endpointKey{
@@ -4940,6 +4960,17 @@ var awsPartition = partition{
},
},
},
+ "codecatalyst": service{
+ PartitionEndpoint: "aws-global",
+ IsRegionalized: boxedFalse,
+ Endpoints: serviceEndpoints{
+ endpointKey{
+ Region: "aws-global",
+ }: endpoint{
+ Hostname: "codecatalyst.global.api.aws",
+ },
+ },
+ },
"codecommit": service{
Endpoints: serviceEndpoints{
endpointKey{
@@ -12088,22 +12119,6 @@ var awsPartition = partition{
endpointKey{
Region: "ca-central-1",
}: endpoint{},
- endpointKey{
- Region: "dataplane-ap-south-1",
- }: endpoint{
- Hostname: "greengrass-ats.iot.ap-south-1.amazonaws.com",
- CredentialScope: credentialScope{
- Region: "ap-south-1",
- },
- },
- endpointKey{
- Region: "dataplane-us-east-2",
- }: endpoint{
- Hostname: "greengrass-ats.iot.us-east-2.amazonaws.com",
- CredentialScope: credentialScope{
- Region: "us-east-2",
- },
- },
endpointKey{
Region: "eu-central-1",
}: endpoint{},
@@ -18164,6 +18179,79 @@ var awsPartition = partition{
},
},
},
+ "pipes": service{
+ Endpoints: serviceEndpoints{
+ endpointKey{
+ Region: "af-south-1",
+ }: endpoint{},
+ endpointKey{
+ Region: "ap-east-1",
+ }: endpoint{},
+ endpointKey{
+ Region: "ap-northeast-1",
+ }: endpoint{},
+ endpointKey{
+ Region: "ap-northeast-2",
+ }: endpoint{},
+ endpointKey{
+ Region: "ap-northeast-3",
+ }: endpoint{},
+ endpointKey{
+ Region: "ap-south-1",
+ }: endpoint{},
+ endpointKey{
+ Region: "ap-southeast-1",
+ }: endpoint{},
+ endpointKey{
+ Region: "ap-southeast-2",
+ }: endpoint{},
+ endpointKey{
+ Region: "ap-southeast-3",
+ }: endpoint{},
+ endpointKey{
+ Region: "ca-central-1",
+ }: endpoint{},
+ endpointKey{
+ Region: "eu-central-1",
+ }: endpoint{},
+ endpointKey{
+ Region: "eu-north-1",
+ }: endpoint{},
+ endpointKey{
+ Region: "eu-south-1",
+ }: endpoint{},
+ endpointKey{
+ Region: "eu-west-1",
+ }: endpoint{},
+ endpointKey{
+ Region: "eu-west-2",
+ }: endpoint{},
+ endpointKey{
+ Region: "eu-west-3",
+ }: endpoint{},
+ endpointKey{
+ Region: "me-central-1",
+ }: endpoint{},
+ endpointKey{
+ Region: "me-south-1",
+ }: endpoint{},
+ endpointKey{
+ Region: "sa-east-1",
+ }: endpoint{},
+ endpointKey{
+ Region: "us-east-1",
+ }: endpoint{},
+ endpointKey{
+ Region: "us-east-2",
+ }: endpoint{},
+ endpointKey{
+ Region: "us-west-1",
+ }: endpoint{},
+ endpointKey{
+ Region: "us-west-2",
+ }: endpoint{},
+ },
+ },
"polly": service{
Endpoints: serviceEndpoints{
endpointKey{
@@ -21690,6 +21778,13 @@ var awsPartition = partition{
}: endpoint{},
},
},
+ "sagemaker-geospatial": service{
+ Endpoints: serviceEndpoints{
+ endpointKey{
+ Region: "us-west-2",
+ }: endpoint{},
+ },
+ },
"savingsplans": service{
PartitionEndpoint: "aws-global",
IsRegionalized: boxedFalse,
@@ -28147,14 +28242,6 @@ var awscnPartition = partition{
endpointKey{
Region: "cn-north-1",
}: endpoint{},
- endpointKey{
- Region: "dataplane-cn-north-1",
- }: endpoint{
- Hostname: "greengrass.ats.iot.cn-north-1.amazonaws.com.cn",
- CredentialScope: credentialScope{
- Region: "cn-north-1",
- },
- },
},
},
"guardduty": service{
diff --git a/vendor/github.com/aws/aws-sdk-go/aws/version.go b/vendor/github.com/aws/aws-sdk-go/aws/version.go
index 41fe3cf0e3..898da8d0bf 100644
--- a/vendor/github.com/aws/aws-sdk-go/aws/version.go
+++ b/vendor/github.com/aws/aws-sdk-go/aws/version.go
@@ -5,4 +5,4 @@ package aws
const SDKName = "aws-sdk-go"
// SDKVersion is the version of this SDK
-const SDKVersion = "1.44.149"
+const SDKVersion = "1.44.152"
diff --git a/vendor/github.com/aws/smithy-go/CHANGELOG.md b/vendor/github.com/aws/smithy-go/CHANGELOG.md
index 41bbcfac3a..1e23bf95b3 100644
--- a/vendor/github.com/aws/smithy-go/CHANGELOG.md
+++ b/vendor/github.com/aws/smithy-go/CHANGELOG.md
@@ -1,3 +1,7 @@
+# Release (2022-12-02)
+
+* No change notes available for this release.
+
# Release (2022-10-24)
## Module Highlights
diff --git a/vendor/github.com/aws/smithy-go/README.md b/vendor/github.com/aws/smithy-go/README.md
index 789b378896..a4bb43fbe9 100644
--- a/vendor/github.com/aws/smithy-go/README.md
+++ b/vendor/github.com/aws/smithy-go/README.md
@@ -2,7 +2,7 @@
[](https://github.com/aws/smithy-go/actions/workflows/go.yml)[](https://github.com/aws/smithy-go/actions/workflows/codegen.yml)
-Smithy code generators for Go.
+[Smithy](https://smithy.io/) code generators for Go.
**WARNING: All interfaces are subject to change.**
diff --git a/vendor/github.com/aws/smithy-go/encoding/xml/doc.go b/vendor/github.com/aws/smithy-go/encoding/xml/doc.go
index d6e1e41e16..f9200093e8 100644
--- a/vendor/github.com/aws/smithy-go/encoding/xml/doc.go
+++ b/vendor/github.com/aws/smithy-go/encoding/xml/doc.go
@@ -2,7 +2,7 @@
Package xml holds the XMl encoder utility. This utility is written in accordance to our design to delegate to
shape serializer function in which a xml.Value will be passed around.
-Resources followed: https://awslabs.github.io/smithy/1.0/spec/core/xml-traits.html#
+Resources followed: https://smithy.io/2.0/spec/protocol-traits.html#xml-bindings
Member Element
diff --git a/vendor/github.com/aws/smithy-go/go_module_metadata.go b/vendor/github.com/aws/smithy-go/go_module_metadata.go
index 4ed5881885..8eaac41e7a 100644
--- a/vendor/github.com/aws/smithy-go/go_module_metadata.go
+++ b/vendor/github.com/aws/smithy-go/go_module_metadata.go
@@ -3,4 +3,4 @@
package smithy
// goModuleVersion is the tagged release for this module
-const goModuleVersion = "1.13.4"
+const goModuleVersion = "1.13.5"
diff --git a/vendor/github.com/cespare/xxhash/v2/README.md b/vendor/github.com/cespare/xxhash/v2/README.md
index 792b4a60b3..8bf0e5b781 100644
--- a/vendor/github.com/cespare/xxhash/v2/README.md
+++ b/vendor/github.com/cespare/xxhash/v2/README.md
@@ -3,8 +3,7 @@
[](https://pkg.go.dev/github.com/cespare/xxhash/v2)
[](https://github.com/cespare/xxhash/actions/workflows/test.yml)
-xxhash is a Go implementation of the 64-bit
-[xxHash](http://cyan4973.github.io/xxHash/) algorithm, XXH64. This is a
+xxhash is a Go implementation of the 64-bit [xxHash] algorithm, XXH64. This is a
high-quality hashing algorithm that is much faster than anything in the Go
standard library.
@@ -25,8 +24,11 @@ func (*Digest) WriteString(string) (int, error)
func (*Digest) Sum64() uint64
```
-This implementation provides a fast pure-Go implementation and an even faster
-assembly implementation for amd64.
+The package is written with optimized pure Go and also contains even faster
+assembly implementations for amd64 and arm64. If desired, the `purego` build tag
+opts into using the Go code even on those architectures.
+
+[xxHash]: http://cyan4973.github.io/xxHash/
## Compatibility
@@ -45,19 +47,20 @@ I recommend using the latest release of Go.
Here are some quick benchmarks comparing the pure-Go and assembly
implementations of Sum64.
-| input size | purego | asm |
-| --- | --- | --- |
-| 5 B | 979.66 MB/s | 1291.17 MB/s |
-| 100 B | 7475.26 MB/s | 7973.40 MB/s |
-| 4 KB | 17573.46 MB/s | 17602.65 MB/s |
-| 10 MB | 17131.46 MB/s | 17142.16 MB/s |
+| input size | purego | asm |
+| ---------- | --------- | --------- |
+| 4 B | 1.3 GB/s | 1.2 GB/s |
+| 16 B | 2.9 GB/s | 3.5 GB/s |
+| 100 B | 6.9 GB/s | 8.1 GB/s |
+| 4 KB | 11.7 GB/s | 16.7 GB/s |
+| 10 MB | 12.0 GB/s | 17.3 GB/s |
-These numbers were generated on Ubuntu 18.04 with an Intel i7-8700K CPU using
-the following commands under Go 1.11.2:
+These numbers were generated on Ubuntu 20.04 with an Intel Xeon Platinum 8252C
+CPU using the following commands under Go 1.19.2:
```
-$ go test -tags purego -benchtime 10s -bench '/xxhash,direct,bytes'
-$ go test -benchtime 10s -bench '/xxhash,direct,bytes'
+benchstat <(go test -tags purego -benchtime 500ms -count 15 -bench 'Sum64$')
+benchstat <(go test -benchtime 500ms -count 15 -bench 'Sum64$')
```
## Projects using this package
diff --git a/vendor/github.com/cespare/xxhash/v2/testall.sh b/vendor/github.com/cespare/xxhash/v2/testall.sh
new file mode 100644
index 0000000000..94b9c44398
--- /dev/null
+++ b/vendor/github.com/cespare/xxhash/v2/testall.sh
@@ -0,0 +1,10 @@
+#!/bin/bash
+set -eu -o pipefail
+
+# Small convenience script for running the tests with various combinations of
+# arch/tags. This assumes we're running on amd64 and have qemu available.
+
+go test ./...
+go test -tags purego ./...
+GOARCH=arm64 go test
+GOARCH=arm64 go test -tags purego
diff --git a/vendor/github.com/cespare/xxhash/v2/xxhash.go b/vendor/github.com/cespare/xxhash/v2/xxhash.go
index 15c835d541..a9e0d45c9d 100644
--- a/vendor/github.com/cespare/xxhash/v2/xxhash.go
+++ b/vendor/github.com/cespare/xxhash/v2/xxhash.go
@@ -16,19 +16,11 @@ const (
prime5 uint64 = 2870177450012600261
)
-// NOTE(caleb): I'm using both consts and vars of the primes. Using consts where
-// possible in the Go code is worth a small (but measurable) performance boost
-// by avoiding some MOVQs. Vars are needed for the asm and also are useful for
-// convenience in the Go code in a few places where we need to intentionally
-// avoid constant arithmetic (e.g., v1 := prime1 + prime2 fails because the
-// result overflows a uint64).
-var (
- prime1v = prime1
- prime2v = prime2
- prime3v = prime3
- prime4v = prime4
- prime5v = prime5
-)
+// Store the primes in an array as well.
+//
+// The consts are used when possible in Go code to avoid MOVs but we need a
+// contiguous array of the assembly code.
+var primes = [...]uint64{prime1, prime2, prime3, prime4, prime5}
// Digest implements hash.Hash64.
type Digest struct {
@@ -50,10 +42,10 @@ func New() *Digest {
// Reset clears the Digest's state so that it can be reused.
func (d *Digest) Reset() {
- d.v1 = prime1v + prime2
+ d.v1 = primes[0] + prime2
d.v2 = prime2
d.v3 = 0
- d.v4 = -prime1v
+ d.v4 = -primes[0]
d.total = 0
d.n = 0
}
@@ -69,21 +61,23 @@ func (d *Digest) Write(b []byte) (n int, err error) {
n = len(b)
d.total += uint64(n)
+ memleft := d.mem[d.n&(len(d.mem)-1):]
+
if d.n+n < 32 {
// This new data doesn't even fill the current block.
- copy(d.mem[d.n:], b)
+ copy(memleft, b)
d.n += n
return
}
if d.n > 0 {
// Finish off the partial block.
- copy(d.mem[d.n:], b)
+ c := copy(memleft, b)
d.v1 = round(d.v1, u64(d.mem[0:8]))
d.v2 = round(d.v2, u64(d.mem[8:16]))
d.v3 = round(d.v3, u64(d.mem[16:24]))
d.v4 = round(d.v4, u64(d.mem[24:32]))
- b = b[32-d.n:]
+ b = b[c:]
d.n = 0
}
@@ -133,21 +127,20 @@ func (d *Digest) Sum64() uint64 {
h += d.total
- i, end := 0, d.n
- for ; i+8 <= end; i += 8 {
- k1 := round(0, u64(d.mem[i:i+8]))
+ b := d.mem[:d.n&(len(d.mem)-1)]
+ for ; len(b) >= 8; b = b[8:] {
+ k1 := round(0, u64(b[:8]))
h ^= k1
h = rol27(h)*prime1 + prime4
}
- if i+4 <= end {
- h ^= uint64(u32(d.mem[i:i+4])) * prime1
+ if len(b) >= 4 {
+ h ^= uint64(u32(b[:4])) * prime1
h = rol23(h)*prime2 + prime3
- i += 4
+ b = b[4:]
}
- for i < end {
- h ^= uint64(d.mem[i]) * prime5
+ for ; len(b) > 0; b = b[1:] {
+ h ^= uint64(b[0]) * prime5
h = rol11(h) * prime1
- i++
}
h ^= h >> 33
diff --git a/vendor/github.com/cespare/xxhash/v2/xxhash_amd64.s b/vendor/github.com/cespare/xxhash/v2/xxhash_amd64.s
index be8db5bf79..3e8b132579 100644
--- a/vendor/github.com/cespare/xxhash/v2/xxhash_amd64.s
+++ b/vendor/github.com/cespare/xxhash/v2/xxhash_amd64.s
@@ -1,215 +1,209 @@
+//go:build !appengine && gc && !purego
// +build !appengine
// +build gc
// +build !purego
#include "textflag.h"
-// Register allocation:
-// AX h
-// SI pointer to advance through b
-// DX n
-// BX loop end
-// R8 v1, k1
-// R9 v2
-// R10 v3
-// R11 v4
-// R12 tmp
-// R13 prime1v
-// R14 prime2v
-// DI prime4v
+// Registers:
+#define h AX
+#define d AX
+#define p SI // pointer to advance through b
+#define n DX
+#define end BX // loop end
+#define v1 R8
+#define v2 R9
+#define v3 R10
+#define v4 R11
+#define x R12
+#define prime1 R13
+#define prime2 R14
+#define prime4 DI
-// round reads from and advances the buffer pointer in SI.
-// It assumes that R13 has prime1v and R14 has prime2v.
-#define round(r) \
- MOVQ (SI), R12 \
- ADDQ $8, SI \
- IMULQ R14, R12 \
- ADDQ R12, r \
- ROLQ $31, r \
- IMULQ R13, r
+#define round(acc, x) \
+ IMULQ prime2, x \
+ ADDQ x, acc \
+ ROLQ $31, acc \
+ IMULQ prime1, acc
-// mergeRound applies a merge round on the two registers acc and val.
-// It assumes that R13 has prime1v, R14 has prime2v, and DI has prime4v.
-#define mergeRound(acc, val) \
- IMULQ R14, val \
- ROLQ $31, val \
- IMULQ R13, val \
- XORQ val, acc \
- IMULQ R13, acc \
- ADDQ DI, acc
+// round0 performs the operation x = round(0, x).
+#define round0(x) \
+ IMULQ prime2, x \
+ ROLQ $31, x \
+ IMULQ prime1, x
+
+// mergeRound applies a merge round on the two registers acc and x.
+// It assumes that prime1, prime2, and prime4 have been loaded.
+#define mergeRound(acc, x) \
+ round0(x) \
+ XORQ x, acc \
+ IMULQ prime1, acc \
+ ADDQ prime4, acc
+
+// blockLoop processes as many 32-byte blocks as possible,
+// updating v1, v2, v3, and v4. It assumes that there is at least one block
+// to process.
+#define blockLoop() \
+loop: \
+ MOVQ +0(p), x \
+ round(v1, x) \
+ MOVQ +8(p), x \
+ round(v2, x) \
+ MOVQ +16(p), x \
+ round(v3, x) \
+ MOVQ +24(p), x \
+ round(v4, x) \
+ ADDQ $32, p \
+ CMPQ p, end \
+ JLE loop
// func Sum64(b []byte) uint64
-TEXT ·Sum64(SB), NOSPLIT, $0-32
+TEXT ·Sum64(SB), NOSPLIT|NOFRAME, $0-32
// Load fixed primes.
- MOVQ ·prime1v(SB), R13
- MOVQ ·prime2v(SB), R14
- MOVQ ·prime4v(SB), DI
+ MOVQ ·primes+0(SB), prime1
+ MOVQ ·primes+8(SB), prime2
+ MOVQ ·primes+24(SB), prime4
// Load slice.
- MOVQ b_base+0(FP), SI
- MOVQ b_len+8(FP), DX
- LEAQ (SI)(DX*1), BX
+ MOVQ b_base+0(FP), p
+ MOVQ b_len+8(FP), n
+ LEAQ (p)(n*1), end
// The first loop limit will be len(b)-32.
- SUBQ $32, BX
+ SUBQ $32, end
// Check whether we have at least one block.
- CMPQ DX, $32
+ CMPQ n, $32
JLT noBlocks
// Set up initial state (v1, v2, v3, v4).
- MOVQ R13, R8
- ADDQ R14, R8
- MOVQ R14, R9
- XORQ R10, R10
- XORQ R11, R11
- SUBQ R13, R11
+ MOVQ prime1, v1
+ ADDQ prime2, v1
+ MOVQ prime2, v2
+ XORQ v3, v3
+ XORQ v4, v4
+ SUBQ prime1, v4
- // Loop until SI > BX.
-blockLoop:
- round(R8)
- round(R9)
- round(R10)
- round(R11)
+ blockLoop()
- CMPQ SI, BX
- JLE blockLoop
+ MOVQ v1, h
+ ROLQ $1, h
+ MOVQ v2, x
+ ROLQ $7, x
+ ADDQ x, h
+ MOVQ v3, x
+ ROLQ $12, x
+ ADDQ x, h
+ MOVQ v4, x
+ ROLQ $18, x
+ ADDQ x, h
- MOVQ R8, AX
- ROLQ $1, AX
- MOVQ R9, R12
- ROLQ $7, R12
- ADDQ R12, AX
- MOVQ R10, R12
- ROLQ $12, R12
- ADDQ R12, AX
- MOVQ R11, R12
- ROLQ $18, R12
- ADDQ R12, AX
-
- mergeRound(AX, R8)
- mergeRound(AX, R9)
- mergeRound(AX, R10)
- mergeRound(AX, R11)
+ mergeRound(h, v1)
+ mergeRound(h, v2)
+ mergeRound(h, v3)
+ mergeRound(h, v4)
JMP afterBlocks
noBlocks:
- MOVQ ·prime5v(SB), AX
+ MOVQ ·primes+32(SB), h
afterBlocks:
- ADDQ DX, AX
+ ADDQ n, h
- // Right now BX has len(b)-32, and we want to loop until SI > len(b)-8.
- ADDQ $24, BX
+ ADDQ $24, end
+ CMPQ p, end
+ JG try4
- CMPQ SI, BX
- JG fourByte
+loop8:
+ MOVQ (p), x
+ ADDQ $8, p
+ round0(x)
+ XORQ x, h
+ ROLQ $27, h
+ IMULQ prime1, h
+ ADDQ prime4, h
-wordLoop:
- // Calculate k1.
- MOVQ (SI), R8
- ADDQ $8, SI
- IMULQ R14, R8
- ROLQ $31, R8
- IMULQ R13, R8
+ CMPQ p, end
+ JLE loop8
- XORQ R8, AX
- ROLQ $27, AX
- IMULQ R13, AX
- ADDQ DI, AX
+try4:
+ ADDQ $4, end
+ CMPQ p, end
+ JG try1
- CMPQ SI, BX
- JLE wordLoop
+ MOVL (p), x
+ ADDQ $4, p
+ IMULQ prime1, x
+ XORQ x, h
-fourByte:
- ADDQ $4, BX
- CMPQ SI, BX
- JG singles
+ ROLQ $23, h
+ IMULQ prime2, h
+ ADDQ ·primes+16(SB), h
- MOVL (SI), R8
- ADDQ $4, SI
- IMULQ R13, R8
- XORQ R8, AX
-
- ROLQ $23, AX
- IMULQ R14, AX
- ADDQ ·prime3v(SB), AX
-
-singles:
- ADDQ $4, BX
- CMPQ SI, BX
+try1:
+ ADDQ $4, end
+ CMPQ p, end
JGE finalize
-singlesLoop:
- MOVBQZX (SI), R12
- ADDQ $1, SI
- IMULQ ·prime5v(SB), R12
- XORQ R12, AX
+loop1:
+ MOVBQZX (p), x
+ ADDQ $1, p
+ IMULQ ·primes+32(SB), x
+ XORQ x, h
+ ROLQ $11, h
+ IMULQ prime1, h
- ROLQ $11, AX
- IMULQ R13, AX
-
- CMPQ SI, BX
- JL singlesLoop
+ CMPQ p, end
+ JL loop1
finalize:
- MOVQ AX, R12
- SHRQ $33, R12
- XORQ R12, AX
- IMULQ R14, AX
- MOVQ AX, R12
- SHRQ $29, R12
- XORQ R12, AX
- IMULQ ·prime3v(SB), AX
- MOVQ AX, R12
- SHRQ $32, R12
- XORQ R12, AX
+ MOVQ h, x
+ SHRQ $33, x
+ XORQ x, h
+ IMULQ prime2, h
+ MOVQ h, x
+ SHRQ $29, x
+ XORQ x, h
+ IMULQ ·primes+16(SB), h
+ MOVQ h, x
+ SHRQ $32, x
+ XORQ x, h
- MOVQ AX, ret+24(FP)
+ MOVQ h, ret+24(FP)
RET
-// writeBlocks uses the same registers as above except that it uses AX to store
-// the d pointer.
-
// func writeBlocks(d *Digest, b []byte) int
-TEXT ·writeBlocks(SB), NOSPLIT, $0-40
+TEXT ·writeBlocks(SB), NOSPLIT|NOFRAME, $0-40
// Load fixed primes needed for round.
- MOVQ ·prime1v(SB), R13
- MOVQ ·prime2v(SB), R14
+ MOVQ ·primes+0(SB), prime1
+ MOVQ ·primes+8(SB), prime2
// Load slice.
- MOVQ b_base+8(FP), SI
- MOVQ b_len+16(FP), DX
- LEAQ (SI)(DX*1), BX
- SUBQ $32, BX
+ MOVQ b_base+8(FP), p
+ MOVQ b_len+16(FP), n
+ LEAQ (p)(n*1), end
+ SUBQ $32, end
// Load vN from d.
- MOVQ d+0(FP), AX
- MOVQ 0(AX), R8 // v1
- MOVQ 8(AX), R9 // v2
- MOVQ 16(AX), R10 // v3
- MOVQ 24(AX), R11 // v4
+ MOVQ s+0(FP), d
+ MOVQ 0(d), v1
+ MOVQ 8(d), v2
+ MOVQ 16(d), v3
+ MOVQ 24(d), v4
// We don't need to check the loop condition here; this function is
// always called with at least one block of data to process.
-blockLoop:
- round(R8)
- round(R9)
- round(R10)
- round(R11)
-
- CMPQ SI, BX
- JLE blockLoop
+ blockLoop()
// Copy vN back to d.
- MOVQ R8, 0(AX)
- MOVQ R9, 8(AX)
- MOVQ R10, 16(AX)
- MOVQ R11, 24(AX)
+ MOVQ v1, 0(d)
+ MOVQ v2, 8(d)
+ MOVQ v3, 16(d)
+ MOVQ v4, 24(d)
- // The number of bytes written is SI minus the old base pointer.
- SUBQ b_base+8(FP), SI
- MOVQ SI, ret+32(FP)
+ // The number of bytes written is p minus the old base pointer.
+ SUBQ b_base+8(FP), p
+ MOVQ p, ret+32(FP)
RET
diff --git a/vendor/github.com/cespare/xxhash/v2/xxhash_arm64.s b/vendor/github.com/cespare/xxhash/v2/xxhash_arm64.s
new file mode 100644
index 0000000000..7e3145a221
--- /dev/null
+++ b/vendor/github.com/cespare/xxhash/v2/xxhash_arm64.s
@@ -0,0 +1,183 @@
+//go:build !appengine && gc && !purego
+// +build !appengine
+// +build gc
+// +build !purego
+
+#include "textflag.h"
+
+// Registers:
+#define digest R1
+#define h R2 // return value
+#define p R3 // input pointer
+#define n R4 // input length
+#define nblocks R5 // n / 32
+#define prime1 R7
+#define prime2 R8
+#define prime3 R9
+#define prime4 R10
+#define prime5 R11
+#define v1 R12
+#define v2 R13
+#define v3 R14
+#define v4 R15
+#define x1 R20
+#define x2 R21
+#define x3 R22
+#define x4 R23
+
+#define round(acc, x) \
+ MADD prime2, acc, x, acc \
+ ROR $64-31, acc \
+ MUL prime1, acc
+
+// round0 performs the operation x = round(0, x).
+#define round0(x) \
+ MUL prime2, x \
+ ROR $64-31, x \
+ MUL prime1, x
+
+#define mergeRound(acc, x) \
+ round0(x) \
+ EOR x, acc \
+ MADD acc, prime4, prime1, acc
+
+// blockLoop processes as many 32-byte blocks as possible,
+// updating v1, v2, v3, and v4. It assumes that n >= 32.
+#define blockLoop() \
+ LSR $5, n, nblocks \
+ PCALIGN $16 \
+ loop: \
+ LDP.P 16(p), (x1, x2) \
+ LDP.P 16(p), (x3, x4) \
+ round(v1, x1) \
+ round(v2, x2) \
+ round(v3, x3) \
+ round(v4, x4) \
+ SUB $1, nblocks \
+ CBNZ nblocks, loop
+
+// func Sum64(b []byte) uint64
+TEXT ·Sum64(SB), NOSPLIT|NOFRAME, $0-32
+ LDP b_base+0(FP), (p, n)
+
+ LDP ·primes+0(SB), (prime1, prime2)
+ LDP ·primes+16(SB), (prime3, prime4)
+ MOVD ·primes+32(SB), prime5
+
+ CMP $32, n
+ CSEL LT, prime5, ZR, h // if n < 32 { h = prime5 } else { h = 0 }
+ BLT afterLoop
+
+ ADD prime1, prime2, v1
+ MOVD prime2, v2
+ MOVD $0, v3
+ NEG prime1, v4
+
+ blockLoop()
+
+ ROR $64-1, v1, x1
+ ROR $64-7, v2, x2
+ ADD x1, x2
+ ROR $64-12, v3, x3
+ ROR $64-18, v4, x4
+ ADD x3, x4
+ ADD x2, x4, h
+
+ mergeRound(h, v1)
+ mergeRound(h, v2)
+ mergeRound(h, v3)
+ mergeRound(h, v4)
+
+afterLoop:
+ ADD n, h
+
+ TBZ $4, n, try8
+ LDP.P 16(p), (x1, x2)
+
+ round0(x1)
+
+ // NOTE: here and below, sequencing the EOR after the ROR (using a
+ // rotated register) is worth a small but measurable speedup for small
+ // inputs.
+ ROR $64-27, h
+ EOR x1 @> 64-27, h, h
+ MADD h, prime4, prime1, h
+
+ round0(x2)
+ ROR $64-27, h
+ EOR x2 @> 64-27, h, h
+ MADD h, prime4, prime1, h
+
+try8:
+ TBZ $3, n, try4
+ MOVD.P 8(p), x1
+
+ round0(x1)
+ ROR $64-27, h
+ EOR x1 @> 64-27, h, h
+ MADD h, prime4, prime1, h
+
+try4:
+ TBZ $2, n, try2
+ MOVWU.P 4(p), x2
+
+ MUL prime1, x2
+ ROR $64-23, h
+ EOR x2 @> 64-23, h, h
+ MADD h, prime3, prime2, h
+
+try2:
+ TBZ $1, n, try1
+ MOVHU.P 2(p), x3
+ AND $255, x3, x1
+ LSR $8, x3, x2
+
+ MUL prime5, x1
+ ROR $64-11, h
+ EOR x1 @> 64-11, h, h
+ MUL prime1, h
+
+ MUL prime5, x2
+ ROR $64-11, h
+ EOR x2 @> 64-11, h, h
+ MUL prime1, h
+
+try1:
+ TBZ $0, n, finalize
+ MOVBU (p), x4
+
+ MUL prime5, x4
+ ROR $64-11, h
+ EOR x4 @> 64-11, h, h
+ MUL prime1, h
+
+finalize:
+ EOR h >> 33, h
+ MUL prime2, h
+ EOR h >> 29, h
+ MUL prime3, h
+ EOR h >> 32, h
+
+ MOVD h, ret+24(FP)
+ RET
+
+// func writeBlocks(d *Digest, b []byte) int
+TEXT ·writeBlocks(SB), NOSPLIT|NOFRAME, $0-40
+ LDP ·primes+0(SB), (prime1, prime2)
+
+ // Load state. Assume v[1-4] are stored contiguously.
+ MOVD d+0(FP), digest
+ LDP 0(digest), (v1, v2)
+ LDP 16(digest), (v3, v4)
+
+ LDP b_base+8(FP), (p, n)
+
+ blockLoop()
+
+ // Store updated state.
+ STP (v1, v2), 0(digest)
+ STP (v3, v4), 16(digest)
+
+ BIC $31, n
+ MOVD n, ret+32(FP)
+ RET
diff --git a/vendor/github.com/cespare/xxhash/v2/xxhash_amd64.go b/vendor/github.com/cespare/xxhash/v2/xxhash_asm.go
similarity index 73%
rename from vendor/github.com/cespare/xxhash/v2/xxhash_amd64.go
rename to vendor/github.com/cespare/xxhash/v2/xxhash_asm.go
index ad14b807f4..9216e0a40c 100644
--- a/vendor/github.com/cespare/xxhash/v2/xxhash_amd64.go
+++ b/vendor/github.com/cespare/xxhash/v2/xxhash_asm.go
@@ -1,3 +1,5 @@
+//go:build (amd64 || arm64) && !appengine && gc && !purego
+// +build amd64 arm64
// +build !appengine
// +build gc
// +build !purego
diff --git a/vendor/github.com/cespare/xxhash/v2/xxhash_other.go b/vendor/github.com/cespare/xxhash/v2/xxhash_other.go
index 4a5a821603..26df13bba4 100644
--- a/vendor/github.com/cespare/xxhash/v2/xxhash_other.go
+++ b/vendor/github.com/cespare/xxhash/v2/xxhash_other.go
@@ -1,4 +1,5 @@
-// +build !amd64 appengine !gc purego
+//go:build (!amd64 && !arm64) || appengine || !gc || purego
+// +build !amd64,!arm64 appengine !gc purego
package xxhash
@@ -14,10 +15,10 @@ func Sum64(b []byte) uint64 {
var h uint64
if n >= 32 {
- v1 := prime1v + prime2
+ v1 := primes[0] + prime2
v2 := prime2
v3 := uint64(0)
- v4 := -prime1v
+ v4 := -primes[0]
for len(b) >= 32 {
v1 = round(v1, u64(b[0:8:len(b)]))
v2 = round(v2, u64(b[8:16:len(b)]))
@@ -36,19 +37,18 @@ func Sum64(b []byte) uint64 {
h += uint64(n)
- i, end := 0, len(b)
- for ; i+8 <= end; i += 8 {
- k1 := round(0, u64(b[i:i+8:len(b)]))
+ for ; len(b) >= 8; b = b[8:] {
+ k1 := round(0, u64(b[:8]))
h ^= k1
h = rol27(h)*prime1 + prime4
}
- if i+4 <= end {
- h ^= uint64(u32(b[i:i+4:len(b)])) * prime1
+ if len(b) >= 4 {
+ h ^= uint64(u32(b[:4])) * prime1
h = rol23(h)*prime2 + prime3
- i += 4
+ b = b[4:]
}
- for ; i < end; i++ {
- h ^= uint64(b[i]) * prime5
+ for ; len(b) > 0; b = b[1:] {
+ h ^= uint64(b[0]) * prime5
h = rol11(h) * prime1
}
diff --git a/vendor/github.com/cespare/xxhash/v2/xxhash_safe.go b/vendor/github.com/cespare/xxhash/v2/xxhash_safe.go
index fc9bea7a31..e86f1b5fd8 100644
--- a/vendor/github.com/cespare/xxhash/v2/xxhash_safe.go
+++ b/vendor/github.com/cespare/xxhash/v2/xxhash_safe.go
@@ -1,3 +1,4 @@
+//go:build appengine
// +build appengine
// This file contains the safe implementations of otherwise unsafe-using code.
diff --git a/vendor/github.com/cespare/xxhash/v2/xxhash_unsafe.go b/vendor/github.com/cespare/xxhash/v2/xxhash_unsafe.go
index 376e0ca2e4..1c1638fd88 100644
--- a/vendor/github.com/cespare/xxhash/v2/xxhash_unsafe.go
+++ b/vendor/github.com/cespare/xxhash/v2/xxhash_unsafe.go
@@ -1,3 +1,4 @@
+//go:build !appengine
// +build !appengine
// This file encapsulates usage of unsafe.
@@ -11,7 +12,7 @@ import (
// In the future it's possible that compiler optimizations will make these
// XxxString functions unnecessary by realizing that calls such as
-// Sum64([]byte(s)) don't need to copy s. See https://golang.org/issue/2205.
+// Sum64([]byte(s)) don't need to copy s. See https://go.dev/issue/2205.
// If that happens, even if we keep these functions they can be replaced with
// the trivial safe code.
diff --git a/vendor/github.com/golang/protobuf/ptypes/empty/empty.pb.go b/vendor/github.com/golang/protobuf/ptypes/empty/empty.pb.go
deleted file mode 100644
index 16686a6552..0000000000
--- a/vendor/github.com/golang/protobuf/ptypes/empty/empty.pb.go
+++ /dev/null
@@ -1,62 +0,0 @@
-// Code generated by protoc-gen-go. DO NOT EDIT.
-// source: github.com/golang/protobuf/ptypes/empty/empty.proto
-
-package empty
-
-import (
- protoreflect "google.golang.org/protobuf/reflect/protoreflect"
- protoimpl "google.golang.org/protobuf/runtime/protoimpl"
- emptypb "google.golang.org/protobuf/types/known/emptypb"
- reflect "reflect"
-)
-
-// Symbols defined in public import of google/protobuf/empty.proto.
-
-type Empty = emptypb.Empty
-
-var File_github_com_golang_protobuf_ptypes_empty_empty_proto protoreflect.FileDescriptor
-
-var file_github_com_golang_protobuf_ptypes_empty_empty_proto_rawDesc = []byte{
- 0x0a, 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x6c,
- 0x61, 0x6e, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x70, 0x74, 0x79,
- 0x70, 0x65, 0x73, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e,
- 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72,
- 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f,
- 0x74, 0x6f, 0x42, 0x2f, 0x5a, 0x2d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d,
- 0x2f, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
- 0x2f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x3b, 0x65, 0x6d,
- 0x70, 0x74, 0x79, 0x50, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
-}
-
-var file_github_com_golang_protobuf_ptypes_empty_empty_proto_goTypes = []interface{}{}
-var file_github_com_golang_protobuf_ptypes_empty_empty_proto_depIdxs = []int32{
- 0, // [0:0] is the sub-list for method output_type
- 0, // [0:0] is the sub-list for method input_type
- 0, // [0:0] is the sub-list for extension type_name
- 0, // [0:0] is the sub-list for extension extendee
- 0, // [0:0] is the sub-list for field type_name
-}
-
-func init() { file_github_com_golang_protobuf_ptypes_empty_empty_proto_init() }
-func file_github_com_golang_protobuf_ptypes_empty_empty_proto_init() {
- if File_github_com_golang_protobuf_ptypes_empty_empty_proto != nil {
- return
- }
- type x struct{}
- out := protoimpl.TypeBuilder{
- File: protoimpl.DescBuilder{
- GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
- RawDescriptor: file_github_com_golang_protobuf_ptypes_empty_empty_proto_rawDesc,
- NumEnums: 0,
- NumMessages: 0,
- NumExtensions: 0,
- NumServices: 0,
- },
- GoTypes: file_github_com_golang_protobuf_ptypes_empty_empty_proto_goTypes,
- DependencyIndexes: file_github_com_golang_protobuf_ptypes_empty_empty_proto_depIdxs,
- }.Build()
- File_github_com_golang_protobuf_ptypes_empty_empty_proto = out.File
- file_github_com_golang_protobuf_ptypes_empty_empty_proto_rawDesc = nil
- file_github_com_golang_protobuf_ptypes_empty_empty_proto_goTypes = nil
- file_github_com_golang_protobuf_ptypes_empty_empty_proto_depIdxs = nil
-}
diff --git a/vendor/github.com/prometheus/prometheus/tsdb/chunkenc/histogram.go b/vendor/github.com/prometheus/prometheus/tsdb/chunkenc/histogram.go
index 6e326888af..e57b96db90 100644
--- a/vendor/github.com/prometheus/prometheus/tsdb/chunkenc/histogram.go
+++ b/vendor/github.com/prometheus/prometheus/tsdb/chunkenc/histogram.go
@@ -624,9 +624,9 @@ func (it *histogramIterator) Err() error {
}
func (it *histogramIterator) Reset(b []byte) {
- // The first 2 bytes contain chunk headers.
+ // The first 3 bytes contain chunk headers.
// We skip that for actual samples.
- it.br = newBReader(b[2:])
+ it.br = newBReader(b[3:])
it.numTotal = binary.BigEndian.Uint16(b)
it.numRead = 0
diff --git a/vendor/github.com/urfave/cli/v2/app.go b/vendor/github.com/urfave/cli/v2/app.go
index e7f79c5130..10198f4332 100644
--- a/vendor/github.com/urfave/cli/v2/app.go
+++ b/vendor/github.com/urfave/cli/v2/app.go
@@ -107,6 +107,8 @@ type App struct {
CustomAppHelpTemplate string
// SliceFlagSeparator is used to customize the separator for SliceFlag, the default is ","
SliceFlagSeparator string
+ // DisableSliceFlagSeparator is used to disable SliceFlagSeparator, the default is false
+ DisableSliceFlagSeparator bool
// Boolean to enable short-option handling so user can combine several
// single-character bool arguments into one
// i.e. foobar -o -v -> foobar -ov
@@ -264,6 +266,8 @@ func (a *App) Setup() {
if len(a.SliceFlagSeparator) != 0 {
defaultSliceFlagSeparator = a.SliceFlagSeparator
}
+
+ disableSliceFlagSeparator = a.DisableSliceFlagSeparator
}
func (a *App) newRootCommand() *Command {
diff --git a/vendor/github.com/urfave/cli/v2/command.go b/vendor/github.com/urfave/cli/v2/command.go
index c5939d4ec8..b8a944d641 100644
--- a/vendor/github.com/urfave/cli/v2/command.go
+++ b/vendor/github.com/urfave/cli/v2/command.go
@@ -203,7 +203,7 @@ func (c *Command) Run(cCtx *Context, arguments ...string) (err error) {
cerr := cCtx.checkRequiredFlags(c.Flags)
if cerr != nil {
- _ = ShowSubcommandHelp(cCtx)
+ _ = helpCommand.Action(cCtx)
return cerr
}
diff --git a/vendor/github.com/urfave/cli/v2/flag.go b/vendor/github.com/urfave/cli/v2/flag.go
index b66a75da5e..5c0a8b7328 100644
--- a/vendor/github.com/urfave/cli/v2/flag.go
+++ b/vendor/github.com/urfave/cli/v2/flag.go
@@ -15,7 +15,10 @@ import (
const defaultPlaceholder = "value"
-var defaultSliceFlagSeparator = ","
+var (
+ defaultSliceFlagSeparator = ","
+ disableSliceFlagSeparator = false
+)
var (
slPfx = fmt.Sprintf("sl:::%d:::", time.Now().UTC().UnixNano())
@@ -380,5 +383,9 @@ func flagFromEnvOrFile(envVars []string, filePath string) (value string, fromWhe
}
func flagSplitMultiValues(val string) []string {
+ if disableSliceFlagSeparator {
+ return []string{val}
+ }
+
return strings.Split(val, defaultSliceFlagSeparator)
}
diff --git a/vendor/github.com/urfave/cli/v2/godoc-current.txt b/vendor/github.com/urfave/cli/v2/godoc-current.txt
index b8dbf6ad0a..6afd244f25 100644
--- a/vendor/github.com/urfave/cli/v2/godoc-current.txt
+++ b/vendor/github.com/urfave/cli/v2/godoc-current.txt
@@ -318,6 +318,8 @@ type App struct {
CustomAppHelpTemplate string
// SliceFlagSeparator is used to customize the separator for SliceFlag, the default is ","
SliceFlagSeparator string
+ // DisableSliceFlagSeparator is used to disable SliceFlagSeparator, the default is false
+ DisableSliceFlagSeparator bool
// Boolean to enable short-option handling so user can combine several
// single-character bool arguments into one
// i.e. foobar -o -v -> foobar -ov
diff --git a/vendor/golang.org/x/sys/windows/syscall_windows.go b/vendor/golang.org/x/sys/windows/syscall_windows.go
index 7a6ba43a7e..a49853e9d3 100644
--- a/vendor/golang.org/x/sys/windows/syscall_windows.go
+++ b/vendor/golang.org/x/sys/windows/syscall_windows.go
@@ -367,6 +367,7 @@ func NewCallbackCDecl(fn interface{}) uintptr {
//sys IsWindowUnicode(hwnd HWND) (isUnicode bool) = user32.IsWindowUnicode
//sys IsWindowVisible(hwnd HWND) (isVisible bool) = user32.IsWindowVisible
//sys GetGUIThreadInfo(thread uint32, info *GUIThreadInfo) (err error) = user32.GetGUIThreadInfo
+//sys GetLargePageMinimum() (size uintptr)
// Volume Management Functions
//sys DefineDosDevice(flags uint32, deviceName *uint16, targetPath *uint16) (err error) = DefineDosDeviceW
diff --git a/vendor/golang.org/x/sys/windows/zsyscall_windows.go b/vendor/golang.org/x/sys/windows/zsyscall_windows.go
index 96ba8559c3..ac60052e44 100644
--- a/vendor/golang.org/x/sys/windows/zsyscall_windows.go
+++ b/vendor/golang.org/x/sys/windows/zsyscall_windows.go
@@ -252,6 +252,7 @@ var (
procGetFileType = modkernel32.NewProc("GetFileType")
procGetFinalPathNameByHandleW = modkernel32.NewProc("GetFinalPathNameByHandleW")
procGetFullPathNameW = modkernel32.NewProc("GetFullPathNameW")
+ procGetLargePageMinimum = modkernel32.NewProc("GetLargePageMinimum")
procGetLastError = modkernel32.NewProc("GetLastError")
procGetLogicalDriveStringsW = modkernel32.NewProc("GetLogicalDriveStringsW")
procGetLogicalDrives = modkernel32.NewProc("GetLogicalDrives")
@@ -2180,6 +2181,12 @@ func GetFullPathName(path *uint16, buflen uint32, buf *uint16, fname **uint16) (
return
}
+func GetLargePageMinimum() (size uintptr) {
+ r0, _, _ := syscall.Syscall(procGetLargePageMinimum.Addr(), 0, 0, 0, 0)
+ size = uintptr(r0)
+ return
+}
+
func GetLastError() (lasterr error) {
r0, _, _ := syscall.Syscall(procGetLastError.Addr(), 0, 0, 0, 0)
if r0 != 0 {
diff --git a/vendor/golang.org/x/text/unicode/bidi/trieval.go b/vendor/golang.org/x/text/unicode/bidi/trieval.go
index 4c459c4b72..6a796e2214 100644
--- a/vendor/golang.org/x/text/unicode/bidi/trieval.go
+++ b/vendor/golang.org/x/text/unicode/bidi/trieval.go
@@ -37,18 +37,6 @@ const (
unknownClass = ^Class(0)
)
-var controlToClass = map[rune]Class{
- 0x202D: LRO, // LeftToRightOverride,
- 0x202E: RLO, // RightToLeftOverride,
- 0x202A: LRE, // LeftToRightEmbedding,
- 0x202B: RLE, // RightToLeftEmbedding,
- 0x202C: PDF, // PopDirectionalFormat,
- 0x2066: LRI, // LeftToRightIsolate,
- 0x2067: RLI, // RightToLeftIsolate,
- 0x2068: FSI, // FirstStrongIsolate,
- 0x2069: PDI, // PopDirectionalIsolate,
-}
-
// A trie entry has the following bits:
// 7..5 XOR mask for brackets
// 4 1: Bracket open, 0: Bracket close
diff --git a/vendor/golang.org/x/time/rate/rate.go b/vendor/golang.org/x/time/rate/rate.go
index 8f7c29f156..f0e0cf3cb1 100644
--- a/vendor/golang.org/x/time/rate/rate.go
+++ b/vendor/golang.org/x/time/rate/rate.go
@@ -83,7 +83,7 @@ func (lim *Limiter) Burst() int {
// TokensAt returns the number of tokens available at time t.
func (lim *Limiter) TokensAt(t time.Time) float64 {
lim.mu.Lock()
- _, _, tokens := lim.advance(t) // does not mutute lim
+ _, tokens := lim.advance(t) // does not mutate lim
lim.mu.Unlock()
return tokens
}
@@ -183,7 +183,7 @@ func (r *Reservation) CancelAt(t time.Time) {
return
}
// advance time to now
- t, _, tokens := r.lim.advance(t)
+ t, tokens := r.lim.advance(t)
// calculate new number of tokens
tokens += restoreTokens
if burst := float64(r.lim.burst); tokens > burst {
@@ -304,7 +304,7 @@ func (lim *Limiter) SetLimitAt(t time.Time, newLimit Limit) {
lim.mu.Lock()
defer lim.mu.Unlock()
- t, _, tokens := lim.advance(t)
+ t, tokens := lim.advance(t)
lim.last = t
lim.tokens = tokens
@@ -321,7 +321,7 @@ func (lim *Limiter) SetBurstAt(t time.Time, newBurst int) {
lim.mu.Lock()
defer lim.mu.Unlock()
- t, _, tokens := lim.advance(t)
+ t, tokens := lim.advance(t)
lim.last = t
lim.tokens = tokens
@@ -356,7 +356,7 @@ func (lim *Limiter) reserveN(t time.Time, n int, maxFutureReserve time.Duration)
}
}
- t, last, tokens := lim.advance(t)
+ t, tokens := lim.advance(t)
// Calculate the remaining number of tokens resulting from the request.
tokens -= float64(n)
@@ -379,15 +379,11 @@ func (lim *Limiter) reserveN(t time.Time, n int, maxFutureReserve time.Duration)
if ok {
r.tokens = n
r.timeToAct = t.Add(waitDuration)
- }
- // Update state
- if ok {
+ // Update state
lim.last = t
lim.tokens = tokens
lim.lastEvent = r.timeToAct
- } else {
- lim.last = last
}
return r
@@ -396,7 +392,7 @@ func (lim *Limiter) reserveN(t time.Time, n int, maxFutureReserve time.Duration)
// advance calculates and returns an updated state for lim resulting from the passage of time.
// lim is not changed.
// advance requires that lim.mu is held.
-func (lim *Limiter) advance(t time.Time) (newT time.Time, newLast time.Time, newTokens float64) {
+func (lim *Limiter) advance(t time.Time) (newT time.Time, newTokens float64) {
last := lim.last
if t.Before(last) {
last = t
@@ -409,7 +405,7 @@ func (lim *Limiter) advance(t time.Time) (newT time.Time, newLast time.Time, new
if burst := float64(lim.burst); tokens > burst {
tokens = burst
}
- return t, last, tokens
+ return t, tokens
}
// durationFromTokens is a unit conversion function from the number of tokens to the duration
diff --git a/vendor/google.golang.org/genproto/protobuf/field_mask/field_mask.go b/vendor/google.golang.org/genproto/protobuf/field_mask/field_mask.go
deleted file mode 100644
index d10ad66533..0000000000
--- a/vendor/google.golang.org/genproto/protobuf/field_mask/field_mask.go
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2020 Google LLC
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Package field_mask aliases all exported identifiers in
-// package "google.golang.org/protobuf/types/known/fieldmaskpb".
-package field_mask
-
-import "google.golang.org/protobuf/types/known/fieldmaskpb"
-
-type FieldMask = fieldmaskpb.FieldMask
-
-var File_google_protobuf_field_mask_proto = fieldmaskpb.File_google_protobuf_field_mask_proto
diff --git a/vendor/modules.txt b/vendor/modules.txt
index e7245e2428..dfb5e08c68 100644
--- a/vendor/modules.txt
+++ b/vendor/modules.txt
@@ -4,16 +4,16 @@ cloud.google.com/go/internal
cloud.google.com/go/internal/optional
cloud.google.com/go/internal/trace
cloud.google.com/go/internal/version
-# cloud.google.com/go/compute v1.12.1
+# cloud.google.com/go/compute v1.13.0
## explicit; go 1.19
cloud.google.com/go/compute/internal
-# cloud.google.com/go/compute/metadata v0.2.1
+# cloud.google.com/go/compute/metadata v0.2.2
## explicit; go 1.19
cloud.google.com/go/compute/metadata
# cloud.google.com/go/iam v0.7.0
## explicit; go 1.19
cloud.google.com/go/iam
-# cloud.google.com/go/storage v1.28.0
+# cloud.google.com/go/storage v1.28.1
## explicit; go 1.19
cloud.google.com/go/storage
cloud.google.com/go/storage/internal
@@ -79,7 +79,7 @@ github.com/VividCortex/ewma
# github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137
## explicit; go 1.15
github.com/alecthomas/units
-# github.com/aws/aws-sdk-go v1.44.149
+# github.com/aws/aws-sdk-go v1.44.152
## explicit; go 1.11
github.com/aws/aws-sdk-go/aws
github.com/aws/aws-sdk-go/aws/awserr
@@ -121,7 +121,7 @@ github.com/aws/aws-sdk-go/service/sso
github.com/aws/aws-sdk-go/service/sso/ssoiface
github.com/aws/aws-sdk-go/service/sts
github.com/aws/aws-sdk-go/service/sts/stsiface
-# github.com/aws/aws-sdk-go-v2 v1.17.1
+# github.com/aws/aws-sdk-go-v2 v1.17.2
## explicit; go 1.15
github.com/aws/aws-sdk-go-v2
github.com/aws/aws-sdk-go-v2/aws
@@ -143,14 +143,14 @@ github.com/aws/aws-sdk-go-v2/internal/sdkio
github.com/aws/aws-sdk-go-v2/internal/strings
github.com/aws/aws-sdk-go-v2/internal/sync/singleflight
github.com/aws/aws-sdk-go-v2/internal/timeconv
-# github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.9
+# github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.10
## explicit; go 1.15
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/eventstreamapi
-# github.com/aws/aws-sdk-go-v2/config v1.18.3
+# github.com/aws/aws-sdk-go-v2/config v1.18.4
## explicit; go 1.15
github.com/aws/aws-sdk-go-v2/config
-# github.com/aws/aws-sdk-go-v2/credentials v1.13.3
+# github.com/aws/aws-sdk-go-v2/credentials v1.13.4
## explicit; go 1.15
github.com/aws/aws-sdk-go-v2/credentials
github.com/aws/aws-sdk-go-v2/credentials/ec2rolecreds
@@ -159,64 +159,64 @@ github.com/aws/aws-sdk-go-v2/credentials/endpointcreds/internal/client
github.com/aws/aws-sdk-go-v2/credentials/processcreds
github.com/aws/aws-sdk-go-v2/credentials/ssocreds
github.com/aws/aws-sdk-go-v2/credentials/stscreds
-# github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.19
+# github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.20
## explicit; go 1.15
github.com/aws/aws-sdk-go-v2/feature/ec2/imds
github.com/aws/aws-sdk-go-v2/feature/ec2/imds/internal/config
-# github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.42
+# github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.43
## explicit; go 1.15
github.com/aws/aws-sdk-go-v2/feature/s3/manager
-# github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.25
+# github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.26
## explicit; go 1.15
github.com/aws/aws-sdk-go-v2/internal/configsources
-# github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.19
+# github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.20
## explicit; go 1.15
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2
-# github.com/aws/aws-sdk-go-v2/internal/ini v1.3.26
+# github.com/aws/aws-sdk-go-v2/internal/ini v1.3.27
## explicit; go 1.15
github.com/aws/aws-sdk-go-v2/internal/ini
-# github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.16
+# github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.17
## explicit; go 1.15
github.com/aws/aws-sdk-go-v2/internal/v4a
github.com/aws/aws-sdk-go-v2/internal/v4a/internal/crypto
github.com/aws/aws-sdk-go-v2/internal/v4a/internal/v4
-# github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.10
+# github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.11
## explicit; go 1.15
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding
-# github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.20
+# github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.21
## explicit; go 1.15
github.com/aws/aws-sdk-go-v2/service/internal/checksum
-# github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.19
+# github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.20
## explicit; go 1.15
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url
-# github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.19
+# github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.20
## explicit; go 1.15
github.com/aws/aws-sdk-go-v2/service/internal/s3shared
github.com/aws/aws-sdk-go-v2/service/internal/s3shared/arn
github.com/aws/aws-sdk-go-v2/service/internal/s3shared/config
-# github.com/aws/aws-sdk-go-v2/service/s3 v1.29.4
+# github.com/aws/aws-sdk-go-v2/service/s3 v1.29.5
## explicit; go 1.15
github.com/aws/aws-sdk-go-v2/service/s3
github.com/aws/aws-sdk-go-v2/service/s3/internal/arn
github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations
github.com/aws/aws-sdk-go-v2/service/s3/internal/endpoints
github.com/aws/aws-sdk-go-v2/service/s3/types
-# github.com/aws/aws-sdk-go-v2/service/sso v1.11.25
+# github.com/aws/aws-sdk-go-v2/service/sso v1.11.26
## explicit; go 1.15
github.com/aws/aws-sdk-go-v2/service/sso
github.com/aws/aws-sdk-go-v2/service/sso/internal/endpoints
github.com/aws/aws-sdk-go-v2/service/sso/types
-# github.com/aws/aws-sdk-go-v2/service/ssooidc v1.13.8
+# github.com/aws/aws-sdk-go-v2/service/ssooidc v1.13.9
## explicit; go 1.15
github.com/aws/aws-sdk-go-v2/service/ssooidc
github.com/aws/aws-sdk-go-v2/service/ssooidc/internal/endpoints
github.com/aws/aws-sdk-go-v2/service/ssooidc/types
-# github.com/aws/aws-sdk-go-v2/service/sts v1.17.5
+# github.com/aws/aws-sdk-go-v2/service/sts v1.17.6
## explicit; go 1.15
github.com/aws/aws-sdk-go-v2/service/sts
github.com/aws/aws-sdk-go-v2/service/sts/internal/endpoints
github.com/aws/aws-sdk-go-v2/service/sts/types
-# github.com/aws/smithy-go v1.13.4
+# github.com/aws/smithy-go v1.13.5
## explicit; go 1.15
github.com/aws/smithy-go
github.com/aws/smithy-go/auth/bearer
@@ -240,7 +240,7 @@ github.com/aws/smithy-go/waiter
# github.com/beorn7/perks v1.0.1
## explicit; go 1.11
github.com/beorn7/perks/quantile
-# github.com/cespare/xxhash/v2 v2.1.2
+# github.com/cespare/xxhash/v2 v2.2.0
## explicit; go 1.11
github.com/cespare/xxhash/v2
# github.com/cheggaaa/pb/v3 v3.1.0
@@ -293,7 +293,6 @@ github.com/golang/protobuf/proto
github.com/golang/protobuf/ptypes
github.com/golang/protobuf/ptypes/any
github.com/golang/protobuf/ptypes/duration
-github.com/golang/protobuf/ptypes/empty
github.com/golang/protobuf/ptypes/timestamp
# github.com/golang/snappy v0.0.4
## explicit
@@ -399,7 +398,7 @@ github.com/prometheus/common/sigv4
github.com/prometheus/procfs
github.com/prometheus/procfs/internal/fs
github.com/prometheus/procfs/internal/util
-# github.com/prometheus/prometheus v0.40.4
+# github.com/prometheus/prometheus v0.40.5
## explicit; go 1.18
github.com/prometheus/prometheus/config
github.com/prometheus/prometheus/discovery
@@ -444,7 +443,7 @@ github.com/russross/blackfriday/v2
## explicit; go 1.13
github.com/stretchr/testify/assert
github.com/stretchr/testify/require
-# github.com/urfave/cli/v2 v2.23.5
+# github.com/urfave/cli/v2 v2.23.6
## explicit; go 1.18
github.com/urfave/cli/v2
# github.com/valyala/bytebufferpool v1.0.0
@@ -528,7 +527,7 @@ go.uber.org/atomic
## explicit; go 1.18
go.uber.org/goleak
go.uber.org/goleak/internal/stack
-# golang.org/x/exp v0.0.0-20221126150942-6ab00d035af9
+# golang.org/x/exp v0.0.0-20221204150635-6dcec336b2bb
## explicit; go 1.18
golang.org/x/exp/constraints
golang.org/x/exp/slices
@@ -557,18 +556,18 @@ golang.org/x/oauth2/jwt
# golang.org/x/sync v0.1.0
## explicit
golang.org/x/sync/errgroup
-# golang.org/x/sys v0.2.0
+# golang.org/x/sys v0.3.0
## explicit; go 1.17
golang.org/x/sys/internal/unsafeheader
golang.org/x/sys/unix
golang.org/x/sys/windows
-# golang.org/x/text v0.4.0
+# golang.org/x/text v0.5.0
## explicit; go 1.17
golang.org/x/text/secure/bidirule
golang.org/x/text/transform
golang.org/x/text/unicode/bidi
golang.org/x/text/unicode/norm
-# golang.org/x/time v0.2.0
+# golang.org/x/time v0.3.0
## explicit
golang.org/x/time/rate
# golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2
@@ -608,7 +607,7 @@ google.golang.org/appengine/internal/socket
google.golang.org/appengine/internal/urlfetch
google.golang.org/appengine/socket
google.golang.org/appengine/urlfetch
-# google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6
+# google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd
## explicit; go 1.19
google.golang.org/genproto/googleapis/api
google.golang.org/genproto/googleapis/api/annotations
@@ -618,7 +617,6 @@ google.golang.org/genproto/googleapis/rpc/errdetails
google.golang.org/genproto/googleapis/rpc/status
google.golang.org/genproto/googleapis/type/date
google.golang.org/genproto/googleapis/type/expr
-google.golang.org/genproto/protobuf/field_mask
# google.golang.org/grpc v1.51.0
## explicit; go 1.17
google.golang.org/grpc
From 8189770c50165b62867327ad388f2c2ef237ab6f Mon Sep 17 00:00:00 2001
From: Aliaksandr Valialkin
Date: Mon, 5 Dec 2022 15:15:00 -0800
Subject: [PATCH 24/38] all: add `-inmemoryDataFlushInterval` command-line flag
for controlling the frequency of saving in-memory data to disk
The main purpose of this command-line flag is to increase the lifetime of low-end flash storage
with the limited number of write operations it can perform. Such flash storage is usually
installed on Raspberry PI or similar appliances.
For example, `-inmemoryDataFlushInterval=1h` reduces the frequency of disk write operations
to up to once per hour if the ingested one-hour worth of data fits the limit for in-memory data.
The in-memory data is searchable in the same way as the data stored on disk.
VictoriaMetrics automatically flushes the in-memory data to disk on graceful shutdown via SIGINT signal.
The in-memory data is lost on unclean shutdown (hardware power loss, OOM crash, SIGKILL).
Updates https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3337
---
README.md | 77 +-
app/victoria-metrics/main.go | 5 +
app/vmstorage/main.go | 139 ++-
docs/CHANGELOG.md | 28 +
docs/README.md | 77 +-
docs/Single-server-VictoriaMetrics.md | 77 +-
lib/mergeset/inmemory_part.go | 34 +
lib/mergeset/table.go | 925 +++++++++++-----
lib/mergeset/table_test.go | 12 +-
lib/storage/index_db_test.go | 4 +-
lib/storage/inmemory_part.go | 34 +
lib/storage/partition.go | 1290 ++++++++++++++---------
lib/storage/partition_search_test.go | 11 +-
lib/storage/storage_test.go | 71 +-
lib/storage/table.go | 7 +-
lib/storage/table_search_test.go | 10 +-
lib/storage/table_search_timing_test.go | 5 +-
lib/storage/table_timing_test.go | 3 +-
18 files changed, 1833 insertions(+), 976 deletions(-)
diff --git a/README.md b/README.md
index 85c15a2e7e..c19d003e3c 100644
--- a/README.md
+++ b/README.md
@@ -1363,18 +1363,50 @@ It is recommended passing different `-promscrape.cluster.name` values to HA pair
## Storage
-VictoriaMetrics stores time series data in [MergeTree](https://en.wikipedia.org/wiki/Log-structured_merge-tree)-like
-data structures. On insert, VictoriaMetrics accumulates up to 1s of data and dumps it on disk to
-`<-storageDataPath>/data/small/YYYY_MM/` subdirectory forming a `part` with the following
-name pattern: `rowsCount_blocksCount_minTimestamp_maxTimestamp`. Each part consists of two "columns":
-values and timestamps. These are sorted and compressed raw time series values. Additionally, part contains
-index files for searching for specific series in the values and timestamps files.
+VictoriaMetrics buffers the ingested data in memory for up to a second. Then the buffered data is written to in-memory `parts`,
+which can be searched during queries. The in-memory `parts` are periodically persisted to disk, so they could survive unclean shutdown
+such as out of memory crash, hardware power loss or `SIGKILL` signal. The interval for flushing the in-memory data to disk
+can be configured with the `-inmemoryDataFlushInterval` command-line flag (note that too short flush interval may significantly increase disk IO).
-`Parts` are periodically merged into the bigger parts. The resulting `part` is constructed
-under `<-storageDataPath>/data/{small,big}/YYYY_MM/tmp` subdirectory.
-When the resulting `part` is complete, it is atomically moved from the `tmp`
-to its own subdirectory, while the source parts are atomically removed. The end result is that the source
-parts are substituted by a single resulting bigger `part` in the `<-storageDataPath>/data/{small,big}/YYYY_MM/` directory.
+In-memory parts are persisted to disk into `part` directories under the `<-storageDataPath>/data/small/YYYY_MM/` folder,
+where `YYYY_MM` is the month partition for the stored data. For example, `2022_11` is the partition for `parts`
+with [raw samples](https://docs.victoriametrics.com/keyConcepts.html#raw-samples) from `November 2022`.
+
+The `part` directory has the following name pattern: `rowsCount_blocksCount_minTimestamp_maxTimestamp`, where:
+
+- `rowsCount` - the number of [raw samples](https://docs.victoriametrics.com/keyConcepts.html#raw-samples) stored in the part
+- `blocksCount` - the number of blocks stored in the part (see details about blocks below)
+- `minTimestamp` and `maxTimestamp` - minimum and maximum timestamps across raw samples stored in the part
+
+Each `part` consists of `blocks` sorted by internal time series id (aka `TSID`).
+Each `block` contains up to 8K [raw samples](https://docs.victoriametrics.com/keyConcepts.html#raw-samples),
+which belong to a single [time series](https://docs.victoriametrics.com/keyConcepts.html#time-series).
+Raw samples in each block are sorted by `timestamp`. Blocks for the same time series are sorted
+by the `timestamp` of the first sample. Timestamps and values for all the blocks
+are stored in [compressed form](https://faun.pub/victoriametrics-achieving-better-compression-for-time-series-data-than-gorilla-317bc1f95932)
+in separate files under `part` directory - `timestamps.bin` and `values.bin`.
+
+The `part` directory also contains `index.bin` and `metaindex.bin` files - these files contain index
+for fast block lookups, which belong to the given `TSID` and cover the given time range.
+
+`Parts` are periodically merged into bigger parts in background. The background merge provides the following benefits:
+
+* keeping the number of data files under control, so they don't exceed limits on open files
+* improved data compression, since bigger parts are usually compressed better than smaller parts
+* improved query speed, since queries over smaller number of parts are executed faster
+* various background maintenance tasks such as [de-duplication](#deduplication), [downsampling](#downsampling)
+ and [freeing up disk space for the deleted time series](#how-to-delete-time-series) are performed during the merge
+
+Newly added `parts` either successfully appear in the storage or fail to appear.
+The newly added `parts` are being created in a temporary directory under `<-storageDataPath>/data/{small,big}/YYYY_MM/tmp` folder.
+When the newly added `part` is fully written and [fsynced](https://man7.org/linux/man-pages/man2/fsync.2.html)
+to a temporary directory, then it is atomically moved to the storage directory.
+Thanks to this alogrithm, storage never contains partially created parts, even if hardware power off
+occurrs in the middle of writing the `part` to disk - such incompletely written `parts`
+are automatically deleted on the next VictoriaMetrics start.
+
+The same applies to merge process — `parts` are either fully merged into a new `part` or fail to merge,
+leaving the source `parts` untouched.
VictoriaMetrics doesn't merge parts if their summary size exceeds free disk space.
This prevents from potential out of disk space errors during merge.
@@ -1383,24 +1415,10 @@ This increases overhead during data querying, since VictoriaMetrics needs to rea
bigger number of parts per each request. That's why it is recommended to have at least 20%
of free disk space under directory pointed by `-storageDataPath` command-line flag.
-Information about merging process is available in [single-node VictoriaMetrics](https://grafana.com/dashboards/10229)
-and [clustered VictoriaMetrics](https://grafana.com/grafana/dashboards/11176) Grafana dashboards.
+Information about merging process is available in [the dashboard for single-node VictoriaMetrics](https://grafana.com/dashboards/10229)
+and [the dashboard for VictoriaMetrics cluster](https://grafana.com/grafana/dashboards/11176).
See more details in [monitoring docs](#monitoring).
-The `merge` process improves compression rate and keeps number of `parts` on disk relatively low.
-Benefits of doing the merge process are the following:
-
-* it improves query performance, since lower number of `parts` are inspected with each query
-* it reduces the number of data files, since each `part` contains fixed number of files
-* various background maintenance tasks such as [de-duplication](#deduplication), [downsampling](#downsampling)
- and [freeing up disk space for the deleted time series](#how-to-delete-time-series) are performed during the merge.
-
-Newly added `parts` either appear in the storage or fail to appear.
-Storage never contains partially created parts. The same applies to merge process — `parts` are either fully
-merged into a new `part` or fail to merge. MergeTree doesn't contain partially merged `parts`.
-`Part` contents in MergeTree never change. Parts are immutable. They may be only deleted after the merge
-to a bigger `part` or when the `part` contents goes outside the configured `-retentionPeriod`.
-
See [this article](https://valyala.medium.com/how-victoriametrics-makes-instant-snapshots-for-multi-terabyte-time-series-data-e1f3fb0e0282) for more details.
See also [how to work with snapshots](#how-to-work-with-snapshots).
@@ -1723,9 +1741,10 @@ and [cardinality explorer docs](#cardinality-explorer).
* VictoriaMetrics buffers incoming data in memory for up to a few seconds before flushing it to persistent storage.
This may lead to the following "issues":
- * Data becomes available for querying in a few seconds after inserting. It is possible to flush in-memory buffers to persistent storage
+ * Data becomes available for querying in a few seconds after inserting. It is possible to flush in-memory buffers to searchable parts
by requesting `/internal/force_flush` http handler. This handler is mostly needed for testing and debugging purposes.
* The last few seconds of inserted data may be lost on unclean shutdown (i.e. OOM, `kill -9` or hardware reset).
+ The `-inmemoryDataFlushInterval` command-line flag allows controlling the frequency of in-memory data flush to persistent storage.
See [this article for technical details](https://valyala.medium.com/wal-usage-looks-broken-in-modern-time-series-databases-b62a627ab704).
* If VictoriaMetrics works slowly and eats more than a CPU core per 100K ingested data points per second,
@@ -2133,6 +2152,8 @@ Pass `-help` to VictoriaMetrics in order to see the list of supported command-li
Uses '{measurement}' instead of '{measurement}{separator}{field_name}' for metic name if InfluxDB line contains only a single field
-influxTrimTimestamp duration
Trim timestamps for InfluxDB line protocol data to this duration. Minimum practical duration is 1ms. Higher duration (i.e. 1s) may be used for reducing disk space usage for timestamp data (default 1ms)
+ -inmemoryDataFlushInterval duration
+ The interval for guaranteed saving of in-memory data to disk. The saved data survives unclean shutdown such as OOM crash, hardware reset, SIGKILL, etc. Bigger intervals may help increasing lifetime of flash storage with limited write cycles (e.g. Raspberry PI). Smaller intervals increase disk IO load. Minimum supported value is 1s (default 5s)
-insert.maxQueueDuration duration
The maximum duration for waiting in the queue for insert requests due to -maxConcurrentInserts (default 1m0s)
-logNewSeries
diff --git a/app/victoria-metrics/main.go b/app/victoria-metrics/main.go
index 16fc874050..770259cc8f 100644
--- a/app/victoria-metrics/main.go
+++ b/app/victoria-metrics/main.go
@@ -29,6 +29,10 @@ var (
"equal to -dedup.minScrapeInterval > 0. See https://docs.victoriametrics.com/#deduplication and https://docs.victoriametrics.com/#downsampling")
dryRun = flag.Bool("dryRun", false, "Whether to check only -promscrape.config and then exit. "+
"Unknown config entries aren't allowed in -promscrape.config by default. This can be changed with -promscrape.config.strictParse=false command-line flag")
+ inmemoryDataFlushInterval = flag.Duration("inmemoryDataFlushInterval", 5*time.Second, "The interval for guaranteed saving of in-memory data to disk. "+
+ "The saved data survives unclean shutdown such as OOM crash, hardware reset, SIGKILL, etc. "+
+ "Bigger intervals may help increasing lifetime of flash storage with limited write cycles (e.g. Raspberry PI). "+
+ "Smaller intervals increase disk IO load. Minimum supported value is 1s")
)
func main() {
@@ -54,6 +58,7 @@ func main() {
logger.Infof("starting VictoriaMetrics at %q...", *httpListenAddr)
startTime := time.Now()
storage.SetDedupInterval(*minScrapeInterval)
+ storage.SetDataFlushInterval(*inmemoryDataFlushInterval)
vmstorage.Init(promql.ResetRollupResultCacheIfNeeded)
vmselect.Init()
vminsert.Init()
diff --git a/app/vmstorage/main.go b/app/vmstorage/main.go
index 1ec41a60ae..2033386adc 100644
--- a/app/vmstorage/main.go
+++ b/app/vmstorage/main.go
@@ -100,7 +100,7 @@ func InitWithoutMetrics(resetCacheIfNeeded func(mrs []storage.MetricRow)) {
storage.SetLogNewSeries(*logNewSeries)
storage.SetFinalMergeDelay(*finalMergeDelay)
storage.SetBigMergeWorkersCount(*bigMergeConcurrency)
- storage.SetSmallMergeWorkersCount(*smallMergeConcurrency)
+ storage.SetMergeWorkersCount(*smallMergeConcurrency)
storage.SetRetentionTimezoneOffset(*retentionTimezoneOffset)
storage.SetFreeDiskSpaceLimit(minFreeDiskSpaceBytes.N)
storage.SetTSIDCacheSize(cacheSizeStorageTSID.N)
@@ -453,56 +453,80 @@ func registerStorageMetrics(strg *storage.Storage) {
return 0
})
- metrics.NewGauge(`vm_active_merges{type="storage/big"}`, func() float64 {
- return float64(tm().ActiveBigMerges)
+ metrics.NewGauge(`vm_active_merges{type="storage/inmemory"}`, func() float64 {
+ return float64(tm().ActiveInmemoryMerges)
})
metrics.NewGauge(`vm_active_merges{type="storage/small"}`, func() float64 {
return float64(tm().ActiveSmallMerges)
})
- metrics.NewGauge(`vm_active_merges{type="indexdb"}`, func() float64 {
- return float64(idbm().ActiveMerges)
+ metrics.NewGauge(`vm_active_merges{type="storage/big"}`, func() float64 {
+ return float64(tm().ActiveBigMerges)
+ })
+ metrics.NewGauge(`vm_active_merges{type="indexdb/inmemory"}`, func() float64 {
+ return float64(idbm().ActiveInmemoryMerges)
+ })
+ metrics.NewGauge(`vm_active_merges{type="indexdb/file"}`, func() float64 {
+ return float64(idbm().ActiveFileMerges)
})
- metrics.NewGauge(`vm_merges_total{type="storage/big"}`, func() float64 {
- return float64(tm().BigMergesCount)
+ metrics.NewGauge(`vm_merges_total{type="storage/inmemory"}`, func() float64 {
+ return float64(tm().InmemoryMergesCount)
})
metrics.NewGauge(`vm_merges_total{type="storage/small"}`, func() float64 {
return float64(tm().SmallMergesCount)
})
- metrics.NewGauge(`vm_merges_total{type="indexdb"}`, func() float64 {
- return float64(idbm().MergesCount)
+ metrics.NewGauge(`vm_merges_total{type="storage/big"}`, func() float64 {
+ return float64(tm().BigMergesCount)
+ })
+ metrics.NewGauge(`vm_merges_total{type="indexdb/inmemory"}`, func() float64 {
+ return float64(idbm().InmemoryMergesCount)
+ })
+ metrics.NewGauge(`vm_merges_total{type="indexdb/file"}`, func() float64 {
+ return float64(idbm().FileMergesCount)
})
- metrics.NewGauge(`vm_rows_merged_total{type="storage/big"}`, func() float64 {
- return float64(tm().BigRowsMerged)
+ metrics.NewGauge(`vm_rows_merged_total{type="storage/inmemory"}`, func() float64 {
+ return float64(tm().InmemoryRowsMerged)
})
metrics.NewGauge(`vm_rows_merged_total{type="storage/small"}`, func() float64 {
return float64(tm().SmallRowsMerged)
})
- metrics.NewGauge(`vm_rows_merged_total{type="indexdb"}`, func() float64 {
- return float64(idbm().ItemsMerged)
+ metrics.NewGauge(`vm_rows_merged_total{type="storage/big"}`, func() float64 {
+ return float64(tm().BigRowsMerged)
+ })
+ metrics.NewGauge(`vm_rows_merged_total{type="indexdb/inmemory"}`, func() float64 {
+ return float64(idbm().InmemoryItemsMerged)
+ })
+ metrics.NewGauge(`vm_rows_merged_total{type="indexdb/file"}`, func() float64 {
+ return float64(idbm().FileItemsMerged)
})
- metrics.NewGauge(`vm_rows_deleted_total{type="storage/big"}`, func() float64 {
- return float64(tm().BigRowsDeleted)
+ metrics.NewGauge(`vm_rows_deleted_total{type="storage/inmemory"}`, func() float64 {
+ return float64(tm().InmemoryRowsDeleted)
})
metrics.NewGauge(`vm_rows_deleted_total{type="storage/small"}`, func() float64 {
return float64(tm().SmallRowsDeleted)
})
-
- metrics.NewGauge(`vm_references{type="storage/big", name="parts"}`, func() float64 {
- return float64(tm().BigPartsRefCount)
+ metrics.NewGauge(`vm_rows_deleted_total{type="storage/big"}`, func() float64 {
+ return float64(tm().BigRowsDeleted)
})
- metrics.NewGauge(`vm_references{type="storage/small", name="parts"}`, func() float64 {
+
+ metrics.NewGauge(`vm_part_references{type="storage/inmemory"}`, func() float64 {
+ return float64(tm().InmemoryPartsRefCount)
+ })
+ metrics.NewGauge(`vm_part_references{type="storage/small"}`, func() float64 {
return float64(tm().SmallPartsRefCount)
})
- metrics.NewGauge(`vm_references{type="storage", name="partitions"}`, func() float64 {
+ metrics.NewGauge(`vm_part_references{type="storage/big"}`, func() float64 {
+ return float64(tm().BigPartsRefCount)
+ })
+ metrics.NewGauge(`vm_partition_references{type="storage"}`, func() float64 {
return float64(tm().PartitionsRefCount)
})
- metrics.NewGauge(`vm_references{type="indexdb", name="objects"}`, func() float64 {
+ metrics.NewGauge(`vm_object_references{type="indexdb"}`, func() float64 {
return float64(idbm().IndexDBRefCount)
})
- metrics.NewGauge(`vm_references{type="indexdb", name="parts"}`, func() float64 {
+ metrics.NewGauge(`vm_part_references{type="indexdb"}`, func() float64 {
return float64(idbm().PartsRefCount)
})
@@ -531,11 +555,11 @@ func registerStorageMetrics(strg *storage.Storage) {
return float64(idbm().CompositeFilterMissingConversions)
})
- metrics.NewGauge(`vm_assisted_merges_total{type="storage/small"}`, func() float64 {
- return float64(tm().SmallAssistedMerges)
+ metrics.NewGauge(`vm_assisted_merges_total{type="storage/inmemory"}`, func() float64 {
+ return float64(tm().InmemoryAssistedMerges)
})
- metrics.NewGauge(`vm_assisted_merges_total{type="indexdb"}`, func() float64 {
- return float64(idbm().AssistedMerges)
+ metrics.NewGauge(`vm_assisted_merges_total{type="indexdb/inmemory"}`, func() float64 {
+ return float64(idbm().AssistedInmemoryMerges)
})
metrics.NewGauge(`vm_indexdb_items_added_total`, func() float64 {
@@ -546,11 +570,8 @@ func registerStorageMetrics(strg *storage.Storage) {
})
// See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/686
- metrics.NewGauge(`vm_merge_need_free_disk_space{type="storage/small"}`, func() float64 {
- return float64(tm().SmallMergeNeedFreeDiskSpace)
- })
- metrics.NewGauge(`vm_merge_need_free_disk_space{type="storage/big"}`, func() float64 {
- return float64(tm().BigMergeNeedFreeDiskSpace)
+ metrics.NewGauge(`vm_merge_need_free_disk_space`, func() float64 {
+ return float64(tm().MergeNeedFreeDiskSpace)
})
metrics.NewGauge(`vm_pending_rows{type="storage"}`, func() float64 {
@@ -560,34 +581,52 @@ func registerStorageMetrics(strg *storage.Storage) {
return float64(idbm().PendingItems)
})
- metrics.NewGauge(`vm_parts{type="storage/big"}`, func() float64 {
- return float64(tm().BigPartsCount)
+ metrics.NewGauge(`vm_parts{type="storage/inmemory"}`, func() float64 {
+ return float64(tm().InmemoryPartsCount)
})
metrics.NewGauge(`vm_parts{type="storage/small"}`, func() float64 {
return float64(tm().SmallPartsCount)
})
- metrics.NewGauge(`vm_parts{type="indexdb"}`, func() float64 {
- return float64(idbm().PartsCount)
+ metrics.NewGauge(`vm_parts{type="storage/big"}`, func() float64 {
+ return float64(tm().BigPartsCount)
+ })
+ metrics.NewGauge(`vm_parts{type="indexdb/inmemory"}`, func() float64 {
+ return float64(idbm().InmemoryPartsCount)
+ })
+ metrics.NewGauge(`vm_parts{type="indexdb/file"}`, func() float64 {
+ return float64(idbm().FilePartsCount)
})
- metrics.NewGauge(`vm_blocks{type="storage/big"}`, func() float64 {
- return float64(tm().BigBlocksCount)
+ metrics.NewGauge(`vm_blocks{type="storage/inmemory"}`, func() float64 {
+ return float64(tm().InmemoryBlocksCount)
})
metrics.NewGauge(`vm_blocks{type="storage/small"}`, func() float64 {
return float64(tm().SmallBlocksCount)
})
- metrics.NewGauge(`vm_blocks{type="indexdb"}`, func() float64 {
- return float64(idbm().BlocksCount)
+ metrics.NewGauge(`vm_blocks{type="storage/big"}`, func() float64 {
+ return float64(tm().BigBlocksCount)
+ })
+ metrics.NewGauge(`vm_blocks{type="indexdb/inmemory"}`, func() float64 {
+ return float64(idbm().InmemoryBlocksCount)
+ })
+ metrics.NewGauge(`vm_blocks{type="indexdb/file"}`, func() float64 {
+ return float64(idbm().FileBlocksCount)
})
- metrics.NewGauge(`vm_data_size_bytes{type="storage/big"}`, func() float64 {
- return float64(tm().BigSizeBytes)
+ metrics.NewGauge(`vm_data_size_bytes{type="storage/inmemory"}`, func() float64 {
+ return float64(tm().InmemorySizeBytes)
})
metrics.NewGauge(`vm_data_size_bytes{type="storage/small"}`, func() float64 {
return float64(tm().SmallSizeBytes)
})
- metrics.NewGauge(`vm_data_size_bytes{type="indexdb"}`, func() float64 {
- return float64(idbm().SizeBytes)
+ metrics.NewGauge(`vm_data_size_bytes{type="storage/big"}`, func() float64 {
+ return float64(tm().BigSizeBytes)
+ })
+ metrics.NewGauge(`vm_data_size_bytes{type="indexdb/inmemory"}`, func() float64 {
+ return float64(idbm().InmemorySizeBytes)
+ })
+ metrics.NewGauge(`vm_data_size_bytes{type="indexdb/file"}`, func() float64 {
+ return float64(idbm().FileSizeBytes)
})
metrics.NewGauge(`vm_rows_added_to_storage_total`, func() float64 {
@@ -665,14 +704,20 @@ func registerStorageMetrics(strg *storage.Storage) {
return float64(m().TimestampsBytesSaved)
})
- metrics.NewGauge(`vm_rows{type="storage/big"}`, func() float64 {
- return float64(tm().BigRowsCount)
+ metrics.NewGauge(`vm_rows{type="storage/inmemory"}`, func() float64 {
+ return float64(tm().InmemoryRowsCount)
})
metrics.NewGauge(`vm_rows{type="storage/small"}`, func() float64 {
return float64(tm().SmallRowsCount)
})
- metrics.NewGauge(`vm_rows{type="indexdb"}`, func() float64 {
- return float64(idbm().ItemsCount)
+ metrics.NewGauge(`vm_rows{type="storage/big"}`, func() float64 {
+ return float64(tm().BigRowsCount)
+ })
+ metrics.NewGauge(`vm_rows{type="indexdb/inmemory"}`, func() float64 {
+ return float64(idbm().InmemoryItemsCount)
+ })
+ metrics.NewGauge(`vm_rows{type="indexdb/file"}`, func() float64 {
+ return float64(idbm().FileItemsCount)
})
metrics.NewGauge(`vm_date_range_search_calls_total`, func() float64 {
diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md
index d1b5507a27..96694cc09d 100644
--- a/docs/CHANGELOG.md
+++ b/docs/CHANGELOG.md
@@ -17,6 +17,34 @@ The following tip changes can be tested by building VictoriaMetrics components f
**Update note 1:** this release drops support for direct upgrade from VictoriaMetrics versions prior [v1.28.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.28.0). Please upgrade to `v1.84.0`, wait until `finished round 2 of background conversion` line is emitted to log by single-node VictoriaMetrics or by `vmstorage`, and then upgrade to newer releases.
+**Update note 2:** this release splits `type="indexdb"` metrics into `type="indexdb/inmemory"` and `type="indexdb/file"` metrics. This may break old dashboards and alerting rules, which contain label filters on `{type="indexdb"}`. It is recommended upgrading to the latest available dashboards and alerting rules mentioned in [these docs](https://docs.victoriametrics.com/#monitoring).
+
+* FEATURE: add `-inmemoryDataFlushInterval` command-line flag, which can be used for controlling the frequency of in-memory data flush to disk. The data flush frequency can be reduced when VictoriaMetrics stores data to low-end flash device with limited number of write cycles (for example, on Raspberry PI). See [this feature request](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3337).
+* FEATURE: expose additional metrics for `indexdb` and `storage` parts stored in memory and for `indexdb` parts stored in files (see [storage docs](https://docs.victoriametrics.com/#storage) for technical details):
+ * `vm_active_merges{type="storage/inmemory"}` - active merges for in-memory `storage` parts
+ * `vm_active_merges{type="indexdb/inmemory"}` - active merges for in-memory `indexdb` parts
+ * `vm_active_merges{type="indexdb/file"}` - active merges for file-based `indexdb` parts
+ * `vm_merges_total{type="storage/inmemory"}` - the total merges for in-memory `storage` parts
+ * `vm_merges_total{type="indexdb/inmemory"}` - the total merges for in-memory `indexdb` parts
+ * `vm_merges_total{type="indexdb/file"}` - the total merges for file-based `indexdb` parts
+ * `vm_rows_merged_total{type="storage/inmemory"}` - the total rows merged for in-memory `storage` parts
+ * `vm_rows_merged_total{type="indexdb/inmemory"}` - the total rows merged for in-memory `indexdb` parts
+ * `vm_rows_merged_total{type="indexdb/file"}` - the total rows merged for file-based `indexdb` parts
+ * `vm_rows_deleted_total{type="storage/inmemory"}` - the total rows deleted for in-memory `storage` parts
+ * `vm_assisted_merges_total{type="storage/inmemory"}` - the total number of assisted merges for in-memory `storage` parts
+ * `vm_assisted_merges_total{type="indexdb/inmemory"}` - the total number of assisted merges for in-memory `indexdb` parts
+ * `vm_parts{type="storage/inmemory"}` - the total number of in-memory `storage` parts
+ * `vm_parts{type="indexdb/inmemory"}` - the total number of in-memory `indexdb` parts
+ * `vm_parts{type="indexdb/file"}` - the total number of file-based `indexdb` parts
+ * `vm_blocks{type="storage/inmemory"}` - the total number of in-memory `storage` blocks
+ * `vm_blocks{type="indexdb/inmemory"}` - the total number of in-memory `indexdb` blocks
+ * `vm_blocks{type="indexdb/file"}` - the total number of file-based `indexdb` blocks
+ * `vm_data_size_bytes{type="storage/inmemory"}` - the total size of in-memory `storage` blocks
+ * `vm_data_size_bytes{type="indexdb/inmemory"}` - the total size of in-memory `indexdb` blocks
+ * `vm_data_size_bytes{type="indexdb/file"}` - the total size of file-based `indexdb` blocks
+ * `vm_rows{type="storage/inmemory"}` - the total number of in-memory `storage` rows
+ * `vm_rows{type="indexdb/inmemory"}` - the total number of in-memory `indexdb` rows
+ * `vm_rows{type="indexdb/file"}` - the total number of file-based `indexdb` rows
* FEATURE: [vmagent](https://docs.victoriametrics.com/vmagent.html): improve [service discovery](https://docs.victoriametrics.com/sd_configs.html) performance when discovering big number of targets (10K and more).
* FEATURE: [vmagent](https://docs.victoriametrics.com/vmagent.html): add `exported_` prefix to metric names exported by scrape targets if these metric names clash with [automatically generated metrics](https://docs.victoriametrics.com/vmagent.html#automatically-generated-metrics) such as `up`, `scrape_samples_scraped`, etc. This prevents from corruption of automatically generated metrics. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3406).
* FEATURE: [VictoriaMetrics cluster](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html): improve error message when the requested path cannot be properly parsed, so users could identify the issue and properly fix the path. Now the error message links to [url format docs](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#url-format). See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3402).
diff --git a/docs/README.md b/docs/README.md
index dce732e898..1fe27c686d 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -1364,18 +1364,50 @@ It is recommended passing different `-promscrape.cluster.name` values to HA pair
## Storage
-VictoriaMetrics stores time series data in [MergeTree](https://en.wikipedia.org/wiki/Log-structured_merge-tree)-like
-data structures. On insert, VictoriaMetrics accumulates up to 1s of data and dumps it on disk to
-`<-storageDataPath>/data/small/YYYY_MM/` subdirectory forming a `part` with the following
-name pattern: `rowsCount_blocksCount_minTimestamp_maxTimestamp`. Each part consists of two "columns":
-values and timestamps. These are sorted and compressed raw time series values. Additionally, part contains
-index files for searching for specific series in the values and timestamps files.
+VictoriaMetrics buffers the ingested data in memory for up to a second. Then the buffered data is written to in-memory `parts`,
+which can be searched during queries. The in-memory `parts` are periodically persisted to disk, so they could survive unclean shutdown
+such as out of memory crash, hardware power loss or `SIGKILL` signal. The interval for flushing the in-memory data to disk
+can be configured with the `-inmemoryDataFlushInterval` command-line flag (note that too short flush interval may significantly increase disk IO).
-`Parts` are periodically merged into the bigger parts. The resulting `part` is constructed
-under `<-storageDataPath>/data/{small,big}/YYYY_MM/tmp` subdirectory.
-When the resulting `part` is complete, it is atomically moved from the `tmp`
-to its own subdirectory, while the source parts are atomically removed. The end result is that the source
-parts are substituted by a single resulting bigger `part` in the `<-storageDataPath>/data/{small,big}/YYYY_MM/` directory.
+In-memory parts are persisted to disk into `part` directories under the `<-storageDataPath>/data/small/YYYY_MM/` folder,
+where `YYYY_MM` is the month partition for the stored data. For example, `2022_11` is the partition for `parts`
+with [raw samples](https://docs.victoriametrics.com/keyConcepts.html#raw-samples) from `November 2022`.
+
+The `part` directory has the following name pattern: `rowsCount_blocksCount_minTimestamp_maxTimestamp`, where:
+
+- `rowsCount` - the number of [raw samples](https://docs.victoriametrics.com/keyConcepts.html#raw-samples) stored in the part
+- `blocksCount` - the number of blocks stored in the part (see details about blocks below)
+- `minTimestamp` and `maxTimestamp` - minimum and maximum timestamps across raw samples stored in the part
+
+Each `part` consists of `blocks` sorted by internal time series id (aka `TSID`).
+Each `block` contains up to 8K [raw samples](https://docs.victoriametrics.com/keyConcepts.html#raw-samples),
+which belong to a single [time series](https://docs.victoriametrics.com/keyConcepts.html#time-series).
+Raw samples in each block are sorted by `timestamp`. Blocks for the same time series are sorted
+by the `timestamp` of the first sample. Timestamps and values for all the blocks
+are stored in [compressed form](https://faun.pub/victoriametrics-achieving-better-compression-for-time-series-data-than-gorilla-317bc1f95932)
+in separate files under `part` directory - `timestamps.bin` and `values.bin`.
+
+The `part` directory also contains `index.bin` and `metaindex.bin` files - these files contain index
+for fast block lookups, which belong to the given `TSID` and cover the given time range.
+
+`Parts` are periodically merged into bigger parts in background. The background merge provides the following benefits:
+
+* keeping the number of data files under control, so they don't exceed limits on open files
+* improved data compression, since bigger parts are usually compressed better than smaller parts
+* improved query speed, since queries over smaller number of parts are executed faster
+* various background maintenance tasks such as [de-duplication](#deduplication), [downsampling](#downsampling)
+ and [freeing up disk space for the deleted time series](#how-to-delete-time-series) are performed during the merge
+
+Newly added `parts` either successfully appear in the storage or fail to appear.
+The newly added `parts` are being created in a temporary directory under `<-storageDataPath>/data/{small,big}/YYYY_MM/tmp` folder.
+When the newly added `part` is fully written and [fsynced](https://man7.org/linux/man-pages/man2/fsync.2.html)
+to a temporary directory, then it is atomically moved to the storage directory.
+Thanks to this alogrithm, storage never contains partially created parts, even if hardware power off
+occurrs in the middle of writing the `part` to disk - such incompletely written `parts`
+are automatically deleted on the next VictoriaMetrics start.
+
+The same applies to merge process — `parts` are either fully merged into a new `part` or fail to merge,
+leaving the source `parts` untouched.
VictoriaMetrics doesn't merge parts if their summary size exceeds free disk space.
This prevents from potential out of disk space errors during merge.
@@ -1384,24 +1416,10 @@ This increases overhead during data querying, since VictoriaMetrics needs to rea
bigger number of parts per each request. That's why it is recommended to have at least 20%
of free disk space under directory pointed by `-storageDataPath` command-line flag.
-Information about merging process is available in [single-node VictoriaMetrics](https://grafana.com/dashboards/10229)
-and [clustered VictoriaMetrics](https://grafana.com/grafana/dashboards/11176) Grafana dashboards.
+Information about merging process is available in [the dashboard for single-node VictoriaMetrics](https://grafana.com/dashboards/10229)
+and [the dashboard for VictoriaMetrics cluster](https://grafana.com/grafana/dashboards/11176).
See more details in [monitoring docs](#monitoring).
-The `merge` process improves compression rate and keeps number of `parts` on disk relatively low.
-Benefits of doing the merge process are the following:
-
-* it improves query performance, since lower number of `parts` are inspected with each query
-* it reduces the number of data files, since each `part` contains fixed number of files
-* various background maintenance tasks such as [de-duplication](#deduplication), [downsampling](#downsampling)
- and [freeing up disk space for the deleted time series](#how-to-delete-time-series) are performed during the merge.
-
-Newly added `parts` either appear in the storage or fail to appear.
-Storage never contains partially created parts. The same applies to merge process — `parts` are either fully
-merged into a new `part` or fail to merge. MergeTree doesn't contain partially merged `parts`.
-`Part` contents in MergeTree never change. Parts are immutable. They may be only deleted after the merge
-to a bigger `part` or when the `part` contents goes outside the configured `-retentionPeriod`.
-
See [this article](https://valyala.medium.com/how-victoriametrics-makes-instant-snapshots-for-multi-terabyte-time-series-data-e1f3fb0e0282) for more details.
See also [how to work with snapshots](#how-to-work-with-snapshots).
@@ -1724,9 +1742,10 @@ and [cardinality explorer docs](#cardinality-explorer).
* VictoriaMetrics buffers incoming data in memory for up to a few seconds before flushing it to persistent storage.
This may lead to the following "issues":
- * Data becomes available for querying in a few seconds after inserting. It is possible to flush in-memory buffers to persistent storage
+ * Data becomes available for querying in a few seconds after inserting. It is possible to flush in-memory buffers to searchable parts
by requesting `/internal/force_flush` http handler. This handler is mostly needed for testing and debugging purposes.
* The last few seconds of inserted data may be lost on unclean shutdown (i.e. OOM, `kill -9` or hardware reset).
+ The `-inmemoryDataFlushInterval` command-line flag allows controlling the frequency of in-memory data flush to persistent storage.
See [this article for technical details](https://valyala.medium.com/wal-usage-looks-broken-in-modern-time-series-databases-b62a627ab704).
* If VictoriaMetrics works slowly and eats more than a CPU core per 100K ingested data points per second,
@@ -2134,6 +2153,8 @@ Pass `-help` to VictoriaMetrics in order to see the list of supported command-li
Uses '{measurement}' instead of '{measurement}{separator}{field_name}' for metic name if InfluxDB line contains only a single field
-influxTrimTimestamp duration
Trim timestamps for InfluxDB line protocol data to this duration. Minimum practical duration is 1ms. Higher duration (i.e. 1s) may be used for reducing disk space usage for timestamp data (default 1ms)
+ -inmemoryDataFlushInterval duration
+ The interval for guaranteed saving of in-memory data to disk. The saved data survives unclean shutdown such as OOM crash, hardware reset, SIGKILL, etc. Bigger intervals may help increasing lifetime of flash storage with limited write cycles (e.g. Raspberry PI). Smaller intervals increase disk IO load. Minimum supported value is 1s (default 5s)
-insert.maxQueueDuration duration
The maximum duration for waiting in the queue for insert requests due to -maxConcurrentInserts (default 1m0s)
-logNewSeries
diff --git a/docs/Single-server-VictoriaMetrics.md b/docs/Single-server-VictoriaMetrics.md
index 7a9908aabd..ed764040bc 100644
--- a/docs/Single-server-VictoriaMetrics.md
+++ b/docs/Single-server-VictoriaMetrics.md
@@ -1367,18 +1367,50 @@ It is recommended passing different `-promscrape.cluster.name` values to HA pair
## Storage
-VictoriaMetrics stores time series data in [MergeTree](https://en.wikipedia.org/wiki/Log-structured_merge-tree)-like
-data structures. On insert, VictoriaMetrics accumulates up to 1s of data and dumps it on disk to
-`<-storageDataPath>/data/small/YYYY_MM/` subdirectory forming a `part` with the following
-name pattern: `rowsCount_blocksCount_minTimestamp_maxTimestamp`. Each part consists of two "columns":
-values and timestamps. These are sorted and compressed raw time series values. Additionally, part contains
-index files for searching for specific series in the values and timestamps files.
+VictoriaMetrics buffers the ingested data in memory for up to a second. Then the buffered data is written to in-memory `parts`,
+which can be searched during queries. The in-memory `parts` are periodically persisted to disk, so they could survive unclean shutdown
+such as out of memory crash, hardware power loss or `SIGKILL` signal. The interval for flushing the in-memory data to disk
+can be configured with the `-inmemoryDataFlushInterval` command-line flag (note that too short flush interval may significantly increase disk IO).
-`Parts` are periodically merged into the bigger parts. The resulting `part` is constructed
-under `<-storageDataPath>/data/{small,big}/YYYY_MM/tmp` subdirectory.
-When the resulting `part` is complete, it is atomically moved from the `tmp`
-to its own subdirectory, while the source parts are atomically removed. The end result is that the source
-parts are substituted by a single resulting bigger `part` in the `<-storageDataPath>/data/{small,big}/YYYY_MM/` directory.
+In-memory parts are persisted to disk into `part` directories under the `<-storageDataPath>/data/small/YYYY_MM/` folder,
+where `YYYY_MM` is the month partition for the stored data. For example, `2022_11` is the partition for `parts`
+with [raw samples](https://docs.victoriametrics.com/keyConcepts.html#raw-samples) from `November 2022`.
+
+The `part` directory has the following name pattern: `rowsCount_blocksCount_minTimestamp_maxTimestamp`, where:
+
+- `rowsCount` - the number of [raw samples](https://docs.victoriametrics.com/keyConcepts.html#raw-samples) stored in the part
+- `blocksCount` - the number of blocks stored in the part (see details about blocks below)
+- `minTimestamp` and `maxTimestamp` - minimum and maximum timestamps across raw samples stored in the part
+
+Each `part` consists of `blocks` sorted by internal time series id (aka `TSID`).
+Each `block` contains up to 8K [raw samples](https://docs.victoriametrics.com/keyConcepts.html#raw-samples),
+which belong to a single [time series](https://docs.victoriametrics.com/keyConcepts.html#time-series).
+Raw samples in each block are sorted by `timestamp`. Blocks for the same time series are sorted
+by the `timestamp` of the first sample. Timestamps and values for all the blocks
+are stored in [compressed form](https://faun.pub/victoriametrics-achieving-better-compression-for-time-series-data-than-gorilla-317bc1f95932)
+in separate files under `part` directory - `timestamps.bin` and `values.bin`.
+
+The `part` directory also contains `index.bin` and `metaindex.bin` files - these files contain index
+for fast block lookups, which belong to the given `TSID` and cover the given time range.
+
+`Parts` are periodically merged into bigger parts in background. The background merge provides the following benefits:
+
+* keeping the number of data files under control, so they don't exceed limits on open files
+* improved data compression, since bigger parts are usually compressed better than smaller parts
+* improved query speed, since queries over smaller number of parts are executed faster
+* various background maintenance tasks such as [de-duplication](#deduplication), [downsampling](#downsampling)
+ and [freeing up disk space for the deleted time series](#how-to-delete-time-series) are performed during the merge
+
+Newly added `parts` either successfully appear in the storage or fail to appear.
+The newly added `parts` are being created in a temporary directory under `<-storageDataPath>/data/{small,big}/YYYY_MM/tmp` folder.
+When the newly added `part` is fully written and [fsynced](https://man7.org/linux/man-pages/man2/fsync.2.html)
+to a temporary directory, then it is atomically moved to the storage directory.
+Thanks to this alogrithm, storage never contains partially created parts, even if hardware power off
+occurrs in the middle of writing the `part` to disk - such incompletely written `parts`
+are automatically deleted on the next VictoriaMetrics start.
+
+The same applies to merge process — `parts` are either fully merged into a new `part` or fail to merge,
+leaving the source `parts` untouched.
VictoriaMetrics doesn't merge parts if their summary size exceeds free disk space.
This prevents from potential out of disk space errors during merge.
@@ -1387,24 +1419,10 @@ This increases overhead during data querying, since VictoriaMetrics needs to rea
bigger number of parts per each request. That's why it is recommended to have at least 20%
of free disk space under directory pointed by `-storageDataPath` command-line flag.
-Information about merging process is available in [single-node VictoriaMetrics](https://grafana.com/dashboards/10229)
-and [clustered VictoriaMetrics](https://grafana.com/grafana/dashboards/11176) Grafana dashboards.
+Information about merging process is available in [the dashboard for single-node VictoriaMetrics](https://grafana.com/dashboards/10229)
+and [the dashboard for VictoriaMetrics cluster](https://grafana.com/grafana/dashboards/11176).
See more details in [monitoring docs](#monitoring).
-The `merge` process improves compression rate and keeps number of `parts` on disk relatively low.
-Benefits of doing the merge process are the following:
-
-* it improves query performance, since lower number of `parts` are inspected with each query
-* it reduces the number of data files, since each `part` contains fixed number of files
-* various background maintenance tasks such as [de-duplication](#deduplication), [downsampling](#downsampling)
- and [freeing up disk space for the deleted time series](#how-to-delete-time-series) are performed during the merge.
-
-Newly added `parts` either appear in the storage or fail to appear.
-Storage never contains partially created parts. The same applies to merge process — `parts` are either fully
-merged into a new `part` or fail to merge. MergeTree doesn't contain partially merged `parts`.
-`Part` contents in MergeTree never change. Parts are immutable. They may be only deleted after the merge
-to a bigger `part` or when the `part` contents goes outside the configured `-retentionPeriod`.
-
See [this article](https://valyala.medium.com/how-victoriametrics-makes-instant-snapshots-for-multi-terabyte-time-series-data-e1f3fb0e0282) for more details.
See also [how to work with snapshots](#how-to-work-with-snapshots).
@@ -1727,9 +1745,10 @@ and [cardinality explorer docs](#cardinality-explorer).
* VictoriaMetrics buffers incoming data in memory for up to a few seconds before flushing it to persistent storage.
This may lead to the following "issues":
- * Data becomes available for querying in a few seconds after inserting. It is possible to flush in-memory buffers to persistent storage
+ * Data becomes available for querying in a few seconds after inserting. It is possible to flush in-memory buffers to searchable parts
by requesting `/internal/force_flush` http handler. This handler is mostly needed for testing and debugging purposes.
* The last few seconds of inserted data may be lost on unclean shutdown (i.e. OOM, `kill -9` or hardware reset).
+ The `-inmemoryDataFlushInterval` command-line flag allows controlling the frequency of in-memory data flush to persistent storage.
See [this article for technical details](https://valyala.medium.com/wal-usage-looks-broken-in-modern-time-series-databases-b62a627ab704).
* If VictoriaMetrics works slowly and eats more than a CPU core per 100K ingested data points per second,
@@ -2137,6 +2156,8 @@ Pass `-help` to VictoriaMetrics in order to see the list of supported command-li
Uses '{measurement}' instead of '{measurement}{separator}{field_name}' for metic name if InfluxDB line contains only a single field
-influxTrimTimestamp duration
Trim timestamps for InfluxDB line protocol data to this duration. Minimum practical duration is 1ms. Higher duration (i.e. 1s) may be used for reducing disk space usage for timestamp data (default 1ms)
+ -inmemoryDataFlushInterval duration
+ The interval for guaranteed saving of in-memory data to disk. The saved data survives unclean shutdown such as OOM crash, hardware reset, SIGKILL, etc. Bigger intervals may help increasing lifetime of flash storage with limited write cycles (e.g. Raspberry PI). Smaller intervals increase disk IO load. Minimum supported value is 1s (default 5s)
-insert.maxQueueDuration duration
The maximum duration for waiting in the queue for insert requests due to -maxConcurrentInserts (default 1m0s)
-logNewSeries
diff --git a/lib/mergeset/inmemory_part.go b/lib/mergeset/inmemory_part.go
index c3caca201c..d8da08c973 100644
--- a/lib/mergeset/inmemory_part.go
+++ b/lib/mergeset/inmemory_part.go
@@ -1,8 +1,12 @@
package mergeset
import (
+ "fmt"
+ "path/filepath"
+
"github.com/VictoriaMetrics/VictoriaMetrics/lib/bytesutil"
"github.com/VictoriaMetrics/VictoriaMetrics/lib/encoding"
+ "github.com/VictoriaMetrics/VictoriaMetrics/lib/fs"
"github.com/VictoriaMetrics/VictoriaMetrics/lib/logger"
)
@@ -28,6 +32,36 @@ func (mp *inmemoryPart) Reset() {
mp.lensData.Reset()
}
+// StoreToDisk stores mp to the given path on disk.
+func (mp *inmemoryPart) StoreToDisk(path string) error {
+ if err := fs.MkdirAllIfNotExist(path); err != nil {
+ return fmt.Errorf("cannot create directory %q: %w", path, err)
+ }
+ metaindexPath := path + "/metaindex.bin"
+ if err := fs.WriteFileAndSync(metaindexPath, mp.metaindexData.B); err != nil {
+ return fmt.Errorf("cannot store metaindex: %w", err)
+ }
+ indexPath := path + "/index.bin"
+ if err := fs.WriteFileAndSync(indexPath, mp.indexData.B); err != nil {
+ return fmt.Errorf("cannot store index: %w", err)
+ }
+ itemsPath := path + "/items.bin"
+ if err := fs.WriteFileAndSync(itemsPath, mp.itemsData.B); err != nil {
+ return fmt.Errorf("cannot store items: %w", err)
+ }
+ lensPath := path + "/lens.bin"
+ if err := fs.WriteFileAndSync(lensPath, mp.lensData.B); err != nil {
+ return fmt.Errorf("cannot store lens: %w", err)
+ }
+ if err := mp.ph.WriteMetadata(path); err != nil {
+ return fmt.Errorf("cannot store metadata: %w", err)
+ }
+ // Sync parent directory in order to make sure the written files remain visible after hardware reset
+ parentDirPath := filepath.Dir(path)
+ fs.MustSyncPath(parentDirPath)
+ return nil
+}
+
// Init initializes mp from ib.
func (mp *inmemoryPart) Init(ib *inmemoryBlock) {
mp.Reset()
diff --git a/lib/mergeset/table.go b/lib/mergeset/table.go
index d88cba7cb1..ea18b78add 100644
--- a/lib/mergeset/table.go
+++ b/lib/mergeset/table.go
@@ -22,10 +22,10 @@ import (
"github.com/VictoriaMetrics/VictoriaMetrics/lib/syncwg"
)
-// maxParts is the maximum number of parts in the table.
+// maxInmemoryParts is the maximum number of inmemory parts in the table.
//
// This number may be reached when the insertion pace outreaches merger pace.
-const maxParts = 512
+const maxInmemoryParts = 64
// Default number of parts to merge at once.
//
@@ -46,6 +46,24 @@ const finalPartsToMerge = 2
// The required time shouldn't exceed a day.
const maxPartSize = 400e9
+// The interval for flushing buffered data to parts, so it becomes visible to search.
+const pendingItemsFlushInterval = time.Second
+
+// The interval for guaranteed flush of recently ingested data from memory to on-disk parts,
+// so they survive process crash.
+var dataFlushInterval = 5 * time.Second
+
+// SetDataFlushInterval sets the interval for guaranteed flush of recently ingested data from memory to disk.
+//
+// The data can be flushed from memory to disk more frequently if it doesn't fit the memory limit.
+//
+// This function must be called before initializing the indexdb.
+func SetDataFlushInterval(d time.Duration) {
+ if d > pendingItemsFlushInterval {
+ dataFlushInterval = d
+ }
+}
+
// maxItemsPerCachedPart is the maximum items per created part by the merge,
// which must be cached in the OS page cache.
//
@@ -65,20 +83,23 @@ func maxItemsPerCachedPart() uint64 {
return maxItems
}
-// The interval for flushing (converting) recent raw items into parts,
-// so they become visible to search.
-const rawItemsFlushInterval = time.Second
-
// Table represents mergeset table.
type Table struct {
// Atomically updated counters must go first in the struct, so they are properly
// aligned to 8 bytes on 32-bit architectures.
// See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/212
- activeMerges uint64
- mergesCount uint64
- itemsMerged uint64
- assistedMerges uint64
+ activeInmemoryMerges uint64
+ activeFileMerges uint64
+
+ inmemoryMergesCount uint64
+ fileMergesCount uint64
+
+ inmemoryItemsMerged uint64
+ fileItemsMerged uint64
+
+ assistedInmemoryMerges uint64
+
itemsAdded uint64
itemsAddedSizeBytes uint64
@@ -93,14 +114,20 @@ type Table struct {
prepareBlock PrepareBlockCallback
isReadOnly *uint32
- partsLock sync.Mutex
- parts []*partWrapper
-
// rawItems contains recently added items that haven't been converted to parts yet.
//
// rawItems aren't used in search for performance reasons
rawItems rawItemsShards
+ // partsLock protects inmemoryParts and fileParts.
+ partsLock sync.Mutex
+
+ // inmemoryParts contains inmemory parts.
+ inmemoryParts []*partWrapper
+
+ // fileParts contains file-backed parts.
+ fileParts []*partWrapper
+
snapshotLock sync.RWMutex
flockF *os.File
@@ -139,10 +166,13 @@ func (riss *rawItemsShards) init() {
}
func (riss *rawItemsShards) addItems(tb *Table, items [][]byte) {
- n := atomic.AddUint32(&riss.shardIdx, 1)
shards := riss.shards
- idx := n % uint32(len(shards))
- shards[idx].addItems(tb, items)
+ shardsLen := uint32(len(shards))
+ for len(items) > 0 {
+ n := atomic.AddUint32(&riss.shardIdx, 1)
+ idx := n % shardsLen
+ items = shards[idx].addItems(tb, items)
+ }
}
func (riss *rawItemsShards) Len() int {
@@ -179,8 +209,9 @@ func (ris *rawItemsShard) Len() int {
return n
}
-func (ris *rawItemsShard) addItems(tb *Table, items [][]byte) {
- var blocksToFlush []*inmemoryBlock
+func (ris *rawItemsShard) addItems(tb *Table, items [][]byte) [][]byte {
+ var ibsToFlush []*inmemoryBlock
+ var tailItems [][]byte
ris.mu.Lock()
ibs := ris.ibs
@@ -190,10 +221,17 @@ func (ris *rawItemsShard) addItems(tb *Table, items [][]byte) {
ris.ibs = ibs
}
ib := ibs[len(ibs)-1]
- for _, item := range items {
+ for i, item := range items {
if ib.Add(item) {
continue
}
+ if len(ibs) >= maxBlocksPerShard {
+ ibsToFlush = ibs
+ ibs = make([]*inmemoryBlock, 0, maxBlocksPerShard)
+ tailItems = items[i:]
+ atomic.StoreUint64(&ris.lastFlushTime, fasttime.UnixTimestamp())
+ break
+ }
ib = getInmemoryBlock()
if ib.Add(item) {
ibs = append(ibs, ib)
@@ -203,17 +241,11 @@ func (ris *rawItemsShard) addItems(tb *Table, items [][]byte) {
logger.Panicf("BUG: cannot insert too big item into an empty inmemoryBlock len(item)=%d; the caller should be responsible for avoiding too big items", len(item))
}
ris.ibs = ibs
- if len(ibs) >= maxBlocksPerShard {
- blocksToFlush = append(blocksToFlush, ibs...)
- for i := range ibs {
- ibs[i] = nil
- }
- ris.ibs = ibs[:0]
- atomic.StoreUint64(&ris.lastFlushTime, fasttime.UnixTimestamp())
- }
ris.mu.Unlock()
- tb.mergeRawItemsBlocks(blocksToFlush, false)
+ tb.flushBlocksToParts(ibsToFlush, false)
+
+ return tailItems
}
type partWrapper struct {
@@ -224,6 +256,9 @@ type partWrapper struct {
refCount uint64
isInMerge bool
+
+ // The deadline when the in-memory part must be flushed to disk.
+ flushToDiskDeadline time.Time
}
func (pw *partWrapper) incRef() {
@@ -285,7 +320,7 @@ func OpenTable(path string, flushCallback func(), prepareBlock PrepareBlockCallb
flushCallback: flushCallback,
prepareBlock: prepareBlock,
isReadOnly: isReadOnly,
- parts: pws,
+ fileParts: pws,
mergeIdx: uint64(time.Now().UnixNano()),
flockF: flockF,
stopCh: make(chan struct{}),
@@ -296,7 +331,7 @@ func OpenTable(path string, flushCallback func(), prepareBlock PrepareBlockCallb
var m TableMetrics
tb.UpdateMetrics(&m)
logger.Infof("table %q has been opened in %.3f seconds; partsCount: %d; blocksCount: %d, itemsCount: %d; sizeBytes: %d",
- path, time.Since(startTime).Seconds(), m.PartsCount, m.BlocksCount, m.ItemsCount, m.SizeBytes)
+ path, time.Since(startTime).Seconds(), m.FilePartsCount, m.FileBlocksCount, m.FileItemsCount, m.FileSizeBytes)
if flushCallback != nil {
tb.flushCallbackWorkerWG.Add(1)
@@ -323,8 +358,9 @@ func OpenTable(path string, flushCallback func(), prepareBlock PrepareBlockCallb
}
func (tb *Table) startBackgroundWorkers() {
- tb.startPartMergers()
- tb.startRawItemsFlusher()
+ tb.startMergeWorkers()
+ tb.startInmemoryPartsFlusher()
+ tb.startPendingItemsFlusher()
}
// MustClose closes the table.
@@ -339,42 +375,26 @@ func (tb *Table) MustClose() {
logger.Infof("flushing inmemory parts to files on %q...", tb.path)
startTime = time.Now()
- // Flush raw items the last time before exit.
- tb.flushPendingItems(true)
-
- // Flush inmemory parts to disk.
- var pws []*partWrapper
- tb.partsLock.Lock()
- for _, pw := range tb.parts {
- if pw.mp == nil {
- continue
- }
- if pw.isInMerge {
- logger.Panicf("BUG: the inmemory part %s mustn't be in merge after stopping parts merger in %q", &pw.mp.ph, tb.path)
- }
- pw.isInMerge = true
- pws = append(pws, pw)
- }
- tb.partsLock.Unlock()
-
- if err := tb.mergePartsOptimal(pws); err != nil {
- logger.Panicf("FATAL: cannot flush inmemory parts to files in %q: %s", tb.path, err)
- }
- logger.Infof("%d inmemory parts have been flushed to files in %.3f seconds on %q", len(pws), time.Since(startTime).Seconds(), tb.path)
+ // Flush inmemory items the last time before exit.
+ tb.flushInmemoryItems()
logger.Infof("waiting for flush callback worker to stop on %q...", tb.path)
startTime = time.Now()
tb.flushCallbackWorkerWG.Wait()
logger.Infof("flush callback worker stopped in %.3f seconds on %q", time.Since(startTime).Seconds(), tb.path)
- // Remove references to parts from the tb, so they may be eventually closed
- // after all the searches are done.
+ // Remove references to parts from the tb, so they may be eventually closed after all the searches are done.
tb.partsLock.Lock()
- parts := tb.parts
- tb.parts = nil
+ inmemoryParts := tb.inmemoryParts
+ fileParts := tb.fileParts
+ tb.inmemoryParts = nil
+ tb.fileParts = nil
tb.partsLock.Unlock()
- for _, pw := range parts {
+ for _, pw := range inmemoryParts {
+ pw.decRef()
+ }
+ for _, pw := range fileParts {
pw.decRef()
}
@@ -391,20 +411,33 @@ func (tb *Table) Path() string {
// TableMetrics contains essential metrics for the Table.
type TableMetrics struct {
- ActiveMerges uint64
- MergesCount uint64
- ItemsMerged uint64
- AssistedMerges uint64
+ ActiveInmemoryMerges uint64
+ ActiveFileMerges uint64
+
+ InmemoryMergesCount uint64
+ FileMergesCount uint64
+
+ InmemoryItemsMerged uint64
+ FileItemsMerged uint64
+
+ AssistedInmemoryMerges uint64
+
ItemsAdded uint64
ItemsAddedSizeBytes uint64
PendingItems uint64
- PartsCount uint64
+ InmemoryPartsCount uint64
+ FilePartsCount uint64
- BlocksCount uint64
- ItemsCount uint64
- SizeBytes uint64
+ InmemoryBlocksCount uint64
+ FileBlocksCount uint64
+
+ InmemoryItemsCount uint64
+ FileItemsCount uint64
+
+ InmemorySizeBytes uint64
+ FileSizeBytes uint64
DataBlocksCacheSize uint64
DataBlocksCacheSizeBytes uint64
@@ -421,26 +454,46 @@ type TableMetrics struct {
PartsRefCount uint64
}
+// TotalItemsCount returns the total number of items in the table.
+func (tm *TableMetrics) TotalItemsCount() uint64 {
+ return tm.InmemoryItemsCount + tm.FileItemsCount
+}
+
// UpdateMetrics updates m with metrics from tb.
func (tb *Table) UpdateMetrics(m *TableMetrics) {
- m.ActiveMerges += atomic.LoadUint64(&tb.activeMerges)
- m.MergesCount += atomic.LoadUint64(&tb.mergesCount)
- m.ItemsMerged += atomic.LoadUint64(&tb.itemsMerged)
- m.AssistedMerges += atomic.LoadUint64(&tb.assistedMerges)
+ m.ActiveInmemoryMerges += atomic.LoadUint64(&tb.activeInmemoryMerges)
+ m.ActiveFileMerges += atomic.LoadUint64(&tb.activeFileMerges)
+
+ m.InmemoryMergesCount += atomic.LoadUint64(&tb.inmemoryMergesCount)
+ m.FileMergesCount += atomic.LoadUint64(&tb.fileMergesCount)
+
+ m.InmemoryItemsMerged += atomic.LoadUint64(&tb.inmemoryItemsMerged)
+ m.FileItemsMerged += atomic.LoadUint64(&tb.fileItemsMerged)
+
+ m.AssistedInmemoryMerges += atomic.LoadUint64(&tb.assistedInmemoryMerges)
+
m.ItemsAdded += atomic.LoadUint64(&tb.itemsAdded)
m.ItemsAddedSizeBytes += atomic.LoadUint64(&tb.itemsAddedSizeBytes)
m.PendingItems += uint64(tb.rawItems.Len())
tb.partsLock.Lock()
- m.PartsCount += uint64(len(tb.parts))
- for _, pw := range tb.parts {
+
+ m.InmemoryPartsCount += uint64(len(tb.inmemoryParts))
+ for _, pw := range tb.inmemoryParts {
p := pw.p
+ m.InmemoryBlocksCount += p.ph.blocksCount
+ m.InmemoryItemsCount += p.ph.itemsCount
+ m.InmemorySizeBytes += p.size
+ m.PartsRefCount += atomic.LoadUint64(&pw.refCount)
+ }
- m.BlocksCount += p.ph.blocksCount
- m.ItemsCount += p.ph.itemsCount
- m.SizeBytes += p.size
-
+ m.FilePartsCount += uint64(len(tb.fileParts))
+ for _, pw := range tb.fileParts {
+ p := pw.p
+ m.FileBlocksCount += p.ph.blocksCount
+ m.FileItemsCount += p.ph.itemsCount
+ m.FileSizeBytes += p.size
m.PartsRefCount += atomic.LoadUint64(&pw.refCount)
}
tb.partsLock.Unlock()
@@ -477,10 +530,14 @@ func (tb *Table) AddItems(items [][]byte) {
// The appended parts must be released with putParts.
func (tb *Table) getParts(dst []*partWrapper) []*partWrapper {
tb.partsLock.Lock()
- for _, pw := range tb.parts {
+ for _, pw := range tb.inmemoryParts {
pw.incRef()
}
- dst = append(dst, tb.parts...)
+ for _, pw := range tb.fileParts {
+ pw.incRef()
+ }
+ dst = append(dst, tb.inmemoryParts...)
+ dst = append(dst, tb.fileParts...)
tb.partsLock.Unlock()
return dst
@@ -493,79 +550,142 @@ func (tb *Table) putParts(pws []*partWrapper) {
}
}
-func (tb *Table) startRawItemsFlusher() {
+func (tb *Table) mergePartsOptimal(pws []*partWrapper) error {
+ sortPartsForOptimalMerge(pws)
+ for len(pws) > 0 {
+ n := defaultPartsToMerge
+ if n > len(pws) {
+ n = len(pws)
+ }
+ pwsChunk := pws[:n]
+ pws = pws[n:]
+ err := tb.mergeParts(pwsChunk, nil, true)
+ if err == nil {
+ continue
+ }
+ tb.releasePartsToMerge(pws)
+ return fmt.Errorf("cannot optimally merge %d parts: %w", n, err)
+ }
+ return nil
+}
+
+// DebugFlush flushes all the added items to the storage, so they become visible to search.
+//
+// This function is only for debugging and testing.
+func (tb *Table) DebugFlush() {
+ tb.flushPendingItems(nil, true)
+
+ // Wait for background flushers to finish.
+ tb.rawItemsPendingFlushesWG.Wait()
+}
+
+func (tb *Table) startInmemoryPartsFlusher() {
tb.wg.Add(1)
go func() {
- tb.rawItemsFlusher()
+ tb.inmemoryPartsFlusher()
tb.wg.Done()
}()
}
-func (tb *Table) rawItemsFlusher() {
- ticker := time.NewTicker(rawItemsFlushInterval)
+func (tb *Table) startPendingItemsFlusher() {
+ tb.wg.Add(1)
+ go func() {
+ tb.pendingItemsFlusher()
+ tb.wg.Done()
+ }()
+}
+
+func (tb *Table) inmemoryPartsFlusher() {
+ ticker := time.NewTicker(dataFlushInterval)
defer ticker.Stop()
for {
select {
case <-tb.stopCh:
return
case <-ticker.C:
- tb.flushPendingItems(false)
+ tb.flushInmemoryParts(false)
}
}
}
-func (tb *Table) mergePartsOptimal(pws []*partWrapper) error {
- for len(pws) > defaultPartsToMerge {
- pwsChunk := pws[:defaultPartsToMerge]
- pws = pws[defaultPartsToMerge:]
- if err := tb.mergeParts(pwsChunk, nil, false); err != nil {
- tb.releasePartsToMerge(pws)
- return fmt.Errorf("cannot merge %d parts: %w", defaultPartsToMerge, err)
+func (tb *Table) pendingItemsFlusher() {
+ ticker := time.NewTicker(pendingItemsFlushInterval)
+ defer ticker.Stop()
+ var ibs []*inmemoryBlock
+ for {
+ select {
+ case <-tb.stopCh:
+ return
+ case <-ticker.C:
+ ibs = tb.flushPendingItems(ibs[:0], false)
+ for i := range ibs {
+ ibs[i] = nil
+ }
}
}
- if len(pws) == 0 {
- return nil
+}
+
+func (tb *Table) flushPendingItems(dst []*inmemoryBlock, isFinal bool) []*inmemoryBlock {
+ return tb.rawItems.flush(tb, dst, isFinal)
+}
+
+func (tb *Table) flushInmemoryItems() {
+ tb.rawItems.flush(tb, nil, true)
+ tb.flushInmemoryParts(true)
+}
+
+func (tb *Table) flushInmemoryParts(isFinal bool) {
+ for {
+ currentTime := time.Now()
+ var pws []*partWrapper
+
+ tb.partsLock.Lock()
+ for _, pw := range tb.inmemoryParts {
+ if !pw.isInMerge && (isFinal || pw.flushToDiskDeadline.Before(currentTime)) {
+ pw.isInMerge = true
+ pws = append(pws, pw)
+ }
+ }
+ tb.partsLock.Unlock()
+
+ if err := tb.mergePartsOptimal(pws); err != nil {
+ logger.Panicf("FATAL: cannot merge in-memory parts: %s", err)
+ }
+ if !isFinal {
+ return
+ }
+ tb.partsLock.Lock()
+ n := len(tb.inmemoryParts)
+ tb.partsLock.Unlock()
+ if n == 0 {
+ // All the in-memory parts were flushed to disk.
+ return
+ }
+ // Some parts weren't flushed to disk because they were being merged.
+ // Sleep for a while and try flushing them again.
+ time.Sleep(10 * time.Millisecond)
}
- if err := tb.mergeParts(pws, nil, false); err != nil {
- return fmt.Errorf("cannot merge %d parts: %w", len(pws), err)
- }
- return nil
}
-// DebugFlush flushes all the added items to the storage,
-// so they become visible to search.
-//
-// This function is only for debugging and testing.
-func (tb *Table) DebugFlush() {
- tb.flushPendingItems(true)
-
- // Wait for background flushers to finish.
- tb.rawItemsPendingFlushesWG.Wait()
-}
-
-func (tb *Table) flushPendingItems(isFinal bool) {
- tb.rawItems.flush(tb, isFinal)
-}
-
-func (riss *rawItemsShards) flush(tb *Table, isFinal bool) {
+func (riss *rawItemsShards) flush(tb *Table, dst []*inmemoryBlock, isFinal bool) []*inmemoryBlock {
tb.rawItemsPendingFlushesWG.Add(1)
defer tb.rawItemsPendingFlushesWG.Done()
- var blocksToFlush []*inmemoryBlock
for i := range riss.shards {
- blocksToFlush = riss.shards[i].appendBlocksToFlush(blocksToFlush, tb, isFinal)
+ dst = riss.shards[i].appendBlocksToFlush(dst, tb, isFinal)
}
- tb.mergeRawItemsBlocks(blocksToFlush, isFinal)
+ tb.flushBlocksToParts(dst, isFinal)
+ return dst
}
func (ris *rawItemsShard) appendBlocksToFlush(dst []*inmemoryBlock, tb *Table, isFinal bool) []*inmemoryBlock {
currentTime := fasttime.UnixTimestamp()
- flushSeconds := int64(rawItemsFlushInterval.Seconds())
+ flushSeconds := int64(pendingItemsFlushInterval.Seconds())
if flushSeconds <= 0 {
flushSeconds = 1
}
lastFlushTime := atomic.LoadUint64(&ris.lastFlushTime)
- if !isFinal && currentTime <= lastFlushTime+uint64(flushSeconds) {
+ if !isFinal && currentTime < lastFlushTime+uint64(flushSeconds) {
// Fast path - nothing to flush
return dst
}
@@ -582,27 +702,29 @@ func (ris *rawItemsShard) appendBlocksToFlush(dst []*inmemoryBlock, tb *Table, i
return dst
}
-func (tb *Table) mergeRawItemsBlocks(ibs []*inmemoryBlock, isFinal bool) {
+func (tb *Table) flushBlocksToParts(ibs []*inmemoryBlock, isFinal bool) {
if len(ibs) == 0 {
return
}
-
- pws := make([]*partWrapper, 0, (len(ibs)+defaultPartsToMerge-1)/defaultPartsToMerge)
var pwsLock sync.Mutex
- var wg sync.WaitGroup
+ pws := make([]*partWrapper, 0, (len(ibs)+defaultPartsToMerge-1)/defaultPartsToMerge)
+ wg := getWaitGroup()
for len(ibs) > 0 {
n := defaultPartsToMerge
if n > len(ibs) {
n = len(ibs)
}
wg.Add(1)
- go func(ibsPart []*inmemoryBlock) {
- defer wg.Done()
- pw := tb.mergeInmemoryBlocks(ibsPart)
+ flushConcurrencyCh <- struct{}{}
+ go func(ibsChunk []*inmemoryBlock) {
+ defer func() {
+ <-flushConcurrencyCh
+ wg.Done()
+ }()
+ pw := tb.createInmemoryPart(ibsChunk)
if pw == nil {
return
}
- pw.isInMerge = true
pwsLock.Lock()
pws = append(pws, pw)
pwsLock.Unlock()
@@ -610,49 +732,78 @@ func (tb *Table) mergeRawItemsBlocks(ibs []*inmemoryBlock, isFinal bool) {
ibs = ibs[n:]
}
wg.Wait()
- if len(pws) > 0 {
- if err := tb.mergeParts(pws, nil, true); err != nil {
- logger.Panicf("FATAL: cannot merge raw parts: %s", err)
- }
- if tb.flushCallback != nil {
- if isFinal {
- tb.flushCallback()
- } else {
- atomic.CompareAndSwapUint32(&tb.needFlushCallbackCall, 0, 1)
- }
+ putWaitGroup(wg)
+
+ tb.partsLock.Lock()
+ tb.inmemoryParts = append(tb.inmemoryParts, pws...)
+ tb.partsLock.Unlock()
+
+ flushConcurrencyCh <- struct{}{}
+ tb.assistedMergeForInmemoryParts()
+ <-flushConcurrencyCh
+ // There is no need in assited merge for file parts,
+ // since the bottleneck is possible only at inmemory parts.
+
+ if tb.flushCallback != nil {
+ if isFinal {
+ tb.flushCallback()
+ } else {
+ atomic.CompareAndSwapUint32(&tb.needFlushCallbackCall, 0, 1)
}
}
+}
+var flushConcurrencyCh = make(chan struct{}, cgroup.AvailableCPUs())
+
+func (tb *Table) assistedMergeForInmemoryParts() {
for {
tb.partsLock.Lock()
- ok := len(tb.parts) <= maxParts
+ ok := getNotInMergePartsCount(tb.inmemoryParts) < maxInmemoryParts
tb.partsLock.Unlock()
if ok {
return
}
- // The added part exceeds maxParts count. Assist with merging other parts.
- //
// Prioritize assisted merges over searches.
storagepacelimiter.Search.Inc()
- err := tb.mergeExistingParts(false)
+ err := tb.mergeInmemoryParts()
storagepacelimiter.Search.Dec()
if err == nil {
- atomic.AddUint64(&tb.assistedMerges, 1)
+ atomic.AddUint64(&tb.assistedInmemoryMerges, 1)
continue
}
- if errors.Is(err, errNothingToMerge) || errors.Is(err, errForciblyStopped) || errors.Is(err, errReadOnlyMode) {
+ if errors.Is(err, errNothingToMerge) || errors.Is(err, errForciblyStopped) {
return
}
- logger.Panicf("FATAL: cannot merge small parts: %s", err)
+ logger.Panicf("FATAL: cannot assist with merging inmemory parts: %s", err)
}
}
-func (tb *Table) mergeInmemoryBlocks(ibs []*inmemoryBlock) *partWrapper {
- atomic.AddUint64(&tb.mergesCount, 1)
- atomic.AddUint64(&tb.activeMerges, 1)
- defer atomic.AddUint64(&tb.activeMerges, ^uint64(0))
+func getNotInMergePartsCount(pws []*partWrapper) int {
+ n := 0
+ for _, pw := range pws {
+ if !pw.isInMerge {
+ n++
+ }
+ }
+ return n
+}
+func getWaitGroup() *sync.WaitGroup {
+ v := wgPool.Get()
+ if v == nil {
+ return &sync.WaitGroup{}
+ }
+ return v.(*sync.WaitGroup)
+}
+
+func putWaitGroup(wg *sync.WaitGroup) {
+ wgPool.Put(wg)
+}
+
+var wgPool sync.Pool
+
+func (tb *Table) createInmemoryPart(ibs []*inmemoryBlock) *partWrapper {
outItemsCount := uint64(0)
for _, ib := range ibs {
outItemsCount += uint64(ib.Len())
@@ -672,16 +823,14 @@ func (tb *Table) mergeInmemoryBlocks(ibs []*inmemoryBlock) *partWrapper {
if len(bsrs) == 0 {
return nil
}
+ flushToDiskDeadline := time.Now().Add(dataFlushInterval)
if len(bsrs) == 1 {
// Nothing to merge. Just return a single inmemory part.
+ bsr := bsrs[0]
mp := &inmemoryPart{}
- mp.Init(&bsrs[0].Block)
- p := mp.NewPart()
- return &partWrapper{
- p: p,
- mp: mp,
- refCount: 1,
- }
+ mp.Init(&bsr.Block)
+ putBlockStreamReader(bsr)
+ return newPartWrapperFromInmemoryPart(mp, flushToDiskDeadline)
}
// Prepare blockStreamWriter for destination part.
@@ -693,7 +842,10 @@ func (tb *Table) mergeInmemoryBlocks(ibs []*inmemoryBlock) *partWrapper {
// Merge parts.
// The merge shouldn't be interrupted by stopCh,
// since it may be final after stopCh is closed.
- err := mergeBlockStreams(&mpDst.ph, bsw, bsrs, tb.prepareBlock, nil, &tb.itemsMerged)
+ atomic.AddUint64(&tb.activeInmemoryMerges, 1)
+ err := mergeBlockStreams(&mpDst.ph, bsw, bsrs, tb.prepareBlock, nil, &tb.inmemoryItemsMerged)
+ atomic.AddUint64(&tb.activeInmemoryMerges, ^uint64(0))
+ atomic.AddUint64(&tb.inmemoryMergesCount, 1)
if err != nil {
logger.Panicf("FATAL: cannot merge inmemoryBlocks: %s", err)
}
@@ -701,33 +853,64 @@ func (tb *Table) mergeInmemoryBlocks(ibs []*inmemoryBlock) *partWrapper {
for _, bsr := range bsrs {
putBlockStreamReader(bsr)
}
+ return newPartWrapperFromInmemoryPart(mpDst, flushToDiskDeadline)
+}
- p := mpDst.NewPart()
+func newPartWrapperFromInmemoryPart(mp *inmemoryPart, flushToDiskDeadline time.Time) *partWrapper {
+ p := mp.NewPart()
return &partWrapper{
- p: p,
- mp: mpDst,
- refCount: 1,
+ p: p,
+ mp: mp,
+ refCount: 1,
+ flushToDiskDeadline: flushToDiskDeadline,
}
}
-func (tb *Table) startPartMergers() {
- for i := 0; i < mergeWorkersCount; i++ {
+func (tb *Table) startMergeWorkers() {
+ for i := 0; i < cap(mergeWorkersLimitCh); i++ {
tb.wg.Add(1)
go func() {
- if err := tb.partMerger(); err != nil {
- logger.Panicf("FATAL: unrecoverable error when merging parts in %q: %s", tb.path, err)
- }
+ tb.mergeWorker()
tb.wg.Done()
}()
}
}
+func getMaxInmemoryPartSize() uint64 {
+ // Allow up to 5% of memory for in-memory parts.
+ n := uint64(0.05 * float64(memory.Allowed()) / maxInmemoryParts)
+ if n < 1e6 {
+ n = 1e6
+ }
+ return n
+}
+
+func (tb *Table) getMaxFilePartSize() uint64 {
+ n := fs.MustGetFreeSpace(tb.path)
+ // Divide free space by the max number of concurrent merges.
+ maxOutBytes := n / uint64(cap(mergeWorkersLimitCh))
+ if maxOutBytes > maxPartSize {
+ maxOutBytes = maxPartSize
+ }
+ return maxOutBytes
+}
+
func (tb *Table) canBackgroundMerge() bool {
return atomic.LoadUint32(tb.isReadOnly) == 0
}
var errReadOnlyMode = fmt.Errorf("storage is in readonly mode")
+func (tb *Table) mergeInmemoryParts() error {
+ maxOutBytes := tb.getMaxFilePartSize()
+
+ tb.partsLock.Lock()
+ pws := getPartsToMerge(tb.inmemoryParts, maxOutBytes, false)
+ tb.partsLock.Unlock()
+
+ return tb.mergeParts(pws, tb.stopCh, false)
+}
+
func (tb *Table) mergeExistingParts(isFinal bool) error {
if !tb.canBackgroundMerge() {
// Do not perform background merge in read-only mode
@@ -735,32 +918,32 @@ func (tb *Table) mergeExistingParts(isFinal bool) error {
// See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/2603
return errReadOnlyMode
}
- n := fs.MustGetFreeSpace(tb.path)
- // Divide free space by the max number of concurrent merges.
- maxOutBytes := n / uint64(mergeWorkersCount)
- if maxOutBytes > maxPartSize {
- maxOutBytes = maxPartSize
- }
+ maxOutBytes := tb.getMaxFilePartSize()
tb.partsLock.Lock()
- pws := getPartsToMerge(tb.parts, maxOutBytes, isFinal)
+ dst := make([]*partWrapper, 0, len(tb.inmemoryParts)+len(tb.fileParts))
+ dst = append(dst, tb.inmemoryParts...)
+ dst = append(dst, tb.fileParts...)
+ pws := getPartsToMerge(dst, maxOutBytes, isFinal)
tb.partsLock.Unlock()
- return tb.mergeParts(pws, tb.stopCh, false)
+ return tb.mergeParts(pws, tb.stopCh, isFinal)
}
const (
- minMergeSleepTime = time.Millisecond
- maxMergeSleepTime = time.Second
+ minMergeSleepTime = 10 * time.Millisecond
+ maxMergeSleepTime = 10 * time.Second
)
-func (tb *Table) partMerger() error {
+func (tb *Table) mergeWorker() {
sleepTime := minMergeSleepTime
var lastMergeTime uint64
isFinal := false
t := time.NewTimer(sleepTime)
for {
+ mergeWorkersLimitCh <- struct{}{}
err := tb.mergeExistingParts(isFinal)
+ <-mergeWorkersLimitCh
if err == nil {
// Try merging additional parts.
sleepTime = minMergeSleepTime
@@ -770,12 +953,13 @@ func (tb *Table) partMerger() error {
}
if errors.Is(err, errForciblyStopped) {
// The merger has been stopped.
- return nil
+ return
}
if !errors.Is(err, errNothingToMerge) && !errors.Is(err, errReadOnlyMode) {
- return err
+ // Unexpected error.
+ logger.Panicf("FATAL: unrecoverable error when merging inmemory parts in %q: %s", tb.path, err)
}
- if fasttime.UnixTimestamp()-lastMergeTime > 30 {
+ if finalMergeDelaySeconds > 0 && fasttime.UnixTimestamp()-lastMergeTime > finalMergeDelaySeconds {
// We have free time for merging into bigger parts.
// This should improve select performance.
lastMergeTime = fasttime.UnixTimestamp()
@@ -790,13 +974,27 @@ func (tb *Table) partMerger() error {
}
select {
case <-tb.stopCh:
- return nil
+ return
case <-t.C:
t.Reset(sleepTime)
}
}
}
+// Disable final merge by default, since it may lead to high disk IO and CPU usage
+// after some inactivity time.
+var finalMergeDelaySeconds = uint64(0)
+
+// SetFinalMergeDelay sets the delay before doing final merge for Table without newly ingested data.
+//
+// This function may be called only before Table initialization.
+func SetFinalMergeDelay(delay time.Duration) {
+ if delay <= 0 {
+ return
+ }
+ finalMergeDelaySeconds = uint64(delay.Seconds() + 1)
+}
+
var errNothingToMerge = fmt.Errorf("nothing to merge")
func (tb *Table) releasePartsToMerge(pws []*partWrapper) {
@@ -810,150 +1008,315 @@ func (tb *Table) releasePartsToMerge(pws []*partWrapper) {
tb.partsLock.Unlock()
}
-// mergeParts merges pws.
+// mergeParts merges pws to a single resulting part.
//
// Merging is immediately stopped if stopCh is closed.
//
+// If isFinal is set, then the resulting part will be stored to disk.
+//
// All the parts inside pws must have isInMerge field set to true.
-func (tb *Table) mergeParts(pws []*partWrapper, stopCh <-chan struct{}, isOuterParts bool) error {
+func (tb *Table) mergeParts(pws []*partWrapper, stopCh <-chan struct{}, isFinal bool) error {
if len(pws) == 0 {
// Nothing to merge.
return errNothingToMerge
}
defer tb.releasePartsToMerge(pws)
- atomic.AddUint64(&tb.mergesCount, 1)
- atomic.AddUint64(&tb.activeMerges, 1)
- defer atomic.AddUint64(&tb.activeMerges, ^uint64(0))
-
startTime := time.Now()
- // Prepare blockStreamReaders for source parts.
- bsrs := make([]*blockStreamReader, 0, len(pws))
- defer func() {
+ // Initialize destination paths.
+ dstPartType := getDstPartType(pws, isFinal)
+ tmpPartPath, mergeIdx := tb.getDstPartPaths(dstPartType)
+
+ if isFinal && len(pws) == 1 && pws[0].mp != nil {
+ // Fast path: flush a single in-memory part to disk.
+ mp := pws[0].mp
+ if tmpPartPath == "" {
+ logger.Panicf("BUG: tmpPartPath must be non-empty")
+ }
+ if err := mp.StoreToDisk(tmpPartPath); err != nil {
+ return fmt.Errorf("cannot store in-memory part to %q: %w", tmpPartPath, err)
+ }
+ pwNew, err := tb.openCreatedPart(&mp.ph, pws, nil, tmpPartPath, mergeIdx)
+ if err != nil {
+ return fmt.Errorf("cannot atomically register the created part: %w", err)
+ }
+ tb.swapSrcWithDstParts(pws, pwNew, dstPartType)
+ return nil
+ }
+
+ // Prepare BlockStreamReaders for source parts.
+ bsrs, err := openBlockStreamReaders(pws)
+ if err != nil {
+ return err
+ }
+ closeBlockStreamReaders := func() {
for _, bsr := range bsrs {
putBlockStreamReader(bsr)
}
- }()
+ bsrs = nil
+ }
+
+ // Prepare BlockStreamWriter for destination part.
+ srcSize := uint64(0)
+ srcItemsCount := uint64(0)
+ srcBlocksCount := uint64(0)
+ for _, pw := range pws {
+ srcSize += pw.p.size
+ srcItemsCount += pw.p.ph.itemsCount
+ srcBlocksCount += pw.p.ph.blocksCount
+ }
+ compressLevel := getCompressLevel(srcItemsCount)
+ bsw := getBlockStreamWriter()
+ var mpNew *inmemoryPart
+ if dstPartType == partInmemory {
+ mpNew = &inmemoryPart{}
+ bsw.InitFromInmemoryPart(mpNew, compressLevel)
+ } else {
+ if tmpPartPath == "" {
+ logger.Panicf("BUG: tmpPartPath must be non-empty")
+ }
+ nocache := srcItemsCount > maxItemsPerCachedPart()
+ if err := bsw.InitFromFilePart(tmpPartPath, nocache, compressLevel); err != nil {
+ closeBlockStreamReaders()
+ return fmt.Errorf("cannot create destination part at %q: %w", tmpPartPath, err)
+ }
+ }
+
+ // Merge source parts to destination part.
+ ph, err := tb.mergePartsInternal(tmpPartPath, bsw, bsrs, dstPartType, stopCh)
+ putBlockStreamWriter(bsw)
+ closeBlockStreamReaders()
+ if err != nil {
+ return fmt.Errorf("cannot merge %d parts: %w", len(pws), err)
+ }
+ if mpNew != nil {
+ // Update partHeader for destination inmemory part after the merge.
+ mpNew.ph = *ph
+ }
+
+ // Atomically move the created part from tmpPartPath to its destination
+ // and swap the source parts with the newly created part.
+ pwNew, err := tb.openCreatedPart(ph, pws, mpNew, tmpPartPath, mergeIdx)
+ if err != nil {
+ return fmt.Errorf("cannot atomically register the created part: %w", err)
+ }
+ tb.swapSrcWithDstParts(pws, pwNew, dstPartType)
+
+ d := time.Since(startTime)
+ if d <= 30*time.Second {
+ return nil
+ }
+
+ // Log stats for long merges.
+ dstItemsCount := uint64(0)
+ dstBlocksCount := uint64(0)
+ dstSize := uint64(0)
+ dstPartPath := ""
+ if pwNew != nil {
+ pDst := pwNew.p
+ dstItemsCount = pDst.ph.itemsCount
+ dstBlocksCount = pDst.ph.blocksCount
+ dstSize = pDst.size
+ dstPartPath = pDst.path
+ }
+ durationSecs := d.Seconds()
+ itemsPerSec := int(float64(srcItemsCount) / durationSecs)
+ logger.Infof("merged (%d parts, %d items, %d blocks, %d bytes) into (1 part, %d items, %d blocks, %d bytes) in %.3f seconds at %d items/sec to %q",
+ len(pws), srcItemsCount, srcBlocksCount, srcSize, dstItemsCount, dstBlocksCount, dstSize, durationSecs, itemsPerSec, dstPartPath)
+
+ return nil
+}
+
+func getFlushToDiskDeadline(pws []*partWrapper) time.Time {
+ d := pws[0].flushToDiskDeadline
+ for _, pw := range pws[1:] {
+ if pw.flushToDiskDeadline.Before(d) {
+ d = pw.flushToDiskDeadline
+ }
+ }
+ return d
+}
+
+type partType int
+
+var (
+ partInmemory = partType(0)
+ partFile = partType(1)
+)
+
+func getDstPartType(pws []*partWrapper, isFinal bool) partType {
+ dstPartSize := getPartsSize(pws)
+ if isFinal || dstPartSize > getMaxInmemoryPartSize() {
+ return partFile
+ }
+ if !areAllInmemoryParts(pws) {
+ // If at least a single source part is located in file,
+ // then the destination part must be in file for durability reasons.
+ return partFile
+ }
+ return partInmemory
+}
+
+func (tb *Table) getDstPartPaths(dstPartType partType) (string, uint64) {
+ tmpPartPath := ""
+ mergeIdx := tb.nextMergeIdx()
+ switch dstPartType {
+ case partInmemory:
+ case partFile:
+ tmpPartPath = fmt.Sprintf("%s/tmp/%016X", tb.path, mergeIdx)
+ default:
+ logger.Panicf("BUG: unknown partType=%d", dstPartType)
+ }
+ return tmpPartPath, mergeIdx
+}
+
+func openBlockStreamReaders(pws []*partWrapper) ([]*blockStreamReader, error) {
+ bsrs := make([]*blockStreamReader, 0, len(pws))
for _, pw := range pws {
bsr := getBlockStreamReader()
if pw.mp != nil {
- if !isOuterParts {
- logger.Panicf("BUG: inmemory part must be always outer")
- }
bsr.InitFromInmemoryPart(pw.mp)
} else {
if err := bsr.InitFromFilePart(pw.p.path); err != nil {
- return fmt.Errorf("cannot open source part for merging: %w", err)
+ for _, bsr := range bsrs {
+ putBlockStreamReader(bsr)
+ }
+ return nil, fmt.Errorf("cannot open source part for merging: %w", err)
}
}
bsrs = append(bsrs, bsr)
}
+ return bsrs, nil
+}
- outItemsCount := uint64(0)
- outBlocksCount := uint64(0)
- for _, pw := range pws {
- outItemsCount += pw.p.ph.itemsCount
- outBlocksCount += pw.p.ph.blocksCount
- }
- nocache := true
- if outItemsCount < maxItemsPerCachedPart() {
- // Cache small (i.e. recent) output parts in OS file cache,
- // since there is high chance they will be read soon.
- nocache = false
- }
-
- // Prepare blockStreamWriter for destination part.
- mergeIdx := tb.nextMergeIdx()
- tmpPartPath := fmt.Sprintf("%s/tmp/%016X", tb.path, mergeIdx)
- bsw := getBlockStreamWriter()
- compressLevel := getCompressLevel(outItemsCount)
- if err := bsw.InitFromFilePart(tmpPartPath, nocache, compressLevel); err != nil {
- return fmt.Errorf("cannot create destination part %q: %w", tmpPartPath, err)
- }
-
- // Merge parts into a temporary location.
+func (tb *Table) mergePartsInternal(tmpPartPath string, bsw *blockStreamWriter, bsrs []*blockStreamReader, dstPartType partType, stopCh <-chan struct{}) (*partHeader, error) {
var ph partHeader
- err := mergeBlockStreams(&ph, bsw, bsrs, tb.prepareBlock, stopCh, &tb.itemsMerged)
- putBlockStreamWriter(bsw)
+ var itemsMerged *uint64
+ var mergesCount *uint64
+ var activeMerges *uint64
+ switch dstPartType {
+ case partInmemory:
+ itemsMerged = &tb.inmemoryItemsMerged
+ mergesCount = &tb.inmemoryMergesCount
+ activeMerges = &tb.activeInmemoryMerges
+ case partFile:
+ itemsMerged = &tb.fileItemsMerged
+ mergesCount = &tb.fileMergesCount
+ activeMerges = &tb.activeFileMerges
+ default:
+ logger.Panicf("BUG: unknown partType=%d", dstPartType)
+ }
+ atomic.AddUint64(activeMerges, 1)
+ err := mergeBlockStreams(&ph, bsw, bsrs, tb.prepareBlock, stopCh, itemsMerged)
+ atomic.AddUint64(activeMerges, ^uint64(0))
+ atomic.AddUint64(mergesCount, 1)
if err != nil {
- return fmt.Errorf("error when merging parts to %q: %w", tmpPartPath, err)
+ return nil, fmt.Errorf("cannot merge parts to %q: %w", tmpPartPath, err)
}
- if err := ph.WriteMetadata(tmpPartPath); err != nil {
- return fmt.Errorf("cannot write metadata to destination part %q: %w", tmpPartPath, err)
- }
-
- // Close bsrs (aka source parts).
- for _, bsr := range bsrs {
- putBlockStreamReader(bsr)
- }
- bsrs = nil
-
- // Create a transaction for atomic deleting old parts and moving
- // new part to its destination place.
- var bb bytesutil.ByteBuffer
- for _, pw := range pws {
- if pw.mp == nil {
- fmt.Fprintf(&bb, "%s\n", pw.p.path)
+ if tmpPartPath != "" {
+ if err := ph.WriteMetadata(tmpPartPath); err != nil {
+ return nil, fmt.Errorf("cannot write metadata to destination part %q: %w", tmpPartPath, err)
}
}
- dstPartPath := ph.Path(tb.path, mergeIdx)
- fmt.Fprintf(&bb, "%s -> %s\n", tmpPartPath, dstPartPath)
- txnPath := fmt.Sprintf("%s/txn/%016X", tb.path, mergeIdx)
- if err := fs.WriteFileAtomically(txnPath, bb.B, false); err != nil {
- return fmt.Errorf("cannot create transaction file %q: %w", txnPath, err)
- }
+ return &ph, nil
+}
- // Run the created transaction.
- if err := runTransaction(&tb.snapshotLock, tb.path, txnPath); err != nil {
- return fmt.Errorf("cannot execute transaction %q: %w", txnPath, err)
- }
+func (tb *Table) openCreatedPart(ph *partHeader, pws []*partWrapper, mpNew *inmemoryPart, tmpPartPath string, mergeIdx uint64) (*partWrapper, error) {
+ dstPartPath := ""
+ if mpNew == nil || !areAllInmemoryParts(pws) {
+ // Either source or destination parts are located on disk.
+ // Create a transaction for atomic deleting of old parts and moving new part to its destination on disk.
+ var bb bytesutil.ByteBuffer
+ for _, pw := range pws {
+ if pw.mp == nil {
+ fmt.Fprintf(&bb, "%s\n", pw.p.path)
+ }
+ }
+ dstPartPath = ph.Path(tb.path, mergeIdx)
+ fmt.Fprintf(&bb, "%s -> %s\n", tmpPartPath, dstPartPath)
+ txnPath := fmt.Sprintf("%s/txn/%016X", tb.path, mergeIdx)
+ if err := fs.WriteFileAtomically(txnPath, bb.B, false); err != nil {
+ return nil, fmt.Errorf("cannot create transaction file %q: %w", txnPath, err)
+ }
- // Open the merged part.
- newP, err := openFilePart(dstPartPath)
+ // Run the created transaction.
+ if err := runTransaction(&tb.snapshotLock, tb.path, txnPath); err != nil {
+ return nil, fmt.Errorf("cannot execute transaction %q: %w", txnPath, err)
+ }
+ }
+ // Open the created part.
+ if mpNew != nil {
+ // Open the created part from memory.
+ flushToDiskDeadline := getFlushToDiskDeadline(pws)
+ pwNew := newPartWrapperFromInmemoryPart(mpNew, flushToDiskDeadline)
+ return pwNew, nil
+ }
+ // Open the created part from disk.
+ pNew, err := openFilePart(dstPartPath)
if err != nil {
- return fmt.Errorf("cannot open merged part %q: %w", dstPartPath, err)
+ return nil, fmt.Errorf("cannot open merged part %q: %w", dstPartPath, err)
}
- newPSize := newP.size
- newPW := &partWrapper{
- p: newP,
+ pwNew := &partWrapper{
+ p: pNew,
refCount: 1,
}
+ return pwNew, nil
+}
- // Atomically remove old parts and add new part.
+func areAllInmemoryParts(pws []*partWrapper) bool {
+ for _, pw := range pws {
+ if pw.mp == nil {
+ return false
+ }
+ }
+ return true
+}
+
+func (tb *Table) swapSrcWithDstParts(pws []*partWrapper, pwNew *partWrapper, dstPartType partType) {
+ // Atomically unregister old parts and add new part to tb.
m := make(map[*partWrapper]bool, len(pws))
for _, pw := range pws {
m[pw] = true
}
if len(m) != len(pws) {
- logger.Panicf("BUG: %d duplicate parts found in the merge of %d parts", len(pws)-len(m), len(pws))
+ logger.Panicf("BUG: %d duplicate parts found when merging %d parts", len(pws)-len(m), len(pws))
}
- removedParts := 0
+ removedInmemoryParts := 0
+ removedFileParts := 0
+
tb.partsLock.Lock()
- tb.parts, removedParts = removeParts(tb.parts, m)
- tb.parts = append(tb.parts, newPW)
+ tb.inmemoryParts, removedInmemoryParts = removeParts(tb.inmemoryParts, m)
+ tb.fileParts, removedFileParts = removeParts(tb.fileParts, m)
+ if pwNew != nil {
+ switch dstPartType {
+ case partInmemory:
+ tb.inmemoryParts = append(tb.inmemoryParts, pwNew)
+ case partFile:
+ tb.fileParts = append(tb.fileParts, pwNew)
+ default:
+ logger.Panicf("BUG: unknown partType=%d", dstPartType)
+ }
+ }
tb.partsLock.Unlock()
+
+ removedParts := removedInmemoryParts + removedFileParts
if removedParts != len(m) {
- if !isOuterParts {
- logger.Panicf("BUG: unexpected number of parts removed; got %d; want %d", removedParts, len(m))
- }
- if removedParts != 0 {
- logger.Panicf("BUG: removed non-zero outer parts: %d", removedParts)
- }
+ logger.Panicf("BUG: unexpected number of parts removed; got %d, want %d", removedParts, len(m))
}
- // Remove partition references from old parts.
+ // Remove references from old parts.
for _, pw := range pws {
pw.decRef()
}
+}
- d := time.Since(startTime)
- if d > 30*time.Second {
- logger.Infof("merged %d items across %d blocks in %.3f seconds at %d items/sec to %q; sizeBytes: %d",
- outItemsCount, outBlocksCount, d.Seconds(), int(float64(outItemsCount)/d.Seconds()), dstPartPath, newPSize)
+func getPartsSize(pws []*partWrapper) uint64 {
+ n := uint64(0)
+ for _, pw := range pws {
+ n += pw.p.size
}
-
- return nil
+ return n
}
func getCompressLevel(itemsCount uint64) int {
@@ -990,7 +1353,7 @@ func (tb *Table) nextMergeIdx() uint64 {
return atomic.AddUint64(&tb.mergeIdx, 1)
}
-var mergeWorkersCount = cgroup.AvailableCPUs()
+var mergeWorkersLimitCh = make(chan struct{}, cgroup.AvailableCPUs())
func openParts(path string) ([]*partWrapper, error) {
// The path can be missing after restoring from backup, so create it if needed.
@@ -1095,7 +1458,7 @@ func (tb *Table) CreateSnapshotAt(dstDir string) error {
}
// Flush inmemory items to disk.
- tb.flushPendingItems(true)
+ tb.flushInmemoryItems()
// The snapshot must be created under the lock in order to prevent from
// concurrent modifications via runTransaction.
@@ -1154,7 +1517,7 @@ func runTransactions(txnLock *sync.RWMutex, path string) error {
if os.IsNotExist(err) {
return nil
}
- return fmt.Errorf("cannot open %q: %w", txnDir, err)
+ return fmt.Errorf("cannot open transaction dir: %w", err)
}
defer fs.MustClose(d)
@@ -1334,8 +1697,7 @@ func appendPartsToMerge(dst, src []*partWrapper, maxPartsToMerge int, maxOutByte
}
src = tmp
- // Sort src parts by size.
- sort.Slice(src, func(i, j int) bool { return src[i].p.size < src[j].p.size })
+ sortPartsForOptimalMerge(src)
maxSrcParts := maxPartsToMerge
if maxSrcParts > len(src) {
@@ -1386,17 +1748,24 @@ func appendPartsToMerge(dst, src []*partWrapper, maxPartsToMerge int, maxOutByte
return append(dst, pws...)
}
+func sortPartsForOptimalMerge(pws []*partWrapper) {
+ // Sort src parts by size.
+ sort.Slice(pws, func(i, j int) bool {
+ return pws[i].p.size < pws[j].p.size
+ })
+}
+
func removeParts(pws []*partWrapper, partsToRemove map[*partWrapper]bool) ([]*partWrapper, int) {
- removedParts := 0
dst := pws[:0]
for _, pw := range pws {
if !partsToRemove[pw] {
dst = append(dst, pw)
- continue
}
- removedParts++
}
- return dst, removedParts
+ for i := len(dst); i < len(pws); i++ {
+ pws[i] = nil
+ }
+ return dst, len(pws) - len(dst)
}
func isSpecialDir(name string) bool {
diff --git a/lib/mergeset/table_test.go b/lib/mergeset/table_test.go
index 6a79685378..eff20bcb5f 100644
--- a/lib/mergeset/table_test.go
+++ b/lib/mergeset/table_test.go
@@ -90,8 +90,8 @@ func TestTableAddItemsSerial(t *testing.T) {
var m TableMetrics
tb.UpdateMetrics(&m)
- if m.ItemsCount != itemsCount {
- t.Fatalf("unexpected itemsCount; got %d; want %v", m.ItemsCount, itemsCount)
+ if n := m.TotalItemsCount(); n != itemsCount {
+ t.Fatalf("unexpected itemsCount; got %d; want %v", n, itemsCount)
}
tb.MustClose()
@@ -235,8 +235,8 @@ func TestTableAddItemsConcurrent(t *testing.T) {
var m TableMetrics
tb.UpdateMetrics(&m)
- if m.ItemsCount != itemsCount {
- t.Fatalf("unexpected itemsCount; got %d; want %v", m.ItemsCount, itemsCount)
+ if n := m.TotalItemsCount(); n != itemsCount {
+ t.Fatalf("unexpected itemsCount; got %d; want %v", n, itemsCount)
}
tb.MustClose()
@@ -292,8 +292,8 @@ func testReopenTable(t *testing.T, path string, itemsCount int) {
}
var m TableMetrics
tb.UpdateMetrics(&m)
- if m.ItemsCount != uint64(itemsCount) {
- t.Fatalf("unexpected itemsCount after re-opening; got %d; want %v", m.ItemsCount, itemsCount)
+ if n := m.TotalItemsCount(); n != uint64(itemsCount) {
+ t.Fatalf("unexpected itemsCount after re-opening; got %d; want %v", n, itemsCount)
}
tb.MustClose()
}
diff --git a/lib/storage/index_db_test.go b/lib/storage/index_db_test.go
index 5268a24fb5..4bf20312b2 100644
--- a/lib/storage/index_db_test.go
+++ b/lib/storage/index_db_test.go
@@ -1480,8 +1480,8 @@ func TestIndexDBRepopulateAfterRotation(t *testing.T) {
// verify the storage contains rows.
var m Metrics
s.UpdateMetrics(&m)
- if m.TableMetrics.SmallRowsCount < uint64(metricRowsN) {
- t.Fatalf("expecting at least %d rows in the table; got %d", metricRowsN, m.TableMetrics.SmallRowsCount)
+ if rowsCount := m.TableMetrics.TotalRowsCount(); rowsCount < uint64(metricRowsN) {
+ t.Fatalf("expecting at least %d rows in the table; got %d", metricRowsN, rowsCount)
}
// check new series were registered in indexDB
diff --git a/lib/storage/inmemory_part.go b/lib/storage/inmemory_part.go
index b0681c9849..70f05c15fb 100644
--- a/lib/storage/inmemory_part.go
+++ b/lib/storage/inmemory_part.go
@@ -1,9 +1,13 @@
package storage
import (
+ "fmt"
+ "path/filepath"
+
"github.com/VictoriaMetrics/VictoriaMetrics/lib/bytesutil"
"github.com/VictoriaMetrics/VictoriaMetrics/lib/cgroup"
"github.com/VictoriaMetrics/VictoriaMetrics/lib/fasttime"
+ "github.com/VictoriaMetrics/VictoriaMetrics/lib/fs"
"github.com/VictoriaMetrics/VictoriaMetrics/lib/logger"
)
@@ -31,6 +35,36 @@ func (mp *inmemoryPart) Reset() {
mp.creationTime = 0
}
+// StoreToDisk stores the mp to the given path on disk.
+func (mp *inmemoryPart) StoreToDisk(path string) error {
+ if err := fs.MkdirAllIfNotExist(path); err != nil {
+ return fmt.Errorf("cannot create directory %q: %w", path, err)
+ }
+ timestampsPath := path + "/timestamps.bin"
+ if err := fs.WriteFileAndSync(timestampsPath, mp.timestampsData.B); err != nil {
+ return fmt.Errorf("cannot store timestamps: %w", err)
+ }
+ valuesPath := path + "/values.bin"
+ if err := fs.WriteFileAndSync(valuesPath, mp.valuesData.B); err != nil {
+ return fmt.Errorf("cannot store values: %w", err)
+ }
+ indexPath := path + "/index.bin"
+ if err := fs.WriteFileAndSync(indexPath, mp.indexData.B); err != nil {
+ return fmt.Errorf("cannot store index: %w", err)
+ }
+ metaindexPath := path + "/metaindex.bin"
+ if err := fs.WriteFileAndSync(metaindexPath, mp.metaindexData.B); err != nil {
+ return fmt.Errorf("cannot store metaindex: %w", err)
+ }
+ if err := mp.ph.writeMinDedupInterval(path); err != nil {
+ return fmt.Errorf("cannot store min dedup interval: %w", err)
+ }
+ // Sync parent directory in order to make sure the written files remain visible after hardware reset
+ parentDirPath := filepath.Dir(path)
+ fs.MustSyncPath(parentDirPath)
+ return nil
+}
+
// InitFromRows initializes mp from the given rows.
func (mp *inmemoryPart) InitFromRows(rows []rawRow) {
if len(rows) == 0 {
diff --git a/lib/storage/partition.go b/lib/storage/partition.go
index 17e8aa8baa..714a50f8b2 100644
--- a/lib/storage/partition.go
+++ b/lib/storage/partition.go
@@ -19,33 +19,19 @@ import (
"github.com/VictoriaMetrics/VictoriaMetrics/lib/fs"
"github.com/VictoriaMetrics/VictoriaMetrics/lib/logger"
"github.com/VictoriaMetrics/VictoriaMetrics/lib/memory"
+ "github.com/VictoriaMetrics/VictoriaMetrics/lib/mergeset"
"github.com/VictoriaMetrics/VictoriaMetrics/lib/storagepacelimiter"
"github.com/VictoriaMetrics/VictoriaMetrics/lib/syncwg"
)
-func maxSmallPartSize() uint64 {
- // Small parts are cached in the OS page cache,
- // so limit their size by the remaining free RAM.
- mem := memory.Remaining()
- // It is expected no more than defaultPartsToMerge/2 parts exist
- // in the OS page cache before they are merged into bigger part.
- // Half of the remaining RAM must be left for lib/mergeset parts,
- // so the maxItems is calculated using the below code:
- maxSize := uint64(mem) / defaultPartsToMerge
- if maxSize < 10e6 {
- maxSize = 10e6
- }
- return maxSize
-}
-
// The maximum size of big part.
//
// This number limits the maximum time required for building big part.
// This time shouldn't exceed a few days.
const maxBigPartSize = 1e12
-// The maximum number of small parts in the partition.
-const maxSmallPartsPerPartition = 256
+// The maximum number of inmemory parts in the partition.
+const maxInmemoryPartsPerPartition = 32
// Default number of parts to merge at once.
//
@@ -65,6 +51,25 @@ const finalPartsToMerge = 3
// Higher number of shards reduces CPU contention and increases the max bandwidth on multi-core systems.
var rawRowsShardsPerPartition = (cgroup.AvailableCPUs() + 1) / 2
+// The interval for flushing bufferred rows into parts, so they become visible to search.
+const pendingRowsFlushInterval = time.Second
+
+// The interval for guaranteed flush of recently ingested data from memory to on-disk parts,
+// so they survive process crash.
+var dataFlushInterval = 5 * time.Second
+
+// SetDataFlushInterval sets the interval for guaranteed flush of recently ingested data from memory to disk.
+//
+// The data can be flushed from memory to disk more frequently if it doesn't fit the memory limit.
+//
+// This function must be called before initializing the storage.
+func SetDataFlushInterval(d time.Duration) {
+ if d > pendingRowsFlushInterval {
+ dataFlushInterval = d
+ mergeset.SetDataFlushInterval(d)
+ }
+}
+
// getMaxRawRowsPerShard returns the maximum number of rows that haven't been converted into parts yet.
func getMaxRawRowsPerShard() int {
maxRawRowsPerPartitionOnce.Do(func() {
@@ -85,32 +90,30 @@ var (
maxRawRowsPerPartitionOnce sync.Once
)
-// The interval for flushing (converting) recent raw rows into parts,
-// so they become visible to search.
-const rawRowsFlushInterval = time.Second
-
-// The interval for flushing inmemory parts to persistent storage,
-// so they survive process crash.
-const inmemoryPartsFlushInterval = 5 * time.Second
-
// partition represents a partition.
type partition struct {
// Put atomic counters to the top of struct, so they are aligned to 8 bytes on 32-bit arch.
// See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/212
- activeBigMerges uint64
- activeSmallMerges uint64
- bigMergesCount uint64
- smallMergesCount uint64
- bigRowsMerged uint64
- smallRowsMerged uint64
- bigRowsDeleted uint64
- smallRowsDeleted uint64
+ activeInmemoryMerges uint64
+ activeSmallMerges uint64
+ activeBigMerges uint64
- smallAssistedMerges uint64
+ inmemoryMergesCount uint64
+ smallMergesCount uint64
+ bigMergesCount uint64
- smallMergeNeedFreeDiskSpace uint64
- bigMergeNeedFreeDiskSpace uint64
+ inmemoryRowsMerged uint64
+ smallRowsMerged uint64
+ bigRowsMerged uint64
+
+ inmemoryRowsDeleted uint64
+ smallRowsDeleted uint64
+ bigRowsDeleted uint64
+
+ inmemoryAssistedMerges uint64
+
+ mergeNeedFreeDiskSpace uint64
mergeIdx uint64
@@ -126,21 +129,24 @@ type partition struct {
// The time range for the partition. Usually this is a whole month.
tr TimeRange
- // partsLock protects smallParts and bigParts.
+ // rawRows contains recently added rows that haven't been converted into parts yet.
+ // rawRows are periodically converted into inmemroyParts.
+ // rawRows aren't used in search for performance reasons.
+ rawRows rawRowsShards
+
+ // partsLock protects inmemoryParts, smallParts and bigParts.
partsLock sync.Mutex
- // Contains all the inmemoryPart plus file-based parts
- // with small number of items (up to maxRowsCountPerSmallPart).
+ // Contains inmemory parts with recently ingested data.
+ // It must be merged into either smallParts or bigParts to become visible to search.
+ inmemoryParts []*partWrapper
+
+ // Contains file-based parts with small number of items.
smallParts []*partWrapper
// Contains file-based parts with big number of items.
bigParts []*partWrapper
- // rawRows contains recently added rows that haven't been converted into parts yet.
- //
- // rawRows aren't used in search for performance reasons.
- rawRows rawRowsShards
-
snapshotLock sync.RWMutex
stopCh chan struct{}
@@ -164,6 +170,9 @@ type partWrapper struct {
// Whether the part is in merge now.
isInMerge bool
+
+ // The deadline when in-memory part must be flushed to disk.
+ flushToDiskDeadline time.Time
}
func (pw *partWrapper) incRef() {
@@ -213,8 +222,8 @@ func createPartition(timestamp int64, smallPartitionsPath, bigPartitionsPath str
func (pt *partition) startBackgroundWorkers() {
pt.startMergeWorkers()
- pt.startRawRowsFlusher()
pt.startInmemoryPartsFlusher()
+ pt.startPendingRowsFlusher()
pt.startStalePartsRemover()
}
@@ -292,67 +301,83 @@ type partitionMetrics struct {
IndexBlocksCacheRequests uint64
IndexBlocksCacheMisses uint64
- BigSizeBytes uint64
- SmallSizeBytes uint64
+ InmemorySizeBytes uint64
+ SmallSizeBytes uint64
+ BigSizeBytes uint64
- BigRowsCount uint64
- SmallRowsCount uint64
+ InmemoryRowsCount uint64
+ SmallRowsCount uint64
+ BigRowsCount uint64
- BigBlocksCount uint64
- SmallBlocksCount uint64
+ InmemoryBlocksCount uint64
+ SmallBlocksCount uint64
+ BigBlocksCount uint64
- BigPartsCount uint64
- SmallPartsCount uint64
+ InmemoryPartsCount uint64
+ SmallPartsCount uint64
+ BigPartsCount uint64
- ActiveBigMerges uint64
- ActiveSmallMerges uint64
+ ActiveInmemoryMerges uint64
+ ActiveSmallMerges uint64
+ ActiveBigMerges uint64
- BigMergesCount uint64
- SmallMergesCount uint64
+ InmemoryMergesCount uint64
+ SmallMergesCount uint64
+ BigMergesCount uint64
- BigRowsMerged uint64
- SmallRowsMerged uint64
+ InmemoryRowsMerged uint64
+ SmallRowsMerged uint64
+ BigRowsMerged uint64
- BigRowsDeleted uint64
- SmallRowsDeleted uint64
+ InmemoryRowsDeleted uint64
+ SmallRowsDeleted uint64
+ BigRowsDeleted uint64
- BigPartsRefCount uint64
- SmallPartsRefCount uint64
+ InmemoryPartsRefCount uint64
+ SmallPartsRefCount uint64
+ BigPartsRefCount uint64
- SmallAssistedMerges uint64
+ InmemoryAssistedMerges uint64
- SmallMergeNeedFreeDiskSpace uint64
- BigMergeNeedFreeDiskSpace uint64
+ MergeNeedFreeDiskSpace uint64
+}
+
+// TotalRowsCount returns total number of rows in tm.
+func (pm *partitionMetrics) TotalRowsCount() uint64 {
+ return pm.PendingRows + pm.InmemoryRowsCount + pm.SmallRowsCount + pm.BigRowsCount
}
// UpdateMetrics updates m with metrics from pt.
func (pt *partition) UpdateMetrics(m *partitionMetrics) {
- rawRowsLen := uint64(pt.rawRows.Len())
- m.PendingRows += rawRowsLen
- m.SmallRowsCount += rawRowsLen
+ m.PendingRows += uint64(pt.rawRows.Len())
pt.partsLock.Lock()
+ for _, pw := range pt.inmemoryParts {
+ p := pw.p
+ m.InmemoryRowsCount += p.ph.RowsCount
+ m.InmemoryBlocksCount += p.ph.BlocksCount
+ m.InmemorySizeBytes += p.size
+ m.InmemoryPartsRefCount += atomic.LoadUint64(&pw.refCount)
+ }
+ for _, pw := range pt.smallParts {
+ p := pw.p
+ m.SmallRowsCount += p.ph.RowsCount
+ m.SmallBlocksCount += p.ph.BlocksCount
+ m.SmallSizeBytes += p.size
+ m.SmallPartsRefCount += atomic.LoadUint64(&pw.refCount)
+ }
for _, pw := range pt.bigParts {
p := pw.p
-
m.BigRowsCount += p.ph.RowsCount
m.BigBlocksCount += p.ph.BlocksCount
m.BigSizeBytes += p.size
m.BigPartsRefCount += atomic.LoadUint64(&pw.refCount)
}
- for _, pw := range pt.smallParts {
- p := pw.p
-
- m.SmallRowsCount += p.ph.RowsCount
- m.SmallBlocksCount += p.ph.BlocksCount
- m.SmallSizeBytes += p.size
- m.SmallPartsRefCount += atomic.LoadUint64(&pw.refCount)
- }
-
- m.BigPartsCount += uint64(len(pt.bigParts))
+ m.InmemoryPartsCount += uint64(len(pt.inmemoryParts))
m.SmallPartsCount += uint64(len(pt.smallParts))
+ m.BigPartsCount += uint64(len(pt.bigParts))
pt.partsLock.Unlock()
@@ -362,22 +387,25 @@ func (pt *partition) UpdateMetrics(m *partitionMetrics) {
m.IndexBlocksCacheRequests = ibCache.Requests()
m.IndexBlocksCacheMisses = ibCache.Misses()
- m.ActiveBigMerges += atomic.LoadUint64(&pt.activeBigMerges)
+ m.ActiveInmemoryMerges += atomic.LoadUint64(&pt.activeInmemoryMerges)
m.ActiveSmallMerges += atomic.LoadUint64(&pt.activeSmallMerges)
+ m.ActiveBigMerges += atomic.LoadUint64(&pt.activeBigMerges)
- m.BigMergesCount += atomic.LoadUint64(&pt.bigMergesCount)
+ m.InmemoryMergesCount += atomic.LoadUint64(&pt.inmemoryMergesCount)
m.SmallMergesCount += atomic.LoadUint64(&pt.smallMergesCount)
+ m.BigMergesCount += atomic.LoadUint64(&pt.bigMergesCount)
- m.BigRowsMerged += atomic.LoadUint64(&pt.bigRowsMerged)
+ m.InmemoryRowsMerged += atomic.LoadUint64(&pt.inmemoryRowsMerged)
m.SmallRowsMerged += atomic.LoadUint64(&pt.smallRowsMerged)
+ m.BigRowsMerged += atomic.LoadUint64(&pt.bigRowsMerged)
- m.BigRowsDeleted += atomic.LoadUint64(&pt.bigRowsDeleted)
+ m.InmemoryRowsDeleted += atomic.LoadUint64(&pt.inmemoryRowsDeleted)
m.SmallRowsDeleted += atomic.LoadUint64(&pt.smallRowsDeleted)
+ m.BigRowsDeleted += atomic.LoadUint64(&pt.bigRowsDeleted)
- m.SmallAssistedMerges += atomic.LoadUint64(&pt.smallAssistedMerges)
+ m.InmemoryAssistedMerges += atomic.LoadUint64(&pt.inmemoryAssistedMerges)
- m.SmallMergeNeedFreeDiskSpace += atomic.LoadUint64(&pt.smallMergeNeedFreeDiskSpace)
- m.BigMergeNeedFreeDiskSpace += atomic.LoadUint64(&pt.bigMergeNeedFreeDiskSpace)
+ m.MergeNeedFreeDiskSpace += atomic.LoadUint64(&pt.mergeNeedFreeDiskSpace)
}
// AddRows adds the given rows to the partition pt.
@@ -415,11 +443,13 @@ func (rrss *rawRowsShards) init() {
}
func (rrss *rawRowsShards) addRows(pt *partition, rows []rawRow) {
- n := atomic.AddUint32(&rrss.shardIdx, 1)
shards := rrss.shards
- idx := n % uint32(len(shards))
- shard := &shards[idx]
- shard.addRows(pt, rows)
+ shardsLen := uint32(len(shards))
+ for len(rows) > 0 {
+ n := atomic.AddUint32(&rrss.shardIdx, 1)
+ idx := n % shardsLen
+ rows = shards[idx].addRows(pt, rows)
+ }
}
func (rrss *rawRowsShards) Len() int {
@@ -453,8 +483,8 @@ func (rrs *rawRowsShard) Len() int {
return n
}
-func (rrs *rawRowsShard) addRows(pt *partition, rows []rawRow) {
- var rowsToFlush []rawRow
+func (rrs *rawRowsShard) addRows(pt *partition, rows []rawRow) []rawRow {
+ var rrb *rawRowsBlock
rrs.mu.Lock()
if cap(rrs.rows) == 0 {
@@ -464,23 +494,25 @@ func (rrs *rawRowsShard) addRows(pt *partition, rows []rawRow) {
rrs.rows = rrs.rows[:len(rrs.rows)+n]
rows = rows[n:]
if len(rows) > 0 {
- // Slow path - rows did't fit rrs.rows capacity.
- // Convert rrs.rows to rowsToFlush and convert it to a part,
- // then try moving the remaining rows to rrs.rows.
- rowsToFlush = rrs.rows
- rrs.rows = newRawRowsBlock()
- if len(rows) <= n {
- rrs.rows = append(rrs.rows[:0], rows...)
- } else {
- // The slowest path - rows do not fit rrs.rows capacity.
- // So append them directly to rowsToFlush.
- rowsToFlush = append(rowsToFlush, rows...)
- }
+ rrb = getRawRowsBlock()
+ rrb.rows, rrs.rows = rrs.rows, rrb.rows
+ n = copy(rrs.rows[:cap(rrs.rows)], rows)
+ rrs.rows = rrs.rows[:n]
+ rows = rows[n:]
atomic.StoreUint64(&rrs.lastFlushTime, fasttime.UnixTimestamp())
}
rrs.mu.Unlock()
- pt.flushRowsToParts(rowsToFlush)
+ if rrb != nil {
+ pt.flushRowsToParts(rrb.rows)
+ putRawRowsBlock(rrb)
+ }
+
+ return rows
+}
+
+type rawRowsBlock struct {
+ rows []rawRow
}
func newRawRowsBlock() []rawRow {
@@ -488,8 +520,30 @@ func newRawRowsBlock() []rawRow {
return make([]rawRow, 0, n)
}
+func getRawRowsBlock() *rawRowsBlock {
+ v := rawRowsBlockPool.Get()
+ if v == nil {
+ return &rawRowsBlock{
+ rows: newRawRowsBlock(),
+ }
+ }
+ return v.(*rawRowsBlock)
+}
+
+func putRawRowsBlock(rrb *rawRowsBlock) {
+ rrb.rows = rrb.rows[:0]
+ rawRowsBlockPool.Put(rrb)
+}
+
+var rawRowsBlockPool sync.Pool
+
func (pt *partition) flushRowsToParts(rows []rawRow) {
+ if len(rows) == 0 {
+ return
+ }
maxRows := getMaxRawRowsPerShard()
+ var pwsLock sync.Mutex
+ pws := make([]*partWrapper, 0, (len(rows)+maxRows-1)/maxRows)
wg := getWaitGroup()
for len(rows) > 0 {
n := maxRows
@@ -497,14 +551,73 @@ func (pt *partition) flushRowsToParts(rows []rawRow) {
n = len(rows)
}
wg.Add(1)
- go func(rowsPart []rawRow) {
- defer wg.Done()
- pt.addRowsPart(rowsPart)
+ flushConcurrencyCh <- struct{}{}
+ go func(rowsChunk []rawRow) {
+ defer func() {
+ <-flushConcurrencyCh
+ wg.Done()
+ }()
+ pw := pt.createInmemoryPart(rowsChunk)
+ if pw == nil {
+ return
+ }
+ pwsLock.Lock()
+ pws = append(pws, pw)
+ pwsLock.Unlock()
}(rows[:n])
rows = rows[n:]
}
wg.Wait()
putWaitGroup(wg)
+
+ pt.partsLock.Lock()
+ pt.inmemoryParts = append(pt.inmemoryParts, pws...)
+ pt.partsLock.Unlock()
+
+ flushConcurrencyCh <- struct{}{}
+ pt.assistedMergeForInmemoryParts()
+ <-flushConcurrencyCh
+ // There is no need in assisted merges for small and big parts,
+ // since the bottleneck is possible only at inmemory parts.
+}
+
+var flushConcurrencyCh = make(chan struct{}, cgroup.AvailableCPUs())
+
+func (pt *partition) assistedMergeForInmemoryParts() {
+ for {
+ pt.partsLock.Lock()
+ ok := getNotInMergePartsCount(pt.inmemoryParts) < maxInmemoryPartsPerPartition
+ pt.partsLock.Unlock()
+ if ok {
+ return
+ }
+
+ // There are too many unmerged inmemory parts.
+ // This usually means that the app cannot keep up with the data ingestion rate.
+ // Assist with mering inmemory parts.
+ // Prioritize assisted merges over searches.
+ storagepacelimiter.Search.Inc()
+ err := pt.mergeInmemoryParts()
+ storagepacelimiter.Search.Dec()
+ if err == nil {
+ atomic.AddUint64(&pt.inmemoryAssistedMerges, 1)
+ continue
+ }
+ if errors.Is(err, errNothingToMerge) || errors.Is(err, errForciblyStopped) {
+ return
+ }
+ logger.Panicf("FATAL: cannot merge inmemory parts: %s", err)
+ }
+}
+
+func getNotInMergePartsCount(pws []*partWrapper) int {
+ n := 0
+ for _, pw := range pws {
+ if !pw.isInMerge {
+ n++
+ }
+ }
+ return n
}
func getWaitGroup() *sync.WaitGroup {
@@ -521,11 +634,10 @@ func putWaitGroup(wg *sync.WaitGroup) {
var wgPool sync.Pool
-func (pt *partition) addRowsPart(rows []rawRow) {
+func (pt *partition) createInmemoryPart(rows []rawRow) *partWrapper {
if len(rows) == 0 {
- return
+ return nil
}
-
mp := getInmemoryPart()
mp.InitFromRows(rows)
@@ -542,40 +654,22 @@ func (pt *partition) addRowsPart(rows []rawRow) {
logger.Panicf("BUG: the part %q cannot be added to partition %q because of too big MaxTimestamp; got %d; want at least %d",
&mp.ph, pt.smallPartsPath, mp.ph.MaxTimestamp, pt.tr.MaxTimestamp)
}
+ flushToDiskDeadline := time.Now().Add(dataFlushInterval)
+ return newPartWrapperFromInmemoryPart(mp, flushToDiskDeadline)
+}
+func newPartWrapperFromInmemoryPart(mp *inmemoryPart, flushToDiskDeadline time.Time) *partWrapper {
p, err := mp.NewPart()
if err != nil {
logger.Panicf("BUG: cannot create part from %q: %s", &mp.ph, err)
}
-
pw := &partWrapper{
- p: p,
- mp: mp,
- refCount: 1,
+ p: p,
+ mp: mp,
+ refCount: 1,
+ flushToDiskDeadline: flushToDiskDeadline,
}
-
- pt.partsLock.Lock()
- pt.smallParts = append(pt.smallParts, pw)
- ok := len(pt.smallParts) <= maxSmallPartsPerPartition
- pt.partsLock.Unlock()
- if ok {
- return
- }
-
- // The added part exceeds available limit. Help merging parts.
- //
- // Prioritize assisted merges over searches.
- storagepacelimiter.Search.Inc()
- err = pt.mergeSmallParts(false)
- storagepacelimiter.Search.Dec()
- if err == nil {
- atomic.AddUint64(&pt.smallAssistedMerges, 1)
- return
- }
- if errors.Is(err, errNothingToMerge) || errors.Is(err, errForciblyStopped) || errors.Is(err, errReadOnlyMode) {
- return
- }
- logger.Panicf("FATAL: cannot merge small parts: %s", err)
+ return pw
}
// HasTimestamp returns true if the pt contains the given timestamp.
@@ -588,6 +682,10 @@ func (pt *partition) HasTimestamp(timestamp int64) bool {
// The appended parts must be released with PutParts.
func (pt *partition) GetParts(dst []*partWrapper) []*partWrapper {
pt.partsLock.Lock()
+ for _, pw := range pt.inmemoryParts {
+ pw.incRef()
+ }
+ dst = append(dst, pt.inmemoryParts...)
for _, pw := range pt.smallParts {
pw.incRef()
}
@@ -625,93 +723,132 @@ func (pt *partition) MustClose() {
logger.Infof("flushing inmemory parts to files on %q...", pt.smallPartsPath)
startTime = time.Now()
- // Flush raw rows the last time before exit.
- pt.flushPendingRows(true)
+ // Flush inmemory rows the last time before exit.
+ pt.flushInmemoryRows()
- // Flush inmemory parts to disk.
- var pws []*partWrapper
- pt.partsLock.Lock()
- for _, pw := range pt.smallParts {
- if pw.mp == nil {
- continue
- }
- if pw.isInMerge {
- logger.Panicf("BUG: the inmemory part %q mustn't be in merge after stopping small parts merger in the partition %q", &pw.mp.ph, pt.smallPartsPath)
- }
- pw.isInMerge = true
- pws = append(pws, pw)
- }
- pt.partsLock.Unlock()
-
- if err := pt.mergePartsOptimal(pws, nil); err != nil {
- logger.Panicf("FATAL: cannot flush %d inmemory parts to files on %q: %s", len(pws), pt.smallPartsPath, err)
- }
- logger.Infof("%d inmemory parts have been flushed to files in %.3f seconds on %q", len(pws), time.Since(startTime).Seconds(), pt.smallPartsPath)
-
- // Remove references to smallParts from the pt, so they may be eventually closed
+ // Remove references from inmemoryParts, smallParts and bigParts, so they may be eventually closed
// after all the searches are done.
pt.partsLock.Lock()
+ inmemoryParts := pt.inmemoryParts
smallParts := pt.smallParts
- pt.smallParts = nil
- pt.partsLock.Unlock()
-
- for _, pw := range smallParts {
- pw.decRef()
- }
-
- // Remove references to bigParts from the pt, so they may be eventually closed
- // after all the searches are done.
- pt.partsLock.Lock()
bigParts := pt.bigParts
+ pt.inmemoryParts = nil
+ pt.smallParts = nil
pt.bigParts = nil
pt.partsLock.Unlock()
+ for _, pw := range inmemoryParts {
+ pw.decRef()
+ }
+ for _, pw := range smallParts {
+ pw.decRef()
+ }
for _, pw := range bigParts {
pw.decRef()
}
}
-func (pt *partition) startRawRowsFlusher() {
+func (pt *partition) startInmemoryPartsFlusher() {
pt.wg.Add(1)
go func() {
- pt.rawRowsFlusher()
+ pt.inmemoryPartsFlusher()
pt.wg.Done()
}()
}
-func (pt *partition) rawRowsFlusher() {
- ticker := time.NewTicker(rawRowsFlushInterval)
+func (pt *partition) startPendingRowsFlusher() {
+ pt.wg.Add(1)
+ go func() {
+ pt.pendingRowsFlusher()
+ pt.wg.Done()
+ }()
+}
+
+func (pt *partition) inmemoryPartsFlusher() {
+ ticker := time.NewTicker(dataFlushInterval)
defer ticker.Stop()
for {
select {
case <-pt.stopCh:
return
case <-ticker.C:
- pt.flushPendingRows(false)
+ pt.flushInmemoryParts(false)
}
}
}
-func (pt *partition) flushPendingRows(isFinal bool) {
- pt.rawRows.flush(pt, isFinal)
+func (pt *partition) pendingRowsFlusher() {
+ ticker := time.NewTicker(pendingRowsFlushInterval)
+ defer ticker.Stop()
+ var rows []rawRow
+ for {
+ select {
+ case <-pt.stopCh:
+ return
+ case <-ticker.C:
+ rows = pt.flushPendingRows(rows[:0], false)
+ }
+ }
}
-func (rrss *rawRowsShards) flush(pt *partition, isFinal bool) {
- var rowsToFlush []rawRow
- for i := range rrss.shards {
- rowsToFlush = rrss.shards[i].appendRawRowsToFlush(rowsToFlush, pt, isFinal)
+func (pt *partition) flushPendingRows(dst []rawRow, isFinal bool) []rawRow {
+ return pt.rawRows.flush(pt, dst, isFinal)
+}
+
+func (pt *partition) flushInmemoryRows() {
+ pt.rawRows.flush(pt, nil, true)
+ pt.flushInmemoryParts(true)
+}
+
+func (pt *partition) flushInmemoryParts(isFinal bool) {
+ for {
+ currentTime := time.Now()
+ var pws []*partWrapper
+
+ pt.partsLock.Lock()
+ for _, pw := range pt.inmemoryParts {
+ if !pw.isInMerge && (isFinal || pw.flushToDiskDeadline.Before(currentTime)) {
+ pw.isInMerge = true
+ pws = append(pws, pw)
+ }
+ }
+ pt.partsLock.Unlock()
+
+ if err := pt.mergePartsOptimal(pws, nil); err != nil {
+ logger.Panicf("FATAL: cannot merge in-memory parts: %s", err)
+ }
+ if !isFinal {
+ return
+ }
+ pt.partsLock.Lock()
+ n := len(pt.inmemoryParts)
+ pt.partsLock.Unlock()
+ if n == 0 {
+ // All the in-memory parts were flushed to disk.
+ return
+ }
+ // Some parts weren't flushed to disk because they were being merged.
+ // Sleep for a while and try flushing them again.
+ time.Sleep(10 * time.Millisecond)
}
- pt.flushRowsToParts(rowsToFlush)
+}
+
+func (rrss *rawRowsShards) flush(pt *partition, dst []rawRow, isFinal bool) []rawRow {
+ for i := range rrss.shards {
+ dst = rrss.shards[i].appendRawRowsToFlush(dst, pt, isFinal)
+ }
+ pt.flushRowsToParts(dst)
+ return dst
}
func (rrs *rawRowsShard) appendRawRowsToFlush(dst []rawRow, pt *partition, isFinal bool) []rawRow {
currentTime := fasttime.UnixTimestamp()
- flushSeconds := int64(rawRowsFlushInterval.Seconds())
+ flushSeconds := int64(pendingRowsFlushInterval.Seconds())
if flushSeconds <= 0 {
flushSeconds = 1
}
lastFlushTime := atomic.LoadUint64(&rrs.lastFlushTime)
- if !isFinal && currentTime <= lastFlushTime+uint64(flushSeconds) {
+ if !isFinal && currentTime < lastFlushTime+uint64(flushSeconds) {
// Fast path - nothing to flush
return dst
}
@@ -724,112 +861,73 @@ func (rrs *rawRowsShard) appendRawRowsToFlush(dst []rawRow, pt *partition, isFin
return dst
}
-func (pt *partition) startInmemoryPartsFlusher() {
- pt.wg.Add(1)
- go func() {
- pt.inmemoryPartsFlusher()
- pt.wg.Done()
- }()
-}
-
-func (pt *partition) inmemoryPartsFlusher() {
- ticker := time.NewTicker(inmemoryPartsFlushInterval)
- defer ticker.Stop()
- var pwsBuf []*partWrapper
- var err error
- for {
- select {
- case <-pt.stopCh:
- return
- case <-ticker.C:
- pwsBuf, err = pt.flushInmemoryParts(pwsBuf[:0], false)
- if err != nil {
- logger.Panicf("FATAL: cannot flush inmemory parts: %s", err)
- }
+func (pt *partition) mergePartsOptimal(pws []*partWrapper, stopCh <-chan struct{}) error {
+ sortPartsForOptimalMerge(pws)
+ for len(pws) > 0 {
+ n := defaultPartsToMerge
+ if n > len(pws) {
+ n = len(pws)
}
- }
-}
-
-func (pt *partition) flushInmemoryParts(dstPws []*partWrapper, force bool) ([]*partWrapper, error) {
- currentTime := fasttime.UnixTimestamp()
- flushSeconds := int64(inmemoryPartsFlushInterval.Seconds())
- if flushSeconds <= 0 {
- flushSeconds = 1
- }
-
- // Inmemory parts may present only in small parts.
- pt.partsLock.Lock()
- for _, pw := range pt.smallParts {
- if pw.mp == nil || pw.isInMerge {
+ pwsChunk := pws[:n]
+ pws = pws[n:]
+ err := pt.mergeParts(pwsChunk, stopCh, true)
+ if err == nil {
continue
}
- if force || currentTime-pw.mp.creationTime >= uint64(flushSeconds) {
- pw.isInMerge = true
- dstPws = append(dstPws, pw)
+ pt.releasePartsToMerge(pws)
+ if errors.Is(err, errForciblyStopped) {
+ return nil
}
- }
- pt.partsLock.Unlock()
-
- if err := pt.mergePartsOptimal(dstPws, nil); err != nil {
- return dstPws, fmt.Errorf("cannot merge %d inmemory parts: %w", len(dstPws), err)
- }
- return dstPws, nil
-}
-
-func (pt *partition) mergePartsOptimal(pws []*partWrapper, stopCh <-chan struct{}) error {
- for len(pws) > defaultPartsToMerge {
- pwsChunk := pws[:defaultPartsToMerge]
- pws = pws[defaultPartsToMerge:]
- if err := pt.mergeParts(pwsChunk, stopCh); err != nil {
- pt.releasePartsToMerge(pws)
- return fmt.Errorf("cannot merge %d parts: %w", defaultPartsToMerge, err)
- }
- }
- if len(pws) == 0 {
- return nil
- }
- if err := pt.mergeParts(pws, stopCh); err != nil {
- return fmt.Errorf("cannot merge %d parts: %w", len(pws), err)
+ return fmt.Errorf("cannot merge parts optimally: %w", err)
}
return nil
}
-// ForceMergeAllParts runs merge for all the parts in pt - small and big.
+// ForceMergeAllParts runs merge for all the parts in pt.
func (pt *partition) ForceMergeAllParts() error {
- var pws []*partWrapper
- pt.partsLock.Lock()
- if !hasActiveMerges(pt.smallParts) && !hasActiveMerges(pt.bigParts) {
- pws = appendAllPartsToMerge(pws, pt.smallParts)
- pws = appendAllPartsToMerge(pws, pt.bigParts)
- }
- pt.partsLock.Unlock()
-
+ pws := pt.getAllPartsForMerge()
if len(pws) == 0 {
// Nothing to merge.
return nil
}
+ for {
+ // Check whether there is enough disk space for merging pws.
+ newPartSize := getPartsSize(pws)
+ maxOutBytes := fs.MustGetFreeSpace(pt.bigPartsPath)
+ if newPartSize > maxOutBytes {
+ freeSpaceNeededBytes := newPartSize - maxOutBytes
+ forceMergeLogger.Warnf("cannot initiate force merge for the partition %s; additional space needed: %d bytes", pt.name, freeSpaceNeededBytes)
+ return nil
+ }
- // Check whether there is enough disk space for merging pws.
- newPartSize := getPartsSize(pws)
- maxOutBytes := fs.MustGetFreeSpace(pt.bigPartsPath)
- if newPartSize > maxOutBytes {
- freeSpaceNeededBytes := newPartSize - maxOutBytes
- forceMergeLogger.Warnf("cannot initiate force merge for the partition %s; additional space needed: %d bytes", pt.name, freeSpaceNeededBytes)
- return nil
+ // If len(pws) == 1, then the merge must run anyway.
+ // This allows applying the configured retention, removing the deleted series
+ // and performing de-duplication if needed.
+ if err := pt.mergePartsOptimal(pws, pt.stopCh); err != nil {
+ return fmt.Errorf("cannot force merge %d parts from partition %q: %w", len(pws), pt.name, err)
+ }
+ pws = pt.getAllPartsForMerge()
+ if len(pws) <= 1 {
+ return nil
+ }
}
-
- // If len(pws) == 1, then the merge must run anyway.
- // This allows applying the configured retention, removing the deleted series
- // and performing de-duplication if needed.
- if err := pt.mergePartsOptimal(pws, pt.stopCh); err != nil {
- return fmt.Errorf("cannot force merge %d parts from partition %q: %w", len(pws), pt.name, err)
- }
- return nil
}
var forceMergeLogger = logger.WithThrottler("forceMerge", time.Minute)
-func appendAllPartsToMerge(dst, src []*partWrapper) []*partWrapper {
+func (pt *partition) getAllPartsForMerge() []*partWrapper {
+ var pws []*partWrapper
+ pt.partsLock.Lock()
+ if !hasActiveMerges(pt.inmemoryParts) && !hasActiveMerges(pt.smallParts) && !hasActiveMerges(pt.bigParts) {
+ pws = appendAllPartsForMerge(pws, pt.inmemoryParts)
+ pws = appendAllPartsForMerge(pws, pt.smallParts)
+ pws = appendAllPartsForMerge(pws, pt.bigParts)
+ }
+ pt.partsLock.Unlock()
+ return pws
+}
+
+func appendAllPartsForMerge(dst, src []*partWrapper) []*partWrapper {
for _, pw := range src {
if pw.isInMerge {
logger.Panicf("BUG: part %q is already in merge", pw.p.path)
@@ -849,10 +947,9 @@ func hasActiveMerges(pws []*partWrapper) bool {
return false
}
-var (
- bigMergeWorkersCount = getDefaultMergeConcurrency(4)
- smallMergeWorkersCount = getDefaultMergeConcurrency(16)
-)
+var mergeWorkersLimitCh = make(chan struct{}, getDefaultMergeConcurrency(16))
+
+var bigMergeWorkersLimitCh = make(chan struct{}, getDefaultMergeConcurrency(4))
func getDefaultMergeConcurrency(max int) int {
v := (cgroup.AvailableCPUs() + 1) / 2
@@ -870,47 +967,28 @@ func SetBigMergeWorkersCount(n int) {
// Do nothing
return
}
- bigMergeWorkersCount = n
+ bigMergeWorkersLimitCh = make(chan struct{}, n)
}
-// SetSmallMergeWorkersCount sets the maximum number of concurrent mergers for small blocks.
+// SetMergeWorkersCount sets the maximum number of concurrent mergers for parts.
//
// The function must be called before opening or creating any storage.
-func SetSmallMergeWorkersCount(n int) {
+func SetMergeWorkersCount(n int) {
if n <= 0 {
// Do nothing
return
}
- smallMergeWorkersCount = n
+ mergeWorkersLimitCh = make(chan struct{}, n)
}
func (pt *partition) startMergeWorkers() {
- for i := 0; i < smallMergeWorkersCount; i++ {
+ for i := 0; i < cap(mergeWorkersLimitCh); i++ {
pt.wg.Add(1)
go func() {
- pt.smallPartsMerger()
+ pt.mergeWorker()
pt.wg.Done()
}()
}
- for i := 0; i < bigMergeWorkersCount; i++ {
- pt.wg.Add(1)
- go func() {
- pt.bigPartsMerger()
- pt.wg.Done()
- }()
- }
-}
-
-func (pt *partition) bigPartsMerger() {
- if err := pt.partsMerger(pt.mergeBigParts); err != nil {
- logger.Panicf("FATAL: unrecoverable error when merging big parts in the partition %q: %s", pt.bigPartsPath, err)
- }
-}
-
-func (pt *partition) smallPartsMerger() {
- if err := pt.partsMerger(pt.mergeSmallParts); err != nil {
- logger.Panicf("FATAL: unrecoverable error when merging small parts in the partition %q: %s", pt.smallPartsPath, err)
- }
}
const (
@@ -918,13 +996,16 @@ const (
maxMergeSleepTime = 10 * time.Second
)
-func (pt *partition) partsMerger(mergerFunc func(isFinal bool) error) error {
+func (pt *partition) mergeWorker() {
sleepTime := minMergeSleepTime
var lastMergeTime uint64
isFinal := false
t := time.NewTimer(sleepTime)
for {
- err := mergerFunc(isFinal)
+ // Limit the number of concurrent calls to mergeExistingParts, cine the number of merge
+ mergeWorkersLimitCh <- struct{}{}
+ err := pt.mergeExistingParts(isFinal)
+ <-mergeWorkersLimitCh
if err == nil {
// Try merging additional parts.
sleepTime = minMergeSleepTime
@@ -934,10 +1015,11 @@ func (pt *partition) partsMerger(mergerFunc func(isFinal bool) error) error {
}
if errors.Is(err, errForciblyStopped) {
// The merger has been stopped.
- return nil
+ return
}
if !errors.Is(err, errNothingToMerge) && !errors.Is(err, errReadOnlyMode) {
- return err
+ // Unexpected error.
+ logger.Panicf("FATAL: unrecoverable error when merging parts in the partition (%q, %q): %s", pt.smallPartsPath, pt.bigPartsPath, err)
}
if finalMergeDelaySeconds > 0 && fasttime.UnixTimestamp()-lastMergeTime > finalMergeDelaySeconds {
// We have free time for merging into bigger parts.
@@ -954,7 +1036,7 @@ func (pt *partition) partsMerger(mergerFunc func(isFinal bool) error) error {
}
select {
case <-pt.stopCh:
- return nil
+ return
case <-t.C:
t.Reset(sleepTime)
}
@@ -973,6 +1055,40 @@ func SetFinalMergeDelay(delay time.Duration) {
return
}
finalMergeDelaySeconds = uint64(delay.Seconds() + 1)
+ mergeset.SetFinalMergeDelay(delay)
+}
+
+func getMaxInmemoryPartSize() uint64 {
+ // Allocate 10% of allowed memory for in-memory parts.
+ n := uint64(0.1 * float64(memory.Allowed()) / maxInmemoryPartsPerPartition)
+ if n < 1e6 {
+ n = 1e6
+ }
+ return n
+}
+
+func (pt *partition) getMaxSmallPartSize() uint64 {
+ // Small parts are cached in the OS page cache,
+ // so limit their size by the remaining free RAM.
+ mem := memory.Remaining()
+ // It is expected no more than defaultPartsToMerge/2 parts exist
+ // in the OS page cache before they are merged into bigger part.
+ // Half of the remaining RAM must be left for lib/mergeset parts,
+ // so the maxItems is calculated using the below code:
+ n := uint64(mem) / defaultPartsToMerge
+ if n < 10e6 {
+ n = 10e6
+ }
+ // Make sure the output part fits available disk space for small parts.
+ sizeLimit := getMaxOutBytes(pt.smallPartsPath, cap(mergeWorkersLimitCh))
+ if n > sizeLimit {
+ n = sizeLimit
+ }
+ return n
+}
+
+func (pt *partition) getMaxBigPartSize() uint64 {
+ return getMaxOutBytes(pt.bigPartsPath, cap(bigMergeWorkersLimitCh))
}
func getMaxOutBytes(path string, workersCount int) uint64 {
@@ -994,56 +1110,35 @@ func (pt *partition) canBackgroundMerge() bool {
var errReadOnlyMode = fmt.Errorf("storage is in readonly mode")
-func (pt *partition) mergeBigParts(isFinal bool) error {
- if !pt.canBackgroundMerge() {
- // Do not perform merge in read-only mode, since this may result in disk space shortage.
- // See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/2603
- return errReadOnlyMode
- }
- maxOutBytes := getMaxOutBytes(pt.bigPartsPath, bigMergeWorkersCount)
+func (pt *partition) mergeInmemoryParts() error {
+ maxOutBytes := pt.getMaxBigPartSize()
pt.partsLock.Lock()
- pws, needFreeSpace := getPartsToMerge(pt.bigParts, maxOutBytes, isFinal)
+ pws, needFreeSpace := getPartsToMerge(pt.inmemoryParts, maxOutBytes, false)
pt.partsLock.Unlock()
- atomicSetBool(&pt.bigMergeNeedFreeDiskSpace, needFreeSpace)
- return pt.mergeParts(pws, pt.stopCh)
+ atomicSetBool(&pt.mergeNeedFreeDiskSpace, needFreeSpace)
+ return pt.mergeParts(pws, pt.stopCh, false)
}
-func (pt *partition) mergeSmallParts(isFinal bool) error {
+func (pt *partition) mergeExistingParts(isFinal bool) error {
if !pt.canBackgroundMerge() {
// Do not perform merge in read-only mode, since this may result in disk space shortage.
// See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/2603
return errReadOnlyMode
}
- // Try merging small parts to a big part at first.
- maxBigPartOutBytes := getMaxOutBytes(pt.bigPartsPath, bigMergeWorkersCount)
+ maxOutBytes := pt.getMaxBigPartSize()
+
pt.partsLock.Lock()
- pws, needFreeSpace := getPartsToMerge(pt.smallParts, maxBigPartOutBytes, isFinal)
+ dst := make([]*partWrapper, 0, len(pt.inmemoryParts)+len(pt.smallParts)+len(pt.bigParts))
+ dst = append(dst, pt.inmemoryParts...)
+ dst = append(dst, pt.smallParts...)
+ dst = append(dst, pt.bigParts...)
+ pws, needFreeSpace := getPartsToMerge(dst, maxOutBytes, isFinal)
pt.partsLock.Unlock()
- atomicSetBool(&pt.bigMergeNeedFreeDiskSpace, needFreeSpace)
- outSize := getPartsSize(pws)
- if outSize > maxSmallPartSize() {
- // Merge small parts to a big part.
- return pt.mergeParts(pws, pt.stopCh)
- }
-
- // Make sure that the output small part fits small parts storage.
- maxSmallPartOutBytes := getMaxOutBytes(pt.smallPartsPath, smallMergeWorkersCount)
- if outSize <= maxSmallPartOutBytes {
- // Merge small parts to a small part.
- return pt.mergeParts(pws, pt.stopCh)
- }
-
- // The output small part doesn't fit small parts storage. Try merging small parts according to maxSmallPartOutBytes limit.
- pt.releasePartsToMerge(pws)
- pt.partsLock.Lock()
- pws, needFreeSpace = getPartsToMerge(pt.smallParts, maxSmallPartOutBytes, isFinal)
- pt.partsLock.Unlock()
- atomicSetBool(&pt.smallMergeNeedFreeDiskSpace, needFreeSpace)
-
- return pt.mergeParts(pws, pt.stopCh)
+ atomicSetBool(&pt.mergeNeedFreeDiskSpace, needFreeSpace)
+ return pt.mergeParts(pws, pt.stopCh, isFinal)
}
func (pt *partition) releasePartsToMerge(pws []*partWrapper) {
@@ -1105,12 +1200,14 @@ func getMinDedupInterval(pws []*partWrapper) int64 {
return dMin
}
-// mergeParts merges pws.
+// mergeParts merges pws to a single resulting part.
//
// Merging is immediately stopped if stopCh is closed.
//
+// if isFinal is set, then the resulting part will be saved to disk.
+//
// All the parts inside pws must have isInMerge field set to true.
-func (pt *partition) mergeParts(pws []*partWrapper, stopCh <-chan struct{}) error {
+func (pt *partition) mergeParts(pws []*partWrapper, stopCh <-chan struct{}, isFinal bool) error {
if len(pws) == 0 {
// Nothing to merge.
return errNothingToMerge
@@ -1119,164 +1216,332 @@ func (pt *partition) mergeParts(pws []*partWrapper, stopCh <-chan struct{}) erro
startTime := time.Now()
+ // Initialize destination paths.
+ dstPartType := pt.getDstPartType(pws, isFinal)
+ ptPath, tmpPartPath, mergeIdx := pt.getDstPartPaths(dstPartType)
+
+ if dstPartType == partBig {
+ bigMergeWorkersLimitCh <- struct{}{}
+ defer func() {
+ <-bigMergeWorkersLimitCh
+ }()
+ }
+
+ if isFinal && len(pws) == 1 && pws[0].mp != nil {
+ // Fast path: flush a single in-memory part to disk.
+ mp := pws[0].mp
+ if tmpPartPath == "" {
+ logger.Panicf("BUG: tmpPartPath must be non-empty")
+ }
+ if err := mp.StoreToDisk(tmpPartPath); err != nil {
+ return fmt.Errorf("cannot store in-memory part to %q: %w", tmpPartPath, err)
+ }
+ pwNew, err := pt.openCreatedPart(&mp.ph, pws, nil, ptPath, tmpPartPath, mergeIdx)
+ if err != nil {
+ return fmt.Errorf("cannot atomically register the created part: %w", err)
+ }
+ pt.swapSrcWithDstParts(pws, pwNew, dstPartType)
+ return nil
+ }
+
// Prepare BlockStreamReaders for source parts.
- bsrs := make([]*blockStreamReader, 0, len(pws))
- defer func() {
+ bsrs, err := openBlockStreamReaders(pws)
+ if err != nil {
+ return err
+ }
+ closeBlockStreamReaders := func() {
for _, bsr := range bsrs {
putBlockStreamReader(bsr)
}
- }()
+ bsrs = nil
+ }
+
+ // Prepare BlockStreamWriter for destination part.
+ srcSize := uint64(0)
+ srcRowsCount := uint64(0)
+ srcBlocksCount := uint64(0)
+ for _, pw := range pws {
+ srcSize += pw.p.size
+ srcRowsCount += pw.p.ph.RowsCount
+ srcBlocksCount += pw.p.ph.BlocksCount
+ }
+ rowsPerBlock := float64(srcRowsCount) / float64(srcBlocksCount)
+ compressLevel := getCompressLevel(rowsPerBlock)
+ bsw := getBlockStreamWriter()
+ var mpNew *inmemoryPart
+ if dstPartType == partInmemory {
+ mpNew = getInmemoryPart()
+ bsw.InitFromInmemoryPart(mpNew, compressLevel)
+ } else {
+ if tmpPartPath == "" {
+ logger.Panicf("BUG: tmpPartPath must be non-empty")
+ }
+ nocache := dstPartType == partBig
+ if err := bsw.InitFromFilePart(tmpPartPath, nocache, compressLevel); err != nil {
+ closeBlockStreamReaders()
+ return fmt.Errorf("cannot create destination part at %q: %w", tmpPartPath, err)
+ }
+ }
+
+ // Merge source parts to destination part.
+ ph, err := pt.mergePartsInternal(tmpPartPath, bsw, bsrs, dstPartType, stopCh)
+ putBlockStreamWriter(bsw)
+ closeBlockStreamReaders()
+ if err != nil {
+ return fmt.Errorf("cannot merge %d parts: %w", len(pws), err)
+ }
+ if mpNew != nil {
+ // Update partHeader for destination inmemory part after the merge.
+ mpNew.ph = *ph
+ }
+
+ // Atomically move the created part from tmpPartPath to its destination
+ // and swap the source parts with the newly created part.
+ pwNew, err := pt.openCreatedPart(ph, pws, mpNew, ptPath, tmpPartPath, mergeIdx)
+ if err != nil {
+ return fmt.Errorf("cannot atomically register the created part: %w", err)
+ }
+ pt.swapSrcWithDstParts(pws, pwNew, dstPartType)
+
+ d := time.Since(startTime)
+ if d <= 30*time.Second {
+ return nil
+ }
+
+ // Log stats for long merges.
+ dstRowsCount := uint64(0)
+ dstBlocksCount := uint64(0)
+ dstSize := uint64(0)
+ dstPartPath := ""
+ if pwNew != nil {
+ pDst := pwNew.p
+ dstRowsCount = pDst.ph.RowsCount
+ dstBlocksCount = pDst.ph.BlocksCount
+ dstSize = pDst.size
+ dstPartPath = pDst.String()
+ }
+ durationSecs := d.Seconds()
+ rowsPerSec := int(float64(srcRowsCount) / durationSecs)
+ logger.Infof("merged (%d parts, %d rows, %d blocks, %d bytes) into (1 part, %d rows, %d blocks, %d bytes) in %.3f seconds at %d rows/sec to %q",
+ len(pws), srcRowsCount, srcBlocksCount, srcSize, dstRowsCount, dstBlocksCount, dstSize, durationSecs, rowsPerSec, dstPartPath)
+
+ return nil
+}
+
+func getFlushToDiskDeadline(pws []*partWrapper) time.Time {
+ d := pws[0].flushToDiskDeadline
+ for _, pw := range pws[1:] {
+ if pw.flushToDiskDeadline.Before(d) {
+ d = pw.flushToDiskDeadline
+ }
+ }
+ return d
+}
+
+type partType int
+
+var (
+ partInmemory = partType(0)
+ partSmall = partType(1)
+ partBig = partType(2)
+)
+
+func (pt *partition) getDstPartType(pws []*partWrapper, isFinal bool) partType {
+ dstPartSize := getPartsSize(pws)
+ if dstPartSize > pt.getMaxSmallPartSize() {
+ return partBig
+ }
+ if isFinal || dstPartSize > getMaxInmemoryPartSize() {
+ return partSmall
+ }
+ if !areAllInmemoryParts(pws) {
+ // If at least a single source part is located in file,
+ // then the destination part must be in file for durability reasons.
+ return partSmall
+ }
+ return partInmemory
+}
+
+func (pt *partition) getDstPartPaths(dstPartType partType) (string, string, uint64) {
+ ptPath := ""
+ switch dstPartType {
+ case partSmall:
+ ptPath = pt.smallPartsPath
+ case partBig:
+ ptPath = pt.bigPartsPath
+ case partInmemory:
+ ptPath = pt.smallPartsPath
+ default:
+ logger.Panicf("BUG: unknown partType=%d", dstPartType)
+ }
+ ptPath = filepath.Clean(ptPath)
+ mergeIdx := pt.nextMergeIdx()
+ tmpPartPath := ""
+ if dstPartType != partInmemory {
+ tmpPartPath = fmt.Sprintf("%s/tmp/%016X", ptPath, mergeIdx)
+ }
+ return ptPath, tmpPartPath, mergeIdx
+}
+
+func openBlockStreamReaders(pws []*partWrapper) ([]*blockStreamReader, error) {
+ bsrs := make([]*blockStreamReader, 0, len(pws))
for _, pw := range pws {
bsr := getBlockStreamReader()
if pw.mp != nil {
bsr.InitFromInmemoryPart(pw.mp)
} else {
if err := bsr.InitFromFilePart(pw.p.path); err != nil {
- return fmt.Errorf("cannot open source part for merging: %w", err)
+ for _, bsr := range bsrs {
+ putBlockStreamReader(bsr)
+ }
+ return nil, fmt.Errorf("cannot open source part for merging: %w", err)
}
}
bsrs = append(bsrs, bsr)
}
+ return bsrs, nil
+}
- outSize := uint64(0)
- outRowsCount := uint64(0)
- outBlocksCount := uint64(0)
- for _, pw := range pws {
- outSize += pw.p.size
- outRowsCount += pw.p.ph.RowsCount
- outBlocksCount += pw.p.ph.BlocksCount
- }
- isBigPart := outSize > maxSmallPartSize()
- nocache := isBigPart
-
- // Prepare BlockStreamWriter for destination part.
- ptPath := pt.smallPartsPath
- if isBigPart {
- ptPath = pt.bigPartsPath
- }
- ptPath = filepath.Clean(ptPath)
- mergeIdx := pt.nextMergeIdx()
- tmpPartPath := fmt.Sprintf("%s/tmp/%016X", ptPath, mergeIdx)
- bsw := getBlockStreamWriter()
- rowsPerBlock := float64(outRowsCount) / float64(outBlocksCount)
- compressLevel := getCompressLevel(rowsPerBlock)
- if err := bsw.InitFromFilePart(tmpPartPath, nocache, compressLevel); err != nil {
- return fmt.Errorf("cannot create destination part %q: %w", tmpPartPath, err)
- }
-
- // Merge parts.
+func (pt *partition) mergePartsInternal(tmpPartPath string, bsw *blockStreamWriter, bsrs []*blockStreamReader, dstPartType partType, stopCh <-chan struct{}) (*partHeader, error) {
var ph partHeader
- rowsMerged := &pt.smallRowsMerged
- rowsDeleted := &pt.smallRowsDeleted
- if isBigPart {
+ var rowsMerged *uint64
+ var rowsDeleted *uint64
+ var mergesCount *uint64
+ var activeMerges *uint64
+ switch dstPartType {
+ case partInmemory:
+ rowsMerged = &pt.inmemoryRowsMerged
+ rowsDeleted = &pt.inmemoryRowsDeleted
+ mergesCount = &pt.inmemoryMergesCount
+ activeMerges = &pt.activeInmemoryMerges
+ case partSmall:
+ rowsMerged = &pt.smallRowsMerged
+ rowsDeleted = &pt.smallRowsDeleted
+ mergesCount = &pt.smallMergesCount
+ activeMerges = &pt.activeSmallMerges
+ case partBig:
rowsMerged = &pt.bigRowsMerged
rowsDeleted = &pt.bigRowsDeleted
- atomic.AddUint64(&pt.bigMergesCount, 1)
- atomic.AddUint64(&pt.activeBigMerges, 1)
- } else {
- atomic.AddUint64(&pt.smallMergesCount, 1)
- atomic.AddUint64(&pt.activeSmallMerges, 1)
+ mergesCount = &pt.bigMergesCount
+ activeMerges = &pt.activeBigMerges
+ default:
+ logger.Panicf("BUG: unknown partType=%d", dstPartType)
}
- retentionDeadline := timestampFromTime(startTime) - pt.s.retentionMsecs
+ retentionDeadline := timestampFromTime(time.Now()) - pt.s.retentionMsecs
+ atomic.AddUint64(activeMerges, 1)
err := mergeBlockStreams(&ph, bsw, bsrs, stopCh, pt.s, retentionDeadline, rowsMerged, rowsDeleted)
- if isBigPart {
- atomic.AddUint64(&pt.activeBigMerges, ^uint64(0))
- } else {
- atomic.AddUint64(&pt.activeSmallMerges, ^uint64(0))
- }
- putBlockStreamWriter(bsw)
+ atomic.AddUint64(activeMerges, ^uint64(0))
+ atomic.AddUint64(mergesCount, 1)
if err != nil {
- return fmt.Errorf("error when merging parts to %q: %w", tmpPartPath, err)
+ return nil, fmt.Errorf("cannot merge parts to %q: %w", tmpPartPath, err)
}
-
- // Close bsrs.
- for _, bsr := range bsrs {
- putBlockStreamReader(bsr)
+ if tmpPartPath != "" {
+ ph.MinDedupInterval = GetDedupInterval()
+ if err := ph.writeMinDedupInterval(tmpPartPath); err != nil {
+ return nil, fmt.Errorf("cannot store min dedup interval: %w", err)
+ }
}
- bsrs = nil
+ return &ph, nil
+}
- ph.MinDedupInterval = GetDedupInterval()
- if err := ph.writeMinDedupInterval(tmpPartPath); err != nil {
- return fmt.Errorf("cannot store min dedup interval for part %q: %w", tmpPartPath, err)
+func (pt *partition) openCreatedPart(ph *partHeader, pws []*partWrapper, mpNew *inmemoryPart, ptPath, tmpPartPath string, mergeIdx uint64) (*partWrapper, error) {
+ dstPartPath := ""
+ if mpNew == nil || !areAllInmemoryParts(pws) {
+ // Either source or destination parts are located on disk.
+ // Create a transaction for atomic deleting of old parts and moving new part to its destination on disk.
+ var bb bytesutil.ByteBuffer
+ for _, pw := range pws {
+ if pw.mp == nil {
+ fmt.Fprintf(&bb, "%s\n", pw.p.path)
+ }
+ }
+ if ph.RowsCount > 0 {
+ // The destination part may have no rows if they are deleted during the merge.
+ dstPartPath = ph.Path(ptPath, mergeIdx)
+ }
+ fmt.Fprintf(&bb, "%s -> %s\n", tmpPartPath, dstPartPath)
+ txnPath := fmt.Sprintf("%s/txn/%016X", ptPath, mergeIdx)
+ if err := fs.WriteFileAtomically(txnPath, bb.B, false); err != nil {
+ return nil, fmt.Errorf("cannot create transaction file %q: %w", txnPath, err)
+ }
+
+ // Run the created transaction.
+ if err := runTransaction(&pt.snapshotLock, pt.smallPartsPath, pt.bigPartsPath, txnPath); err != nil {
+ return nil, fmt.Errorf("cannot execute transaction %q: %w", txnPath, err)
+ }
}
+ // Open the created part.
+ if ph.RowsCount == 0 {
+ // The created part is empty.
+ return nil, nil
+ }
+ if mpNew != nil {
+ // Open the created part from memory.
+ flushToDiskDeadline := getFlushToDiskDeadline(pws)
+ pwNew := newPartWrapperFromInmemoryPart(mpNew, flushToDiskDeadline)
+ return pwNew, nil
+ }
+ // Open the created part from disk.
+ pNew, err := openFilePart(dstPartPath)
+ if err != nil {
+ return nil, fmt.Errorf("cannot open merged part %q: %w", dstPartPath, err)
+ }
+ pwNew := &partWrapper{
+ p: pNew,
+ refCount: 1,
+ }
+ return pwNew, nil
+}
- // Create a transaction for atomic deleting old parts and moving
- // new part to its destination place.
- var bb bytesutil.ByteBuffer
+func areAllInmemoryParts(pws []*partWrapper) bool {
for _, pw := range pws {
if pw.mp == nil {
- fmt.Fprintf(&bb, "%s\n", pw.p.path)
+ return false
}
}
- dstPartPath := ""
- if ph.RowsCount > 0 {
- // The destination part may have no rows if they are deleted
- // during the merge due to deleted time series.
- dstPartPath = ph.Path(ptPath, mergeIdx)
- }
- fmt.Fprintf(&bb, "%s -> %s\n", tmpPartPath, dstPartPath)
- txnPath := fmt.Sprintf("%s/txn/%016X", ptPath, mergeIdx)
- if err := fs.WriteFileAtomically(txnPath, bb.B, false); err != nil {
- return fmt.Errorf("cannot create transaction file %q: %w", txnPath, err)
- }
+ return true
+}
- // Run the created transaction.
- if err := runTransaction(&pt.snapshotLock, pt.smallPartsPath, pt.bigPartsPath, txnPath); err != nil {
- return fmt.Errorf("cannot execute transaction %q: %w", txnPath, err)
- }
-
- var newPW *partWrapper
- var newPSize uint64
- if len(dstPartPath) > 0 {
- // Open the merged part if it is non-empty.
- newP, err := openFilePart(dstPartPath)
- if err != nil {
- return fmt.Errorf("cannot open merged part %q: %w", dstPartPath, err)
- }
- newPSize = newP.size
- newPW = &partWrapper{
- p: newP,
- refCount: 1,
- }
- }
-
- // Atomically remove old parts and add new part.
+func (pt *partition) swapSrcWithDstParts(pws []*partWrapper, pwNew *partWrapper, dstPartType partType) {
+ // Atomically unregister old parts and add new part to pt.
m := make(map[*partWrapper]bool, len(pws))
for _, pw := range pws {
m[pw] = true
}
if len(m) != len(pws) {
- logger.Panicf("BUG: %d duplicate parts found in the merge of %d parts", len(pws)-len(m), len(pws))
+ logger.Panicf("BUG: %d duplicate parts found when merging %d parts", len(pws)-len(m), len(pws))
}
+ removedInmemoryParts := 0
removedSmallParts := 0
removedBigParts := 0
+
pt.partsLock.Lock()
- pt.smallParts, removedSmallParts = removeParts(pt.smallParts, m, false)
- pt.bigParts, removedBigParts = removeParts(pt.bigParts, m, true)
- if newPW != nil {
- if isBigPart {
- pt.bigParts = append(pt.bigParts, newPW)
- } else {
- pt.smallParts = append(pt.smallParts, newPW)
+ pt.inmemoryParts, removedInmemoryParts = removeParts(pt.inmemoryParts, m)
+ pt.smallParts, removedSmallParts = removeParts(pt.smallParts, m)
+ pt.bigParts, removedBigParts = removeParts(pt.bigParts, m)
+ if pwNew != nil {
+ switch dstPartType {
+ case partInmemory:
+ pt.inmemoryParts = append(pt.inmemoryParts, pwNew)
+ case partSmall:
+ pt.smallParts = append(pt.smallParts, pwNew)
+ case partBig:
+ pt.bigParts = append(pt.bigParts, pwNew)
+ default:
+ logger.Panicf("BUG: unknown partType=%d", dstPartType)
}
}
pt.partsLock.Unlock()
- if removedSmallParts+removedBigParts != len(m) {
- logger.Panicf("BUG: unexpected number of parts removed; got %d, want %d", removedSmallParts+removedBigParts, len(m))
+
+ removedParts := removedInmemoryParts + removedSmallParts + removedBigParts
+ if removedParts != len(m) {
+ logger.Panicf("BUG: unexpected number of parts removed; got %d, want %d", removedParts, len(m))
}
// Remove partition references from old parts.
for _, pw := range pws {
pw.decRef()
}
-
- d := time.Since(startTime)
- if d > 30*time.Second {
- logger.Infof("merged %d rows across %d blocks in %.3f seconds at %d rows/sec to %q; sizeBytes: %d",
- outRowsCount, outBlocksCount, d.Seconds(), int(float64(outRowsCount)/d.Seconds()), dstPartPath, newPSize)
- }
-
- return nil
}
func getCompressLevel(rowsPerBlock float64) int {
@@ -1309,17 +1574,17 @@ func (pt *partition) nextMergeIdx() uint64 {
return atomic.AddUint64(&pt.mergeIdx, 1)
}
-func removeParts(pws []*partWrapper, partsToRemove map[*partWrapper]bool, isBig bool) ([]*partWrapper, int) {
- removedParts := 0
+func removeParts(pws []*partWrapper, partsToRemove map[*partWrapper]bool) ([]*partWrapper, int) {
dst := pws[:0]
for _, pw := range pws {
if !partsToRemove[pw] {
dst = append(dst, pw)
- continue
}
- removedParts++
}
- return dst, removedParts
+ for i := len(dst); i < len(pws); i++ {
+ pws[i] = nil
+ }
+ return dst, len(pws) - len(dst)
}
func (pt *partition) startStalePartsRemover() {
@@ -1349,9 +1614,9 @@ func (pt *partition) removeStaleParts() {
retentionDeadline := timestampFromTime(startTime) - pt.s.retentionMsecs
pt.partsLock.Lock()
- for _, pw := range pt.bigParts {
+ for _, pw := range pt.inmemoryParts {
if !pw.isInMerge && pw.p.ph.MaxTimestamp < retentionDeadline {
- atomic.AddUint64(&pt.bigRowsDeleted, pw.p.ph.RowsCount)
+ atomic.AddUint64(&pt.inmemoryRowsDeleted, pw.p.ph.RowsCount)
m[pw] = true
}
}
@@ -1361,28 +1626,38 @@ func (pt *partition) removeStaleParts() {
m[pw] = true
}
}
+ for _, pw := range pt.bigParts {
+ if !pw.isInMerge && pw.p.ph.MaxTimestamp < retentionDeadline {
+ atomic.AddUint64(&pt.bigRowsDeleted, pw.p.ph.RowsCount)
+ m[pw] = true
+ }
+ }
+ removedInmemoryParts := 0
removedSmallParts := 0
removedBigParts := 0
if len(m) > 0 {
- pt.smallParts, removedSmallParts = removeParts(pt.smallParts, m, false)
- pt.bigParts, removedBigParts = removeParts(pt.bigParts, m, true)
+ pt.inmemoryParts, removedInmemoryParts = removeParts(pt.inmemoryParts, m)
+ pt.smallParts, removedSmallParts = removeParts(pt.smallParts, m)
+ pt.bigParts, removedBigParts = removeParts(pt.bigParts, m)
}
pt.partsLock.Unlock()
- if removedSmallParts+removedBigParts != len(m) {
- logger.Panicf("BUG: unexpected number of stale parts removed; got %d, want %d", removedSmallParts+removedBigParts, len(m))
+ removedParts := removedInmemoryParts + removedSmallParts + removedBigParts
+ if removedParts != len(m) {
+ logger.Panicf("BUG: unexpected number of stale parts removed; got %d, want %d", removedParts, len(m))
}
// Physically remove stale parts under snapshotLock in order to provide
// consistent snapshots with table.CreateSnapshot().
pt.snapshotLock.RLock()
for pw := range m {
- logger.Infof("removing part %q, since its data is out of the configured retention (%d secs)", pw.p.path, pt.s.retentionMsecs/1000)
- fs.MustRemoveDirAtomic(pw.p.path)
+ if pw.mp == nil {
+ logger.Infof("removing part %q, since its data is out of the configured retention (%d secs)", pw.p.path, pt.s.retentionMsecs/1000)
+ fs.MustRemoveDirAtomic(pw.p.path)
+ }
}
// There is no need in calling fs.MustSyncPath() on pt.smallPartsPath and pt.bigPartsPath,
// since they should be automatically called inside fs.MustRemoveDirAtomic().
-
pt.snapshotLock.RUnlock()
// Remove partition references from removed parts.
@@ -1458,16 +1733,7 @@ func appendPartsToMerge(dst, src []*partWrapper, maxPartsToMerge int, maxOutByte
src = tmp
needFreeSpace := skippedBigParts > 1
- // Sort src parts by size and backwards timestamp.
- // This should improve adjanced points' locality in the merged parts.
- sort.Slice(src, func(i, j int) bool {
- a := src[i].p
- b := src[j].p
- if a.size == b.size {
- return a.ph.MinTimestamp > b.ph.MinTimestamp
- }
- return a.size < b.size
- })
+ sortPartsForOptimalMerge(src)
maxSrcParts := maxPartsToMerge
if maxSrcParts > len(src) {
@@ -1518,6 +1784,19 @@ func appendPartsToMerge(dst, src []*partWrapper, maxPartsToMerge int, maxOutByte
return append(dst, pws...), needFreeSpace
}
+func sortPartsForOptimalMerge(pws []*partWrapper) {
+ // Sort src parts by size and backwards timestamp.
+ // This should improve adjanced points' locality in the merged parts.
+ sort.Slice(pws, func(i, j int) bool {
+ a := pws[i].p
+ b := pws[j].p
+ if a.size == b.size {
+ return a.ph.MinTimestamp > b.ph.MinTimestamp
+ }
+ return a.size < b.size
+ })
+}
+
func getPartsSize(pws []*partWrapper) uint64 {
n := uint64(0)
for _, pw := range pws {
@@ -1534,7 +1813,7 @@ func openParts(pathPrefix1, pathPrefix2, path string) ([]*partWrapper, error) {
fs.MustRemoveTemporaryDirs(path)
d, err := os.Open(path)
if err != nil {
- return nil, fmt.Errorf("cannot open directory %q: %w", path, err)
+ return nil, fmt.Errorf("cannot open partition directory: %w", err)
}
defer fs.MustClose(d)
@@ -1616,10 +1895,7 @@ func (pt *partition) CreateSnapshotAt(smallPath, bigPath string) error {
startTime := time.Now()
// Flush inmemory data to disk.
- pt.flushPendingRows(true)
- if _, err := pt.flushInmemoryParts(nil, true); err != nil {
- return fmt.Errorf("cannot flush inmemory parts: %w", err)
- }
+ pt.flushInmemoryRows()
// The snapshot must be created under the lock in order to prevent from
// concurrent modifications via runTransaction.
@@ -1645,13 +1921,13 @@ func (pt *partition) createSnapshot(srcDir, dstDir string) error {
d, err := os.Open(srcDir)
if err != nil {
- return fmt.Errorf("cannot open difrectory: %w", err)
+ return fmt.Errorf("cannot open partition difrectory: %w", err)
}
defer fs.MustClose(d)
fis, err := d.Readdir(-1)
if err != nil {
- return fmt.Errorf("cannot read directory: %w", err)
+ return fmt.Errorf("cannot read partition directory: %w", err)
}
for _, fi := range fis {
fn := fi.Name()
@@ -1700,7 +1976,7 @@ func runTransactions(txnLock *sync.RWMutex, pathPrefix1, pathPrefix2, path strin
if os.IsNotExist(err) {
return nil
}
- return fmt.Errorf("cannot open %q: %w", txnDir, err)
+ return fmt.Errorf("cannot open transaction directory: %w", err)
}
defer fs.MustClose(d)
@@ -1764,30 +2040,32 @@ func runTransaction(txnLock *sync.RWMutex, pathPrefix1, pathPrefix2, txnPath str
// Move the new part to new directory.
srcPath := mvPaths[0]
dstPath := mvPaths[1]
- srcPath, err = validatePath(pathPrefix1, pathPrefix2, srcPath)
- if err != nil {
- return fmt.Errorf("invalid source path to rename: %w", err)
- }
- if len(dstPath) > 0 {
- // Move srcPath to dstPath.
- dstPath, err = validatePath(pathPrefix1, pathPrefix2, dstPath)
+ if len(srcPath) > 0 {
+ srcPath, err = validatePath(pathPrefix1, pathPrefix2, srcPath)
if err != nil {
- return fmt.Errorf("invalid destination path to rename: %w", err)
+ return fmt.Errorf("invalid source path to rename: %w", err)
}
- if fs.IsPathExist(srcPath) {
- if err := os.Rename(srcPath, dstPath); err != nil {
- return fmt.Errorf("cannot rename %q to %q: %w", srcPath, dstPath, err)
+ if len(dstPath) > 0 {
+ // Move srcPath to dstPath.
+ dstPath, err = validatePath(pathPrefix1, pathPrefix2, dstPath)
+ if err != nil {
+ return fmt.Errorf("invalid destination path to rename: %w", err)
}
- } else if !fs.IsPathExist(dstPath) {
- // Emit info message for the expected condition after unclean shutdown on NFS disk.
- // The dstPath part may be missing because it could be already merged into bigger part
- // while old source parts for the current txn weren't still deleted due to NFS locks.
- logger.Infof("cannot find both source and destination paths: %q -> %q; this may be the case after unclean shutdown (OOM, `kill -9`, hard reset) on NFS disk",
- srcPath, dstPath)
+ if fs.IsPathExist(srcPath) {
+ if err := os.Rename(srcPath, dstPath); err != nil {
+ return fmt.Errorf("cannot rename %q to %q: %w", srcPath, dstPath, err)
+ }
+ } else if !fs.IsPathExist(dstPath) {
+ // Emit info message for the expected condition after unclean shutdown on NFS disk.
+ // The dstPath part may be missing because it could be already merged into bigger part
+ // while old source parts for the current txn weren't still deleted due to NFS locks.
+ logger.Infof("cannot find both source and destination paths: %q -> %q; this may be the case after unclean shutdown "+
+ "(OOM, `kill -9`, hard reset) on NFS disk", srcPath, dstPath)
+ }
+ } else {
+ // Just remove srcPath.
+ fs.MustRemoveDirAtomic(srcPath)
}
- } else {
- // Just remove srcPath.
- fs.MustRemoveDirAtomic(srcPath)
}
// Flush pathPrefix* directory metadata to the underying storage,
diff --git a/lib/storage/partition_search_test.go b/lib/storage/partition_search_test.go
index b0e39ef7d0..afd5b7fce6 100644
--- a/lib/storage/partition_search_test.go
+++ b/lib/storage/partition_search_test.go
@@ -181,11 +181,12 @@ func testPartitionSearchEx(t *testing.T, ptt int64, tr TimeRange, partsCount, ma
t.Fatalf("cannot remove big parts directory: %s", err)
}
}()
+ var tmpRows []rawRow
for _, rows := range rowss {
pt.AddRows(rows)
- // Flush just added rows to a separate partition.
- pt.flushPendingRows(true)
+ // Flush just added rows to a separate partitions.
+ tmpRows = pt.flushPendingRows(tmpRows[:0], true)
}
testPartitionSearch(t, pt, tsids, tr, rbsExpected, -1)
pt.MustClose()
@@ -232,8 +233,7 @@ func testPartitionSearchSerial(pt *partition, tsids []TSID, tr TimeRange, rbsExp
// due to the race with raw rows flusher.
var m partitionMetrics
pt.UpdateMetrics(&m)
- rowsCount := m.BigRowsCount + m.SmallRowsCount
- if rowsCount != uint64(rowsCountExpected) {
+ if rowsCount := m.TotalRowsCount(); rowsCount != uint64(rowsCountExpected) {
return fmt.Errorf("unexpected rows count; got %d; want %d", rowsCount, rowsCountExpected)
}
}
@@ -258,8 +258,7 @@ func testPartitionSearchSerial(pt *partition, tsids []TSID, tr TimeRange, rbsExp
if rowsCountExpected >= 0 {
var m partitionMetrics
pt.UpdateMetrics(&m)
- rowsCount := m.BigRowsCount + m.SmallRowsCount
- if rowsCount != uint64(rowsCountExpected) {
+ if rowsCount := m.TotalRowsCount(); rowsCount != uint64(rowsCountExpected) {
return fmt.Errorf("unexpected rows count after search; got %d; want %d", rowsCount, rowsCountExpected)
}
}
diff --git a/lib/storage/storage_test.go b/lib/storage/storage_test.go
index d4d330a7e7..4dbc627007 100644
--- a/lib/storage/storage_test.go
+++ b/lib/storage/storage_test.go
@@ -454,7 +454,7 @@ func TestStorageOpenMultipleTimes(t *testing.T) {
func TestStorageRandTimestamps(t *testing.T) {
path := "TestStorageRandTimestamps"
- retentionMsecs := int64(60 * msecsPerMonth)
+ retentionMsecs := int64(10 * msecsPerMonth)
s, err := OpenStorage(path, retentionMsecs, 0, 0)
if err != nil {
t.Fatalf("cannot open storage: %s", err)
@@ -462,10 +462,13 @@ func TestStorageRandTimestamps(t *testing.T) {
t.Run("serial", func(t *testing.T) {
for i := 0; i < 3; i++ {
if err := testStorageRandTimestamps(s); err != nil {
- t.Fatal(err)
+ t.Fatalf("error on iteration %d: %s", i, err)
}
s.MustClose()
s, err = OpenStorage(path, retentionMsecs, 0, 0)
+ if err != nil {
+ t.Fatalf("cannot open storage on iteration %d: %s", i, err)
+ }
}
})
t.Run("concurrent", func(t *testing.T) {
@@ -479,14 +482,15 @@ func TestStorageRandTimestamps(t *testing.T) {
ch <- err
}()
}
+ tt := time.NewTimer(time.Second * 10)
for i := 0; i < cap(ch); i++ {
select {
case err := <-ch:
if err != nil {
- t.Fatal(err)
+ t.Fatalf("error on iteration %d: %s", i, err)
}
- case <-time.After(time.Second * 10):
- t.Fatal("timeout")
+ case <-tt.C:
+ t.Fatalf("timeout on iteration %d", i)
}
}
})
@@ -497,9 +501,9 @@ func TestStorageRandTimestamps(t *testing.T) {
}
func testStorageRandTimestamps(s *Storage) error {
- const rowsPerAdd = 1e3
- const addsCount = 2
- typ := reflect.TypeOf(int64(0))
+ currentTime := timestampFromTime(time.Now())
+ const rowsPerAdd = 5e3
+ const addsCount = 3
rnd := rand.New(rand.NewSource(1))
for i := 0; i < addsCount; i++ {
@@ -512,15 +516,8 @@ func testStorageRandTimestamps(s *Storage) error {
for j := 0; j < rowsPerAdd; j++ {
mn.MetricGroup = []byte(fmt.Sprintf("metric_%d", rand.Intn(100)))
metricNameRaw := mn.marshalRaw(nil)
- timestamp := int64(rnd.NormFloat64() * 1e12)
- if j%2 == 0 {
- ts, ok := quick.Value(typ, rnd)
- if !ok {
- return fmt.Errorf("cannot create random timestamp via quick.Value")
- }
- timestamp = ts.Interface().(int64)
- }
- value := rnd.NormFloat64() * 1e12
+ timestamp := currentTime - int64((rnd.Float64()-0.2)*float64(2*s.retentionMsecs))
+ value := rnd.NormFloat64() * 1e11
mr := MetricRow{
MetricNameRaw: metricNameRaw,
@@ -540,8 +537,8 @@ func testStorageRandTimestamps(s *Storage) error {
// Verify the storage contains rows.
var m Metrics
s.UpdateMetrics(&m)
- if m.TableMetrics.SmallRowsCount == 0 {
- return fmt.Errorf("expecting at least one row in the table")
+ if rowsCount := m.TableMetrics.TotalRowsCount(); rowsCount == 0 {
+ return fmt.Errorf("expecting at least one row in storage")
}
return nil
}
@@ -592,14 +589,15 @@ func TestStorageDeleteSeries(t *testing.T) {
ch <- err
}(i)
}
+ tt := time.NewTimer(30 * time.Second)
for i := 0; i < cap(ch); i++ {
select {
case err := <-ch:
if err != nil {
- t.Fatalf("unexpected error: %s", err)
+ t.Fatalf("unexpected error on iteration %d: %s", i, err)
}
- case <-time.After(30 * time.Second):
- t.Fatalf("timeout")
+ case <-tt.C:
+ t.Fatalf("timeout on iteration %d", i)
}
}
})
@@ -932,7 +930,8 @@ func testStorageRegisterMetricNames(s *Storage) error {
func TestStorageAddRowsSerial(t *testing.T) {
path := "TestStorageAddRowsSerial"
- s, err := OpenStorage(path, 0, 1e5, 1e5)
+ retentionMsecs := int64(msecsPerMonth * 10)
+ s, err := OpenStorage(path, retentionMsecs, 1e5, 1e5)
if err != nil {
t.Fatalf("cannot open storage: %s", err)
}
@@ -947,7 +946,8 @@ func TestStorageAddRowsSerial(t *testing.T) {
func TestStorageAddRowsConcurrent(t *testing.T) {
path := "TestStorageAddRowsConcurrent"
- s, err := OpenStorage(path, 0, 1e5, 1e5)
+ retentionMsecs := int64(msecsPerMonth * 10)
+ s, err := OpenStorage(path, retentionMsecs, 1e5, 1e5)
if err != nil {
t.Fatalf("cannot open storage: %s", err)
}
@@ -1000,8 +1000,10 @@ func testStorageAddRows(s *Storage) error {
const rowsPerAdd = 1e3
const addsCount = 10
+ maxTimestamp := timestampFromTime(time.Now())
+ minTimestamp := maxTimestamp - s.retentionMsecs
for i := 0; i < addsCount; i++ {
- mrs := testGenerateMetricRows(rowsPerAdd, 0, 1e10)
+ mrs := testGenerateMetricRows(rowsPerAdd, minTimestamp, maxTimestamp)
if err := s.AddRows(mrs, defaultPrecisionBits); err != nil {
return fmt.Errorf("unexpected error when adding mrs: %w", err)
}
@@ -1011,8 +1013,8 @@ func testStorageAddRows(s *Storage) error {
minRowsExpected := uint64(rowsPerAdd * addsCount)
var m Metrics
s.UpdateMetrics(&m)
- if m.TableMetrics.SmallRowsCount < minRowsExpected {
- return fmt.Errorf("expecting at least %d rows in the table; got %d", minRowsExpected, m.TableMetrics.SmallRowsCount)
+ if rowsCount := m.TableMetrics.TotalRowsCount(); rowsCount < minRowsExpected {
+ return fmt.Errorf("expecting at least %d rows in the table; got %d", minRowsExpected, rowsCount)
}
// Try creating a snapshot from the storage.
@@ -1040,8 +1042,8 @@ func testStorageAddRows(s *Storage) error {
// Verify the snapshot contains rows
var m1 Metrics
s1.UpdateMetrics(&m1)
- if m1.TableMetrics.SmallRowsCount < minRowsExpected {
- return fmt.Errorf("snapshot %q must contain at least %d rows; got %d", snapshotPath, minRowsExpected, m1.TableMetrics.SmallRowsCount)
+ if rowsCount := m1.TableMetrics.TotalRowsCount(); rowsCount < minRowsExpected {
+ return fmt.Errorf("snapshot %q must contain at least %d rows; got %d", snapshotPath, minRowsExpected, rowsCount)
}
// Verify that force merge for the snapshot leaves only a single part per partition.
@@ -1155,22 +1157,25 @@ func testStorageAddMetrics(s *Storage, workerNum int) error {
minRowsExpected := uint64(rowsCount)
var m Metrics
s.UpdateMetrics(&m)
- if m.TableMetrics.SmallRowsCount < minRowsExpected {
- return fmt.Errorf("expecting at least %d rows in the table; got %d", minRowsExpected, m.TableMetrics.SmallRowsCount)
+ if rowsCount := m.TableMetrics.TotalRowsCount(); rowsCount < minRowsExpected {
+ return fmt.Errorf("expecting at least %d rows in the table; got %d", minRowsExpected, rowsCount)
}
return nil
}
func TestStorageDeleteStaleSnapshots(t *testing.T) {
path := "TestStorageDeleteStaleSnapshots"
- s, err := OpenStorage(path, 0, 1e5, 1e5)
+ retentionMsecs := int64(msecsPerMonth * 10)
+ s, err := OpenStorage(path, retentionMsecs, 1e5, 1e5)
if err != nil {
t.Fatalf("cannot open storage: %s", err)
}
const rowsPerAdd = 1e3
const addsCount = 10
+ maxTimestamp := timestampFromTime(time.Now())
+ minTimestamp := maxTimestamp - s.retentionMsecs
for i := 0; i < addsCount; i++ {
- mrs := testGenerateMetricRows(rowsPerAdd, 0, 1e10)
+ mrs := testGenerateMetricRows(rowsPerAdd, minTimestamp, maxTimestamp)
if err := s.AddRows(mrs, defaultPrecisionBits); err != nil {
t.Fatalf("unexpected error when adding mrs: %s", err)
}
diff --git a/lib/storage/table.go b/lib/storage/table.go
index e4b6030449..5eca5e4a3a 100644
--- a/lib/storage/table.go
+++ b/lib/storage/table.go
@@ -215,15 +215,16 @@ func (tb *table) MustClose() {
}
}
-// flushPendingRows flushes all the pending rows, so they become visible to search.
+// flushPendingRows flushes all the pending raw rows, so they become visible to search.
//
// This function is for debug purposes only.
func (tb *table) flushPendingRows() {
ptws := tb.GetPartitions(nil)
defer tb.PutPartitions(ptws)
+ var rows []rawRow
for _, ptw := range ptws {
- ptw.pt.flushPendingRows(true)
+ rows = ptw.pt.flushPendingRows(rows[:0], true)
}
}
@@ -524,7 +525,7 @@ func openPartitions(smallPartitionsPath, bigPartitionsPath string, s *Storage) (
func populatePartitionNames(partitionsPath string, ptNames map[string]bool) error {
d, err := os.Open(partitionsPath)
if err != nil {
- return fmt.Errorf("cannot open directory with partitions %q: %w", partitionsPath, err)
+ return fmt.Errorf("cannot open directory with partitions: %w", err)
}
defer fs.MustClose(d)
diff --git a/lib/storage/table_search_test.go b/lib/storage/table_search_test.go
index 17e1f5b86c..fb28939d62 100644
--- a/lib/storage/table_search_test.go
+++ b/lib/storage/table_search_test.go
@@ -35,7 +35,7 @@ func TestTableSearch(t *testing.T) {
MinTimestamp: trData.MinTimestamp + 4e3,
MaxTimestamp: trData.MaxTimestamp - 4e3,
}
- testTableSearchEx(t, trData, trSearch, 12, 100, 1, 10)
+ testTableSearchEx(t, trData, trSearch, 12, 20, 1, 10)
})
t.Run("SingleTSID", func(t *testing.T) {
@@ -51,7 +51,7 @@ func TestTableSearch(t *testing.T) {
MinTimestamp: trData.MinTimestamp + 4e3,
MaxTimestamp: trData.MaxTimestamp - 4e3,
}
- testTableSearchEx(t, trData, trSearch, 60, 20, 30, 20)
+ testTableSearchEx(t, trData, trSearch, 20, 10, 30, 20)
})
t.Run("ManyTSIDs", func(t *testing.T) {
@@ -244,8 +244,7 @@ func testTableSearchSerial(tb *table, tsids []TSID, tr TimeRange, rbsExpected []
// they may race with raw rows flusher.
var m TableMetrics
tb.UpdateMetrics(&m)
- rowsCount := m.BigRowsCount + m.SmallRowsCount
- if rowsCount != uint64(rowsCountExpected) {
+ if rowsCount := m.TotalRowsCount(); rowsCount != uint64(rowsCountExpected) {
return fmt.Errorf("unexpected rows count in the table; got %d; want %d", rowsCount, rowsCountExpected)
}
}
@@ -270,8 +269,7 @@ func testTableSearchSerial(tb *table, tsids []TSID, tr TimeRange, rbsExpected []
if rowsCountExpected >= 0 {
var m TableMetrics
tb.UpdateMetrics(&m)
- rowsCount := m.BigRowsCount + m.SmallRowsCount
- if rowsCount != uint64(rowsCountExpected) {
+ if rowsCount := m.TotalRowsCount(); rowsCount != uint64(rowsCountExpected) {
return fmt.Errorf("unexpected rows count in the table; got %d; want %d", rowsCount, rowsCountExpected)
}
}
diff --git a/lib/storage/table_search_timing_test.go b/lib/storage/table_search_timing_test.go
index cf046c5137..eb1a72b67f 100644
--- a/lib/storage/table_search_timing_test.go
+++ b/lib/storage/table_search_timing_test.go
@@ -55,9 +55,8 @@ func openBenchTable(b *testing.B, startTimestamp int64, rowsPerInsert, rowsCount
rowsCountExpected := insertsCount * uint64(rowsPerInsert)
var m TableMetrics
tb.UpdateMetrics(&m)
- rowsCountActual := m.BigRowsCount + m.SmallRowsCount
- if rowsCountActual != rowsCountExpected {
- b.Fatalf("unexpected rows count in the table %q; got %d; want %d", path, rowsCountActual, rowsCountExpected)
+ if rowsCount := m.TotalRowsCount(); rowsCount != rowsCountExpected {
+ b.Fatalf("unexpected rows count in the table %q; got %d; want %d", path, rowsCount, rowsCountExpected)
}
return tb
diff --git a/lib/storage/table_timing_test.go b/lib/storage/table_timing_test.go
index 0f7ae00d1c..11a3766fdd 100644
--- a/lib/storage/table_timing_test.go
+++ b/lib/storage/table_timing_test.go
@@ -101,8 +101,7 @@ func benchmarkTableAddRows(b *testing.B, rowsPerInsert, tsidsCount int) {
}
var m TableMetrics
tb.UpdateMetrics(&m)
- rowsCount := m.BigRowsCount + m.SmallRowsCount
- if rowsCount != uint64(rowsCountExpected) {
+ if rowsCount := m.TotalRowsCount(); rowsCount != uint64(rowsCountExpected) {
b.Fatalf("unexpected rows count in the final table %q: got %d; want %d", tablePath, rowsCount, rowsCountExpected)
}
tb.MustClose()
From f3e84b4deaa003051d57a72586cdd201c8ce91b0 Mon Sep 17 00:00:00 2001
From: Aliaksandr Valialkin
Date: Mon, 5 Dec 2022 15:59:52 -0800
Subject: [PATCH 25/38] {dashboards,alerts}: subtitute `{type="indexdb"}` with
`{type=~"indexdb.*"}` inside queries after
8189770c50165b62867327ad388f2c2ef237ab6f
Updates https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3337
---
README.md | 2 +-
dashboards/victoriametrics-cluster.json | 18 +++++++++---------
dashboards/victoriametrics.json | 12 ++++++------
deployment/docker/alerts-cluster.yml | 4 ++--
deployment/docker/alerts.yml | 4 ++--
docs/CHANGELOG.md | 2 +-
docs/README.md | 2 +-
docs/Single-server-VictoriaMetrics.md | 2 +-
8 files changed, 23 insertions(+), 23 deletions(-)
diff --git a/README.md b/README.md
index c19d003e3c..c697791ee8 100644
--- a/README.md
+++ b/README.md
@@ -1745,7 +1745,7 @@ and [cardinality explorer docs](#cardinality-explorer).
by requesting `/internal/force_flush` http handler. This handler is mostly needed for testing and debugging purposes.
* The last few seconds of inserted data may be lost on unclean shutdown (i.e. OOM, `kill -9` or hardware reset).
The `-inmemoryDataFlushInterval` command-line flag allows controlling the frequency of in-memory data flush to persistent storage.
- See [this article for technical details](https://valyala.medium.com/wal-usage-looks-broken-in-modern-time-series-databases-b62a627ab704).
+ See [storage docs](#storage) and [this article](https://valyala.medium.com/wal-usage-looks-broken-in-modern-time-series-databases-b62a627ab704) for more details.
* If VictoriaMetrics works slowly and eats more than a CPU core per 100K ingested data points per second,
then it is likely you have too many [active time series](https://docs.victoriametrics.com/FAQ.html#what-is-an-active-time-series) for the current amount of RAM.
diff --git a/dashboards/victoriametrics-cluster.json b/dashboards/victoriametrics-cluster.json
index 1274cd6f27..98d9f20acb 100644
--- a/dashboards/victoriametrics-cluster.json
+++ b/dashboards/victoriametrics-cluster.json
@@ -179,7 +179,7 @@
"uid": "$ds"
},
"exemplar": true,
- "expr": "sum(vm_rows{job=~\"$job_storage\", type!=\"indexdb\"})",
+ "expr": "sum(vm_rows{job=~\"$job_storage\", type!~\"indexdb.*\"})",
"format": "time_series",
"instant": true,
"interval": "",
@@ -599,7 +599,7 @@
"uid": "$ds"
},
"exemplar": true,
- "expr": "sum(vm_data_size_bytes{job=~\"$job_storage\", type!=\"indexdb\"}) / sum(vm_rows{job=~\"$job_storage\", type!=\"indexdb\"})",
+ "expr": "sum(vm_data_size_bytes{job=~\"$job_storage\", type!~\"indexdb.*\"}) / sum(vm_rows{job=~\"$job_storage\", type!~\"indexdb.*\"})",
"format": "time_series",
"instant": true,
"interval": "",
@@ -4484,7 +4484,7 @@
"uid": "$ds"
},
"editorMode": "code",
- "expr": "min(vm_free_disk_space_bytes{job=~\"$job_storage\", instance=~\"$instance\"} \n/ \nignoring(path) (\n (\n rate(vm_rows_added_to_storage_total{job=~\"$job_storage\", instance=~\"$instance\"}[1d])\n - \n ignoring(type) rate(vm_deduplicated_samples_total{job=~\"$job_storage\", instance=~\"$instance\", type=\"merge\"}[1d])\n ) * scalar(\n sum(vm_data_size_bytes{job=~\"$job_storage\", instance=~\"$instance\", type!=\"indexdb\"})\n / \n sum(vm_rows{job=~\"$job_storage\", instance=~\"$instance\", type!=\"indexdb\"})\n )\n))",
+ "expr": "min(vm_free_disk_space_bytes{job=~\"$job_storage\", instance=~\"$instance\"} \n/ \nignoring(path) (\n (\n rate(vm_rows_added_to_storage_total{job=~\"$job_storage\", instance=~\"$instance\"}[1d])\n - \n ignoring(type) rate(vm_deduplicated_samples_total{job=~\"$job_storage\", instance=~\"$instance\", type=\"merge\"}[1d])\n ) * scalar(\n sum(vm_data_size_bytes{job=~\"$job_storage\", instance=~\"$instance\", type!~\"indexdb.*\"})\n / \n sum(vm_rows{job=~\"$job_storage\", instance=~\"$instance\", type!~\"indexdb.*\"})\n )\n))",
"format": "time_series",
"interval": "",
"intervalFactor": 1,
@@ -5584,7 +5584,7 @@
"uid": "$ds"
},
"editorMode": "code",
- "expr": "max(\n sum(vm_data_size_bytes{job=~\"$job\", instance=~\"$instance\", type=\"indexdb\"}) by(job, instance)\n / \n sum(vm_data_size_bytes{job=~\"$job\", instance=~\"$instance\"}) by(job, instance)\n)",
+ "expr": "max(\n sum(vm_data_size_bytes{job=~\"$job\", instance=~\"$instance\", type=~\"indexdb.*\"}) by(job, instance)\n / \n sum(vm_data_size_bytes{job=~\"$job\", instance=~\"$instance\"}) by(job, instance)\n)",
"format": "time_series",
"intervalFactor": 1,
"legendFormat": "indexdb",
@@ -5597,7 +5597,7 @@
"uid": "$ds"
},
"editorMode": "code",
- "expr": "max(\n sum(vm_data_size_bytes{job=~\"$job\", instance=~\"$instance\", type!=\"indexdb\"}) by(job, instance)\n / \n sum(vm_data_size_bytes{job=~\"$job\", instance=~\"$instance\"}) by(job, instance)\n)",
+ "expr": "max(\n sum(vm_data_size_bytes{job=~\"$job\", instance=~\"$instance\", type!~\"indexdb.*\"}) by(job, instance)\n / \n sum(vm_data_size_bytes{job=~\"$job\", instance=~\"$instance\"}) by(job, instance)\n)",
"format": "time_series",
"hide": false,
"intervalFactor": 1,
@@ -8374,7 +8374,7 @@
"uid": "$ds"
},
"editorMode": "code",
- "expr": "vm_free_disk_space_bytes{job=~\"$job_storage\", instance=~\"$instance\"} \n/ \nignoring(path) (\n (\n rate(vm_rows_added_to_storage_total{job=~\"$job_storage\", instance=~\"$instance\"}[1d])\n - \n ignoring(type) rate(vm_deduplicated_samples_total{job=~\"$job_storage\", instance=~\"$instance\", type=\"merge\"}[1d])\n ) * scalar(\n sum(vm_data_size_bytes{job=~\"$job_storage\", instance=~\"$instance\", type!=\"indexdb\"})\n / \n sum(vm_rows{job=~\"$job_storage\", instance=~\"$instance\", type!=\"indexdb\"})\n )\n)",
+ "expr": "vm_free_disk_space_bytes{job=~\"$job_storage\", instance=~\"$instance\"} \n/ \nignoring(path) (\n (\n rate(vm_rows_added_to_storage_total{job=~\"$job_storage\", instance=~\"$instance\"}[1d])\n - \n ignoring(type) rate(vm_deduplicated_samples_total{job=~\"$job_storage\", instance=~\"$instance\", type=\"merge\"}[1d])\n ) * scalar(\n sum(vm_data_size_bytes{job=~\"$job_storage\", instance=~\"$instance\", type!~\"indexdb.*\"})\n / \n sum(vm_rows{job=~\"$job_storage\", instance=~\"$instance\", type!~\"indexdb.*\"})\n )\n)",
"format": "time_series",
"interval": "",
"intervalFactor": 1,
@@ -8579,7 +8579,7 @@
"uid": "$ds"
},
"editorMode": "code",
- "expr": "sum(vm_data_size_bytes{job=~\"$job\", instance=~\"$instance\", type=\"indexdb\"}) by(job, instance)",
+ "expr": "sum(vm_data_size_bytes{job=~\"$job\", instance=~\"$instance\", type=~\"indexdb.*\"}) by(job, instance)",
"format": "time_series",
"intervalFactor": 1,
"legendFormat": "{{job}}:{{instance}} (indexdb)",
@@ -8592,7 +8592,7 @@
"uid": "$ds"
},
"editorMode": "code",
- "expr": "sum(vm_data_size_bytes{job=~\"$job\", instance=~\"$instance\", type!=\"indexdb\"}) by(job, instance)",
+ "expr": "sum(vm_data_size_bytes{job=~\"$job\", instance=~\"$instance\", type!~\"indexdb.*\"}) by(job, instance)",
"format": "time_series",
"hide": false,
"intervalFactor": 1,
@@ -8791,4 +8791,4 @@
"uid": "oS7Bi_0Wz",
"version": 1,
"weekStart": ""
-}
\ No newline at end of file
+}
diff --git a/dashboards/victoriametrics.json b/dashboards/victoriametrics.json
index f5bce5bd0a..9975145de5 100644
--- a/dashboards/victoriametrics.json
+++ b/dashboards/victoriametrics.json
@@ -225,7 +225,7 @@
"uid": "$ds"
},
"exemplar": false,
- "expr": "sum(vm_rows{job=~\"$job\", instance=~\"$instance\", type!=\"indexdb\"})",
+ "expr": "sum(vm_rows{job=~\"$job\", instance=~\"$instance\", type!~\"indexdb.*\"})",
"format": "time_series",
"instant": true,
"interval": "",
@@ -3767,7 +3767,7 @@
"uid": "$ds"
},
"editorMode": "code",
- "expr": "vm_free_disk_space_bytes{job=~\"$job\", instance=~\"$instance\"} \n/ ignoring(path) (\n (\n rate(vm_rows_added_to_storage_total{job=~\"$job\", instance=~\"$instance\"}[1d]) \n - ignoring(type) rate(vm_deduplicated_samples_total{job=~\"$job\", instance=~\"$instance\", type=\"merge\"}[1d])\n ) * scalar(\n sum(vm_data_size_bytes{job=~\"$job\", instance=~\"$instance\", type!=\"indexdb\"}) \n / sum(vm_rows{job=~\"$job\", instance=~\"$instance\", type!=\"indexdb\"})\n )\n )",
+ "expr": "vm_free_disk_space_bytes{job=~\"$job\", instance=~\"$instance\"} \n/ ignoring(path) (\n (\n rate(vm_rows_added_to_storage_total{job=~\"$job\", instance=~\"$instance\"}[1d]) \n - ignoring(type) rate(vm_deduplicated_samples_total{job=~\"$job\", instance=~\"$instance\", type=\"merge\"}[1d])\n ) * scalar(\n sum(vm_data_size_bytes{job=~\"$job\", instance=~\"$instance\", type!~\"indexdb.*\"}) \n / sum(vm_rows{job=~\"$job\", instance=~\"$instance\", type!~\"indexdb.*\"})\n )\n )",
"format": "time_series",
"hide": false,
"interval": "",
@@ -3874,7 +3874,7 @@
"uid": "$ds"
},
"editorMode": "code",
- "expr": "sum(vm_data_size_bytes{job=~\"$job\", instance=~\"$instance\", type!=\"indexdb\"})",
+ "expr": "sum(vm_data_size_bytes{job=~\"$job\", instance=~\"$instance\", type!~\"indexdb.*\"})",
"format": "time_series",
"interval": "",
"intervalFactor": 1,
@@ -3900,7 +3900,7 @@
"uid": "$ds"
},
"editorMode": "code",
- "expr": "sum(vm_data_size_bytes{job=~\"$job\", instance=~\"$instance\", type=\"indexdb\"})",
+ "expr": "sum(vm_data_size_bytes{job=~\"$job\", instance=~\"$instance\", type=~\"indexdb.*\"})",
"format": "time_series",
"hide": false,
"interval": "",
@@ -4156,7 +4156,7 @@
"type": "prometheus",
"uid": "$ds"
},
- "expr": "sum(vm_rows{job=~\"$job\", instance=~\"$instance\", type != \"indexdb\"})",
+ "expr": "sum(vm_rows{job=~\"$job\", instance=~\"$instance\", type!~\"indexdb.*\"})",
"format": "time_series",
"interval": "",
"intervalFactor": 1,
@@ -5306,4 +5306,4 @@
"uid": "wNf0q_kZk",
"version": 1,
"weekStart": ""
-}
\ No newline at end of file
+}
diff --git a/deployment/docker/alerts-cluster.yml b/deployment/docker/alerts-cluster.yml
index 15c305452c..3e68bd6e36 100644
--- a/deployment/docker/alerts-cluster.yml
+++ b/deployment/docker/alerts-cluster.yml
@@ -18,8 +18,8 @@ groups:
ignoring(type) rate(vm_deduplicated_samples_total{type="merge"}[1d])
)
* scalar(
- sum(vm_data_size_bytes{type!="indexdb"}) /
- sum(vm_rows{type!="indexdb"})
+ sum(vm_data_size_bytes{type!~"indexdb.*"}) /
+ sum(vm_rows{type!~"indexdb.*"})
)
) < 3 * 24 * 3600 > 0
for: 30m
diff --git a/deployment/docker/alerts.yml b/deployment/docker/alerts.yml
index 5d478f0c76..efa3c5f7e7 100644
--- a/deployment/docker/alerts.yml
+++ b/deployment/docker/alerts.yml
@@ -18,8 +18,8 @@ groups:
ignoring(type) rate(vm_deduplicated_samples_total{type="merge"}[1d])
)
* scalar(
- sum(vm_data_size_bytes{type!="indexdb"}) /
- sum(vm_rows{type!="indexdb"})
+ sum(vm_data_size_bytes{type!~"indexdb.*"}) /
+ sum(vm_rows{type!~"indexdb.*"})
)
) < 3 * 24 * 3600 > 0
for: 30m
diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md
index 96694cc09d..e6a92f3b5c 100644
--- a/docs/CHANGELOG.md
+++ b/docs/CHANGELOG.md
@@ -17,7 +17,7 @@ The following tip changes can be tested by building VictoriaMetrics components f
**Update note 1:** this release drops support for direct upgrade from VictoriaMetrics versions prior [v1.28.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.28.0). Please upgrade to `v1.84.0`, wait until `finished round 2 of background conversion` line is emitted to log by single-node VictoriaMetrics or by `vmstorage`, and then upgrade to newer releases.
-**Update note 2:** this release splits `type="indexdb"` metrics into `type="indexdb/inmemory"` and `type="indexdb/file"` metrics. This may break old dashboards and alerting rules, which contain label filters on `{type="indexdb"}`. It is recommended upgrading to the latest available dashboards and alerting rules mentioned in [these docs](https://docs.victoriametrics.com/#monitoring).
+**Update note 2:** this release splits `type="indexdb"` metrics into `type="indexdb/inmemory"` and `type="indexdb/file"` metrics. This may break old dashboards and alerting rules, which contain [label filter](https://docs.victoriametrics.com/keyConcepts.html#filtering) on `{type="indexdb"}`. Such label filter must be substituted with `{type=~"indexdb.*"}`, so it matches `indexdb` from the previous releases and `indexdb/inmemory` + `indexdb/file` from new releases. It is recommended upgrading to the latest available dashboards and alerting rules mentioned in [these docs](https://docs.victoriametrics.com/#monitoring), since they already contain fixed label filters.
* FEATURE: add `-inmemoryDataFlushInterval` command-line flag, which can be used for controlling the frequency of in-memory data flush to disk. The data flush frequency can be reduced when VictoriaMetrics stores data to low-end flash device with limited number of write cycles (for example, on Raspberry PI). See [this feature request](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3337).
* FEATURE: expose additional metrics for `indexdb` and `storage` parts stored in memory and for `indexdb` parts stored in files (see [storage docs](https://docs.victoriametrics.com/#storage) for technical details):
diff --git a/docs/README.md b/docs/README.md
index 1fe27c686d..7a716a12eb 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -1746,7 +1746,7 @@ and [cardinality explorer docs](#cardinality-explorer).
by requesting `/internal/force_flush` http handler. This handler is mostly needed for testing and debugging purposes.
* The last few seconds of inserted data may be lost on unclean shutdown (i.e. OOM, `kill -9` or hardware reset).
The `-inmemoryDataFlushInterval` command-line flag allows controlling the frequency of in-memory data flush to persistent storage.
- See [this article for technical details](https://valyala.medium.com/wal-usage-looks-broken-in-modern-time-series-databases-b62a627ab704).
+ See [storage docs](#storage) and [this article](https://valyala.medium.com/wal-usage-looks-broken-in-modern-time-series-databases-b62a627ab704) for more details.
* If VictoriaMetrics works slowly and eats more than a CPU core per 100K ingested data points per second,
then it is likely you have too many [active time series](https://docs.victoriametrics.com/FAQ.html#what-is-an-active-time-series) for the current amount of RAM.
diff --git a/docs/Single-server-VictoriaMetrics.md b/docs/Single-server-VictoriaMetrics.md
index ed764040bc..8fe2a4103f 100644
--- a/docs/Single-server-VictoriaMetrics.md
+++ b/docs/Single-server-VictoriaMetrics.md
@@ -1749,7 +1749,7 @@ and [cardinality explorer docs](#cardinality-explorer).
by requesting `/internal/force_flush` http handler. This handler is mostly needed for testing and debugging purposes.
* The last few seconds of inserted data may be lost on unclean shutdown (i.e. OOM, `kill -9` or hardware reset).
The `-inmemoryDataFlushInterval` command-line flag allows controlling the frequency of in-memory data flush to persistent storage.
- See [this article for technical details](https://valyala.medium.com/wal-usage-looks-broken-in-modern-time-series-databases-b62a627ab704).
+ See [storage docs](#storage) and [this article](https://valyala.medium.com/wal-usage-looks-broken-in-modern-time-series-databases-b62a627ab704) for more details.
* If VictoriaMetrics works slowly and eats more than a CPU core per 100K ingested data points per second,
then it is likely you have too many [active time series](https://docs.victoriametrics.com/FAQ.html#what-is-an-active-time-series) for the current amount of RAM.
From 86c31f2955c291da5bb652bffa9e0d5bfd59c96e Mon Sep 17 00:00:00 2001
From: Zakhar Bessarab
Date: Tue, 6 Dec 2022 05:18:09 +0400
Subject: [PATCH 26/38] app/vmctl: add option to migrate between clusters with
automatic tenants discovery (#3450)
---
app/vmctl/README.md | 74 +++++++++++++++++++++++++++++
app/vmctl/flags.go | 8 ++++
app/vmctl/main.go | 3 +-
app/vmctl/vm_native.go | 104 +++++++++++++++++++++++++++++++++--------
docs/CHANGELOG.md | 1 +
5 files changed, 169 insertions(+), 21 deletions(-)
diff --git a/app/vmctl/README.md b/app/vmctl/README.md
index 21a03138fa..38be9a1c72 100644
--- a/app/vmctl/README.md
+++ b/app/vmctl/README.md
@@ -833,6 +833,80 @@ Total: 16 B ↗ Speed: 186.32 KiB p/s
2022/08/30 19:48:24 Total time: 12.680582ms
```
+#### Cluster-to-cluster migration mode
+
+Using cluster-to-cluster migration mode helps to migrate all tenants data in a single `vmctl` run.
+
+Cluster-to-cluster uses `/admin/tenants` endpoint (available starting from [v1.84.0](https://docs.victoriametrics.com/CHANGELOG.html#v1840)) to discover list of tenants from source cluster.
+
+To use this mode you need to set `--vm-intercluster` flag to `true`, `--vm-native-src-addr` flag to 'http://vmselect:8481/' and `--vm-native-dst-addr` value to http://vminsert:8480/:
+
+```console
+./bin/vmctl vm-native --vm-intercluster=true --vm-native-src-addr=http://localhost:8481/ --vm-native-dst-addr=http://172.17.0.3:8480/
+VictoriaMetrics Native import mode
+2022/12/05 21:20:06 Discovered tenants: [123:1 12812919:1 1289198:1 1289:1283 12:1 1:0 1:1 1:1231231 1:1271727 1:12819 1:281 812891298:1]
+2022/12/05 21:20:06 Initing export pipe from "http://localhost:8481/select/123:1/prometheus/api/v1/export/native" with filters:
+ filter: match[]={__name__!=""}
+Initing import process to "http://172.17.0.3:8480/insert/123:1/prometheus/api/v1/import/native":
+Total: 61.13 MiB ↖ Speed: 2.05 MiB p/s
+Total: 61.13 MiB ↗ Speed: 2.30 MiB p/s
+2022/12/05 21:20:33 Initing export pipe from "http://localhost:8481/select/12812919:1/prometheus/api/v1/export/native" with filters:
+ filter: match[]={__name__!=""}
+Initing import process to "http://172.17.0.3:8480/insert/12812919:1/prometheus/api/v1/import/native":
+Total: 43.14 MiB ↘ Speed: 1.86 MiB p/s
+Total: 43.14 MiB ↙ Speed: 2.36 MiB p/s
+2022/12/05 21:20:51 Initing export pipe from "http://localhost:8481/select/1289198:1/prometheus/api/v1/export/native" with filters:
+ filter: match[]={__name__!=""}
+Initing import process to "http://172.17.0.3:8480/insert/1289198:1/prometheus/api/v1/import/native":
+Total: 16.64 MiB ↗ Speed: 2.66 MiB p/s
+Total: 16.64 MiB ↘ Speed: 2.19 MiB p/s
+2022/12/05 21:20:59 Initing export pipe from "http://localhost:8481/select/1289:1283/prometheus/api/v1/export/native" with filters:
+ filter: match[]={__name__!=""}
+Initing import process to "http://172.17.0.3:8480/insert/1289:1283/prometheus/api/v1/import/native":
+Total: 43.33 MiB ↙ Speed: 1.94 MiB p/s
+Total: 43.33 MiB ↖ Speed: 2.35 MiB p/s
+2022/12/05 21:21:18 Initing export pipe from "http://localhost:8481/select/12:1/prometheus/api/v1/export/native" with filters:
+ filter: match[]={__name__!=""}
+Initing import process to "http://172.17.0.3:8480/insert/12:1/prometheus/api/v1/import/native":
+Total: 63.78 MiB ↙ Speed: 1.96 MiB p/s
+Total: 63.78 MiB ↖ Speed: 2.28 MiB p/s
+2022/12/05 21:21:46 Initing export pipe from "http://localhost:8481/select/1:0/prometheus/api/v1/export/native" with filters:
+ filter: match[]={__name__!=""}
+Initing import process to "http://172.17.0.3:8480/insert/1:0/prometheus/api/v1/import/native":
+2022/12/05 21:21:46 Import finished!
+Total: 330 B ↗ Speed: 3.53 MiB p/s
+2022/12/05 21:21:46 Initing export pipe from "http://localhost:8481/select/1:1/prometheus/api/v1/export/native" with filters:
+ filter: match[]={__name__!=""}
+Initing import process to "http://172.17.0.3:8480/insert/1:1/prometheus/api/v1/import/native":
+Total: 63.81 MiB ↙ Speed: 1.96 MiB p/s
+Total: 63.81 MiB ↖ Speed: 2.28 MiB p/s
+2022/12/05 21:22:14 Initing export pipe from "http://localhost:8481/select/1:1231231/prometheus/api/v1/export/native" with filters:
+ filter: match[]={__name__!=""}
+Initing import process to "http://172.17.0.3:8480/insert/1:1231231/prometheus/api/v1/import/native":
+Total: 63.84 MiB ↙ Speed: 1.93 MiB p/s
+Total: 63.84 MiB ↖ Speed: 2.29 MiB p/s
+2022/12/05 21:22:42 Initing export pipe from "http://localhost:8481/select/1:1271727/prometheus/api/v1/export/native" with filters:
+ filter: match[]={__name__!=""}
+Initing import process to "http://172.17.0.3:8480/insert/1:1271727/prometheus/api/v1/import/native":
+Total: 54.37 MiB ↘ Speed: 1.90 MiB p/s
+Total: 54.37 MiB ↙ Speed: 2.37 MiB p/s
+2022/12/05 21:23:05 Initing export pipe from "http://localhost:8481/select/1:12819/prometheus/api/v1/export/native" with filters:
+ filter: match[]={__name__!=""}
+Initing import process to "http://172.17.0.3:8480/insert/1:12819/prometheus/api/v1/import/native":
+Total: 17.01 MiB ↙ Speed: 1.75 MiB p/s
+Total: 17.01 MiB ↖ Speed: 2.15 MiB p/s
+2022/12/05 21:23:13 Initing export pipe from "http://localhost:8481/select/1:281/prometheus/api/v1/export/native" with filters:
+ filter: match[]={__name__!=""}
+Initing import process to "http://172.17.0.3:8480/insert/1:281/prometheus/api/v1/import/native":
+Total: 63.89 MiB ↘ Speed: 1.90 MiB p/s
+Total: 63.89 MiB ↙ Speed: 2.29 MiB p/s
+2022/12/05 21:23:42 Initing export pipe from "http://localhost:8481/select/812891298:1/prometheus/api/v1/export/native" with filters:
+ filter: match[]={__name__!=""}
+Initing import process to "http://172.17.0.3:8480/insert/812891298:1/prometheus/api/v1/import/native":
+Total: 63.84 MiB ↖ Speed: 1.99 MiB p/s
+Total: 63.84 MiB ↗ Speed: 2.26 MiB p/s
+2022/12/05 21:24:10 Total time: 4m4.1466565s
+```
## Verifying exported blocks from VictoriaMetrics
diff --git a/app/vmctl/flags.go b/app/vmctl/flags.go
index b6254351bd..dccfb1024d 100644
--- a/app/vmctl/flags.go
+++ b/app/vmctl/flags.go
@@ -44,6 +44,8 @@ const (
// also used in vm-native
vmExtraLabel = "vm-extra-label"
vmRateLimit = "vm-rate-limit"
+
+ vmInterCluster = "vm-intercluster"
)
var (
@@ -398,6 +400,12 @@ var (
Usage: "Optional data transfer rate limit in bytes per second.\n" +
"By default the rate limit is disabled. It can be useful for limiting load on source or destination databases.",
},
+ &cli.BoolFlag{
+ Name: vmInterCluster,
+ Usage: "Enables cluster-to-cluster migration mode with automatic tenants data migration.\n" +
+ fmt.Sprintf(" In this mode --%s flag format is: 'http://vmselect:8481/'. --%s flag format is: http://vminsert:8480/. \n", vmNativeSrcAddr, vmNativeDstAddr) +
+ " TenantID will be appended automatically after discovering tenants from src.",
+ },
}
)
diff --git a/app/vmctl/main.go b/app/vmctl/main.go
index 19406d5118..51ac55c515 100644
--- a/app/vmctl/main.go
+++ b/app/vmctl/main.go
@@ -200,7 +200,8 @@ func main() {
}
p := vmNativeProcessor{
- rateLimit: c.Int64(vmRateLimit),
+ rateLimit: c.Int64(vmRateLimit),
+ interCluster: c.Bool(vmInterCluster),
filter: filter{
match: c.String(vmNativeFilterMatch),
timeStart: c.String(vmNativeFilterTimeStart),
diff --git a/app/vmctl/vm_native.go b/app/vmctl/vm_native.go
index d2f8013bbd..dd85d8b748 100644
--- a/app/vmctl/vm_native.go
+++ b/app/vmctl/vm_native.go
@@ -2,6 +2,7 @@ package main
import (
"context"
+ "encoding/json"
"fmt"
"io"
"log"
@@ -19,8 +20,9 @@ type vmNativeProcessor struct {
filter filter
rateLimit int64
- dst *vmNativeClient
- src *vmNativeClient
+ dst *vmNativeClient
+ src *vmNativeClient
+ interCluster bool
}
type vmNativeClient struct {
@@ -49,15 +51,16 @@ func (f filter) String() string {
}
const (
- nativeExportAddr = "api/v1/export/native"
- nativeImportAddr = "api/v1/import/native"
+ nativeExportAddr = "api/v1/export/native"
+ nativeImportAddr = "api/v1/import/native"
+ nativeTenantsAddr = "admin/tenants"
nativeBarTpl = `Total: {{counters . }} {{ cycle . "↖" "↗" "↘" "↙" }} Speed: {{speed . }} {{string . "suffix"}}`
)
func (p *vmNativeProcessor) run(ctx context.Context) error {
if p.filter.chunk == "" {
- return p.runSingle(ctx, p.filter)
+ return p.runWithFilter(ctx, p.filter)
}
startOfRange, err := time.Parse(time.RFC3339, p.filter.timeStart)
@@ -89,7 +92,7 @@ func (p *vmNativeProcessor) run(ctx context.Context) error {
timeStart: formattedStartTime,
timeEnd: formattedEndTime,
}
- err := p.runSingle(ctx, f)
+ err := p.runWithFilter(ctx, f)
if err != nil {
log.Printf("processing failed for range %d/%d: %s - %s \n", rangeIdx+1, len(ranges), formattedStartTime, formattedEndTime)
@@ -99,25 +102,52 @@ func (p *vmNativeProcessor) run(ctx context.Context) error {
return nil
}
-func (p *vmNativeProcessor) runSingle(ctx context.Context, f filter) error {
- pr, pw := io.Pipe()
+func (p *vmNativeProcessor) runWithFilter(ctx context.Context, f filter) error {
+ nativeImportAddr, err := vm.AddExtraLabelsToImportPath(nativeImportAddr, p.dst.extraLabels)
- log.Printf("Initing export pipe from %q with filters: %s\n", p.src.addr, f)
- exportReader, err := p.exportPipe(ctx, f)
+ if err != nil {
+ return fmt.Errorf("failed to add labels to import path: %s", err)
+ }
+
+ if !p.interCluster {
+ srcURL := fmt.Sprintf("%s/%s", p.src.addr, nativeExportAddr)
+ dstURL := fmt.Sprintf("%s/%s", p.dst.addr, nativeImportAddr)
+
+ return p.runSingle(ctx, f, srcURL, dstURL)
+ }
+
+ tenants, err := p.getSourceTenants(ctx, f)
+ if err != nil {
+ return fmt.Errorf("failed to get source tenants: %s", err)
+ }
+
+ log.Printf("Discovered tenants: %v", tenants)
+ for _, tenant := range tenants {
+ // src and dst expected formats: http://vminsert:8480/ and http://vmselect:8481/
+ srcURL := fmt.Sprintf("%s/select/%s/prometheus/%s", p.src.addr, tenant, nativeExportAddr)
+ dstURL := fmt.Sprintf("%s/insert/%s/prometheus/%s", p.dst.addr, tenant, nativeImportAddr)
+
+ if err := p.runSingle(ctx, f, srcURL, dstURL); err != nil {
+ return fmt.Errorf("failed to migrate data for tenant %q: %s", tenant, err)
+ }
+ }
+
+ return nil
+}
+
+func (p *vmNativeProcessor) runSingle(ctx context.Context, f filter, srcURL, dstURL string) error {
+ log.Printf("Initing export pipe from %q with filters: %s\n", srcURL, f)
+
+ exportReader, err := p.exportPipe(ctx, srcURL, f)
if err != nil {
return fmt.Errorf("failed to init export pipe: %s", err)
}
- nativeImportAddr, err := vm.AddExtraLabelsToImportPath(nativeImportAddr, p.dst.extraLabels)
- if err != nil {
- return err
- }
-
+ pr, pw := io.Pipe()
sync := make(chan struct{})
go func() {
defer func() { close(sync) }()
- u := fmt.Sprintf("%s/%s", p.dst.addr, nativeImportAddr)
- req, err := http.NewRequestWithContext(ctx, "POST", u, pr)
+ req, err := http.NewRequestWithContext(ctx, "POST", dstURL, pr)
if err != nil {
log.Fatalf("cannot create import request to %q: %s", p.dst.addr, err)
}
@@ -130,7 +160,7 @@ func (p *vmNativeProcessor) runSingle(ctx context.Context, f filter) error {
}
}()
- fmt.Printf("Initing import process to %q:\n", p.dst.addr)
+ fmt.Printf("Initing import process to %q:\n", dstURL)
pool := pb.NewPool()
bar := pb.ProgressBarTemplate(nativeBarTpl).New(0)
pool.Add(bar)
@@ -166,9 +196,43 @@ func (p *vmNativeProcessor) runSingle(ctx context.Context, f filter) error {
return nil
}
-func (p *vmNativeProcessor) exportPipe(ctx context.Context, f filter) (io.ReadCloser, error) {
- u := fmt.Sprintf("%s/%s", p.src.addr, nativeExportAddr)
+func (p *vmNativeProcessor) getSourceTenants(ctx context.Context, f filter) ([]string, error) {
+ u := fmt.Sprintf("%s/%s", p.src.addr, nativeTenantsAddr)
req, err := http.NewRequestWithContext(ctx, "GET", u, nil)
+ if err != nil {
+ return nil, fmt.Errorf("cannot create request to %q: %s", u, err)
+ }
+
+ params := req.URL.Query()
+ if f.timeStart != "" {
+ params.Set("start", f.timeStart)
+ }
+ if f.timeEnd != "" {
+ params.Set("end", f.timeEnd)
+ }
+ req.URL.RawQuery = params.Encode()
+
+ resp, err := p.src.do(req, http.StatusOK)
+ if err != nil {
+ return nil, fmt.Errorf("tenants request failed: %s", err)
+ }
+
+ var r struct {
+ Tenants []string `json:"data"`
+ }
+ if err := json.NewDecoder(resp.Body).Decode(&r); err != nil {
+ return nil, fmt.Errorf("cannot decode tenants response: %s", err)
+ }
+
+ if err := resp.Body.Close(); err != nil {
+ return nil, fmt.Errorf("cannot close tenants response body: %s", err)
+ }
+
+ return r.Tenants, nil
+}
+
+func (p *vmNativeProcessor) exportPipe(ctx context.Context, url string, f filter) (io.ReadCloser, error) {
+ req, err := http.NewRequestWithContext(ctx, "GET", url, nil)
if err != nil {
return nil, fmt.Errorf("cannot create request to %q: %s", p.src.addr, err)
}
diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md
index e6a92f3b5c..a13a6273c1 100644
--- a/docs/CHANGELOG.md
+++ b/docs/CHANGELOG.md
@@ -50,6 +50,7 @@ The following tip changes can be tested by building VictoriaMetrics components f
* FEATURE: [VictoriaMetrics cluster](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html): improve error message when the requested path cannot be properly parsed, so users could identify the issue and properly fix the path. Now the error message links to [url format docs](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#url-format). See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3402).
* FEATURE: [vmctl](https://docs.victoriametrics.com/vmctl.html): add ability to copy data from sources via Prometheus `remote_read` protocol. See [these docs](https://docs.victoriametrics.com/vmctl.html#migrating-data-by-remote-read-protocol). The related issues: [one](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3132) and [two](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1101).
* FEATURE: [vmalert](https://docs.victoriametrics.com/vmalert.html): add `-remoteWrite.sendTimeout` command-line flag, which allows configuring timeout for sending data to `-remoteWrite.url`. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3408).
+* FEATURE: [vmctl](https://docs.victoriametrics.com/vmctl.html): add ability to migrate data between VictoriaMetrics clusters with automatic tenants discovery. See [these docs](https://docs.victoriametrics.com/vmctl.html#cluster-to-cluster-migration-mode) and [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/2930)
* BUGFIX: [vmalert](https://docs.victoriametrics.com/vmalert.html): properly pass HTTP headers during the alert state restore procedure. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3418).
* BUGFIX: [vmalert](https://docs.victoriametrics.com/vmalert.html): properly specify rule evaluation step during the [replay mode](https://docs.victoriametrics.com/vmalert.html#rules-backfilling). The `step` value was previously overriden by `-datasource.queryStep` command-line flag.
From eed32b368c2bd971095cfaebde7c54d735f2ddd4 Mon Sep 17 00:00:00 2001
From: Aliaksandr Valialkin
Date: Mon, 5 Dec 2022 17:24:08 -0800
Subject: [PATCH 27/38] docs/vmctl.md: `make docs-sync` after
86c31f2955c291da5bb652bffa9e0d5bfd59c96e
Updates https://github.com/VictoriaMetrics/VictoriaMetrics/issues/2930
---
docs/vmctl.md | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 74 insertions(+)
diff --git a/docs/vmctl.md b/docs/vmctl.md
index 6f77c01f34..dbbaf6e2cd 100644
--- a/docs/vmctl.md
+++ b/docs/vmctl.md
@@ -837,6 +837,80 @@ Total: 16 B ↗ Speed: 186.32 KiB p/s
2022/08/30 19:48:24 Total time: 12.680582ms
```
+#### Cluster-to-cluster migration mode
+
+Using cluster-to-cluster migration mode helps to migrate all tenants data in a single `vmctl` run.
+
+Cluster-to-cluster uses `/admin/tenants` endpoint (available starting from [v1.84.0](https://docs.victoriametrics.com/CHANGELOG.html#v1840)) to discover list of tenants from source cluster.
+
+To use this mode you need to set `--vm-intercluster` flag to `true`, `--vm-native-src-addr` flag to 'http://vmselect:8481/' and `--vm-native-dst-addr` value to http://vminsert:8480/:
+
+```console
+./bin/vmctl vm-native --vm-intercluster=true --vm-native-src-addr=http://localhost:8481/ --vm-native-dst-addr=http://172.17.0.3:8480/
+VictoriaMetrics Native import mode
+2022/12/05 21:20:06 Discovered tenants: [123:1 12812919:1 1289198:1 1289:1283 12:1 1:0 1:1 1:1231231 1:1271727 1:12819 1:281 812891298:1]
+2022/12/05 21:20:06 Initing export pipe from "http://localhost:8481/select/123:1/prometheus/api/v1/export/native" with filters:
+ filter: match[]={__name__!=""}
+Initing import process to "http://172.17.0.3:8480/insert/123:1/prometheus/api/v1/import/native":
+Total: 61.13 MiB ↖ Speed: 2.05 MiB p/s
+Total: 61.13 MiB ↗ Speed: 2.30 MiB p/s
+2022/12/05 21:20:33 Initing export pipe from "http://localhost:8481/select/12812919:1/prometheus/api/v1/export/native" with filters:
+ filter: match[]={__name__!=""}
+Initing import process to "http://172.17.0.3:8480/insert/12812919:1/prometheus/api/v1/import/native":
+Total: 43.14 MiB ↘ Speed: 1.86 MiB p/s
+Total: 43.14 MiB ↙ Speed: 2.36 MiB p/s
+2022/12/05 21:20:51 Initing export pipe from "http://localhost:8481/select/1289198:1/prometheus/api/v1/export/native" with filters:
+ filter: match[]={__name__!=""}
+Initing import process to "http://172.17.0.3:8480/insert/1289198:1/prometheus/api/v1/import/native":
+Total: 16.64 MiB ↗ Speed: 2.66 MiB p/s
+Total: 16.64 MiB ↘ Speed: 2.19 MiB p/s
+2022/12/05 21:20:59 Initing export pipe from "http://localhost:8481/select/1289:1283/prometheus/api/v1/export/native" with filters:
+ filter: match[]={__name__!=""}
+Initing import process to "http://172.17.0.3:8480/insert/1289:1283/prometheus/api/v1/import/native":
+Total: 43.33 MiB ↙ Speed: 1.94 MiB p/s
+Total: 43.33 MiB ↖ Speed: 2.35 MiB p/s
+2022/12/05 21:21:18 Initing export pipe from "http://localhost:8481/select/12:1/prometheus/api/v1/export/native" with filters:
+ filter: match[]={__name__!=""}
+Initing import process to "http://172.17.0.3:8480/insert/12:1/prometheus/api/v1/import/native":
+Total: 63.78 MiB ↙ Speed: 1.96 MiB p/s
+Total: 63.78 MiB ↖ Speed: 2.28 MiB p/s
+2022/12/05 21:21:46 Initing export pipe from "http://localhost:8481/select/1:0/prometheus/api/v1/export/native" with filters:
+ filter: match[]={__name__!=""}
+Initing import process to "http://172.17.0.3:8480/insert/1:0/prometheus/api/v1/import/native":
+2022/12/05 21:21:46 Import finished!
+Total: 330 B ↗ Speed: 3.53 MiB p/s
+2022/12/05 21:21:46 Initing export pipe from "http://localhost:8481/select/1:1/prometheus/api/v1/export/native" with filters:
+ filter: match[]={__name__!=""}
+Initing import process to "http://172.17.0.3:8480/insert/1:1/prometheus/api/v1/import/native":
+Total: 63.81 MiB ↙ Speed: 1.96 MiB p/s
+Total: 63.81 MiB ↖ Speed: 2.28 MiB p/s
+2022/12/05 21:22:14 Initing export pipe from "http://localhost:8481/select/1:1231231/prometheus/api/v1/export/native" with filters:
+ filter: match[]={__name__!=""}
+Initing import process to "http://172.17.0.3:8480/insert/1:1231231/prometheus/api/v1/import/native":
+Total: 63.84 MiB ↙ Speed: 1.93 MiB p/s
+Total: 63.84 MiB ↖ Speed: 2.29 MiB p/s
+2022/12/05 21:22:42 Initing export pipe from "http://localhost:8481/select/1:1271727/prometheus/api/v1/export/native" with filters:
+ filter: match[]={__name__!=""}
+Initing import process to "http://172.17.0.3:8480/insert/1:1271727/prometheus/api/v1/import/native":
+Total: 54.37 MiB ↘ Speed: 1.90 MiB p/s
+Total: 54.37 MiB ↙ Speed: 2.37 MiB p/s
+2022/12/05 21:23:05 Initing export pipe from "http://localhost:8481/select/1:12819/prometheus/api/v1/export/native" with filters:
+ filter: match[]={__name__!=""}
+Initing import process to "http://172.17.0.3:8480/insert/1:12819/prometheus/api/v1/import/native":
+Total: 17.01 MiB ↙ Speed: 1.75 MiB p/s
+Total: 17.01 MiB ↖ Speed: 2.15 MiB p/s
+2022/12/05 21:23:13 Initing export pipe from "http://localhost:8481/select/1:281/prometheus/api/v1/export/native" with filters:
+ filter: match[]={__name__!=""}
+Initing import process to "http://172.17.0.3:8480/insert/1:281/prometheus/api/v1/import/native":
+Total: 63.89 MiB ↘ Speed: 1.90 MiB p/s
+Total: 63.89 MiB ↙ Speed: 2.29 MiB p/s
+2022/12/05 21:23:42 Initing export pipe from "http://localhost:8481/select/812891298:1/prometheus/api/v1/export/native" with filters:
+ filter: match[]={__name__!=""}
+Initing import process to "http://172.17.0.3:8480/insert/812891298:1/prometheus/api/v1/import/native":
+Total: 63.84 MiB ↖ Speed: 1.99 MiB p/s
+Total: 63.84 MiB ↗ Speed: 2.26 MiB p/s
+2022/12/05 21:24:10 Total time: 4m4.1466565s
+```
## Verifying exported blocks from VictoriaMetrics
From d99d222f0ad54bd95f8c1a95f682881591861823 Mon Sep 17 00:00:00 2001
From: Aliaksandr Valialkin
Date: Mon, 5 Dec 2022 21:30:48 -0800
Subject: [PATCH 28/38] lib/{storage,mergeset}: log the duration for flushing
in-memory parts on graceful shutdown
---
lib/mergeset/table.go | 3 +--
lib/storage/partition.go | 3 +--
2 files changed, 2 insertions(+), 4 deletions(-)
diff --git a/lib/mergeset/table.go b/lib/mergeset/table.go
index ea18b78add..08b1e4e378 100644
--- a/lib/mergeset/table.go
+++ b/lib/mergeset/table.go
@@ -374,9 +374,8 @@ func (tb *Table) MustClose() {
logger.Infof("flushing inmemory parts to files on %q...", tb.path)
startTime = time.Now()
-
- // Flush inmemory items the last time before exit.
tb.flushInmemoryItems()
+ logger.Infof("inmemory parts have been successfully flushed to files in %.3f seconds at %q", time.Since(startTime).Seconds(), tb.path)
logger.Infof("waiting for flush callback worker to stop on %q...", tb.path)
startTime = time.Now()
diff --git a/lib/storage/partition.go b/lib/storage/partition.go
index 714a50f8b2..020e6a3201 100644
--- a/lib/storage/partition.go
+++ b/lib/storage/partition.go
@@ -722,9 +722,8 @@ func (pt *partition) MustClose() {
logger.Infof("flushing inmemory parts to files on %q...", pt.smallPartsPath)
startTime = time.Now()
-
- // Flush inmemory rows the last time before exit.
pt.flushInmemoryRows()
+ logger.Infof("inmemory parts have been flushed to files in %.3f seconds on %q", time.Since(startTime).Seconds(), pt.smallPartsPath)
// Remove references from inmemoryParts, smallParts and bigParts, so they may be eventually closed
// after all the searches are done.
From 5eae9a9914d4272582514ba69a9dc2196a3ecd29 Mon Sep 17 00:00:00 2001
From: Aliaksandr Valialkin
Date: Mon, 5 Dec 2022 21:55:01 -0800
Subject: [PATCH 29/38] app/vmselect/promql: add range_trim_spikes(phi, q)
function for trimming phi percent of largest spikes per each time series
returned by q
---
app/vmselect/promql/exec_test.go | 12 +++++
app/vmselect/promql/transform.go | 49 +++++++++++++++++++
docs/CHANGELOG.md | 3 +-
docs/MetricsQL.md | 5 ++
go.mod | 2 +-
go.sum | 4 +-
.../VictoriaMetrics/metricsql/optimizer.go | 2 +-
.../VictoriaMetrics/metricsql/transform.go | 1 +
vendor/modules.txt | 2 +-
9 files changed, 74 insertions(+), 6 deletions(-)
diff --git a/app/vmselect/promql/exec_test.go b/app/vmselect/promql/exec_test.go
index 49eb8d5402..0ca7c6224b 100644
--- a/app/vmselect/promql/exec_test.go
+++ b/app/vmselect/promql/exec_test.go
@@ -6385,6 +6385,17 @@ func TestExecSuccess(t *testing.T) {
resultExpected := []netstorage.Result{r1, r2}
f(q, resultExpected)
})
+ t.Run(`range_trim_spikes()`, func(t *testing.T) {
+ t.Parallel()
+ q := `range_trim_spikes(0.2, time())`
+ r := netstorage.Result{
+ MetricName: metricNameExpected,
+ Values: []float64{nan, 1200, 1400, 1600, 1800, nan},
+ Timestamps: timestampsExpected,
+ }
+ resultExpected := []netstorage.Result{r}
+ f(q, resultExpected)
+ })
t.Run(`range_quantile(0.5)`, func(t *testing.T) {
t.Parallel()
q := `range_quantile(0.5, time())`
@@ -8189,6 +8200,7 @@ func TestExecError(t *testing.T) {
f(`step(1)`)
f(`running_sum(1, 2)`)
f(`range_sum(1, 2)`)
+ f(`range_trim_spikes()`)
f(`range_first(1, 2)`)
f(`range_last(1, 2)`)
f(`range_linear_regression(1, 2)`)
diff --git a/app/vmselect/promql/transform.go b/app/vmselect/promql/transform.go
index f4d1512954..752775b4ed 100644
--- a/app/vmselect/promql/transform.go
+++ b/app/vmselect/promql/transform.go
@@ -96,6 +96,7 @@ var transformFuncs = map[string]transformFunc{
"range_stddev": transformRangeStddev,
"range_stdvar": transformRangeStdvar,
"range_sum": newTransformFuncRange(runningSum),
+ "range_trim_spikes": transformRangeTrimSpikes,
"remove_resets": transformRemoveResets,
"round": transformRound,
"running_avg": newTransformFuncRunning(runningAvg),
@@ -1274,6 +1275,54 @@ func transformRangeNormalize(tfa *transformFuncArg) ([]*timeseries, error) {
return rvs, nil
}
+func transformRangeTrimSpikes(tfa *transformFuncArg) ([]*timeseries, error) {
+ args := tfa.args
+ if err := expectTransformArgsNum(args, 2); err != nil {
+ return nil, err
+ }
+ phis, err := getScalar(args[0], 0)
+ if err != nil {
+ return nil, err
+ }
+ phi := float64(0)
+ if len(phis) > 0 {
+ phi = phis[0]
+ }
+ // Trim 100% * (phi / 2) samples with the lowest / highest values per each time series
+ phi /= 2
+ phiUpper := 1 - phi
+ phiLower := phi
+ rvs := args[1]
+ a := getFloat64s()
+ values := a.A[:0]
+ for _, ts := range rvs {
+ values := values[:0]
+ originValues := ts.Values
+ for _, v := range originValues {
+ if math.IsNaN(v) {
+ continue
+ }
+ values = append(values, v)
+ }
+ sort.Float64s(values)
+ vMax := quantileSorted(phiUpper, values)
+ vMin := quantileSorted(phiLower, values)
+ for i, v := range originValues {
+ if math.IsNaN(v) {
+ continue
+ }
+ if v > vMax {
+ originValues[i] = nan
+ } else if v < vMin {
+ originValues[i] = nan
+ }
+ }
+ }
+ a.A = values
+ putFloat64s(a)
+ return rvs, nil
+}
+
func transformRangeLinearRegression(tfa *transformFuncArg) ([]*timeseries, error) {
args := tfa.args
if err := expectTransformArgsNum(args, 1); err != nil {
diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md
index a13a6273c1..af033101da 100644
--- a/docs/CHANGELOG.md
+++ b/docs/CHANGELOG.md
@@ -48,9 +48,10 @@ The following tip changes can be tested by building VictoriaMetrics components f
* FEATURE: [vmagent](https://docs.victoriametrics.com/vmagent.html): improve [service discovery](https://docs.victoriametrics.com/sd_configs.html) performance when discovering big number of targets (10K and more).
* FEATURE: [vmagent](https://docs.victoriametrics.com/vmagent.html): add `exported_` prefix to metric names exported by scrape targets if these metric names clash with [automatically generated metrics](https://docs.victoriametrics.com/vmagent.html#automatically-generated-metrics) such as `up`, `scrape_samples_scraped`, etc. This prevents from corruption of automatically generated metrics. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3406).
* FEATURE: [VictoriaMetrics cluster](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html): improve error message when the requested path cannot be properly parsed, so users could identify the issue and properly fix the path. Now the error message links to [url format docs](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#url-format). See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3402).
-* FEATURE: [vmctl](https://docs.victoriametrics.com/vmctl.html): add ability to copy data from sources via Prometheus `remote_read` protocol. See [these docs](https://docs.victoriametrics.com/vmctl.html#migrating-data-by-remote-read-protocol). The related issues: [one](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3132) and [two](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1101).
* FEATURE: [vmalert](https://docs.victoriametrics.com/vmalert.html): add `-remoteWrite.sendTimeout` command-line flag, which allows configuring timeout for sending data to `-remoteWrite.url`. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3408).
* FEATURE: [vmctl](https://docs.victoriametrics.com/vmctl.html): add ability to migrate data between VictoriaMetrics clusters with automatic tenants discovery. See [these docs](https://docs.victoriametrics.com/vmctl.html#cluster-to-cluster-migration-mode) and [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/2930)
+* FEATURE: [vmctl](https://docs.victoriametrics.com/vmctl.html): add ability to copy data from sources via Prometheus `remote_read` protocol. See [these docs](https://docs.victoriametrics.com/vmctl.html#migrating-data-by-remote-read-protocol). The related issues: [one](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3132) and [two](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1101).
+* FEATURE: [MetricsQL](https://docs.victoriametrics.com/MetricsQL.html): add `range_trim_spikes(phi, q)` function for trimming `phi` percent of the largest spikes per each time series returned by `q`. See [these docs](https://docs.victoriametrics.com/MetricsQL.html#range_trim_spikes).
* BUGFIX: [vmalert](https://docs.victoriametrics.com/vmalert.html): properly pass HTTP headers during the alert state restore procedure. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3418).
* BUGFIX: [vmalert](https://docs.victoriametrics.com/vmalert.html): properly specify rule evaluation step during the [replay mode](https://docs.victoriametrics.com/vmalert.html#rules-backfilling). The `step` value was previously overriden by `-datasource.queryStep` command-line flag.
diff --git a/docs/MetricsQL.md b/docs/MetricsQL.md
index 67bd9aa610..9b0a8c447f 100644
--- a/docs/MetricsQL.md
+++ b/docs/MetricsQL.md
@@ -1247,6 +1247,11 @@ per each time series returned by `q` on the selected time range.
`range_sum(q)` is a [transform function](#transform-functions), which calculates the sum of points per each time series returned by `q`.
+#### range_trim_spikes
+
+`range_trim_spikes(phi, q)` is a [transform function](#transform-functions), which drops `phi` percent of biggest spikes from time series returned by `q`.
+The `phi` must be in the range `[0..1]`, where `0` means `0%` and `1` means `100%`.
+
#### remove_resets
`remove_resets(q)` is a [transform function](#transform-functions), which removes counter resets from time series returned by `q`.
diff --git a/go.mod b/go.mod
index 164b550bd8..35f09f6f9d 100644
--- a/go.mod
+++ b/go.mod
@@ -12,7 +12,7 @@ require (
// like https://github.com/valyala/fasthttp/commit/996610f021ff45fdc98c2ce7884d5fa4e7f9199b
github.com/VictoriaMetrics/fasthttp v1.1.0
github.com/VictoriaMetrics/metrics v1.23.0
- github.com/VictoriaMetrics/metricsql v0.49.1
+ github.com/VictoriaMetrics/metricsql v0.50.0
github.com/aws/aws-sdk-go-v2 v1.17.2
github.com/aws/aws-sdk-go-v2/config v1.18.4
github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.43
diff --git a/go.sum b/go.sum
index a942cb491d..44d818e924 100644
--- a/go.sum
+++ b/go.sum
@@ -71,8 +71,8 @@ github.com/VictoriaMetrics/fasthttp v1.1.0/go.mod h1:/7DMcogqd+aaD3G3Hg5kFgoFwlR
github.com/VictoriaMetrics/metrics v1.18.1/go.mod h1:ArjwVz7WpgpegX/JpB0zpNF2h2232kErkEnzH1sxMmA=
github.com/VictoriaMetrics/metrics v1.23.0 h1:WzfqyzCaxUZip+OBbg1+lV33WChDSu4ssYII3nxtpeA=
github.com/VictoriaMetrics/metrics v1.23.0/go.mod h1:rAr/llLpEnAdTehiNlUxKgnjcOuROSzpw0GvjpEbvFc=
-github.com/VictoriaMetrics/metricsql v0.49.1 h1:9JAbpiZhlQnylclcf5xNtYRaBd5dr2CTPQ85RIoruuk=
-github.com/VictoriaMetrics/metricsql v0.49.1/go.mod h1:6pP1ZeLVJHqJrHlF6Ij3gmpQIznSsgktEcZgsAWYel0=
+github.com/VictoriaMetrics/metricsql v0.50.0 h1:MCBhjn1qlfMqPGP6HiR9JgmEw7oTRGm/O8YwSeoaI1E=
+github.com/VictoriaMetrics/metricsql v0.50.0/go.mod h1:6pP1ZeLVJHqJrHlF6Ij3gmpQIznSsgktEcZgsAWYel0=
github.com/VividCortex/ewma v1.1.1/go.mod h1:2Tkkvm3sRDVXaiyucHiACn4cqf7DpdyLvmxzcbUokwA=
github.com/VividCortex/ewma v1.2.0 h1:f58SaIzcDXrSy3kWaHNvuJgJ3Nmz59Zji6XoJR/q1ow=
github.com/VividCortex/ewma v1.2.0/go.mod h1:nz4BbCtbLyFDeC9SUHbtcT5644juEuWfUAUnGx7j5l4=
diff --git a/vendor/github.com/VictoriaMetrics/metricsql/optimizer.go b/vendor/github.com/VictoriaMetrics/metricsql/optimizer.go
index 3a432e63e0..3415285863 100644
--- a/vendor/github.com/VictoriaMetrics/metricsql/optimizer.go
+++ b/vendor/github.com/VictoriaMetrics/metricsql/optimizer.go
@@ -392,7 +392,7 @@ func getTransformArgIdxForOptimization(funcName string, args []Expr) int {
return -1
case "limit_offset":
return 2
- case "buckets_limit", "histogram_quantile", "histogram_share", "range_quantile":
+ case "buckets_limit", "histogram_quantile", "histogram_share", "range_quantile", "range_trim_spikes":
return 1
case "histogram_quantiles":
return len(args) - 1
diff --git a/vendor/github.com/VictoriaMetrics/metricsql/transform.go b/vendor/github.com/VictoriaMetrics/metricsql/transform.go
index 5876c82908..31029f2c3e 100644
--- a/vendor/github.com/VictoriaMetrics/metricsql/transform.go
+++ b/vendor/github.com/VictoriaMetrics/metricsql/transform.go
@@ -81,6 +81,7 @@ var transformFuncs = map[string]bool{
"range_stddev": true,
"range_stdvar": true,
"range_sum": true,
+ "range_trim_spikes": true,
"remove_resets": true,
"round": true,
"running_avg": true,
diff --git a/vendor/modules.txt b/vendor/modules.txt
index dfb5e08c68..4bc16ef084 100644
--- a/vendor/modules.txt
+++ b/vendor/modules.txt
@@ -69,7 +69,7 @@ github.com/VictoriaMetrics/fasthttp/stackless
# github.com/VictoriaMetrics/metrics v1.23.0
## explicit; go 1.15
github.com/VictoriaMetrics/metrics
-# github.com/VictoriaMetrics/metricsql v0.49.1
+# github.com/VictoriaMetrics/metricsql v0.50.0
## explicit; go 1.13
github.com/VictoriaMetrics/metricsql
github.com/VictoriaMetrics/metricsql/binaryop
From fd43b5bad022bdca9fbfef9a9831559f0299018f Mon Sep 17 00:00:00 2001
From: Yury Molodov
Date: Tue, 6 Dec 2022 06:56:54 +0100
Subject: [PATCH 30/38] vmui: fix multi-line query (#3448)
* fix: remove prevent nav by up/down keys for multi-line query
* fix: add query params encode in URL
---
.../vmui/src/components/Main/Autocomplete/Autocomplete.tsx | 5 +++--
app/vmui/packages/vmui/src/utils/query-string.ts | 2 +-
2 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/app/vmui/packages/vmui/src/components/Main/Autocomplete/Autocomplete.tsx b/app/vmui/packages/vmui/src/components/Main/Autocomplete/Autocomplete.tsx
index 021e05797c..3cb15557e8 100644
--- a/app/vmui/packages/vmui/src/components/Main/Autocomplete/Autocomplete.tsx
+++ b/app/vmui/packages/vmui/src/components/Main/Autocomplete/Autocomplete.tsx
@@ -56,13 +56,14 @@ const Autocomplete: FC = ({
const handleKeyDown = (e: KeyboardEvent) => {
const { key, ctrlKey, metaKey, shiftKey } = e;
const modifiers = ctrlKey || metaKey || shiftKey;
+ const hasOptions = foundOptions.length;
- if (key === "ArrowUp" && !modifiers) {
+ if (key === "ArrowUp" && !modifiers && hasOptions) {
e.preventDefault();
setFocusOption((prev) => prev <= 0 ? 0 : prev - 1);
}
- if (key === "ArrowDown" && !modifiers) {
+ if (key === "ArrowDown" && !modifiers && hasOptions) {
e.preventDefault();
const lastIndex = foundOptions.length - 1;
setFocusOption((prev) => prev >= lastIndex ? lastIndex : prev + 1);
diff --git a/app/vmui/packages/vmui/src/utils/query-string.ts b/app/vmui/packages/vmui/src/utils/query-string.ts
index 170a163795..333bd93550 100644
--- a/app/vmui/packages/vmui/src/utils/query-string.ts
+++ b/app/vmui/packages/vmui/src/utils/query-string.ts
@@ -5,7 +5,7 @@ import { MAX_QUERY_FIELDS } from "../constants/graph";
export const setQueryStringWithoutPageReload = (params: Record): void => {
const w = window;
if (w) {
- const qsValue = Object.entries(params).map(([k, v]) => `${k}=${v}`).join("&");
+ const qsValue = Object.entries(params).map(([k, v]) => `${k}=${encodeURIComponent(String(v))}`).join("&");
const qs = qsValue ? `?${qsValue}` : "";
const newurl = `${w.location.protocol}//${w.location.host}${w.location.pathname}${qs}${w.location.hash}`;
w.history.pushState({ path: newurl }, "", newurl);
From 718d1d90b6bc784069ec6e7cb12bbeee5498e353 Mon Sep 17 00:00:00 2001
From: Aliaksandr Valialkin
Date: Mon, 5 Dec 2022 22:01:39 -0800
Subject: [PATCH 31/38] docs/CHANGELOG.md: document
fd43b5bad022bdca9fbfef9a9831559f0299018f
Updates https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3444
Updates https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3445
---
docs/CHANGELOG.md | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md
index af033101da..468e3f6ac1 100644
--- a/docs/CHANGELOG.md
+++ b/docs/CHANGELOG.md
@@ -49,12 +49,14 @@ The following tip changes can be tested by building VictoriaMetrics components f
* FEATURE: [vmagent](https://docs.victoriametrics.com/vmagent.html): add `exported_` prefix to metric names exported by scrape targets if these metric names clash with [automatically generated metrics](https://docs.victoriametrics.com/vmagent.html#automatically-generated-metrics) such as `up`, `scrape_samples_scraped`, etc. This prevents from corruption of automatically generated metrics. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3406).
* FEATURE: [VictoriaMetrics cluster](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html): improve error message when the requested path cannot be properly parsed, so users could identify the issue and properly fix the path. Now the error message links to [url format docs](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#url-format). See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3402).
* FEATURE: [vmalert](https://docs.victoriametrics.com/vmalert.html): add `-remoteWrite.sendTimeout` command-line flag, which allows configuring timeout for sending data to `-remoteWrite.url`. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3408).
-* FEATURE: [vmctl](https://docs.victoriametrics.com/vmctl.html): add ability to migrate data between VictoriaMetrics clusters with automatic tenants discovery. See [these docs](https://docs.victoriametrics.com/vmctl.html#cluster-to-cluster-migration-mode) and [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/2930)
+* FEATURE: [vmctl](https://docs.victoriametrics.com/vmctl.html): add ability to migrate data between VictoriaMetrics clusters with automatic tenants discovery. See [these docs](https://docs.victoriametrics.com/vmctl.html#cluster-to-cluster-migration-mode) and [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/2930).
* FEATURE: [vmctl](https://docs.victoriametrics.com/vmctl.html): add ability to copy data from sources via Prometheus `remote_read` protocol. See [these docs](https://docs.victoriametrics.com/vmctl.html#migrating-data-by-remote-read-protocol). The related issues: [one](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3132) and [two](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1101).
* FEATURE: [MetricsQL](https://docs.victoriametrics.com/MetricsQL.html): add `range_trim_spikes(phi, q)` function for trimming `phi` percent of the largest spikes per each time series returned by `q`. See [these docs](https://docs.victoriametrics.com/MetricsQL.html#range_trim_spikes).
* BUGFIX: [vmalert](https://docs.victoriametrics.com/vmalert.html): properly pass HTTP headers during the alert state restore procedure. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3418).
* BUGFIX: [vmalert](https://docs.victoriametrics.com/vmalert.html): properly specify rule evaluation step during the [replay mode](https://docs.victoriametrics.com/vmalert.html#rules-backfilling). The `step` value was previously overriden by `-datasource.queryStep` command-line flag.
+* BUGFIX: [vmui](https://docs.victoriametrics.com/#vmui): properly put multi-line queries in the url, so it could be copy-n-pasted and opened without issues in a new browser tab. Previously the url for multi-line query couldn't be opened. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3444).
+* BUGFIX: [vmui](https://docs.victoriametrics.com/#vmui): correctly handle `up` and `down` keypresses when editing multi-line queries. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3445).
## [v1.84.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.84.0)
From 71f0bbbe39973c2962e9ee459931d5bc2b7085b7 Mon Sep 17 00:00:00 2001
From: Roman Khavronenko
Date: Tue, 6 Dec 2022 07:05:31 +0100
Subject: [PATCH 32/38] deployment: update the README (#3447)
Signed-off-by: hagen1778
Signed-off-by: hagen1778
---
deployment/docker/README.md | 52 ++++++++++++++++++-------------------
1 file changed, 25 insertions(+), 27 deletions(-)
diff --git a/deployment/docker/README.md b/deployment/docker/README.md
index e1fa97d18c..342f592e98 100644
--- a/deployment/docker/README.md
+++ b/deployment/docker/README.md
@@ -5,14 +5,14 @@ Docker compose environment for VictoriaMetrics includes VictoriaMetrics componen
and [Grafana](https://grafana.com/).
For starting the docker-compose environment ensure you have docker installed and running and access to the Internet.
-All commands should be executed from the root directory of this repo.
+**All commands should be executed from the root directory of [the repo](https://github.com/VictoriaMetrics/VictoriaMetrics).**
-To spin-up environment for single server VictoriaMetrics run the following command :
+To spin-up environment for single server VictoriaMetrics run the following command:
```
make docker-single-up
```
-To shutdown the docker compose environment for single server run the following command:
+To shut down the docker-compose environment for single server run the following command:
```
make docker-single-down
```
@@ -22,7 +22,7 @@ For cluster version the command will be the following:
make docker-cluster-up
```
-To shutdown the docker compose environment for cluster version run the following command:
+To shut down the docker compose environment for cluster version run the following command:
```
make docker-cluster-down
```
@@ -36,51 +36,49 @@ VictoriaMetrics will be accessible on the following ports:
* `--httpListenAddr=:8428`
The communication scheme between components is the following:
-* [vmagent](#vmagent) sends scraped metrics to VictoriaMetrics;
-* [grafana](#grafana) is configured with datasource pointing to VictoriaMetrics;
-* [vmalert](#vmalert) is configured to query VictoriaMetrics and send alerts state
+* [vmagent](#vmagent) sends scraped metrics to `single server VictoriaMetrics`;
+* [grafana](#grafana) is configured with datasource pointing to `single server VictoriaMetrics`;
+* [vmalert](#vmalert) is configured to query `single server VictoriaMetrics` and send alerts state
and recording rules back to it;
-* [alertmanager](#alertmanager) is configured to receive notifications from vmalert.
+* [alertmanager](#alertmanager) is configured to receive notifications from `vmalert`.
-To access `vmalert` via `vmselect`
-use link [http://localhost:8428/vmalert](http://localhost:8428/vmalert/).
+To access `vmalert` use link [http://localhost:8428/vmalert](http://localhost:8428/vmalert/).
To access [vmui](https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html#vmui)
use link [http://localhost:8428/vmui](http://localhost:8428/vmui).
## VictoriaMetrics cluster
-VictoriaMetrics cluster environemnt consists of vminsert, vmstorage and vmselect components. vmselect
-has exposed port `:8481`, vminsert has exposed port `:8480` and the rest of components are available
-only inside of environment.
+VictoriaMetrics cluster environment consists of `vminsert`, `vmstorage` and `vmselect` components.
+`vmselect` has exposed port `:8481`, `vminsert` has exposed port `:8480` and the rest of components
+are available only inside the environment.
The communication scheme between components is the following:
-* [vmagent](#vmagent) sends scraped metrics to vminsert;
-* vminsert forwards data to vmstorage;
-* vmselect is connected to vmstorage for querying data;
-* [grafana](#grafana) is configured with datasource pointing to vmselect;
-* [vmalert](#vmalert) is configured to query vmselect and send alerts state
- and recording rules to vminsert;
-* [alertmanager](#alertmanager) is configured to receive notifications from vmalert.
+* [vmagent](#vmagent) sends scraped metrics to `vminsert`;
+* `vminsert` forwards data to `vmstorage`;
+* `vmselect` is connected to `vmstorage` for querying data;
+* [grafana](#grafana) is configured with datasource pointing to `vmselect`;
+* [vmalert](#vmalert) is configured to query `vmselect` and send alerts state
+ and recording rules to `vminsert`;
+* [alertmanager](#alertmanager) is configured to receive notifications from `vmalert`.
-To access `vmalert` via `vmselect`
-use link [http://localhost:8481/select/0/prometheus/vmalert](http://localhost:8481/select/0/prometheus/vmalert/).
+To access `vmalert` use link [http://localhost:8481/select/0/prometheus/vmalert](http://localhost:8481/select/0/prometheus/vmalert/).
To access [vmui](https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html#vmui)
use link [http://localhost:8481/select/0/prometheus/vmui](http://localhost:8481/select/0/prometheus/vmui).
## vmagent
-vmagent is used for scraping and pushing timeseries to
-VictoriaMetrics instance. It accepts Prometheus-compatible
-configuration `prometheus.yml` with listed targets for scraping.
+vmagent is used for scraping and pushing time series to VictoriaMetrics instance.
+It accepts Prometheus-compatible configuration [prometheus.yml](https://github.com/VictoriaMetrics/VictoriaMetrics/blob/master/deployment/docker/prometheus.yml)
+with listed targets for scraping.
[Web interface link](http://localhost:8429/).
## vmalert
-vmalert evaluates alerting rules (`alerts.yml`) to track VictoriaMetrics
-health state. It is connected with AlertManager for firing alerts,
+vmalert evaluates alerting rules [alerts.yml(https://github.com/VictoriaMetrics/VictoriaMetrics/blob/master/deployment/docker/alerts.yml)
+to track VictoriaMetrics health state. It is connected with AlertManager for firing alerts,
and with VictoriaMetrics for executing queries and storing alert's state.
[Web interface link](http://localhost:8880/).
From 01a9b36a95ee10374d21b959a7a4db2b80b0cc11 Mon Sep 17 00:00:00 2001
From: Yury Molodov
Date: Tue, 6 Dec 2022 07:44:31 +0100
Subject: [PATCH 33/38] vmui: timezone select (#3414)
* feat: add timezone selection
* vmui: provide feature timezone select
* fix: correct timezone with relative time
Co-authored-by: Aliaksandr Valialkin
---
.../Chart/ChartTooltip/ChartTooltip.tsx | 2 +-
.../components/Chart/LineChart/LineChart.tsx | 9 +-
.../CardinalityDatePicker.tsx | 2 +-
.../GlobalSettings/GlobalSettings.tsx | 12 ++
.../LimitsConfigurator/LimitsConfigurator.tsx | 2 +-
.../LimitsConfigurator/style.scss | 7 -
.../ServerConfigurator/ServerConfigurator.tsx | 20 ++-
.../GlobalSettings/Timezones/Timezones.tsx | 143 ++++++++++++++++++
.../GlobalSettings/Timezones/style.scss | 96 ++++++++++++
.../Configurators/GlobalSettings/style.scss | 9 ++
.../TimeDurationSelector/style.scss | 2 +-
.../TimeSelector/TimeSelector.tsx | 41 +++--
.../TimeRangeSettings/TimeSelector/style.scss | 24 +++
.../Main/DatePicker/Calendar/Calendar.tsx | 6 +-
.../Calendar/CalendarBody/CalendarBody.tsx | 2 +-
.../Main/DatePicker/Calendar/style.scss | 1 +
.../components/Main/DatePicker/DatePicker.tsx | 2 +-
.../components/Views/GraphView/GraphView.tsx | 4 +-
.../vmui/src/constants/dayjsPlugins.ts | 8 +
.../packages/vmui/src/contexts/Snackbar.tsx | 2 +-
.../vmui/src/hooks/useClickOutside.ts | 8 +-
app/vmui/packages/vmui/src/index.tsx | 1 +
.../vmui/src/state/cardinality/reducer.ts | 2 +-
.../packages/vmui/src/state/time/reducer.ts | 23 ++-
app/vmui/packages/vmui/src/types/index.ts | 6 +
app/vmui/packages/vmui/src/utils/storage.ts | 1 +
app/vmui/packages/vmui/src/utils/time.ts | 70 ++++++---
.../packages/vmui/src/utils/uplot/axes.ts | 14 +-
docs/CHANGELOG.md | 1 +
29 files changed, 453 insertions(+), 67 deletions(-)
create mode 100644 app/vmui/packages/vmui/src/components/Configurators/GlobalSettings/Timezones/Timezones.tsx
create mode 100644 app/vmui/packages/vmui/src/components/Configurators/GlobalSettings/Timezones/style.scss
create mode 100644 app/vmui/packages/vmui/src/constants/dayjsPlugins.ts
diff --git a/app/vmui/packages/vmui/src/components/Chart/ChartTooltip/ChartTooltip.tsx b/app/vmui/packages/vmui/src/components/Chart/ChartTooltip/ChartTooltip.tsx
index 0997719467..f8a38280d1 100644
--- a/app/vmui/packages/vmui/src/components/Chart/ChartTooltip/ChartTooltip.tsx
+++ b/app/vmui/packages/vmui/src/components/Chart/ChartTooltip/ChartTooltip.tsx
@@ -49,7 +49,7 @@ const ChartTooltip: FC = ({
const value = useMemo(() => get(u, ["data", seriesIdx, dataIdx], 0), [u, seriesIdx, dataIdx]);
const valueFormat = useMemo(() => formatPrettyNumber(value), [value]);
const dataTime = useMemo(() => u.data[0][dataIdx], [u, dataIdx]);
- const date = useMemo(() => dayjs(new Date(dataTime * 1000)).format(DATE_FULL_TIMEZONE_FORMAT), [dataTime]);
+ const date = useMemo(() => dayjs(dataTime * 1000).tz().format(DATE_FULL_TIMEZONE_FORMAT), [dataTime]);
const color = useMemo(() => getColorLine(series[seriesIdx]?.label || ""), [series, seriesIdx]);
diff --git a/app/vmui/packages/vmui/src/components/Chart/LineChart/LineChart.tsx b/app/vmui/packages/vmui/src/components/Chart/LineChart/LineChart.tsx
index 1e7e4ff7c0..b7d8e475f8 100644
--- a/app/vmui/packages/vmui/src/components/Chart/LineChart/LineChart.tsx
+++ b/app/vmui/packages/vmui/src/components/Chart/LineChart/LineChart.tsx
@@ -11,7 +11,7 @@ import { defaultOptions } from "../../../utils/uplot/helpers";
import { dragChart } from "../../../utils/uplot/events";
import { getAxes, getMinMaxBuffer } from "../../../utils/uplot/axes";
import { MetricResult } from "../../../api/types";
-import { limitsDurations } from "../../../utils/time";
+import { dateFromSeconds, formatDateForNativeInput, limitsDurations } from "../../../utils/time";
import throttle from "lodash.throttle";
import useResize from "../../../hooks/useResize";
import { TimeParams } from "../../../types";
@@ -20,6 +20,7 @@ import "uplot/dist/uPlot.min.css";
import "./style.scss";
import classNames from "classnames";
import ChartTooltip, { ChartTooltipProps } from "../ChartTooltip/ChartTooltip";
+import dayjs from "dayjs";
export interface LineChartProps {
metrics: MetricResult[];
@@ -57,7 +58,10 @@ const LineChart: FC = ({
const tooltipId = useMemo(() => `${tooltipIdx.seriesIdx}_${tooltipIdx.dataIdx}`, [tooltipIdx]);
const setScale = ({ min, max }: { min: number, max: number }): void => {
- setPeriod({ from: new Date(min * 1000), to: new Date(max * 1000) });
+ setPeriod({
+ from: dayjs(min * 1000).toDate(),
+ to: dayjs(max * 1000).toDate()
+ });
};
const throttledSetScale = useCallback(throttle(setScale, 500), []);
const setPlotScale = ({ u, min, max }: { u: uPlot, min: number, max: number }) => {
@@ -163,6 +167,7 @@ const LineChart: FC = ({
const options: uPlotOptions = {
...defaultOptions,
+ tzDate: ts => dayjs(formatDateForNativeInput(dateFromSeconds(ts))).local().toDate(),
series,
axes: getAxes( [{}, { scale: "1" }], unit),
scales: { ...getScales() },
diff --git a/app/vmui/packages/vmui/src/components/Configurators/CardinalityDatePicker/CardinalityDatePicker.tsx b/app/vmui/packages/vmui/src/components/Configurators/CardinalityDatePicker/CardinalityDatePicker.tsx
index ed6b5bb489..04fa6c3c83 100644
--- a/app/vmui/packages/vmui/src/components/Configurators/CardinalityDatePicker/CardinalityDatePicker.tsx
+++ b/app/vmui/packages/vmui/src/components/Configurators/CardinalityDatePicker/CardinalityDatePicker.tsx
@@ -15,7 +15,7 @@ const CardinalityDatePicker: FC = () => {
const { date } = useCardinalityState();
const cardinalityDispatch = useCardinalityDispatch();
- const dateFormatted = useMemo(() => dayjs(date).format(DATE_FORMAT), [date]);
+ const dateFormatted = useMemo(() => dayjs.tz(date).format(DATE_FORMAT), [date]);
const handleChangeDate = (val: string) => {
cardinalityDispatch({ type: "SET_DATE", payload: val });
diff --git a/app/vmui/packages/vmui/src/components/Configurators/GlobalSettings/GlobalSettings.tsx b/app/vmui/packages/vmui/src/components/Configurators/GlobalSettings/GlobalSettings.tsx
index 09e351f678..589b353f34 100644
--- a/app/vmui/packages/vmui/src/components/Configurators/GlobalSettings/GlobalSettings.tsx
+++ b/app/vmui/packages/vmui/src/components/Configurators/GlobalSettings/GlobalSettings.tsx
@@ -11,6 +11,8 @@ import { SeriesLimits } from "../../../types";
import { useCustomPanelDispatch, useCustomPanelState } from "../../../state/customPanel/CustomPanelStateContext";
import { getAppModeEnable } from "../../../utils/app-mode";
import classNames from "classnames";
+import Timezones from "./Timezones/Timezones";
+import { useTimeDispatch, useTimeState } from "../../../state/time/TimeStateContext";
const title = "Settings";
@@ -18,13 +20,16 @@ const GlobalSettings: FC = () => {
const appModeEnable = getAppModeEnable();
const { serverUrl: stateServerUrl } = useAppState();
+ const { timezone: stateTimezone } = useTimeState();
const { seriesLimits } = useCustomPanelState();
const dispatch = useAppDispatch();
+ const timeDispatch = useTimeDispatch();
const customPanelDispatch = useCustomPanelDispatch();
const [serverUrl, setServerUrl] = useState(stateServerUrl);
const [limits, setLimits] = useState(seriesLimits);
+ const [timezone, setTimezone] = useState(stateTimezone);
const [open, setOpen] = useState(false);
const handleOpen = () => setOpen(true);
@@ -32,6 +37,7 @@ const GlobalSettings: FC = () => {
const handlerApply = () => {
dispatch({ type: "SET_SERVER", payload: serverUrl });
+ timeDispatch({ type: "SET_TIMEZONE", payload: timezone });
customPanelDispatch({ type: "SET_SERIES_LIMITS", payload: limits });
handleClose();
};
@@ -70,6 +76,12 @@ const GlobalSettings: FC = () => {
onEnter={handlerApply}
/>
+
+
+
= ({ limits, onChange , on
return (
-
+
Series limits by tabs
= ({ serverUrl, onChange ,
};
return (
-
+
);
};
diff --git a/app/vmui/packages/vmui/src/components/Configurators/GlobalSettings/Timezones/Timezones.tsx b/app/vmui/packages/vmui/src/components/Configurators/GlobalSettings/Timezones/Timezones.tsx
new file mode 100644
index 0000000000..65fae3aca7
--- /dev/null
+++ b/app/vmui/packages/vmui/src/components/Configurators/GlobalSettings/Timezones/Timezones.tsx
@@ -0,0 +1,143 @@
+import React, { FC, useMemo, useRef, useState } from "preact/compat";
+import { getTimezoneList, getUTCByTimezone } from "../../../../utils/time";
+import { ArrowDropDownIcon } from "../../../Main/Icons";
+import classNames from "classnames";
+import Popper from "../../../Main/Popper/Popper";
+import Accordion from "../../../Main/Accordion/Accordion";
+import dayjs from "dayjs";
+import TextField from "../../../Main/TextField/TextField";
+import { Timezone } from "../../../../types";
+import "./style.scss";
+
+interface TimezonesProps {
+ timezoneState: string
+ onChange: (val: string) => void
+}
+
+const Timezones: FC = ({ timezoneState, onChange }) => {
+
+ const timezones = getTimezoneList();
+
+ const [openList, setOpenList] = useState(false);
+ const [search, setSearch] = useState("");
+ const targetRef = useRef(null);
+
+ const searchTimezones = useMemo(() => {
+ if (!search) return timezones;
+ try {
+ return getTimezoneList(search);
+ } catch (e) {
+ return {};
+ }
+ }, [search, timezones]);
+
+ const timezonesGroups = useMemo(() => Object.keys(searchTimezones), [searchTimezones]);
+
+ const localTimezone = useMemo(() => ({
+ region: dayjs.tz.guess(),
+ utc: getUTCByTimezone(dayjs.tz.guess())
+ }), []);
+
+ const activeTimezone = useMemo(() => ({
+ region: timezoneState,
+ utc: getUTCByTimezone(timezoneState)
+ }), [timezoneState]);
+
+ const toggleOpenList = () => {
+ setOpenList(prev => !prev);
+ };
+
+ const handleCloseList = () => {
+ setOpenList(false);
+ };
+
+ const handleChangeSearch = (val: string) => {
+ setSearch(val);
+ };
+
+ const handleSetTimezone = (val: Timezone) => {
+ onChange(val.region);
+ setSearch("");
+ handleCloseList();
+ };
+
+ const createHandlerSetTimezone = (val: Timezone) => () => {
+ handleSetTimezone(val);
+ };
+
+ return (
+
+
+ Time zone
+
+
+
{activeTimezone.region}
+
{activeTimezone.utc}
+
+
+
+
+
+
+
+
+
+
Browser Time ({localTimezone.region})
+
{localTimezone.utc}
+
+
+ {timezonesGroups.map(t => (
+
}
+ >
+
+ {searchTimezones[t] && searchTimezones[t].map(item => (
+
+
{item.region}
+
{item.utc}
+
+ ))}
+
+
+
+ ))}
+
+
+
+ );
+};
+
+export default Timezones;
diff --git a/app/vmui/packages/vmui/src/components/Configurators/GlobalSettings/Timezones/style.scss b/app/vmui/packages/vmui/src/components/Configurators/GlobalSettings/Timezones/style.scss
new file mode 100644
index 0000000000..185d7e845a
--- /dev/null
+++ b/app/vmui/packages/vmui/src/components/Configurators/GlobalSettings/Timezones/style.scss
@@ -0,0 +1,96 @@
+@use "src/styles/variables" as *;
+
+.vm-timezones {
+
+ &-item {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: $padding-small;
+ cursor: pointer;
+
+ &_selected {
+ border: $border-divider;
+ padding: $padding-small $padding-global;
+ border-radius: $border-radius-small;
+ }
+
+ &__title {
+ text-transform: capitalize;
+ }
+
+ &__utc {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ background-color: rgba($color-black, 0.06);
+ padding: calc($padding-small/2);
+ border-radius: $border-radius-small;
+ }
+
+ &__icon {
+ display: inline-flex;
+ align-items: center;
+ justify-content: flex-end;
+ margin: 0 0 0 auto;
+ transition: transform 200ms ease-in;
+
+ svg {
+ width: 14px;
+ }
+
+ &_open {
+ transform: rotate(180deg);
+ }
+ }
+ }
+
+ &-list {
+ min-width: 600px;
+ max-height: 300px;
+ background-color: $color-background-block;
+ border-radius: $border-radius-medium;
+ overflow: auto;
+
+ &-header {
+ position: sticky;
+ top: 0;
+ background-color: $color-background-block;
+ z-index: 2;
+ border-bottom: $border-divider;
+
+ &__search {
+ padding: $padding-small;
+ }
+ }
+
+ &-group {
+ padding: $padding-small 0;
+ border-bottom: $border-divider;
+
+ &:last-child {
+ border-bottom: none;
+ }
+
+ &__title {
+ font-weight: bold;
+ color: $color-text-secondary;
+ padding: $padding-small $padding-global;
+ }
+
+ &-options {
+ display: grid;
+ align-items: flex-start;
+
+ &__item {
+ padding: $padding-small $padding-global;
+ transition: background-color 200ms ease;
+
+ &:hover {
+ background-color: rgba($color-black, 0.1);
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/app/vmui/packages/vmui/src/components/Configurators/GlobalSettings/style.scss b/app/vmui/packages/vmui/src/components/Configurators/GlobalSettings/style.scss
index 5f40cf32d2..ec0d5c391d 100644
--- a/app/vmui/packages/vmui/src/components/Configurators/GlobalSettings/style.scss
+++ b/app/vmui/packages/vmui/src/components/Configurators/GlobalSettings/style.scss
@@ -10,6 +10,15 @@
}
+ &__title {
+ display: flex;
+ align-items: center;
+ justify-content: flex-start;
+ font-size: $font-size;
+ font-weight: bold;
+ margin-bottom: $padding-global;
+ }
+
&__footer {
display: inline-grid;
grid-template-columns: repeat(2, 1fr);
diff --git a/app/vmui/packages/vmui/src/components/Configurators/TimeRangeSettings/TimeDurationSelector/style.scss b/app/vmui/packages/vmui/src/components/Configurators/TimeRangeSettings/TimeDurationSelector/style.scss
index 79eb3be594..e00038492d 100644
--- a/app/vmui/packages/vmui/src/components/Configurators/TimeRangeSettings/TimeDurationSelector/style.scss
+++ b/app/vmui/packages/vmui/src/components/Configurators/TimeRangeSettings/TimeDurationSelector/style.scss
@@ -1,7 +1,7 @@
@use "src/styles/variables" as *;
.vm-time-duration {
- max-height: 168px;
+ max-height: 200px;
overflow: auto;
font-size: $font-size;
}
diff --git a/app/vmui/packages/vmui/src/components/Configurators/TimeRangeSettings/TimeSelector/TimeSelector.tsx b/app/vmui/packages/vmui/src/components/Configurators/TimeRangeSettings/TimeSelector/TimeSelector.tsx
index 75d5a82cfc..d362277fc2 100644
--- a/app/vmui/packages/vmui/src/components/Configurators/TimeRangeSettings/TimeSelector/TimeSelector.tsx
+++ b/app/vmui/packages/vmui/src/components/Configurators/TimeRangeSettings/TimeSelector/TimeSelector.tsx
@@ -1,5 +1,5 @@
import React, { FC, useEffect, useState, useMemo, useRef } from "preact/compat";
-import { dateFromSeconds, formatDateForNativeInput } from "../../../../utils/time";
+import { dateFromSeconds, formatDateForNativeInput, getRelativeTime, getUTCByTimezone } from "../../../../utils/time";
import TimeDurationSelector from "../TimeDurationSelector/TimeDurationSelector";
import dayjs from "dayjs";
import { getAppModeEnable } from "../../../../utils/app-mode";
@@ -22,20 +22,25 @@ export const TimeSelector: FC = () => {
const [until, setUntil] = useState
();
const [from, setFrom] = useState();
- const formFormat = useMemo(() => dayjs(from).format(DATE_TIME_FORMAT), [from]);
- const untilFormat = useMemo(() => dayjs(until).format(DATE_TIME_FORMAT), [until]);
+ const formFormat = useMemo(() => dayjs.tz(from).format(DATE_TIME_FORMAT), [from]);
+ const untilFormat = useMemo(() => dayjs.tz(until).format(DATE_TIME_FORMAT), [until]);
- const { period: { end, start }, relativeTime } = useTimeState();
+ const { period: { end, start }, relativeTime, timezone, duration } = useTimeState();
const dispatch = useTimeDispatch();
const appModeEnable = getAppModeEnable();
+ const activeTimezone = useMemo(() => ({
+ region: timezone,
+ utc: getUTCByTimezone(timezone)
+ }), [timezone]);
+
useEffect(() => {
setUntil(formatDateForNativeInput(dateFromSeconds(end)));
- }, [end]);
+ }, [timezone, end]);
useEffect(() => {
setFrom(formatDateForNativeInput(dateFromSeconds(start)));
- }, [start]);
+ }, [timezone, start]);
const setDuration = ({ duration, until, id }: {duration: string, until: Date, id: string}) => {
dispatch({ type: "SET_RELATIVE_TIME", payload: { duration, until, id } });
@@ -43,13 +48,13 @@ export const TimeSelector: FC = () => {
};
const formatRange = useMemo(() => {
- const startFormat = dayjs(dateFromSeconds(start)).format(DATE_TIME_FORMAT);
- const endFormat = dayjs(dateFromSeconds(end)).format(DATE_TIME_FORMAT);
+ const startFormat = dayjs.tz(dateFromSeconds(start)).format(DATE_TIME_FORMAT);
+ const endFormat = dayjs.tz(dateFromSeconds(end)).format(DATE_TIME_FORMAT);
return {
start: startFormat,
end: endFormat
};
- }, [start, end]);
+ }, [start, end, timezone]);
const dateTitle = useMemo(() => {
const isRelativeTime = relativeTime && relativeTime !== "none";
@@ -65,7 +70,10 @@ export const TimeSelector: FC = () => {
const setTimeAndClosePicker = () => {
if (from && until) {
- dispatch({ type: "SET_PERIOD", payload: { from: new Date(from), to: new Date(until) } });
+ dispatch({ type: "SET_PERIOD", payload: {
+ from: dayjs(from).toDate(),
+ to: dayjs(until).toDate()
+ } });
}
setOpenOptions(false);
};
@@ -91,6 +99,15 @@ export const TimeSelector: FC = () => {
setOpenOptions(false);
};
+ useEffect(() => {
+ const value = getRelativeTime({
+ relativeTimeId: relativeTime,
+ defaultDuration: duration,
+ defaultEndInput: dateFromSeconds(end),
+ });
+ setDuration({ id: value.relativeTimeId, duration: value.duration, until: value.endInput });
+ }, [timezone]);
+
useClickOutside(wrapperRef, (e) => {
const target = e.target as HTMLElement;
const isFromButton = fromRef?.current && fromRef.current.contains(target);
@@ -159,6 +176,10 @@ export const TimeSelector: FC = () => {
/>
+
+
{activeTimezone.region}
+
{activeTimezone.utc}
+
}
diff --git a/app/vmui/packages/vmui/src/components/Configurators/TimeRangeSettings/TimeSelector/style.scss b/app/vmui/packages/vmui/src/components/Configurators/TimeRangeSettings/TimeSelector/style.scss
index 74424e0133..7452131e59 100644
--- a/app/vmui/packages/vmui/src/components/Configurators/TimeRangeSettings/TimeSelector/style.scss
+++ b/app/vmui/packages/vmui/src/components/Configurators/TimeRangeSettings/TimeSelector/style.scss
@@ -30,6 +30,10 @@
cursor: pointer;
transition: color 200ms ease-in-out, border-bottom-color 300ms ease;
+ &:last-child {
+ margin-bottom: 0;
+ }
+
&:hover {
border-bottom-color: $color-primary;
}
@@ -52,6 +56,26 @@
}
}
+ &-timezone {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: $padding-small;
+ font-size: $font-size-small;
+ margin-bottom: $padding-small;
+
+ &__title {}
+
+ &__utc {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ background-color: rgba($color-black, 0.06);
+ padding: calc($padding-small/2);
+ border-radius: $border-radius-small;
+ }
+ }
+
&__controls {
display: grid;
grid-template-columns: repeat(2, 1fr);
diff --git a/app/vmui/packages/vmui/src/components/Main/DatePicker/Calendar/Calendar.tsx b/app/vmui/packages/vmui/src/components/Main/DatePicker/Calendar/Calendar.tsx
index 2387de5e47..f178d362b4 100644
--- a/app/vmui/packages/vmui/src/components/Main/DatePicker/Calendar/Calendar.tsx
+++ b/app/vmui/packages/vmui/src/components/Main/DatePicker/Calendar/Calendar.tsx
@@ -30,8 +30,8 @@ const Calendar: FC = ({
onClose
}) => {
const [displayYears, setDisplayYears] = useState(false);
- const [viewDate, setViewDate] = useState(dayjs(date));
- const [selectDate, setSelectDate] = useState(dayjs(date));
+ const [viewDate, setViewDate] = useState(dayjs.tz(date));
+ const [selectDate, setSelectDate] = useState(dayjs.tz(date));
const [tab, setTab] = useState(tabs[0].value);
const toggleDisplayYears = () => {
@@ -62,7 +62,7 @@ const Calendar: FC = ({
};
useEffect(() => {
- if (selectDate.format() === dayjs(date).format()) return;
+ if (selectDate.format() === dayjs.tz(date).format()) return;
onChange(selectDate.format(format));
}, [selectDate]);
diff --git a/app/vmui/packages/vmui/src/components/Main/DatePicker/Calendar/CalendarBody/CalendarBody.tsx b/app/vmui/packages/vmui/src/components/Main/DatePicker/Calendar/CalendarBody/CalendarBody.tsx
index 701bc7434a..2b24d3fb95 100644
--- a/app/vmui/packages/vmui/src/components/Main/DatePicker/Calendar/CalendarBody/CalendarBody.tsx
+++ b/app/vmui/packages/vmui/src/components/Main/DatePicker/Calendar/CalendarBody/CalendarBody.tsx
@@ -11,7 +11,7 @@ interface CalendarBodyProps {
const weekday = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
const CalendarBody: FC = ({ viewDate, selectDate, onChangeSelectDate }) => {
- const today = dayjs().startOf("day");
+ const today = dayjs().tz().startOf("day");
const days: (Dayjs|null)[] = useMemo(() => {
const result = new Array(42).fill(null);
diff --git a/app/vmui/packages/vmui/src/components/Main/DatePicker/Calendar/style.scss b/app/vmui/packages/vmui/src/components/Main/DatePicker/Calendar/style.scss
index 2be976d37f..fdc188d0c8 100644
--- a/app/vmui/packages/vmui/src/components/Main/DatePicker/Calendar/style.scss
+++ b/app/vmui/packages/vmui/src/components/Main/DatePicker/Calendar/style.scss
@@ -135,6 +135,7 @@
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: $padding-small;
+ max-height: 400px;
overflow: auto;
&__year {
diff --git a/app/vmui/packages/vmui/src/components/Main/DatePicker/DatePicker.tsx b/app/vmui/packages/vmui/src/components/Main/DatePicker/DatePicker.tsx
index 69b668c79f..9a5500879b 100644
--- a/app/vmui/packages/vmui/src/components/Main/DatePicker/DatePicker.tsx
+++ b/app/vmui/packages/vmui/src/components/Main/DatePicker/DatePicker.tsx
@@ -20,7 +20,7 @@ const DatePicker = forwardRef(({
onChange,
}, ref) => {
const [openCalendar, setOpenCalendar] = useState(false);
- const dateDayjs = useMemo(() => date ? dayjs(date) : dayjs(), [date]);
+ const dateDayjs = useMemo(() => date ? dayjs.tz(date) : dayjs().tz(), [date]);
const toggleOpenCalendar = () => {
setOpenCalendar(prev => !prev);
diff --git a/app/vmui/packages/vmui/src/components/Views/GraphView/GraphView.tsx b/app/vmui/packages/vmui/src/components/Views/GraphView/GraphView.tsx
index 8062325d98..31f505a100 100644
--- a/app/vmui/packages/vmui/src/components/Views/GraphView/GraphView.tsx
+++ b/app/vmui/packages/vmui/src/components/Views/GraphView/GraphView.tsx
@@ -10,6 +10,7 @@ import { TimeParams } from "../../../types";
import { AxisRange, YaxisState } from "../../../state/graph/reducer";
import { getAvgFromArray, getMaxFromArray, getMinFromArray } from "../../../utils/math";
import classNames from "classnames";
+import { useTimeState } from "../../../state/time/TimeStateContext";
import "./style.scss";
export interface GraphViewProps {
@@ -54,6 +55,7 @@ const GraphView: FC = ({
alias = [],
fullWidth = true
}) => {
+ const { timezone } = useTimeState();
const currentStep = useMemo(() => customStep || period.step || 1, [period.step, customStep]);
const [dataChart, setDataChart] = useState([[]]);
@@ -121,7 +123,7 @@ const GraphView: FC = ({
setDataChart(timeDataSeries as uPlotData);
setSeries(tempSeries);
setLegend(tempLegend);
- }, [data]);
+ }, [data, timezone]);
useEffect(() => {
const tempLegend: LegendItemType[] = [];
diff --git a/app/vmui/packages/vmui/src/constants/dayjsPlugins.ts b/app/vmui/packages/vmui/src/constants/dayjsPlugins.ts
new file mode 100644
index 0000000000..536d1b63a9
--- /dev/null
+++ b/app/vmui/packages/vmui/src/constants/dayjsPlugins.ts
@@ -0,0 +1,8 @@
+import dayjs from "dayjs";
+import timezone from "dayjs/plugin/timezone";
+import duration from "dayjs/plugin/duration";
+import utc from "dayjs/plugin/utc";
+
+dayjs.extend(timezone);
+dayjs.extend(duration);
+dayjs.extend(utc);
diff --git a/app/vmui/packages/vmui/src/contexts/Snackbar.tsx b/app/vmui/packages/vmui/src/contexts/Snackbar.tsx
index 8f9f4e2f3b..2172cd1b87 100644
--- a/app/vmui/packages/vmui/src/contexts/Snackbar.tsx
+++ b/app/vmui/packages/vmui/src/contexts/Snackbar.tsx
@@ -36,7 +36,7 @@ export const SnackbarProvider: FC = ({ children }) => {
setSnack({
message: infoMessage.text,
variant: infoMessage.type,
- key: new Date().getTime()
+ key: Date.now()
});
setOpen(true);
const timeout = setTimeout(handleClose, 4000);
diff --git a/app/vmui/packages/vmui/src/hooks/useClickOutside.ts b/app/vmui/packages/vmui/src/hooks/useClickOutside.ts
index 25f716b2a2..5f39e15261 100644
--- a/app/vmui/packages/vmui/src/hooks/useClickOutside.ts
+++ b/app/vmui/packages/vmui/src/hooks/useClickOutside.ts
@@ -8,9 +8,8 @@ const useClickOutside = (
preventRef?: RefObject
) => {
useEffect(() => {
- const el = ref?.current;
-
const listener = (event: Event) => {
+ const el = ref?.current;
const target = event.target as HTMLElement;
const isPreventRef = preventRef?.current && preventRef.current.contains(target);
if (!el || el.contains((event?.target as Node) || null) || isPreventRef) {
@@ -23,13 +22,10 @@ const useClickOutside = (
document.addEventListener("mousedown", listener);
document.addEventListener("touchstart", listener);
- const removeListeners = () => {
+ return () => {
document.removeEventListener("mousedown", listener);
document.removeEventListener("touchstart", listener);
};
-
- if (!el) removeListeners();
- return removeListeners;
}, [ref, handler]); // Reload only if ref or handler changes
};
diff --git a/app/vmui/packages/vmui/src/index.tsx b/app/vmui/packages/vmui/src/index.tsx
index b989336c19..20e08435cc 100644
--- a/app/vmui/packages/vmui/src/index.tsx
+++ b/app/vmui/packages/vmui/src/index.tsx
@@ -1,4 +1,5 @@
import React, { render } from "preact/compat";
+import "./constants/dayjsPlugins";
import App from "./App";
import reportWebVitals from "./reportWebVitals";
import "./styles/style.scss";
diff --git a/app/vmui/packages/vmui/src/state/cardinality/reducer.ts b/app/vmui/packages/vmui/src/state/cardinality/reducer.ts
index ffb8ac25bb..86531cc9ef 100644
--- a/app/vmui/packages/vmui/src/state/cardinality/reducer.ts
+++ b/app/vmui/packages/vmui/src/state/cardinality/reducer.ts
@@ -23,7 +23,7 @@ export type Action =
export const initialState: CardinalityState = {
runQuery: 0,
topN: getQueryStringValue("topN", 10) as number,
- date: getQueryStringValue("date", dayjs(new Date()).format(DATE_FORMAT)) as string,
+ date: getQueryStringValue("date", dayjs().tz().format(DATE_FORMAT)) as string,
focusLabel: getQueryStringValue("focusLabel", "") as string,
match: getQueryStringValue("match", "") as string,
extraLabel: getQueryStringValue("extra_label", "") as string,
diff --git a/app/vmui/packages/vmui/src/state/time/reducer.ts b/app/vmui/packages/vmui/src/state/time/reducer.ts
index 38b2a5cb4c..6cc69ac40a 100644
--- a/app/vmui/packages/vmui/src/state/time/reducer.ts
+++ b/app/vmui/packages/vmui/src/state/time/reducer.ts
@@ -5,14 +5,18 @@ import {
getDateNowUTC,
getDurationFromPeriod,
getTimeperiodForDuration,
- getRelativeTime
+ getRelativeTime,
+ setTimezone
} from "../../utils/time";
import { getQueryStringValue } from "../../utils/query-string";
+import dayjs from "dayjs";
+import { getFromStorage, saveToStorage } from "../../utils/storage";
export interface TimeState {
duration: string;
period: TimeParams;
relativeTime?: string;
+ timezone: string;
}
export type TimeAction =
@@ -21,12 +25,16 @@ export type TimeAction =
| { type: "SET_PERIOD", payload: TimePeriod }
| { type: "RUN_QUERY"}
| { type: "RUN_QUERY_TO_NOW"}
+ | { type: "SET_TIMEZONE", payload: string }
+
+const timezone = getFromStorage("TIMEZONE") as string || dayjs.tz.guess();
+setTimezone(timezone);
const defaultDuration = getQueryStringValue("g0.range_input") as string;
const { duration, endInput, relativeTimeId } = getRelativeTime({
defaultDuration: defaultDuration || "1h",
- defaultEndInput: new Date(formatDateToLocal(getQueryStringValue("g0.end_input", getDateNowUTC()) as Date)),
+ defaultEndInput: formatDateToLocal(getQueryStringValue("g0.end_input", getDateNowUTC()) as string),
relativeTimeId: defaultDuration ? getQueryStringValue("g0.relative_time", "none") as string : undefined
});
@@ -34,8 +42,10 @@ export const initialTimeState: TimeState = {
duration,
period: getTimeperiodForDuration(duration, endInput),
relativeTime: relativeTimeId,
+ timezone,
};
+
export function reducer(state: TimeState, action: TimeAction): TimeState {
switch (action.type) {
case "SET_DURATION":
@@ -49,7 +59,7 @@ export function reducer(state: TimeState, action: TimeAction): TimeState {
return {
...state,
duration: action.payload.duration,
- period: getTimeperiodForDuration(action.payload.duration, new Date(action.payload.until)),
+ period: getTimeperiodForDuration(action.payload.duration, action.payload.until),
relativeTime: action.payload.id,
};
case "SET_PERIOD":
@@ -77,6 +87,13 @@ export function reducer(state: TimeState, action: TimeAction): TimeState {
...state,
period: getTimeperiodForDuration(state.duration)
};
+ case "SET_TIMEZONE":
+ setTimezone(action.payload);
+ saveToStorage("TIMEZONE", action.payload);
+ return {
+ ...state,
+ timezone: action.payload
+ };
default:
throw new Error();
}
diff --git a/app/vmui/packages/vmui/src/types/index.ts b/app/vmui/packages/vmui/src/types/index.ts
index be5d2a56ca..c6085a3bcf 100644
--- a/app/vmui/packages/vmui/src/types/index.ts
+++ b/app/vmui/packages/vmui/src/types/index.ts
@@ -105,3 +105,9 @@ export interface SeriesLimits {
chart: number,
code: number,
}
+
+export interface Timezone {
+ region: string,
+ utc: string,
+ search?: string
+}
diff --git a/app/vmui/packages/vmui/src/utils/storage.ts b/app/vmui/packages/vmui/src/utils/storage.ts
index f08833577a..86d238a8b1 100644
--- a/app/vmui/packages/vmui/src/utils/storage.ts
+++ b/app/vmui/packages/vmui/src/utils/storage.ts
@@ -6,6 +6,7 @@ export type StorageKeys = "BASIC_AUTH_DATA"
| "QUERY_TRACING"
| "SERIES_LIMITS"
| "TABLE_COMPACT"
+ | "TIMEZONE"
export const saveToStorage = (key: StorageKeys, value: string | boolean | Record): void => {
if (value) {
diff --git a/app/vmui/packages/vmui/src/utils/time.ts b/app/vmui/packages/vmui/src/utils/time.ts
index de1d445279..2b789c25f3 100644
--- a/app/vmui/packages/vmui/src/utils/time.ts
+++ b/app/vmui/packages/vmui/src/utils/time.ts
@@ -1,17 +1,16 @@
-import { RelativeTimeOption, TimeParams, TimePeriod } from "../types";
+import { RelativeTimeOption, TimeParams, TimePeriod, Timezone } from "../types";
import dayjs, { UnitTypeShort } from "dayjs";
-import duration from "dayjs/plugin/duration";
-import utc from "dayjs/plugin/utc";
import { getQueryStringValue } from "./query-string";
import { DATE_ISO_FORMAT } from "../constants/date";
-dayjs.extend(duration);
-dayjs.extend(utc);
-
const MAX_ITEMS_PER_CHART = window.innerWidth / 4;
export const limitsDurations = { min: 1, max: 1.578e+11 }; // min: 1 ms, max: 5 years
+// eslint-disable-next-line @typescript-eslint/ban-ts-comment
+// @ts-ignore
+export const supportedTimezones = Intl.supportedValuesOf("timeZone") as string[];
+
export const supportedDurations = [
{ long: "days", short: "d", possible: "day" },
{ long: "weeks", short: "w", possible: "week" },
@@ -38,7 +37,7 @@ export const isSupportedDuration = (str: string): Partial {
- const n = (date || new Date()).valueOf() / 1000;
+ const n = (date || dayjs().toDate()).valueOf() / 1000;
const durItems = dur.trim().split(" ");
@@ -64,24 +63,24 @@ export const getTimeperiodForDuration = (dur: string, date?: Date): TimeParams =
start: n - delta,
end: n,
step: step,
- date: formatDateToUTC(date || new Date())
+ date: formatDateToUTC(date || dayjs().toDate())
};
};
-export const formatDateToLocal = (date: Date): string => {
- return dayjs(date).utcOffset(0, true).local().format(DATE_ISO_FORMAT);
+export const formatDateToLocal = (date: string): Date => {
+ return dayjs(date).utcOffset(0, true).toDate();
};
export const formatDateToUTC = (date: Date): string => {
- return dayjs(date).utc().format(DATE_ISO_FORMAT);
+ return dayjs.tz(date).utc().format(DATE_ISO_FORMAT);
};
export const formatDateForNativeInput = (date: Date): string => {
- return dayjs(date).format(DATE_ISO_FORMAT);
+ return dayjs.tz(date).format(DATE_ISO_FORMAT);
};
-export const getDateNowUTC = (): Date => {
- return new Date(dayjs().utc().format(DATE_ISO_FORMAT));
+export const getDateNowUTC = (): string => {
+ return dayjs().utc().format(DATE_ISO_FORMAT);
};
export const getDurationFromMilliseconds = (ms: number): string => {
@@ -115,7 +114,10 @@ export const checkDurationLimit = (dur: string): string => {
return dur;
};
-export const dateFromSeconds = (epochTimeInSeconds: number): Date => new Date(epochTimeInSeconds * 1000);
+export const dateFromSeconds = (epochTimeInSeconds: number): Date => dayjs(epochTimeInSeconds * 1000).toDate();
+
+const getYesterday = () => dayjs().tz().subtract(1, "day").endOf("day").toDate();
+const getToday = () => dayjs().tz().endOf("day").toDate();
export const relativeTimeOptions: RelativeTimeOption[] = [
{ title: "Last 5 minutes", duration: "5m" },
@@ -132,11 +134,11 @@ export const relativeTimeOptions: RelativeTimeOption[] = [
{ title: "Last 90 days", duration: "90d" },
{ title: "Last 180 days", duration: "180d" },
{ title: "Last 1 year", duration: "1y" },
- { title: "Yesterday", duration: "1d", until: () => dayjs().subtract(1, "day").endOf("day").toDate() },
- { title: "Today", duration: "1d", until: () => dayjs().endOf("day").toDate() },
+ { title: "Yesterday", duration: "1d", until: getYesterday },
+ { title: "Today", duration: "1d", until: getToday },
].map(o => ({
id: o.title.replace(/\s/g, "_").toLocaleLowerCase(),
- until: o.until ? o.until : () => dayjs().toDate(),
+ until: o.until ? o.until : () => dayjs().tz().toDate(),
...o
}));
@@ -151,3 +153,35 @@ export const getRelativeTime = ({ relativeTimeId, defaultDuration, defaultEndInp
endInput: target ? target.until() : defaultEndInput
};
};
+
+export const getUTCByTimezone = (timezone: string) => {
+ const date = dayjs().tz(timezone);
+ return `UTC${date.format("Z")}`;
+};
+
+export const getTimezoneList = (search = "") => {
+ const regexp = new RegExp(search, "i");
+
+ return supportedTimezones.reduce((acc: {[key: string]: Timezone[]}, region) => {
+ const zone = (region.match(/^(.*?)\//) || [])[1] || "unknown";
+ const utc = getUTCByTimezone(region);
+ const item = {
+ region,
+ utc,
+ search: `${region} ${utc} ${region.replace(/[/_]/gmi, " ")}`
+ };
+ const includeZone = !search || (search && regexp.test(item.search));
+
+ if (includeZone && acc[zone]) {
+ acc[zone].push(item);
+ } else if (includeZone) {
+ acc[zone] = [item];
+ }
+
+ return acc;
+ }, {});
+};
+
+export const setTimezone = (timezone: string) => {
+ dayjs.tz.setDefault(timezone);
+};
diff --git a/app/vmui/packages/vmui/src/utils/uplot/axes.ts b/app/vmui/packages/vmui/src/utils/uplot/axes.ts
index 80760aa693..c3c225323e 100644
--- a/app/vmui/packages/vmui/src/utils/uplot/axes.ts
+++ b/app/vmui/packages/vmui/src/utils/uplot/axes.ts
@@ -5,6 +5,18 @@ import { AxisRange } from "../../state/graph/reducer";
import { formatTicks, sizeAxis } from "./helpers";
import { TimeParams } from "../../types";
+// see https://github.com/leeoniya/uPlot/tree/master/docs#axis--grid-opts
+const timeValues = [
+ // tick incr default year month day hour min sec mode
+ [3600 * 24 * 365, "{YYYY}", null, null, null, null, null, null, 1],
+ [3600 * 24 * 28, "{MMM}", "\n{YYYY}", null, null, null, null, null, 1],
+ [3600 * 24, "{MM}-{DD}", "\n{YYYY}", null, null, null, null, null, 1],
+ [3600, "{HH}:{mm}", "\n{YYYY}-{MM}-{DD}", null, "\n{MM}-{DD}", null, null, null, 1],
+ [60, "{HH}:{mm}", "\n{YYYY}-{MM}-{DD}", null, "\n{MM}-{DD}", null, null, null, 1],
+ [1, "{HH}:{mm}:{ss}", "\n{YYYY}-{MM}-{DD}", null, "\n{MM}-{DD} {HH}:{mm}", null, null, null, 1],
+ [0.001, ":{ss}.{fff}", "\n{YYYY}-{MM}-{DD} {HH}:{mm}", null, "\n{MM}-{DD} {HH}:{mm}", null, "\n{HH}:{mm}", null, 1],
+];
+
export const getAxes = (series: Series[], unit?: string): Axis[] => Array.from(new Set(series.map(s => s.scale))).map(a => {
const axis = {
scale: a,
@@ -13,7 +25,7 @@ export const getAxes = (series: Series[], unit?: string): Axis[] => Array.from(n
font: "10px Arial",
values: (u: uPlot, ticks: number[]) => formatTicks(u, ticks, unit)
};
- if (!a) return { space: 80 };
+ if (!a) return { space: 80, values: timeValues };
if (!(Number(a) % 2)) return { ...axis, side: 1 };
return axis;
});
diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md
index 468e3f6ac1..031b7baf2f 100644
--- a/docs/CHANGELOG.md
+++ b/docs/CHANGELOG.md
@@ -51,6 +51,7 @@ The following tip changes can be tested by building VictoriaMetrics components f
* FEATURE: [vmalert](https://docs.victoriametrics.com/vmalert.html): add `-remoteWrite.sendTimeout` command-line flag, which allows configuring timeout for sending data to `-remoteWrite.url`. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3408).
* FEATURE: [vmctl](https://docs.victoriametrics.com/vmctl.html): add ability to migrate data between VictoriaMetrics clusters with automatic tenants discovery. See [these docs](https://docs.victoriametrics.com/vmctl.html#cluster-to-cluster-migration-mode) and [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/2930).
* FEATURE: [vmctl](https://docs.victoriametrics.com/vmctl.html): add ability to copy data from sources via Prometheus `remote_read` protocol. See [these docs](https://docs.victoriametrics.com/vmctl.html#migrating-data-by-remote-read-protocol). The related issues: [one](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3132) and [two](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1101).
+* FEATURE: [vmui](https://docs.victoriametrics.com/#vmui): allow changing timezones for the requested data. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3075).
* FEATURE: [MetricsQL](https://docs.victoriametrics.com/MetricsQL.html): add `range_trim_spikes(phi, q)` function for trimming `phi` percent of the largest spikes per each time series returned by `q`. See [these docs](https://docs.victoriametrics.com/MetricsQL.html#range_trim_spikes).
* BUGFIX: [vmalert](https://docs.victoriametrics.com/vmalert.html): properly pass HTTP headers during the alert state restore procedure. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3418).
From 7645d9ae007c6bd4aa931826299675f642662ce6 Mon Sep 17 00:00:00 2001
From: Yury Molodov
Date: Tue, 6 Dec 2022 07:45:15 +0100
Subject: [PATCH 34/38] feat: add toggle query display by Ctrl (#3449)
---
.../Main/ShortcutKeys/ShortcutKeys.tsx | 15 ++++++++++++++
.../components/Main/ShortcutKeys/style.scss | 2 +-
.../QueryConfigurator/QueryConfigurator.tsx | 20 ++++++++++++++-----
3 files changed, 31 insertions(+), 6 deletions(-)
diff --git a/app/vmui/packages/vmui/src/components/Main/ShortcutKeys/ShortcutKeys.tsx b/app/vmui/packages/vmui/src/components/Main/ShortcutKeys/ShortcutKeys.tsx
index 2ae8a9aeb4..7dfd619e7b 100644
--- a/app/vmui/packages/vmui/src/components/Main/ShortcutKeys/ShortcutKeys.tsx
+++ b/app/vmui/packages/vmui/src/components/Main/ShortcutKeys/ShortcutKeys.tsx
@@ -28,6 +28,10 @@ const keyList = [
{
keys: [ctrlMeta, "Arrow Down"],
description: "Next command from the Query history"
+ },
+ {
+ keys: [ctrlMeta, "Click by 'Eye'"],
+ description: "Toggle multiple queries"
}
]
},
@@ -36,10 +40,12 @@ const keyList = [
list: [
{
keys: [ctrlMeta, "Scroll Up"],
+ alt: ["+"],
description: "Zoom in"
},
{
keys: [ctrlMeta, "Scroll Down"],
+ alt: ["-"],
description: "Zoom out"
},
{
@@ -118,6 +124,15 @@ const ShortcutKeys: FC = () => {
{i !== l.keys.length - 1 ? "+" : ""}
>
))}
+ {l.alt && l.alt.map((alt, i) => (
+ <>
+ or
+
+ {alt}
+
+ {i !== l.alt.length - 1 ? "+" : ""}
+ >
+ ))}
{l.description}
diff --git a/app/vmui/packages/vmui/src/components/Main/ShortcutKeys/style.scss b/app/vmui/packages/vmui/src/components/Main/ShortcutKeys/style.scss
index 7550b9fc40..c6668f4d52 100644
--- a/app/vmui/packages/vmui/src/components/Main/ShortcutKeys/style.scss
+++ b/app/vmui/packages/vmui/src/components/Main/ShortcutKeys/style.scss
@@ -19,7 +19,7 @@
&-item {
display: grid;
- grid-template-columns: 180px 1fr;
+ grid-template-columns: 210px 1fr;
align-items: center;
gap: $padding-small;
diff --git a/app/vmui/packages/vmui/src/pages/CustomPanel/QueryConfigurator/QueryConfigurator.tsx b/app/vmui/packages/vmui/src/pages/CustomPanel/QueryConfigurator/QueryConfigurator.tsx
index 543e91c1b4..ffbe7c76f5 100644
--- a/app/vmui/packages/vmui/src/pages/CustomPanel/QueryConfigurator/QueryConfigurator.tsx
+++ b/app/vmui/packages/vmui/src/pages/CustomPanel/QueryConfigurator/QueryConfigurator.tsx
@@ -11,6 +11,8 @@ import Button from "../../../components/Main/Button/Button";
import "./style.scss";
import Tooltip from "../../../components/Main/Tooltip/Tooltip";
import classNames from "classnames";
+import { MouseEvent as ReactMouseEvent } from "react";
+import { arrayEquals } from "../../../utils/array";
export interface QueryConfiguratorProps {
error?: ErrorTypes | string;
@@ -55,8 +57,16 @@ const QueryConfigurator: FC = ({ error, queryOptions, on
setStateQuery(prev => prev.filter((q, i) => i !== index));
};
- const onToggleHideQuery = (index: number) => {
- setHideQuery(prev => prev.includes(index) ? prev.filter(n => n !== index) : [...prev, index]);
+ const onToggleHideQuery = (e: ReactMouseEvent, index: number) => {
+ const { ctrlKey, metaKey } = e;
+ const ctrlMetaKey = ctrlKey || metaKey;
+
+ if (ctrlMetaKey) {
+ const hideIndexes = stateQuery.map((q, i) => i).filter(n => n !== index);
+ setHideQuery(prev => arrayEquals(hideIndexes, prev) ? [] : hideIndexes);
+ } else {
+ setHideQuery(prev => prev.includes(index) ? prev.filter(n => n !== index) : [...prev, index]);
+ }
};
const handleChangeQuery = (value: string, index: number) => {
@@ -84,11 +94,11 @@ const QueryConfigurator: FC = ({ error, queryOptions, on
const createHandlerRemoveQuery = (i: number) => () => {
onRemoveQuery(i);
- setHideQuery(prev => prev.map(n => n > i ? n - 1: n));
+ setHideQuery(prev => prev.includes(i) ? prev.filter(n => n !== i) : prev.map(n => n > i ? n - 1: n));
};
- const createHandlerHideQuery = (i: number) => () => {
- onToggleHideQuery(i);
+ const createHandlerHideQuery = (i: number) => (e: ReactMouseEvent) => {
+ onToggleHideQuery(e, i);
};
useEffect(() => {
From caa1c43166ab63a2cfa209c47b775ce91d3a9aa1 Mon Sep 17 00:00:00 2001
From: Aliaksandr Valialkin
Date: Mon, 5 Dec 2022 22:50:38 -0800
Subject: [PATCH 35/38] docs: follow-up for
7645d9ae007c6bd4aa931826299675f642662ce6
- Document the change at docs/CHANGELOG.md
- Document the feature at https://docs.victoriametrics.com/#vmui
Updates https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3446
---
README.md | 4 +++-
docs/CHANGELOG.md | 1 +
docs/README.md | 4 +++-
docs/Single-server-VictoriaMetrics.md | 4 +++-
4 files changed, 10 insertions(+), 3 deletions(-)
diff --git a/README.md b/README.md
index c697791ee8..ed6f9caff5 100644
--- a/README.md
+++ b/README.md
@@ -275,7 +275,7 @@ It also provides the following features:
- [query tracer](#query-tracing)
- [top queries explorer](#top-queries)
-Graphs in vmui support scrolling and zooming:
+Graphs in `vmui` support scrolling and zooming:
* Select the needed time range on the graph in order to zoom in into the selected time range. Hold `ctrl` (or `cmd` on MacOS) and scroll down in order to zoom out.
* Hold `ctrl` (or `cmd` on MacOS) and scroll up in order to zoom in the area under cursor.
@@ -293,6 +293,8 @@ VMUI allows investigating correlations between multiple queries on the same grap
enter an additional query in the newly appeared input field and press `Enter`.
Results for all the queries are displayed simultaneously on the same graph.
Graphs for a particular query can be temporarily hidden by clicking the `eye` icon on the right side of the input field.
+When the `eye` icon is clicked while holding the `ctrl` key, then query results for the rest of queries become hidden
+except of the current query results.
See the [example VMUI at VictoriaMetrics playground](https://play.victoriametrics.com/select/accounting/1/6a716b0f-38bc-4856-90ce-448fd713e3fe/prometheus/graph/?g0.expr=100%20*%20sum(rate(process_cpu_seconds_total))%20by%20(job)&g0.range_input=1d).
diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md
index 031b7baf2f..7f7886bb54 100644
--- a/docs/CHANGELOG.md
+++ b/docs/CHANGELOG.md
@@ -52,6 +52,7 @@ The following tip changes can be tested by building VictoriaMetrics components f
* FEATURE: [vmctl](https://docs.victoriametrics.com/vmctl.html): add ability to migrate data between VictoriaMetrics clusters with automatic tenants discovery. See [these docs](https://docs.victoriametrics.com/vmctl.html#cluster-to-cluster-migration-mode) and [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/2930).
* FEATURE: [vmctl](https://docs.victoriametrics.com/vmctl.html): add ability to copy data from sources via Prometheus `remote_read` protocol. See [these docs](https://docs.victoriametrics.com/vmctl.html#migrating-data-by-remote-read-protocol). The related issues: [one](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3132) and [two](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1101).
* FEATURE: [vmui](https://docs.victoriametrics.com/#vmui): allow changing timezones for the requested data. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3075).
+* FEATURE: [vmui](https://docs.victoriametrics.com/#vmui): provide fast path for hiding results for all the queries except the given one by clicking `eye` icon with `ctrl` key pressed. See [this feature request](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3446).
* FEATURE: [MetricsQL](https://docs.victoriametrics.com/MetricsQL.html): add `range_trim_spikes(phi, q)` function for trimming `phi` percent of the largest spikes per each time series returned by `q`. See [these docs](https://docs.victoriametrics.com/MetricsQL.html#range_trim_spikes).
* BUGFIX: [vmalert](https://docs.victoriametrics.com/vmalert.html): properly pass HTTP headers during the alert state restore procedure. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3418).
diff --git a/docs/README.md b/docs/README.md
index 7a716a12eb..c9d5f9ea95 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -276,7 +276,7 @@ It also provides the following features:
- [query tracer](#query-tracing)
- [top queries explorer](#top-queries)
-Graphs in vmui support scrolling and zooming:
+Graphs in `vmui` support scrolling and zooming:
* Select the needed time range on the graph in order to zoom in into the selected time range. Hold `ctrl` (or `cmd` on MacOS) and scroll down in order to zoom out.
* Hold `ctrl` (or `cmd` on MacOS) and scroll up in order to zoom in the area under cursor.
@@ -294,6 +294,8 @@ VMUI allows investigating correlations between multiple queries on the same grap
enter an additional query in the newly appeared input field and press `Enter`.
Results for all the queries are displayed simultaneously on the same graph.
Graphs for a particular query can be temporarily hidden by clicking the `eye` icon on the right side of the input field.
+When the `eye` icon is clicked while holding the `ctrl` key, then query results for the rest of queries become hidden
+except of the current query results.
See the [example VMUI at VictoriaMetrics playground](https://play.victoriametrics.com/select/accounting/1/6a716b0f-38bc-4856-90ce-448fd713e3fe/prometheus/graph/?g0.expr=100%20*%20sum(rate(process_cpu_seconds_total))%20by%20(job)&g0.range_input=1d).
diff --git a/docs/Single-server-VictoriaMetrics.md b/docs/Single-server-VictoriaMetrics.md
index 8fe2a4103f..aff18a8497 100644
--- a/docs/Single-server-VictoriaMetrics.md
+++ b/docs/Single-server-VictoriaMetrics.md
@@ -279,7 +279,7 @@ It also provides the following features:
- [query tracer](#query-tracing)
- [top queries explorer](#top-queries)
-Graphs in vmui support scrolling and zooming:
+Graphs in `vmui` support scrolling and zooming:
* Select the needed time range on the graph in order to zoom in into the selected time range. Hold `ctrl` (or `cmd` on MacOS) and scroll down in order to zoom out.
* Hold `ctrl` (or `cmd` on MacOS) and scroll up in order to zoom in the area under cursor.
@@ -297,6 +297,8 @@ VMUI allows investigating correlations between multiple queries on the same grap
enter an additional query in the newly appeared input field and press `Enter`.
Results for all the queries are displayed simultaneously on the same graph.
Graphs for a particular query can be temporarily hidden by clicking the `eye` icon on the right side of the input field.
+When the `eye` icon is clicked while holding the `ctrl` key, then query results for the rest of queries become hidden
+except of the current query results.
See the [example VMUI at VictoriaMetrics playground](https://play.victoriametrics.com/select/accounting/1/6a716b0f-38bc-4856-90ce-448fd713e3fe/prometheus/graph/?g0.expr=100%20*%20sum(rate(process_cpu_seconds_total))%20by%20(job)&g0.range_input=1d).
From 1e0666abb4a5a5e7c79d683b3db8a159937aa2cc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pedro=20Gon=C3=A7alves?=
Date: Mon, 5 Dec 2022 23:06:03 -0800
Subject: [PATCH 36/38] Datadog - Add device as a tag if it's present as a
field in the series object (#3431)
* Datadog - Add device as a tag if it's present as a field in the series object
* address PR comments
---
app/vmagent/datadog/request_handler.go | 6 ++++++
app/vminsert/datadog/request_handler.go | 3 +++
lib/protoparser/datadog/parser.go | 4 ++++
lib/protoparser/datadog/parser_test.go | 2 ++
4 files changed, 15 insertions(+)
diff --git a/app/vmagent/datadog/request_handler.go b/app/vmagent/datadog/request_handler.go
index f094f2c26c..ae337be8b1 100644
--- a/app/vmagent/datadog/request_handler.go
+++ b/app/vmagent/datadog/request_handler.go
@@ -56,6 +56,12 @@ func insertRows(at *auth.Token, series []parser.Series, extraLabels []prompbmars
Name: "host",
Value: ss.Host,
})
+ if ss.Device != "" {
+ labels = append(labels, prompbmarshal.Label{
+ Name: "device",
+ Value: ss.Device,
+ })
+ }
for _, tag := range ss.Tags {
name, value := parser.SplitTag(tag)
if name == "host" {
diff --git a/app/vminsert/datadog/request_handler.go b/app/vminsert/datadog/request_handler.go
index b74b845f99..ba5135b149 100644
--- a/app/vminsert/datadog/request_handler.go
+++ b/app/vminsert/datadog/request_handler.go
@@ -55,6 +55,9 @@ func insertRows(series []parser.Series, extraLabels []prompbmarshal.Label) error
ctx.Labels = ctx.Labels[:0]
ctx.AddLabel("", ss.Metric)
ctx.AddLabel("host", ss.Host)
+ if ss.Device != "" {
+ ctx.AddLabel("device", ss.Device)
+ }
for _, tag := range ss.Tags {
name, value := parser.SplitTag(tag)
if name == "host" {
diff --git a/lib/protoparser/datadog/parser.go b/lib/protoparser/datadog/parser.go
index 931617d5e2..7e36e931c2 100644
--- a/lib/protoparser/datadog/parser.go
+++ b/lib/protoparser/datadog/parser.go
@@ -67,6 +67,10 @@ type Series struct {
Metric string `json:"metric"`
Points []Point `json:"points"`
Tags []string `json:"tags"`
+ // The device field does not appear in the datadog docs, but datadog-agent does use it.
+ // Datadog agent (v7 at least), removes the tag "device" and adds it as its own field. Why? That I don't know!
+ // https://github.com/DataDog/datadog-agent/blob/0ada7a97fed6727838a6f4d9c87123d2aafde735/pkg/metrics/series.go#L84-L105
+ Device string `json:"device"`
// Do not decode Type, since it isn't used by VictoriaMetrics
// Type string `json:"type"`
diff --git a/lib/protoparser/datadog/parser_test.go b/lib/protoparser/datadog/parser_test.go
index 3c472d91cc..b6b12230a5 100644
--- a/lib/protoparser/datadog/parser_test.go
+++ b/lib/protoparser/datadog/parser_test.go
@@ -56,6 +56,7 @@ func TestRequestUnmarshalSuccess(t *testing.T) {
"host": "test.example.com",
"interval": 20,
"metric": "system.load.1",
+ "device": "/dev/sda",
"points": [[
1575317847,
0.5
@@ -71,6 +72,7 @@ func TestRequestUnmarshalSuccess(t *testing.T) {
Series: []Series{{
Host: "test.example.com",
Metric: "system.load.1",
+ Device: "/dev/sda",
Points: []Point{{
1575317847,
0.5,
From e2e341da9fe6c6fb7f50aae6dfed25467a40808e Mon Sep 17 00:00:00 2001
From: Aliaksandr Valialkin
Date: Mon, 5 Dec 2022 23:06:59 -0800
Subject: [PATCH 37/38] app/vmselect/vmui: `make vmui-update` after
7645d9ae007c6bd4aa931826299675f642662ce6
---
app/vmselect/vmui/asset-manifest.json | 8 ++++----
app/vmselect/vmui/index.html | 2 +-
app/vmselect/vmui/static/css/main.0937c83d.css | 1 -
app/vmselect/vmui/static/css/main.89abca0f.css | 1 +
app/vmselect/vmui/static/js/main.c552245f.js | 2 ++
...8cda26.js.LICENSE.txt => main.c552245f.js.LICENSE.txt} | 0
app/vmselect/vmui/static/js/main.e18cda26.js | 2 --
7 files changed, 8 insertions(+), 8 deletions(-)
delete mode 100644 app/vmselect/vmui/static/css/main.0937c83d.css
create mode 100644 app/vmselect/vmui/static/css/main.89abca0f.css
create mode 100644 app/vmselect/vmui/static/js/main.c552245f.js
rename app/vmselect/vmui/static/js/{main.e18cda26.js.LICENSE.txt => main.c552245f.js.LICENSE.txt} (100%)
delete mode 100644 app/vmselect/vmui/static/js/main.e18cda26.js
diff --git a/app/vmselect/vmui/asset-manifest.json b/app/vmselect/vmui/asset-manifest.json
index 6f74669ddf..5a527aefb5 100644
--- a/app/vmselect/vmui/asset-manifest.json
+++ b/app/vmselect/vmui/asset-manifest.json
@@ -1,12 +1,12 @@
{
"files": {
- "main.css": "./static/css/main.0937c83d.css",
- "main.js": "./static/js/main.e18cda26.js",
+ "main.css": "./static/css/main.89abca0f.css",
+ "main.js": "./static/js/main.c552245f.js",
"static/js/27.c1ccfd29.chunk.js": "./static/js/27.c1ccfd29.chunk.js",
"index.html": "./index.html"
},
"entrypoints": [
- "static/css/main.0937c83d.css",
- "static/js/main.e18cda26.js"
+ "static/css/main.89abca0f.css",
+ "static/js/main.c552245f.js"
]
}
\ No newline at end of file
diff --git a/app/vmselect/vmui/index.html b/app/vmselect/vmui/index.html
index da2f5b3f9e..700bbfefec 100644
--- a/app/vmselect/vmui/index.html
+++ b/app/vmselect/vmui/index.html
@@ -1 +1 @@
-VM UI You need to enable JavaScript to run this app.
\ No newline at end of file
+VM UI You need to enable JavaScript to run this app.
\ No newline at end of file
diff --git a/app/vmselect/vmui/static/css/main.0937c83d.css b/app/vmselect/vmui/static/css/main.0937c83d.css
deleted file mode 100644
index a90e47c5f8..0000000000
--- a/app/vmselect/vmui/static/css/main.0937c83d.css
+++ /dev/null
@@ -1 +0,0 @@
-.vm-tabs{gap:16px;height:100%;position:relative;-webkit-user-select:none;user-select:none}.vm-tabs,.vm-tabs-item{align-items:center;display:flex;justify-content:center}.vm-tabs-item{color:inherit;cursor:pointer;font-size:inherit;font-weight:inherit;opacity:.6;padding:16px 8px;text-decoration:none;text-transform:uppercase;transition:opacity .2s}.vm-tabs-item_active{opacity:1}.vm-tabs-item__icon{display:grid;margin-right:8px;width:15px}.vm-tabs-item__icon_single{margin-right:0}.vm-tabs__indicator{border-bottom:2px solid;position:absolute;transition:width .2s ease,left .3s cubic-bezier(.28,.84,.42,1)}.vm-alert{grid-gap:8px;align-items:center;background-color:var(--color-background-block);border-radius:8px;box-shadow:1px 2px 12px hsla(0,6%,6%,.08);color:#110f0f;display:grid;font-size:14px;font-weight:500;gap:8px;grid-template-columns:20px 1fr;line-height:20px;padding:16px;position:relative}.vm-alert:after{border-radius:8px;content:"";height:100%;left:0;opacity:.1;position:absolute;top:0;width:100%;z-index:1}.vm-alert__content,.vm-alert__icon{position:relative;z-index:2}.vm-alert__icon{align-items:center;display:flex;justify-content:center}.vm-alert__content{-webkit-filter:brightness(.6);filter:brightness(.6);white-space:pre-line}.vm-alert_success{color:var(--color-success)}.vm-alert_success:after{background-color:var(--color-success)}.vm-alert_error{color:var(--color-error)}.vm-alert_error:after{background-color:var(--color-error)}.vm-alert_info{color:var(--color-info)}.vm-alert_info:after{background-color:var(--color-info)}.vm-alert_warning{color:var(--color-warning)}.vm-alert_warning:after{background-color:var(--color-warning)}.vm-popper{background-color:var(--color-background-block);border-radius:4px;box-shadow:0 2px 8px 0 hsla(0,6%,6%,.2);opacity:0;pointer-events:none;position:fixed;transition:opacity .1s ease-in-out;z-index:-99}.vm-popper_open{-webkit-animation:scale .15s cubic-bezier(.28,.84,.42,1);animation:scale .15s cubic-bezier(.28,.84,.42,1);opacity:1;pointer-events:auto;z-index:101}.vm-popper_open_slider{-webkit-animation:slidePopper .3s cubic-bezier(.28,.84,.42,1.1);animation:slidePopper .3s cubic-bezier(.28,.84,.42,1.1);-webkit-transform-origin:top center;transform-origin:top center}.vm-button{align-items:center;border-radius:6px;color:#fff;cursor:pointer;display:flex;font-size:10px;font-weight:500;justify-content:center;line-height:15px;min-height:31px;padding:6px 14px;position:relative;text-transform:uppercase;-webkit-transform-style:preserve-3d;transform-style:preserve-3d;-webkit-user-select:none;user-select:none;white-space:nowrap}.vm-button:hover:after{background-color:hsla(0,6%,6%,.05)}.vm-button:after,.vm-button:before{border-radius:6px;content:"";height:100%;left:0;position:absolute;top:0;transition:background-color .2s ease;width:100%}.vm-button:before{-webkit-transform:translateZ(-2px);transform:translateZ(-2px)}.vm-button:after{background-color:transparent;-webkit-transform:translateZ(-1px);transform:translateZ(-1px)}.vm-button span{align-items:center;display:grid;justify-content:center}.vm-button span svg{width:15px}.vm-button__start-icon{margin-right:6px}.vm-button__end-icon{margin-left:6px}.vm-button_disabled{cursor:not-allowed;opacity:.3}.vm-button_icon{padding:6px 8px}.vm-button_icon .vm-button__end-icon,.vm-button_icon .vm-button__start-icon{margin:0}.vm-button_small{min-height:25px;padding:4px 6px}.vm-button_small span svg{width:13px}.vm-button_contained_primary{color:var(--color-primary-text)}.vm-button_contained_primary:before{background-color:var(--color-primary)}.vm-button_contained_primary:hover:after{background-color:hsla(0,6%,6%,.2)}.vm-button_contained_secondary{color:var(--color-secondary-text)}.vm-button_contained_secondary:before{background-color:var(--color-secondary)}.vm-button_contained_secondary:hover:after{background-color:hsla(0,6%,6%,.2)}.vm-button_contained_success{color:var(--color-success-text)}.vm-button_contained_success:before{background-color:var(--color-success)}.vm-button_contained_success:hover:after{background-color:hsla(0,6%,6%,.2)}.vm-button_contained_error{color:var(--color-error-text)}.vm-button_contained_error:before{background-color:var(--color-error)}.vm-button_contained_gray{color:hsla(0,6%,6%,.6)}.vm-button_contained_gray:before{background-color:hsla(0,6%,6%,.6)}.vm-button_contained_warning{color:var(--color-warning)}.vm-button_contained_warning:before{background-color:var(--color-warning);opacity:.2}.vm-button_text_primary{color:var(--color-primary)}.vm-button_text_secondary{color:var(--color-secondary)}.vm-button_text_success{color:var(--color-success)}.vm-button_text_error{color:var(--color-error)}.vm-button_text_gray{color:hsla(0,6%,6%,.6)}.vm-button_text_warning{color:var(--color-warning)}.vm-button_outlined_primary{border:1px solid var(--color-primary);color:var(--color-primary)}.vm-button_outlined_error{border:1px solid var(--color-error);color:var(--color-error)}.vm-button_outlined_secondary{border:1px solid var(--color-secondary);color:var(--color-secondary)}.vm-button_outlined_success{border:1px solid var(--color-success);color:var(--color-success)}.vm-button_outlined_gray{border:1px solid hsla(0,6%,6%,.6);color:hsla(0,6%,6%,.6)}.vm-button_outlined_warning{border:1px solid var(--color-warning);color:var(--color-warning)}.vm-execution-controls-buttons{border-radius:7px;display:flex;justify-content:space-between;min-width:107px}.vm-execution-controls-buttons__arrow{align-items:center;display:flex;justify-content:center;-webkit-transform:rotate(0);transform:rotate(0);transition:-webkit-transform .2s ease-in-out;transition:transform .2s ease-in-out;transition:transform .2s ease-in-out,-webkit-transform .2s ease-in-out}.vm-execution-controls-buttons__arrow_open{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.vm-execution-controls-list{font-size:12px;max-height:208px;overflow:auto;padding:8px 0;width:124px}.vm-tooltip{-webkit-animation:vm-scale .15s cubic-bezier(.28,.84,.42,1);animation:vm-scale .15s cubic-bezier(.28,.84,.42,1);background-color:rgba(97,97,97,.92);border-radius:4px;box-shadow:0 2px 8px 0 hsla(0,6%,6%,.2);color:#fff;font-size:10px;line-height:150%;opacity:1;padding:3px 8px;pointer-events:auto;position:fixed;transition:opacity .1s ease-in-out;white-space:nowrap;z-index:101}@-webkit-keyframes vm-scale{0%{-webkit-transform:scale(0);transform:scale(0)}to{-webkit-transform:scale(1);transform:scale(1)}}@keyframes vm-scale{0%{-webkit-transform:scale(0);transform:scale(0)}to{-webkit-transform:scale(1);transform:scale(1)}}.vm-time-duration{font-size:12px;max-height:168px;overflow:auto}.vm-calendar{background-color:var(--color-background-block);border-radius:8px;display:grid;font-size:12px;grid-template-rows:auto 1fr auto;padding:16px;-webkit-user-select:none;user-select:none}.vm-calendar__tabs{border-top:1px solid hsla(0,6%,6%,.15);margin:16px -16px -16px}.vm-calendar-header{grid-gap:24px;align-items:center;display:grid;gap:24px;grid-template-columns:1fr auto;justify-content:center;min-height:36px;padding-bottom:16px}.vm-calendar-header-left{grid-gap:8px;align-items:center;cursor:pointer;display:grid;gap:8px;grid-template-columns:auto auto;justify-content:flex-start;transition:opacity .2s ease-in-out}.vm-calendar-header-left:hover{opacity:.8}.vm-calendar-header-left__date{color:#110f0f;font-size:12px;font-weight:700}.vm-calendar-header-left__select-year{align-items:center;display:grid;height:14px;justify-content:center;width:14px}.vm-calendar-header-left__select-year svg{width:100%}.vm-calendar-header-right{grid-gap:8px;align-items:center;display:grid;gap:8px;grid-template-columns:18px 18px;justify-content:center}.vm-calendar-header-right__next,.vm-calendar-header-right__prev{cursor:pointer;transition:opacity .2s ease-in-out}.vm-calendar-header-right__next:hover,.vm-calendar-header-right__prev:hover{opacity:.8}.vm-calendar-header-right__prev{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.vm-calendar-header-right__next{-webkit-transform:rotate(-90deg);transform:rotate(-90deg)}.vm-calendar-body{grid-gap:2px;display:grid;gap:2px;grid-template-columns:repeat(7,32px);grid-template-rows:repeat(6,32px)}.vm-calendar-body,.vm-calendar-body-cell{align-items:center;justify-content:center}.vm-calendar-body-cell{border-radius:50%;display:flex;height:100%;text-align:center}.vm-calendar-body-cell_weekday{color:hsla(0,6%,6%,.6)}.vm-calendar-body-cell_day{cursor:pointer;transition:color .2s ease,background-color .3s ease-in-out}.vm-calendar-body-cell_day:hover{background-color:hsla(0,6%,6%,.05)}.vm-calendar-body-cell_day_empty{pointer-events:none}.vm-calendar-body-cell_day_active{color:#fff}.vm-calendar-body-cell_day_active,.vm-calendar-body-cell_day_active:hover{background-color:var(--color-primary)}.vm-calendar-body-cell_day_today{border:1px solid var(--color-primary)}.vm-calendar-years{grid-gap:8px;display:grid;gap:8px;grid-template-columns:repeat(3,1fr);overflow:auto}.vm-calendar-years__year{align-items:center;border-radius:8px;cursor:pointer;display:flex;justify-content:center;padding:8px 16px;transition:color .2s ease,background-color .3s ease-in-out}.vm-calendar-years__year:hover{background-color:hsla(0,6%,6%,.05)}.vm-calendar-years__year_selected{color:#fff}.vm-calendar-years__year_selected,.vm-calendar-years__year_selected:hover{background-color:var(--color-primary)}.vm-calendar-time-picker{align-items:center;display:flex;flex-direction:column;justify-content:center}.vm-calendar-time-picker-clock{border:1px solid hsla(0,6%,6%,.15);border-radius:50%;box-shadow:1px 2px 12px hsla(0,6%,6%,.08);box-sizing:initial;height:230px;position:relative;width:230px}.vm-calendar-time-picker-clock:after{background-color:var(--color-primary);border-radius:50%;content:"";height:6px;left:50%;position:absolute;top:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);width:6px}.vm-calendar-time-picker-clock__arrow{background-color:var(--color-primary);height:107px;left:114px;margin-top:8px;opacity:.8;position:absolute;top:0;-webkit-transform-origin:bottom;transform-origin:bottom;transition:-webkit-transform .2s ease-in-out;transition:transform .2s ease-in-out;transition:transform .2s ease-in-out,-webkit-transform .2s ease-in-out;width:2px;z-index:0}.vm-calendar-time-picker-clock__arrow_offset{height:73px;margin-top:42px;z-index:2}.vm-calendar-time-picker-clock__arrow:after{background-color:var(--color-primary);border-radius:50%;content:"";height:30px;left:50%;position:absolute;top:0;-webkit-transform:translateX(-50%);transform:translateX(-50%);width:30px}.vm-calendar-time-picker-clock__time{align-items:flex-start;cursor:pointer;display:flex;height:115px;justify-content:center;left:100px;padding-top:8px;position:absolute;text-align:center;top:0;-webkit-transform-origin:bottom;transform-origin:bottom;width:30px;z-index:1}.vm-calendar-time-picker-clock__time_hide{display:none}.vm-calendar-time-picker-clock__time_offset{height:73px;margin-top:42px;padding:0;z-index:2}.vm-calendar-time-picker-clock__time:hover span{background-color:hsla(0,6%,6%,.1)}.vm-calendar-time-picker-clock__time span{align-items:center;border-radius:50%;display:grid;justify-content:center;min-height:30px;min-width:30px;position:relative;-webkit-transform-origin:center;transform-origin:center;transition:background-color .3s ease}.vm-calendar-time-picker-fields{align-items:center;display:flex;justify-content:space-between;margin-top:16px}.vm-calendar-time-picker-fields span{margin:0 8px}.vm-calendar-time-picker-fields__input{border:1px solid #d8d8d8;border-radius:4px;font-size:14px;height:32px;padding:2px 8px;text-align:center;width:64px}.vm-calendar-time-picker-fields__input:focus{border-color:var(--color-primary)}.vm-time-selector{display:grid;grid-template-columns:repeat(2,230px);padding:16px 0}.vm-time-selector-left{border-right:1px solid hsla(0,6%,6%,.15);display:flex;flex-direction:column;gap:8px;padding:0 16px}.vm-time-selector-left-inputs{align-items:flex-start;display:grid;flex-grow:1;justify-content:stretch}.vm-time-selector-left-inputs__date{grid-gap:8px;align-items:center;border-bottom:1px solid hsla(0,6%,6%,.15);cursor:pointer;display:grid;gap:8px;grid-template-columns:1fr 14px;justify-content:center;margin-bottom:16px;padding-bottom:8px;transition:color .2s ease-in-out,border-bottom-color .3s ease}.vm-time-selector-left-inputs__date:hover{border-bottom-color:var(--color-primary)}.vm-time-selector-left-inputs__date:hover,.vm-time-selector-left-inputs__date:hover svg{color:var(--color-primary)}.vm-time-selector-left-inputs__date label{color:hsla(0,6%,6%,.6);font-size:10px;grid-column:1/3}.vm-time-selector-left-inputs__date svg{color:hsla(0,6%,6%,.6);transition:color .2s ease-in-out}.vm-time-selector-left__controls{grid-gap:8px;display:grid;gap:8px;grid-template-columns:repeat(2,1fr)}.vm-text-field{display:grid;margin:6px 0;position:relative;width:100%}.vm-text-field_textarea:after{content:attr(data-replicated-value) " ";visibility:hidden;white-space:pre-wrap}.vm-text-field:after,.vm-text-field__input{background-color:transparent;border:1px solid hsla(0,6%,6%,.15);font-size:12px;grid-area:1/1/2/2;line-height:18px;overflow:hidden;padding:8px 16px;width:100%}.vm-text-field__error,.vm-text-field__helper-text,.vm-text-field__label{-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;background-color:var(--color-background-block);display:-webkit-box;font-size:10px;left:8px;line-height:10px;max-width:calc(100% - 16px);overflow:hidden;padding:0 3px;pointer-events:none;position:absolute;text-overflow:ellipsis;-webkit-user-select:none;user-select:none;z-index:2}.vm-text-field__label{color:hsla(0,6%,6%,.6);top:-5px}.vm-text-field__error{color:var(--color-error);top:calc(100% - 5px)}.vm-text-field__helper-text{bottom:-5px;color:hsla(0,6%,6%,.6)}.vm-text-field__input{border-radius:4px;display:block;min-height:34px;overflow:hidden;resize:none;transition:border .2s ease}.vm-text-field__input:focus,.vm-text-field__input:hover{border:1px solid var(--color-primary)}.vm-text-field__input_error,.vm-text-field__input_error:focus,.vm-text-field__input_error:hover{border:1px solid var(--color-error)}.vm-text-field__input_icon-start{padding-left:42px}.vm-text-field__input:disabled{background-color:inherit;color:inherit}.vm-text-field__input:disabled:hover{border-color:hsla(0,6%,6%,.4)}.vm-text-field__icon-end,.vm-text-field__icon-start{align-items:center;color:hsla(0,6%,6%,.6);display:flex;height:100%;justify-content:center;left:8px;max-width:15px;position:absolute;top:auto}.vm-text-field__icon-end svg,.vm-text-field__icon-start svg{height:auto;width:100%}.vm-text-field__icon-end{left:auto;right:8px}.vm-modal{align-items:center;background:hsla(0,6%,6%,.55);bottom:0;display:flex;justify-content:center;left:0;position:fixed;right:0;top:0;z-index:100}.vm-modal-content{background:#fff;border-radius:4px;box-shadow:0 0 24px hsla(0,6%,6%,.07);padding:22px}.vm-modal-content-header{align-items:center;display:grid;grid-template-columns:1fr auto;margin-bottom:22px}.vm-modal-content-header__title{font-size:14px;font-weight:700}.vm-modal-content-header__close{align-items:center;box-sizing:initial;color:#fff;cursor:pointer;display:flex;justify-content:center;padding:10px;width:24px}.vm-modal-content-header__close svg{height:auto;width:100%}.vm-server-configurator{grid-gap:24px;align-items:center;display:grid;gap:24px;width:600px}.vm-server-configurator__footer{align-items:center;display:inline-grid;gap:8px;grid-template-columns:repeat(2,1fr);justify-content:flex-end;margin-left:auto;margin-right:0}.vm-limits-configurator-title{align-items:center;display:flex;font-size:12px;font-weight:700;justify-content:flex-start;margin-bottom:16px}.vm-limits-configurator-title__reset{align-items:center;display:flex;flex-grow:1;justify-content:flex-end}.vm-limits-configurator__inputs{grid-gap:16px;align-items:center;display:grid;gap:16px;grid-template-columns:repeat(3,1fr);justify-content:space-between}.vm-shortcuts{min-width:400px}.vm-shortcuts-section{margin-bottom:24px}.vm-shortcuts-section__title{border-bottom:1px solid hsla(0,6%,6%,.15);font-weight:700;margin-bottom:16px;padding:8px 0}.vm-shortcuts-section-list{grid-gap:16px;display:grid;gap:16px}.vm-shortcuts-section-list-item{grid-gap:8px;align-items:center;display:grid;gap:8px;grid-template-columns:180px 1fr}.vm-shortcuts-section-list-item__key{align-items:center;display:flex;gap:4px}.vm-shortcuts-section-list-item__key code{background-color:#fff;background-repeat:repeat-x;border:1px solid hsla(0,6%,6%,.15);border-radius:4px;color:#110f0f;display:inline-block;font-size:10px;line-height:2;padding:2px 8px 0;text-align:center}.vm-shortcuts-section-list-item__description{font-size:12px}.vm-header{align-items:center;display:flex;gap:48px;justify-content:flex-start;padding:8px 24px}.vm-header_app{padding:8px 0}.vm-header-logo{align-items:center;display:grid;justify-content:center}.vm-header-logo__icon{align-items:center;cursor:pointer;display:flex;margin-bottom:2px;position:relative;width:100%}.vm-header-logo__issue{color:inherit;cursor:pointer;font-size:10px;opacity:.4;text-align:center;text-decoration:underline;transition:opacity .2s;white-space:nowrap}.vm-header-logo__issue:hover{opacity:.8}.vm-header-nav{font-size:10px;font-weight:600}.vm-header__settings{align-items:center;display:flex;flex-grow:1;gap:8px;justify-content:flex-end}.vm-container{display:flex;flex-direction:column;min-height:calc(100vh - var(--scrollbar-height))}.vm-container-body{background-color:var(--color-background-body);flex-grow:1;min-height:100%;padding:24px}.vm-container-body_app{background-color:transparent;padding:8px 0}.uplot,.uplot *,.uplot :after,.uplot :before{box-sizing:border-box}.uplot{font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5;width:-webkit-min-content;width:min-content}.u-title{font-size:18px;font-weight:700;text-align:center}.u-wrap{position:relative;-webkit-user-select:none;user-select:none}.u-over,.u-under{position:absolute}.u-under{overflow:hidden}.uplot canvas{display:block;height:100%;position:relative;width:100%}.u-axis{position:absolute}.u-legend{margin:auto;text-align:center}.u-inline{display:block}.u-inline *{display:inline-block}.u-inline tr{margin-right:16px}.u-legend th{font-weight:600}.u-legend th>*{display:inline-block;vertical-align:middle}.u-legend .u-marker{background-clip:padding-box!important;height:1em;margin-right:4px;width:1em}.u-inline.u-live th:after{content:":";vertical-align:middle}.u-inline:not(.u-live) .u-value{display:none}.u-series>*{padding:4px}.u-series th{cursor:pointer}.u-legend .u-off>*{opacity:.3}.u-select{background:rgba(0,0,0,.07)}.u-cursor-x,.u-cursor-y,.u-select{pointer-events:none;position:absolute}.u-cursor-x,.u-cursor-y{left:0;top:0;will-change:transform;z-index:100}.u-hz .u-cursor-x,.u-vt .u-cursor-y{border-right:1px dashed #607d8b;height:100%}.u-hz .u-cursor-y,.u-vt .u-cursor-x{border-bottom:1px dashed #607d8b;width:100%}.u-cursor-pt{background-clip:padding-box!important;border:0 solid;border-radius:50%;left:0;pointer-events:none;position:absolute;top:0;will-change:transform;z-index:100}.u-axis.u-off,.u-cursor-pt.u-off,.u-cursor-x.u-off,.u-cursor-y.u-off,.u-select.u-off{display:none}.vm-line-chart{height:500px;pointer-events:auto}.vm-line-chart_panning{pointer-events:none}.vm-line-chart__u-plot{position:relative}.vm-chart-tooltip{grid-gap:16px;word-wrap:break-word;background:rgba(97,97,97,.92);border-radius:8px;color:#fff;display:grid;font-family:JetBrains Mono,monospace;font-size:10px;font-weight:400;gap:16px;line-height:150%;padding:8px;pointer-events:none;position:absolute;-webkit-user-select:text;user-select:text;width:300px;z-index:98}.vm-chart-tooltip_sticky{background-color:#616161;pointer-events:auto;z-index:99}.vm-chart-tooltip_moved{margin-left:-246.5px;margin-top:-20.5px;position:fixed}.vm-chart-tooltip-header{grid-gap:8px;align-items:center;display:grid;gap:8px;grid-template-columns:1fr 25px 25px;justify-content:center;min-height:25px}.vm-chart-tooltip-header__close{color:#fff}.vm-chart-tooltip-header__drag{color:#fff;cursor:move}.vm-chart-tooltip-data{grid-gap:8px;align-items:flex-start;display:grid;gap:8px;grid-template-columns:auto 1fr;line-height:12px;word-break:break-all}.vm-chart-tooltip-data__value{font-weight:700;padding:4px}.vm-chart-tooltip-data__marker{height:12px;width:12px}.vm-chart-tooltip-info{grid-gap:4px;display:grid}.vm-legend-item{grid-gap:8px;align-items:start;background-color:var(--color-background-block);cursor:pointer;display:grid;grid-template-columns:auto auto;justify-content:start;padding:8px 48px 8px 8px;transition:.2s ease}.vm-legend-item:hover{background-color:rgba(0,0,0,.1)}.vm-legend-item_hide{opacity:.5;text-decoration:line-through}.vm-legend-item__marker{border-radius:2px;box-sizing:border-box;height:14px;transition:.2s ease;width:14px}.vm-legend-item-info{font-weight:400}.vm-legend-item-info__free-fields{cursor:pointer;padding:3px}.vm-legend-item-info__free-fields:hover{text-decoration:underline}.vm-legend-item-info__free-fields:not(:last-child):after{content:","}.vm-legend{cursor:default;display:flex;flex-wrap:wrap;margin-top:24px;position:relative}.vm-legend-group{margin:0 16px 16px 0;min-width:23%}.vm-legend-group-title{align-items:center;border-bottom:1px solid hsla(0,6%,6%,.15);display:flex;margin-bottom:1px;padding:0 8px 8px}.vm-legend-group-title__count{font-weight:700;margin-right:8px}.vm-graph-view{width:100%}.vm-graph-view_full-width{width:calc(100vw - 96px - var(--scrollbar-width))}.vm-autocomplete,.vm-query-editor-autocomplete{max-height:300px;overflow:auto}.vm-additional-settings{align-items:center;display:inline-flex;flex-wrap:wrap;gap:24px;justify-content:flex-start}.vm-additional-settings__input{flex-basis:160px;margin-bottom:-6px}.vm-switch{align-items:center;cursor:pointer;display:flex;justify-content:flex-start}.vm-switch_disabled{cursor:default;opacity:.6}.vm-switch_secondary_active .vm-switch-track{background-color:var(--color-secondary)}.vm-switch_primary_active .vm-switch-track{background-color:var(--color-primary)}.vm-switch_active .vm-switch-track__thumb{left:20px}.vm-switch:hover .vm-switch-track{opacity:.8}.vm-switch-track{align-items:center;background-color:hsla(0,6%,6%,.4);border-radius:17px;display:flex;height:17px;justify-content:flex-start;padding:3px;position:relative;transition:background-color .2s ease,opacity .3s ease-out;width:34px}.vm-switch-track__thumb{background-color:var(--color-background-block);border-radius:50%;left:3px;min-height:11px;min-width:11px;position:absolute;top:auto;-webkit-transform-style:preserve-3d;transform-style:preserve-3d;transition:right .2s ease-out,left .2s ease-out}.vm-switch__label{color:inherit;font-size:inherit;margin-left:8px;transition:color .2s ease;white-space:nowrap}.vm-query-configurator{grid-gap:8px;display:grid;gap:8px}.vm-query-configurator-list{display:grid}.vm-query-configurator-list-row{grid-gap:8px;align-items:center;display:grid;gap:8px;grid-template-columns:1fr auto auto}.vm-query-configurator-list-row_disabled{-webkit-filter:grayscale(100%);filter:grayscale(100%);opacity:.5}.vm-query-configurator-list-row__button{display:grid;min-height:36px;width:36px}.vm-query-configurator-settings{align-items:flex-end;display:flex;gap:24px;justify-content:space-between}.vm-query-configurator-settings__buttons{grid-gap:8px;display:grid;gap:8px;grid-template-columns:repeat(2,auto)}.vm-json-view__copy{display:flex;justify-content:flex-end;position:-webkit-sticky;position:sticky;top:24px;z-index:2}.vm-json-view__code{font-size:12px;line-height:1.4;-webkit-transform:translateY(-32px);transform:translateY(-32px)}.vm-axes-limits{max-width:300px}.vm-axes-limits,.vm-axes-limits-list{grid-gap:16px;align-items:center;display:grid;gap:16px}.vm-axes-limits-list__inputs{grid-gap:8px;display:grid;gap:8px;grid-template-columns:repeat(2,120px)}.vm-graph-settings-popper{grid-gap:16px;display:grid;gap:16px;padding:0 0 16px}.vm-graph-settings-popper__body{grid-gap:8px;display:grid;gap:8px;padding:0 16px}.vm-spinner{align-items:center;-webkit-animation:vm-fade 2s cubic-bezier(.28,.84,.42,1.1);animation:vm-fade 2s cubic-bezier(.28,.84,.42,1.1);background-color:hsla(0,0%,100%,.5);bottom:0;display:flex;flex-direction:column;justify-content:center;left:0;pointer-events:none;position:fixed;right:0;top:0;z-index:99}.vm-spinner__message{color:hsla(0,6%,6%,.9);font-size:14px;line-height:1.3;margin-top:24px;text-align:center;white-space:pre-line}.half-circle-spinner,.half-circle-spinner *{box-sizing:border-box}.half-circle-spinner{border-radius:100%;height:60px;position:relative;width:60px}.half-circle-spinner .circle{border:6px solid transparent;border-radius:100%;content:"";height:100%;position:absolute;width:100%}.half-circle-spinner .circle.circle-1{-webkit-animation:half-circle-spinner-animation 1s infinite;animation:half-circle-spinner-animation 1s infinite;border-top-color:var(--color-primary)}.half-circle-spinner .circle.circle-2{-webkit-animation:half-circle-spinner-animation 1s infinite alternate;animation:half-circle-spinner-animation 1s infinite alternate;border-bottom-color:var(--color-primary)}@-webkit-keyframes half-circle-spinner-animation{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes half-circle-spinner-animation{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@-webkit-keyframes vm-fade{0%{opacity:0}to{opacity:1}}@keyframes vm-fade{0%{opacity:0}to{opacity:1}}.vm-tracings-view{grid-gap:24px;display:grid;gap:24px}.vm-tracings-view-trace-header{align-items:center;border-bottom:1px solid hsla(0,6%,6%,.15);display:flex;justify-content:space-between;padding:8px 8px 8px 24px}.vm-tracings-view-trace-header-title{flex-grow:1;font-size:14px;margin-right:8px}.vm-tracings-view-trace-header-title__query{font-weight:700}.vm-tracings-view-trace__nav{padding:24px 24px 24px 0}.vm-line-progress{grid-gap:8px;align-items:center;color:hsla(0,6%,6%,.6);display:grid;gap:8px;grid-template-columns:1fr auto;justify-content:center}.vm-line-progress-track{background-color:hsla(0,6%,6%,.05);border-radius:4px;height:20px;width:100%}.vm-line-progress-track__thumb{background-color:#1a90ff;border-radius:4px;height:100%}.vm-nested-nav{background-color:rgba(201,227,246,.4);border-radius:4px;margin-left:24px}.vm-nested-nav-header{grid-gap:8px;border-radius:4px;cursor:pointer;display:grid;gap:8px;grid-template-columns:auto 1fr;padding:8px;transition:background-color .2s ease-in-out}.vm-nested-nav-header:hover{background-color:hsla(0,6%,6%,.06)}.vm-nested-nav-header__icon{align-items:center;display:flex;justify-content:center;transition:-webkit-transform .2s ease-in-out;transition:transform .2s ease-in-out;transition:transform .2s ease-in-out,-webkit-transform .2s ease-in-out;width:20px}.vm-nested-nav-header__icon_open{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.vm-nested-nav-header__message,.vm-nested-nav-header__progress{grid-column:2}.vm-nested-nav-header__duration{color:hsla(0,6%,6%,.6);grid-column:2}.vm-json-form{grid-gap:16px;display:grid;gap:16px;grid-template-rows:auto calc(90vh - 150px) auto;max-height:900px;max-width:1000px;width:70vw}.vm-json-form_one-field{grid-template-rows:calc(90vh - 150px) auto}.vm-json-form textarea{height:100%;overflow:auto;width:100%}.vm-json-form-footer{align-items:center;display:flex;gap:8px;justify-content:space-between}.vm-json-form-footer__controls{align-items:center;display:flex;flex-grow:1;gap:8px;justify-content:flex-start}.vm-json-form-footer__controls_right{display:grid;grid-template-columns:repeat(2,90px);justify-content:flex-end}.vm-table-settings-popper{display:grid;min-width:250px}.vm-table-settings-popper-list{grid-gap:8px;border-bottom:1px solid hsla(0,6%,6%,.15);display:grid;gap:8px;max-height:350px;overflow:auto;padding:16px}.vm-table-settings-popper-list-header{align-items:center;display:grid;grid-template-columns:1fr auto;justify-content:space-between;min-height:25px}.vm-table-settings-popper-list-header__title{font-weight:700}.vm-table-settings-popper-list__item{font-size:12px;text-transform:capitalize}.vm-checkbox{align-items:center;cursor:pointer;display:flex;justify-content:flex-start;-webkit-user-select:none;user-select:none}.vm-checkbox_disabled{cursor:default;opacity:.6}.vm-checkbox_secondary_active .vm-checkbox-track{background-color:var(--color-secondary)}.vm-checkbox_secondary .vm-checkbox-track{border:1px solid var(--color-secondary)}.vm-checkbox_primary_active .vm-checkbox-track{background-color:var(--color-primary)}.vm-checkbox_primary .vm-checkbox-track{border:1px solid var(--color-primary)}.vm-checkbox_active .vm-checkbox-track__thumb{-webkit-transform:scale(1);transform:scale(1)}.vm-checkbox:hover .vm-checkbox-track{opacity:.8}.vm-checkbox-track{align-items:center;background-color:transparent;border-radius:4px;display:flex;height:16px;justify-content:center;padding:2px;position:relative;transition:background-color .2s ease,opacity .3s ease-out;width:16px}.vm-checkbox-track__thumb{align-items:center;color:#fff;display:grid;height:12px;justify-content:center;-webkit-transform:scale(0);transform:scale(0);transition:-webkit-transform .1s ease-in-out;transition:transform .1s ease-in-out;transition:transform .1s ease-in-out,-webkit-transform .1s ease-in-out;width:12px}.vm-checkbox-track__thumb svg{width:100%}.vm-checkbox__label{color:inherit;font-size:inherit;margin-left:8px;transition:color .2s ease;white-space:nowrap}.vm-custom-panel{grid-gap:24px;align-items:flex-start;display:grid;gap:24px;grid-template-columns:100%;height:100%}.vm-custom-panel__warning{align-items:center;display:grid;grid-template-columns:1fr auto;justify-content:space-between}.vm-custom-panel-body{position:relative}.vm-custom-panel-body-header{align-items:center;border-bottom:1px solid hsla(0,6%,6%,.15);display:flex;font-size:10px;justify-content:space-between;margin:-24px -24px 24px;padding:0 24px;position:relative;z-index:1}.vm-table-view{margin-top:-24px;max-width:100%;overflow:auto}.vm-table-view table{margin-top:0}.vm-predefined-panel-header{grid-gap:8px;align-items:center;border-bottom:1px solid hsla(0,6%,6%,.15);display:grid;gap:8px;grid-template-columns:auto 1fr 160px auto;justify-content:flex-start;padding:8px 16px}.vm-predefined-panel-header__description{line-height:1.3;white-space:pre-wrap}.vm-predefined-panel-header__description ol,.vm-predefined-panel-header__description ul{list-style-position:inside}.vm-predefined-panel-header__description a{color:#c9e3f6;text-decoration:underline}.vm-predefined-panel-header__info{align-items:center;color:var(--color-primary);display:flex;justify-content:center;width:18px}.vm-predefined-panel-body{padding:8px 16px}.vm-accordion-header{align-items:center;cursor:pointer;display:grid;font-size:inherit;position:relative}.vm-accordion-header__arrow{align-items:center;display:flex;justify-content:center;position:absolute;right:14px;top:auto;-webkit-transform:rotate(0);transform:rotate(0);transition:-webkit-transform .2s ease-in-out;transition:transform .2s ease-in-out;transition:transform .2s ease-in-out,-webkit-transform .2s ease-in-out}.vm-accordion-header__arrow_open{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.vm-accordion-header__arrow svg{height:auto;width:14px}.accordion-section{overflow:hidden}.vm-predefined-dashboard{background-color:transparent}.vm-predefined-dashboard-header{align-items:center;border-radius:4px;box-shadow:1px 2px 12px hsla(0,6%,6%,.08);display:grid;font-weight:700;grid-template-columns:1fr auto;justify-content:space-between;line-height:14px;overflow:hidden;padding:16px;position:relative;-webkit-transform-style:preserve-3d;transform-style:preserve-3d;transition:box-shadow .2s ease-in-out}.vm-predefined-dashboard-header_open{border-radius:4px 4px 0 0;box-shadow:none}.vm-predefined-dashboard-header__title{font-size:12px}.vm-predefined-dashboard-header__count{font-size:10px;grid-column:2;margin-right:30px}.vm-predefined-dashboard-panels{grid-gap:16px;display:grid;gap:16px;grid-template-columns:repeat(12,1fr);padding:0}.vm-predefined-dashboard-panels-panel{border-radius:8px;overflow:hidden;position:relative}.vm-predefined-dashboard-panels-panel:hover .vm-predefined-dashboard-panels-panel__resizer{-webkit-transform:scale(1);transform:scale(1)}.vm-predefined-dashboard-panels-panel__resizer{bottom:0;cursor:se-resize;height:20px;position:absolute;right:0;-webkit-transform:scale(0);transform:scale(0);transition:-webkit-transform .2s ease-in-out;transition:transform .2s ease-in-out;transition:transform .2s ease-in-out,-webkit-transform .2s ease-in-out;width:20px;z-index:1}.vm-predefined-dashboard-panels-panel__resizer:after{border-bottom:2px solid hsla(0,6%,6%,.2);border-right:2px solid hsla(0,6%,6%,.2);bottom:5px;content:"";height:5px;position:absolute;right:5px;width:5px}.vm-predefined-dashboard-panels-panel__alert{grid-column:span 12}.vm-predefined-panels{grid-gap:16px;align-items:flex-start;display:grid;gap:16px}.vm-predefined-panels-tabs{align-items:center;display:flex;font-size:10px;justify-content:flex-start;overflow:hidden}.vm-predefined-panels-tabs__tab{border-right:1px solid hsla(0,6%,6%,.15);cursor:pointer;padding:16px;text-transform:uppercase;transition:opacity .2s ease-in-out,color .15s ease-in}.vm-predefined-panels-tabs__tab:hover{opacity:1}.vm-predefined-panels__dashboards{grid-gap:16px;display:grid;gap:16px}.vm-cardinality-configurator{grid-gap:8px;display:grid;gap:8px}.vm-cardinality-configurator-controls{align-items:center;display:flex;flex-wrap:wrap;gap:0 24px;justify-content:flex-start}.vm-cardinality-configurator-controls__query{flex-grow:1}.vm-cardinality-configurator-bottom{grid-gap:24px;align-items:flex-end;display:grid;gap:24px;grid-template-columns:1fr auto}.vm-cardinality-configurator-bottom__info{font-size:12px}.u-legend{color:#110f0f;font-family:Lato,sans-serif;font-size:14px}.u-legend .u-thead{display:none}.u-legend .u-series{display:flex;gap:8px}.u-legend .u-series th{display:none}.u-legend .u-series td:nth-child(2):after{content:":";margin-left:8px}.u-legend .u-series .u-value{display:block;padding:0;text-align:left}.vm-metrics-content-header{margin:-24px -24px 24px}.vm-cardinality-panel{grid-gap:24px;align-items:flex-start;display:grid;gap:24px}.vm-top-queries-panel-header{margin:-24px -24px 24px}.vm-top-queries{grid-gap:24px;align-items:flex-start;display:grid;gap:24px}.vm-top-queries-controls{grid-gap:8px;display:grid;gap:8px}.vm-top-queries-controls-bottom,.vm-top-queries-controls__fields{grid-gap:24px;display:grid;gap:24px;grid-template-columns:1fr auto}.vm-top-queries-controls-bottom{align-items:flex-end;justify-content:space-between}.vm-top-queries-controls-bottom__button{align-items:center;display:flex;justify-content:flex-end}.vm-top-queries-panels{grid-gap:24px;display:grid;gap:24px}.vm-trace-page{display:flex;flex-direction:column;min-height:100%;padding:16px}.vm-trace-page-controls{grid-gap:16px;align-items:center;display:grid;gap:16px;grid-template-columns:1fr 1fr;justify-content:center}.vm-trace-page-header{grid-gap:16px;align-items:start;display:grid;gap:16px;grid-template-columns:1fr auto;margin-bottom:24px}.vm-trace-page-header-errors{grid-gap:24px;align-items:flex-start;display:grid;gap:24px;grid-template-columns:1fr;justify-content:stretch}.vm-trace-page-header-errors-item{align-items:center;display:grid;justify-content:stretch;position:relative}.vm-trace-page-header-errors-item__filename{min-height:20px}.vm-trace-page-header-errors-item__close{position:absolute;right:8px;top:auto;z-index:2}.vm-trace-page-preview{align-items:center;display:flex;flex-direction:column;flex-grow:1;justify-content:center}.vm-trace-page-preview__text{font-size:14px;line-height:1.8;margin-bottom:8px;text-align:center;white-space:pre-line}#root,body,html{background-attachment:fixed;background-repeat:no-repeat;color:#110f0f;cursor:default;font-family:Lato,sans-serif;font-size:12px;margin:0;min-height:100%}body{overflow:scroll}*{cursor:inherit;font:inherit}code{font-family:JetBrains Mono,monospace}b{font-weight:700}input,textarea{cursor:text}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.vm-snackbar{bottom:16px;left:16px;position:fixed;z-index:999}a,abbr,acronym,address,applet,article,aside,audio,big,body,canvas,caption,center,cite,code,del,details,dfn,div,em,embed,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,html,iframe,img,ins,kbd,label,legend,li,mark,menu,nav,object,ol,output,p,pre,q,ruby,s,samp,section,small,span,strike,strong,sub,summary,sup,table,tbody,td,tfoot,th,thead,time,tr,tt,u,ul,var,video{border:0;margin:0;padding:0;vertical-align:initial}h1,h2,h3,h4,h5,h6{font-weight:400}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}body{line-height:1}q:after,q:before{content:""}table{border-collapse:collapse;border-spacing:0}input::-webkit-input-placeholder{opacity:1;-webkit-transition:opacity .3s ease;transition:opacity .3s ease}input::placeholder{opacity:1;transition:opacity .3s ease}input:focus::-webkit-input-placeholder{opacity:0;-webkit-transition:opacity .3s ease;transition:opacity .3s ease}input:focus::placeholder{opacity:0;transition:opacity .3s ease}*{box-sizing:border-box;outline:none}button{background:none;border:none;border-radius:0;padding:0}strong{letter-spacing:1px}input[type=file]{cursor:pointer;font-size:0;height:100%;left:0;opacity:0;position:absolute;top:0;width:100%}input[type=file]:disabled{cursor:not-allowed}a{color:inherit;text-decoration:inherit}input,textarea{-webkit-text-fill-color:inherit;appearance:none;-webkit-appearance:none}input:disabled,textarea:disabled{opacity:1!important}input:placeholder-shown,textarea:placeholder-shown{width:100%}input:-webkit-autofill,input:-webkit-autofill:active,input:-webkit-autofill:focus,input:-webkit-autofill:hover{-webkit-box-shadow:inset 0 0 0 0 #fff!important;width:100%;z-index:2}.vm-header-button{border:1px solid hsla(0,6%,6%,.2)}.vm-list__item{background-color:transparent;cursor:pointer;padding:12px 16px;transition:background-color .2s ease}.vm-list__item:hover,.vm-list__item_active{background-color:hsla(0,6%,6%,.1)}.vm-popper-header{grid-gap:8px;align-items:center;background-color:#3f51b5;background-color:var(--color-primary);border-radius:4px 4px 0 0;color:#fff;display:grid;gap:8px;grid-template-columns:1fr auto;justify-content:space-between;padding:8px 8px 8px 16px}.vm-popper-header__title{font-weight:700}.vm-block{background-color:#fff;background-color:var(--color-background-block);border-radius:8px;box-shadow:1px 2px 12px hsla(0,6%,6%,.08);padding:24px}.vm-block_empty-padding{padding:0}.vm-section-header{align-items:center;border-bottom:1px solid hsla(0,6%,6%,.15);border-radius:8px 8px 0 0;display:grid;grid-template-columns:1fr auto;justify-content:center;padding:0 24px}.vm-section-header__title{font-size:12px;font-weight:700}.vm-section-header__tabs{align-items:center;display:flex;font-size:10px;justify-content:flex-start}.vm-table{border-collapse:initial;border-spacing:0;margin-top:-24px;width:100%}.vm-table,.vm-table__row{background-color:#fff;background-color:var(--color-background-block)}.vm-table__row{transition:background-color .2s ease}.vm-table__row:hover:not(.vm-table__row_header){background-color:hsla(0,6%,6%,.05)}.vm-table__row_header{position:-webkit-sticky;position:sticky;top:0;z-index:2}.vm-table__row_selected{background-color:rgba(26,144,255,.05)}.vm-table-cell{border-bottom:1px solid hsla(0,6%,6%,.15);height:40px;padding:8px;vertical-align:middle}.vm-table-cell__content{align-items:center;display:flex;justify-content:flex-start}.vm-table-cell_sort{cursor:pointer}.vm-table-cell_sort:hover{background-color:hsla(0,6%,6%,.05)}.vm-table-cell_header{font-weight:700;text-align:left;text-transform:capitalize}.vm-table-cell_gray{color:hsla(0,6%,6%,.4)}.vm-table-cell_right{text-align:right}.vm-table-cell_right .vm-table-cell__content{justify-content:flex-end}.vm-table-cell_no-wrap{white-space:nowrap}.vm-table__sort-icon{align-items:center;display:flex;justify-content:center;margin:0 8px;opacity:.4;transition:opacity .2s ease,-webkit-transform .2s ease-in-out;transition:opacity .2s ease,transform .2s ease-in-out;transition:opacity .2s ease,transform .2s ease-in-out,-webkit-transform .2s ease-in-out;width:15px}.vm-table__sort-icon_active{opacity:1}.vm-table__sort-icon_desc{-webkit-transform:rotate(180deg);transform:rotate(180deg)}:root{--color-primary:#3f51b5;--color-secondary:#e91e63;--color-error:#fd080e;--color-warning:#ff8308;--color-info:#03a9f4;--color-success:#4caf50;--color-primary-text:#fff;--color-secondary-text:#fff;--color-error-text:#fff;--color-warning-text:#fff;--color-info-text:#fff;--color-success-text:#fff;--color-background-body:#fefeff;--color-background-block:#fff}
\ No newline at end of file
diff --git a/app/vmselect/vmui/static/css/main.89abca0f.css b/app/vmselect/vmui/static/css/main.89abca0f.css
new file mode 100644
index 0000000000..ff9451ac94
--- /dev/null
+++ b/app/vmselect/vmui/static/css/main.89abca0f.css
@@ -0,0 +1 @@
+.vm-tabs{gap:16px;height:100%;position:relative;-webkit-user-select:none;user-select:none}.vm-tabs,.vm-tabs-item{align-items:center;display:flex;justify-content:center}.vm-tabs-item{color:inherit;cursor:pointer;font-size:inherit;font-weight:inherit;opacity:.6;padding:16px 8px;text-decoration:none;text-transform:uppercase;transition:opacity .2s}.vm-tabs-item_active{opacity:1}.vm-tabs-item__icon{display:grid;margin-right:8px;width:15px}.vm-tabs-item__icon_single{margin-right:0}.vm-tabs__indicator{border-bottom:2px solid;position:absolute;transition:width .2s ease,left .3s cubic-bezier(.28,.84,.42,1)}.vm-alert{grid-gap:8px;align-items:center;background-color:var(--color-background-block);border-radius:8px;box-shadow:1px 2px 12px hsla(0,6%,6%,.08);color:#110f0f;display:grid;font-size:14px;font-weight:500;gap:8px;grid-template-columns:20px 1fr;line-height:20px;padding:16px;position:relative}.vm-alert:after{border-radius:8px;content:"";height:100%;left:0;opacity:.1;position:absolute;top:0;width:100%;z-index:1}.vm-alert__content,.vm-alert__icon{position:relative;z-index:2}.vm-alert__icon{align-items:center;display:flex;justify-content:center}.vm-alert__content{-webkit-filter:brightness(.6);filter:brightness(.6);white-space:pre-line}.vm-alert_success{color:var(--color-success)}.vm-alert_success:after{background-color:var(--color-success)}.vm-alert_error{color:var(--color-error)}.vm-alert_error:after{background-color:var(--color-error)}.vm-alert_info{color:var(--color-info)}.vm-alert_info:after{background-color:var(--color-info)}.vm-alert_warning{color:var(--color-warning)}.vm-alert_warning:after{background-color:var(--color-warning)}.vm-popper{background-color:var(--color-background-block);border-radius:4px;box-shadow:0 2px 8px 0 hsla(0,6%,6%,.2);opacity:0;pointer-events:none;position:fixed;transition:opacity .1s ease-in-out;z-index:-99}.vm-popper_open{-webkit-animation:scale .15s cubic-bezier(.28,.84,.42,1);animation:scale .15s cubic-bezier(.28,.84,.42,1);opacity:1;pointer-events:auto;z-index:101}.vm-popper_open_slider{-webkit-animation:slidePopper .3s cubic-bezier(.28,.84,.42,1.1);animation:slidePopper .3s cubic-bezier(.28,.84,.42,1.1);-webkit-transform-origin:top center;transform-origin:top center}.vm-button{align-items:center;border-radius:6px;color:#fff;cursor:pointer;display:flex;font-size:10px;font-weight:500;justify-content:center;line-height:15px;min-height:31px;padding:6px 14px;position:relative;text-transform:uppercase;-webkit-transform-style:preserve-3d;transform-style:preserve-3d;-webkit-user-select:none;user-select:none;white-space:nowrap}.vm-button:hover:after{background-color:hsla(0,6%,6%,.05)}.vm-button:after,.vm-button:before{border-radius:6px;content:"";height:100%;left:0;position:absolute;top:0;transition:background-color .2s ease;width:100%}.vm-button:before{-webkit-transform:translateZ(-2px);transform:translateZ(-2px)}.vm-button:after{background-color:transparent;-webkit-transform:translateZ(-1px);transform:translateZ(-1px)}.vm-button span{align-items:center;display:grid;justify-content:center}.vm-button span svg{width:15px}.vm-button__start-icon{margin-right:6px}.vm-button__end-icon{margin-left:6px}.vm-button_disabled{cursor:not-allowed;opacity:.3}.vm-button_icon{padding:6px 8px}.vm-button_icon .vm-button__end-icon,.vm-button_icon .vm-button__start-icon{margin:0}.vm-button_small{min-height:25px;padding:4px 6px}.vm-button_small span svg{width:13px}.vm-button_contained_primary{color:var(--color-primary-text)}.vm-button_contained_primary:before{background-color:var(--color-primary)}.vm-button_contained_primary:hover:after{background-color:hsla(0,6%,6%,.2)}.vm-button_contained_secondary{color:var(--color-secondary-text)}.vm-button_contained_secondary:before{background-color:var(--color-secondary)}.vm-button_contained_secondary:hover:after{background-color:hsla(0,6%,6%,.2)}.vm-button_contained_success{color:var(--color-success-text)}.vm-button_contained_success:before{background-color:var(--color-success)}.vm-button_contained_success:hover:after{background-color:hsla(0,6%,6%,.2)}.vm-button_contained_error{color:var(--color-error-text)}.vm-button_contained_error:before{background-color:var(--color-error)}.vm-button_contained_gray{color:hsla(0,6%,6%,.6)}.vm-button_contained_gray:before{background-color:hsla(0,6%,6%,.6)}.vm-button_contained_warning{color:var(--color-warning)}.vm-button_contained_warning:before{background-color:var(--color-warning);opacity:.2}.vm-button_text_primary{color:var(--color-primary)}.vm-button_text_secondary{color:var(--color-secondary)}.vm-button_text_success{color:var(--color-success)}.vm-button_text_error{color:var(--color-error)}.vm-button_text_gray{color:hsla(0,6%,6%,.6)}.vm-button_text_warning{color:var(--color-warning)}.vm-button_outlined_primary{border:1px solid var(--color-primary);color:var(--color-primary)}.vm-button_outlined_error{border:1px solid var(--color-error);color:var(--color-error)}.vm-button_outlined_secondary{border:1px solid var(--color-secondary);color:var(--color-secondary)}.vm-button_outlined_success{border:1px solid var(--color-success);color:var(--color-success)}.vm-button_outlined_gray{border:1px solid hsla(0,6%,6%,.6);color:hsla(0,6%,6%,.6)}.vm-button_outlined_warning{border:1px solid var(--color-warning);color:var(--color-warning)}.vm-execution-controls-buttons{border-radius:7px;display:flex;justify-content:space-between;min-width:107px}.vm-execution-controls-buttons__arrow{align-items:center;display:flex;justify-content:center;-webkit-transform:rotate(0);transform:rotate(0);transition:-webkit-transform .2s ease-in-out;transition:transform .2s ease-in-out;transition:transform .2s ease-in-out,-webkit-transform .2s ease-in-out}.vm-execution-controls-buttons__arrow_open{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.vm-execution-controls-list{font-size:12px;max-height:208px;overflow:auto;padding:8px 0;width:124px}.vm-tooltip{-webkit-animation:vm-scale .15s cubic-bezier(.28,.84,.42,1);animation:vm-scale .15s cubic-bezier(.28,.84,.42,1);background-color:rgba(97,97,97,.92);border-radius:4px;box-shadow:0 2px 8px 0 hsla(0,6%,6%,.2);color:#fff;font-size:10px;line-height:150%;opacity:1;padding:3px 8px;pointer-events:auto;position:fixed;transition:opacity .1s ease-in-out;white-space:nowrap;z-index:101}@-webkit-keyframes vm-scale{0%{-webkit-transform:scale(0);transform:scale(0)}to{-webkit-transform:scale(1);transform:scale(1)}}@keyframes vm-scale{0%{-webkit-transform:scale(0);transform:scale(0)}to{-webkit-transform:scale(1);transform:scale(1)}}.vm-time-duration{font-size:12px;max-height:200px;overflow:auto}.vm-calendar{background-color:var(--color-background-block);border-radius:8px;display:grid;font-size:12px;grid-template-rows:auto 1fr auto;padding:16px;-webkit-user-select:none;user-select:none}.vm-calendar__tabs{border-top:1px solid hsla(0,6%,6%,.15);margin:16px -16px -16px}.vm-calendar-header{grid-gap:24px;align-items:center;display:grid;gap:24px;grid-template-columns:1fr auto;justify-content:center;min-height:36px;padding-bottom:16px}.vm-calendar-header-left{grid-gap:8px;align-items:center;cursor:pointer;display:grid;gap:8px;grid-template-columns:auto auto;justify-content:flex-start;transition:opacity .2s ease-in-out}.vm-calendar-header-left:hover{opacity:.8}.vm-calendar-header-left__date{color:#110f0f;font-size:12px;font-weight:700}.vm-calendar-header-left__select-year{align-items:center;display:grid;height:14px;justify-content:center;width:14px}.vm-calendar-header-left__select-year svg{width:100%}.vm-calendar-header-right{grid-gap:8px;align-items:center;display:grid;gap:8px;grid-template-columns:18px 18px;justify-content:center}.vm-calendar-header-right__next,.vm-calendar-header-right__prev{cursor:pointer;transition:opacity .2s ease-in-out}.vm-calendar-header-right__next:hover,.vm-calendar-header-right__prev:hover{opacity:.8}.vm-calendar-header-right__prev{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.vm-calendar-header-right__next{-webkit-transform:rotate(-90deg);transform:rotate(-90deg)}.vm-calendar-body{grid-gap:2px;display:grid;gap:2px;grid-template-columns:repeat(7,32px);grid-template-rows:repeat(6,32px)}.vm-calendar-body,.vm-calendar-body-cell{align-items:center;justify-content:center}.vm-calendar-body-cell{border-radius:50%;display:flex;height:100%;text-align:center}.vm-calendar-body-cell_weekday{color:hsla(0,6%,6%,.6)}.vm-calendar-body-cell_day{cursor:pointer;transition:color .2s ease,background-color .3s ease-in-out}.vm-calendar-body-cell_day:hover{background-color:hsla(0,6%,6%,.05)}.vm-calendar-body-cell_day_empty{pointer-events:none}.vm-calendar-body-cell_day_active{color:#fff}.vm-calendar-body-cell_day_active,.vm-calendar-body-cell_day_active:hover{background-color:var(--color-primary)}.vm-calendar-body-cell_day_today{border:1px solid var(--color-primary)}.vm-calendar-years{grid-gap:8px;display:grid;gap:8px;grid-template-columns:repeat(3,1fr);max-height:400px;overflow:auto}.vm-calendar-years__year{align-items:center;border-radius:8px;cursor:pointer;display:flex;justify-content:center;padding:8px 16px;transition:color .2s ease,background-color .3s ease-in-out}.vm-calendar-years__year:hover{background-color:hsla(0,6%,6%,.05)}.vm-calendar-years__year_selected{color:#fff}.vm-calendar-years__year_selected,.vm-calendar-years__year_selected:hover{background-color:var(--color-primary)}.vm-calendar-time-picker{align-items:center;display:flex;flex-direction:column;justify-content:center}.vm-calendar-time-picker-clock{border:1px solid hsla(0,6%,6%,.15);border-radius:50%;box-shadow:1px 2px 12px hsla(0,6%,6%,.08);box-sizing:initial;height:230px;position:relative;width:230px}.vm-calendar-time-picker-clock:after{background-color:var(--color-primary);border-radius:50%;content:"";height:6px;left:50%;position:absolute;top:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);width:6px}.vm-calendar-time-picker-clock__arrow{background-color:var(--color-primary);height:107px;left:114px;margin-top:8px;opacity:.8;position:absolute;top:0;-webkit-transform-origin:bottom;transform-origin:bottom;transition:-webkit-transform .2s ease-in-out;transition:transform .2s ease-in-out;transition:transform .2s ease-in-out,-webkit-transform .2s ease-in-out;width:2px;z-index:0}.vm-calendar-time-picker-clock__arrow_offset{height:73px;margin-top:42px;z-index:2}.vm-calendar-time-picker-clock__arrow:after{background-color:var(--color-primary);border-radius:50%;content:"";height:30px;left:50%;position:absolute;top:0;-webkit-transform:translateX(-50%);transform:translateX(-50%);width:30px}.vm-calendar-time-picker-clock__time{align-items:flex-start;cursor:pointer;display:flex;height:115px;justify-content:center;left:100px;padding-top:8px;position:absolute;text-align:center;top:0;-webkit-transform-origin:bottom;transform-origin:bottom;width:30px;z-index:1}.vm-calendar-time-picker-clock__time_hide{display:none}.vm-calendar-time-picker-clock__time_offset{height:73px;margin-top:42px;padding:0;z-index:2}.vm-calendar-time-picker-clock__time:hover span{background-color:hsla(0,6%,6%,.1)}.vm-calendar-time-picker-clock__time span{align-items:center;border-radius:50%;display:grid;justify-content:center;min-height:30px;min-width:30px;position:relative;-webkit-transform-origin:center;transform-origin:center;transition:background-color .3s ease}.vm-calendar-time-picker-fields{align-items:center;display:flex;justify-content:space-between;margin-top:16px}.vm-calendar-time-picker-fields span{margin:0 8px}.vm-calendar-time-picker-fields__input{border:1px solid #d8d8d8;border-radius:4px;font-size:14px;height:32px;padding:2px 8px;text-align:center;width:64px}.vm-calendar-time-picker-fields__input:focus{border-color:var(--color-primary)}.vm-time-selector{display:grid;grid-template-columns:repeat(2,230px);padding:16px 0}.vm-time-selector-left{border-right:1px solid hsla(0,6%,6%,.15);display:flex;flex-direction:column;gap:8px;padding:0 16px}.vm-time-selector-left-inputs{align-items:flex-start;display:grid;flex-grow:1;justify-content:stretch}.vm-time-selector-left-inputs__date{grid-gap:8px;align-items:center;border-bottom:1px solid hsla(0,6%,6%,.15);cursor:pointer;display:grid;gap:8px;grid-template-columns:1fr 14px;justify-content:center;margin-bottom:16px;padding-bottom:8px;transition:color .2s ease-in-out,border-bottom-color .3s ease}.vm-time-selector-left-inputs__date:last-child{margin-bottom:0}.vm-time-selector-left-inputs__date:hover{border-bottom-color:var(--color-primary)}.vm-time-selector-left-inputs__date:hover,.vm-time-selector-left-inputs__date:hover svg{color:var(--color-primary)}.vm-time-selector-left-inputs__date label{color:hsla(0,6%,6%,.6);font-size:10px;grid-column:1/3}.vm-time-selector-left-inputs__date svg{color:hsla(0,6%,6%,.6);transition:color .2s ease-in-out}.vm-time-selector-left-timezone{align-items:center;display:flex;font-size:10px;gap:8px;justify-content:space-between;margin-bottom:8px}.vm-time-selector-left-timezone__utc{align-items:center;background-color:hsla(0,6%,6%,.06);border-radius:4px;display:inline-flex;justify-content:center;padding:4px}.vm-time-selector-left__controls{grid-gap:8px;display:grid;gap:8px;grid-template-columns:repeat(2,1fr)}.vm-text-field{display:grid;margin:6px 0;position:relative;width:100%}.vm-text-field_textarea:after{content:attr(data-replicated-value) " ";visibility:hidden;white-space:pre-wrap}.vm-text-field:after,.vm-text-field__input{background-color:transparent;border:1px solid hsla(0,6%,6%,.15);font-size:12px;grid-area:1/1/2/2;line-height:18px;overflow:hidden;padding:8px 16px;width:100%}.vm-text-field__error,.vm-text-field__helper-text,.vm-text-field__label{-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;background-color:var(--color-background-block);display:-webkit-box;font-size:10px;left:8px;line-height:10px;max-width:calc(100% - 16px);overflow:hidden;padding:0 3px;pointer-events:none;position:absolute;text-overflow:ellipsis;-webkit-user-select:none;user-select:none;z-index:2}.vm-text-field__label{color:hsla(0,6%,6%,.6);top:-5px}.vm-text-field__error{color:var(--color-error);top:calc(100% - 5px)}.vm-text-field__helper-text{bottom:-5px;color:hsla(0,6%,6%,.6)}.vm-text-field__input{border-radius:4px;display:block;min-height:34px;overflow:hidden;resize:none;transition:border .2s ease}.vm-text-field__input:focus,.vm-text-field__input:hover{border:1px solid var(--color-primary)}.vm-text-field__input_error,.vm-text-field__input_error:focus,.vm-text-field__input_error:hover{border:1px solid var(--color-error)}.vm-text-field__input_icon-start{padding-left:42px}.vm-text-field__input:disabled{background-color:inherit;color:inherit}.vm-text-field__input:disabled:hover{border-color:hsla(0,6%,6%,.4)}.vm-text-field__icon-end,.vm-text-field__icon-start{align-items:center;color:hsla(0,6%,6%,.6);display:flex;height:100%;justify-content:center;left:8px;max-width:15px;position:absolute;top:auto}.vm-text-field__icon-end svg,.vm-text-field__icon-start svg{height:auto;width:100%}.vm-text-field__icon-end{left:auto;right:8px}.vm-modal{align-items:center;background:hsla(0,6%,6%,.55);bottom:0;display:flex;justify-content:center;left:0;position:fixed;right:0;top:0;z-index:100}.vm-modal-content{background:#fff;border-radius:4px;box-shadow:0 0 24px hsla(0,6%,6%,.07);padding:22px}.vm-modal-content-header{align-items:center;display:grid;grid-template-columns:1fr auto;margin-bottom:22px}.vm-modal-content-header__title{font-size:14px;font-weight:700}.vm-modal-content-header__close{align-items:center;box-sizing:initial;color:#fff;cursor:pointer;display:flex;justify-content:center;padding:10px;width:24px}.vm-modal-content-header__close svg{height:auto;width:100%}.vm-server-configurator{grid-gap:24px;align-items:center;display:grid;gap:24px;width:600px}.vm-server-configurator__title{align-items:center;display:flex;font-size:12px;font-weight:700;justify-content:flex-start;margin-bottom:16px}.vm-server-configurator__footer{align-items:center;display:inline-grid;gap:8px;grid-template-columns:repeat(2,1fr);justify-content:flex-end;margin-left:auto;margin-right:0}.vm-limits-configurator-title__reset{align-items:center;display:flex;flex-grow:1;justify-content:flex-end}.vm-limits-configurator__inputs{grid-gap:16px;align-items:center;display:grid;gap:16px;grid-template-columns:repeat(3,1fr);justify-content:space-between}.vm-accordion-header{align-items:center;cursor:pointer;display:grid;font-size:inherit;position:relative}.vm-accordion-header__arrow{align-items:center;display:flex;justify-content:center;position:absolute;right:14px;top:auto;-webkit-transform:rotate(0);transform:rotate(0);transition:-webkit-transform .2s ease-in-out;transition:transform .2s ease-in-out;transition:transform .2s ease-in-out,-webkit-transform .2s ease-in-out}.vm-accordion-header__arrow_open{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.vm-accordion-header__arrow svg{height:auto;width:14px}.accordion-section{overflow:hidden}.vm-timezones-item{align-items:center;cursor:pointer;display:flex;gap:8px;justify-content:space-between}.vm-timezones-item_selected{border:1px solid hsla(0,6%,6%,.15);border-radius:4px;padding:8px 16px}.vm-timezones-item__title{text-transform:capitalize}.vm-timezones-item__utc{align-items:center;background-color:hsla(0,6%,6%,.06);border-radius:4px;display:inline-flex;justify-content:center;padding:4px}.vm-timezones-item__icon{align-items:center;display:inline-flex;justify-content:flex-end;margin:0 0 0 auto;transition:-webkit-transform .2s ease-in;transition:transform .2s ease-in;transition:transform .2s ease-in,-webkit-transform .2s ease-in}.vm-timezones-item__icon svg{width:14px}.vm-timezones-item__icon_open{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.vm-timezones-list{border-radius:8px;max-height:300px;min-width:600px;overflow:auto}.vm-timezones-list,.vm-timezones-list-header{background-color:var(--color-background-block)}.vm-timezones-list-header{border-bottom:1px solid hsla(0,6%,6%,.15);position:-webkit-sticky;position:sticky;top:0;z-index:2}.vm-timezones-list-header__search{padding:8px}.vm-timezones-list-group{border-bottom:1px solid hsla(0,6%,6%,.15);padding:8px 0}.vm-timezones-list-group:last-child{border-bottom:none}.vm-timezones-list-group__title{color:hsla(0,6%,6%,.6);font-weight:700;padding:8px 16px}.vm-timezones-list-group-options{align-items:flex-start;display:grid}.vm-timezones-list-group-options__item{padding:8px 16px;transition:background-color .2s ease}.vm-timezones-list-group-options__item:hover{background-color:hsla(0,6%,6%,.1)}.vm-shortcuts{min-width:400px}.vm-shortcuts-section{margin-bottom:24px}.vm-shortcuts-section__title{border-bottom:1px solid hsla(0,6%,6%,.15);font-weight:700;margin-bottom:16px;padding:8px 0}.vm-shortcuts-section-list{grid-gap:16px;display:grid;gap:16px}.vm-shortcuts-section-list-item{grid-gap:8px;align-items:center;display:grid;gap:8px;grid-template-columns:210px 1fr}.vm-shortcuts-section-list-item__key{align-items:center;display:flex;gap:4px}.vm-shortcuts-section-list-item__key code{background-color:#fff;background-repeat:repeat-x;border:1px solid hsla(0,6%,6%,.15);border-radius:4px;color:#110f0f;display:inline-block;font-size:10px;line-height:2;padding:2px 8px 0;text-align:center}.vm-shortcuts-section-list-item__description{font-size:12px}.vm-header{align-items:center;display:flex;gap:48px;justify-content:flex-start;padding:8px 24px}.vm-header_app{padding:8px 0}.vm-header-logo{align-items:center;display:grid;justify-content:center}.vm-header-logo__icon{align-items:center;cursor:pointer;display:flex;margin-bottom:2px;position:relative;width:100%}.vm-header-logo__issue{color:inherit;cursor:pointer;font-size:10px;opacity:.4;text-align:center;text-decoration:underline;transition:opacity .2s;white-space:nowrap}.vm-header-logo__issue:hover{opacity:.8}.vm-header-nav{font-size:10px;font-weight:600}.vm-header__settings{align-items:center;display:flex;flex-grow:1;gap:8px;justify-content:flex-end}.vm-container{display:flex;flex-direction:column;min-height:calc(100vh - var(--scrollbar-height))}.vm-container-body{background-color:var(--color-background-body);flex-grow:1;min-height:100%;padding:24px}.vm-container-body_app{background-color:transparent;padding:8px 0}.uplot,.uplot *,.uplot :after,.uplot :before{box-sizing:border-box}.uplot{font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5;width:-webkit-min-content;width:min-content}.u-title{font-size:18px;font-weight:700;text-align:center}.u-wrap{position:relative;-webkit-user-select:none;user-select:none}.u-over,.u-under{position:absolute}.u-under{overflow:hidden}.uplot canvas{display:block;height:100%;position:relative;width:100%}.u-axis{position:absolute}.u-legend{margin:auto;text-align:center}.u-inline{display:block}.u-inline *{display:inline-block}.u-inline tr{margin-right:16px}.u-legend th{font-weight:600}.u-legend th>*{display:inline-block;vertical-align:middle}.u-legend .u-marker{background-clip:padding-box!important;height:1em;margin-right:4px;width:1em}.u-inline.u-live th:after{content:":";vertical-align:middle}.u-inline:not(.u-live) .u-value{display:none}.u-series>*{padding:4px}.u-series th{cursor:pointer}.u-legend .u-off>*{opacity:.3}.u-select{background:rgba(0,0,0,.07)}.u-cursor-x,.u-cursor-y,.u-select{pointer-events:none;position:absolute}.u-cursor-x,.u-cursor-y{left:0;top:0;will-change:transform;z-index:100}.u-hz .u-cursor-x,.u-vt .u-cursor-y{border-right:1px dashed #607d8b;height:100%}.u-hz .u-cursor-y,.u-vt .u-cursor-x{border-bottom:1px dashed #607d8b;width:100%}.u-cursor-pt{background-clip:padding-box!important;border:0 solid;border-radius:50%;left:0;pointer-events:none;position:absolute;top:0;will-change:transform;z-index:100}.u-axis.u-off,.u-cursor-pt.u-off,.u-cursor-x.u-off,.u-cursor-y.u-off,.u-select.u-off{display:none}.vm-line-chart{height:500px;pointer-events:auto}.vm-line-chart_panning{pointer-events:none}.vm-line-chart__u-plot{position:relative}.vm-chart-tooltip{grid-gap:16px;word-wrap:break-word;background:rgba(97,97,97,.92);border-radius:8px;color:#fff;display:grid;font-family:JetBrains Mono,monospace;font-size:10px;font-weight:400;gap:16px;line-height:150%;padding:8px;pointer-events:none;position:absolute;-webkit-user-select:text;user-select:text;width:300px;z-index:98}.vm-chart-tooltip_sticky{background-color:#616161;pointer-events:auto;z-index:99}.vm-chart-tooltip_moved{margin-left:-246.5px;margin-top:-20.5px;position:fixed}.vm-chart-tooltip-header{grid-gap:8px;align-items:center;display:grid;gap:8px;grid-template-columns:1fr 25px 25px;justify-content:center;min-height:25px}.vm-chart-tooltip-header__close{color:#fff}.vm-chart-tooltip-header__drag{color:#fff;cursor:move}.vm-chart-tooltip-data{grid-gap:8px;align-items:flex-start;display:grid;gap:8px;grid-template-columns:auto 1fr;line-height:12px;word-break:break-all}.vm-chart-tooltip-data__value{font-weight:700;padding:4px}.vm-chart-tooltip-data__marker{height:12px;width:12px}.vm-chart-tooltip-info{grid-gap:4px;display:grid;word-break:break-all}.vm-legend-item{grid-gap:8px;align-items:start;background-color:var(--color-background-block);cursor:pointer;display:grid;grid-template-columns:auto auto;justify-content:start;padding:8px 48px 8px 8px;transition:.2s ease}.vm-legend-item:hover{background-color:rgba(0,0,0,.1)}.vm-legend-item_hide{opacity:.5;text-decoration:line-through}.vm-legend-item__marker{border-radius:2px;box-sizing:border-box;height:14px;transition:.2s ease;width:14px}.vm-legend-item-info{font-weight:400}.vm-legend-item-info__free-fields{cursor:pointer;padding:3px}.vm-legend-item-info__free-fields:hover{text-decoration:underline}.vm-legend-item-info__free-fields:not(:last-child):after{content:","}.vm-legend{cursor:default;display:flex;flex-wrap:wrap;margin-top:24px;position:relative}.vm-legend-group{margin:0 16px 16px 0;min-width:23%}.vm-legend-group-title{align-items:center;border-bottom:1px solid hsla(0,6%,6%,.15);display:flex;margin-bottom:1px;padding:0 8px 8px}.vm-legend-group-title__count{font-weight:700;margin-right:8px}.vm-graph-view{width:100%}.vm-graph-view_full-width{width:calc(100vw - 96px - var(--scrollbar-width))}.vm-autocomplete,.vm-query-editor-autocomplete{max-height:300px;overflow:auto}.vm-additional-settings{align-items:center;display:inline-flex;flex-wrap:wrap;gap:24px;justify-content:flex-start}.vm-additional-settings__input{flex-basis:160px;margin-bottom:-6px}.vm-switch{align-items:center;cursor:pointer;display:flex;justify-content:flex-start}.vm-switch_disabled{cursor:default;opacity:.6}.vm-switch_secondary_active .vm-switch-track{background-color:var(--color-secondary)}.vm-switch_primary_active .vm-switch-track{background-color:var(--color-primary)}.vm-switch_active .vm-switch-track__thumb{left:20px}.vm-switch:hover .vm-switch-track{opacity:.8}.vm-switch-track{align-items:center;background-color:hsla(0,6%,6%,.4);border-radius:17px;display:flex;height:17px;justify-content:flex-start;padding:3px;position:relative;transition:background-color .2s ease,opacity .3s ease-out;width:34px}.vm-switch-track__thumb{background-color:var(--color-background-block);border-radius:50%;left:3px;min-height:11px;min-width:11px;position:absolute;top:auto;-webkit-transform-style:preserve-3d;transform-style:preserve-3d;transition:right .2s ease-out,left .2s ease-out}.vm-switch__label{color:inherit;font-size:inherit;margin-left:8px;transition:color .2s ease;white-space:nowrap}.vm-query-configurator{grid-gap:8px;display:grid;gap:8px}.vm-query-configurator-list{display:grid}.vm-query-configurator-list-row{grid-gap:8px;align-items:center;display:grid;gap:8px;grid-template-columns:1fr auto auto}.vm-query-configurator-list-row_disabled{-webkit-filter:grayscale(100%);filter:grayscale(100%);opacity:.5}.vm-query-configurator-list-row__button{display:grid;min-height:36px;width:36px}.vm-query-configurator-settings{align-items:flex-end;display:flex;gap:24px;justify-content:space-between}.vm-query-configurator-settings__buttons{grid-gap:8px;display:grid;gap:8px;grid-template-columns:repeat(2,auto)}.vm-json-view__copy{display:flex;justify-content:flex-end;position:-webkit-sticky;position:sticky;top:24px;z-index:2}.vm-json-view__code{font-size:12px;line-height:1.4;-webkit-transform:translateY(-32px);transform:translateY(-32px)}.vm-axes-limits{max-width:300px}.vm-axes-limits,.vm-axes-limits-list{grid-gap:16px;align-items:center;display:grid;gap:16px}.vm-axes-limits-list__inputs{grid-gap:8px;display:grid;gap:8px;grid-template-columns:repeat(2,120px)}.vm-graph-settings-popper{grid-gap:16px;display:grid;gap:16px;padding:0 0 16px}.vm-graph-settings-popper__body{grid-gap:8px;display:grid;gap:8px;padding:0 16px}.vm-spinner{align-items:center;-webkit-animation:vm-fade 2s cubic-bezier(.28,.84,.42,1.1);animation:vm-fade 2s cubic-bezier(.28,.84,.42,1.1);background-color:hsla(0,0%,100%,.5);bottom:0;display:flex;flex-direction:column;justify-content:center;left:0;pointer-events:none;position:fixed;right:0;top:0;z-index:99}.vm-spinner__message{color:hsla(0,6%,6%,.9);font-size:14px;line-height:1.3;margin-top:24px;text-align:center;white-space:pre-line}.half-circle-spinner,.half-circle-spinner *{box-sizing:border-box}.half-circle-spinner{border-radius:100%;height:60px;position:relative;width:60px}.half-circle-spinner .circle{border:6px solid transparent;border-radius:100%;content:"";height:100%;position:absolute;width:100%}.half-circle-spinner .circle.circle-1{-webkit-animation:half-circle-spinner-animation 1s infinite;animation:half-circle-spinner-animation 1s infinite;border-top-color:var(--color-primary)}.half-circle-spinner .circle.circle-2{-webkit-animation:half-circle-spinner-animation 1s infinite alternate;animation:half-circle-spinner-animation 1s infinite alternate;border-bottom-color:var(--color-primary)}@-webkit-keyframes half-circle-spinner-animation{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes half-circle-spinner-animation{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@-webkit-keyframes vm-fade{0%{opacity:0}to{opacity:1}}@keyframes vm-fade{0%{opacity:0}to{opacity:1}}.vm-tracings-view{grid-gap:24px;display:grid;gap:24px}.vm-tracings-view-trace-header{align-items:center;border-bottom:1px solid hsla(0,6%,6%,.15);display:flex;justify-content:space-between;padding:8px 8px 8px 24px}.vm-tracings-view-trace-header-title{flex-grow:1;font-size:14px;margin-right:8px}.vm-tracings-view-trace-header-title__query{font-weight:700}.vm-tracings-view-trace__nav{padding:24px 24px 24px 0}.vm-line-progress{grid-gap:8px;align-items:center;color:hsla(0,6%,6%,.6);display:grid;gap:8px;grid-template-columns:1fr auto;justify-content:center}.vm-line-progress-track{background-color:hsla(0,6%,6%,.05);border-radius:4px;height:20px;width:100%}.vm-line-progress-track__thumb{background-color:#1a90ff;border-radius:4px;height:100%}.vm-nested-nav{background-color:rgba(201,227,246,.4);border-radius:4px;margin-left:24px}.vm-nested-nav-header{grid-gap:8px;border-radius:4px;cursor:pointer;display:grid;gap:8px;grid-template-columns:auto 1fr;padding:8px;transition:background-color .2s ease-in-out}.vm-nested-nav-header:hover{background-color:hsla(0,6%,6%,.06)}.vm-nested-nav-header__icon{align-items:center;display:flex;justify-content:center;transition:-webkit-transform .2s ease-in-out;transition:transform .2s ease-in-out;transition:transform .2s ease-in-out,-webkit-transform .2s ease-in-out;width:20px}.vm-nested-nav-header__icon_open{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.vm-nested-nav-header__message,.vm-nested-nav-header__progress{grid-column:2}.vm-nested-nav-header__duration{color:hsla(0,6%,6%,.6);grid-column:2}.vm-json-form{grid-gap:16px;display:grid;gap:16px;grid-template-rows:auto calc(90vh - 150px) auto;max-height:900px;max-width:1000px;width:70vw}.vm-json-form_one-field{grid-template-rows:calc(90vh - 150px) auto}.vm-json-form textarea{height:100%;overflow:auto;width:100%}.vm-json-form-footer{align-items:center;display:flex;gap:8px;justify-content:space-between}.vm-json-form-footer__controls{align-items:center;display:flex;flex-grow:1;gap:8px;justify-content:flex-start}.vm-json-form-footer__controls_right{display:grid;grid-template-columns:repeat(2,90px);justify-content:flex-end}.vm-table-settings-popper{display:grid;min-width:250px}.vm-table-settings-popper-list{grid-gap:8px;border-bottom:1px solid hsla(0,6%,6%,.15);display:grid;gap:8px;max-height:350px;overflow:auto;padding:16px}.vm-table-settings-popper-list-header{align-items:center;display:grid;grid-template-columns:1fr auto;justify-content:space-between;min-height:25px}.vm-table-settings-popper-list-header__title{font-weight:700}.vm-table-settings-popper-list__item{font-size:12px;text-transform:capitalize}.vm-checkbox{align-items:center;cursor:pointer;display:flex;justify-content:flex-start;-webkit-user-select:none;user-select:none}.vm-checkbox_disabled{cursor:default;opacity:.6}.vm-checkbox_secondary_active .vm-checkbox-track{background-color:var(--color-secondary)}.vm-checkbox_secondary .vm-checkbox-track{border:1px solid var(--color-secondary)}.vm-checkbox_primary_active .vm-checkbox-track{background-color:var(--color-primary)}.vm-checkbox_primary .vm-checkbox-track{border:1px solid var(--color-primary)}.vm-checkbox_active .vm-checkbox-track__thumb{-webkit-transform:scale(1);transform:scale(1)}.vm-checkbox:hover .vm-checkbox-track{opacity:.8}.vm-checkbox-track{align-items:center;background-color:transparent;border-radius:4px;display:flex;height:16px;justify-content:center;padding:2px;position:relative;transition:background-color .2s ease,opacity .3s ease-out;width:16px}.vm-checkbox-track__thumb{align-items:center;color:#fff;display:grid;height:12px;justify-content:center;-webkit-transform:scale(0);transform:scale(0);transition:-webkit-transform .1s ease-in-out;transition:transform .1s ease-in-out;transition:transform .1s ease-in-out,-webkit-transform .1s ease-in-out;width:12px}.vm-checkbox-track__thumb svg{width:100%}.vm-checkbox__label{color:inherit;font-size:inherit;margin-left:8px;transition:color .2s ease;white-space:nowrap}.vm-custom-panel{grid-gap:24px;align-items:flex-start;display:grid;gap:24px;grid-template-columns:100%;height:100%}.vm-custom-panel__warning{align-items:center;display:grid;grid-template-columns:1fr auto;justify-content:space-between}.vm-custom-panel-body{position:relative}.vm-custom-panel-body-header{align-items:center;border-bottom:1px solid hsla(0,6%,6%,.15);display:flex;font-size:10px;justify-content:space-between;margin:-24px -24px 24px;padding:0 24px;position:relative;z-index:1}.vm-table-view{margin-top:-24px;max-width:100%;overflow:auto}.vm-table-view table{margin-top:0}.vm-predefined-panel-header{grid-gap:8px;align-items:center;border-bottom:1px solid hsla(0,6%,6%,.15);display:grid;gap:8px;grid-template-columns:auto 1fr 160px auto;justify-content:flex-start;padding:8px 16px}.vm-predefined-panel-header__description{line-height:1.3;white-space:pre-wrap}.vm-predefined-panel-header__description ol,.vm-predefined-panel-header__description ul{list-style-position:inside}.vm-predefined-panel-header__description a{color:#c9e3f6;text-decoration:underline}.vm-predefined-panel-header__info{align-items:center;color:var(--color-primary);display:flex;justify-content:center;width:18px}.vm-predefined-panel-body{padding:8px 16px}.vm-predefined-dashboard{background-color:transparent}.vm-predefined-dashboard-header{align-items:center;border-radius:4px;box-shadow:1px 2px 12px hsla(0,6%,6%,.08);display:grid;font-weight:700;grid-template-columns:1fr auto;justify-content:space-between;line-height:14px;overflow:hidden;padding:16px;position:relative;-webkit-transform-style:preserve-3d;transform-style:preserve-3d;transition:box-shadow .2s ease-in-out}.vm-predefined-dashboard-header_open{border-radius:4px 4px 0 0;box-shadow:none}.vm-predefined-dashboard-header__title{font-size:12px}.vm-predefined-dashboard-header__count{font-size:10px;grid-column:2;margin-right:30px}.vm-predefined-dashboard-panels{grid-gap:16px;display:grid;gap:16px;grid-template-columns:repeat(12,1fr);padding:0}.vm-predefined-dashboard-panels-panel{border-radius:8px;overflow:hidden;position:relative}.vm-predefined-dashboard-panels-panel:hover .vm-predefined-dashboard-panels-panel__resizer{-webkit-transform:scale(1);transform:scale(1)}.vm-predefined-dashboard-panels-panel__resizer{bottom:0;cursor:se-resize;height:20px;position:absolute;right:0;-webkit-transform:scale(0);transform:scale(0);transition:-webkit-transform .2s ease-in-out;transition:transform .2s ease-in-out;transition:transform .2s ease-in-out,-webkit-transform .2s ease-in-out;width:20px;z-index:1}.vm-predefined-dashboard-panels-panel__resizer:after{border-bottom:2px solid hsla(0,6%,6%,.2);border-right:2px solid hsla(0,6%,6%,.2);bottom:5px;content:"";height:5px;position:absolute;right:5px;width:5px}.vm-predefined-dashboard-panels-panel__alert{grid-column:span 12}.vm-predefined-panels{grid-gap:16px;align-items:flex-start;display:grid;gap:16px}.vm-predefined-panels-tabs{align-items:center;display:flex;font-size:10px;justify-content:flex-start;overflow:hidden}.vm-predefined-panels-tabs__tab{border-right:1px solid hsla(0,6%,6%,.15);cursor:pointer;padding:16px;text-transform:uppercase;transition:opacity .2s ease-in-out,color .15s ease-in}.vm-predefined-panels-tabs__tab:hover{opacity:1}.vm-predefined-panels__dashboards{grid-gap:16px;display:grid;gap:16px}.vm-cardinality-configurator{grid-gap:8px;display:grid;gap:8px}.vm-cardinality-configurator-controls{align-items:center;display:flex;flex-wrap:wrap;gap:0 24px;justify-content:flex-start}.vm-cardinality-configurator-controls__query{flex-grow:1}.vm-cardinality-configurator-bottom{grid-gap:24px;align-items:flex-end;display:grid;gap:24px;grid-template-columns:1fr auto}.vm-cardinality-configurator-bottom__info{font-size:12px}.u-legend{color:#110f0f;font-family:Lato,sans-serif;font-size:14px}.u-legend .u-thead{display:none}.u-legend .u-series{display:flex;gap:8px}.u-legend .u-series th{display:none}.u-legend .u-series td:nth-child(2):after{content:":";margin-left:8px}.u-legend .u-series .u-value{display:block;padding:0;text-align:left}.vm-metrics-content-header{margin:-24px -24px 24px}.vm-cardinality-panel{grid-gap:24px;align-items:flex-start;display:grid;gap:24px}.vm-top-queries-panel-header{margin:-24px -24px 24px}.vm-top-queries{grid-gap:24px;align-items:flex-start;display:grid;gap:24px}.vm-top-queries-controls{grid-gap:8px;display:grid;gap:8px}.vm-top-queries-controls-bottom,.vm-top-queries-controls__fields{grid-gap:24px;display:grid;gap:24px;grid-template-columns:1fr auto}.vm-top-queries-controls-bottom{align-items:flex-end;justify-content:space-between}.vm-top-queries-controls-bottom__button{align-items:center;display:flex;justify-content:flex-end}.vm-top-queries-panels{grid-gap:24px;display:grid;gap:24px}.vm-trace-page{display:flex;flex-direction:column;min-height:100%;padding:16px}.vm-trace-page-controls{grid-gap:16px;align-items:center;display:grid;gap:16px;grid-template-columns:1fr 1fr;justify-content:center}.vm-trace-page-header{grid-gap:16px;align-items:start;display:grid;gap:16px;grid-template-columns:1fr auto;margin-bottom:24px}.vm-trace-page-header-errors{grid-gap:24px;align-items:flex-start;display:grid;gap:24px;grid-template-columns:1fr;justify-content:stretch}.vm-trace-page-header-errors-item{align-items:center;display:grid;justify-content:stretch;position:relative}.vm-trace-page-header-errors-item__filename{min-height:20px}.vm-trace-page-header-errors-item__close{position:absolute;right:8px;top:auto;z-index:2}.vm-trace-page-preview{align-items:center;display:flex;flex-direction:column;flex-grow:1;justify-content:center}.vm-trace-page-preview__text{font-size:14px;line-height:1.8;margin-bottom:8px;text-align:center;white-space:pre-line}#root,body,html{background-attachment:fixed;background-repeat:no-repeat;color:#110f0f;cursor:default;font-family:Lato,sans-serif;font-size:12px;margin:0;min-height:100%}body{overflow:scroll}*{cursor:inherit;font:inherit}code{font-family:JetBrains Mono,monospace}b{font-weight:700}input,textarea{cursor:text}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.vm-snackbar{bottom:16px;left:16px;position:fixed;z-index:999}a,abbr,acronym,address,applet,article,aside,audio,big,body,canvas,caption,center,cite,code,del,details,dfn,div,em,embed,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,html,iframe,img,ins,kbd,label,legend,li,mark,menu,nav,object,ol,output,p,pre,q,ruby,s,samp,section,small,span,strike,strong,sub,summary,sup,table,tbody,td,tfoot,th,thead,time,tr,tt,u,ul,var,video{border:0;margin:0;padding:0;vertical-align:initial}h1,h2,h3,h4,h5,h6{font-weight:400}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}body{line-height:1}q:after,q:before{content:""}table{border-collapse:collapse;border-spacing:0}input::-webkit-input-placeholder{opacity:1;-webkit-transition:opacity .3s ease;transition:opacity .3s ease}input::placeholder{opacity:1;transition:opacity .3s ease}input:focus::-webkit-input-placeholder{opacity:0;-webkit-transition:opacity .3s ease;transition:opacity .3s ease}input:focus::placeholder{opacity:0;transition:opacity .3s ease}*{box-sizing:border-box;outline:none}button{background:none;border:none;border-radius:0;padding:0}strong{letter-spacing:1px}input[type=file]{cursor:pointer;font-size:0;height:100%;left:0;opacity:0;position:absolute;top:0;width:100%}input[type=file]:disabled{cursor:not-allowed}a{color:inherit;text-decoration:inherit}input,textarea{-webkit-text-fill-color:inherit;appearance:none;-webkit-appearance:none}input:disabled,textarea:disabled{opacity:1!important}input:placeholder-shown,textarea:placeholder-shown{width:100%}input:-webkit-autofill,input:-webkit-autofill:active,input:-webkit-autofill:focus,input:-webkit-autofill:hover{-webkit-box-shadow:inset 0 0 0 0 #fff!important;width:100%;z-index:2}.vm-header-button{border:1px solid hsla(0,6%,6%,.2)}.vm-list__item{background-color:transparent;cursor:pointer;padding:12px 16px;transition:background-color .2s ease}.vm-list__item:hover,.vm-list__item_active{background-color:hsla(0,6%,6%,.1)}.vm-popper-header{grid-gap:8px;align-items:center;background-color:#3f51b5;background-color:var(--color-primary);border-radius:4px 4px 0 0;color:#fff;display:grid;gap:8px;grid-template-columns:1fr auto;justify-content:space-between;padding:8px 8px 8px 16px}.vm-popper-header__title{font-weight:700}.vm-block{background-color:#fff;background-color:var(--color-background-block);border-radius:8px;box-shadow:1px 2px 12px hsla(0,6%,6%,.08);padding:24px}.vm-block_empty-padding{padding:0}.vm-section-header{align-items:center;border-bottom:1px solid hsla(0,6%,6%,.15);border-radius:8px 8px 0 0;display:grid;grid-template-columns:1fr auto;justify-content:center;padding:0 24px}.vm-section-header__title{font-size:12px;font-weight:700}.vm-section-header__tabs{align-items:center;display:flex;font-size:10px;justify-content:flex-start}.vm-table{border-collapse:initial;border-spacing:0;margin-top:-24px;width:100%}.vm-table,.vm-table__row{background-color:#fff;background-color:var(--color-background-block)}.vm-table__row{transition:background-color .2s ease}.vm-table__row:hover:not(.vm-table__row_header){background-color:hsla(0,6%,6%,.05)}.vm-table__row_header{position:-webkit-sticky;position:sticky;top:0;z-index:2}.vm-table__row_selected{background-color:rgba(26,144,255,.05)}.vm-table-cell{border-bottom:1px solid hsla(0,6%,6%,.15);height:40px;padding:8px;vertical-align:middle}.vm-table-cell__content{align-items:center;display:flex;justify-content:flex-start}.vm-table-cell_sort{cursor:pointer}.vm-table-cell_sort:hover{background-color:hsla(0,6%,6%,.05)}.vm-table-cell_header{font-weight:700;text-align:left;text-transform:capitalize}.vm-table-cell_gray{color:hsla(0,6%,6%,.4)}.vm-table-cell_right{text-align:right}.vm-table-cell_right .vm-table-cell__content{justify-content:flex-end}.vm-table-cell_no-wrap{white-space:nowrap}.vm-table__sort-icon{align-items:center;display:flex;justify-content:center;margin:0 8px;opacity:.4;transition:opacity .2s ease,-webkit-transform .2s ease-in-out;transition:opacity .2s ease,transform .2s ease-in-out;transition:opacity .2s ease,transform .2s ease-in-out,-webkit-transform .2s ease-in-out;width:15px}.vm-table__sort-icon_active{opacity:1}.vm-table__sort-icon_desc{-webkit-transform:rotate(180deg);transform:rotate(180deg)}:root{--color-primary:#3f51b5;--color-secondary:#e91e63;--color-error:#fd080e;--color-warning:#ff8308;--color-info:#03a9f4;--color-success:#4caf50;--color-primary-text:#fff;--color-secondary-text:#fff;--color-error-text:#fff;--color-warning-text:#fff;--color-info-text:#fff;--color-success-text:#fff;--color-background-body:#fefeff;--color-background-block:#fff}
\ No newline at end of file
diff --git a/app/vmselect/vmui/static/js/main.c552245f.js b/app/vmselect/vmui/static/js/main.c552245f.js
new file mode 100644
index 0000000000..362e0c8b6f
--- /dev/null
+++ b/app/vmselect/vmui/static/js/main.c552245f.js
@@ -0,0 +1,2 @@
+/*! For license information please see main.c552245f.js.LICENSE.txt */
+!function(){var e={680:function(e,t,n){"use strict";var r=n(476),i=n(962),o=i(r("String.prototype.indexOf"));e.exports=function(e,t){var n=r(e,!!t);return"function"===typeof n&&o(e,".prototype.")>-1?i(n):n}},962:function(e,t,n){"use strict";var r=n(199),i=n(476),o=i("%Function.prototype.apply%"),a=i("%Function.prototype.call%"),u=i("%Reflect.apply%",!0)||r.call(a,o),l=i("%Object.getOwnPropertyDescriptor%",!0),c=i("%Object.defineProperty%",!0),s=i("%Math.max%");if(c)try{c({},"a",{value:1})}catch(d){c=null}e.exports=function(e){var t=u(r,a,arguments);if(l&&c){var n=l(t,"length");n.configurable&&c(t,"length",{value:1+s(0,e.length-(arguments.length-1))})}return t};var f=function(){return u(r,o,arguments)};c?c(e.exports,"apply",{value:f}):e.exports.apply=f},123:function(e,t){var n;!function(){"use strict";var r={}.hasOwnProperty;function i(){for(var e=[],t=0;t=t?e:""+Array(t+1-r.length).join(n)+e},g={s:y,z:function(e){var t=-e.utcOffset(),n=Math.abs(t),r=Math.floor(n/60),i=n%60;return(t<=0?"+":"-")+y(r,2,"0")+":"+y(i,2,"0")},m:function e(t,n){if(t.date()1)return e(a[0])}else{var u=t.name;b[u]=t,i=u}return!r&&i&&(_=i),i||!r&&_},x=function(e,t){if(D(e))return e.clone();var n="object"==typeof t?t:{};return n.date=e,n.args=arguments,new C(n)},k=g;k.l=w,k.i=D,k.w=function(e,t){return x(e,{locale:t.$L,utc:t.$u,x:t.$x,$offset:t.$offset})};var C=function(){function m(e){this.$L=w(e.locale,null,!0),this.parse(e)}var y=m.prototype;return y.parse=function(e){this.$d=function(e){var t=e.date,n=e.utc;if(null===t)return new Date(NaN);if(k.u(t))return new Date;if(t instanceof Date)return new Date(t);if("string"==typeof t&&!/Z$/i.test(t)){var r=t.match(p);if(r){var i=r[2]-1||0,o=(r[7]||"0").substring(0,3);return n?new Date(Date.UTC(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,o)):new Date(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,o)}}return new Date(t)}(e),this.$x=e.x||{},this.init()},y.init=function(){var e=this.$d;this.$y=e.getFullYear(),this.$M=e.getMonth(),this.$D=e.getDate(),this.$W=e.getDay(),this.$H=e.getHours(),this.$m=e.getMinutes(),this.$s=e.getSeconds(),this.$ms=e.getMilliseconds()},y.$utils=function(){return k},y.isValid=function(){return!(this.$d.toString()===h)},y.isSame=function(e,t){var n=x(e);return this.startOf(t)<=n&&n<=this.endOf(t)},y.isAfter=function(e,t){return x(e)=0&&(o[f]=parseInt(s,10))}var d=o[3],h=24===d?0:d,p=o[0]+"-"+o[1]+"-"+o[2]+" "+h+":"+o[4]+":"+o[5]+":000",v=+t;return(i.utc(p).valueOf()-(v-=v%1e3))/6e4},l=r.prototype;l.tz=function(e,t){void 0===e&&(e=o);var n=this.utcOffset(),r=this.toDate(),a=r.toLocaleString("en-US",{timeZone:e}),u=Math.round((r-new Date(a))/1e3/60),l=i(a).$set("millisecond",this.$ms).utcOffset(15*-Math.round(r.getTimezoneOffset()/15)-u,!0);if(t){var c=l.utcOffset();l=l.add(n-c,"minute")}return l.$x.$timezone=e,l},l.offsetName=function(e){var t=this.$x.$timezone||i.tz.guess(),n=a(this.valueOf(),t,{timeZoneName:e}).find((function(e){return"timezonename"===e.type.toLowerCase()}));return n&&n.value};var c=l.startOf;l.startOf=function(e,t){if(!this.$x||!this.$x.$timezone)return c.call(this,e,t);var n=i(this.format("YYYY-MM-DD HH:mm:ss:SSS"));return c.call(n,e,t).tz(this.$x.$timezone,!0)},i.tz=function(e,t,n){var r=n&&t,a=n||t||o,l=u(+i(),a);if("string"!=typeof e)return i(e).tz(a);var c=function(e,t,n){var r=e-60*t*1e3,i=u(r,n);if(t===i)return[r,t];var o=u(r-=60*(i-t)*1e3,n);return i===o?[r,i]:[e-60*Math.min(i,o)*1e3,Math.max(i,o)]}(i.utc(e,r).valueOf(),l,a),s=c[0],f=c[1],d=i(s).utcOffset(f);return d.$x.$timezone=a,d},i.tz.guess=function(){return Intl.DateTimeFormat().resolvedOptions().timeZone},i.tz.setDefault=function(e){o=e}}}()},635:function(e){e.exports=function(){"use strict";var e="minute",t=/[+-]\d\d(?::?\d\d)?/g,n=/([+-]|\d\d)/g;return function(r,i,o){var a=i.prototype;o.utc=function(e){return new i({date:e,utc:!0,args:arguments})},a.utc=function(t){var n=o(this.toDate(),{locale:this.$L,utc:!0});return t?n.add(this.utcOffset(),e):n},a.local=function(){return o(this.toDate(),{locale:this.$L,utc:!1})};var u=a.parse;a.parse=function(e){e.utc&&(this.$u=!0),this.$utils().u(e.$offset)||(this.$offset=e.$offset),u.call(this,e)};var l=a.init;a.init=function(){if(this.$u){var e=this.$d;this.$y=e.getUTCFullYear(),this.$M=e.getUTCMonth(),this.$D=e.getUTCDate(),this.$W=e.getUTCDay(),this.$H=e.getUTCHours(),this.$m=e.getUTCMinutes(),this.$s=e.getUTCSeconds(),this.$ms=e.getUTCMilliseconds()}else l.call(this)};var c=a.utcOffset;a.utcOffset=function(r,i){var o=this.$utils().u;if(o(r))return this.$u?0:o(this.$offset)?c.call(this):this.$offset;if("string"==typeof r&&(r=function(e){void 0===e&&(e="");var r=e.match(t);if(!r)return null;var i=(""+r[0]).match(n)||["-",0,0],o=i[0],a=60*+i[1]+ +i[2];return 0===a?0:"+"===o?a:-a}(r),null===r))return this;var a=Math.abs(r)<=16?60*r:r,u=this;if(i)return u.$offset=a,u.$u=0===r,u;if(0!==r){var l=this.$u?this.toDate().getTimezoneOffset():-1*this.utcOffset();(u=this.local().add(a+l,e)).$offset=a,u.$x.$localOffset=l}else u=this.utc();return u};var s=a.format;a.format=function(e){var t=e||(this.$u?"YYYY-MM-DDTHH:mm:ss[Z]":"");return s.call(this,t)},a.valueOf=function(){var e=this.$utils().u(this.$offset)?0:this.$offset+(this.$x.$localOffset||this.$d.getTimezoneOffset());return this.$d.valueOf()-6e4*e},a.isUTC=function(){return!!this.$u},a.toISOString=function(){return this.toDate().toISOString()},a.toString=function(){return this.toDate().toUTCString()};var f=a.toDate;a.toDate=function(e){return"s"===e&&this.$offset?o(this.format("YYYY-MM-DD HH:mm:ss:SSS")).toDate():f.call(this)};var d=a.diff;a.diff=function(e,t,n){if(e&&this.$u===e.$u)return d.call(this,e,t,n);var r=this.local(),i=o(e).local();return d.call(r,i,t,n)}}}()},781:function(e){"use strict";var t="Function.prototype.bind called on incompatible ",n=Array.prototype.slice,r=Object.prototype.toString,i="[object Function]";e.exports=function(e){var o=this;if("function"!==typeof o||r.call(o)!==i)throw new TypeError(t+o);for(var a,u=n.call(arguments,1),l=function(){if(this instanceof a){var t=o.apply(this,u.concat(n.call(arguments)));return Object(t)===t?t:this}return o.apply(e,u.concat(n.call(arguments)))},c=Math.max(0,o.length-u.length),s=[],f=0;f1&&"boolean"!==typeof t)throw new a('"allowMissing" argument must be a boolean');if(null===k(/^%?[^%]*%?$/,e))throw new i("`%` may not be present anywhere but at the beginning and end of the intrinsic name");var n=S(e),r=n.length>0?n[0]:"",o=A("%"+r+"%",t),u=o.name,c=o.value,s=!1,f=o.alias;f&&(r=f[0],D(n,b([0,1],f)));for(var d=1,h=!0;d=n.length){var g=l(c,p);c=(h=!!g)&&"get"in g&&!("originalValue"in g.get)?g.get:c[p]}else h=_(c,p),c=c[p];h&&!s&&(v[u]=c)}}return c}},520:function(e,t,n){"use strict";var r="undefined"!==typeof Symbol&&Symbol,i=n(541);e.exports=function(){return"function"===typeof r&&("function"===typeof Symbol&&("symbol"===typeof r("foo")&&("symbol"===typeof Symbol("bar")&&i())))}},541:function(e){"use strict";e.exports=function(){if("function"!==typeof Symbol||"function"!==typeof Object.getOwnPropertySymbols)return!1;if("symbol"===typeof Symbol.iterator)return!0;var e={},t=Symbol("test"),n=Object(t);if("string"===typeof t)return!1;if("[object Symbol]"!==Object.prototype.toString.call(t))return!1;if("[object Symbol]"!==Object.prototype.toString.call(n))return!1;for(t in e[t]=42,e)return!1;if("function"===typeof Object.keys&&0!==Object.keys(e).length)return!1;if("function"===typeof Object.getOwnPropertyNames&&0!==Object.getOwnPropertyNames(e).length)return!1;var r=Object.getOwnPropertySymbols(e);if(1!==r.length||r[0]!==t)return!1;if(!Object.prototype.propertyIsEnumerable.call(e,t))return!1;if("function"===typeof Object.getOwnPropertyDescriptor){var i=Object.getOwnPropertyDescriptor(e,t);if(42!==i.value||!0!==i.enumerable)return!1}return!0}},838:function(e,t,n){"use strict";var r=n(199);e.exports=r.call(Function.call,Object.prototype.hasOwnProperty)},936:function(e,t,n){var r=/^\s+|\s+$/g,i=/^[-+]0x[0-9a-f]+$/i,o=/^0b[01]+$/i,a=/^0o[0-7]+$/i,u=parseInt,l="object"==typeof n.g&&n.g&&n.g.Object===Object&&n.g,c="object"==typeof self&&self&&self.Object===Object&&self,s=l||c||Function("return this")(),f=Object.prototype.toString,d=Math.max,h=Math.min,p=function(){return s.Date.now()};function v(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}function m(e){if("number"==typeof e)return e;if(function(e){return"symbol"==typeof e||function(e){return!!e&&"object"==typeof e}(e)&&"[object Symbol]"==f.call(e)}(e))return NaN;if(v(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=v(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(r,"");var n=o.test(e);return n||a.test(e)?u(e.slice(2),n?2:8):i.test(e)?NaN:+e}e.exports=function(e,t,n){var r,i,o,a,u,l,c=0,s=!1,f=!1,y=!0;if("function"!=typeof e)throw new TypeError("Expected a function");function g(t){var n=r,o=i;return r=i=void 0,c=t,a=e.apply(o,n)}function _(e){return c=e,u=setTimeout(D,t),s?g(e):a}function b(e){var n=e-l;return void 0===l||n>=t||n<0||f&&e-c>=o}function D(){var e=p();if(b(e))return w(e);u=setTimeout(D,function(e){var n=t-(e-l);return f?h(n,o-(e-c)):n}(e))}function w(e){return u=void 0,y&&r?g(e):(r=i=void 0,a)}function x(){var e=p(),n=b(e);if(r=arguments,i=this,l=e,n){if(void 0===u)return _(l);if(f)return u=setTimeout(D,t),g(l)}return void 0===u&&(u=setTimeout(D,t)),a}return t=m(t)||0,v(n)&&(s=!!n.leading,o=(f="maxWait"in n)?d(m(n.maxWait)||0,t):o,y="trailing"in n?!!n.trailing:y),x.cancel=function(){void 0!==u&&clearTimeout(u),c=0,r=l=i=u=void 0},x.flush=function(){return void 0===u?a:w(p())},x}},7:function(e,t,n){var r="__lodash_hash_undefined__",i="[object Function]",o="[object GeneratorFunction]",a=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,u=/^\w*$/,l=/^\./,c=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,s=/\\(\\)?/g,f=/^\[object .+?Constructor\]$/,d="object"==typeof n.g&&n.g&&n.g.Object===Object&&n.g,h="object"==typeof self&&self&&self.Object===Object&&self,p=d||h||Function("return this")();var v=Array.prototype,m=Function.prototype,y=Object.prototype,g=p["__core-js_shared__"],_=function(){var e=/[^.]+$/.exec(g&&g.keys&&g.keys.IE_PROTO||"");return e?"Symbol(src)_1."+e:""}(),b=m.toString,D=y.hasOwnProperty,w=y.toString,x=RegExp("^"+b.call(D).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),k=p.Symbol,C=v.splice,E=I(p,"Map"),S=I(Object,"create"),A=k?k.prototype:void 0,F=A?A.toString:void 0;function N(e){var t=-1,n=e?e.length:0;for(this.clear();++t-1},O.prototype.set=function(e,t){var n=this.__data__,r=M(n,e);return r<0?n.push([e,t]):n[r][1]=t,this},T.prototype.clear=function(){this.__data__={hash:new N,map:new(E||O),string:new N}},T.prototype.delete=function(e){return P(this,e).delete(e)},T.prototype.get=function(e){return P(this,e).get(e)},T.prototype.has=function(e){return P(this,e).has(e)},T.prototype.set=function(e,t){return P(this,e).set(e,t),this};var z=R((function(e){var t;e=null==(t=e)?"":function(e){if("string"==typeof e)return e;if(H(e))return F?F.call(e):"";var t=e+"";return"0"==t&&1/e==-1/0?"-0":t}(t);var n=[];return l.test(e)&&n.push(""),e.replace(c,(function(e,t,r,i){n.push(r?i.replace(s,"$1"):t||e)})),n}));function $(e){if("string"==typeof e||H(e))return e;var t=e+"";return"0"==t&&1/e==-1/0?"-0":t}function R(e,t){if("function"!=typeof e||t&&"function"!=typeof t)throw new TypeError("Expected a function");var n=function n(){var r=arguments,i=t?t.apply(this,r):r[0],o=n.cache;if(o.has(i))return o.get(i);var a=e.apply(this,r);return n.cache=o.set(i,a),a};return n.cache=new(R.Cache||T),n}R.Cache=T;var j=Array.isArray;function U(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}function H(e){return"symbol"==typeof e||function(e){return!!e&&"object"==typeof e}(e)&&"[object Symbol]"==w.call(e)}e.exports=function(e,t,n){var r=null==e?void 0:B(e,t);return void 0===r?n:r}},61:function(e,t,n){var r="Expected a function",i=/^\s+|\s+$/g,o=/^[-+]0x[0-9a-f]+$/i,a=/^0b[01]+$/i,u=/^0o[0-7]+$/i,l=parseInt,c="object"==typeof n.g&&n.g&&n.g.Object===Object&&n.g,s="object"==typeof self&&self&&self.Object===Object&&self,f=c||s||Function("return this")(),d=Object.prototype.toString,h=Math.max,p=Math.min,v=function(){return f.Date.now()};function m(e,t,n){var i,o,a,u,l,c,s=0,f=!1,d=!1,m=!0;if("function"!=typeof e)throw new TypeError(r);function _(t){var n=i,r=o;return i=o=void 0,s=t,u=e.apply(r,n)}function b(e){return s=e,l=setTimeout(w,t),f?_(e):u}function D(e){var n=e-c;return void 0===c||n>=t||n<0||d&&e-s>=a}function w(){var e=v();if(D(e))return x(e);l=setTimeout(w,function(e){var n=t-(e-c);return d?p(n,a-(e-s)):n}(e))}function x(e){return l=void 0,m&&i?_(e):(i=o=void 0,u)}function k(){var e=v(),n=D(e);if(i=arguments,o=this,c=e,n){if(void 0===l)return b(c);if(d)return l=setTimeout(w,t),_(c)}return void 0===l&&(l=setTimeout(w,t)),u}return t=g(t)||0,y(n)&&(f=!!n.leading,a=(d="maxWait"in n)?h(g(n.maxWait)||0,t):a,m="trailing"in n?!!n.trailing:m),k.cancel=function(){void 0!==l&&clearTimeout(l),s=0,i=c=o=l=void 0},k.flush=function(){return void 0===l?u:x(v())},k}function y(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}function g(e){if("number"==typeof e)return e;if(function(e){return"symbol"==typeof e||function(e){return!!e&&"object"==typeof e}(e)&&"[object Symbol]"==d.call(e)}(e))return NaN;if(y(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=y(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(i,"");var n=a.test(e);return n||u.test(e)?l(e.slice(2),n?2:8):o.test(e)?NaN:+e}e.exports=function(e,t,n){var i=!0,o=!0;if("function"!=typeof e)throw new TypeError(r);return y(n)&&(i="leading"in n?!!n.leading:i,o="trailing"in n?!!n.trailing:o),m(e,t,{leading:i,maxWait:t,trailing:o})}},154:function(e,t,n){var r="function"===typeof Map&&Map.prototype,i=Object.getOwnPropertyDescriptor&&r?Object.getOwnPropertyDescriptor(Map.prototype,"size"):null,o=r&&i&&"function"===typeof i.get?i.get:null,a=r&&Map.prototype.forEach,u="function"===typeof Set&&Set.prototype,l=Object.getOwnPropertyDescriptor&&u?Object.getOwnPropertyDescriptor(Set.prototype,"size"):null,c=u&&l&&"function"===typeof l.get?l.get:null,s=u&&Set.prototype.forEach,f="function"===typeof WeakMap&&WeakMap.prototype?WeakMap.prototype.has:null,d="function"===typeof WeakSet&&WeakSet.prototype?WeakSet.prototype.has:null,h="function"===typeof WeakRef&&WeakRef.prototype?WeakRef.prototype.deref:null,p=Boolean.prototype.valueOf,v=Object.prototype.toString,m=Function.prototype.toString,y=String.prototype.match,g=String.prototype.slice,_=String.prototype.replace,b=String.prototype.toUpperCase,D=String.prototype.toLowerCase,w=RegExp.prototype.test,x=Array.prototype.concat,k=Array.prototype.join,C=Array.prototype.slice,E=Math.floor,S="function"===typeof BigInt?BigInt.prototype.valueOf:null,A=Object.getOwnPropertySymbols,F="function"===typeof Symbol&&"symbol"===typeof Symbol.iterator?Symbol.prototype.toString:null,N="function"===typeof Symbol&&"object"===typeof Symbol.iterator,O="function"===typeof Symbol&&Symbol.toStringTag&&(typeof Symbol.toStringTag===N||"symbol")?Symbol.toStringTag:null,T=Object.prototype.propertyIsEnumerable,M=("function"===typeof Reflect?Reflect.getPrototypeOf:Object.getPrototypeOf)||([].__proto__===Array.prototype?function(e){return e.__proto__}:null);function B(e,t){if(e===1/0||e===-1/0||e!==e||e&&e>-1e3&&e<1e3||w.call(/e/,t))return t;var n=/[0-9](?=(?:[0-9]{3})+(?![0-9]))/g;if("number"===typeof e){var r=e<0?-E(-e):E(e);if(r!==e){var i=String(r),o=g.call(t,i.length+1);return _.call(i,n,"$&_")+"."+_.call(_.call(o,/([0-9]{3})/g,"$&_"),/_$/,"")}}return _.call(t,n,"$&_")}var L=n(654),P=L.custom,I=U(P)?P:null;function z(e,t,n){var r="double"===(n.quoteStyle||t)?'"':"'";return r+e+r}function $(e){return _.call(String(e),/"/g,""")}function R(e){return"[object Array]"===V(e)&&(!O||!("object"===typeof e&&O in e))}function j(e){return"[object RegExp]"===V(e)&&(!O||!("object"===typeof e&&O in e))}function U(e){if(N)return e&&"object"===typeof e&&e instanceof Symbol;if("symbol"===typeof e)return!0;if(!e||"object"!==typeof e||!F)return!1;try{return F.call(e),!0}catch(t){}return!1}e.exports=function e(t,n,r,i){var u=n||{};if(Y(u,"quoteStyle")&&"single"!==u.quoteStyle&&"double"!==u.quoteStyle)throw new TypeError('option "quoteStyle" must be "single" or "double"');if(Y(u,"maxStringLength")&&("number"===typeof u.maxStringLength?u.maxStringLength<0&&u.maxStringLength!==1/0:null!==u.maxStringLength))throw new TypeError('option "maxStringLength", if provided, must be a positive integer, Infinity, or `null`');var l=!Y(u,"customInspect")||u.customInspect;if("boolean"!==typeof l&&"symbol"!==l)throw new TypeError("option \"customInspect\", if provided, must be `true`, `false`, or `'symbol'`");if(Y(u,"indent")&&null!==u.indent&&"\t"!==u.indent&&!(parseInt(u.indent,10)===u.indent&&u.indent>0))throw new TypeError('option "indent" must be "\\t", an integer > 0, or `null`');if(Y(u,"numericSeparator")&&"boolean"!==typeof u.numericSeparator)throw new TypeError('option "numericSeparator", if provided, must be `true` or `false`');var v=u.numericSeparator;if("undefined"===typeof t)return"undefined";if(null===t)return"null";if("boolean"===typeof t)return t?"true":"false";if("string"===typeof t)return W(t,u);if("number"===typeof t){if(0===t)return 1/0/t>0?"0":"-0";var b=String(t);return v?B(t,b):b}if("bigint"===typeof t){var w=String(t)+"n";return v?B(t,w):w}var E="undefined"===typeof u.depth?5:u.depth;if("undefined"===typeof r&&(r=0),r>=E&&E>0&&"object"===typeof t)return R(t)?"[Array]":"[Object]";var A=function(e,t){var n;if("\t"===e.indent)n="\t";else{if(!("number"===typeof e.indent&&e.indent>0))return null;n=k.call(Array(e.indent+1)," ")}return{base:n,prev:k.call(Array(t+1),n)}}(u,r);if("undefined"===typeof i)i=[];else if(q(i,t)>=0)return"[Circular]";function P(t,n,o){if(n&&(i=C.call(i)).push(n),o){var a={depth:u.depth};return Y(u,"quoteStyle")&&(a.quoteStyle=u.quoteStyle),e(t,a,r+1,i)}return e(t,u,r+1,i)}if("function"===typeof t&&!j(t)){var H=function(e){if(e.name)return e.name;var t=y.call(m.call(e),/^function\s*([\w$]+)/);if(t)return t[1];return null}(t),Q=X(t,P);return"[Function"+(H?": "+H:" (anonymous)")+"]"+(Q.length>0?" { "+k.call(Q,", ")+" }":"")}if(U(t)){var ee=N?_.call(String(t),/^(Symbol\(.*\))_[^)]*$/,"$1"):F.call(t);return"object"!==typeof t||N?ee:G(ee)}if(function(e){if(!e||"object"!==typeof e)return!1;if("undefined"!==typeof HTMLElement&&e instanceof HTMLElement)return!0;return"string"===typeof e.nodeName&&"function"===typeof e.getAttribute}(t)){for(var te="<"+D.call(String(t.nodeName)),ne=t.attributes||[],re=0;re",t.childNodes&&t.childNodes.length&&(te+="..."),te+=""+D.call(String(t.nodeName))+">"}if(R(t)){if(0===t.length)return"[]";var ie=X(t,P);return A&&!function(e){for(var t=0;t=0)return!1;return!0}(ie)?"["+K(ie,A)+"]":"[ "+k.call(ie,", ")+" ]"}if(function(e){return"[object Error]"===V(e)&&(!O||!("object"===typeof e&&O in e))}(t)){var oe=X(t,P);return"cause"in Error.prototype||!("cause"in t)||T.call(t,"cause")?0===oe.length?"["+String(t)+"]":"{ ["+String(t)+"] "+k.call(oe,", ")+" }":"{ ["+String(t)+"] "+k.call(x.call("[cause]: "+P(t.cause),oe),", ")+" }"}if("object"===typeof t&&l){if(I&&"function"===typeof t[I]&&L)return L(t,{depth:E-r});if("symbol"!==l&&"function"===typeof t.inspect)return t.inspect()}if(function(e){if(!o||!e||"object"!==typeof e)return!1;try{o.call(e);try{c.call(e)}catch(te){return!0}return e instanceof Map}catch(t){}return!1}(t)){var ae=[];return a.call(t,(function(e,n){ae.push(P(n,t,!0)+" => "+P(e,t))})),Z("Map",o.call(t),ae,A)}if(function(e){if(!c||!e||"object"!==typeof e)return!1;try{c.call(e);try{o.call(e)}catch(t){return!0}return e instanceof Set}catch(n){}return!1}(t)){var ue=[];return s.call(t,(function(e){ue.push(P(e,t))})),Z("Set",c.call(t),ue,A)}if(function(e){if(!f||!e||"object"!==typeof e)return!1;try{f.call(e,f);try{d.call(e,d)}catch(te){return!0}return e instanceof WeakMap}catch(t){}return!1}(t))return J("WeakMap");if(function(e){if(!d||!e||"object"!==typeof e)return!1;try{d.call(e,d);try{f.call(e,f)}catch(te){return!0}return e instanceof WeakSet}catch(t){}return!1}(t))return J("WeakSet");if(function(e){if(!h||!e||"object"!==typeof e)return!1;try{return h.call(e),!0}catch(t){}return!1}(t))return J("WeakRef");if(function(e){return"[object Number]"===V(e)&&(!O||!("object"===typeof e&&O in e))}(t))return G(P(Number(t)));if(function(e){if(!e||"object"!==typeof e||!S)return!1;try{return S.call(e),!0}catch(t){}return!1}(t))return G(P(S.call(t)));if(function(e){return"[object Boolean]"===V(e)&&(!O||!("object"===typeof e&&O in e))}(t))return G(p.call(t));if(function(e){return"[object String]"===V(e)&&(!O||!("object"===typeof e&&O in e))}(t))return G(P(String(t)));if(!function(e){return"[object Date]"===V(e)&&(!O||!("object"===typeof e&&O in e))}(t)&&!j(t)){var le=X(t,P),ce=M?M(t)===Object.prototype:t instanceof Object||t.constructor===Object,se=t instanceof Object?"":"null prototype",fe=!ce&&O&&Object(t)===t&&O in t?g.call(V(t),8,-1):se?"Object":"",de=(ce||"function"!==typeof t.constructor?"":t.constructor.name?t.constructor.name+" ":"")+(fe||se?"["+k.call(x.call([],fe||[],se||[]),": ")+"] ":"");return 0===le.length?de+"{}":A?de+"{"+K(le,A)+"}":de+"{ "+k.call(le,", ")+" }"}return String(t)};var H=Object.prototype.hasOwnProperty||function(e){return e in this};function Y(e,t){return H.call(e,t)}function V(e){return v.call(e)}function q(e,t){if(e.indexOf)return e.indexOf(t);for(var n=0,r=e.length;nt.maxStringLength){var n=e.length-t.maxStringLength,r="... "+n+" more character"+(n>1?"s":"");return W(g.call(e,0,t.maxStringLength),t)+r}return z(_.call(_.call(e,/(['\\])/g,"\\$1"),/[\x00-\x1f]/g,Q),"single",t)}function Q(e){var t=e.charCodeAt(0),n={8:"b",9:"t",10:"n",12:"f",13:"r"}[t];return n?"\\"+n:"\\x"+(t<16?"0":"")+b.call(t.toString(16))}function G(e){return"Object("+e+")"}function J(e){return e+" { ? }"}function Z(e,t,n,r){return e+" ("+t+") {"+(r?K(n,r):k.call(n,", "))+"}"}function K(e,t){if(0===e.length)return"";var n="\n"+t.prev+t.base;return n+k.call(e,","+n)+"\n"+t.prev}function X(e,t){var n=R(e),r=[];if(n){r.length=e.length;for(var i=0;i-1?e.split(","):e},c=function(e,t,n,r){if(e){var o=n.allowDots?e.replace(/\.([^.[]+)/g,"[$1]"):e,a=/(\[[^[\]]*])/g,u=n.depth>0&&/(\[[^[\]]*])/.exec(o),c=u?o.slice(0,u.index):o,s=[];if(c){if(!n.plainObjects&&i.call(Object.prototype,c)&&!n.allowPrototypes)return;s.push(c)}for(var f=0;n.depth>0&&null!==(u=a.exec(o))&&f=0;--o){var a,u=e[o];if("[]"===u&&n.parseArrays)a=[].concat(i);else{a=n.plainObjects?Object.create(null):{};var c="["===u.charAt(0)&&"]"===u.charAt(u.length-1)?u.slice(1,-1):u,s=parseInt(c,10);n.parseArrays||""!==c?!isNaN(s)&&u!==c&&String(s)===c&&s>=0&&n.parseArrays&&s<=n.arrayLimit?(a=[])[s]=i:"__proto__"!==c&&(a[c]=i):a={0:i}}i=a}return i}(s,t,n,r)}};e.exports=function(e,t){var n=function(e){if(!e)return a;if(null!==e.decoder&&void 0!==e.decoder&&"function"!==typeof e.decoder)throw new TypeError("Decoder has to be a function.");if("undefined"!==typeof e.charset&&"utf-8"!==e.charset&&"iso-8859-1"!==e.charset)throw new TypeError("The charset option must be either utf-8, iso-8859-1, or undefined");var t="undefined"===typeof e.charset?a.charset:e.charset;return{allowDots:"undefined"===typeof e.allowDots?a.allowDots:!!e.allowDots,allowPrototypes:"boolean"===typeof e.allowPrototypes?e.allowPrototypes:a.allowPrototypes,allowSparse:"boolean"===typeof e.allowSparse?e.allowSparse:a.allowSparse,arrayLimit:"number"===typeof e.arrayLimit?e.arrayLimit:a.arrayLimit,charset:t,charsetSentinel:"boolean"===typeof e.charsetSentinel?e.charsetSentinel:a.charsetSentinel,comma:"boolean"===typeof e.comma?e.comma:a.comma,decoder:"function"===typeof e.decoder?e.decoder:a.decoder,delimiter:"string"===typeof e.delimiter||r.isRegExp(e.delimiter)?e.delimiter:a.delimiter,depth:"number"===typeof e.depth||!1===e.depth?+e.depth:a.depth,ignoreQueryPrefix:!0===e.ignoreQueryPrefix,interpretNumericEntities:"boolean"===typeof e.interpretNumericEntities?e.interpretNumericEntities:a.interpretNumericEntities,parameterLimit:"number"===typeof e.parameterLimit?e.parameterLimit:a.parameterLimit,parseArrays:!1!==e.parseArrays,plainObjects:"boolean"===typeof e.plainObjects?e.plainObjects:a.plainObjects,strictNullHandling:"boolean"===typeof e.strictNullHandling?e.strictNullHandling:a.strictNullHandling}}(t);if(""===e||null===e||"undefined"===typeof e)return n.plainObjects?Object.create(null):{};for(var s="string"===typeof e?function(e,t){var n,c={},s=t.ignoreQueryPrefix?e.replace(/^\?/,""):e,f=t.parameterLimit===1/0?void 0:t.parameterLimit,d=s.split(t.delimiter,f),h=-1,p=t.charset;if(t.charsetSentinel)for(n=0;n-1&&(m=o(m)?[m]:m),i.call(c,v)?c[v]=r.combine(c[v],m):c[v]=m}return c}(e,n):e,f=n.plainObjects?Object.create(null):{},d=Object.keys(s),h=0;h0?C.join(",")||null:void 0}];else if(l(h))B=h;else{var P=Object.keys(C);B=m?P.sort(m):P}for(var I=a&&l(C)&&1===C.length?n+"[]":n,z=0;z0?D+b:""}},837:function(e,t,n){"use strict";var r=n(609),i=Object.prototype.hasOwnProperty,o=Array.isArray,a=function(){for(var e=[],t=0;t<256;++t)e.push("%"+((t<16?"0":"")+t.toString(16)).toUpperCase());return e}(),u=function(e,t){for(var n=t&&t.plainObjects?Object.create(null):{},r=0;r1;){var t=e.pop(),n=t.obj[t.prop];if(o(n)){for(var r=[],i=0;i=48&&s<=57||s>=65&&s<=90||s>=97&&s<=122||o===r.RFC1738&&(40===s||41===s)?l+=u.charAt(c):s<128?l+=a[s]:s<2048?l+=a[192|s>>6]+a[128|63&s]:s<55296||s>=57344?l+=a[224|s>>12]+a[128|s>>6&63]+a[128|63&s]:(c+=1,s=65536+((1023&s)<<10|1023&u.charCodeAt(c)),l+=a[240|s>>18]+a[128|s>>12&63]+a[128|s>>6&63]+a[128|63&s])}return l},isBuffer:function(e){return!(!e||"object"!==typeof e)&&!!(e.constructor&&e.constructor.isBuffer&&e.constructor.isBuffer(e))},isRegExp:function(e){return"[object RegExp]"===Object.prototype.toString.call(e)},maybeMap:function(e,t){if(o(e)){for(var n=[],r=0;r2&&(u.children=arguments.length>3?t.call(arguments,2):r),"function"==typeof e&&null!=e.defaultProps)for(a in e.defaultProps)void 0===u[a]&&(u[a]=e.defaultProps[a]);return p(e,u,i,o,null)}function p(e,t,n,o,a){var u={type:e,props:t,key:n,ref:o,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,__h:null,constructor:void 0,__v:null==a?++i:a};return null==a&&null!=r.vnode&&r.vnode(u),u}function v(){return{current:null}}function m(e){return e.children}function y(e,t){this.props=e,this.context=t}function g(e,t){if(null==t)return e.__?g(e.__,e.__.__k.indexOf(e)+1):null;for(var n;t0?p(y.type,y.props,y.key,y.ref?y.ref:null,y.__v):y)){if(y.__=n,y.__b=n.__b+1,null===(v=w[d])||v&&y.key==v.key&&y.type===v.type)w[d]=void 0;else for(h=0;h2&&(u.children=arguments.length>3?t.call(arguments,2):r),p(e.type,u,i||e.key,o||e.ref,null)}function $(e,t){var n={__c:t="__cC"+u++,__:e,Consumer:function(e,t){return e.children(t)},Provider:function(e){var n,r;return this.getChildContext||(n=[],(r={})[t]=this,this.getChildContext=function(){return r},this.shouldComponentUpdate=function(e){this.props.value!==e.value&&n.some(b)},this.sub=function(e){n.push(e);var t=e.componentWillUnmount;e.componentWillUnmount=function(){n.splice(n.indexOf(e),1),t&&t.call(e)}}),e.children}};return n.Provider.__=n.Consumer.contextType=n}t=c.slice,r={__e:function(e,t,n,r){for(var i,o,a;t=t.__;)if((i=t.__c)&&!i.__)try{if((o=i.constructor)&&null!=o.getDerivedStateFromError&&(i.setState(o.getDerivedStateFromError(e)),a=i.__d),null!=i.componentDidCatch&&(i.componentDidCatch(e,r||{}),a=i.__d),a)return i.__E=i}catch(t){e=t}throw e}},i=0,y.prototype.setState=function(e,t){var n;n=null!=this.__s&&this.__s!==this.state?this.__s:this.__s=f({},this.state),"function"==typeof e&&(e=e(f({},n),this.props)),e&&f(n,e),null!=e&&this.__v&&(t&&this._sb.push(t),b(this))},y.prototype.forceUpdate=function(e){this.__v&&(this.__e=!0,e&&this.__h.push(e),b(this))},y.prototype.render=m,o=[],D.__r=0,u=0;var R,j,U,H,Y=0,V=[],q=[],W=r.__b,Q=r.__r,G=r.diffed,J=r.__c,Z=r.unmount;function K(e,t){r.__h&&r.__h(j,e,Y||t),Y=0;var n=j.__H||(j.__H={__:[],__h:[]});return e>=n.__.length&&n.__.push({__V:q}),n.__[e]}function X(e){return Y=1,ee(ye,e)}function ee(e,t,n){var r=K(R++,2);if(r.t=e,!r.__c&&(r.__=[n?n(t):ye(void 0,t),function(e){var t=r.__N?r.__N[0]:r.__[0],n=r.t(t,e);t!==n&&(r.__N=[n,r.__[1]],r.__c.setState({}))}],r.__c=j,!j.u)){j.u=!0;var i=j.shouldComponentUpdate;j.shouldComponentUpdate=function(e,t,n){if(!r.__c.__H)return!0;var o=r.__c.__H.__.filter((function(e){return e.__c}));if(o.every((function(e){return!e.__N})))return!i||i.call(this,e,t,n);var a=!1;return o.forEach((function(e){if(e.__N){var t=e.__[0];e.__=e.__N,e.__N=void 0,t!==e.__[0]&&(a=!0)}})),!(!a&&r.__c.props===e)&&(!i||i.call(this,e,t,n))}}return r.__N||r.__}function te(e,t){var n=K(R++,3);!r.__s&&me(n.__H,t)&&(n.__=e,n.i=t,j.__H.__h.push(n))}function ne(e,t){var n=K(R++,4);!r.__s&&me(n.__H,t)&&(n.__=e,n.i=t,j.__h.push(n))}function re(e){return Y=5,oe((function(){return{current:e}}),[])}function ie(e,t,n){Y=6,ne((function(){return"function"==typeof e?(e(t()),function(){return e(null)}):e?(e.current=t(),function(){return e.current=null}):void 0}),null==n?n:n.concat(e))}function oe(e,t){var n=K(R++,7);return me(n.__H,t)?(n.__V=e(),n.i=t,n.__h=e,n.__V):n.__}function ae(e,t){return Y=8,oe((function(){return e}),t)}function ue(e){var t=j.context[e.__c],n=K(R++,9);return n.c=e,t?(null==n.__&&(n.__=!0,t.sub(j)),t.props.value):e.__}function le(e,t){r.useDebugValue&&r.useDebugValue(t?t(e):e)}function ce(e){var t=K(R++,10),n=X();return t.__=e,j.componentDidCatch||(j.componentDidCatch=function(e,r){t.__&&t.__(e,r),n[1](e)}),[n[0],function(){n[1](void 0)}]}function se(){var e=K(R++,11);if(!e.__){for(var t=j.__v;null!==t&&!t.__m&&null!==t.__;)t=t.__;var n=t.__m||(t.__m=[0,0]);e.__="P"+n[0]+"-"+n[1]++}return e.__}function fe(){for(var e;e=V.shift();)if(e.__P&&e.__H)try{e.__H.__h.forEach(pe),e.__H.__h.forEach(ve),e.__H.__h=[]}catch(u){e.__H.__h=[],r.__e(u,e.__v)}}r.__b=function(e){j=null,W&&W(e)},r.__r=function(e){Q&&Q(e),R=0;var t=(j=e.__c).__H;t&&(U===j?(t.__h=[],j.__h=[],t.__.forEach((function(e){e.__N&&(e.__=e.__N),e.__V=q,e.__N=e.i=void 0}))):(t.__h.forEach(pe),t.__h.forEach(ve),t.__h=[])),U=j},r.diffed=function(e){G&&G(e);var t=e.__c;t&&t.__H&&(t.__H.__h.length&&(1!==V.push(t)&&H===r.requestAnimationFrame||((H=r.requestAnimationFrame)||he)(fe)),t.__H.__.forEach((function(e){e.i&&(e.__H=e.i),e.__V!==q&&(e.__=e.__V),e.i=void 0,e.__V=q}))),U=j=null},r.__c=function(e,t){t.some((function(e){try{e.__h.forEach(pe),e.__h=e.__h.filter((function(e){return!e.__||ve(e)}))}catch(i){t.some((function(e){e.__h&&(e.__h=[])})),t=[],r.__e(i,e.__v)}})),J&&J(e,t)},r.unmount=function(e){Z&&Z(e);var t,n=e.__c;n&&n.__H&&(n.__H.__.forEach((function(e){try{pe(e)}catch(e){t=e}})),n.__H=void 0,t&&r.__e(t,n.__v))};var de="function"==typeof requestAnimationFrame;function he(e){var t,n=function(){clearTimeout(r),de&&cancelAnimationFrame(t),setTimeout(e)},r=setTimeout(n,100);de&&(t=requestAnimationFrame(n))}function pe(e){var t=j,n=e.__c;"function"==typeof n&&(e.__c=void 0,n()),j=t}function ve(e){var t=j;e.__c=e.__(),j=t}function me(e,t){return!e||e.length!==t.length||t.some((function(t,n){return t!==e[n]}))}function ye(e,t){return"function"==typeof t?t(e):t}function ge(e,t){for(var n in t)e[n]=t[n];return e}function _e(e,t){for(var n in e)if("__source"!==n&&!(n in t))return!0;for(var r in t)if("__source"!==r&&e[r]!==t[r])return!0;return!1}function be(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t}function De(e){this.props=e}function we(e,t){function n(e){var n=this.props.ref,r=n==e.ref;return!r&&n&&(n.call?n(null):n.current=null),t?!t(this.props,e)||!r:_e(this.props,e)}function r(t){return this.shouldComponentUpdate=n,h(e,t)}return r.displayName="Memo("+(e.displayName||e.name)+")",r.prototype.isReactComponent=!0,r.__f=!0,r}(De.prototype=new y).isPureReactComponent=!0,De.prototype.shouldComponentUpdate=function(e,t){return _e(this.props,e)||_e(this.state,t)};var xe=r.__b;r.__b=function(e){e.type&&e.type.__f&&e.ref&&(e.props.ref=e.ref,e.ref=null),xe&&xe(e)};var ke="undefined"!=typeof Symbol&&Symbol.for&&Symbol.for("react.forward_ref")||3911;function Ce(e){function t(t){var n=ge({},t);return delete n.ref,e(n,t.ref||null)}return t.$$typeof=ke,t.render=t,t.prototype.isReactComponent=t.__f=!0,t.displayName="ForwardRef("+(e.displayName||e.name)+")",t}var Ee=function(e,t){return null==e?null:k(k(e).map(t))},Se={map:Ee,forEach:Ee,count:function(e){return e?k(e).length:0},only:function(e){var t=k(e);if(1!==t.length)throw"Children.only";return t[0]},toArray:k},Ae=r.__e;r.__e=function(e,t,n,r){if(e.then)for(var i,o=t;o=o.__;)if((i=o.__c)&&i.__c)return null==t.__e&&(t.__e=n.__e,t.__k=n.__k),i.__c(e,t);Ae(e,t,n,r)};var Fe=r.unmount;function Ne(e,t,n){return e&&(e.__c&&e.__c.__H&&(e.__c.__H.__.forEach((function(e){"function"==typeof e.__c&&e.__c()})),e.__c.__H=null),null!=(e=ge({},e)).__c&&(e.__c.__P===n&&(e.__c.__P=t),e.__c=null),e.__k=e.__k&&e.__k.map((function(e){return Ne(e,t,n)}))),e}function Oe(e,t,n){return e&&(e.__v=null,e.__k=e.__k&&e.__k.map((function(e){return Oe(e,t,n)})),e.__c&&e.__c.__P===t&&(e.__e&&n.insertBefore(e.__e,e.__d),e.__c.__e=!0,e.__c.__P=n)),e}function Te(){this.__u=0,this.t=null,this.__b=null}function Me(e){var t=e.__.__c;return t&&t.__a&&t.__a(e)}function Be(e){var t,n,r;function i(i){if(t||(t=e()).then((function(e){n=e.default||e}),(function(e){r=e})),r)throw r;if(!n)throw t;return h(n,i)}return i.displayName="Lazy",i.__f=!0,i}function Le(){this.u=null,this.o=null}r.unmount=function(e){var t=e.__c;t&&t.__R&&t.__R(),t&&!0===e.__h&&(e.type=null),Fe&&Fe(e)},(Te.prototype=new y).__c=function(e,t){var n=t.__c,r=this;null==r.t&&(r.t=[]),r.t.push(n);var i=Me(r.__v),o=!1,a=function(){o||(o=!0,n.__R=null,i?i(u):u())};n.__R=a;var u=function(){if(!--r.__u){if(r.state.__a){var e=r.state.__a;r.__v.__k[0]=Oe(e,e.__c.__P,e.__c.__O)}var t;for(r.setState({__a:r.__b=null});t=r.t.pop();)t.forceUpdate()}},l=!0===t.__h;r.__u++||l||r.setState({__a:r.__b=r.__v.__k[0]}),e.then(a,a)},Te.prototype.componentWillUnmount=function(){this.t=[]},Te.prototype.render=function(e,t){if(this.__b){if(this.__v.__k){var n=document.createElement("div"),r=this.__v.__k[0].__c;this.__v.__k[0]=Ne(this.__b,n,r.__O=r.__P)}this.__b=null}var i=t.__a&&h(m,null,e.fallback);return i&&(i.__h=null),[h(m,null,t.__a?null:e.children),i]};var Pe=function(e,t,n){if(++n[1]===n[0]&&e.o.delete(t),e.props.revealOrder&&("t"!==e.props.revealOrder[0]||!e.o.size))for(n=e.u;n;){for(;n.length>3;)n.pop()();if(n[1]>>1,1),t.i.removeChild(e)}}),P(h(Ie,{context:t.context},e.__v),t.l)):t.l&&t.componentWillUnmount()}function $e(e,t){var n=h(ze,{__v:e,i:t});return n.containerInfo=t,n}(Le.prototype=new y).__a=function(e){var t=this,n=Me(t.__v),r=t.o.get(e);return r[0]++,function(i){var o=function(){t.props.revealOrder?(r.push(i),Pe(t,e,r)):i()};n?n(o):o()}},Le.prototype.render=function(e){this.u=null,this.o=new Map;var t=k(e.children);e.revealOrder&&"b"===e.revealOrder[0]&&t.reverse();for(var n=t.length;n--;)this.o.set(t[n],this.u=[1,0,this.u]);return e.children},Le.prototype.componentDidUpdate=Le.prototype.componentDidMount=function(){var e=this;this.o.forEach((function(t,n){Pe(e,n,t)}))};var Re="undefined"!=typeof Symbol&&Symbol.for&&Symbol.for("react.element")||60103,je=/^(?:accent|alignment|arabic|baseline|cap|clip(?!PathU)|color|dominant|fill|flood|font|glyph(?!R)|horiz|image|letter|lighting|marker(?!H|W|U)|overline|paint|pointer|shape|stop|strikethrough|stroke|text(?!L)|transform|underline|unicode|units|v|vector|vert|word|writing|x(?!C))[A-Z]/,Ue="undefined"!=typeof document,He=function(e){return("undefined"!=typeof Symbol&&"symbol"==typeof Symbol()?/fil|che|rad/i:/fil|che|ra/i).test(e)};function Ye(e,t,n){return null==t.__k&&(t.textContent=""),P(e,t),"function"==typeof n&&n(),e?e.__c:null}function Ve(e,t,n){return I(e,t),"function"==typeof n&&n(),e?e.__c:null}y.prototype.isReactComponent={},["componentWillMount","componentWillReceiveProps","componentWillUpdate"].forEach((function(e){Object.defineProperty(y.prototype,e,{configurable:!0,get:function(){return this["UNSAFE_"+e]},set:function(t){Object.defineProperty(this,e,{configurable:!0,writable:!0,value:t})}})}));var qe=r.event;function We(){}function Qe(){return this.cancelBubble}function Ge(){return this.defaultPrevented}r.event=function(e){return qe&&(e=qe(e)),e.persist=We,e.isPropagationStopped=Qe,e.isDefaultPrevented=Ge,e.nativeEvent=e};var Je,Ze={configurable:!0,get:function(){return this.class}},Ke=r.vnode;r.vnode=function(e){var t=e.type,n=e.props,r=n;if("string"==typeof t){var i=-1===t.indexOf("-");for(var o in r={},n){var a=n[o];Ue&&"children"===o&&"noscript"===t||"value"===o&&"defaultValue"in n&&null==a||("defaultValue"===o&&"value"in n&&null==n.value?o="value":"download"===o&&!0===a?a="":/ondoubleclick/i.test(o)?o="ondblclick":/^onchange(textarea|input)/i.test(o+t)&&!He(n.type)?o="oninput":/^onfocus$/i.test(o)?o="onfocusin":/^onblur$/i.test(o)?o="onfocusout":/^on(Ani|Tra|Tou|BeforeInp|Compo)/.test(o)?o=o.toLowerCase():i&&je.test(o)?o=o.replace(/[A-Z0-9]/g,"-$&").toLowerCase():null===a&&(a=void 0),/^oninput$/i.test(o)&&(o=o.toLowerCase(),r[o]&&(o="oninputCapture")),r[o]=a)}"select"==t&&r.multiple&&Array.isArray(r.value)&&(r.value=k(n.children).forEach((function(e){e.props.selected=-1!=r.value.indexOf(e.props.value)}))),"select"==t&&null!=r.defaultValue&&(r.value=k(n.children).forEach((function(e){e.props.selected=r.multiple?-1!=r.defaultValue.indexOf(e.props.value):r.defaultValue==e.props.value}))),e.props=r,n.class!=n.className&&(Ze.enumerable="className"in n,null!=n.className&&(r.class=n.className),Object.defineProperty(r,"className",Ze))}e.$$typeof=Re,Ke&&Ke(e)};var Xe=r.__r;r.__r=function(e){Xe&&Xe(e),Je=e.__c};var et={ReactCurrentDispatcher:{current:{readContext:function(e){return Je.__n[e.__c].props.value}}}},tt="17.0.2";function nt(e){return h.bind(null,e)}function rt(e){return!!e&&e.$$typeof===Re}function it(e){return rt(e)?z.apply(null,arguments):e}function ot(e){return!!e.__k&&(P(null,e),!0)}function at(e){return e&&(e.base||1===e.nodeType&&e)||null}var ut=function(e,t){return e(t)},lt=function(e,t){return e(t)},ct=m;function st(e){e()}function ft(e){return e}function dt(){return[!1,st]}var ht=ne;function pt(e,t){var n=t(),r=X({h:{__:n,v:t}}),i=r[0].h,o=r[1];return ne((function(){i.__=n,i.v=t,be(i.__,t())||o({h:i})}),[e,n,t]),te((function(){return be(i.__,i.v())||o({h:i}),e((function(){be(i.__,i.v())||o({h:i})}))}),[e]),n}var vt,mt={useState:X,useId:se,useReducer:ee,useEffect:te,useLayoutEffect:ne,useInsertionEffect:ht,useTransition:dt,useDeferredValue:ft,useSyncExternalStore:pt,startTransition:st,useRef:re,useImperativeHandle:ie,useMemo:oe,useCallback:ae,useContext:ue,useDebugValue:le,version:"17.0.2",Children:Se,render:Ye,hydrate:Ve,unmountComponentAtNode:ot,createPortal:$e,createElement:h,createContext:$,createFactory:nt,cloneElement:it,createRef:v,Fragment:m,isValidElement:rt,findDOMNode:at,Component:y,PureComponent:De,memo:we,forwardRef:Ce,flushSync:lt,unstable_batchedUpdates:ut,StrictMode:ct,Suspense:Te,SuspenseList:Le,lazy:Be,__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED:et},yt=n(658),gt=n.n(yt),_t=n(443),bt=n.n(_t),Dt=n(446),wt=n.n(Dt),xt=n(635),kt=n.n(xt);function Ct(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n=0&&(t.hash=e.substr(n),e=e.substr(0,n));var r=e.indexOf("?");r>=0&&(t.search=e.substr(r),e=e.substr(0,r)),e&&(t.pathname=e)}return t}function Gt(e){var t="undefined"!==typeof window&&"undefined"!==typeof window.location&&"null"!==window.location.origin?window.location.origin:"unknown://unknown",n="string"===typeof e?e:Wt(e);return new URL(n,t)}function Jt(e,t,n,r){void 0===r&&(r={});var i=r,o=i.window,a=void 0===o?document.defaultView:o,u=i.v5Compat,l=void 0!==u&&u,c=a.history,s=vt.Pop,f=null;function d(){s=vt.Pop,f&&f({action:s,location:h.location})}var h={get action(){return s},get location(){return e(a,c)},listen:function(e){if(f)throw new Error("A history only accepts one active listener");return a.addEventListener(Ht,d),f=e,function(){a.removeEventListener(Ht,d),f=null}},createHref:function(e){return t(a,e)},encodeLocation:function(e){var t=Gt(Wt(e));return jt({},e,{pathname:t.pathname,search:t.search,hash:t.hash})},push:function(e,t){s=vt.Push;var r=qt(h.location,e,t);n&&n(r,e);var i=Vt(r),o=h.createHref(r);try{c.pushState(i,"",o)}catch(u){a.location.assign(o)}l&&f&&f({action:s,location:h.location})},replace:function(e,t){s=vt.Replace;var r=qt(h.location,e,t);n&&n(r,e);var i=Vt(r),o=h.createHref(r);c.replaceState(i,"",o),l&&f&&f({action:s,location:h.location})},go:function(e){return c.go(e)}};return h}function Zt(e,t,n){void 0===n&&(n="/");var r=an(("string"===typeof t?Qt(t):t).pathname||"/",n);if(null==r)return null;var i=Kt(e);!function(e){e.sort((function(e,t){return e.score!==t.score?t.score-e.score:function(e,t){var n=e.length===t.length&&e.slice(0,-1).every((function(e,n){return e===t[n]}));return n?e[e.length-1]-t[t.length-1]:0}(e.routesMeta.map((function(e){return e.childrenIndex})),t.routesMeta.map((function(e){return e.childrenIndex})))}))}(i);for(var o=null,a=0;null==o&&a0&&(un(!0!==e.index,'Index routes must not have child routes. Please remove all child routes from route path "'+a+'".'),Kt(e.children,t,u,a)),(null!=e.path||e.index)&&t.push({path:a,score:tn(a,e.index),routesMeta:u})})),t}!function(e){e.data="data",e.deferred="deferred",e.redirect="redirect",e.error="error"}(Ut||(Ut={}));var Xt=/^:\w+$/,en=function(e){return"*"===e};function tn(e,t){var n=e.split("/"),r=n.length;return n.some(en)&&(r+=-2),t&&(r+=2),n.filter((function(e){return!en(e)})).reduce((function(e,t){return e+(Xt.test(t)?3:""===t?1:10)}),r)}function nn(e,t){for(var n=e.routesMeta,r={},i="/",o=[],a=0;a and the router will parse it for you.'}function sn(e){return e.filter((function(e,t){return 0===t||e.route.path&&e.route.path.length>0}))}function fn(e,t,n,r){var i;void 0===r&&(r=!1),"string"===typeof e?i=Qt(e):(un(!(i=jt({},e)).pathname||!i.pathname.includes("?"),cn("?","pathname","search",i)),un(!i.pathname||!i.pathname.includes("#"),cn("#","pathname","hash",i)),un(!i.search||!i.search.includes("#"),cn("#","search","hash",i)));var o,a=""===e||""===i.pathname,u=a?"/":i.pathname;if(r||null==u)o=n;else{var l=t.length-1;if(u.startsWith("..")){for(var c=u.split("/");".."===c[0];)c.shift(),l-=1;i.pathname=c.join("/")}o=l>=0?t[l]:"/"}var s=function(e,t){void 0===t&&(t="/");var n="string"===typeof e?Qt(e):e,r=n.pathname,i=n.search,o=void 0===i?"":i,a=n.hash,u=void 0===a?"":a,l=r?r.startsWith("/")?r:function(e,t){var n=t.replace(/\/+$/,"").split("/");return e.split("/").forEach((function(e){".."===e?n.length>1&&n.pop():"."!==e&&n.push(e)})),n.length>1?n.join("/"):"/"}(r,t):t;return{pathname:l,search:pn(o),hash:vn(u)}}(i,o),f=u&&"/"!==u&&u.endsWith("/"),d=(a||"."===u)&&n.endsWith("/");return s.pathname.endsWith("/")||!f&&!d||(s.pathname+="/"),s}var dn=function(e){return e.join("/").replace(/\/\/+/g,"/")},hn=function(e){return e.replace(/\/+$/,"").replace(/^\/*/,"/")},pn=function(e){return e&&"?"!==e?e.startsWith("?")?e:"?"+e:""},vn=function(e){return e&&"#"!==e?e.startsWith("#")?e:"#"+e:""};Error;var mn=Ot((function e(t,n,r){Ft(this,e),this.status=t,this.statusText=n||"",this.data=r}));function yn(e){return e instanceof mn}"undefined"!==typeof window&&"undefined"!==typeof window.document&&window.document.createElement;var gn=new Set(["POST","PUT","PATCH","DELETE"]);new Set(["GET","HEAD"].concat(At(gn)));function _n(){return _n=Object.assign?Object.assign.bind():function(e){for(var t=1;t")))}var zn,$n,Rn=function(e){Mt(n,e);var t=zt(n);function n(e){var r;return Ft(this,n),(r=t.call(this,e)).state={location:e.location,error:e.error},r}return Ot(n,[{key:"componentDidCatch",value:function(e,t){console.error("React Router caught the following error during render",e,t)}},{key:"render",value:function(){return this.state.error?h(Tn.Provider,{value:this.state.error,children:this.props.component}):this.props.children}}],[{key:"getDerivedStateFromError",value:function(e){return{error:e}}},{key:"getDerivedStateFromProps",value:function(e,t){return t.location!==e.location?{error:e.error,location:e.location}:{error:e.error||t.error,location:t.location}}}]),n}(y);function jn(e){var t=e.routeContext,n=e.match,r=e.children,i=ue(En);return i&&n.route.errorElement&&(i._deepestRenderedBoundaryId=n.route.id),h(On.Provider,{value:t},r)}function Un(e,t,n){if(void 0===t&&(t=[]),null==e){if(null==n||!n.errors)return null;e=n.matches}var r=e,i=null==n?void 0:n.errors;if(null!=i){var o=r.findIndex((function(e){return e.route.id&&(null==i?void 0:i[e.route.id])}));o>=0||un(!1),r=r.slice(0,Math.min(r.length,o+1))}return r.reduceRight((function(e,o,a){var u=o.route.id?null==i?void 0:i[o.route.id]:null,l=n?o.route.errorElement||h(In,null):null,c=function(){return h(jn,{match:o,routeContext:{outlet:e,matches:t.concat(r.slice(0,a+1))}},u?l:void 0!==o.route.element?o.route.element:e)};return n&&(o.route.errorElement||0===a)?h(Rn,{location:n.location,component:l,error:u,children:c()}):c()}),null)}function Hn(e){var t=ue(An);return t||un(!1),t}!function(e){e.UseRevalidator="useRevalidator"}(zn||(zn={})),function(e){e.UseLoaderData="useLoaderData",e.UseActionData="useActionData",e.UseRouteError="useRouteError",e.UseNavigation="useNavigation",e.UseRouteLoaderData="useRouteLoaderData",e.UseMatches="useMatches",e.UseRevalidator="useRevalidator"}($n||($n={}));var Yn;function Vn(e){return function(e){var t=ue(On).outlet;return t?h(Pn.Provider,{value:e},t):t}(e.context)}function qn(e){un(!1)}function Wn(e){var t=e.basename,n=void 0===t?"/":t,r=e.children,i=void 0===r?null:r,o=e.location,a=e.navigationType,u=void 0===a?vt.Pop:a,l=e.navigator,c=e.static,s=void 0!==c&&c;Mn()&&un(!1);var f=n.replace(/^\/*/,"/"),d=oe((function(){return{basename:f,navigator:l,static:s}}),[f,l,s]);"string"===typeof o&&(o=Qt(o));var p=o,v=p.pathname,m=void 0===v?"/":v,y=p.search,g=void 0===y?"":y,_=p.hash,b=void 0===_?"":_,D=p.state,w=void 0===D?null:D,x=p.key,k=void 0===x?"default":x,C=oe((function(){var e=an(m,f);return null==e?null:{pathname:e,search:g,hash:b,state:w,key:k}}),[f,m,g,b,w,k]);return null==C?null:h(Fn.Provider,{value:d},h(Nn.Provider,{children:i,value:{location:C,navigationType:u}}))}function Qn(e){var t=e.children,n=e.location,r=ue(Sn);return function(e,t){Mn()||un(!1);var n,r=ue(An),i=ue(On).matches,o=i[i.length-1],a=o?o.params:{},u=(o&&o.pathname,o?o.pathnameBase:"/"),l=(o&&o.route,Bn());if(t){var c,s="string"===typeof t?Qt(t):t;"/"===u||(null==(c=s.pathname)?void 0:c.startsWith(u))||un(!1),n=s}else n=l;var f=n.pathname||"/",d=Zt(e,{pathname:"/"===u?f:f.slice(u.length)||"/"}),p=Un(d&&d.map((function(e){return Object.assign({},e,{params:Object.assign({},a,e.params),pathname:dn([u,e.pathname]),pathnameBase:"/"===e.pathnameBase?u:dn([u,e.pathnameBase])})})),i,r||void 0);return t&&p?h(Nn.Provider,{value:{location:_n({pathname:"/",search:"",hash:"",state:null,key:"default"},n),navigationType:vt.Pop}},p):p}(r&&!t?r.router.routes:Gn(t),n)}!function(e){e[e.pending=0]="pending",e[e.success=1]="success",e[e.error=2]="error"}(Yn||(Yn={}));new Promise((function(){}));function Gn(e,t){void 0===t&&(t=[]);var n=[];return Se.forEach(e,(function(e,r){if(rt(e))if(e.type!==m){e.type!==qn&&un(!1),e.props.index&&e.props.children&&un(!1);var i=[].concat(At(t),[r]),o={id:e.props.id||i.join("-"),caseSensitive:e.props.caseSensitive,element:e.props.element,index:e.props.index,path:e.props.path,loader:e.props.loader,action:e.props.action,errorElement:e.props.errorElement,hasErrorBoundary:null!=e.props.errorElement,shouldRevalidate:e.props.shouldRevalidate,handle:e.props.handle};e.props.children&&(o.children=Gn(e.props.children,i)),n.push(o)}else n.push.apply(n,Gn(e.props.children,t))})),n}function Jn(e){var t=e.basename,n=e.children,r=e.window,i=re();null==i.current&&(i.current=function(e){return void 0===e&&(e={}),Jt((function(e,t){var n=Qt(e.location.hash.substr(1)),r=n.pathname,i=void 0===r?"/":r,o=n.search,a=void 0===o?"":o,u=n.hash;return qt("",{pathname:i,search:a,hash:void 0===u?"":u},t.state&&t.state.usr||null,t.state&&t.state.key||"default")}),(function(e,t){var n=e.document.querySelector("base"),r="";if(n&&n.getAttribute("href")){var i=e.location.href,o=i.indexOf("#");r=-1===o?i:i.slice(0,o)}return r+"#"+("string"===typeof t?t:Wt(t))}),(function(e,t){Yt("/"===e.pathname.charAt(0),"relative pathnames are not supported in hash history.push("+JSON.stringify(t)+")")}),e)}({window:r,v5Compat:!0}));var o=i.current,a=St(X({action:o.action,location:o.location}),2),u=a[0],l=a[1];return ne((function(){return o.listen(l)}),[o]),h(Wn,{basename:t,children:n,location:u.location,navigationType:u.action,navigator:o})}var Zn,Kn;(function(e){e.UseScrollRestoration="useScrollRestoration",e.UseSubmitImpl="useSubmitImpl",e.UseFetcher="useFetcher"})(Zn||(Zn={})),function(e){e.UseFetchers="useFetchers",e.UseScrollRestoration="useScrollRestoration"}(Kn||(Kn={}));var Xn;function er(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var tr={home:"/",dashboards:"/dashboards",cardinality:"/cardinality",topQueries:"/top-queries",trace:"/trace"},nr={header:{timeSelector:!0,executionControls:!0}},rr=(er(Xn={},tr.home,nr),er(Xn,tr.dashboards,nr),er(Xn,tr.cardinality,{header:{cardinalityDatePicker:!0}}),Xn),ir=tr;function or(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function ar(e){for(var t=1;t2&&void 0!==arguments[2]?arguments[2]:window.location.search,r=sr().parse(n,{ignoreQueryPrefix:!0});return dr()(r,e,t||"")},mr={serverUrl:ur().serverURL||window.location.href.replace(/\/(?:prometheus\/)?(?:graph|vmui)\/.*/,"/prometheus"),tenantId:Number(vr("g0.tenantID",0))};function yr(e,t){switch(t.type){case"SET_SERVER":return ar(ar({},e),{},{serverUrl:t.payload});case"SET_TENANT_ID":return ar(ar({},e),{},{tenantId:t.payload});default:throw new Error}}var gr=0;function _r(e,t,n,i,o){var a,u,l={};for(u in t)"ref"==u?a=t[u]:l[u]=t[u];var c={type:e,props:l,key:n,ref:a,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,__h:null,constructor:void 0,__v:--gr,__source:o,__self:i};if("function"==typeof e&&(a=e.defaultProps))for(u in a)void 0===l[u]&&(l[u]=a[u]);return r.vnode&&r.vnode(c),c}var br=$({}),Dr=function(){return ue(br).state},wr=function(){return ue(br).dispatch},xr=Object.entries(mr).reduce((function(e,t){var n=St(t,2),r=n[0],i=n[1];return ar(ar({},e),{},er({},r,vr(r)||i))}),{}),kr="YYYY-MM-DD",Cr="YYYY-MM-DD HH:mm:ss",Er="YYYY-MM-DD[T]HH:mm:ss",Sr=window.innerWidth/4,Ar=1,Fr=1578e8,Nr=Intl.supportedValuesOf("timeZone"),Or=[{long:"days",short:"d",possible:"day"},{long:"weeks",short:"w",possible:"week"},{long:"months",short:"M",possible:"mon"},{long:"years",short:"y",possible:"year"},{long:"hours",short:"h",possible:"hour"},{long:"minutes",short:"m",possible:"min"},{long:"seconds",short:"s",possible:"sec"},{long:"milliseconds",short:"ms",possible:"millisecond"}].map((function(e){return e.short})),Tr=function(e){return Math.round(1e3*e)/1e3},Mr=function(e){var t=e.match(/\d+/g),n=e.match(/[a-zA-Z]+/g);if(n&&t&&Or.includes(n[0]))return er({},n[0],t[0])},Br=function(e,t){var n=(t||gt()().toDate()).valueOf()/1e3,r=e.trim().split(" ").reduce((function(e,t){var n=Mr(t);return n?ar(ar({},e),n):ar({},e)}),{}),i=gt().duration(r).asSeconds();return{start:n-i,end:n,step:Tr(i/Sr)||.001,date:Lr(t||gt()().toDate())}},Lr=function(e){return gt().tz(e).utc().format(Er)},Pr=function(e){return gt().tz(e).format(Er)},Ir=function(e){var t=Math.floor(e%1e3),n=Math.floor(e/1e3%60),r=Math.floor(e/1e3/60%60),i=Math.floor(e/1e3/3600%24),o=Math.floor(e/864e5),a=["d","h","m","s","ms"],u=[o,i,r,n,t].map((function(e,t){return e?"".concat(e).concat(a[t]):""}));return u.filter((function(e){return e})).join(" ")},zr=function(e){return gt()(1e3*e).toDate()},$r=[{title:"Last 5 minutes",duration:"5m"},{title:"Last 15 minutes",duration:"15m"},{title:"Last 30 minutes",duration:"30m",isDefault:!0},{title:"Last 1 hour",duration:"1h"},{title:"Last 3 hours",duration:"3h"},{title:"Last 6 hours",duration:"6h"},{title:"Last 12 hours",duration:"12h"},{title:"Last 24 hours",duration:"24h"},{title:"Last 2 days",duration:"2d"},{title:"Last 7 days",duration:"7d"},{title:"Last 30 days",duration:"30d"},{title:"Last 90 days",duration:"90d"},{title:"Last 180 days",duration:"180d"},{title:"Last 1 year",duration:"1y"},{title:"Yesterday",duration:"1d",until:function(){return gt()().tz().subtract(1,"day").endOf("day").toDate()}},{title:"Today",duration:"1d",until:function(){return gt()().tz().endOf("day").toDate()}}].map((function(e){return ar({id:e.title.replace(/\s/g,"_").toLocaleLowerCase(),until:e.until?e.until:function(){return gt()().tz().toDate()}},e)})),Rr=function(e){var t,n=e.relativeTimeId,r=e.defaultDuration,i=e.defaultEndInput,o=null===(t=$r.find((function(e){return e.isDefault})))||void 0===t?void 0:t.id,a=n||vr("g0.relative_time",o),u=$r.find((function(e){return e.id===a}));return{relativeTimeId:u?a:"none",duration:u?u.duration:r,endInput:u?u.until():i}},jr=function(e){var t=gt()().tz(e);return"UTC".concat(t.format("Z"))},Ur=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=new RegExp(e,"i");return Nr.reduce((function(n,r){var i=(r.match(/^(.*?)\//)||[])[1]||"unknown",o=jr(r),a={region:r,utc:o,search:"".concat(r," ").concat(o," ").concat(r.replace(/[/_]/gim," "))},u=!e||e&&t.test(a.search);return u&&n[i]?n[i].push(a):u&&(n[i]=[a]),n}),{})},Hr=function(e){gt().tz.setDefault(e)},Yr=function(e,t){t?window.localStorage.setItem(e,JSON.stringify({value:t})):qr([e])},Vr=function(e){var t=window.localStorage.getItem(e);if(null!==t)try{var n;return null===(n=JSON.parse(t))||void 0===n?void 0:n.value}catch(c){return t}},qr=function(e){return e.forEach((function(e){return window.localStorage.removeItem(e)}))},Wr=Vr("TIMEZONE")||gt().tz.guess();Hr(Wr);var Qr,Gr=vr("g0.range_input"),Jr=Rr({defaultDuration:Gr||"1h",defaultEndInput:(Qr=vr("g0.end_input",gt()().utc().format(Er)),gt()(Qr).utcOffset(0,!0).toDate()),relativeTimeId:Gr?vr("g0.relative_time","none"):void 0}),Zr=Jr.duration,Kr=Jr.endInput,Xr=Jr.relativeTimeId,ei={duration:Zr,period:Br(Zr,Kr),relativeTime:Xr,timezone:Wr};function ti(e,t){switch(t.type){case"SET_DURATION":return ar(ar({},e),{},{duration:t.payload,period:Br(t.payload,zr(e.period.end)),relativeTime:"none"});case"SET_RELATIVE_TIME":return ar(ar({},e),{},{duration:t.payload.duration,period:Br(t.payload.duration,t.payload.until),relativeTime:t.payload.id});case"SET_PERIOD":var n=function(e){var t=e.to.valueOf()-e.from.valueOf();return Ir(t)}(t.payload);return ar(ar({},e),{},{duration:n,period:Br(n,t.payload.to),relativeTime:"none"});case"RUN_QUERY":var r=Rr({relativeTimeId:e.relativeTime,defaultDuration:e.duration,defaultEndInput:zr(e.period.end)}),i=r.duration,o=r.endInput;return ar(ar({},e),{},{period:Br(i,o)});case"RUN_QUERY_TO_NOW":return ar(ar({},e),{},{period:Br(e.duration)});case"SET_TIMEZONE":return Hr(t.payload),Yr("TIMEZONE",t.payload),ar(ar({},e),{},{timezone:t.payload});default:throw new Error}}var ni=$({}),ri=function(){return ue(ni).state},ii=function(){return ue(ni).dispatch},oi=function(){var e,t=(null===(e=window.location.search.match(/g\d+.expr/gim))||void 0===e?void 0:e.length)||1;return new Array(t>4?4:t).fill(1).map((function(e,t){return vr("g".concat(t,".expr"),"")}))}(),ai={query:oi,queryHistory:oi.map((function(e){return{index:0,values:[e]}})),autocomplete:Vr("AUTOCOMPLETE")||!1};function ui(e,t){switch(t.type){case"SET_QUERY":return ar(ar({},e),{},{query:t.payload.map((function(e){return e}))});case"SET_QUERY_HISTORY":return ar(ar({},e),{},{queryHistory:t.payload});case"SET_QUERY_HISTORY_BY_INDEX":return e.queryHistory.splice(t.payload.queryNumber,1,t.payload.value),ar(ar({},e),{},{queryHistory:e.queryHistory});case"TOGGLE_AUTOCOMPLETE":return Yr("AUTOCOMPLETE",!e.autocomplete),ar(ar({},e),{},{autocomplete:!e.autocomplete});default:throw new Error}}var li=$({}),ci=function(){return ue(li).state},si=function(){return ue(li).dispatch},fi=function(){return _r("svg",{viewBox:"0 0 74 24",fill:"currentColor",children:[_r("path",{d:"M6.11771 9.47563C6.4774 9.7554 6.91935 9.90875 7.37507 9.9119H7.42685C7.9076 9.90451 8.38836 9.71964 8.67681 9.46823C10.1856 8.18898 14.5568 4.18115 14.5568 4.18115C15.7254 3.09415 12.4637 2.00716 7.42685 1.99977H7.36768C2.33084 2.00716 -0.930893 3.09415 0.237711 4.18115C0.237711 4.18115 4.60888 8.18898 6.11771 9.47563ZM8.67681 11.6422C8.31807 11.9246 7.87603 12.0806 7.41945 12.0859H7.37507C6.91849 12.0806 6.47645 11.9246 6.11771 11.6422C5.08224 10.7549 1.38413 7.41995 0.00103198 6.14809V8.07806C0.00103198 8.2925 0.0823905 8.57349 0.222919 8.70659L0.293358 8.77097L0.293386 8.77099C1.33788 9.72556 4.83907 12.9253 6.11771 14.0159C6.47645 14.2983 6.91849 14.4543 7.37507 14.4595H7.41945C7.9076 14.4447 8.38096 14.2599 8.67681 14.0159C9.98594 12.9067 13.6249 9.57175 14.5642 8.70659C14.7121 8.57349 14.7861 8.2925 14.7861 8.07806V6.14809C12.7662 7.99781 10.7297 9.82926 8.67681 11.6422ZM7.41945 16.6261C7.87517 16.623 8.31712 16.4696 8.67681 16.1898C10.7298 14.3744 12.7663 12.5405 14.7861 10.6883V12.6257C14.7861 12.8327 14.7121 13.1137 14.5642 13.2468C13.6249 14.1194 9.98594 17.4469 8.67681 18.5561C8.38096 18.8075 7.9076 18.9924 7.41945 18.9998H7.37507C6.91935 18.9966 6.4774 18.8433 6.11771 18.5635C4.91431 17.5371 1.74223 14.6362 0.502336 13.5023C0.3934 13.4027 0.299379 13.3167 0.222919 13.2468C0.0823905 13.1137 0.00103198 12.8327 0.00103198 12.6257V10.6883C1.38413 11.9528 5.08224 15.2951 6.11771 16.1825C6.47645 16.4649 6.91849 16.6209 7.37507 16.6261H7.41945Z",fill:"currentColor"}),_r("path",{d:"M35 3.54L29.16 18H26.73L20.89 3.54H23.05C23.2833 3.54 23.4733 3.59667 23.62 3.71C23.7667 3.82333 23.8767 3.97 23.95 4.15L27.36 12.97C27.4733 13.2567 27.58 13.5733 27.68 13.92C27.7867 14.26 27.8867 14.6167 27.98 14.99C28.06 14.6167 28.1467 14.26 28.24 13.92C28.3333 13.5733 28.4367 13.2567 28.55 12.97L31.94 4.15C31.9933 3.99667 32.0967 3.85667 32.25 3.73C32.41 3.60333 32.6033 3.54 32.83 3.54H35ZM52.1767 3.54V18H49.8067V8.66C49.8067 8.28667 49.8267 7.88333 49.8667 7.45L45.4967 15.66C45.2901 16.0533 44.9734 16.25 44.5467 16.25H44.1667C43.7401 16.25 43.4234 16.0533 43.2167 15.66L38.7967 7.42C38.8167 7.64 38.8334 7.85667 38.8467 8.07C38.8601 8.28333 38.8667 8.48 38.8667 8.66V18H36.4967V3.54H38.5267C38.6467 3.54 38.7501 3.54333 38.8367 3.55C38.9234 3.55667 39.0001 3.57333 39.0667 3.6C39.1401 3.62667 39.2034 3.67 39.2567 3.73C39.3167 3.79 39.3734 3.87 39.4267 3.97L43.7567 12C43.8701 12.2133 43.9734 12.4333 44.0667 12.66C44.1667 12.8867 44.2634 13.12 44.3567 13.36C44.4501 13.1133 44.5467 12.8767 44.6467 12.65C44.7467 12.4167 44.8534 12.1933 44.9667 11.98L49.2367 3.97C49.2901 3.87 49.3467 3.79 49.4067 3.73C49.4667 3.67 49.5301 3.62667 49.5967 3.6C49.6701 3.57333 49.7501 3.55667 49.8367 3.55C49.9234 3.54333 50.0267 3.54 50.1467 3.54H52.1767ZM61.063 17.27C61.743 17.27 62.3496 17.1533 62.883 16.92C63.423 16.68 63.8796 16.35 64.253 15.93C64.6263 15.51 64.9096 15.0167 65.103 14.45C65.303 13.8767 65.403 13.26 65.403 12.6V3.85H66.423V12.6C66.423 13.38 66.2996 14.11 66.053 14.79C65.8063 15.4633 65.4496 16.0533 64.983 16.56C64.523 17.06 63.9596 17.4533 63.293 17.74C62.633 18.0267 61.8896 18.17 61.063 18.17C60.2363 18.17 59.4896 18.0267 58.823 17.74C58.163 17.4533 57.5996 17.06 57.133 16.56C56.673 16.0533 56.3196 15.4633 56.073 14.79C55.8263 14.11 55.703 13.38 55.703 12.6V3.85H56.733V12.59C56.733 13.25 56.8296 13.8667 57.023 14.44C57.223 15.0067 57.5063 15.5 57.873 15.92C58.2463 16.34 58.6996 16.67 59.233 16.91C59.773 17.15 60.383 17.27 61.063 17.27ZM71.4442 18H70.4142V3.85H71.4442V18Z",fill:"currentColor"})]})},di=function(){return _r("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:_r("path",{d:"M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.07-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.74 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.07.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .44-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.47-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z"})})},hi=function(){return _r("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:_r("path",{d:"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"})})},pi=function(){return _r("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:_r("path",{d:"M12 5V2L8 6l4 4V7c3.31 0 6 2.69 6 6 0 2.97-2.17 5.43-5 5.91v2.02c3.95-.49 7-3.85 7-7.93 0-4.42-3.58-8-8-8zm-6 8c0-1.65.67-3.15 1.76-4.24L6.34 7.34C4.9 8.79 4 10.79 4 13c0 4.08 3.05 7.44 7 7.93v-2.02c-2.83-.48-5-2.94-5-5.91z"})})},vi=function(){return _r("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:_r("path",{d:"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z"})})},mi=function(){return _r("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:_r("path",{d:"M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z"})})},yi=function(){return _r("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:_r("path",{d:"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z"})})},gi=function(){return _r("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:_r("path",{d:"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z"})})},_i=function(){return _r("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:_r("path",{d:"M12 6v3l4-4-4-4v3c-4.42 0-8 3.58-8 8 0 1.57.46 3.03 1.24 4.26L6.7 14.8c-.45-.83-.7-1.79-.7-2.8 0-3.31 2.69-6 6-6zm6.76 1.74L17.3 9.2c.44.84.7 1.79.7 2.8 0 3.31-2.69 6-6 6v-3l-4 4 4 4v-3c4.42 0 8-3.58 8-8 0-1.57-.46-3.03-1.24-4.26z"})})},bi=function(){return _r("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:_r("path",{d:"M7.41 8.59 12 13.17l4.59-4.58L18 10l-6 6-6-6 1.41-1.41z"})})},Di=function(){return _r("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:_r("path",{d:"m12 8-6 6 1.41 1.41L12 10.83l4.59 4.58L18 14z"})})},wi=function(){return _r("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:_r("path",{d:"m7 10 5 5 5-5z"})})},xi=function(){return _r("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:[_r("path",{d:"M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z"}),_r("path",{d:"M12.5 7H11v6l5.25 3.15.75-1.23-4.5-2.67z"})]})},ki=function(){return _r("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:_r("path",{d:"M20 3h-1V1h-2v2H7V1H5v2H4c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 18H4V8h16v13z"})})},Ci=function(){return _r("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:_r("path",{d:"m22 5.72-4.6-3.86-1.29 1.53 4.6 3.86L22 5.72zM7.88 3.39 6.6 1.86 2 5.71l1.29 1.53 4.59-3.85zM12.5 8H11v6l4.75 2.85.75-1.23-4-2.37V8zM12 4c-4.97 0-9 4.03-9 9s4.02 9 9 9c4.97 0 9-4.03 9-9s-4.03-9-9-9zm0 16c-3.87 0-7-3.13-7-7s3.13-7 7-7 7 3.13 7 7-3.13 7-7 7z"})})},Ei=function(){return _r("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:_r("path",{d:"M20 5H4c-1.1 0-1.99.9-1.99 2L2 17c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm-9 3h2v2h-2V8zm0 3h2v2h-2v-2zM8 8h2v2H8V8zm0 3h2v2H8v-2zm-1 2H5v-2h2v2zm0-3H5V8h2v2zm9 7H8v-2h8v2zm0-4h-2v-2h2v2zm0-3h-2V8h2v2zm3 3h-2v-2h2v2zm0-3h-2V8h2v2z"})})},Si=function(){return _r("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:_r("path",{d:"M8 5v14l11-7z"})})},Ai=function(){return _r("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:_r("path",{d:"m10 16.5 6-4.5-6-4.5v9zM12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"})})},Fi=function(){return _r("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:_r("path",{d:"m3.5 18.49 6-6.01 4 4L22 6.92l-1.41-1.41-7.09 7.97-4-4L2 16.99z"})})},Ni=function(){return _r("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:_r("path",{d:"M10 10.02h5V21h-5zM17 21h3c1.1 0 2-.9 2-2v-9h-5v11zm3-18H5c-1.1 0-2 .9-2 2v3h19V5c0-1.1-.9-2-2-2zM3 19c0 1.1.9 2 2 2h3V10H3v9z"})})},Oi=function(){return _r("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:_r("path",{d:"M9.4 16.6 4.8 12l4.6-4.6L8 6l-6 6 6 6 1.4-1.4zm5.2 0 4.6-4.6-4.6-4.6L16 6l6 6-6 6-1.4-1.4z"})})},Ti=function(){return _r("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:_r("path",{d:"M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z"})})},Mi=function(){return _r("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:_r("path",{d:"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"})})},Bi=function(){return _r("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:_r("path",{d:"M8.9999 14.7854L18.8928 4.8925C19.0803 4.70497 19.3347 4.59961 19.5999 4.59961C19.8651 4.59961 20.1195 4.70497 20.307 4.8925L21.707 6.2925C22.0975 6.68303 22.0975 7.31619 21.707 7.70672L9.70701 19.7067C9.31648 20.0972 8.68332 20.0972 8.2928 19.7067L2.6928 14.1067C2.50526 13.9192 2.3999 13.6648 2.3999 13.3996C2.3999 13.1344 2.50526 12.88 2.6928 12.6925L4.0928 11.2925C4.48332 10.902 5.11648 10.902 5.50701 11.2925L8.9999 14.7854Z"})})},Li=function(){return _r("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:_r("path",{d:"M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5zM12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z"})})},Pi=function(){return _r("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:_r("path",{d:"M12 7c2.76 0 5 2.24 5 5 0 .65-.13 1.26-.36 1.83l2.92 2.92c1.51-1.26 2.7-2.89 3.43-4.75-1.73-4.39-6-7.5-11-7.5-1.4 0-2.74.25-3.98.7l2.16 2.16C10.74 7.13 11.35 7 12 7zM2 4.27l2.28 2.28.46.46C3.08 8.3 1.78 10.02 1 12c1.73 4.39 6 7.5 11 7.5 1.55 0 3.03-.3 4.38-.84l.42.42L19.73 22 21 20.73 3.27 3 2 4.27zM7.53 9.8l1.55 1.55c-.05.21-.08.43-.08.65 0 1.66 1.34 3 3 3 .22 0 .44-.03.65-.08l1.55 1.55c-.67.33-1.41.53-2.2.53-2.76 0-5-2.24-5-5 0-.79.2-1.53.53-2.2zm4.31-.78 3.15 3.15.02-.16c0-1.66-1.34-3-3-3l-.17.01z"})})},Ii=function(){return _r("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:_r("path",{d:"M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z"})})},zi=function(){return _r("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:_r("path",{d:"M20 9H4v2h16V9zM4 15h16v-2H4v2z"})})},$i=n(123),Ri=n.n($i),ji=function(e){return getComputedStyle(document.documentElement).getPropertyValue("--".concat(e))},Ui=function(e,t){document.documentElement.style.setProperty("--".concat(e),t)},Hi=function(e){var t=e.activeItem,n=e.items,r=e.color,i=void 0===r?ji("color-primary"):r,o=e.onChange,a=e.indicatorPlacement,u=void 0===a?"bottom":a,l=re(null),c=St(X({left:0,width:0,bottom:0}),2),s=c[0],f=c[1];return te((function(){if(l.current){var e=l.current,t=e.offsetLeft,n=e.offsetWidth,r=e.offsetHeight;f({left:t,width:n,bottom:"top"===u?r-2:0})}}),[t,l,n]),_r("div",{className:"vm-tabs",children:[n.map((function(e){return _r("div",{className:Ri()(er({"vm-tabs-item":!0,"vm-tabs-item_active":t===e.value},e.className||"",e.className)),ref:t===e.value?l:void 0,style:{color:i},onClick:(n=e.value,function(){o(n)}),children:[e.icon&&_r("div",{className:Ri()({"vm-tabs-item__icon":!0,"vm-tabs-item__icon_single":!e.label}),children:e.icon}),e.label]},e.value);var n})),_r("div",{className:"vm-tabs__indicator",style:ar(ar({},s),{},{borderColor:i})})]})},Yi=[{value:"chart",icon:_r(Fi,{}),label:"Graph",prometheusCode:0},{value:"code",icon:_r(Oi,{}),label:"JSON",prometheusCode:3},{value:"table",icon:_r(Ni,{}),label:"Table",prometheusCode:1}],Vi=function(){var e=Ki().displayType,t=Xi();return _r(Hi,{activeItem:e,items:Yi,onChange:function(n){var r;t({type:"SET_DISPLAY_TYPE",payload:null!==(r=n)&&void 0!==r?r:e})}})},qi=vr("g0.tab",0),Wi=Yi.find((function(e){return e.prometheusCode===+qi||e.value===qi})),Qi=Vr("SERIES_LIMITS"),Gi={displayType:(null===Wi||void 0===Wi?void 0:Wi.value)||"chart",nocache:!1,isTracingEnabled:!1,seriesLimits:Qi?JSON.parse(Vr("SERIES_LIMITS")):hr,tableCompact:Vr("TABLE_COMPACT")||!1};function Ji(e,t){switch(t.type){case"SET_DISPLAY_TYPE":return ar(ar({},e),{},{displayType:t.payload});case"SET_SERIES_LIMITS":return Yr("SERIES_LIMITS",JSON.stringify(t.payload)),ar(ar({},e),{},{seriesLimits:t.payload});case"TOGGLE_QUERY_TRACING":return ar(ar({},e),{},{isTracingEnabled:!e.isTracingEnabled});case"TOGGLE_NO_CACHE":return ar(ar({},e),{},{nocache:!e.nocache});case"TOGGLE_TABLE_COMPACT":return Yr("TABLE_COMPACT",!e.tableCompact),ar(ar({},e),{},{tableCompact:!e.tableCompact});default:throw new Error}}var Zi=$({}),Ki=function(){return ue(Zi).state},Xi=function(){return ue(Zi).dispatch},eo={customStep:parseFloat(vr("g0.step_input","0")),yaxis:{limits:{enable:!1,range:{1:[0,0]}}}};function to(e,t){switch(t.type){case"TOGGLE_ENABLE_YAXIS_LIMITS":return ar(ar({},e),{},{yaxis:ar(ar({},e.yaxis),{},{limits:ar(ar({},e.yaxis.limits),{},{enable:!e.yaxis.limits.enable})})});case"SET_CUSTOM_STEP":return ar(ar({},e),{},{customStep:t.payload});case"SET_YAXIS_LIMITS":return ar(ar({},e),{},{yaxis:ar(ar({},e.yaxis),{},{limits:ar(ar({},e.yaxis.limits),{},{range:t.payload})})});default:throw new Error}}var no=$({}),ro=function(){return ue(no).dispatch},io={runQuery:0,topN:vr("topN",10),date:vr("date",gt()().tz().format(kr)),focusLabel:vr("focusLabel",""),match:vr("match",""),extraLabel:vr("extra_label","")};function oo(e,t){switch(t.type){case"SET_TOP_N":return ar(ar({},e),{},{topN:t.payload});case"SET_DATE":return ar(ar({},e),{},{date:t.payload});case"SET_MATCH":return ar(ar({},e),{},{match:t.payload});case"SET_EXTRA_LABEL":return ar(ar({},e),{},{extraLabel:t.payload});case"SET_FOCUS_LABEL":return ar(ar({},e),{},{focusLabel:t.payload});case"RUN_QUERY":return ar(ar({},e),{},{runQuery:e.runQuery+1});default:throw new Error}}var ao=$({}),uo=function(){return ue(ao).state},lo=function(){return ue(ao).dispatch},co={topN:vr("topN",null),maxLifetime:vr("maxLifetime",""),runQuery:0};function so(e,t){switch(t.type){case"SET_TOP_N":return ar(ar({},e),{},{topN:t.payload});case"SET_MAX_LIFE_TIME":return ar(ar({},e),{},{maxLifetime:t.payload});case"SET_RUN_QUERY":return ar(ar({},e),{},{runQuery:e.runQuery+1});default:throw new Error}}var fo,ho=$({}),po=function(){return ue(ho).state},vo={success:_r(gi,{}),error:_r(yi,{}),warning:_r(mi,{}),info:_r(vi,{})},mo=function(e){var t=e.variant,n=e.children;return _r("div",{className:Ri()(er({"vm-alert":!0},"vm-alert_".concat(t),t)),children:[_r("div",{className:"vm-alert__icon",children:vo[t||"info"]}),_r("div",{className:"vm-alert__content",children:n})]})},yo=$({showInfoMessage:function(){}}),go=function(){return ue(yo)},_o=function(){for(var e=arguments.length,t=new Array(e),n=0;nd,v=r.top-20<0,m=r.left+g.width+20>f,y=r.left-20<0;return h&&(r.top=t.top-g.height-u),v&&(r.top=t.height+t.top+u),m&&(r.left=t.right-g.width-l),y&&(r.left=t.left+l),r}),[n,i,p,t]);d&&Do(b,(function(){return v(!1)}),n);var x=Ri()(er({"vm-popper":!0,"vm-popper_open":p},"vm-popper_open_".concat(l),l));return _r(m,{children:p&&mt.createPortal(_r("div",{className:x,ref:b,style:w,children:t}),document.body)})},xo=function(e){var t=e.children,n=e.title,r=e.open,i=e.placement,o=void 0===i?"bottom-center":i,a=e.offset,u=void 0===a?{top:6,left:0}:a,l=St(X(!1),2),c=l[0],s=l[1],f=St(X({width:0,height:0}),2),d=f[0],h=f[1],p=re(null),v=re(null),y=function(){return s(!1)};te((function(){return window.addEventListener("scroll",y),function(){window.removeEventListener("scroll",y)}}),[]),te((function(){v.current&&c&&h({width:v.current.clientWidth,height:v.current.clientHeight})}),[c]);var g=oe((function(){var e,t=null===p||void 0===p||null===(e=p.current)||void 0===e?void 0:e.base;if(!t||!c)return{};var n=t.getBoundingClientRect(),r={top:0,left:0},i="bottom-right"===o||"top-right"===o,a="bottom-left"===o||"top-left"===o,l=null===o||void 0===o?void 0:o.includes("top"),s=(null===u||void 0===u?void 0:u.top)||0,f=(null===u||void 0===u?void 0:u.left)||0;r.left=n.left-(d.width-n.width)/2+f,r.top=n.height+n.top+s,i&&(r.left=n.right-d.width),a&&(r.left=n.left+f),l&&(r.top=n.top-d.height-s);var h=window,v=h.innerWidth,m=h.innerHeight,y=r.top+d.height+20>m,g=r.top-20<0,_=r.left+d.width+20>v,b=r.left-20<0;return y&&(r.top=n.top-d.height-s),g&&(r.top=n.height+n.top+s),_&&(r.left=n.right-d.width-f),b&&(r.left=n.left+f),r.top<0&&(r.top=20),r.left<0&&(r.left=20),r}),[p,o,c,d]),_=function(){"boolean"!==typeof r&&s(!0)},b=function(){s(!1)};return te((function(){"boolean"===typeof r&&s(r)}),[r]),te((function(){var e,t=null===p||void 0===p||null===(e=p.current)||void 0===e?void 0:e.base;if(t)return t.addEventListener("mouseenter",_),t.addEventListener("mouseleave",b),function(){t.removeEventListener("mouseenter",_),t.removeEventListener("mouseleave",b)}}),[p]),_r(m,{children:[_r(m,{ref:p,children:t}),c&&mt.createPortal(_r("div",{className:"vm-tooltip",ref:v,style:g,children:n}),document.body)]})},ko=[{seconds:0,title:"Off"},{seconds:1,title:"1s"},{seconds:2,title:"2s"},{seconds:5,title:"5s"},{seconds:10,title:"10s"},{seconds:30,title:"30s"},{seconds:60,title:"1m"},{seconds:300,title:"5m"},{seconds:900,title:"15m"},{seconds:1800,title:"30m"},{seconds:3600,title:"1h"},{seconds:7200,title:"2h"}],Co=function(){var e=ii(),t=lr(),n=St(X(!1),2),r=n[0],i=n[1],o=St(X(ko[0]),2),a=o[0],u=o[1];te((function(){var t,n=a.seconds;return r?t=setInterval((function(){e({type:"RUN_QUERY"})}),1e3*n):u(ko[0]),function(){t&&clearInterval(t)}}),[a,r]);var l=St(X(!1),2),c=l[0],s=l[1],f=re(null),d=function(e){return function(){!function(e){(r&&!e.seconds||!r&&e.seconds)&&i((function(e){return!e})),u(e),s(!1)}(e)}};return _r(m,{children:[_r("div",{className:"vm-execution-controls",children:_r("div",{className:Ri()({"vm-execution-controls-buttons":!0,"vm-header-button":!t}),children:[_r(xo,{title:"Refresh dashboard",children:_r(bo,{variant:"contained",color:"primary",onClick:function(){e({type:"RUN_QUERY"})},startIcon:_r(_i,{})})}),_r(xo,{title:"Auto-refresh control",children:_r("div",{ref:f,children:_r(bo,{variant:"contained",color:"primary",fullWidth:!0,endIcon:_r("div",{className:Ri()({"vm-execution-controls-buttons__arrow":!0,"vm-execution-controls-buttons__arrow_open":c}),children:_r(bi,{})}),onClick:function(){s((function(e){return!e}))},children:a.title})})})]})}),_r(wo,{open:c,placement:"bottom-right",onClose:function(){s(!1)},buttonRef:f,children:_r("div",{className:"vm-execution-controls-list",children:ko.map((function(e){return _r("div",{className:Ri()({"vm-list__item":!0,"vm-list__item_active":e.seconds===a.seconds}),onClick:d(e),children:e.title},e.seconds)}))})})]})},Eo=function(e){var t=e.relativeTime,n=e.setDuration;return _r("div",{className:"vm-time-duration",children:$r.map((function(e){var r,i=e.id,o=e.duration,a=e.until,u=e.title;return _r("div",{className:Ri()({"vm-list__item":!0,"vm-list__item_active":i===t}),onClick:(r={duration:o,until:a(),id:i},function(){n(r)}),children:u||o},i)}))})},So=function(e){var t=St(X({width:0,height:0}),2),n=t[0],r=t[1];return te((function(){var t=new ResizeObserver((function(e){var t=e[0].contentRect,n=t.width,i=t.height;r({width:n,height:i})}));return e&&t.observe(e),function(){e&&t.unobserve(e)}}),[]),n},Ao=function(e){var t=e.viewDate,n=e.displayYears,r=e.onChangeViewDate;return _r("div",{className:"vm-calendar-header",children:[_r("div",{className:"vm-calendar-header-left",onClick:e.toggleDisplayYears,children:[_r("span",{className:"vm-calendar-header-left__date",children:t.format("MMMM YYYY")}),_r("div",{className:"vm-calendar-header-left__select-year",children:_r(wi,{})})]}),!n&&_r("div",{className:"vm-calendar-header-right",children:[_r("div",{className:"vm-calendar-header-right__prev",onClick:function(){r(t.subtract(1,"month"))},children:_r(bi,{})}),_r("div",{className:"vm-calendar-header-right__next",onClick:function(){r(t.add(1,"month"))},children:_r(bi,{})})]})]})},Fo=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],No=function(e){var t=e.viewDate,n=e.selectDate,r=e.onChangeSelectDate,i=gt()().tz().startOf("day"),o=oe((function(){var e=new Array(42).fill(null),n=t.startOf("month"),r=t.endOf("month").diff(n,"day")+1,i=new Array(r).fill(n).map((function(e,t){return e.add(t,"day")})),o=n.day();return e.splice.apply(e,[o,r].concat(At(i))),e}),[t]),a=function(e){return function(){e&&r(e)}};return _r("div",{className:"vm-calendar-body",children:[Fo.map((function(e){return _r("div",{className:"vm-calendar-body-cell vm-calendar-body-cell_weekday",children:e[0]},e)})),o.map((function(e,t){return _r("div",{className:Ri()({"vm-calendar-body-cell":!0,"vm-calendar-body-cell_day":!0,"vm-calendar-body-cell_day_empty":!e,"vm-calendar-body-cell_day_active":(e&&e.toISOString())===n.startOf("day").toISOString(),"vm-calendar-body-cell_day_today":(e&&e.toISOString())===i.toISOString()}),onClick:a(e),children:e&&e.format("D")},e?e.toISOString():t)}))]})},Oo=function(e){var t=e.viewDate,n=e.onChangeViewDate,r=oe((function(){return t.format("YYYY")}),[t]),i=oe((function(){var e=gt()().subtract(103,"year");return new Array(206).fill(e).map((function(e,t){return e.add(t,"year")}))}),[t]);te((function(){var e=document.getElementById("vm-calendar-year-".concat(r));e&&e.scrollIntoView({block:"center"})}),[]);return _r("div",{className:"vm-calendar-years",children:i.map((function(e){return _r("div",{className:Ri()({"vm-calendar-years__year":!0,"vm-calendar-years__year_selected":e.format("YYYY")===r}),id:"vm-calendar-year-".concat(e.format("YYYY")),onClick:(t=e,function(){n(t)}),children:e.format("YYYY")},e.format("YYYY"));var t}))})};!function(e){e[e.hour=0]="hour",e[e.minutes=1]="minutes",e[e.seconds=2]="seconds"}(fo||(fo={}));var To,Mo=function(e){var t=e.selectDate,n=e.onChangeTime,r=e.onClose,i=St(X(fo.hour),2),o=i[0],a=i[1],u=St(X(t.format("HH")),2),l=u[0],c=u[1],s=St(X(t.format("mm")),2),f=s[0],d=s[1],h=St(X(t.format("ss")),2),p=h[0],v=h[1],m=oe((function(){return o===fo.hour?new Array(24).fill("00").map((function(e,t){return{value:t,degrees:t/12*360,offset:0===t||t>12,title:t?"".concat(t):e}})):new Array(60).fill("00").map((function(e,t){return{value:t,degrees:t/60*360,offset:!1,title:t?"".concat(t):e}}))}),[o,l,f,p]),y=oe((function(){switch(o){case fo.hour:return+l/12*360;case fo.minutes:return+f/60*360;case fo.seconds:return+p/60*360}}),[o,l,f,p]),g=re(null),_=re(null),b=re(null),D=function(e){return function(t){!function(e,t){t.target.select(),a(e)}(e,t)}};return te((function(){n("".concat(l,":").concat(f,":").concat(p))}),[l,f,p]),te((function(){c(t.format("HH")),d(t.format("mm")),v(t.format("ss"))}),[t]),te((function(){g.current&&g.current.focus()}),[]),_r("div",{className:"vm-calendar-time-picker",children:[_r("div",{className:"vm-calendar-time-picker-clock",children:[_r("div",{className:Ri()({"vm-calendar-time-picker-clock__arrow":!0,"vm-calendar-time-picker-clock__arrow_offset":o===fo.hour&&("00"===l||+l>12)}),style:{transform:"rotate(".concat(y,"deg)")}}),m.map((function(e){return _r("div",{className:Ri()({"vm-calendar-time-picker-clock__time":!0,"vm-calendar-time-picker-clock__time_offset":e.offset,"vm-calendar-time-picker-clock__time_hide":m.length>24&&e.value%5}),style:{transform:"rotate(".concat(e.degrees,"deg)")},onClick:(t=e.value,function(){var e=String(t);switch(o){case fo.hour:c(e),_.current&&_.current.focus();break;case fo.minutes:d(e),b.current&&b.current.focus();break;case fo.seconds:v(e),r()}}),children:_r("span",{style:{transform:"rotate(-".concat(e.degrees,"deg)")},children:e.title})},e.value);var t}))]}),_r("div",{className:"vm-calendar-time-picker-fields",children:[_r("input",{className:"vm-calendar-time-picker-fields__input",value:l,onChange:function(e){var t=e.target,n=t.value,r=+n>23?"23":n;t.value=r,c(r),n.length>1&&_.current&&_.current.focus()},onFocus:D(fo.hour),ref:g,type:"number",min:0,max:24}),_r("span",{children:":"}),_r("input",{className:"vm-calendar-time-picker-fields__input",value:f,onChange:function(e){var t=e.target,n=t.value,r=+n>59?"59":n;t.value=r,d(r),n.length>1&&b.current&&b.current.focus()},onFocus:D(fo.minutes),ref:_,type:"number",min:0,max:60}),_r("span",{children:":"}),_r("input",{className:"vm-calendar-time-picker-fields__input",value:p,onChange:function(e){var t=e.target,n=t.value,i=+n>59?"59":n;t.value=i,v(i),n.length>1&&b.current&&r()},onFocus:D(fo.seconds),ref:b,type:"number",min:0,max:60})]})]})},Bo=[{value:"date",icon:_r(ki,{})},{value:"time",icon:_r(xi,{})}],Lo=function(e){var t=e.date,n=e.timepicker,r=void 0!==n&&n,i=e.format,o=void 0===i?Cr:i,a=e.onChange,u=e.onClose,l=St(X(!1),2),c=l[0],s=l[1],f=St(X(gt().tz(t)),2),d=f[0],h=f[1],p=St(X(gt().tz(t)),2),v=p[0],y=p[1],g=St(X(Bo[0].value),2),_=g[0],b=g[1],D=function(e){h(e),s(!1)};return te((function(){v.format()!==gt().tz(t).format()&&a(v.format(o))}),[v]),_r("div",{className:"vm-calendar",children:["date"===_&&_r(Ao,{viewDate:d,onChangeViewDate:D,toggleDisplayYears:function(){s((function(e){return!e}))},displayYears:c}),"date"===_&&_r(m,{children:[!c&&_r(No,{viewDate:d,selectDate:v,onChangeSelectDate:function(e){y(e),r&&b("time")}}),c&&_r(Oo,{viewDate:d,onChangeViewDate:D})]}),"time"===_&&_r(Mo,{selectDate:v,onChangeTime:function(e){var t=St(e.split(":"),3),n=t[0],r=t[1],i=t[2];y((function(e){return e.set("hour",+n).set("minute",+r).set("second",+i)}))},onClose:function(){u&&u()}}),r&&_r("div",{className:"vm-calendar__tabs",children:_r(Hi,{activeItem:_,items:Bo,onChange:function(e){b(e)},indicatorPlacement:"top"})})]})},Po=Ce((function(e,t){var n=e.date,r=e.targetRef,i=e.format,o=void 0===i?Cr:i,a=e.timepicker,u=e.onChange,l=St(X(!1),2),c=l[0],s=l[1],f=oe((function(){return n?gt().tz(n):gt()().tz()}),[n]),d=function(){s((function(e){return!e}))},h=function(){s(!1)},p=function(e){"Escape"!==e.key&&"Enter"!==e.key||h()};return te((function(){var e;return null===(e=r.current)||void 0===e||e.addEventListener("click",d),function(){var e;null===(e=r.current)||void 0===e||e.removeEventListener("click",d)}}),[r]),te((function(){return window.addEventListener("keyup",p),function(){window.removeEventListener("keyup",p)}}),[]),_r(m,{children:_r(wo,{open:c,buttonRef:r,placement:"bottom-right",onClose:h,children:_r("div",{ref:t,children:_r(Lo,{date:f,format:o,timepicker:a,onChange:function(e){a||h(),u(e)},onClose:h})})})})})),Io=Po,zo=function(){var e=re(null),t=So(document.body),n=oe((function(){return t.width>1120}),[t]),r=St(X(),2),i=r[0],o=r[1],a=St(X(),2),u=a[0],l=a[1],c=oe((function(){return gt().tz(u).format(Cr)}),[u]),s=oe((function(){return gt().tz(i).format(Cr)}),[i]),f=ri(),d=f.period,h=d.end,p=d.start,v=f.relativeTime,y=f.timezone,g=f.duration,_=ii(),b=lr(),D=oe((function(){return{region:y,utc:jr(y)}}),[y]);te((function(){o(Pr(zr(h)))}),[y,h]),te((function(){l(Pr(zr(p)))}),[y,p]);var w=function(e){var t=e.duration,n=e.until,r=e.id;_({type:"SET_RELATIVE_TIME",payload:{duration:t,until:n,id:r}}),O(!1)},x=oe((function(){return{start:gt().tz(zr(p)).format(Cr),end:gt().tz(zr(h)).format(Cr)}}),[p,h,y]),k=oe((function(){return v&&"none"!==v?v.replace(/_/g," "):"".concat(x.start," - ").concat(x.end)}),[v,x]),C=re(null),E=re(null),S=re(null),A=re(null),F=St(X(!1),2),N=F[0],O=F[1],T=re(null),M=function(){O(!1)};return te((function(){var e=Rr({relativeTimeId:v,defaultDuration:g,defaultEndInput:zr(h)});w({id:e.relativeTimeId,duration:e.duration,until:e.endInput})}),[y]),Do(e,(function(e){var t,n,r=e.target,i=(null===C||void 0===C?void 0:C.current)&&C.current.contains(r),o=(null===E||void 0===E?void 0:E.current)&&E.current.contains(r),a=(null===S||void 0===S?void 0:S.current)&&(null===S||void 0===S||null===(t=S.current)||void 0===t?void 0:t.contains(r)),u=(null===A||void 0===A?void 0:A.current)&&(null===A||void 0===A||null===(n=A.current)||void 0===n?void 0:n.contains(r));i||o||a||u||M()})),_r(m,{children:[_r("div",{ref:T,children:_r(xo,{title:"Time range controls",children:_r(bo,{className:b?"":"vm-header-button",variant:"contained",color:"primary",startIcon:_r(xi,{}),onClick:function(){O((function(e){return!e}))},children:n&&_r("span",{children:k})})})}),_r(wo,{open:N,buttonRef:T,placement:"bottom-right",onClose:M,clickOutside:!1,children:_r("div",{className:"vm-time-selector",ref:e,children:[_r("div",{className:"vm-time-selector-left",children:[_r("div",{className:"vm-time-selector-left-inputs",children:[_r("div",{className:"vm-time-selector-left-inputs__date",ref:C,children:[_r("label",{children:"From:"}),_r("span",{children:c}),_r(ki,{}),_r(Io,{ref:S,date:u||"",onChange:function(e){return l(e)},targetRef:C,timepicker:!0})]}),_r("div",{className:"vm-time-selector-left-inputs__date",ref:E,children:[_r("label",{children:"To:"}),_r("span",{children:s}),_r(ki,{}),_r(Io,{ref:A,date:i||"",onChange:function(e){return o(e)},targetRef:E,timepicker:!0})]})]}),_r("div",{className:"vm-time-selector-left-timezone",children:[_r("div",{className:"vm-time-selector-left-timezone__title",children:D.region}),_r("div",{className:"vm-time-selector-left-timezone__utc",children:D.utc})]}),_r(bo,{variant:"text",startIcon:_r(Ci,{}),onClick:function(){return _({type:"RUN_QUERY_TO_NOW"})},children:"switch to now"}),_r("div",{className:"vm-time-selector-left__controls",children:[_r(bo,{color:"error",variant:"outlined",onClick:function(){o(Pr(zr(h))),l(Pr(zr(p))),O(!1)},children:"Cancel"}),_r(bo,{color:"primary",onClick:function(){return u&&i&&_({type:"SET_PERIOD",payload:{from:gt()(u).toDate(),to:gt()(i).toDate()}}),void O(!1)},children:"Apply"})]})]}),_r(Eo,{relativeTime:v||"",setDuration:w})]})})]})};!function(e){e.emptyServer="Please enter Server URL",e.validServer="Please provide a valid Server URL",e.validQuery="Please enter a valid Query and execute it",e.traceNotFound="Not found the tracing information",e.emptyTitle="Please enter title",e.positiveNumber="Please enter positive number"}(To||(To={}));var $o=function(e){var t=e.label,n=e.value,r=e.type,i=void 0===r?"text":r,o=e.error,a=void 0===o?"":o,u=e.endIcon,l=e.startIcon,c=e.disabled,s=void 0!==c&&c,f=e.autofocus,d=void 0!==f&&f,h=e.helperText,p=e.onChange,v=e.onEnter,m=e.onKeyDown,y=re(null),g=re(null),_=oe((function(){return"textarea"===i?g:y}),[i]),b=Ri()({"vm-text-field__input":!0,"vm-text-field__input_error":a,"vm-text-field__input_icon-start":l,"vm-text-field__input_disabled":s,"vm-text-field__input_textarea":"textarea"===i}),D=function(e){m&&m(e),"Enter"!==e.key||e.shiftKey||(e.preventDefault(),v&&v())},w=function(e){s||p&&p(e.target.value)};return te((function(){var e;d&&(null===_||void 0===_||null===(e=_.current)||void 0===e?void 0:e.focus)&&_.current.focus()}),[_,d]),_r("label",{className:Ri()({"vm-text-field":!0,"vm-text-field_textarea":"textarea"===i}),"data-replicated-value":n,children:[l&&_r("div",{className:"vm-text-field__icon-start",children:l}),u&&_r("div",{className:"vm-text-field__icon-end",children:u}),"textarea"===i?_r("textarea",{className:b,disabled:s,ref:g,value:n,onInput:w,onKeyDown:D,rows:1}):_r("input",{className:b,disabled:s,ref:y,value:n,onInput:w,onKeyDown:D,type:i}),t&&_r("span",{className:"vm-text-field__label",children:t}),_r("span",{className:"vm-text-field__error","data-show":!!a,children:a}),h&&!a&&_r("span",{className:"vm-text-field__helper-text",children:h})]})},Ro=function(e){var t;try{t=new URL(e)}catch(g){return!1}return"http:"===t.protocol||"https:"===t.protocol},jo=function(e){var t=e.serverUrl,n=e.onChange,r=e.onEnter,i=St(X(""),2),o=i[0],a=i[1];return _r("div",{children:[_r("div",{className:"vm-server-configurator__title",children:"Server URL"}),_r($o,{autofocus:!0,value:t,error:o,onChange:function(e){var t=e||"";n(t),a(""),t||a(To.emptyServer),Ro(t)||a(To.validServer)},onEnter:r})]})},Uo=function(e){var t=e.title,n=e.children,r=e.onClose,i=function(e){"Escape"===e.key&&r()};return te((function(){return window.addEventListener("keyup",i),function(){window.removeEventListener("keyup",i)}}),[]),mt.createPortal(_r("div",{className:"vm-modal",onMouseDown:r,children:_r("div",{className:"vm-modal-content",children:[_r("div",{className:"vm-modal-content-header",children:[t&&_r("div",{className:"vm-modal-content-header__title",children:t}),_r("div",{className:"vm-modal-header__close",children:_r(bo,{variant:"text",size:"small",onClick:r,children:_r(hi,{})})})]}),_r("div",{className:"vm-modal-content-body",onMouseDown:function(e){e.stopPropagation()},children:n})]})}),document.body)},Ho=[{label:"Graph",type:"chart"},{label:"JSON",type:"code"},{label:"Table",type:"table"}],Yo=function(e){var t=e.limits,n=e.onChange,r=e.onEnter,i=St(X({table:"",chart:"",code:""}),2),o=i[0],a=i[1],u=function(e){return function(r){!function(e,r){var i=e||"";a((function(e){return ar(ar({},e),{},er({},r,+i<0?To.positiveNumber:""))})),n(ar(ar({},t),{},er({},r,i||1/0)))}(r,e)}};return _r("div",{className:"vm-limits-configurator",children:[_r("div",{className:"vm-server-configurator__title",children:["Series limits by tabs",_r(xo,{title:"To disable limits set to 0",children:_r(bo,{variant:"text",color:"primary",size:"small",startIcon:_r(vi,{})})}),_r("div",{className:"vm-limits-configurator-title__reset",children:_r(bo,{variant:"text",color:"primary",size:"small",startIcon:_r(pi,{}),onClick:function(){n(hr)},children:"Reset"})})]}),_r("div",{className:"vm-limits-configurator__inputs",children:Ho.map((function(e){return _r($o,{label:e.label,value:t[e.type],error:o[e.type],onChange:u(e.type),onEnter:r,type:"number"},e.type)}))})]})},Vo=function(e){var t=e.defaultExpanded,n=void 0!==t&&t,r=e.onChange,i=e.title,o=e.children,a=St(X(n),2),u=a[0],l=a[1];return te((function(){r&&r(u)}),[u]),_r(m,{children:[_r("header",{className:"vm-accordion-header ".concat(u&&"vm-accordion-header_open"),onClick:function(){l((function(e){return!e}))},children:[i,_r("div",{className:"vm-accordion-header__arrow ".concat(u&&"vm-accordion-header__arrow_open"),children:_r(bi,{})})]}),u&&_r("section",{className:"vm-accordion-section",children:o},"content")]})},qo=function(e){var t=e.timezoneState,n=e.onChange,r=Ur(),i=St(X(!1),2),o=i[0],a=i[1],u=St(X(""),2),l=u[0],s=u[1],f=re(null),d=oe((function(){if(!l)return r;try{return Ur(l)}catch(c){return{}}}),[l,r]),h=oe((function(){return Object.keys(d)}),[d]),p=oe((function(){return{region:gt().tz.guess(),utc:jr(gt().tz.guess())}}),[]),v=oe((function(){return{region:t,utc:jr(t)}}),[t]),m=function(){a(!1)},y=function(e){return function(){!function(e){n(e.region),s(""),m()}(e)}};return _r("div",{className:"vm-timezones",children:[_r("div",{className:"vm-server-configurator__title",children:"Time zone"}),_r("div",{className:"vm-timezones-item vm-timezones-item_selected",onClick:function(){a((function(e){return!e}))},ref:f,children:[_r("div",{className:"vm-timezones-item__title",children:v.region}),_r("div",{className:"vm-timezones-item__utc",children:v.utc}),_r("div",{className:Ri()({"vm-timezones-item__icon":!0,"vm-timezones-item__icon_open":o}),children:_r(wi,{})})]}),_r(wo,{open:o,buttonRef:f,placement:"bottom-left",onClose:m,children:_r("div",{className:"vm-timezones-list",children:[_r("div",{className:"vm-timezones-list-header",children:[_r("div",{className:"vm-timezones-list-header__search",children:_r($o,{autofocus:!0,label:"Search",value:l,onChange:function(e){s(e)}})}),_r("div",{className:"vm-timezones-item vm-timezones-list-group-options__item",onClick:y(p),children:[_r("div",{className:"vm-timezones-item__title",children:["Browser Time (",p.region,")"]}),_r("div",{className:"vm-timezones-item__utc",children:p.utc})]})]}),h.map((function(e){return _r("div",{className:"vm-timezones-list-group",children:_r(Vo,{defaultExpanded:!0,title:_r("div",{className:"vm-timezones-list-group__title",children:e}),children:_r("div",{className:"vm-timezones-list-group-options",children:d[e]&&d[e].map((function(e){return _r("div",{className:"vm-timezones-item vm-timezones-list-group-options__item",onClick:y(e),children:[_r("div",{className:"vm-timezones-item__title",children:e.region}),_r("div",{className:"vm-timezones-item__utc",children:e.utc})]},e.search)}))})})},e)}))]})})]})},Wo="Settings",Qo=function(){var e=lr(),t=Dr().serverUrl,n=ri().timezone,r=Ki().seriesLimits,i=wr(),o=ii(),a=Xi(),u=St(X(t),2),l=u[0],c=u[1],s=St(X(r),2),f=s[0],d=s[1],h=St(X(n),2),p=h[0],v=h[1],y=St(X(!1),2),g=y[0],_=y[1],b=function(){return _(!1)},D=function(){i({type:"SET_SERVER",payload:l}),o({type:"SET_TIMEZONE",payload:p}),a({type:"SET_SERIES_LIMITS",payload:f}),b()};return _r(m,{children:[_r(xo,{title:Wo,children:_r(bo,{className:Ri()({"vm-header-button":!e}),variant:"contained",color:"primary",startIcon:_r(di,{}),onClick:function(){return _(!0)}})}),g&&_r(Uo,{title:Wo,onClose:b,children:_r("div",{className:"vm-server-configurator",children:[!e&&_r("div",{className:"vm-server-configurator__input",children:_r(jo,{serverUrl:l,onChange:c,onEnter:D})}),_r("div",{className:"vm-server-configurator__input",children:_r(Yo,{limits:f,onChange:d,onEnter:D})}),_r("div",{className:"vm-server-configurator__input",children:_r(qo,{timezoneState:p,onChange:v})}),_r("div",{className:"vm-server-configurator__footer",children:[_r(bo,{variant:"outlined",color:"error",onClick:b,children:"Cancel"}),_r(bo,{variant:"contained",onClick:D,children:"apply"})]})]})})]})},Go={windows:"Windows",mac:"Mac OS",linux:"Linux"},Jo=(Object.values(Go).find((function(e){return navigator.userAgent.indexOf(e)>=0}))||"unknown")===Go.mac?"Cmd":"Ctrl",Zo=[{title:"Query",list:[{keys:["Enter"],description:"Run"},{keys:["Shift","Enter"],description:"Multi-line queries"},{keys:[Jo,"Arrow Up"],description:"Previous command from the Query history"},{keys:[Jo,"Arrow Down"],description:"Next command from the Query history"},{keys:[Jo,"Click by 'Eye'"],description:"Toggle multiple queries"}]},{title:"Graph",list:[{keys:[Jo,"Scroll Up"],alt:["+"],description:"Zoom in"},{keys:[Jo,"Scroll Down"],alt:["-"],description:"Zoom out"},{keys:[Jo,"Click and Drag"],description:"Move the graph left/right"}]},{title:"Legend",list:[{keys:["Mouse Click"],description:"Select series"},{keys:[Jo,"Mouse Click"],description:"Toggle multiple series"}]}],Ko=function(){var e=St(X(!1),2),t=e[0],n=e[1],r=lr();return _r(m,{children:[_r(xo,{title:"Shortcut keys",placement:"bottom-center",children:_r(bo,{className:r?"":"vm-header-button",variant:"contained",color:"primary",startIcon:_r(Ei,{}),onClick:function(){n(!0)}})}),t&&_r(Uo,{title:"Shortcut keys",onClose:function(){n(!1)},children:_r("div",{className:"vm-shortcuts",children:Zo.map((function(e){return _r("div",{className:"vm-shortcuts-section",children:[_r("h3",{className:"vm-shortcuts-section__title",children:e.title}),_r("div",{className:"vm-shortcuts-section-list",children:e.list.map((function(e){return _r("div",{className:"vm-shortcuts-section-list-item",children:[_r("div",{className:"vm-shortcuts-section-list-item__key",children:[e.keys.map((function(t,n){return _r(m,{children:[_r("code",{children:t},t),n!==e.keys.length-1?"+":""]})})),e.alt&&e.alt.map((function(t,n){return _r(m,{children:["or",_r("code",{children:t},t),n!==e.alt.length-1?"+":""]})}))]}),_r("p",{className:"vm-shortcuts-section-list-item__description",children:e.description})]},e.keys.join("+"))}))})]},e.title)}))})})]})},Xo=function(){var e=lr(),t=re(null),n=uo().date,r=lo(),i=oe((function(){return gt().tz(n).format(kr)}),[n]);return _r("div",{children:[_r("div",{ref:t,children:_r(xo,{title:"Date control",children:_r(bo,{className:e?"":"vm-header-button",variant:"contained",color:"primary",startIcon:_r(ki,{}),children:i})})}),_r(Io,{date:n||"",format:kr,onChange:function(e){r({type:"SET_DATE",payload:e})},targetRef:t})]})},ea=function(){var e=ji("color-primary"),t=lr(),n=ur().headerStyles,r=(n=void 0===n?{}:n).background,i=void 0===r?t?"#FFF":e:r,o=n.color,a=void 0===o?t?e:"#FFF":o,u=Ln(),l=Bn(),c=l.search,s=l.pathname,f=oe((function(){return[{label:"Custom panel",value:ir.home},{label:"Dashboards",value:ir.dashboards,hide:t},{label:"Cardinality",value:ir.cardinality},{label:"Top queries",value:ir.topQueries},{label:"Trace analyzer",value:ir.trace}]}),[t]),d=St(X(s),2),h=d[0],p=d[1],v=oe((function(){return(rr[s]||{}).header||{}}),[s]),m=function(e){u({pathname:e,search:c})};return te((function(){p(s)}),[s]),_r("header",{className:Ri()({"vm-header":!0,"vm-header_app":t}),style:{background:i,color:a},children:[!t&&_r("div",{className:"vm-header-logo",style:{color:a},children:[_r("div",{className:"vm-header-logo__icon",onClick:function(){m(ir.home),pr({}),window.location.reload()},children:_r(fi,{})}),_r("a",{className:"vm-header-logo__issue",target:"_blank",href:"https://github.com/VictoriaMetrics/VictoriaMetrics/issues/new",rel:"noreferrer",children:"create an issue"})]}),_r("div",{className:"vm-header-nav",children:_r(Hi,{activeItem:h,items:f.filter((function(e){return!e.hide})),color:a,onChange:function(e){p(e),u(e)}})}),_r("div",{className:"vm-header__settings",children:[(null===v||void 0===v?void 0:v.timeSelector)&&_r(zo,{}),(null===v||void 0===v?void 0:v.cardinalityDatePicker)&&_r(Xo,{}),(null===v||void 0===v?void 0:v.executionControls)&&_r(Co,{}),_r(Qo,{}),_r(Ko,{})]})]})},ta=function(){var e=lr();return _r("section",{className:"vm-container",children:[_r(ea,{}),_r("div",{className:Ri()({"vm-container-body":!0,"vm-container-body_app":e}),children:_r(Vn,{})})]})};function na(e,t){var n="undefined"!==typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=Et(e))||t&&e&&"number"===typeof e.length){n&&(e=n);var r=0,i=function(){};return{s:i,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,a=!0,u=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return a=e.done,e},e:function(e){u=!0,o=e},f:function(){try{a||null==n.return||n.return()}finally{if(u)throw o}}}}var ra,ia,oa="u-off",aa="u-label",ua="width",la="height",ca="top",sa="bottom",fa="left",da="right",ha="#000",pa="#0000",va="mousemove",ma="mousedown",ya="mouseup",ga="mouseenter",_a="mouseleave",ba="dblclick",Da="change",wa="dppxchange",xa="undefined"!=typeof window,ka=xa?document:null,Ca=xa?window:null,Ea=xa?navigator:null;function Sa(e,t){if(null!=t){var n=e.classList;!n.contains(t)&&n.add(t)}}function Aa(e,t){var n=e.classList;n.contains(t)&&n.remove(t)}function Fa(e,t,n){e.style[t]=n+"px"}function Na(e,t,n,r){var i=ka.createElement(e);return null!=t&&Sa(i,t),null!=n&&n.insertBefore(i,r),i}function Oa(e,t){return Na("div",e,t)}var Ta=new WeakMap;function Ma(e,t,n,r,i){var o="translate("+t+"px,"+n+"px)";o!=Ta.get(e)&&(e.style.transform=o,Ta.set(e,o),t<0||n<0||t>r||n>i?Sa(e,oa):Aa(e,oa))}var Ba=new WeakMap;function La(e,t,n){var r=t+n;r!=Ba.get(e)&&(Ba.set(e,r),e.style.background=t,e.style.borderColor=n)}var Pa=new WeakMap;function Ia(e,t,n,r){var i=t+""+n;i!=Pa.get(e)&&(Pa.set(e,i),e.style.height=n+"px",e.style.width=t+"px",e.style.marginLeft=r?-t/2+"px":0,e.style.marginTop=r?-n/2+"px":0)}var za={passive:!0},$a=ar(ar({},za),{},{capture:!0});function Ra(e,t,n,r){t.addEventListener(e,n,r?$a:za)}function ja(e,t,n,r){t.removeEventListener(e,n,r?$a:za)}function Ua(e,t,n,r){var i;n=n||0;for(var o=(r=r||t.length-1)<=2147483647;r-n>1;)t[i=o?n+r>>1:uu((n+r)/2)]=t&&i<=n;i+=r)if(null!=e[i])return i;return-1}function Ya(e,t,n,r){var i=yu,o=-yu;if(1==r)i=e[t],o=e[n];else if(-1==r)i=e[n],o=e[t];else for(var a=t;a<=n;a++)null!=e[a]&&(i=su(i,e[a]),o=fu(o,e[a]));return[i,o]}function Va(e,t,n){for(var r=yu,i=-yu,o=t;o<=n;o++)e[o]>0&&(r=su(r,e[o]),i=fu(i,e[o]));return[r==yu?1:r,i==-yu?10:i]}xa&&function e(){var t=devicePixelRatio;ra!=t&&(ra=t,ia&&ja(Da,ia,e),ia=matchMedia("(min-resolution: ".concat(ra-.001,"dppx) and (max-resolution: ").concat(ra+.001,"dppx)")),Ra(Da,ia,e),Ca.dispatchEvent(new CustomEvent(wa)))}();var qa=[0,0];function Wa(e,t,n,r){return qa[0]=n<0?Fu(e,-n):e,qa[1]=r<0?Fu(t,-r):t,qa}function Qa(e,t,n,r){var i,o,a,u=hu(e),l=10==n?pu:vu;return e==t&&(-1==u?(e*=n,t/=n):(e/=n,t*=n)),r?(i=uu(l(e)),o=cu(l(t)),e=(a=Wa(du(n,i),du(n,o),i,o))[0],t=a[1]):(i=uu(l(au(e))),o=uu(l(au(t))),e=Au(e,(a=Wa(du(n,i),du(n,o),i,o))[0]),t=Su(t,a[1])),[e,t]}function Ga(e,t,n,r){var i=Qa(e,t,n,r);return 0==e&&(i[0]=0),0==t&&(i[1]=0),i}var Ja={mode:3,pad:.1},Za={pad:0,soft:null,mode:0},Ka={min:Za,max:Za};function Xa(e,t,n,r){return zu(n)?tu(e,t,n):(Za.pad=n,Za.soft=r?0:null,Za.mode=r?3:0,tu(e,t,Ka))}function eu(e,t){return null==e?t:e}function tu(e,t,n){var r=n.min,i=n.max,o=eu(r.pad,0),a=eu(i.pad,0),u=eu(r.hard,-yu),l=eu(i.hard,yu),c=eu(r.soft,yu),s=eu(i.soft,-yu),f=eu(r.mode,0),d=eu(i.mode,0),h=t-e;h<1e-9&&(h=0,0!=e&&0!=t||(h=1e-9,2==f&&c!=yu&&(o=0),2==d&&s!=-yu&&(a=0)));var p=h||au(t)||1e3,v=pu(p),m=du(10,uu(v)),y=Fu(Au(e-p*(0==h?0==e?.1:1:o),m/10),9),g=e>=c&&(1==f||3==f&&y<=c||2==f&&y>=c)?c:yu,_=fu(u,y=g?g:su(g,y)),b=Fu(Su(t+p*(0==h?0==t?.1:1:a),m/10),9),D=t<=s&&(1==d||3==d&&b>=s||2==d&&b<=s)?s:-yu,w=su(l,b>D&&t<=D?D:fu(D,b));return _==w&&0==_&&(w=100),[_,w]}var nu=new Intl.NumberFormat(xa?Ea.language:"en-US"),ru=function(e){return nu.format(e)},iu=Math,ou=iu.PI,au=iu.abs,uu=iu.floor,lu=iu.round,cu=iu.ceil,su=iu.min,fu=iu.max,du=iu.pow,hu=iu.sign,pu=iu.log10,vu=iu.log2,mu=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;return iu.asinh(e/t)},yu=1/0;function gu(e){return 1+(0|pu((e^e>>31)-(e>>31)))}function _u(e,t){return lu(e/t)*t}function bu(e,t,n){return su(fu(e,t),n)}function Du(e){return"function"==typeof e?e:function(){return e}}var wu=function(e){return e},xu=function(e,t){return t},ku=function(e){return null},Cu=function(e){return!0},Eu=function(e,t){return e==t};function Su(e,t){return cu(e/t)*t}function Au(e,t){return uu(e/t)*t}function Fu(e,t){return lu(e*(t=Math.pow(10,t)))/t}var Nu=new Map;function Ou(e){return((""+e).split(".")[1]||"").length}function Tu(e,t,n,r){for(var i=[],o=r.map(Ou),a=t;a=0&&a>=0?0:u)+(a>=o[c]?0:o[c]),d=Fu(s,f);i.push(d),Nu.set(d,f)}return i}var Mu={},Bu=[],Lu=[null,null],Pu=Array.isArray;function Iu(e){return"string"==typeof e}function zu(e){var t=!1;if(null!=e){var n=e.constructor;t=null==n||n==Object}return t}function $u(e){return null!=e&&"object"==typeof e}var Ru=Object.getPrototypeOf(Uint8Array);function ju(e){var t,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:zu;if(Pu(e)){var r=e.find((function(e){return null!=e}));if(Pu(r)||n(r)){t=Array(e.length);for(var i=0;io){for(r=a-1;r>=0&&null==e[r];)e[r--]=null;for(r=a+1;r12?t-12:t},AA:function(e){return e.getHours()>=12?"PM":"AM"},aa:function(e){return e.getHours()>=12?"pm":"am"},a:function(e){return e.getHours()>=12?"p":"a"},mm:function(e){return Zu(e.getMinutes())},m:function(e){return e.getMinutes()},ss:function(e){return Zu(e.getSeconds())},s:function(e){return e.getSeconds()},fff:function(e){return((t=e.getMilliseconds())<10?"00":t<100?"0":"")+t;var t}};function Xu(e,t){t=t||Ju;for(var n,r=[],i=/\{([a-z]+)\}|[^{]+/gi;n=i.exec(e);)r.push("{"==n[0][0]?Ku[n[1]]:n[0]);return function(e){for(var n="",i=0;i=a,v=f>=o&&f=i?i:f,N=_+(uu(c)-uu(y))+Su(y-_,F);h.push(N);for(var O=t(N),T=O.getHours()+O.getMinutes()/n+O.getSeconds()/r,M=f/r,B=d/u.axes[l]._space;!((N=Fu(N+f,1==e?0:3))>s);)if(M>1){var L=uu(Fu(T+M,6))%24,P=t(N).getHours()-L;P>1&&(P=-1),T=(T+M)%24,Fu(((N-=P*r)-h[h.length-1])/f,3)*B>=.7&&h.push(N)}else h.push(N)}return h}}]}var gl=St(yl(1),3),_l=gl[0],bl=gl[1],Dl=gl[2],wl=St(yl(.001),3),xl=wl[0],kl=wl[1],Cl=wl[2];function El(e,t){return e.map((function(e){return e.map((function(n,r){return 0==r||8==r||null==n?n:t(1==r||0==e[8]?n:e[1]+n)}))}))}function Sl(e,t){return function(n,r,i,o,a){var u,l,c,s,f,d,h=t.find((function(e){return a>=e[0]}))||t[t.length-1];return r.map((function(t){var n=e(t),r=n.getFullYear(),i=n.getMonth(),o=n.getDate(),a=n.getHours(),p=n.getMinutes(),v=n.getSeconds(),m=r!=u&&h[2]||i!=l&&h[3]||o!=c&&h[4]||a!=s&&h[5]||p!=f&&h[6]||v!=d&&h[7]||h[1];return u=r,l=i,c=o,s=a,f=p,d=v,m(n)}))}}function Al(e,t,n){return new Date(e,t,n)}function Fl(e,t){return t(e)}Tu(2,-53,53,[1]);function Nl(e,t){return function(n,r){return t(e(r))}}var Ol={show:!0,live:!0,isolate:!1,markers:{show:!0,width:2,stroke:function(e,t){var n=e.series[t];return n.width?n.stroke(e,t):n.points.width?n.points.stroke(e,t):null},fill:function(e,t){return e.series[t].fill(e,t)},dash:"solid"},idx:null,idxs:null,values:[]};var Tl=[0,0];function Ml(e,t,n){return function(e){0==e.button&&n(e)}}function Bl(e,t,n){return n}var Ll={show:!0,x:!0,y:!0,lock:!1,move:function(e,t,n){return Tl[0]=t,Tl[1]=n,Tl},points:{show:function(e,t){var n=e.cursor.points,r=Oa(),i=n.size(e,t);Fa(r,ua,i),Fa(r,la,i);var o=i/-2;Fa(r,"marginLeft",o),Fa(r,"marginTop",o);var a=n.width(e,t,i);return a&&Fa(r,"borderWidth",a),r},size:function(e,t){return tc(e.series[t].points.width,1)},width:0,stroke:function(e,t){var n=e.series[t].points;return n._stroke||n._fill},fill:function(e,t){var n=e.series[t].points;return n._fill||n._stroke}},bind:{mousedown:Ml,mouseup:Ml,click:Ml,dblclick:Ml,mousemove:Bl,mouseleave:Bl,mouseenter:Bl},drag:{setScale:!0,x:!0,y:!1,dist:0,uni:null,_x:!1,_y:!1},focus:{prox:-1},left:-10,top:-10,idx:null,dataIdx:function(e,t,n){return n},idxs:null},Pl={show:!0,stroke:"rgba(0,0,0,0.07)",width:2},Il=Uu({},Pl,{filter:xu}),zl=Uu({},Il,{size:10}),$l=Uu({},Pl,{show:!1}),Rl='12px system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"',jl="bold "+Rl,Ul={show:!0,scale:"x",stroke:ha,space:50,gap:5,size:50,labelGap:0,labelSize:30,labelFont:jl,side:2,grid:Il,ticks:zl,border:$l,font:Rl,rotate:0},Hl={show:!0,scale:"x",auto:!1,sorted:1,min:yu,max:-yu,idxs:[]};function Yl(e,t,n,r,i){return t.map((function(e){return null==e?"":ru(e)}))}function Vl(e,t,n,r,i,o,a){for(var u=[],l=Nu.get(i)||0,c=n=a?n:Fu(Su(n,i),l);c<=r;c=Fu(c+i,l))u.push(Object.is(c,-0)?0:c);return u}function ql(e,t,n,r,i,o,a){var u=[],l=e.scales[e.axes[t].scale].log,c=uu((10==l?pu:vu)(n));i=du(l,c),c<0&&(i=Fu(i,-c));var s=n;do{u.push(s),(s=Fu(s+i,Nu.get(i)))>=i*l&&(i=s)}while(s<=r);return u}function Wl(e,t,n,r,i,o,a){var u=e.scales[e.axes[t].scale].asinh,l=r>u?ql(e,t,fu(u,n),r,i):[u],c=r>=0&&n<=0?[0]:[];return(n<-u?ql(e,t,fu(u,-r),-n,i):[u]).reverse().map((function(e){return-e})).concat(c,l)}var Ql=/./,Gl=/[12357]/,Jl=/[125]/,Zl=/1/;function Kl(e,t,n,r,i){var o=e.axes[n],a=o.scale,u=e.scales[a];if(3==u.distr&&2==u.log)return t;var l=e.valToPos,c=o._space,s=l(10,a),f=l(9,a)-s>=c?Ql:l(7,a)-s>=c?Gl:l(5,a)-s>=c?Jl:Zl;return t.map((function(e){return 4==u.distr&&0==e||f.test(e)?e:null}))}function Xl(e,t){return null==t?"":ru(t)}var ec={show:!0,scale:"y",stroke:ha,space:30,gap:5,size:50,labelGap:0,labelSize:30,labelFont:jl,side:3,grid:Il,ticks:zl,border:$l,font:Rl,rotate:0};function tc(e,t){return Fu((3+2*(e||1))*t,3)}var nc={scale:null,auto:!0,sorted:0,min:yu,max:-yu},rc={show:!0,auto:!0,sorted:0,alpha:1,facets:[Uu({},nc,{scale:"x"}),Uu({},nc,{scale:"y"})]},ic={scale:"y",auto:!0,sorted:0,show:!0,spanGaps:!1,gaps:function(e,t,n,r,i){return i},alpha:1,points:{show:function(e,t){var n=e.series[0],r=n.scale,i=n.idxs,o=e._data[0],a=e.valToPos(o[i[0]],r,!0),u=e.valToPos(o[i[1]],r,!0),l=au(u-a)/(e.series[t].points.space*ra);return i[1]-i[0]<=l},filter:null},values:null,min:yu,max:-yu,idxs:[],path:null,clip:null};function oc(e,t,n,r,i){return n/10}var ac={time:!0,auto:!0,distr:1,log:10,asinh:1,min:null,max:null,dir:1,ori:0},uc=Uu({},ac,{time:!1,ori:1}),lc={};function cc(e,t){var n=lc[e];return n||(n={key:e,plots:[],sub:function(e){n.plots.push(e)},unsub:function(e){n.plots=n.plots.filter((function(t){return t!=e}))},pub:function(e,t,r,i,o,a,u){for(var l=0;l0){a=new Path2D;for(var u=0==t?wc:xc,l=n,c=0;cs[0]){var f=s[0]-l;f>0&&u(a,l,r,f,r+o),l=s[1]}}var d=n+i-l;d>0&&u(a,l,r,d,r+o)}return a}function vc(e,t,n,r,i,o,a){for(var u=[],l=1==i?n:r;l>=n&&l<=r;l+=i){if(null===t[l]){var c=l,s=l;if(1==i)for(;++l<=r&&null===t[l];)s=l;else for(;--l>=n&&null===t[l];)s=l;var f=o(e[c]),d=s==c?f:o(e[s]);f=a<=0?o(e[c-i]):f,(d=a>=0?o(e[s+i]):d)>=f&&u.push([f,d])}}return u}function mc(e){return 0==e?wu:1==e?lu:function(t){return _u(t,e)}}function yc(e){var t=0==e?gc:_c,n=0==e?function(e,t,n,r,i,o){e.arcTo(t,n,r,i,o)}:function(e,t,n,r,i,o){e.arcTo(n,t,i,r,o)},r=0==e?function(e,t,n,r,i){e.rect(t,n,r,i)}:function(e,t,n,r,i){e.rect(n,t,i,r)};return function(e,i,o,a,u){var l=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0;0==l?r(e,i,o,a,u):(l=su(l,a/2,u/2),t(e,i+l,o),n(e,i+a,o,i+a,o+u,l),n(e,i+a,o+u,i,o+u,l),n(e,i,o+u,i,o,l),n(e,i,o,i+a,o,l),e.closePath())}}var gc=function(e,t,n){e.moveTo(t,n)},_c=function(e,t,n){e.moveTo(n,t)},bc=function(e,t,n){e.lineTo(t,n)},Dc=function(e,t,n){e.lineTo(n,t)},wc=yc(0),xc=yc(1),kc=function(e,t,n,r,i,o){e.arc(t,n,r,i,o)},Cc=function(e,t,n,r,i,o){e.arc(n,t,r,i,o)},Ec=function(e,t,n,r,i,o,a){e.bezierCurveTo(t,n,r,i,o,a)},Sc=function(e,t,n,r,i,o,a){e.bezierCurveTo(n,t,i,r,a,o)};function Ac(e){return function(e,t,n,r,i){return sc(e,t,(function(t,o,a,u,l,c,s,f,d,h,p){var v,m,y=t.pxRound,g=t.points;0==u.ori?(v=gc,m=kc):(v=_c,m=Cc);var _=Fu(g.width*ra,3),b=(g.size-g.width)/2*ra,D=Fu(2*b,3),w=new Path2D,x=new Path2D,k=e.bbox,C=k.left,E=k.top,S=k.width,A=k.height;wc(x,C-D,E-D,S+2*D,A+2*D);var F=function(e){if(null!=a[e]){var t=y(c(o[e],u,h,f)),n=y(s(a[e],l,p,d));v(w,t+b,n),m(w,t,n,b,0,2*ou)}};if(i)i.forEach(F);else for(var N=n;N<=r;N++)F(N);return{stroke:_>0?w:null,fill:w,clip:x,flags:3}}))}}function Fc(e){return function(t,n,r,i,o,a){r!=i&&(o!=r&&a!=r&&e(t,n,r),o!=i&&a!=i&&e(t,n,i),e(t,n,a))}}var Nc=Fc(bc),Oc=Fc(Dc);function Tc(e){var t=eu(null===e||void 0===e?void 0:e.alignGaps,0);return function(e,n,r,i){return sc(e,n,(function(o,a,u,l,c,s,f,d,h,p,v){var m,y,g=o.pxRound,_=function(e){return g(s(e,l,p,d))},b=function(e){return g(f(e,c,v,h))};0==l.ori?(m=bc,y=Nc):(m=Dc,y=Oc);for(var D,w,x,k=l.dir*(0==l.ori?1:-1),C={stroke:new Path2D,fill:null,clip:null,band:null,gaps:null,flags:1},E=C.stroke,S=yu,A=-yu,F=_(a[1==k?r:i]),N=Ha(u,r,i,1*k),O=Ha(u,r,i,-1*k),T=_(a[N]),M=_(a[O]),B=1==k?r:i;B>=r&&B<=i;B+=k){var L=_(a[B]);L==F?null!=u[B]&&(w=b(u[B]),S==yu&&(m(E,L,w),D=w),S=su(w,S),A=fu(w,A)):(S!=yu&&(y(E,F,S,A,D,w),x=F),null!=u[B]?(m(E,L,w=b(u[B])),S=A=D=w):(S=yu,A=-yu),F=L)}S!=yu&&S!=A&&x!=F&&y(E,F,S,A,D,w);var P=St(fc(e,n),2),I=P[0],z=P[1];if(null!=o.fill||0!=I){var $=C.fill=new Path2D(E),R=b(o.fillTo(e,n,o.min,o.max,I));m($,M,R),m($,T,R)}if(!o.spanGaps){var j,U=[];(j=U).push.apply(j,At(vc(a,u,r,i,k,_,t))),C.gaps=U=o.gaps(e,n,r,i,U),C.clip=pc(U,l.ori,d,h,p,v)}return 0!=z&&(C.band=2==z?[hc(e,n,r,i,E,-1),hc(e,n,r,i,E,1)]:hc(e,n,r,i,E,z)),C}))}}function Mc(e,t,n,r,i,o){var a=e.length;if(a<2)return null;var u=new Path2D;if(n(u,e[0],t[0]),2==a)r(u,e[1],t[1]);else{for(var l=Array(a),c=Array(a-1),s=Array(a-1),f=Array(a-1),d=0;d0!==c[h]>0?l[h]=0:(l[h]=3*(f[h-1]+f[h])/((2*f[h]+f[h-1])/c[h-1]+(f[h]+2*f[h-1])/c[h]),isFinite(l[h])||(l[h]=0));l[a-1]=c[a-2];for(var p=0;p=i&&o+(l<5?Nu.get(l):0)<=17)return[l,c]}while(++u0?e:t.clamp(r,e,t.min,t.max,t.key)):4==t.distr?mu(e,t.asinh):e)-t._min)/(t._max-t._min)}function a(e,t,n,r){var i=o(e,t);return r+n*(-1==t.dir?1-i:i)}function u(e,t,n,r){var i=o(e,t);return r+n*(-1==t.dir?i:1-i)}function l(e,t,n,r){return 0==t.ori?a(e,t,n,r):u(e,t,n,r)}r.valToPosH=a,r.valToPosV=u;var c=!1;r.status=0;var s=r.root=Oa("uplot");(null!=e.id&&(s.id=e.id),Sa(s,e.class),e.title)&&(Oa("u-title",s).textContent=e.title);var f=Na("canvas"),d=r.ctx=f.getContext("2d"),h=Oa("u-wrap",s),p=r.under=Oa("u-under",h);h.appendChild(f);var v=r.over=Oa("u-over",h),m=+eu((e=ju(e)).pxAlign,1),y=mc(m);(e.plugins||[]).forEach((function(t){t.opts&&(e=t.opts(r,e)||e)}));var g=e.ms||.001,_=r.series=1==i?zc(e.series||[],Hl,ic,!1):function(e,t){return e.map((function(e,n){return 0==n?null:Uu({},t,e)}))}(e.series||[null],rc),b=r.axes=zc(e.axes||[],Ul,ec,!0),D=r.scales={},w=r.bands=e.bands||[];w.forEach((function(e){e.fill=Du(e.fill||null),e.dir=eu(e.dir,-1)}));var x=2==i?_[1].facets[0].scale:_[0].scale,k={axes:function(){for(var e=function(e){var t=b[e];if(!t.show||!t._show)return"continue";var n=t.side,i=n%2,o=void 0,a=void 0,u=t.stroke(r,e),c=0==n||3==n?-1:1;if(t.label){var s=t.labelGap*c,f=lu((t._lpos+s)*ra);Ze(t.labelFont[0],u,"center",2==n?ca:sa),d.save(),1==i?(o=a=0,d.translate(f,lu(de+pe/2)),d.rotate((3==n?-ou:ou)/2)):(o=lu(fe+he/2),a=f),d.fillText(t.label,o,a),d.restore()}var h=St(t._found,2),p=h[0],v=h[1];if(0==v)return"continue";var m=D[t.scale],g=0==i?he:pe,_=0==i?fe:de,w=lu(t.gap*ra),x=t._splits,k=2==m.distr?x.map((function(e){return qe[e]})):x,C=2==m.distr?qe[x[1]]-qe[x[0]]:p,E=t.ticks,S=t.border,A=E.show?lu(E.size*ra):0,F=t._rotate*-ou/180,N=y(t._pos*ra),O=N+(A+w)*c;a=0==i?O:0,o=1==i?O:0,Ze(t.font[0],u,1==t.align?fa:2==t.align?da:F>0?fa:F<0?da:0==i?"center":3==n?da:fa,F||1==i?"middle":2==n?ca:sa);for(var T=1.5*t.font[1],M=x.map((function(e){return y(l(e,m,g,_))})),B=t._values,L=0;L0&&(_.forEach((function(e,n){if(n>0&&e.show&&null==e._paths){var i=function(e){var t=bu(He-1,0,Ne-1),n=bu(Ye+1,0,Ne-1);for(;null==e[t]&&t>0;)t--;for(;null==e[n]&&n0&&e.show){Re!=e.alpha&&(d.globalAlpha=Re=e.alpha),Xe(t,!1),e._paths&&et(t,!1),Xe(t,!0);var n=e.points.show(r,t,He,Ye),i=e.points.filter(r,t,n,e._paths?e._paths.gaps:null);(n||i)&&(e.points._paths=e.points.paths(r,t,He,Ye,i),et(t,!0)),1!=Re&&(d.globalAlpha=Re=1),on("drawSeries",t)}})))}},C=(e.drawOrder||["axes","series"]).map((function(e){return k[e]}));function E(t){var n=D[t];if(null==n){var r=(e.scales||Mu)[t]||Mu;if(null!=r.from)E(r.from),D[t]=Uu({},D[r.from],r,{key:t});else{(n=D[t]=Uu({},t==x?ac:uc,r)).key=t;var o=n.time,a=n.range,u=Pu(a);if((t!=x||2==i&&!o)&&(!u||null!=a[0]&&null!=a[1]||(a={min:null==a[0]?Ja:{mode:1,hard:a[0],soft:a[0]},max:null==a[1]?Ja:{mode:1,hard:a[1],soft:a[1]}},u=!1),!u&&zu(a))){var l=a;a=function(e,t,n){return null==t?Lu:Xa(t,n,l)}}n.range=Du(a||(o?jc:t==x?3==n.distr?Yc:4==n.distr?qc:Rc:3==n.distr?Hc:4==n.distr?Vc:Uc)),n.auto=Du(!u&&n.auto),n.clamp=Du(n.clamp||oc),n._min=n._max=null}}}for(var S in E("x"),E("y"),1==i&&_.forEach((function(e){E(e.scale)})),b.forEach((function(e){E(e.scale)})),e.scales)E(S);var A,F,N=D[x],O=N.distr;0==N.ori?(Sa(s,"u-hz"),A=a,F=u):(Sa(s,"u-vt"),A=u,F=a);var T={};for(var M in D){var B=D[M];null==B.min&&null==B.max||(T[M]={min:B.min,max:B.max},B.min=B.max=null)}var L,P=e.tzDate||function(e){return new Date(lu(e/g))},I=e.fmtDate||Xu,z=1==g?Dl(P):Cl(P),$=Sl(P,El(1==g?bl:kl,I)),R=Nl(P,Fl("{YYYY}-{MM}-{DD} {h}:{mm}{aa}",I)),j=[],U=r.legend=Uu({},Ol,e.legend),H=U.show,Y=U.markers;U.idxs=j,Y.width=Du(Y.width),Y.dash=Du(Y.dash),Y.stroke=Du(Y.stroke),Y.fill=Du(Y.fill);var V,q=[],W=[],Q=!1,G={};if(U.live){var J=_[1]?_[1].values:null;for(var Z in V=(Q=null!=J)?J(r,1,0):{_:0})G[Z]="--"}if(H)if(L=Na("table","u-legend",s),Q){var K=Na("tr","u-thead",L);for(var X in Na("th",null,K),V)Na("th",aa,K).textContent=X}else Sa(L,"u-inline"),U.live&&Sa(L,"u-live");var ee={show:!0},te={show:!1};var ne=new Map;function re(e,t,n){var i=ne.get(t)||{},o=we.bind[e](r,t,n);o&&(Ra(e,t,i[e]=o),ne.set(t,i))}function ie(e,t,n){var r=ne.get(t)||{};for(var i in r)null!=e&&i!=e||(ja(i,t,r[i]),delete r[i]);null==e&&ne.delete(t)}var oe=0,ae=0,ue=0,le=0,ce=0,se=0,fe=0,de=0,he=0,pe=0;r.bbox={};var ve=!1,me=!1,ye=!1,ge=!1,_e=!1;function be(e,t,n){(n||e!=r.width||t!=r.height)&&De(e,t),ut(!1),ye=!0,me=!0,ge=_e=we.left>=0,Dt()}function De(e,t){r.width=oe=ue=e,r.height=ae=le=t,ce=se=0,function(){var e=!1,t=!1,n=!1,r=!1;b.forEach((function(i,o){if(i.show&&i._show){var a=i.side,u=a%2,l=i._size+(null!=i.label?i.labelSize:0);l>0&&(u?(ue-=l,3==a?(ce+=l,r=!0):n=!0):(le-=l,0==a?(se+=l,e=!0):t=!0))}})),Ae[0]=e,Ae[1]=n,Ae[2]=t,Ae[3]=r,ue-=Ue[1]+Ue[3],ce+=Ue[3],le-=Ue[2]+Ue[0],se+=Ue[0]}(),function(){var e=ce+ue,t=se+le,n=ce,r=se;function i(i,o){switch(i){case 1:return(e+=o)-o;case 2:return(t+=o)-o;case 3:return(n-=o)+o;case 0:return(r-=o)+o}}b.forEach((function(e,t){if(e.show&&e._show){var n=e.side;e._pos=i(n,e._size),null!=e.label&&(e._lpos=i(n,e.labelSize))}}))}();var n=r.bbox;fe=n.left=_u(ce*ra,.5),de=n.top=_u(se*ra,.5),he=n.width=_u(ue*ra,.5),pe=n.height=_u(le*ra,.5)}r.setSize=function(e){be(e.width,e.height)};var we=r.cursor=Uu({},Ll,{drag:{y:2==i}},e.cursor);we.idxs=j,we._lock=!1;var xe=we.points;xe.show=Du(xe.show),xe.size=Du(xe.size),xe.stroke=Du(xe.stroke),xe.width=Du(xe.width),xe.fill=Du(xe.fill);var ke=r.focus=Uu({},e.focus||{alpha:.3},we.focus),Ce=ke.prox>=0,Ee=[null];function Se(e,t){if(1==i||t>0){var n=1==i&&D[e.scale].time,o=e.value;e.value=n?Iu(o)?Nl(P,Fl(o,I)):o||R:o||Xl,e.label=e.label||(n?"Time":"Value")}if(t>0){e.width=null==e.width?1:e.width,e.paths=e.paths||Pc||ku,e.fillTo=Du(e.fillTo||dc),e.pxAlign=+eu(e.pxAlign,m),e.pxRound=mc(e.pxAlign),e.stroke=Du(e.stroke||null),e.fill=Du(e.fill||null),e._stroke=e._fill=e._paths=e._focus=null;var a=tc(e.width,1),u=e.points=Uu({},{size:a,width:fu(1,.2*a),stroke:e.stroke,space:2*a,paths:Ic,_stroke:null,_fill:null},e.points);u.show=Du(u.show),u.filter=Du(u.filter),u.fill=Du(u.fill),u.stroke=Du(u.stroke),u.paths=Du(u.paths),u.pxAlign=e.pxAlign}if(H){var l=function(e,t){if(0==t&&(Q||!U.live||2==i))return Lu;var n=[],o=Na("tr","u-series",L,L.childNodes[t]);Sa(o,e.class),e.show||Sa(o,oa);var a=Na("th",null,o);if(Y.show){var u=Oa("u-marker",a);if(t>0){var l=Y.width(r,t);l&&(u.style.border=l+"px "+Y.dash(r,t)+" "+Y.stroke(r,t)),u.style.background=Y.fill(r,t)}}var c=Oa(aa,a);for(var s in c.textContent=e.label,t>0&&(Y.show||(c.style.color=e.width>0?Y.stroke(r,t):Y.fill(r,t)),re("click",a,(function(t){if(!we._lock){var n=_.indexOf(e);if((t.ctrlKey||t.metaKey)!=U.isolate){var r=_.some((function(e,t){return t>0&&t!=n&&e.show}));_.forEach((function(e,t){t>0&&Pt(t,r?t==n?ee:te:ee,!0,an.setSeries)}))}else Pt(n,{show:!e.show},!0,an.setSeries)}})),Ce&&re(ga,a,(function(t){we._lock||Pt(_.indexOf(e),It,!0,an.setSeries)}))),V){var f=Na("td","u-value",o);f.textContent="--",n.push(f)}return[o,n]}(e,t);q.splice(t,0,l[0]),W.splice(t,0,l[1]),U.values.push(null)}if(we.show){j.splice(t,0,null);var c=function(e,t){if(t>0){var n=we.points.show(r,t);if(n)return Sa(n,"u-cursor-pt"),Sa(n,e.class),Ma(n,-10,-10,ue,le),v.insertBefore(n,Ee[t]),n}}(e,t);c&&Ee.splice(t,0,c)}on("addSeries",t)}r.addSeries=function(e,t){e=$c(e,t=null==t?_.length:t,Hl,ic),_.splice(t,0,e),Se(_[t],t)},r.delSeries=function(e){if(_.splice(e,1),H){U.values.splice(e,1),W.splice(e,1);var t=q.splice(e,1)[0];ie(null,t.firstChild),t.remove()}we.show&&(j.splice(e,1),Ee.length>1&&Ee.splice(e,1)[0].remove()),on("delSeries",e)};var Ae=[!1,!1,!1,!1];function Fe(e,t,n,r){var i=St(n,4),o=i[0],a=i[1],u=i[2],l=i[3],c=t%2,s=0;return 0==c&&(l||a)&&(s=0==t&&!o||2==t&&!u?lu(Ul.size/3):0),1==c&&(o||u)&&(s=1==t&&!a||3==t&&!l?lu(ec.size/2):0),s}var Ne,Oe,Te,Me,Be,Le,Pe,Ie,ze,$e,Re,je=r.padding=(e.padding||[Fe,Fe,Fe,Fe]).map((function(e){return Du(eu(e,Fe))})),Ue=r._padding=je.map((function(e,t){return e(r,t,Ae,0)})),He=null,Ye=null,Ve=1==i?_[0].idxs:null,qe=null,We=!1;function Qe(e,n){if(t=null==e?[]:ju(e,$u),2==i){Ne=0;for(var o=1;o<_.length;o++)Ne+=t[o][0].length;r.data=t=e}else if(null==t[0]&&(t[0]=[]),r.data=t.slice(),qe=t[0],Ne=qe.length,2==O){t[0]=Array(Ne);for(var a=0;a=0,_e=!0,Dt()}}function Ge(){var e,n;if(We=!0,1==i)if(Ne>0){if(He=Ve[0]=0,Ye=Ve[1]=Ne-1,e=t[0][He],n=t[0][Ye],2==O)e=He,n=Ye;else if(1==Ne)if(3==O){var r=St(Qa(e,e,N.log,!1),2);e=r[0],n=r[1]}else if(4==O){var o=St(Ga(e,e,N.log,!1),2);e=o[0],n=o[1]}else if(N.time)n=e+lu(86400/g);else{var a=St(Xa(e,n,.1,!0),2);e=a[0],n=a[1]}}else He=Ve[0]=e=null,Ye=Ve[1]=n=null;Lt(x,e,n)}function Je(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:pa,t=arguments.length>1?arguments[1]:void 0,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:Bu,r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"butt",i=arguments.length>4&&void 0!==arguments[4]?arguments[4]:pa,o=arguments.length>5&&void 0!==arguments[5]?arguments[5]:"round";e!=Oe&&(d.strokeStyle=Oe=e),i!=Te&&(d.fillStyle=Te=i),t!=Me&&(d.lineWidth=Me=t),o!=Le&&(d.lineJoin=Le=o),r!=Pe&&(d.lineCap=Pe=r),n!=Be&&d.setLineDash(Be=n)}function Ze(e,t,n,r){t!=Te&&(d.fillStyle=Te=t),e!=Ie&&(d.font=Ie=e),n!=ze&&(d.textAlign=ze=n),r!=$e&&(d.textBaseline=$e=r)}function Ke(e,t,n,i){var o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:0;if(i.length>0&&e.auto(r,We)&&(null==t||null==t.min)){var a=eu(He,0),u=eu(Ye,i.length-1),l=null==n.min?3==e.distr?Va(i,a,u):Ya(i,a,u,o):[n.min,n.max];e.min=su(e.min,n.min=l[0]),e.max=fu(e.max,n.max=l[1])}}function Xe(e,t){var n=t?_[e].points:_[e];n._stroke=n.stroke(r,e),n._fill=n.fill(r,e)}function et(e,n){var i=n?_[e].points:_[e],o=i._stroke,a=i._fill,u=i._paths,l=u.stroke,c=u.fill,s=u.clip,f=u.flags,h=null,p=Fu(i.width*ra,3),v=p%2/2;n&&null==a&&(a=p>0?"#fff":o);var m=1==i.pxAlign;if(m&&d.translate(v,v),!n){var y=fe,g=de,b=he,D=pe,x=p*ra/2;0==i.min&&(D+=x),0==i.max&&(g-=x,D+=x),(h=new Path2D).rect(y,g,b,D)}n?tt(o,p,i.dash,i.cap,a,l,c,f,s):function(e,n,i,o,a,u,l,c,s,f,d){var h=!1;w.forEach((function(p,v){if(p.series[0]==e){var m,y=_[p.series[1]],g=t[p.series[1]],b=(y._paths||Mu).band;Pu(b)&&(b=1==p.dir?b[0]:b[1]);var D=null;y.show&&b&&function(e,t,n){for(t=eu(t,0),n=eu(n,e.length-1);t<=n;){if(null!=e[t])return!0;t++}return!1}(g,He,Ye)?(D=p.fill(r,v)||u,m=y._paths.clip):b=null,tt(n,i,o,a,D,l,c,s,f,d,m,b),h=!0}})),h||tt(n,i,o,a,u,l,c,s,f,d)}(e,o,p,i.dash,i.cap,a,l,c,f,h,s),m&&d.translate(-v,-v)}r.setData=Qe;function tt(e,t,n,r,i,o,a,u,l,c,s,f){Je(e,t,n,r,i),(l||c||f)&&(d.save(),l&&d.clip(l),c&&d.clip(c)),f?3==(3&u)?(d.clip(f),s&&d.clip(s),rt(i,a),nt(e,o,t)):2&u?(rt(i,a),d.clip(f),nt(e,o,t)):1&u&&(d.save(),d.clip(f),s&&d.clip(s),rt(i,a),d.restore(),nt(e,o,t)):(rt(i,a),nt(e,o,t)),(l||c||f)&&d.restore()}function nt(e,t,n){n>0&&(t instanceof Map?t.forEach((function(e,t){d.strokeStyle=Oe=t,d.stroke(e)})):null!=t&&e&&d.stroke(t))}function rt(e,t){t instanceof Map?t.forEach((function(e,t){d.fillStyle=Te=t,d.fill(e)})):null!=t&&e&&d.fill(t)}function it(e,t,n,r,i,o,a,u,l,c){var s=a%2/2;1==m&&d.translate(s,s),Je(u,a,l,c,u),d.beginPath();var f,h,p,v,y=i+(0==r||3==r?-o:o);0==n?(h=i,v=y):(f=i,p=y);for(var g=0;g0&&(t._paths=null,e&&(1==i?(t.min=null,t.max=null):t.facets.forEach((function(e){e.min=null,e.max=null}))))}))}var lt,ct,st,ft,dt,ht,pt,vt,mt,yt,gt,_t,bt=!1;function Dt(){bt||(Yu(wt),bt=!0)}function wt(){ve&&(!function(){var e=ju(D,$u);for(var n in e){var o=e[n],a=T[n];if(null!=a&&null!=a.min)Uu(o,a),n==x&&ut(!0);else if(n!=x||2==i)if(0==Ne&&null==o.from){var u=o.range(r,null,null,n);o.min=u[0],o.max=u[1]}else o.min=yu,o.max=-yu}if(Ne>0)for(var l in _.forEach((function(n,o){if(1==i){var a=n.scale,u=e[a],l=T[a];if(0==o){var c=u.range(r,u.min,u.max,a);u.min=c[0],u.max=c[1],He=Ua(u.min,t[0]),Ye=Ua(u.max,t[0]),t[0][He]u.max&&Ye--,n.min=qe[He],n.max=qe[Ye]}else n.show&&n.auto&&Ke(u,l,n,t[o],n.sorted);n.idxs[0]=He,n.idxs[1]=Ye}else if(o>0&&n.show&&n.auto){var s=St(n.facets,2),f=s[0],d=s[1],h=f.scale,p=d.scale,v=St(t[o],2),m=v[0],y=v[1];Ke(e[h],T[h],f,m,f.sorted),Ke(e[p],T[p],d,y,d.sorted),n.min=d.min,n.max=d.max}})),e){var c=e[l],s=T[l];if(null==c.from&&(null==s||null==s.min)){var f=c.range(r,c.min==yu?null:c.min,c.max==-yu?null:c.max,l);c.min=f[0],c.max=f[1]}}for(var d in e){var h=e[d];if(null!=h.from){var p=e[h.from];if(null==p.min)h.min=h.max=null;else{var v=h.range(r,p.min,p.max,d);h.min=v[0],h.max=v[1]}}}var m={},y=!1;for(var g in e){var b=e[g],w=D[g];if(w.min!=b.min||w.max!=b.max){w.min=b.min,w.max=b.max;var k=w.distr;w._min=3==k?pu(w.min):4==k?mu(w.min,w.asinh):w.min,w._max=3==k?pu(w.max):4==k?mu(w.max,w.asinh):w.max,m[g]=y=!0}}if(y){for(var C in _.forEach((function(e,t){2==i?t>0&&m.y&&(e._paths=null):m[e.scale]&&(e._paths=null)})),m)ye=!0,on("setScale",C);we.show&&(ge=_e=we.left>=0)}for(var E in T)T[E]=null}(),ve=!1),ye&&(!function(){for(var e=!1,t=0;!e;){var n=ot(++t),i=at(t);(e=3==t||n&&i)||(De(r.width,r.height),me=!0)}}(),ye=!1),me&&(Fa(p,fa,ce),Fa(p,ca,se),Fa(p,ua,ue),Fa(p,la,le),Fa(v,fa,ce),Fa(v,ca,se),Fa(v,ua,ue),Fa(v,la,le),Fa(h,ua,oe),Fa(h,la,ae),f.width=lu(oe*ra),f.height=lu(ae*ra),b.forEach((function(e){var t=e._el,n=e._show,r=e._size,i=e._pos,o=e.side;if(null!=t)if(n){var a=o%2==1;Fa(t,a?"left":"top",i-(3===o||0===o?r:0)),Fa(t,a?"width":"height",r),Fa(t,a?"top":"left",a?se:ce),Fa(t,a?"height":"width",a?le:ue),Aa(t,oa)}else Sa(t,oa)})),Oe=Te=Me=Le=Pe=Ie=ze=$e=Be=null,Re=1,Wt(!0),on("setSize"),me=!1),oe>0&&ae>0&&(d.clearRect(0,0,f.width,f.height),on("drawClear"),C.forEach((function(e){return e()})),on("draw")),we.show&&ge&&(Vt(null,!0,!1),ge=!1),c||(c=!0,r.status=1,on("ready")),We=!1,bt=!1}function xt(e,n){var i=D[e];if(null==i.from){if(0==Ne){var o=i.range(r,n.min,n.max,e);n.min=o[0],n.max=o[1]}if(n.min>n.max){var a=n.min;n.min=n.max,n.max=a}if(Ne>1&&null!=n.min&&null!=n.max&&n.max-n.min<1e-16)return;e==x&&2==i.distr&&Ne>0&&(n.min=Ua(n.min,t[0]),n.max=Ua(n.max,t[0]),n.min==n.max&&n.max++),T[e]=n,ve=!0,Dt()}}r.redraw=function(e,t){ye=t||!1,!1!==e?Lt(x,N.min,N.max):Dt()},r.setScale=xt;var kt=!1,Ct=we.drag,Et=Ct.x,At=Ct.y;we.show&&(we.x&&(lt=Oa("u-cursor-x",v)),we.y&&(ct=Oa("u-cursor-y",v)),0==N.ori?(st=lt,ft=ct):(st=ct,ft=lt),gt=we.left,_t=we.top);var Ft,Nt,Ot,Tt=r.select=Uu({show:!0,over:!0,left:0,width:0,top:0,height:0},e.select),Mt=Tt.show?Oa("u-select",Tt.over?v:p):null;function Bt(e,t){if(Tt.show){for(var n in e)Fa(Mt,n,Tt[n]=e[n]);!1!==t&&on("setSelect")}}function Lt(e,t,n){xt(e,{min:t,max:n})}function Pt(e,t,n,o){null!=t.focus&&function(e){if(e!=Ot){var t=null==e,n=1!=ke.alpha;_.forEach((function(r,i){var o=t||0==i||i==e;r._focus=t?null:o,n&&function(e,t){_[e].alpha=t,we.show&&Ee[e]&&(Ee[e].style.opacity=t);H&&q[e]&&(q[e].style.opacity=t)}(i,o?1:ke.alpha)})),Ot=e,n&&Dt()}}(e),null!=t.show&&_.forEach((function(n,r){r>0&&(e==r||null==e)&&(n.show=t.show,function(e,t){var n=_[e],r=H?q[e]:null;n.show?r&&Aa(r,oa):(r&&Sa(r,oa),Ee.length>1&&Ma(Ee[e],-10,-10,ue,le))}(r,t.show),Lt(2==i?n.facets[1].scale:n.scale,null,null),Dt())})),!1!==n&&on("setSeries",e,t),o&&cn("setSeries",r,e,t)}r.setSelect=Bt,r.setSeries=Pt,r.addBand=function(e,t){e.fill=Du(e.fill||null),e.dir=eu(e.dir,-1),t=null==t?w.length:t,w.splice(t,0,e)},r.setBand=function(e,t){Uu(w[e],t)},r.delBand=function(e){null==e?w.length=0:w.splice(e,1)};var It={focus:!0};function zt(e,t,n){var r=D[t];n&&(e=e/ra-(1==r.ori?se:ce));var i=ue;1==r.ori&&(e=(i=le)-e),-1==r.dir&&(e=i-e);var o=r._min,a=o+(r._max-o)*(e/i),u=r.distr;return 3==u?du(10,a):4==u?function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;return iu.sinh(e)*t}(a,r.asinh):a}function $t(e,t){Fa(Mt,fa,Tt.left=e),Fa(Mt,ua,Tt.width=t)}function Rt(e,t){Fa(Mt,ca,Tt.top=e),Fa(Mt,la,Tt.height=t)}H&&Ce&&Ra(_a,L,(function(e){we._lock||null!=Ot&&Pt(null,It,!0,an.setSeries)})),r.valToIdx=function(e){return Ua(e,t[0])},r.posToIdx=function(e,n){return Ua(zt(e,x,n),t[0],He,Ye)},r.posToVal=zt,r.valToPos=function(e,t,n){return 0==D[t].ori?a(e,D[t],n?he:ue,n?fe:0):u(e,D[t],n?pe:le,n?de:0)},r.batch=function(e){e(r),Dt()},r.setCursor=function(e,t,n){gt=e.left,_t=e.top,Vt(null,t,n)};var jt=0==N.ori?$t:Rt,Ut=1==N.ori?$t:Rt;function Ht(e,t){if(null!=e){var n=e.idx;U.idx=n,_.forEach((function(e,t){(t>0||!Q)&&Yt(t,n)}))}H&&U.live&&function(){if(H&&U.live)for(var e=2==i?1:0;e<_.length;e++)if(0!=e||!Q){var t=U.values[e],n=0;for(var r in t)W[e][n++].firstChild.nodeValue=t[r]}}(),_e=!1,!1!==t&&on("setLegend")}function Yt(e,n){var i;if(null==n)i=G;else{var o=_[e],a=0==e&&2==O?qe:t[e];i=Q?o.values(r,e,n):{_:o.value(r,a[n],e,n)}}U.values[e]=i}function Vt(e,n,o){mt=gt,yt=_t;var a,u=St(we.move(r,gt,_t),2);gt=u[0],_t=u[1],we.show&&(st&&Ma(st,lu(gt),0,ue,le),ft&&Ma(ft,0,lu(_t),ue,le));var l=He>Ye;Ft=yu;var s=0==N.ori?ue:le,f=1==N.ori?ue:le;if(gt<0||0==Ne||l){a=null;for(var d=0;d<_.length;d++)d>0&&Ee.length>1&&Ma(Ee[d],-10,-10,ue,le);if(Ce&&Pt(null,It,!0,null==e&&an.setSeries),U.live){j.fill(null),_e=!0;for(var h=0;h<_.length;h++)U.values[h]=G}}else{var p,v;1==i&&(a=Ua(p=zt(0==N.ori?gt:_t,x),t[0],He,Ye),v=Su(A(t[0][a],N,s,0),.5));for(var m=2==i?1:0;m<_.length;m++){var y=_[m],g=j[m],b=1==i?t[m][g]:t[m][1][g],w=we.dataIdx(r,m,a,p),k=1==i?t[m][w]:t[m][1][w];_e=_e||k!=b||w!=g,j[m]=w;var C=w==a?v:Su(A(1==i?t[0][w]:t[m][0][w],N,s,0),.5);if(m>0&&y.show){var E=null==k?-10:Su(F(k,1==i?D[y.scale]:D[y.facets[1].scale],f,0),.5);if(E>0&&1==i){var S=au(E-_t);S<=Ft&&(Ft=S,Nt=m)}var O=void 0,T=void 0;if(0==N.ori?(O=C,T=E):(O=E,T=C),_e&&Ee.length>1){La(Ee[m],we.points.fill(r,m),we.points.stroke(r,m));var M=void 0,B=void 0,L=void 0,P=void 0,I=!0,z=we.points.bbox;if(null!=z){I=!1;var $=z(r,m);L=$.left,P=$.top,M=$.width,B=$.height}else L=O,P=T,M=B=we.points.size(r,m);Ia(Ee[m],M,B,I),Ma(Ee[m],L,P,ue,le)}}if(U.live){if(!_e||0==m&&Q)continue;Yt(m,w)}}}if(we.idx=a,we.left=gt,we.top=_t,_e&&(U.idx=a,Ht()),Tt.show&&kt)if(null!=e){var R=St(an.scales,2),H=R[0],Y=R[1],V=St(an.match,2),q=V[0],W=V[1],J=St(e.cursor.sync.scales,2),Z=J[0],K=J[1],X=e.cursor.drag;if(Et=X._x,At=X._y,Et||At){var ee,te,ne,re,ie,oe=e.select,ae=oe.left,ce=oe.top,se=oe.width,fe=oe.height,de=e.scales[H].ori,he=e.posToVal,pe=null!=H&&q(H,Z),ve=null!=Y&&W(Y,K);pe&&Et?(0==de?(ee=ae,te=se):(ee=ce,te=fe),ne=D[H],re=A(he(ee,Z),ne,s,0),ie=A(he(ee+te,Z),ne,s,0),jt(su(re,ie),au(ie-re))):jt(0,s),ve&&At?(1==de?(ee=ae,te=se):(ee=ce,te=fe),ne=D[Y],re=F(he(ee,K),ne,f,0),ie=F(he(ee+te,K),ne,f,0),Ut(su(re,ie),au(ie-re))):Ut(0,f)}else Zt()}else{var me=au(mt-dt),ye=au(yt-ht);if(1==N.ori){var ge=me;me=ye,ye=ge}Et=Ct.x&&me>=Ct.dist,At=Ct.y&&ye>=Ct.dist;var be,De,xe=Ct.uni;null!=xe?Et&&At&&(At=ye>=xe,(Et=me>=xe)||At||(ye>me?At=!0:Et=!0)):Ct.x&&Ct.y&&(Et||At)&&(Et=At=!0),Et&&(0==N.ori?(be=pt,De=gt):(be=vt,De=_t),jt(su(be,De),au(De-be)),At||Ut(0,f)),At&&(1==N.ori?(be=pt,De=gt):(be=vt,De=_t),Ut(su(be,De),au(De-be)),Et||jt(0,s)),Et||At||(jt(0,0),Ut(0,0))}if(Ct._x=Et,Ct._y=At,null==e){if(o){if(null!=un){var Se=St(an.scales,2),Ae=Se[0],Fe=Se[1];an.values[0]=null!=Ae?zt(0==N.ori?gt:_t,Ae):null,an.values[1]=null!=Fe?zt(1==N.ori?gt:_t,Fe):null}cn(va,r,gt,_t,ue,le,a)}if(Ce){var Oe=o&&an.setSeries,Te=ke.prox;null==Ot?Ft<=Te&&Pt(Nt,It,!0,Oe):Ft>Te?Pt(null,It,!0,Oe):Nt!=Ot&&Pt(Nt,It,!0,Oe)}}c&&!1!==n&&on("setCursor")}r.setLegend=Ht;var qt=null;function Wt(e){!0===e?qt=null:on("syncRect",qt=v.getBoundingClientRect())}function Qt(e,t,n,r,i,o,a){we._lock||(Gt(e,t,n,r,i,o,a,!1,null!=e),null!=e?Vt(null,!0,!0):Vt(t,!0,!1))}function Gt(e,t,n,i,o,a,u,c,s){if(null==qt&&Wt(!1),null!=e)n=e.clientX-qt.left,i=e.clientY-qt.top;else{if(n<0||i<0)return gt=-10,void(_t=-10);var f=St(an.scales,2),d=f[0],h=f[1],p=t.cursor.sync,v=St(p.values,2),m=v[0],y=v[1],g=St(p.scales,2),_=g[0],b=g[1],w=St(an.match,2),x=w[0],k=w[1],C=t.axes[0].side%2==1,E=0==N.ori?ue:le,S=1==N.ori?ue:le,A=C?a:o,F=C?o:a,O=C?i:n,T=C?n:i;if(n=null!=_?x(d,_)?l(m,D[d],E,0):-10:E*(O/A),i=null!=b?k(h,b)?l(y,D[h],S,0):-10:S*(T/F),1==N.ori){var M=n;n=i,i=M}}if(s&&((n<=1||n>=ue-1)&&(n=_u(n,ue)),(i<=1||i>=le-1)&&(i=_u(i,le))),c){dt=n,ht=i;var B=St(we.move(r,n,i),2);pt=B[0],vt=B[1]}else gt=n,_t=i}var Jt={width:0,height:0};function Zt(){Bt(Jt,!1)}function Kt(e,t,n,i,o,a,u){kt=!0,Et=At=Ct._x=Ct._y=!1,Gt(e,t,n,i,o,a,0,!0,!1),null!=e&&(re(ya,ka,Xt),cn(ma,r,pt,vt,ue,le,null))}function Xt(e,t,n,i,o,a,u){kt=Ct._x=Ct._y=!1,Gt(e,t,n,i,o,a,0,!1,!0);var l=Tt.left,c=Tt.top,s=Tt.width,f=Tt.height,d=s>0||f>0;if(d&&Bt(Tt),Ct.setScale&&d){var h=l,p=s,v=c,m=f;if(1==N.ori&&(h=c,p=f,v=l,m=s),Et&&Lt(x,zt(h,x),zt(h+p,x)),At)for(var y in D){var g=D[y];y!=x&&null==g.from&&g.min!=yu&&Lt(y,zt(v+m,y),zt(v,y))}Zt()}else we.lock&&(we._lock=!we._lock,we._lock||Vt(null,!0,!1));null!=e&&(ie(ya,ka),cn(ya,r,gt,_t,ue,le,null))}function en(e,t,n,i,o,a,u){Ge(),Zt(),null!=e&&cn(ba,r,gt,_t,ue,le,null)}function tn(){b.forEach(Gc),be(r.width,r.height,!0)}Ra(wa,Ca,tn);var nn={};nn.mousedown=Kt,nn.mousemove=Qt,nn.mouseup=Xt,nn.dblclick=en,nn.setSeries=function(e,t,n,r){Pt(n,r,!0,!1)},we.show&&(re(ma,v,Kt),re(va,v,Qt),re(ga,v,Wt),re(_a,v,(function(e,t,n,r,i,o,a){if(!we._lock){var u=kt;if(kt){var l,c,s=!0,f=!0;0==N.ori?(l=Et,c=At):(l=At,c=Et),l&&c&&(s=gt<=10||gt>=ue-10,f=_t<=10||_t>=le-10),l&&s&&(gt=gt=3?Kl:xu)),e.font=Qc(e.font),e.labelFont=Qc(e.labelFont),e._size=e.size(r,null,t,0),e._space=e._rotate=e._incrs=e._found=e._splits=e._values=null,e._size>0&&(Ae[t]=!0,e._el=Oa("u-axis",h))}})),n?n instanceof HTMLElement?(n.appendChild(s),sn()):n(r,sn):sn(),r}Jc.assign=Uu,Jc.fmtNum=ru,Jc.rangeNum=Xa,Jc.rangeLog=Qa,Jc.rangeAsinh=Ga,Jc.orient=sc,Jc.pxRatio=ra,Jc.join=function(e,t){for(var n=new Set,r=0;r=o&&A<=a;A+=k){var F=c[A];if(null!=F){var N=_(l[A]),O=b(F);1==t?D(x,N,C):D(x,S,O),D(x,N,O),C=O,S=N}}var T=St(fc(e,i),2),M=T[0],B=T[1];if(null!=u.fill||0!=M){var L=w.fill=new Path2D(x),P=b(u.fillTo(e,i,u.min,u.max,M));D(L,S,P),D(L,E,P)}if(!u.spanGaps){var I,z=[];(I=z).push.apply(I,At(vc(l,c,o,a,k,_,r)));var $=u.width*ra/2,R=n||1==t?$:-$,j=n||-1==t?-$:$;z.forEach((function(e){e[0]+=R,e[1]+=j})),w.gaps=z=u.gaps(e,i,o,a,z),w.clip=pc(z,s.ori,p,v,m,y)}return 0!=B&&(w.band=2==B?[hc(e,i,o,a,x,-1),hc(e,i,o,a,x,1)]:hc(e,i,o,a,x,B)),w}))}},Zc.bars=function(e){var t=eu((e=e||Mu).size,[.6,yu,1]),n=e.align||0,r=(e.gap||0)*ra,i=eu(e.radius,0),o=1-t[0],a=eu(t[1],yu)*ra,u=eu(t[2],1)*ra,l=eu(e.disp,Mu),c=eu(e.each,(function(e){})),s=l.fill,f=l.stroke;return function(e,t,d,h){return sc(e,t,(function(p,v,m,y,g,_,b,D,w,x,k){var C,E,S=p.pxRound,A=y.dir*(0==y.ori?1:-1),F=g.dir*(1==g.ori?1:-1),N=0==y.ori?wc:xc,O=0==y.ori?c:function(e,t,n,r,i,o,a){c(e,t,n,i,r,a,o)},T=St(fc(e,t),2),M=T[0],B=T[1],L=3==g.distr?1==M?g.max:g.min:0,P=b(L,g,k,w),I=S(p.width*ra),z=!1,$=null,R=null,j=null,U=null;null==s||0!=I&&null==f||(z=!0,$=s.values(e,t,d,h),R=new Map,new Set($).forEach((function(e){null!=e&&R.set(e,new Path2D)})),I>0&&(j=f.values(e,t,d,h),U=new Map,new Set(j).forEach((function(e){null!=e&&U.set(e,new Path2D)}))));var H=l.x0,Y=l.size;if(null!=H&&null!=Y){v=H.values(e,t,d,h),2==H.unit&&(v=v.map((function(t){return e.posToVal(D+t*x,y.key,!0)})));var V=Y.values(e,t,d,h);E=S((E=2==Y.unit?V[0]*x:_(V[0],y,x,D)-_(0,y,x,D))-I),C=1==A?-I/2:E+I/2}else{var q=x;if(v.length>1)for(var W=null,Q=0,G=1/0;Q=d&&Q<=h;Q+=A){var ie=m[Q];if(void 0!==ie){var oe=_(2!=y.distr||null!=l?v[Q]:Q,y,x,D),ae=b(eu(ie,L),g,k,w);null!=re&&null!=ie&&(P=b(re[Q],g,k,w));var ue=S(oe-C),le=S(fu(ae,P)),ce=S(su(ae,P)),se=le-ce,fe=i*E;null!=ie&&(z?(I>0&&null!=j[Q]&&N(U.get(j[Q]),ue,ce+uu(I/2),E,fu(0,se-I),fe),null!=$[Q]&&N(R.get($[Q]),ue,ce+uu(I/2),E,fu(0,se-I),fe)):N(X,ue,ce+uu(I/2),E,fu(0,se-I),fe),O(e,t,Q,ue-I/2,ce,E+I,se)),0!=B&&(F*B==1?(le=ce,ce=Z):(ce=le,le=Z),N(ee,ue-I/2,ce,E+I,fu(0,se=le-ce),0))}}return I>0&&(K.stroke=z?U:X),K.fill=z?R:X,K}))}},Zc.spline=function(e){return function(e,t){var n=eu(null===t||void 0===t?void 0:t.alignGaps,0);return function(t,r,i,o){return sc(t,r,(function(a,u,l,c,s,f,d,h,p,v,m){var y,g,_,b=a.pxRound,D=function(e){return b(f(e,c,v,h))},w=function(e){return b(d(e,s,m,p))};0==c.ori?(y=gc,_=bc,g=Ec):(y=_c,_=Dc,g=Sc);var x=c.dir*(0==c.ori?1:-1);i=Ha(l,i,o,1),o=Ha(l,i,o,-1);for(var k=D(u[1==x?i:o]),C=k,E=[],S=[],A=1==x?i:o;A>=i&&A<=o;A+=x)if(null!=l[A]){var F=D(u[A]);E.push(C=F),S.push(w(l[A]))}var N={stroke:e(E,S,y,_,g,b),fill:null,clip:null,band:null,gaps:null,flags:1},O=N.stroke,T=St(fc(t,r),2),M=T[0],B=T[1];if(null!=a.fill||0!=M){var L=N.fill=new Path2D(O),P=w(a.fillTo(t,r,a.min,a.max,M));_(L,C,P),_(L,k,P)}if(!a.spanGaps){var I,z=[];(I=z).push.apply(I,At(vc(u,l,i,o,x,D,n))),N.gaps=z=a.gaps(t,r,i,o,z),N.clip=pc(z,c.ori,h,p,v,m)}return 0!=B&&(N.band=2==B?[hc(t,r,i,o,O,-1),hc(t,r,i,o,O,1)]:hc(t,r,i,o,O,B)),N}))}}(Mc,e)};var Kc,Xc={height:500,legend:{show:!1},cursor:{drag:{x:!0,y:!1},focus:{prox:30},points:{size:5.6,width:1.4},bind:{click:function(){return null},dblclick:function(){return null}}}},es=function(e){return void 0===e||null===e?"":e.toLocaleString("en-US",{maximumSignificantDigits:20})},ts=function(e,t,n,r){var i,o=e.axes[n];if(r>1)return o._size||60;var a=6+((null===o||void 0===o||null===(i=o.ticks)||void 0===i?void 0:i.size)||0)+(o.gap||0),u=(null!==t&&void 0!==t?t:[]).reduce((function(e,t){return t.length>e.length?t:e}),"");return""!=u&&(a+=function(e,t){var n=document.createElement("span");n.innerText=e,n.style.cssText="position: absolute; z-index: -1; pointer-events: none; opacity: 0; font: ".concat(t),document.body.appendChild(n);var r=n.offsetWidth;return n.remove(),r}(u,e.ctx.font)),Math.ceil(a)},ns=function(e){return function(e){for(var t=0,n=0;n>8*i&255).toString(16)).substr(-2);return r}(e)},rs=function(e){return e.replace(/^\[\d+]/,"").replace(/{.+}/gim,"")},is=function(e){for(var t=e.length,n=-1/0;t--;){var r=e[t];Number.isFinite(r)&&r>n&&(n=r)}return Number.isFinite(n)?n:null},os=function(e){for(var t=e.length,n=1/0;t--;){var r=e[t];Number.isFinite(r)&&r2&&void 0!==arguments[2]?arguments[2]:"";return t.map((function(e){return"".concat(es(e)," ").concat(n)}))}(e,n,t)}};return e?Number(e)%2?n:ar(ar({},n),{},{side:1}):{space:80,values:as}}))},ls=function(e,t){if(null==e||null==t)return[-1,1];var n=.02*(Math.abs(t-e)||Math.abs(e)||1);return[e-n,t+n]},cs=n(61),ss=n.n(cs),fs=function(e){var t=e.u,n=e.id,r=e.unit,i=void 0===r?"":r,o=e.metrics,a=e.series,u=e.tooltipIdx,l=e.tooltipOffset,c=e.isSticky,s=e.onClose,f=re(null),d=St(X({top:-999,left:-999}),2),h=d[0],p=d[1],v=St(X(!1),2),y=v[0],g=v[1],_=St(X(!1),2),b=_[0],D=_[1],w=St(X(u.seriesIdx),2),x=w[0],k=w[1],C=St(X(u.dataIdx),2),E=C[0],S=C[1],A=oe((function(){return t.root.querySelector(".u-wrap")}),[t]),F=oe((function(){return dr()(t,["data",x,E],0)}),[t,x,E]),N=oe((function(){return es(F)}),[F]),O=oe((function(){return t.data[0][E]}),[t,E]),T=oe((function(){return gt()(1e3*O).tz().format("YYYY-MM-DD HH:mm:ss:SSS (Z)")}),[O]),M=oe((function(){var e;return ns((null===(e=a[x])||void 0===e?void 0:e.label)||"")}),[a,x]),B=oe((function(){var e,t=((null===(e=a[x])||void 0===e?void 0:e.label)||"").replace(/{.+}/gim,"").trim();return rs(t)}),[]),L=oe((function(){var e,t=(null===(e=o[x-1])||void 0===e?void 0:e.metric)||{},n=Object.keys(t).filter((function(e){return"__name__"!==e}));return n.map((function(e){return"".concat(e,'="').concat(t[e],'"')}))}),[o,x]),P=function(e){if(y){var t=e.clientX,n=e.clientY;p({top:n,left:t})}},I=function(){g(!1)};return te((function(){var e;if(f.current){var n=t.valToPos(F||0,(null===(e=a[x])||void 0===e?void 0:e.scale)||"1"),r=t.valToPos(O,"x"),i=f.current.getBoundingClientRect(),o=i.width,u=i.height,c=t.over.getBoundingClientRect(),s=r+o>=c.width?o+20:0,d=n+u>=c.height?u+20:0;p({top:n+l.top+10-d,left:r+l.left+10-s})}}),[t,F,O,x,l,f]),te((function(){k(u.seriesIdx),S(u.dataIdx)}),[u]),te((function(){return y&&(document.addEventListener("mousemove",P),document.addEventListener("mouseup",I)),function(){document.removeEventListener("mousemove",P),document.removeEventListener("mouseup",I)}}),[y]),!A||u.seriesIdx<0||u.dataIdx<0?null:mt.createPortal(_r("div",{className:Ri()({"vm-chart-tooltip":!0,"vm-chart-tooltip_sticky":c,"vm-chart-tooltip_moved":b}),ref:f,style:h,children:[_r("div",{className:"vm-chart-tooltip-header",children:[_r("div",{className:"vm-chart-tooltip-header__date",children:T}),c&&_r(m,{children:[_r(bo,{className:"vm-chart-tooltip-header__drag",variant:"text",size:"small",startIcon:_r(zi,{}),onMouseDown:function(e){D(!0),g(!0);var t=e.clientX,n=e.clientY;p({top:n,left:t})}}),_r(bo,{className:"vm-chart-tooltip-header__close",variant:"text",size:"small",startIcon:_r(hi,{}),onClick:function(){s&&s(n)}})]})]}),_r("div",{className:"vm-chart-tooltip-data",children:[_r("div",{className:"vm-chart-tooltip-data__marker",style:{background:M}}),_r("p",{children:[B,":",_r("b",{className:"vm-chart-tooltip-data__value",children:N}),i]})]}),!!L.length&&_r("div",{className:"vm-chart-tooltip-info",children:L.map((function(e,t){return _r("div",{children:e},"".concat(e,"_").concat(t))}))})]}),A)};!function(e){e.xRange="xRange",e.yRange="yRange",e.data="data"}(Kc||(Kc={}));var ds=function(e){var t=e.data,n=e.series,r=e.metrics,i=void 0===r?[]:r,o=e.period,a=e.yaxis,u=e.unit,l=e.setPeriod,c=e.container,s=re(null),f=St(X(!1),2),d=f[0],p=f[1],v=St(X({min:o.start,max:o.end}),2),m=v[0],y=v[1],g=St(X(),2),_=g[0],b=g[1],D=So(c),w=St(X(!1),2),x=w[0],k=w[1],C=St(X({seriesIdx:-1,dataIdx:-1}),2),E=C[0],S=C[1],A=St(X({left:0,top:0}),2),F=A[0],N=A[1],O=St(X([]),2),T=O[0],M=O[1],B=oe((function(){return"".concat(E.seriesIdx,"_").concat(E.dataIdx)}),[E]),L=ae(ss()((function(e){var t=e.min,n=e.max;l({from:gt()(1e3*t).toDate(),to:gt()(1e3*n).toDate()})}),500),[]),P=function(e){var t=e.u,n=e.min,r=e.max,i=1e3*(r-n);iFr||(t.setScale("x",{min:n,max:r}),y({min:n,max:r}),L({min:n,max:r}))},I=function(e){var t=e.target,n=e.ctrlKey,r=e.metaKey,i=e.key,o=t instanceof HTMLInputElement||t instanceof HTMLTextAreaElement;if(_&&!o){var a="+"===i||"="===i;if(("-"===i||a)&&!n&&!r){e.preventDefault();var u=(m.max-m.min)/10*(a?1:-1);P({u:_,min:m.min+u,max:m.max-u})}}},z=function(){var e="".concat(E.seriesIdx,"_").concat(E.dataIdx),t={id:e,unit:u,series:n,metrics:i,tooltipIdx:E,tooltipOffset:F};if(!T.find((function(t){return t.id===e}))){var r=JSON.parse(JSON.stringify(t));M((function(e){return[].concat(At(e),[r])}))}},$=function(e){M((function(t){return t.filter((function(t){return t.id!==e}))}))},R=function(){return[m.min,m.max]},j=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1,r=arguments.length>3?arguments[3]:void 0;return a.limits.enable?a.limits.range[r]:ls(t,n)},U=ar(ar({},Xc),{},{tzDate:function(e){return gt()(Pr(zr(e))).local().toDate()},series:n,axes:us([{},{scale:"1"}],u),scales:ar({},function(){var e={x:{range:R}},t=Object.keys(a.limits.range);return(t.length?t:["1"]).forEach((function(t){e[t]={range:function(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1;return j(e,n,r,t)}}})),e}()),width:D.width||400,plugins:[{hooks:{ready:function(e){N({left:parseFloat(e.over.style.left),top:parseFloat(e.over.style.top)}),e.over.addEventListener("mousedown",(function(t){var n=t.ctrlKey,r=t.metaKey;0===t.button&&(n||r)&&function(e){var t=e.e,n=e.factor,r=void 0===n?.85:n,i=e.u,o=e.setPanning,a=e.setPlotScale;t.preventDefault(),o(!0);var u=t.clientX,l=i.posToVal(1,"x")-i.posToVal(0,"x"),c=i.scales.x.min||0,s=i.scales.x.max||0,f=function(e){e.preventDefault();var t=l*((e.clientX-u)*r);a({u:i,min:c-t,max:s-t})};document.addEventListener("mousemove",f),document.addEventListener("mouseup",(function e(){o(!1),document.removeEventListener("mousemove",f),document.removeEventListener("mouseup",e)}))}({u:e,e:t,setPanning:p,setPlotScale:P,factor:.9})})),e.over.addEventListener("wheel",(function(t){if(t.ctrlKey||t.metaKey){t.preventDefault();var n=e.over.getBoundingClientRect().width,r=e.cursor.left&&e.cursor.left>0?e.cursor.left:0,i=e.posToVal(r,"x"),o=(e.scales.x.max||0)-(e.scales.x.min||0),a=t.deltaY<0?.9*o:o/.9,u=i-r/n*a,l=u+a;e.batch((function(){return P({u:e,min:u,max:l})}))}}))},setCursor:function(e){var t,n=null!==(t=e.cursor.idx)&&void 0!==t?t:-1;S((function(e){return ar(ar({},e),{},{dataIdx:n})}))},setSeries:function(e,t){var n=null!==t&&void 0!==t?t:-1;S((function(e){return ar(ar({},e),{},{seriesIdx:n})}))}}}],hooks:{setSelect:[function(e){var t=e.posToVal(e.select.left,"x"),n=e.posToVal(e.select.left+e.select.width,"x");P({u:e,min:t,max:n})}]}}),H=function(e){if(_){switch(e){case Kc.xRange:_.scales.x.range=R;break;case Kc.yRange:Object.keys(a.limits.range).forEach((function(e){_.scales[e]&&(_.scales[e].range=function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1;return j(t,n,r,e)})}));break;case Kc.data:_.setData(t)}d||_.redraw()}};return te((function(){return y({min:o.start,max:o.end})}),[o]),te((function(){if(M([]),S({seriesIdx:-1,dataIdx:-1}),s.current){var e=new Jc(U,t,s.current);return b(e),y({min:o.start,max:o.end}),e.destroy}}),[s.current,n,D]),te((function(){return window.addEventListener("keydown",I),function(){window.removeEventListener("keydown",I)}}),[m]),te((function(){return H(Kc.data)}),[t]),te((function(){return H(Kc.xRange)}),[m]),te((function(){return H(Kc.yRange)}),[a]),te((function(){var e=-1!==E.dataIdx&&-1!==E.seriesIdx;return k(e),e&&window.addEventListener("click",z),function(){window.removeEventListener("click",z)}}),[E,T]),_r("div",{className:Ri()({"vm-line-chart":!0,"vm-line-chart_panning":d}),children:[_r("div",{className:"vm-line-chart__u-plot",ref:s}),_&&x&&_r(fs,{unit:u,u:_,series:n,metrics:i,tooltipIdx:E,tooltipOffset:F,id:B}),_&&T.map((function(e){return h(fs,ar(ar({},e),{},{isSticky:!0,u:_,key:e.id,onClose:$}))}))]})};function hs(){hs=function(){return e};var e={},t=Object.prototype,n=t.hasOwnProperty,r=Object.defineProperty||function(e,t,n){e[t]=n.value},i="function"==typeof Symbol?Symbol:{},o=i.iterator||"@@iterator",a=i.asyncIterator||"@@asyncIterator",u=i.toStringTag||"@@toStringTag";function l(e,t,n){return Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}),e[t]}try{l({},"")}catch(A){l=function(e,t,n){return e[t]=n}}function c(e,t,n,i){var o=t&&t.prototype instanceof d?t:d,a=Object.create(o.prototype),u=new C(i||[]);return r(a,"_invoke",{value:D(e,n,u)}),a}function s(e,t,n){try{return{type:"normal",arg:e.call(t,n)}}catch(A){return{type:"throw",arg:A}}}e.wrap=c;var f={};function d(){}function h(){}function p(){}var v={};l(v,o,(function(){return this}));var m=Object.getPrototypeOf,y=m&&m(m(E([])));y&&y!==t&&n.call(y,o)&&(v=y);var g=p.prototype=d.prototype=Object.create(v);function _(e){["next","throw","return"].forEach((function(t){l(e,t,(function(e){return this._invoke(t,e)}))}))}function b(e,t){function i(r,o,a,u){var l=s(e[r],e,o);if("throw"!==l.type){var c=l.arg,f=c.value;return f&&"object"==Pt(f)&&n.call(f,"__await")?t.resolve(f.__await).then((function(e){i("next",e,a,u)}),(function(e){i("throw",e,a,u)})):t.resolve(f).then((function(e){c.value=e,a(c)}),(function(e){return i("throw",e,a,u)}))}u(l.arg)}var o;r(this,"_invoke",{value:function(e,n){function r(){return new t((function(t,r){i(e,n,t,r)}))}return o=o?o.then(r,r):r()}})}function D(e,t,n){var r="suspendedStart";return function(i,o){if("executing"===r)throw new Error("Generator is already running");if("completed"===r){if("throw"===i)throw o;return S()}for(n.method=i,n.arg=o;;){var a=n.delegate;if(a){var u=w(a,n);if(u){if(u===f)continue;return u}}if("next"===n.method)n.sent=n._sent=n.arg;else if("throw"===n.method){if("suspendedStart"===r)throw r="completed",n.arg;n.dispatchException(n.arg)}else"return"===n.method&&n.abrupt("return",n.arg);r="executing";var l=s(e,t,n);if("normal"===l.type){if(r=n.done?"completed":"suspendedYield",l.arg===f)continue;return{value:l.arg,done:n.done}}"throw"===l.type&&(r="completed",n.method="throw",n.arg=l.arg)}}}function w(e,t){var n=e.iterator[t.method];if(void 0===n){if(t.delegate=null,"throw"===t.method){if(e.iterator.return&&(t.method="return",t.arg=void 0,w(e,t),"throw"===t.method))return f;t.method="throw",t.arg=new TypeError("The iterator does not provide a 'throw' method")}return f}var r=s(n,e.iterator,t.arg);if("throw"===r.type)return t.method="throw",t.arg=r.arg,t.delegate=null,f;var i=r.arg;return i?i.done?(t[e.resultName]=i.value,t.next=e.nextLoc,"return"!==t.method&&(t.method="next",t.arg=void 0),t.delegate=null,f):i:(t.method="throw",t.arg=new TypeError("iterator result is not an object"),t.delegate=null,f)}function x(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function k(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function C(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(x,this),this.reset(!0)}function E(e){if(e){var t=e[o];if(t)return t.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var r=-1,i=function t(){for(;++r=0;--i){var o=this.tryEntries[i],a=o.completion;if("root"===o.tryLoc)return r("end");if(o.tryLoc<=this.prev){var u=n.call(o,"catchLoc"),l=n.call(o,"finallyLoc");if(u&&l){if(this.prev=0;--r){var i=this.tryEntries[r];if(i.tryLoc<=this.prev&&n.call(i,"finallyLoc")&&this.prev=0;--t){var n=this.tryEntries[t];if(n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),k(n),f}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.tryLoc===e){var r=n.completion;if("throw"===r.type){var i=r.arg;k(n)}return i}}throw new Error("illegal catch attempt")},delegateYield:function(e,t,n){return this.delegate={iterator:E(e),resultName:t,nextLoc:n},"next"===this.method&&(this.arg=void 0),f}},e}function ps(e,t,n,r,i,o,a){try{var u=e[o](a),l=u.value}catch(c){return void n(c)}u.done?t(l):Promise.resolve(l).then(r,i)}function vs(e){return function(){var t=this,n=arguments;return new Promise((function(r,i){var o=e.apply(t,n);function a(e){ps(o,r,i,a,u,"next",e)}function u(e){ps(o,r,i,a,u,"throw",e)}a(void 0)}))}}var ms=function(e){var t=e.legend,n=e.onChange,r=St(X(""),2),i=r[0],o=r[1],a=oe((function(){return function(e){var t=Object.keys(e.freeFormFields).filter((function(e){return"__name__"!==e}));return t.map((function(t){var n="".concat(t,'="').concat(e.freeFormFields[t],'"');return{id:"".concat(e.label,".").concat(n),freeField:n,key:t}}))}(t)}),[t]),u=function(){var e=vs(hs().mark((function e(t,n){return hs().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,navigator.clipboard.writeText(t);case 2:o(n),setTimeout((function(){return o("")}),2e3);case 4:case"end":return e.stop()}}),e)})));return function(t,n){return e.apply(this,arguments)}}();return _r("div",{className:Ri()({"vm-legend-item":!0,"vm-legend-item_hide":!t.checked}),onClick:function(e){return function(t){n(e,t.ctrlKey||t.metaKey)}}(t),children:[_r("div",{className:"vm-legend-item__marker",style:{backgroundColor:t.color}}),_r("div",{className:"vm-legend-item-info",children:[_r("span",{className:"vm-legend-item-info__label",children:rs(t.label)}),"\xa0{",a.map((function(e){return _r(xo,{open:i===e.id,title:"Copied!",placement:"top-center",children:_r("span",{className:"vm-legend-item-info__free-fields",onClick:(t=e.freeField,n=e.id,function(e){e.stopPropagation(),u(t,n)}),children:e.freeField},e.key)},e.id);var t,n})),"}"]})]})},ys=function(e){var t=e.labels,n=e.query,r=e.onChange,i=oe((function(){return Array.from(new Set(t.map((function(e){return e.group}))))}),[t]);return _r(m,{children:_r("div",{className:"vm-legend",children:i.map((function(e){return _r("div",{className:"vm-legend-group",children:[_r("div",{className:"vm-legend-group-title",children:[_r("span",{className:"vm-legend-group-title__count",children:["Query ",e,": "]}),_r("span",{className:"vm-legend-group-title__query",children:n[e-1]})]}),_r("div",{children:t.filter((function(t){return t.group===e})).map((function(e){return _r(ms,{legend:e,onChange:r},e.label)}))})]},e)}))})})};function gs(e,t){if(null==e)return{};var n,r,i=function(e,t){if(null==e)return{};var n,r,i={},o=Object.keys(e);for(r=0;r=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var _s=["__name__"],bs=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:": ",r=arguments.length>3&&void 0!==arguments[3]&&arguments[3],i=e.metric,o=i.__name__,a=gs(i,_s),u=t||o||"";return 0===Object.keys(e.metric).length?u||"Result ".concat(e.group):"".concat(u," {").concat(Object.entries(a).map((function(e){return"".concat(e[0]).concat(n).concat(r?'"'.concat(e[1],'"'):e[1])})).join(", "),"}")},Ds=function(e,t,n){var r=bs(e,n[e.group-1]),i="[".concat(e.group,"]").concat(r);return{label:i,freeFormFields:e.metric,width:1.4,stroke:ns(i),show:!xs(i,t),scale:"1",points:{size:4.2,width:1.4}}},ws=function(e,t){return{group:t,label:e.label||"",color:e.stroke,checked:e.show||!1,freeFormFields:e.freeFormFields}},xs=function(e,t){return t.includes("".concat(e))},ks=function(e){switch(e){case"NaN":return NaN;case"Inf":case"+Inf":return 1/0;case"-Inf":return-1/0;default:return parseFloat(e)}},Cs=function(e){var t=e.data,n=void 0===t?[]:t,r=e.period,i=e.customStep,o=e.query,a=e.yaxis,u=e.unit,l=e.showLegend,c=void 0===l||l,s=e.setYaxisLimits,f=e.setPeriod,d=e.alias,h=void 0===d?[]:d,p=e.fullWidth,v=void 0===p||p,m=ri().timezone,y=oe((function(){return i||r.step||1}),[r.step,i]),g=St(X([[]]),2),_=g[0],b=g[1],D=St(X([]),2),w=D[0],x=D[1],k=St(X([]),2),C=k[0],E=k[1],S=St(X([]),2),A=S[0],F=S[1],N=function(e){var t=function(e){var t={},n=Object.values(e).flat(),r=os(n),i=is(n);return t[1]=ls(r,i),t}(e);s(t)};te((function(){var e=[],t={},i=[],o=[{}];null===n||void 0===n||n.forEach((function(n){var r=Ds(n,A,h);o.push(r),i.push(ws(r,n.group));var a,u=t[n.group]||[],l=na(n.values);try{for(l.s();!(a=l.n()).done;){var c=a.value;e.push(c[0]),u.push(ks(c[1]))}}catch(s){l.e(s)}finally{l.f()}t[n.group]=u}));var a=function(e,t,n){for(var r=Array.from(new Set(e)).sort((function(e,t){return e-t})),i=n.start,o=Tr(n.end+t),a=0,u=[];i<=o;){for(;a=r.length||r[a]>i)&&u.push(i)}for(;u.length<2;)u.push(i),i=Tr(i+t);return u}(e,y,r),u=n.map((function(e){var t,n=[],r=e.values,i=r.length,o=0,u=na(a);try{for(u.s();!(t=u.n()).done;){for(var l=t.value;o1e10*h?n.map((function(){return f})):n}));u.unshift(a),N(t),b(u),x(o),E(i)}),[n,m]),te((function(){var e=[],t=[{}];null===n||void 0===n||n.forEach((function(n){var r=Ds(n,A,h);t.push(r),e.push(ws(r,n.group))})),x(t),E(e)}),[A]);var O=re(null);return _r("div",{className:Ri()({"vm-graph-view":!0,"vm-graph-view_full-width":v}),ref:O,children:[(null===O||void 0===O?void 0:O.current)&&_r(ds,{data:_,series:w,metrics:n,period:r,yaxis:a,unit:u,setPeriod:f,container:null===O||void 0===O?void 0:O.current}),c&&_r(ys,{labels:C,query:o,onChange:function(e,t){F(function(e){var t=e.hideSeries,n=e.legend,r=e.metaKey,i=e.series,o=n.label,a=xs(o,t),u=i.map((function(e){return e.label||""}));return r?a?t.filter((function(e){return e!==o})):[].concat(At(t),[o]):t.length?a?At(u.filter((function(e){return e!==o}))):[]:At(u.filter((function(e){return e!==o})))}({hideSeries:A,legend:e,metaKey:t,series:w}))}})]})},Es=function(e){var t=e.value,n=e.options,r=e.anchor,i=e.disabled,o=e.maxWords,a=void 0===o?1:o,u=e.onSelect,l=re(null),s=St(X(!1),2),f=s[0],d=s[1],h=St(X(-1),2),p=h[0],v=h[1],m=oe((function(){if(!f)return[];try{var e=new RegExp(String(t),"i");return n.filter((function(n){return e.test(n)&&n!==t})).sort((function(t,n){var r,i;return((null===(r=t.match(e))||void 0===r?void 0:r.index)||0)-((null===(i=n.match(e))||void 0===i?void 0:i.index)||0)}))}catch(c){return[]}}),[f,n,t]),y=function(){d(!1)},g=function(e){var t=e.key,n=e.ctrlKey,r=e.metaKey,i=e.shiftKey,o=n||r||i,a=m.length;if("ArrowUp"===t&&!o&&a&&(e.preventDefault(),v((function(e){return e<=0?0:e-1}))),"ArrowDown"===t&&!o&&a){e.preventDefault();var l=m.length-1;v((function(e){return e>=l?l:e+1}))}if("Enter"===t){var c=m[p];c&&u(c),y()}"Escape"===t&&y()};return te((function(){var e=(t.match(/[a-zA-Z_:.][a-zA-Z0-9_:.]*/gm)||[]).length;d(t.length>2&&e<=a)}),[t]),te((function(){return function(){if(l.current){var e=l.current.childNodes[p];null!==e&&void 0!==e&&e.scrollIntoView&&e.scrollIntoView({block:"center"})}}(),window.addEventListener("keydown",g),function(){window.removeEventListener("keydown",g)}}),[p,m]),te((function(){v(-1)}),[m]),Do(l,y),_r(wo,{open:f,buttonRef:r,placement:"bottom-left",onClose:y,children:_r("div",{className:"vm-autocomplete",ref:l,children:m.map((function(e,t){return _r("div",{className:Ri()({"vm-list__item":!0,"vm-list__item_active":t===p}),id:"$autocomplete$".concat(e),onClick:(n=e,function(){i||(u(n),y())}),children:e},e);var n}))})})},Ss=function(e){var t=e.value,n=e.onChange,r=e.onEnter,i=e.onArrowUp,o=e.onArrowDown,a=e.autocomplete,u=e.error,l=e.options,c=e.label,s=e.disabled,f=void 0!==s&&s,d=re(null);return _r("div",{className:"vm-query-editor",ref:d,children:[_r($o,{value:t,label:c,type:"textarea",autofocus:!!t,error:u,onKeyDown:function(e){var t=e.key,n=e.ctrlKey,a=e.metaKey,u=e.shiftKey,l=n||a,c="ArrowDown"===t,s="Enter"===t;"ArrowUp"===t&&l&&(e.preventDefault(),i()),c&&l&&(e.preventDefault(),o()),s&&!u&&r()},onChange:n,disabled:f}),a&&_r(Es,{value:t,options:l,anchor:d,onSelect:function(e){n(e)}})]})},As=n(936),Fs=n.n(As),Ns=function(e){var t=e.defaultStep,n=e.setStep,r=St(X(t),2),i=r[0],o=r[1],a=St(X(""),2),u=a[0],l=a[1],c=ae(Fs()((function(e){return n(e||1)}),700),[]),s=function(e){e>0?(o(e),c(e),l("")):l("step is out of allowed range")};return te((function(){t&&s(t)}),[t]),_r($o,{label:"Step value",type:"number",value:i,error:u,onChange:function(e){var t=+e;t&&s(t)},endIcon:_r(xo,{title:"Reset step to default",children:_r(bo,{variant:"text",size:"small",startIcon:_r(pi,{}),onClick:function(){s(t||1)}})})})},Os=function(){var e=ur().serverURL,t=Dr().tenantId,n=wr(),r=ii(),i=St(X(t||0),2),o=i[0],a=i[1],u=ae(Fs()((function(t){var i=Number(t);if(n({type:"SET_TENANT_ID",payload:i}),e){var o=e.replace(/(\/select\/)([\d]+)(\/prometheus)/gim,"$1".concat(i,"$3"));n({type:"SET_SERVER",payload:o}),r({type:"RUN_QUERY"})}}),700),[]);return te((function(){o!==t&&a(t)}),[t]),_r($o,{label:"Tenant ID",type:"number",value:o,onChange:function(e){a(e),u(e)},endIcon:_r(xo,{title:"Define tenant id if you need request to another storage",children:_r(bo,{variant:"text",size:"small",startIcon:_r(vi,{})})})})},Ts=function(e){var t,n=e.value,r=void 0!==n&&n,i=e.disabled,o=void 0!==i&&i,a=e.label,u=e.color,l=void 0===u?"secondary":u,c=e.onChange;return _r("div",{className:Ri()((er(t={"vm-switch":!0,"vm-switch_disabled":o,"vm-switch_active":r},"vm-switch_".concat(l,"_active"),r),er(t,"vm-switch_".concat(l),l),t)),onClick:function(){o||c(!r)},children:[_r("div",{className:"vm-switch-track",children:_r("div",{className:"vm-switch-track__thumb"})}),a&&_r("span",{className:"vm-switch__label",children:a})]})},Ms=function(){var e=ro(),t=ur().inputTenantID,n=ci().autocomplete,r=si(),i=Ki(),o=i.nocache,a=i.isTracingEnabled,u=Xi(),l=ri().period.step;return _r("div",{className:"vm-additional-settings",children:[_r(Ts,{label:"Autocomplete",value:n,onChange:function(){r({type:"TOGGLE_AUTOCOMPLETE"})}}),_r(Ts,{label:"Disable cache",value:o,onChange:function(){u({type:"TOGGLE_NO_CACHE"})}}),_r(Ts,{label:"Trace query",value:a,onChange:function(){u({type:"TOGGLE_QUERY_TRACING"})}}),_r("div",{className:"vm-additional-settings__input",children:_r(Ns,{defaultStep:l,setStep:function(t){e({type:"SET_CUSTOM_STEP",payload:t})}})}),!!t&&_r("div",{className:"vm-additional-settings__input",children:_r(Os,{})})]})};var Bs=function(e){var t=re();return te((function(){t.current=e}),[e]),t.current},Ls=function(e,t){return e.length===t.length&&e.every((function(e,n){return e===t[n]}))},Ps=function(e){var t=e.error,n=e.queryOptions,r=e.onHideQuery,i=ci(),o=i.query,a=i.queryHistory,u=i.autocomplete,l=si(),c=ii(),s=St(X(o||[]),2),f=s[0],d=s[1],h=St(X([]),2),p=h[0],v=h[1],m=Bs(f),y=function(){l({type:"SET_QUERY_HISTORY",payload:f.map((function(e,t){var n=a[t]||{values:[]},r=e===n.values[n.values.length-1];return{index:n.values.length-Number(r),values:!r&&e?[].concat(At(n.values),[e]):n.values}}))}),l({type:"SET_QUERY",payload:f}),c({type:"RUN_QUERY"})},g=function(e,t){d((function(n){return n.map((function(n,r){return r===t?e:n}))}))},_=function(e,t){return function(){!function(e,t){var n=a[t],r=n.index,i=n.values,o=r+e;o<0||o>=i.length||(g(i[o]||"",t),l({type:"SET_QUERY_HISTORY_BY_INDEX",payload:{value:{values:i,index:o},queryNumber:t}}))}(e,t)}},b=function(e){return function(t){g(t,e)}},D=function(e){return function(){var t;t=e,d((function(e){return e.filter((function(e,n){return n!==t}))})),v((function(t){return t.includes(e)?t.filter((function(t){return t!==e})):t.map((function(t){return t>e?t-1:t}))}))}},w=function(e){return function(t){!function(e,t){var n=e.ctrlKey,r=e.metaKey;if(n||r){var i=f.map((function(e,t){return t})).filter((function(e){return e!==t}));v((function(e){return Ls(i,e)?[]:i}))}else v((function(e){return e.includes(t)?e.filter((function(e){return e!==t})):[].concat(At(e),[t])}))}(t,e)}};return te((function(){m&&f.length1&&_r(xo,{title:"Remove Query",children:_r("div",{className:"vm-query-configurator-list-row__button",children:_r(bo,{variant:"text",color:"error",startIcon:_r(Ti,{}),onClick:D(r)})})})]},r)}))}),_r("div",{className:"vm-query-configurator-settings",children:[_r(Ms,{}),_r("div",{className:"vm-query-configurator-settings__buttons",children:[f.length<4&&_r(bo,{variant:"outlined",onClick:function(){d((function(e){return[].concat(At(e),[""])}))},startIcon:_r(Mi,{}),children:"Add Query"}),_r(bo,{variant:"contained",onClick:y,startIcon:_r(Si,{}),children:"Execute Query"})]})]})]})};function Is(e){var t,n,r,i=2;for("undefined"!=typeof Symbol&&(n=Symbol.asyncIterator,r=Symbol.iterator);i--;){if(n&&null!=(t=e[n]))return t.call(e);if(r&&null!=(t=e[r]))return new zs(t.call(e));n="@@asyncIterator",r="@@iterator"}throw new TypeError("Object is not async iterable")}function zs(e){function t(e){if(Object(e)!==e)return Promise.reject(new TypeError(e+" is not an object."));var t=e.done;return Promise.resolve(e.value).then((function(e){return{value:e,done:t}}))}return zs=function(e){this.s=e,this.n=e.next},zs.prototype={s:null,n:null,next:function(){return t(this.n.apply(this.s,arguments))},return:function(e){var n=this.s.return;return void 0===n?Promise.resolve({value:e,done:!0}):t(n.apply(this.s,arguments))},throw:function(e){var n=this.s.return;return void 0===n?Promise.reject(e):t(n.apply(this.s,arguments))}},new zs(e)}var $s=0,Rs=function(){function e(t,n){Ft(this,e),this.tracing=void 0,this.query=void 0,this.tracingChildren=void 0,this.originalTracing=void 0,this.id=void 0,this.tracing=t,this.originalTracing=JSON.parse(JSON.stringify(t)),this.query=n,this.id=$s++;var r=t.children||[];this.tracingChildren=r.map((function(t){return new e(t,n)}))}return Ot(e,[{key:"queryValue",get:function(){return this.query}},{key:"idValue",get:function(){return this.id}},{key:"children",get:function(){return this.tracingChildren}},{key:"message",get:function(){return this.tracing.message}},{key:"duration",get:function(){return this.tracing.duration_msec}},{key:"JSON",get:function(){return JSON.stringify(this.tracing,null,2)}},{key:"originalJSON",get:function(){return JSON.stringify(this.originalTracing,null,2)}},{key:"setTracing",value:function(t){var n=this;this.tracing=t;var r=t.children||[];this.tracingChildren=r.map((function(t){return new e(t,n.query)}))}},{key:"setQuery",value:function(e){this.query=e}},{key:"resetTracing",value:function(){this.tracing=this.originalTracing}}]),e}(),js=function(e){var t=e.predefinedQuery,n=e.visible,r=e.display,i=e.customStep,o=e.hideQuery,a=e.showAllSeries,u=ci().query,l=ri().period,c=Ki(),s=c.displayType,f=c.nocache,d=c.isTracingEnabled,h=c.seriesLimits,p=Dr().serverUrl,v=St(X(!1),2),m=v[0],y=v[1],g=St(X(),2),_=g[0],b=g[1],D=St(X(),2),w=D[0],x=D[1],k=St(X(),2),C=k[0],E=k[1],S=St(X(),2),A=S[0],F=S[1],N=St(X(),2),O=N[0],T=N[1],M=St(X([]),2),B=M[0],L=M[1];te((function(){A&&(b(void 0),x(void 0),E(void 0))}),[A]);var P=function(){var e=vs(hs().mark((function e(t){var n,r,i,o,a,u,l,c,s,f,d,h;return hs().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.fetchUrl,r=t.fetchQueue,i=t.displayType,o=t.query,a=t.stateSeriesLimits,u=t.showAllSeries,l=new AbortController,L([].concat(At(r),[l])),e.prev=3,e.delegateYield(hs().mark((function e(){var t,r,p,v,m,y,g,_,D,w,k,C;return hs().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:t="chart"===i,r=u?1/0:a[i],p=[],v=[],m=1,y=0,c=!1,s=!1,e.prev=8,d=Is(n);case 10:return e.next=12,d.next();case 12:if(!(c=!(h=e.sent).done)){e.next=24;break}return g=h.value,e.next=16,fetch(g,{signal:l.signal});case 16:return _=e.sent,e.next=19,_.json();case 19:D=e.sent,_.ok?(F(void 0),D.trace&&(w=new Rs(D.trace,o[m-1]),v.push(w)),k=r-p.length,D.data.result.slice(0,k).forEach((function(e){e.group=m,p.push(e)})),y+=D.data.result.length,m++):F("".concat(D.errorType,"\r\n").concat(null===D||void 0===D?void 0:D.error));case 21:c=!1,e.next=10;break;case 24:e.next=30;break;case 26:e.prev=26,e.t0=e.catch(8),s=!0,f=e.t0;case 30:if(e.prev=30,e.prev=31,!c||null==d.return){e.next=35;break}return e.next=35,d.return();case 35:if(e.prev=35,!s){e.next=38;break}throw f;case 38:return e.finish(35);case 39:return e.finish(30);case 40:C="Showing ".concat(r," series out of ").concat(y," series due to performance reasons. Please narrow down the query, so it returns less series"),T(y>r?C:""),t?b(p):x(p),E(v);case 44:case"end":return e.stop()}}),e,null,[[8,26,30,40],[31,,35,39]])}))(),"t0",5);case 5:e.next=10;break;case 7:e.prev=7,e.t1=e.catch(3),e.t1 instanceof Error&&"AbortError"!==e.t1.name&&F("".concat(e.t1.name,": ").concat(e.t1.message));case 10:y(!1);case 11:case"end":return e.stop()}}),e,null,[[3,7]])})));return function(t){return e.apply(this,arguments)}}(),I=ae(Fs()(P,800),[]),z=function(e,t){var n=e.trim(),r=!o||!o.includes(t);return n&&r},$=oe((function(){var e=null!==t&&void 0!==t?t:u,n="chart"===(r||s);if(l)if(p)if(e.every((function(e){return!e.trim()})))F(To.validQuery);else{if(Ro(p)){var o=ar({},l);return o.step=i,e.filter(z).map((function(e){return n?function(e,t,n,r,i){return"".concat(e,"/api/v1/query_range?query=").concat(encodeURIComponent(t),"&start=").concat(n.start,"&end=").concat(n.end,"&step=").concat(n.step).concat(r?"&nocache=1":"").concat(i?"&trace=1":"")}(p,e,o,f,d):function(e,t,n,r){return"".concat(e,"/api/v1/query?query=").concat(encodeURIComponent(t),"&time=").concat(n.end,"&step=").concat(n.step).concat(r?"&trace=1":"")}(p,e,o,d)}))}F(To.validServer)}else F(To.emptyServer)}),[p,l,s,i,o]);return te((function(){n&&null!==$&&void 0!==$&&$.length&&(y(!0),I({fetchUrl:$,fetchQueue:B,displayType:r||s,query:null!==t&&void 0!==t?t:u,stateSeriesLimits:h,showAllSeries:a}))}),[$,n,h,a]),te((function(){var e=B.slice(0,-1);e.length&&(e.map((function(e){return e.abort()})),L(B.filter((function(e){return!e.signal.aborted}))))}),[B]),{fetchUrl:$,isLoading:m,graphData:_,liveData:w,error:A,warning:O,traces:C}},Us=function(e){var t=e.data,n=go().showInfoMessage,r=oe((function(){return JSON.stringify(t,null,2)}),[t]);return _r("div",{className:"vm-json-view",children:[_r("div",{className:"vm-json-view__copy",children:_r(bo,{variant:"outlined",onClick:function(){navigator.clipboard.writeText(r),n({text:"Formatted JSON has been copied",type:"success"})},children:"Copy JSON"})}),_r("pre",{className:"vm-json-view__code",children:_r("code",{children:r})})]})},Hs=function(e){var t=e.yaxis,n=e.setYaxisLimits,r=e.toggleEnableLimits,i=oe((function(){return Object.keys(t.limits.range)}),[t.limits.range]),o=ae(Fs()((function(e,r,i){var o=t.limits.range;o[r][i]=+e,o[r][0]===o[r][1]||o[r][0]>o[r][1]||n(o)}),500),[t.limits.range]),a=function(e,t){return function(n){o(n,e,t)}};return _r("div",{className:"vm-axes-limits",children:[_r(Ts,{value:t.limits.enable,onChange:r,label:"Fix the limits for y-axis"}),_r("div",{className:"vm-axes-limits-list",children:i.map((function(e){return _r("div",{className:"vm-axes-limits-list__inputs",children:[_r($o,{label:"Min ".concat(e),type:"number",disabled:!t.limits.enable,value:t.limits.range[e][0],onChange:a(e,0)}),_r($o,{label:"Max ".concat(e),type:"number",disabled:!t.limits.enable,value:t.limits.range[e][1],onChange:a(e,1)})]},e)}))})]})},Ys="Axes settings",Vs=function(e){var t=e.yaxis,n=e.setYaxisLimits,r=e.toggleEnableLimits,i=re(null),o=St(X(!1),2),a=o[0],u=o[1],l=re(null);Do(i,(function(){return u(!1)}),l);var c=function(){u(!1)};return _r("div",{className:"vm-graph-settings",children:[_r(xo,{title:Ys,children:_r("div",{ref:l,children:_r(bo,{variant:"text",startIcon:_r(di,{}),onClick:function(){u((function(e){return!e}))}})})}),_r(wo,{open:a,buttonRef:l,placement:"bottom-right",onClose:c,children:_r("div",{className:"vm-graph-settings-popper",ref:i,children:[_r("div",{className:"vm-popper-header",children:[_r("h3",{className:"vm-popper-header__title",children:Ys}),_r(bo,{size:"small",startIcon:_r(hi,{}),onClick:c})]}),_r("div",{className:"vm-graph-settings-popper__body",children:_r(Hs,{yaxis:t,setYaxisLimits:n,toggleEnableLimits:r})})]})})]})},qs=function(e){var t=e.containerStyles,n=void 0===t?{}:t,r=e.message;return _r("div",{className:"vm-spinner",style:n&&{},children:[_r("div",{className:"half-circle-spinner",children:[_r("div",{className:"circle circle-1"}),_r("div",{className:"circle circle-2"})]}),r&&_r("div",{className:"vm-spinner__message",children:r})]})},Ws=function(){var e=Dr().serverUrl,t=St(X([]),2),n=t[0],r=t[1],i=function(){var t=vs(hs().mark((function t(){var n,i,o;return hs().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(e){t.next=2;break}return t.abrupt("return");case 2:return n="".concat(e,"/api/v1/label/__name__/values"),t.prev=3,t.next=6,fetch(n);case 6:return i=t.sent,t.next=9,i.json();case 9:o=t.sent,i.ok&&r(o.data),t.next=16;break;case 13:t.prev=13,t.t0=t.catch(3),console.error(t.t0);case 16:case"end":return t.stop()}}),t,null,[[3,13]])})));return function(){return t.apply(this,arguments)}}();return te((function(){i()}),[e]),{queryOptions:n}},Qs=function(e){var t=e.value;return _r("div",{className:"vm-line-progress",children:[_r("div",{className:"vm-line-progress-track",children:_r("div",{className:"vm-line-progress-track__thumb",style:{width:"".concat(t,"%")}})}),_r("span",{children:[t.toFixed(2),"%"]})]})},Gs=function e(t){var n,r=t.trace,i=t.totalMsec,o=St(X({}),2),a=o[0],u=o[1],l=r.children&&!!r.children.length,c=r.duration/i*100;return _r("div",{className:"vm-nested-nav",children:[_r("div",{className:"vm-nested-nav-header",onClick:(n=r.idValue,function(){u((function(e){return ar(ar({},e),{},er({},n,!e[n]))}))}),children:[l&&_r("div",{className:Ri()({"vm-nested-nav-header__icon":!0,"vm-nested-nav-header__icon_open":a[r.idValue]}),children:_r(Di,{})}),_r("div",{className:"vm-nested-nav-header__progress",children:_r(Qs,{value:c})}),_r("div",{className:"vm-nested-nav-header__message",children:r.message}),_r("div",{className:"vm-nested-nav-header__duration",children:"duration: ".concat(r.duration," ms")})]}),a[r.idValue]&&_r("div",{children:l&&r.children.map((function(t){return _r(e,{trace:t,totalMsec:i},t.duration)}))})]})},Js=function(e){var t=e.editable,n=void 0!==t&&t,r=e.defaultTile,i=void 0===r?"JSON":r,o=e.displayTitle,a=void 0===o||o,u=e.defaultJson,l=void 0===u?"":u,s=e.resetValue,f=void 0===s?"":s,d=e.onClose,h=e.onUpload,p=go().showInfoMessage,v=St(X(l),2),m=v[0],y=v[1],g=St(X(i),2),_=g[0],b=g[1],D=St(X(""),2),w=D[0],x=D[1],k=St(X(""),2),C=k[0],E=k[1],S=oe((function(){try{var e=JSON.parse(m),t=e.trace||e;return t.duration_msec?(new Rs(t,""),""):To.traceNotFound}catch(c){return c instanceof Error?c.message:"Unknown error"}}),[m]),A=function(){var e=vs(hs().mark((function e(){return hs().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,navigator.clipboard.writeText(m);case 2:p({text:"Formatted JSON has been copied",type:"success"});case 3:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}(),F=function(){E(S),_.trim()||x(To.emptyTitle),S||w||(h(m,_),d())};return _r("div",{className:Ri()({"vm-json-form":!0,"vm-json-form_one-field":!a}),children:[a&&_r($o,{value:_,label:"Title",error:w,onEnter:F,onChange:function(e){b(e)}}),_r($o,{value:m,label:"JSON",type:"textarea",error:C,autofocus:!0,onChange:function(e){E(""),y(e)},disabled:!n}),_r("div",{className:"vm-json-form-footer",children:[_r("div",{className:"vm-json-form-footer__controls",children:[_r(bo,{variant:"outlined",startIcon:_r(Ii,{}),onClick:A,children:"Copy JSON"}),f&&_r(bo,{variant:"text",startIcon:_r(pi,{}),onClick:function(){y(f)},children:"Reset JSON"})]}),_r("div",{className:"vm-json-form-footer__controls vm-json-form-footer__controls_right",children:[_r(bo,{variant:"outlined",color:"error",onClick:d,children:"Cancel"}),_r(bo,{variant:"contained",onClick:F,children:"apply"})]})]})]})},Zs=function(e){var t=e.traces,n=e.jsonEditor,r=void 0!==n&&n,i=e.onDeleteClick,o=St(X(null),2),a=o[0],u=o[1],l=function(){u(null)};if(!t.length)return _r(mo,{variant:"info",children:"Please re-run the query to see results of the tracing"});var s=function(e){return function(){i(e)}};return _r(m,{children:[_r("div",{className:"vm-tracings-view",children:t.map((function(e){return _r("div",{className:"vm-tracings-view-trace vm-block vm-block_empty-padding",children:[_r("div",{className:"vm-tracings-view-trace-header",children:[_r("h3",{className:"vm-tracings-view-trace-header-title",children:["Trace for ",_r("b",{className:"vm-tracings-view-trace-header-title__query",children:e.queryValue})]}),_r(xo,{title:"Open JSON",children:_r(bo,{variant:"text",startIcon:_r(Oi,{}),onClick:(t=e,function(){u(t)})})}),_r(xo,{title:"Remove trace",children:_r(bo,{variant:"text",color:"error",startIcon:_r(Ti,{}),onClick:s(e)})})]}),_r("nav",{className:"vm-tracings-view-trace__nav",children:_r(Gs,{trace:e,totalMsec:e.duration})})]},e.idValue);var t}))}),a&&_r(Uo,{title:a.queryValue,onClose:l,children:_r(Js,{editable:r,displayTitle:r,defaultTile:a.queryValue,defaultJson:a.JSON,resetValue:a.originalJSON,onClose:l,onUpload:function(e,t){if(r&&a)try{a.setTracing(JSON.parse(e)),a.setQuery(t),u(null)}catch(c){console.error(c)}}})})]})},Ks=function(e,t){return oe((function(){var n={};e.forEach((function(e){return Object.entries(e.metric).forEach((function(e){return n[e[0]]?n[e[0]].options.add(e[1]):n[e[0]]={options:new Set([e[1]])}}))}));var r=Object.entries(n).map((function(e){return{key:e[0],variations:e[1].options.size}})).sort((function(e,t){return e.variations-t.variations}));return t?r.filter((function(e){return t.includes(e.key)})):r}),[e,t])},Xs=function(e){var t,n=e.checked,r=void 0!==n&&n,i=e.disabled,o=void 0!==i&&i,a=e.label,u=e.color,l=void 0===u?"secondary":u,c=e.onChange;return _r("div",{className:Ri()((er(t={"vm-checkbox":!0,"vm-checkbox_disabled":o,"vm-checkbox_active":r},"vm-checkbox_".concat(l,"_active"),r),er(t,"vm-checkbox_".concat(l),l),t)),onClick:function(){o||c(!r)},children:[_r("div",{className:"vm-checkbox-track",children:_r("div",{className:"vm-checkbox-track__thumb",children:_r(Bi,{})})}),a&&_r("span",{className:"vm-checkbox__label",children:a})]})},ef="Table settings",tf=function(e){var t=e.data,n=e.defaultColumns,r=void 0===n?[]:n,i=e.onChange,o=Ki().tableCompact,a=Xi(),u=Ks(t),l=re(null),c=St(X(!1),2),s=c[0],f=c[1],d=oe((function(){return!u.length}),[u]),h=function(){f(!1)},p=function(e){return function(){!function(e){i(r.includes(e)?r.filter((function(t){return t!==e})):[].concat(At(r),[e]))}(e)}};return te((function(){var e=u.map((function(e){return e.key}));Ls(e,r)||i(e)}),[u]),_r("div",{className:"vm-table-settings",children:[_r(xo,{title:ef,children:_r("div",{ref:l,children:_r(bo,{variant:"text",startIcon:_r(di,{}),onClick:function(){f((function(e){return!e}))},disabled:d})})}),_r(wo,{open:s,onClose:h,placement:"bottom-right",buttonRef:l,children:_r("div",{className:"vm-table-settings-popper",children:[_r("div",{className:"vm-popper-header",children:[_r("h3",{className:"vm-popper-header__title",children:ef}),_r(bo,{onClick:h,startIcon:_r(hi,{}),size:"small"})]}),_r("div",{className:"vm-table-settings-popper-list",children:_r(Ts,{label:"Compact view",value:o,onChange:function(){a({type:"TOGGLE_TABLE_COMPACT"})}})}),_r("div",{className:"vm-table-settings-popper-list",children:[_r("div",{className:"vm-table-settings-popper-list-header",children:[_r("h3",{className:"vm-table-settings-popper-list-header__title",children:"Display columns"}),_r(xo,{title:"Reset to default",children:_r(bo,{color:"primary",variant:"text",size:"small",onClick:function(){f(!1),i(u.map((function(e){return e.key})))},startIcon:_r(pi,{})})})]}),u.map((function(e){return _r("div",{className:"vm-table-settings-popper-list__item",children:_r(Xs,{checked:r.includes(e.key),onChange:p(e.key),label:e.key,disabled:o})},e.key)}))]})]})})]})};function nf(e){return function(e,t){return Object.fromEntries(Object.entries(e).filter(t))}(e,(function(e){return!!e[1]}))}var rf=["__name__"],of=function(e){var t=e.data,n=e.displayColumns,r=go().showInfoMessage,i=Ki().tableCompact,o=So(document.body),a=re(null),u=St(X(0),2),l=u[0],c=u[1],s=St(X(0),2),f=s[0],d=s[1],h=St(X(""),2),p=h[0],v=h[1],m=St(X("asc"),2),y=m[0],g=m[1],_=i?Ks([{group:0,metric:{Data:"Data"}}],["Data"]):Ks(t,n),b=function(e){var t=e.__name__,n=gs(e,rf);return t||Object.keys(n).length?"".concat(t," ").concat(JSON.stringify(n)):""},D=oe((function(){var e=null===t||void 0===t?void 0:t.map((function(e){return{metadata:_.map((function(t){return i?bs(e,void 0,"=",!0):e.metric[t.key]||"-"})),value:e.value?e.value[1]:"-",copyValue:b(e.metric)}})),n="Value"===p,r=_.findIndex((function(e){return e.key===p}));return n||-1!==r?e.sort((function(e,t){var i=n?Number(e.value):e.metadata[r],o=n?Number(t.value):t.metadata[r];return("asc"===y?io)?-1:1})):e}),[_,t,p,y,i]),w=oe((function(){return D.some((function(e){return e.copyValue}))}),[D]),x=function(){var e=vs(hs().mark((function e(t){return hs().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,navigator.clipboard.writeText(t);case 2:r({text:"Row has been copied",type:"success"});case 3:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}(),k=function(e){return function(){!function(e){g((function(t){return"asc"===t&&p===e?"desc":"asc"})),v(e)}(e)}},C=function(){if(a.current){var e=a.current.getBoundingClientRect().top;d(e<0?window.scrollY-l:0)}};return te((function(){return window.addEventListener("scroll",C),function(){window.removeEventListener("scroll",C)}}),[a,l,o]),te((function(){if(a.current){var e=a.current.getBoundingClientRect().top;c(e+window.scrollY)}}),[a,o]),D.length?_r("div",{className:"vm-table-view",children:_r("table",{className:"vm-table",ref:a,children:[_r("thead",{className:"vm-table-header",children:_r("tr",{className:"vm-table__row vm-table__row_header",style:{transform:"translateY(".concat(f,"px)")},children:[_.map((function(e,t){return _r("td",{className:"vm-table-cell vm-table-cell_header vm-table-cell_sort",onClick:k(e.key),children:_r("div",{className:"vm-table-cell__content",children:[e.key,_r("div",{className:Ri()({"vm-table__sort-icon":!0,"vm-table__sort-icon_active":p===e.key,"vm-table__sort-icon_desc":"desc"===y&&p===e.key}),children:_r(wi,{})})]})},t)})),_r("td",{className:"vm-table-cell vm-table-cell_header vm-table-cell_right vm-table-cell_sort",onClick:k("Value"),children:_r("div",{className:"vm-table-cell__content",children:[_r("div",{className:Ri()({"vm-table__sort-icon":!0,"vm-table__sort-icon_active":"Value"===p,"vm-table__sort-icon_desc":"desc"===y}),children:_r(wi,{})}),"Value"]})}),w&&_r("td",{className:"vm-table-cell vm-table-cell_header"})]})}),_r("tbody",{className:"vm-table-body",children:D.map((function(e,t){return _r("tr",{className:"vm-table__row",children:[e.metadata.map((function(e,n){return _r("td",{className:Ri()({"vm-table-cell vm-table-cell_no-wrap":!0,"vm-table-cell_gray":D[t-1]&&D[t-1].metadata[n]===e}),children:e},n)})),_r("td",{className:"vm-table-cell vm-table-cell_right",children:e.value}),w&&_r("td",{className:"vm-table-cell vm-table-cell_right",children:e.copyValue&&_r("div",{className:"vm-table-cell__content",children:_r(xo,{title:"Copy row",children:_r(bo,{variant:"text",color:"gray",size:"small",startIcon:_r(Ii,{}),onClick:(n=e.copyValue,function(){x(n)})})})})})]},t);var n}))})]})}):_r(mo,{variant:"warning",children:"No data to show"})},af=function(){var e=Ki(),t=e.displayType,n=e.isTracingEnabled,r=ci().query,i=ri().period,o=ii();!function(){var e=Dr().tenantId,t=Ki().displayType,n=ci().query,r=ri(),i=r.duration,o=r.relativeTime,a=r.period,u=a.date,l=a.step,c=function(){var r={};n.forEach((function(n,a){var c,s="g".concat(a);r["".concat(s,".expr")]=n,r["".concat(s,".range_input")]=i,r["".concat(s,".end_input")]=u,r["".concat(s,".step_input")]=l,r["".concat(s,".tab")]=(null===(c=Yi.find((function(e){return e.value===t})))||void 0===c?void 0:c.prometheusCode)||0,r["".concat(s,".relative_time")]=o,r["".concat(s,".tenantID")]=e})),pr(nf(r))};te(c,[e,t,n,i,o,u,l]),te(c,[])}();var a=St(X(),2),u=a[0],l=a[1],c=St(X([]),2),s=c[0],f=c[1],d=St(X([]),2),h=d[0],p=d[1],v=St(X(!1),2),m=v[0],y=v[1],g=ue(no).state,_=g.customStep,b=g.yaxis,D=ro(),w=Ws().queryOptions,x=js({visible:!0,customStep:_,hideQuery:h,showAllSeries:m}),k=x.isLoading,C=x.liveData,E=x.graphData,S=x.error,A=x.warning,F=x.traces,N=function(e){D({type:"SET_YAXIS_LIMITS",payload:e})};return te((function(){F&&f([].concat(At(s),At(F)))}),[F]),te((function(){f([])}),[t]),te((function(){y(!1)}),[r]),_r("div",{className:"vm-custom-panel",children:[_r(Ps,{error:S,queryOptions:w,onHideQuery:function(e){p(e)}}),n&&_r("div",{className:"vm-custom-panel__trace",children:_r(Zs,{traces:s,onDeleteClick:function(e){var t=s.filter((function(t){return t.idValue!==e.idValue}));f(At(t))}})}),k&&_r(qs,{}),S&&_r(mo,{variant:"error",children:S}),A&&_r(mo,{variant:"warning",children:_r("div",{className:"vm-custom-panel__warning",children:[_r("p",{children:A}),_r(bo,{color:"warning",variant:"outlined",onClick:function(){y(!0)},children:"Show all"})]})}),_r("div",{className:"vm-custom-panel-body vm-block",children:[_r("div",{className:"vm-custom-panel-body-header",children:[_r(Vi,{}),"chart"===t&&_r(Vs,{yaxis:b,setYaxisLimits:N,toggleEnableLimits:function(){D({type:"TOGGLE_ENABLE_YAXIS_LIMITS"})}}),"table"===t&&_r(tf,{data:C||[],defaultColumns:u,onChange:l})]}),E&&i&&"chart"===t&&_r(Cs,{data:E,period:i,customStep:_,query:r,yaxis:b,setYaxisLimits:N,setPeriod:function(e){var t=e.from,n=e.to;o({type:"SET_PERIOD",payload:{from:t,to:n}})}}),C&&"code"===t&&_r(Us,{data:C}),C&&"table"===t&&_r(of,{data:C,displayColumns:u})]})]})},uf=function(){var e=vs(hs().mark((function e(t){var n,r;return hs().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,fetch("./dashboards/".concat(t));case 2:return n=e.sent,e.next=5,n.json();case 5:return r=e.sent,e.abrupt("return",r);case 7:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}(),lf=vs(hs().mark((function e(){var t;return hs().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=window.__VMUI_PREDEFINED_DASHBOARDS__,e.next=3,Promise.all(t.map(function(){var e=vs(hs().mark((function e(t){return hs().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",uf(t));case 1:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}()));case 3:return e.abrupt("return",e.sent);case 4:case"end":return e.stop()}}),e)})));function cf(){return{async:!1,baseUrl:null,breaks:!1,extensions:null,gfm:!0,headerIds:!0,headerPrefix:"",highlight:null,langPrefix:"language-",mangle:!0,pedantic:!1,renderer:null,sanitize:!1,sanitizer:null,silent:!1,smartypants:!1,tokenizer:null,walkTokens:null,xhtml:!1}}var sf={async:!1,baseUrl:null,breaks:!1,extensions:null,gfm:!0,headerIds:!0,headerPrefix:"",highlight:null,langPrefix:"language-",mangle:!0,pedantic:!1,renderer:null,sanitize:!1,sanitizer:null,silent:!1,smartypants:!1,tokenizer:null,walkTokens:null,xhtml:!1};var ff=/[&<>"']/,df=/[&<>"']/g,hf=/[<>"']|&(?!#?\w+;)/,pf=/[<>"']|&(?!#?\w+;)/g,vf={"&":"&","<":"<",">":">",'"':""","'":"'"},mf=function(e){return vf[e]};function yf(e,t){if(t){if(ff.test(e))return e.replace(df,mf)}else if(hf.test(e))return e.replace(pf,mf);return e}var gf=/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/gi;function _f(e){return e.replace(gf,(function(e,t){return"colon"===(t=t.toLowerCase())?":":"#"===t.charAt(0)?"x"===t.charAt(1)?String.fromCharCode(parseInt(t.substring(2),16)):String.fromCharCode(+t.substring(1)):""}))}var bf=/(^|[^\[])\^/g;function Df(e,t){e="string"===typeof e?e:e.source,t=t||"";var n={replace:function(t,r){return r=(r=r.source||r).replace(bf,"$1"),e=e.replace(t,r),n},getRegex:function(){return new RegExp(e,t)}};return n}var wf=/[^\w:]/g,xf=/^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;function kf(e,t,n){if(e){var r;try{r=decodeURIComponent(_f(n)).replace(wf,"").toLowerCase()}catch(c){return null}if(0===r.indexOf("javascript:")||0===r.indexOf("vbscript:")||0===r.indexOf("data:"))return null}t&&!xf.test(n)&&(n=function(e,t){Cf[" "+e]||(Ef.test(e)?Cf[" "+e]=e+"/":Cf[" "+e]=Tf(e,"/",!0));var n=-1===(e=Cf[" "+e]).indexOf(":");return"//"===t.substring(0,2)?n?t:e.replace(Sf,"$1")+t:"/"===t.charAt(0)?n?t:e.replace(Af,"$1")+t:e+t}(t,n));try{n=encodeURI(n).replace(/%25/g,"%")}catch(c){return null}return n}var Cf={},Ef=/^[^:]+:\/*[^/]*$/,Sf=/^([^:]+:)[\s\S]*$/,Af=/^([^:]+:\/*[^/]*)[\s\S]*$/;var Ff={exec:function(){}};function Nf(e){for(var t,n,r=1;r=0&&"\\"===n[i];)r=!r;return r?"|":" |"})).split(/ \|/),r=0;if(n[0].trim()||n.shift(),n.length>0&&!n[n.length-1].trim()&&n.pop(),n.length>t)n.splice(t);else for(;n.length1;)1&t&&(n+=e),t>>=1,e+=e;return n+e}function Lf(e,t,n,r){var i=t.href,o=t.title?yf(t.title):null,a=e[1].replace(/\\([\[\]])/g,"$1");if("!"!==e[0].charAt(0)){r.state.inLink=!0;var u={type:"link",raw:n,href:i,title:o,text:a,tokens:r.inlineTokens(a)};return r.state.inLink=!1,u}return{type:"image",raw:n,href:i,title:o,text:yf(a)}}var Pf=function(){function e(t){Ft(this,e),this.options=t||sf}return Ot(e,[{key:"space",value:function(e){var t=this.rules.block.newline.exec(e);if(t&&t[0].length>0)return{type:"space",raw:t[0]}}},{key:"code",value:function(e){var t=this.rules.block.code.exec(e);if(t){var n=t[0].replace(/^ {1,4}/gm,"");return{type:"code",raw:t[0],codeBlockStyle:"indented",text:this.options.pedantic?n:Tf(n,"\n")}}}},{key:"fences",value:function(e){var t=this.rules.block.fences.exec(e);if(t){var n=t[0],r=function(e,t){var n=e.match(/^(\s+)(?:```)/);if(null===n)return t;var r=n[1];return t.split("\n").map((function(e){var t=e.match(/^\s+/);return null===t?e:St(t,1)[0].length>=r.length?e.slice(r.length):e})).join("\n")}(n,t[3]||"");return{type:"code",raw:n,lang:t[2]?t[2].trim().replace(this.rules.inline._escapes,"$1"):t[2],text:r}}}},{key:"heading",value:function(e){var t=this.rules.block.heading.exec(e);if(t){var n=t[2].trim();if(/#$/.test(n)){var r=Tf(n,"#");this.options.pedantic?n=r.trim():r&&!/ $/.test(r)||(n=r.trim())}return{type:"heading",raw:t[0],depth:t[1].length,text:n,tokens:this.lexer.inline(n)}}}},{key:"hr",value:function(e){var t=this.rules.block.hr.exec(e);if(t)return{type:"hr",raw:t[0]}}},{key:"blockquote",value:function(e){var t=this.rules.block.blockquote.exec(e);if(t){var n=t[0].replace(/^ *>[ \t]?/gm,"");return{type:"blockquote",raw:t[0],tokens:this.lexer.blockTokens(n,[]),text:n}}}},{key:"list",value:function(e){var t=this.rules.block.list.exec(e);if(t){var n,r,i,o,a,u,l,c,s,f,d,h,p=t[1].trim(),v=p.length>1,m={type:"list",raw:"",ordered:v,start:v?+p.slice(0,-1):"",loose:!1,items:[]};p=v?"\\d{1,9}\\".concat(p.slice(-1)):"\\".concat(p),this.options.pedantic&&(p=v?p:"[*+-]");for(var y=new RegExp("^( {0,3}".concat(p,")((?:[\t ][^\\n]*)?(?:\\n|$))"));e&&(h=!1,t=y.exec(e))&&!this.rules.block.hr.test(e);){if(n=t[0],e=e.substring(n.length),c=t[2].split("\n",1)[0],s=e.split("\n",1)[0],this.options.pedantic?(o=2,d=c.trimLeft()):(o=(o=t[2].search(/[^ ]/))>4?1:o,d=c.slice(o),o+=t[1].length),u=!1,!c&&/^ *$/.test(s)&&(n+=s+"\n",e=e.substring(s.length+1),h=!0),!h)for(var g=new RegExp("^ {0,".concat(Math.min(3,o-1),"}(?:[*+-]|\\d{1,9}[.)])((?: [^\\n]*)?(?:\\n|$))")),_=new RegExp("^ {0,".concat(Math.min(3,o-1),"}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)")),b=new RegExp("^ {0,".concat(Math.min(3,o-1),"}(?:```|~~~)")),D=new RegExp("^ {0,".concat(Math.min(3,o-1),"}#"));e&&(c=f=e.split("\n",1)[0],this.options.pedantic&&(c=c.replace(/^ {1,4}(?=( {4})*[^ ])/g," ")),!b.test(c))&&!D.test(c)&&!g.test(c)&&!_.test(e);){if(c.search(/[^ ]/)>=o||!c.trim())d+="\n"+c.slice(o);else{if(u)break;d+="\n"+c}u||c.trim()||(u=!0),n+=f+"\n",e=e.substring(f.length+1)}m.loose||(l?m.loose=!0:/\n *\n *$/.test(n)&&(l=!0)),this.options.gfm&&(r=/^\[[ xX]\] /.exec(d))&&(i="[ ] "!==r[0],d=d.replace(/^\[[ xX]\] +/,"")),m.items.push({type:"list_item",raw:n,task:!!r,checked:i,loose:!1,text:d}),m.raw+=n}m.items[m.items.length-1].raw=n.trimRight(),m.items[m.items.length-1].text=d.trimRight(),m.raw=m.raw.trimRight();var w=m.items.length;for(a=0;a1)return!0}}catch(i){r.e(i)}finally{r.f()}return!1}));!m.loose&&x.length&&k&&(m.loose=!0,m.items[a].loose=!0)}return m}}},{key:"html",value:function(e){var t=this.rules.block.html.exec(e);if(t){var n={type:"html",raw:t[0],pre:!this.options.sanitizer&&("pre"===t[1]||"script"===t[1]||"style"===t[1]),text:t[0]};if(this.options.sanitize){var r=this.options.sanitizer?this.options.sanitizer(t[0]):yf(t[0]);n.type="paragraph",n.text=r,n.tokens=this.lexer.inline(r)}return n}}},{key:"def",value:function(e){var t=this.rules.block.def.exec(e);if(t)return t[3]&&(t[3]=t[3].substring(1,t[3].length-1)),{type:"def",tag:t[1].toLowerCase().replace(/\s+/g," "),raw:t[0],href:t[2]?t[2].replace(this.rules.inline._escapes,"$1"):t[2],title:t[3]?t[3].replace(this.rules.inline._escapes,"$1"):t[3]}}},{key:"table",value:function(e){var t=this.rules.block.table.exec(e);if(t){var n={type:"table",header:Of(t[1]).map((function(e){return{text:e}})),align:t[2].replace(/^ *|\| *$/g,"").split(/ *\| */),rows:t[3]&&t[3].trim()?t[3].replace(/\n[ \t]*$/,"").split("\n"):[]};if(n.header.length===n.align.length){n.raw=t[0];var r,i,o,a,u=n.align.length;for(r=0;r/i.test(t[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&/^<(pre|code|kbd|script)(\s|>)/i.test(t[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&/^<\/(pre|code|kbd|script)(\s|>)/i.test(t[0])&&(this.lexer.state.inRawBlock=!1),{type:this.options.sanitize?"text":"html",raw:t[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,text:this.options.sanitize?this.options.sanitizer?this.options.sanitizer(t[0]):yf(t[0]):t[0]}}},{key:"link",value:function(e){var t=this.rules.inline.link.exec(e);if(t){var n=t[2].trim();if(!this.options.pedantic&&/^$/.test(n))return;var r=Tf(n.slice(0,-1),"\\");if((n.length-r.length)%2===0)return}else{var i=function(e,t){if(-1===e.indexOf(t[1]))return-1;for(var n=e.length,r=0,i=0;i-1){var o=(0===t[0].indexOf("!")?5:4)+t[1].length+i;t[2]=t[2].substring(0,i),t[0]=t[0].substring(0,o).trim(),t[3]=""}}var a=t[2],u="";if(this.options.pedantic){var l=/^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(a);l&&(a=l[1],u=l[3])}else u=t[3]?t[3].slice(1,-1):"";return a=a.trim(),/^$/.test(n)?a.slice(1):a.slice(1,-1)),Lf(t,{href:a?a.replace(this.rules.inline._escapes,"$1"):a,title:u?u.replace(this.rules.inline._escapes,"$1"):u},t[0],this.lexer)}}},{key:"reflink",value:function(e,t){var n;if((n=this.rules.inline.reflink.exec(e))||(n=this.rules.inline.nolink.exec(e))){var r=(n[2]||n[1]).replace(/\s+/g," ");if(!(r=t[r.toLowerCase()])||!r.href){var i=n[0].charAt(0);return{type:"text",raw:i,text:i}}return Lf(n,r,n[0],this.lexer)}}},{key:"emStrong",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"",r=this.rules.inline.emStrong.lDelim.exec(e);if(r&&(!r[3]||!n.match(/(?:[0-9A-Za-z\xAA\xB2\xB3\xB5\xB9\xBA\xBC-\xBE\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u05D0-\u05EA\u05EF-\u05F2\u0620-\u064A\u0660-\u0669\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07C0-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u0870-\u0887\u0889-\u088E\u08A0-\u08C9\u0904-\u0939\u093D\u0950\u0958-\u0961\u0966-\u096F\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09E6-\u09F1\u09F4-\u09F9\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A66-\u0A6F\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AE6-\u0AEF\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B66-\u0B6F\u0B71-\u0B77\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0BE6-\u0BF2\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C5D\u0C60\u0C61\u0C66-\u0C6F\u0C78-\u0C7E\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDD\u0CDE\u0CE0\u0CE1\u0CE6-\u0CEF\u0CF1\u0CF2\u0D04-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D58-\u0D61\u0D66-\u0D78\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DE6-\u0DEF\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F20-\u0F33\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F-\u1049\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u1090-\u1099\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1369-\u137C\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u1711\u171F-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u17E0-\u17E9\u17F0-\u17F9\u1810-\u1819\u1820-\u1878\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A16\u1A20-\u1A54\u1A80-\u1A89\u1A90-\u1A99\u1AA7\u1B05-\u1B33\u1B45-\u1B4C\u1B50-\u1B59\u1B83-\u1BA0\u1BAE-\u1BE5\u1C00-\u1C23\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2070\u2071\u2074-\u2079\u207F-\u2089\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2150-\u2189\u2460-\u249B\u24EA-\u24FF\u2776-\u2793\u2C00-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2CFD\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u3192-\u3195\u31A0-\u31BF\u31F0-\u31FF\u3220-\u3229\u3248-\u324F\u3251-\u325F\u3280-\u3289\u32B1-\u32BF\u3400-\u4DBF\u4E00-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7CA\uA7D0\uA7D1\uA7D3\uA7D5-\uA7D9\uA7F2-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA830-\uA835\uA840-\uA873\uA882-\uA8B3\uA8D0-\uA8D9\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA900-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF-\uA9D9\uA9E0-\uA9E4\uA9E6-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA50-\uAA59\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABE2\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD07-\uDD33\uDD40-\uDD78\uDD8A\uDD8B\uDE80-\uDE9C\uDEA0-\uDED0\uDEE1-\uDEFB\uDF00-\uDF23\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDD70-\uDD7A\uDD7C-\uDD8A\uDD8C-\uDD92\uDD94\uDD95\uDD97-\uDDA1\uDDA3-\uDDB1\uDDB3-\uDDB9\uDDBB\uDDBC\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67\uDF80-\uDF85\uDF87-\uDFB0\uDFB2-\uDFBA]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC58-\uDC76\uDC79-\uDC9E\uDCA7-\uDCAF\uDCE0-\uDCF2\uDCF4\uDCF5\uDCFB-\uDD1B\uDD20-\uDD39\uDD80-\uDDB7\uDDBC-\uDDCF\uDDD2-\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE40-\uDE48\uDE60-\uDE7E\uDE80-\uDE9F\uDEC0-\uDEC7\uDEC9-\uDEE4\uDEEB-\uDEEF\uDF00-\uDF35\uDF40-\uDF55\uDF58-\uDF72\uDF78-\uDF91\uDFA9-\uDFAF]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDCFA-\uDD23\uDD30-\uDD39\uDE60-\uDE7E\uDE80-\uDEA9\uDEB0\uDEB1\uDF00-\uDF27\uDF30-\uDF45\uDF51-\uDF54\uDF70-\uDF81\uDFB0-\uDFCB\uDFE0-\uDFF6]|\uD804[\uDC03-\uDC37\uDC52-\uDC6F\uDC71\uDC72\uDC75\uDC83-\uDCAF\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD03-\uDD26\uDD36-\uDD3F\uDD44\uDD47\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDD0-\uDDDA\uDDDC\uDDE1-\uDDF4\uDE00-\uDE11\uDE13-\uDE2B\uDE3F\uDE40\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDEF0-\uDEF9\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC50-\uDC59\uDC5F-\uDC61\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE50-\uDE59\uDE80-\uDEAA\uDEB8\uDEC0-\uDEC9\uDF00-\uDF1A\uDF30-\uDF3B\uDF40-\uDF46]|\uD806[\uDC00-\uDC2B\uDCA0-\uDCF2\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD2F\uDD3F\uDD41\uDD50-\uDD59\uDDA0-\uDDA7\uDDAA-\uDDD0\uDDE1\uDDE3\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE89\uDE9D\uDEB0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC50-\uDC6C\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46\uDD50-\uDD59\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD89\uDD98\uDDA0-\uDDA9\uDEE0-\uDEF2\uDF02\uDF04-\uDF10\uDF12-\uDF33\uDF50-\uDF59\uDFB0\uDFC0-\uDFD4]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|\uD80B[\uDF90-\uDFF0]|[\uD80C\uD81C-\uD820\uD822\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879\uD880-\uD883\uD885-\uD887][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2F\uDC41-\uDC46]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDE70-\uDEBE\uDEC0-\uDEC9\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF50-\uDF59\uDF5B-\uDF61\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDE40-\uDE96\uDF00-\uDF4A\uDF50\uDF93-\uDF9F\uDFE0\uDFE1\uDFE3]|\uD821[\uDC00-\uDFF7]|\uD823[\uDC00-\uDCD5\uDD00-\uDD08]|\uD82B[\uDFF0-\uDFF3\uDFF5-\uDFFB\uDFFD\uDFFE]|\uD82C[\uDC00-\uDD22\uDD32\uDD50-\uDD52\uDD55\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD834[\uDEC0-\uDED3\uDEE0-\uDEF3\uDF60-\uDF78]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD837[\uDF00-\uDF1E\uDF25-\uDF2A]|\uD838[\uDC30-\uDC6D\uDD00-\uDD2C\uDD37-\uDD3D\uDD40-\uDD49\uDD4E\uDE90-\uDEAD\uDEC0-\uDEEB\uDEF0-\uDEF9]|\uD839[\uDCD0-\uDCEB\uDCF0-\uDCF9\uDFE0-\uDFE6\uDFE8-\uDFEB\uDFED\uDFEE\uDFF0-\uDFFE]|\uD83A[\uDC00-\uDCC4\uDCC7-\uDCCF\uDD00-\uDD43\uDD4B\uDD50-\uDD59]|\uD83B[\uDC71-\uDCAB\uDCAD-\uDCAF\uDCB1-\uDCB4\uDD01-\uDD2D\uDD2F-\uDD3D\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD83C[\uDD00-\uDD0C]|\uD83E[\uDFF0-\uDFF9]|\uD869[\uDC00-\uDEDF\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF39\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A\uDF50-\uDFFF]|\uD888[\uDC00-\uDFAF])/))){var i=r[1]||r[2]||"";if(!i||i&&(""===n||this.rules.inline.punctuation.exec(n))){var o,a,u=r[0].length-1,l=u,c=0,s="*"===r[0][0]?this.rules.inline.emStrong.rDelimAst:this.rules.inline.emStrong.rDelimUnd;for(s.lastIndex=0,t=t.slice(-1*e.length+u);null!=(r=s.exec(t));)if(o=r[1]||r[2]||r[3]||r[4]||r[5]||r[6])if(a=o.length,r[3]||r[4])l+=a;else if(!((r[5]||r[6])&&u%3)||(u+a)%3){if(!((l-=a)>0)){a=Math.min(a,a+l+c);var f=e.slice(0,u+r.index+(r[0].length-o.length)+a);if(Math.min(u,a)%2){var d=f.slice(1,-1);return{type:"em",raw:f,text:d,tokens:this.lexer.inlineTokens(d)}}var h=f.slice(2,-2);return{type:"strong",raw:f,text:h,tokens:this.lexer.inlineTokens(h)}}}else c+=a}}}},{key:"codespan",value:function(e){var t=this.rules.inline.code.exec(e);if(t){var n=t[2].replace(/\n/g," "),r=/[^ ]/.test(n),i=/^ /.test(n)&&/ $/.test(n);return r&&i&&(n=n.substring(1,n.length-1)),n=yf(n,!0),{type:"codespan",raw:t[0],text:n}}}},{key:"br",value:function(e){var t=this.rules.inline.br.exec(e);if(t)return{type:"br",raw:t[0]}}},{key:"del",value:function(e){var t=this.rules.inline.del.exec(e);if(t)return{type:"del",raw:t[0],text:t[2],tokens:this.lexer.inlineTokens(t[2])}}},{key:"autolink",value:function(e,t){var n,r,i=this.rules.inline.autolink.exec(e);if(i)return r="@"===i[2]?"mailto:"+(n=yf(this.options.mangle?t(i[1]):i[1])):n=yf(i[1]),{type:"link",raw:i[0],text:n,href:r,tokens:[{type:"text",raw:n,text:n}]}}},{key:"url",value:function(e,t){var n;if(n=this.rules.inline.url.exec(e)){var r,i;if("@"===n[2])i="mailto:"+(r=yf(this.options.mangle?t(n[0]):n[0]));else{var o;do{o=n[0],n[0]=this.rules.inline._backpedal.exec(n[0])[0]}while(o!==n[0]);r=yf(n[0]),i="www."===n[1]?"http://"+r:r}return{type:"link",raw:n[0],text:r,href:i,tokens:[{type:"text",raw:r,text:r}]}}}},{key:"inlineText",value:function(e,t){var n,r=this.rules.inline.text.exec(e);if(r)return n=this.lexer.state.inRawBlock?this.options.sanitize?this.options.sanitizer?this.options.sanitizer(r[0]):yf(r[0]):r[0]:yf(this.options.smartypants?t(r[0]):r[0]),{type:"text",raw:r[0],text:n}}}]),e}(),If={newline:/^(?: *(?:\n|$))+/,code:/^( {4}[^\n]+(?:\n(?: *(?:\n|$))*)?)+/,fences:/^ {0,3}(`{3,}(?=[^`\n]*\n)|~{3,})([^\n]*)\n(?:|([\s\S]*?)\n)(?: {0,3}\1[~`]* *(?=\n|$)|$)/,hr:/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,heading:/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,blockquote:/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,list:/^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/,html:"^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:\\1>[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:(?:\\n *)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$)|(?!script|pre|style|textarea)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$))",def:/^ {0,3}\[(label)\]: *(?:\n *)?([^\s>]+)>?(?:(?: +(?:\n *)?| *\n *)(title))? *(?:\n+|$)/,table:Ff,lheading:/^([^\n]+)\n {0,3}(=+|-+) *(?:\n+|$)/,_paragraph:/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,text:/^[^\n]+/,_label:/(?!\s*\])(?:\\.|[^\[\]\\])+/,_title:/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/};If.def=Df(If.def).replace("label",If._label).replace("title",If._title).getRegex(),If.bullet=/(?:[*+-]|\d{1,9}[.)])/,If.listItemStart=Df(/^( *)(bull) */).replace("bull",If.bullet).getRegex(),If.list=Df(If.list).replace(/bull/g,If.bullet).replace("hr","\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))").replace("def","\\n+(?="+If.def.source+")").getRegex(),If._tag="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",If._comment=/|$)/,If.html=Df(If.html,"i").replace("comment",If._comment).replace("tag",If._tag).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),If.paragraph=Df(If._paragraph).replace("hr",If.hr).replace("heading"," {0,3}#{1,6} ").replace("|lheading","").replace("|table","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html","?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",If._tag).getRegex(),If.blockquote=Df(If.blockquote).replace("paragraph",If.paragraph).getRegex(),If.normal=Nf({},If),If.gfm=Nf({},If.normal,{table:"^ *([^\\n ].*\\|.*)\\n {0,3}(?:\\| *)?(:?-+:? *(?:\\| *:?-+:? *)*)(?:\\| *)?(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)"}),If.gfm.table=Df(If.gfm.table).replace("hr",If.hr).replace("heading"," {0,3}#{1,6} ").replace("blockquote"," {0,3}>").replace("code"," {4}[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html","?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",If._tag).getRegex(),If.gfm.paragraph=Df(If._paragraph).replace("hr",If.hr).replace("heading"," {0,3}#{1,6} ").replace("|lheading","").replace("table",If.gfm.table).replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html","?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",If._tag).getRegex(),If.pedantic=Nf({},If.normal,{html:Df("^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+?\\1> *(?:\\n{2,}|\\s*$)| \\s]*)*?/?> *(?:\\n{2,}|\\s*$))").replace("comment",If._comment).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:Ff,paragraph:Df(If.normal._paragraph).replace("hr",If.hr).replace("heading"," *#{1,6} *[^\n]").replace("lheading",If.lheading).replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").getRegex()});var zf={escape:/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,autolink:/^<(scheme:[^\s\x00-\x1f<>]*|email)>/,url:Ff,tag:"^comment|^[a-zA-Z][\\w:-]*\\s*>|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^",link:/^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/,reflink:/^!?\[(label)\]\[(ref)\]/,nolink:/^!?\[(ref)\](?:\[\])?/,reflinkSearch:"reflink|nolink(?!\\()",emStrong:{lDelim:/^(?:\*+(?:([punct_])|[^\s*]))|^_+(?:([punct*])|([^\s_]))/,rDelimAst:/^(?:[^_*\\]|\\.)*?\_\_(?:[^_*\\]|\\.)*?\*(?:[^_*\\]|\\.)*?(?=\_\_)|(?:[^*\\]|\\.)+(?=[^*])|[punct_](\*+)(?=[\s]|$)|(?:[^punct*_\s\\]|\\.)(\*+)(?=[punct_\s]|$)|[punct_\s](\*+)(?=[^punct*_\s])|[\s](\*+)(?=[punct_])|[punct_](\*+)(?=[punct_])|(?:[^punct*_\s\\]|\\.)(\*+)(?=[^punct*_\s])/,rDelimUnd:/^(?:[^_*\\]|\\.)*?\*\*(?:[^_*\\]|\\.)*?\_(?:[^_*\\]|\\.)*?(?=\*\*)|(?:[^_\\]|\\.)+(?=[^_])|[punct*](\_+)(?=[\s]|$)|(?:[^punct*_\s\\]|\\.)(\_+)(?=[punct*\s]|$)|[punct*\s](\_+)(?=[^punct*_\s])|[\s](\_+)(?=[punct*])|[punct*](\_+)(?=[punct*])/},code:/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,br:/^( {2,}|\\)\n(?!\s*$)/,del:Ff,text:/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\.5&&(n="x"+n.toString(16)),r+=""+n+";";return r}zf._punctuation="!\"#$%&'()+\\-.,/:;<=>?@\\[\\]`^{|}~",zf.punctuation=Df(zf.punctuation).replace(/punctuation/g,zf._punctuation).getRegex(),zf.blockSkip=/\[[^\]]*?\]\([^\)]*?\)|`[^`]*?`|<[^>]*?>/g,zf.escapedEmSt=/(?:^|[^\\])(?:\\\\)*\\[*_]/g,zf._comment=Df(If._comment).replace("(?:--\x3e|$)","--\x3e").getRegex(),zf.emStrong.lDelim=Df(zf.emStrong.lDelim).replace(/punct/g,zf._punctuation).getRegex(),zf.emStrong.rDelimAst=Df(zf.emStrong.rDelimAst,"g").replace(/punct/g,zf._punctuation).getRegex(),zf.emStrong.rDelimUnd=Df(zf.emStrong.rDelimUnd,"g").replace(/punct/g,zf._punctuation).getRegex(),zf._escapes=/\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g,zf._scheme=/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/,zf._email=/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/,zf.autolink=Df(zf.autolink).replace("scheme",zf._scheme).replace("email",zf._email).getRegex(),zf._attribute=/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/,zf.tag=Df(zf.tag).replace("comment",zf._comment).replace("attribute",zf._attribute).getRegex(),zf._label=/(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/,zf._href=/<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/,zf._title=/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/,zf.link=Df(zf.link).replace("label",zf._label).replace("href",zf._href).replace("title",zf._title).getRegex(),zf.reflink=Df(zf.reflink).replace("label",zf._label).replace("ref",If._label).getRegex(),zf.nolink=Df(zf.nolink).replace("ref",If._label).getRegex(),zf.reflinkSearch=Df(zf.reflinkSearch,"g").replace("reflink",zf.reflink).replace("nolink",zf.nolink).getRegex(),zf.normal=Nf({},zf),zf.pedantic=Nf({},zf.normal,{strong:{start:/^__|\*\*/,middle:/^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,endAst:/\*\*(?!\*)/g,endUnd:/__(?!_)/g},em:{start:/^_|\*/,middle:/^()\*(?=\S)([\s\S]*?\S)\*(?!\*)|^_(?=\S)([\s\S]*?\S)_(?!_)/,endAst:/\*(?!\*)/g,endUnd:/_(?!_)/g},link:Df(/^!?\[(label)\]\((.*?)\)/).replace("label",zf._label).getRegex(),reflink:Df(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",zf._label).getRegex()}),zf.gfm=Nf({},zf.normal,{escape:Df(zf.escape).replace("])","~|])").getRegex(),_extended_email:/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,url:/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,_backpedal:/(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])([\s\S]*?[^\s~])\1(?=[^~]|$)/,text:/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\1&&void 0!==arguments[1]?arguments[1]:[];for(e=this.options.pedantic?e.replace(/\t/g," ").replace(/^ +$/gm,""):e.replace(/^( *)(\t+)/gm,(function(e,t,n){return t+" ".repeat(n.length)}));e;)if(!(this.options.extensions&&this.options.extensions.block&&this.options.extensions.block.some((function(n){return!!(t=n.call({lexer:o},e,a))&&(e=e.substring(t.raw.length),a.push(t),!0)}))))if(t=this.tokenizer.space(e))e=e.substring(t.raw.length),1===t.raw.length&&a.length>0?a[a.length-1].raw+="\n":a.push(t);else if(t=this.tokenizer.code(e))e=e.substring(t.raw.length),!(n=a[a.length-1])||"paragraph"!==n.type&&"text"!==n.type?a.push(t):(n.raw+="\n"+t.raw,n.text+="\n"+t.text,this.inlineQueue[this.inlineQueue.length-1].src=n.text);else if(t=this.tokenizer.fences(e))e=e.substring(t.raw.length),a.push(t);else if(t=this.tokenizer.heading(e))e=e.substring(t.raw.length),a.push(t);else if(t=this.tokenizer.hr(e))e=e.substring(t.raw.length),a.push(t);else if(t=this.tokenizer.blockquote(e))e=e.substring(t.raw.length),a.push(t);else if(t=this.tokenizer.list(e))e=e.substring(t.raw.length),a.push(t);else if(t=this.tokenizer.html(e))e=e.substring(t.raw.length),a.push(t);else if(t=this.tokenizer.def(e))e=e.substring(t.raw.length),!(n=a[a.length-1])||"paragraph"!==n.type&&"text"!==n.type?this.tokens.links[t.tag]||(this.tokens.links[t.tag]={href:t.href,title:t.title}):(n.raw+="\n"+t.raw,n.text+="\n"+t.raw,this.inlineQueue[this.inlineQueue.length-1].src=n.text);else if(t=this.tokenizer.table(e))e=e.substring(t.raw.length),a.push(t);else if(t=this.tokenizer.lheading(e))e=e.substring(t.raw.length),a.push(t);else if(r=e,this.options.extensions&&this.options.extensions.startBlock&&function(){var t=1/0,n=e.slice(1),i=void 0;o.options.extensions.startBlock.forEach((function(e){"number"===typeof(i=e.call({lexer:this},n))&&i>=0&&(t=Math.min(t,i))})),t<1/0&&t>=0&&(r=e.substring(0,t+1))}(),this.state.top&&(t=this.tokenizer.paragraph(r)))n=a[a.length-1],i&&"paragraph"===n.type?(n.raw+="\n"+t.raw,n.text+="\n"+t.text,this.inlineQueue.pop(),this.inlineQueue[this.inlineQueue.length-1].src=n.text):a.push(t),i=r.length!==e.length,e=e.substring(t.raw.length);else if(t=this.tokenizer.text(e))e=e.substring(t.raw.length),(n=a[a.length-1])&&"text"===n.type?(n.raw+="\n"+t.raw,n.text+="\n"+t.text,this.inlineQueue.pop(),this.inlineQueue[this.inlineQueue.length-1].src=n.text):a.push(t);else if(e){var u="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(u);break}throw new Error(u)}return this.state.top=!0,a}},{key:"inline",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];return this.inlineQueue.push({src:e,tokens:t}),t}},{key:"inlineTokens",value:function(e){var t,n,r,i,o,a,u=this,l=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],c=e;if(this.tokens.links){var s=Object.keys(this.tokens.links);if(s.length>0)for(;null!=(i=this.tokenizer.rules.inline.reflinkSearch.exec(c));)s.includes(i[0].slice(i[0].lastIndexOf("[")+1,-1))&&(c=c.slice(0,i.index)+"["+Bf("a",i[0].length-2)+"]"+c.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;null!=(i=this.tokenizer.rules.inline.blockSkip.exec(c));)c=c.slice(0,i.index)+"["+Bf("a",i[0].length-2)+"]"+c.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);for(;null!=(i=this.tokenizer.rules.inline.escapedEmSt.exec(c));)c=c.slice(0,i.index+i[0].length-2)+"++"+c.slice(this.tokenizer.rules.inline.escapedEmSt.lastIndex),this.tokenizer.rules.inline.escapedEmSt.lastIndex--;for(;e;)if(o||(a=""),o=!1,!(this.options.extensions&&this.options.extensions.inline&&this.options.extensions.inline.some((function(n){return!!(t=n.call({lexer:u},e,l))&&(e=e.substring(t.raw.length),l.push(t),!0)}))))if(t=this.tokenizer.escape(e))e=e.substring(t.raw.length),l.push(t);else if(t=this.tokenizer.tag(e))e=e.substring(t.raw.length),(n=l[l.length-1])&&"text"===t.type&&"text"===n.type?(n.raw+=t.raw,n.text+=t.text):l.push(t);else if(t=this.tokenizer.link(e))e=e.substring(t.raw.length),l.push(t);else if(t=this.tokenizer.reflink(e,this.tokens.links))e=e.substring(t.raw.length),(n=l[l.length-1])&&"text"===t.type&&"text"===n.type?(n.raw+=t.raw,n.text+=t.text):l.push(t);else if(t=this.tokenizer.emStrong(e,c,a))e=e.substring(t.raw.length),l.push(t);else if(t=this.tokenizer.codespan(e))e=e.substring(t.raw.length),l.push(t);else if(t=this.tokenizer.br(e))e=e.substring(t.raw.length),l.push(t);else if(t=this.tokenizer.del(e))e=e.substring(t.raw.length),l.push(t);else if(t=this.tokenizer.autolink(e,Rf))e=e.substring(t.raw.length),l.push(t);else if(this.state.inLink||!(t=this.tokenizer.url(e,Rf))){if(r=e,this.options.extensions&&this.options.extensions.startInline&&function(){var t=1/0,n=e.slice(1),i=void 0;u.options.extensions.startInline.forEach((function(e){"number"===typeof(i=e.call({lexer:this},n))&&i>=0&&(t=Math.min(t,i))})),t<1/0&&t>=0&&(r=e.substring(0,t+1))}(),t=this.tokenizer.inlineText(r,$f))e=e.substring(t.raw.length),"_"!==t.raw.slice(-1)&&(a=t.raw.slice(-1)),o=!0,(n=l[l.length-1])&&"text"===n.type?(n.raw+=t.raw,n.text+=t.text):l.push(t);else if(e){var f="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(f);break}throw new Error(f)}}else e=e.substring(t.raw.length),l.push(t);return l}}],[{key:"rules",get:function(){return{block:If,inline:zf}}},{key:"lex",value:function(t,n){return new e(n).lex(t)}},{key:"lexInline",value:function(t,n){return new e(n).inlineTokens(t)}}]),e}(),Uf=function(){function e(t){Ft(this,e),this.options=t||sf}return Ot(e,[{key:"code",value:function(e,t,n){var r=(t||"").match(/\S*/)[0];if(this.options.highlight){var i=this.options.highlight(e,r);null!=i&&i!==e&&(n=!0,e=i)}return e=e.replace(/\n$/,"")+"\n",r?''+(n?e:yf(e,!0))+"
\n":""+(n?e:yf(e,!0))+"
\n"}},{key:"blockquote",value:function(e){return"\n".concat(e," \n")}},{key:"html",value:function(e){return e}},{key:"heading",value:function(e,t,n,r){if(this.options.headerIds){var i=this.options.headerPrefix+r.slug(n);return"').concat(e," \n")}return"").concat(e," \n")}},{key:"hr",value:function(){return this.options.xhtml?" \n":" \n"}},{key:"list",value:function(e,t,n){var r=t?"ol":"ul";return"<"+r+(t&&1!==n?' start="'+n+'"':"")+">\n"+e+""+r+">\n"}},{key:"listitem",value:function(e){return"".concat(e," \n")}},{key:"checkbox",value:function(e){return" "}},{key:"paragraph",value:function(e){return"".concat(e,"
\n")}},{key:"table",value:function(e,t){return t&&(t="".concat(t," ")),"\n"}},{key:"tablerow",value:function(e){return"\n".concat(e," \n")}},{key:"tablecell",value:function(e,t){var n=t.header?"th":"td";return(t.align?"<".concat(n,' align="').concat(t.align,'">'):"<".concat(n,">"))+e+"".concat(n,">\n")}},{key:"strong",value:function(e){return"".concat(e," ")}},{key:"em",value:function(e){return"".concat(e," ")}},{key:"codespan",value:function(e){return"".concat(e,"
")}},{key:"br",value:function(){return this.options.xhtml?" ":" "}},{key:"del",value:function(e){return"".concat(e,"")}},{key:"link",value:function(e,t,n){if(null===(e=kf(this.options.sanitize,this.options.baseUrl,e)))return n;var r='"+n+" "}},{key:"image",value:function(e,t,n){if(null===(e=kf(this.options.sanitize,this.options.baseUrl,e)))return n;var r=' ":">"}},{key:"text",value:function(e){return e}}]),e}(),Hf=function(){function e(){Ft(this,e)}return Ot(e,[{key:"strong",value:function(e){return e}},{key:"em",value:function(e){return e}},{key:"codespan",value:function(e){return e}},{key:"del",value:function(e){return e}},{key:"html",value:function(e){return e}},{key:"text",value:function(e){return e}},{key:"link",value:function(e,t,n){return""+n}},{key:"image",value:function(e,t,n){return""+n}},{key:"br",value:function(){return""}}]),e}(),Yf=function(){function e(){Ft(this,e),this.seen={}}return Ot(e,[{key:"serialize",value:function(e){return e.toLowerCase().trim().replace(/<[!\/a-z].*?>/gi,"").replace(/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g,"").replace(/\s/g,"-")}},{key:"getNextSafeSlug",value:function(e,t){var n=e,r=0;if(this.seen.hasOwnProperty(n)){r=this.seen[e];do{n=e+"-"+ ++r}while(this.seen.hasOwnProperty(n))}return t||(this.seen[e]=r,this.seen[n]=0),n}},{key:"slug",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=this.serialize(e);return this.getNextSafeSlug(n,t.dryrun)}}]),e}(),Vf=function(){function e(t){Ft(this,e),this.options=t||sf,this.options.renderer=this.options.renderer||new Uf,this.renderer=this.options.renderer,this.renderer.options=this.options,this.textRenderer=new Hf,this.slugger=new Yf}return Ot(e,[{key:"parse",value:function(e){var t,n,r,i,o,a,u,l,c,s,f,d,h,p,v,m,y,g,_,b=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],D="",w=e.length;for(t=0;t0&&"paragraph"===v.tokens[0].type?(v.tokens[0].text=g+" "+v.tokens[0].text,v.tokens[0].tokens&&v.tokens[0].tokens.length>0&&"text"===v.tokens[0].tokens[0].type&&(v.tokens[0].tokens[0].text=g+" "+v.tokens[0].tokens[0].text)):v.tokens.unshift({type:"text",text:g}):p+=g),p+=this.parse(v.tokens,h),c+=this.renderer.listitem(p,y,m);D+=this.renderer.list(c,f,d);continue;case"html":D+=this.renderer.html(s.text);continue;case"paragraph":D+=this.renderer.paragraph(this.parseInline(s.tokens));continue;case"text":for(c=s.tokens?this.parseInline(s.tokens):s.text;t+1An error occurred:
"+yf(e.message+"",!0)+" ";throw e}try{var l=jf.lex(e,t);if(t.walkTokens){if(t.async)return Promise.all(qf.walkTokens(l,t.walkTokens)).then((function(){return Vf.parse(l,t)})).catch(u);qf.walkTokens(l,t.walkTokens)}return Vf.parse(l,t)}catch(c){u(c)}}qf.options=qf.setOptions=function(e){var t;return Nf(qf.defaults,e),t=qf.defaults,sf=t,qf},qf.getDefaults=cf,qf.defaults=sf,qf.use=function(){for(var e=arguments.length,t=new Array(e),n=0;nAn error occurred:
"+yf(c.message+"",!0)+" ";throw c}},qf.Parser=Vf,qf.parser=Vf.parse,qf.Renderer=Uf,qf.TextRenderer=Hf,qf.Lexer=jf,qf.lexer=jf.lex,qf.Tokenizer=Pf,qf.Slugger=Yf,qf.parse=qf;qf.options,qf.setOptions,qf.use,qf.walkTokens,qf.parseInline,Vf.parse,jf.lex;var Wf=function(e){var t=e.title,n=e.description,r=e.unit,i=e.expr,o=e.showLegend,a=e.filename,u=e.alias,l=ri().period,c=ii(),s=re(null),f=St(X(!0),2),d=f[0],h=f[1],p=St(X(l.step||1),2),v=p[0],y=p[1],g=St(X({limits:{enable:!1,range:{1:[0,0]}}}),2),_=g[0],b=g[1],D=oe((function(){return Array.isArray(i)&&i.every((function(e){return e}))}),[i]),w=js({predefinedQuery:D?i:[],display:"chart",visible:d,customStep:v}),x=w.isLoading,k=w.graphData,C=w.error,E=w.warning,S=function(e){var t=ar({},_);t.limits.range=e,b(t)};if(te((function(){var e=new IntersectionObserver((function(e){e.forEach((function(e){return h(e.isIntersecting)}))}),{threshold:.1});return s.current&&e.observe(s.current),function(){s.current&&e.unobserve(s.current)}}),[]),!D)return _r(mo,{variant:"error",children:[_r("code",{children:'"expr"'})," not found. Check the configuration file ",_r("b",{children:a}),"."]});var A=function(){return _r("div",{className:"vm-predefined-panel-header__description vm-default-styles",children:[n&&_r(m,{children:[_r("div",{children:[_r("span",{children:"Description:"}),_r("div",{dangerouslySetInnerHTML:{__html:qf.parse(n)}})]}),_r("hr",{})]}),_r("div",{children:[_r("span",{children:"Queries:"}),_r("div",{children:i.map((function(e,t){return _r("div",{children:e},"".concat(t,"_").concat(e))}))})]})]})};return _r("div",{className:"vm-predefined-panel",ref:s,children:[_r("div",{className:"vm-predefined-panel-header",children:[_r(xo,{title:_r(A,{}),children:_r("div",{className:"vm-predefined-panel-header__info",children:_r(vi,{})})}),_r("h3",{className:"vm-predefined-panel-header__title",children:t||""}),_r("div",{className:"vm-predefined-panel-header__step",children:_r(Ns,{defaultStep:l.step,setStep:y})}),_r(Vs,{yaxis:_,setYaxisLimits:S,toggleEnableLimits:function(){var e=ar({},_);e.limits.enable=!e.limits.enable,b(e)}})]}),_r("div",{className:"vm-predefined-panel-body",children:[x&&_r(qs,{}),C&&_r(mo,{variant:"error",children:C}),E&&_r(mo,{variant:"warning",children:E}),k&&_r(Cs,{data:k,period:l,customStep:v,query:i,yaxis:_,unit:r,alias:u,showLegend:o,setYaxisLimits:S,setPeriod:function(e){var t=e.from,n=e.to;c({type:"SET_PERIOD",payload:{from:t,to:n}})},fullWidth:!1})]})]})},Qf=function(e){var t=e.index,n=e.title,r=e.panels,i=e.filename,o=So(document.body),a=oe((function(){return o.width/12}),[o]),u=St(X(!t),2),l=u[0],c=u[1],s=St(X([]),2),f=s[0],d=s[1];te((function(){d(r&&r.map((function(e){return e.width||12})))}),[r]);var h=St(X({start:0,target:0,enable:!1}),2),p=h[0],v=h[1],m=function(e){if(p.enable){var t=p.start,n=Math.ceil((t-e.clientX)/a);if(!(Math.abs(n)>=12)){var r=f.map((function(e,t){return e-(t===p.target?n:0)}));d(r)}}},y=function(){v(ar(ar({},p),{},{enable:!1}))},g=function(e){return function(t){!function(e,t){v({start:e.clientX,target:t,enable:!0})}(t,e)}};return te((function(){return window.addEventListener("mousemove",m),window.addEventListener("mouseup",y),function(){window.removeEventListener("mousemove",m),window.removeEventListener("mouseup",y)}}),[p]),_r("div",{className:"vm-predefined-dashboard",children:_r(Vo,{defaultExpanded:l,onChange:function(e){return c(e)},title:_r((function(){return _r("div",{className:Ri()({"vm-predefined-dashboard-header":!0,"vm-predefined-dashboard-header_open":l}),children:[(n||i)&&_r("span",{className:"vm-predefined-dashboard-header__title",children:n||"".concat(t+1,". ").concat(i)}),r&&_r("span",{className:"vm-predefined-dashboard-header__count",children:["(",r.length," panels)"]})]})}),{}),children:_r("div",{className:"vm-predefined-dashboard-panels",children:Array.isArray(r)&&r.length?r.map((function(e,t){return _r("div",{className:"vm-predefined-dashboard-panels-panel vm-block vm-block_empty-padding",style:{gridColumn:"span ".concat(f[t])},children:[_r(Wf,{title:e.title,description:e.description,unit:e.unit,expr:e.expr,alias:e.alias,filename:i,showLegend:e.showLegend}),_r("button",{className:"vm-predefined-dashboard-panels-panel__resizer",onMouseDown:g(t)})]},t)})):_r("div",{className:"vm-predefined-dashboard-panels-panel__alert",children:_r(mo,{variant:"error",children:[_r("code",{children:'"panels"'})," not found. Check the configuration file ",_r("b",{children:i}),"."]})})})})})},Gf=function(){!function(){var e=ri(),t=e.duration,n=e.relativeTime,r=e.period,i=r.date,o=r.step,a=function(){var e,r=nf((er(e={},"g0.range_input",t),er(e,"g0.end_input",i),er(e,"g0.step_input",o),er(e,"g0.relative_time",n),e));pr(r)};te(a,[t,n,i,o]),te(a,[])}();var e=St(X([]),2),t=e[0],n=e[1],r=St(X("0"),2),i=r[0],o=r[1],a=oe((function(){return t.map((function(e,t){return{label:e.title||"",value:"".concat(t),className:"vm-predefined-panels-tabs__tab"}}))}),[t]),u=oe((function(){return t[+i]||{}}),[t,i]),l=oe((function(){return null===u||void 0===u?void 0:u.rows}),[u]),c=oe((function(){return u.title||u.filename||""}),[u]),s=oe((function(){return Array.isArray(l)&&!!l.length}),[l]);return te((function(){lf().then((function(e){return e.length&&n(e)}))}),[]),_r("div",{className:"vm-predefined-panels",children:[!t.length&&_r(mo,{variant:"info",children:"Dashboards not found"}),a.length>1&&_r("div",{className:"vm-predefined-panels-tabs vm-block vm-block_empty-padding",children:_r(Hi,{activeItem:i,items:a,onChange:function(e){o(e)}})}),_r("div",{className:"vm-predefined-panels__dashboards",children:[s&&l.map((function(e,t){return _r(Qf,{index:t,filename:c,title:e.title,panels:e.panels},"".concat(i,"_").concat(t))})),!!t.length&&!s&&_r(mo,{variant:"error",children:[_r("code",{children:'"rows"'})," not found. Check the configuration file ",_r("b",{children:c}),"."]})]})]})},Jf=function(e,t){var n=t.match?"&match[]="+encodeURIComponent(t.match):"",r=t.focusLabel?"&focusLabel="+encodeURIComponent(t.focusLabel):"";return"".concat(e,"/api/v1/status/tsdb?topN=").concat(t.topN,"&date=").concat(t.date).concat(n).concat(r)},Zf=function(){function e(){Ft(this,e),this.tsdbStatus=void 0,this.tabsNames=void 0,this.tsdbStatus=this.defaultTSDBStatus,this.tabsNames=["table","graph"]}return Ot(e,[{key:"tsdbStatusData",get:function(){return this.tsdbStatus},set:function(e){this.tsdbStatus=e}},{key:"defaultTSDBStatus",get:function(){return{totalSeries:0,totalLabelValuePairs:0,seriesCountByMetricName:[],seriesCountByLabelName:[],seriesCountByFocusLabelValue:[],seriesCountByLabelValuePair:[],labelValueCountByLabelName:[]}}},{key:"keys",value:function(e){var t=[];return e&&(t=t.concat("seriesCountByFocusLabelValue")),t=t.concat("seriesCountByMetricName","seriesCountByLabelName","seriesCountByLabelValuePair","labelValueCountByLabelName"),t}},{key:"defaultState",get:function(){var e=this;return this.keys("job").reduce((function(t,n){return ar(ar({},t),{},{tabs:ar(ar({},t.tabs),{},er({},n,e.tabsNames)),containerRefs:ar(ar({},t.containerRefs),{},er({},n,re(null))),defaultActiveTab:ar(ar({},t.defaultActiveTab),{},er({},n,0))})}),{tabs:{},containerRefs:{},defaultActiveTab:{}})}},{key:"sectionsTitles",value:function(e){return{seriesCountByMetricName:"Metric names with the highest number of series",seriesCountByLabelName:"Labels with the highest number of series",seriesCountByFocusLabelValue:'Values for "'.concat(e,'" label with the highest number of series'),seriesCountByLabelValuePair:"Label=value pairs with the highest number of series",labelValueCountByLabelName:"Labels with the highest number of unique values"}}},{key:"tablesHeaders",get:function(){return{seriesCountByMetricName:Kf,seriesCountByLabelName:Xf,seriesCountByFocusLabelValue:ed,seriesCountByLabelValuePair:td,labelValueCountByLabelName:nd}}},{key:"totalSeries",value:function(e){return"labelValueCountByLabelName"===e?-1:this.tsdbStatus.totalSeries}}]),e}(),Kf=[{id:"name",label:"Metric name"},{id:"value",label:"Number of series"},{id:"percentage",label:"Percent of series"},{id:"action",label:"Action"}],Xf=[{id:"name",label:"Label name"},{id:"value",label:"Number of series"},{id:"percentage",label:"Percent of series"},{id:"action",label:"Action"}],ed=[{id:"name",label:"Label value"},{id:"value",label:"Number of series"},{id:"percentage",label:"Percent of series"},{disablePadding:!1,id:"action",label:"Action",numeric:!1}],td=[{id:"name",label:"Label=value pair"},{id:"value",label:"Number of series"},{id:"percentage",label:"Percent of series"},{id:"action",label:"Action"}],nd=[{id:"name",label:"Label name"},{id:"value",label:"Number of unique values"},{id:"action",label:"Action"}],rd={seriesCountByMetricName:function(e,t){return id("__name__",t)},seriesCountByLabelName:function(e,t){return"{".concat(t,'!=""}')},seriesCountByFocusLabelValue:function(e,t){return id(e,t)},seriesCountByLabelValuePair:function(e,t){var n=t.split("="),r=n[0],i=n.slice(1).join("=");return id(r,i)},labelValueCountByLabelName:function(e,t){return"{".concat(t,'!=""}')}},id=function(e,t){return e?"{"+e+"="+JSON.stringify(t)+"}":""},od=function(e){var t=e.topN,n=e.error,r=e.query,i=e.onSetHistory,o=e.onRunQuery,a=e.onSetQuery,u=e.onTopNChange,l=e.onFocusLabelChange,c=e.totalSeries,s=e.totalLabelValuePairs,f=e.date,d=e.match,h=e.focusLabel,p=ci().autocomplete,v=si(),m=Ws().queryOptions,y=oe((function(){return t<1?"Number must be bigger than zero":""}),[t]);return _r("div",{className:"vm-cardinality-configurator vm-block",children:[_r("div",{className:"vm-cardinality-configurator-controls",children:[_r("div",{className:"vm-cardinality-configurator-controls__query",children:_r(Ss,{value:r||d||"",autocomplete:p,options:m,error:n,onArrowUp:function(){i(-1)},onArrowDown:function(){i(1)},onEnter:o,onChange:a,label:"Time series selector"})}),_r("div",{className:"vm-cardinality-configurator-controls__item",children:_r($o,{label:"Number of entries per table",type:"number",value:t,error:y,onChange:u})}),_r("div",{className:"vm-cardinality-configurator-controls__item",children:_r($o,{label:"Focus label",type:"text",value:h||"",onChange:l})}),_r("div",{className:"vm-cardinality-configurator-controls__item",children:_r(Ts,{label:"Autocomplete",value:p,onChange:function(){v({type:"TOGGLE_AUTOCOMPLETE"})}})})]}),_r("div",{className:"vm-cardinality-configurator-bottom",children:[_r("div",{className:"vm-cardinality-configurator-bottom__info",children:["Analyzed ",_r("b",{children:c})," series with ",_r("b",{children:s}),' "label=value" pairs at ',_r("b",{children:f}),d&&_r("span",{children:[" for series selector ",_r("b",{children:d})]}),". Show top ",t," entries per table."]}),_r(bo,{startIcon:_r(Si,{}),onClick:o,children:"Execute Query"})]})]})};function ad(e){var t=e.order,n=e.orderBy,r=e.onRequestSort,i=e.headerCells;return _r("thead",{className:"vm-table-header",children:_r("tr",{className:"vm-table__row vm-table__row_header",children:i.map((function(e){return _r("th",{className:Ri()({"vm-table-cell vm-table-cell_header":!0,"vm-table-cell_sort":"action"!==e.id&&"percentage"!==e.id,"vm-table-cell_right":"action"===e.id}),onClick:(i=e.id,function(e){r(e,i)}),children:_r("div",{className:"vm-table-cell__content",children:[e.label,"action"!==e.id&&"percentage"!==e.id&&_r("div",{className:Ri()({"vm-table__sort-icon":!0,"vm-table__sort-icon_active":n===e.id,"vm-table__sort-icon_desc":"desc"===t&&n===e.id}),children:_r(wi,{})})]})},e.id);var i}))})})}function ud(e,t,n){return t[n]e[n]?1:0}function ld(e,t){return"desc"===e?function(e,n){return ud(e,n,t)}:function(e,n){return-ud(e,n,t)}}function cd(e,t){var n=e.map((function(e,t){return[e,t]}));return n.sort((function(e,n){var r=t(e[0],n[0]);return 0!==r?r:e[1]-n[1]})),n.map((function(e){return e[0]}))}var sd=function(e){var t=e.rows,n=e.headerCells,r=e.defaultSortColumn,i=e.tableCells,o=St(X("desc"),2),a=o[0],u=o[1],l=St(X(r),2),c=l[0],s=l[1],f=St(X([]),2),d=f[0],h=f[1],p=function(e){return function(){var t=d.indexOf(e),n=[];-1===t?n=n.concat(d,e):0===t?n=n.concat(d.slice(1)):t===d.length-1?n=n.concat(d.slice(0,-1)):t>0&&(n=n.concat(d.slice(0,t),d.slice(t+1))),h(n)}},v=cd(t,ld(a,c));return _r("table",{className:"vm-table",children:[_r(ad,{numSelected:d.length,order:a,orderBy:c,onSelectAllClick:function(e){if(e.target.checked){var n=t.map((function(e){return e.name}));h(n)}else h([])},onRequestSort:function(e,t){u(c===t&&"asc"===a?"desc":"asc"),s(t)},rowCount:t.length,headerCells:n}),_r("tbody",{className:"vm-table-header",children:v.map((function(e){return _r("tr",{className:Ri()({"vm-table__row":!0,"vm-table__row_selected":(t=e.name,-1!==d.indexOf(t))}),onClick:p(e.name),children:i(e)},e.name);var t}))})]})},fd=function(e){var t=e.row,n=e.totalSeries,r=e.onActionClick,i=n>0?t.value/n*100:-1;return _r(m,{children:[_r("td",{className:"vm-table-cell",children:t.name},t.name),_r("td",{className:"vm-table-cell",children:t.value},t.value),i>0&&_r("td",{className:"vm-table-cell",children:_r(Qs,{value:i})},t.progressValue),_r("td",{className:"vm-table-cell vm-table-cell_right",children:_r("div",{className:"vm-table-cell__content",children:_r(xo,{title:"Filter by ".concat(t.name),children:_r(bo,{variant:"text",size:"small",onClick:r,children:_r(Ai,{})})})})},"action")]})},dd=function(e){var t=e.data,n=e.container,r=e.configs,i=re(null),o=St(X(),2),a=o[0],u=o[1],l=So(n),c=ar(ar({},r),{},{width:l.width||400});return te((function(){if(i.current){var e=new Jc(c,t,i.current);return u(e),e.destroy}}),[i.current,l]),te((function(){a&&a.setData(t)}),[t]),_r("div",{style:{height:"100%"},children:_r("div",{ref:i})})},hd=function(e,t){return Math.round(e*(t=Math.pow(10,t)))/t},pd=1,vd=function(e,t,n,r){return hd(t+e*(n+r),6)},md=function(e,t,n,r,i){var o=1-t,a=n===pd?o/(e-1):2===n?o/e:3===n?o/(e+1):0;(isNaN(a)||a===1/0)&&(a=0);var u=n===pd?0:2===n?a/2:3===n?a:0,l=t/e,c=hd(l,6);if(null==r)for(var s=0;s=n&&e<=i&&t>=r&&t<=o};function gd(e,t,n,r,i){var o=this;o.x=e,o.y=t,o.w=n,o.h=r,o.l=i||0,o.o=[],o.q=null}var _d={split:function(){var e=this,t=e.x,n=e.y,r=e.w/2,i=e.h/2,o=e.l+1;e.q=[new gd(t+r,n,r,i,o),new gd(t,n,r,i,o),new gd(t,n+i,r,i,o),new gd(t+r,n+i,r,i,o)]},quads:function(e,t,n,r,i){var o=this,a=o.q,u=o.x+o.w/2,l=o.y+o.h/2,c=tu,d=t+r>l;c&&f&&i(a[0]),s&&c&&i(a[1]),s&&d&&i(a[2]),f&&d&&i(a[3])},add:function(e){var t=this;if(null!=t.q)t.quads(e.x,e.y,e.w,e.h,(function(t){t.add(e)}));else{var n=t.o;if(n.push(e),n.length>10&&t.l<4){t.split();for(var r=function(e){var r=n[e];t.quads(r.x,r.y,r.w,r.h,(function(e){e.add(r)}))},i=0;i=0?"left":"right",e.ctx.textBaseline=1===s?"middle":i[n]>=0?"bottom":"top",e.ctx.fillText(i[n],f,g)}}))})),e.ctx.restore()}function b(e,t,n){return[0,Jc.rangeNum(0,n,.05,!0)[1]]}return{hooks:{drawClear:function(t){var n;if((y=y||new gd(0,0,t.bbox.width,t.bbox.height)).clear(),t.series.forEach((function(e){e._paths=null})),l=d?[null].concat(m(t.data.length-1-o.length,t.data[0].length)):2===t.series.length?[null].concat(m(t.data[0].length,1)):[null].concat(function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:h,r=Array.from({length:t},(function(){return{offs:Array(e).fill(0),size:Array(e).fill(0)}}));return md(e,n,p,null,(function(e,n,i){md(t,1,v,null,(function(t,o,a){r[t].offs[e]=n+i*o,r[t].size[e]=i*a}))})),r}(t.data[0].length,t.data.length-1-o.length,1===t.data[0].length?1:h)),null!=(null===(n=e.disp)||void 0===n?void 0:n.fill)){c=[null];for(var r=1;r0&&!o.includes(t)&&Jc.assign(e,{paths:g,points:{show:_}})}))}}}((bd=[1],Dd=0,wd=1,xd=0,kd=function(e,t){return{stroke:e,fill:t}}({unit:3,values:function(e){return e.data[1].map((function(e,t){return 0!==t?"#33BB55":"#F79420"}))}},{unit:3,values:function(e){return e.data[1].map((function(e,t){return 0!==t?"#33BB55":"#F79420"}))}}),{which:bd,ori:Dd,dir:wd,radius:xd,disp:kd}))]},Ed=function(e){var t=e.rows,n=e.activeTab,r=e.onChange,i=e.tabs,o=e.chartContainer,a=e.totalSeries,u=e.tabId,l=e.onActionClick,c=e.sectionTitle,s=e.tableHeaderCells,f=oe((function(){return i.map((function(e,t){return{value:String(t),label:e,icon:_r(0===t?Ni:Fi,{})}}))}),[i]);return _r("div",{className:"vm-metrics-content vm-block",children:[_r("div",{className:"vm-metrics-content-header vm-section-header",children:[_r("h5",{className:"vm-section-header__title",children:c}),_r("div",{className:"vm-section-header__tabs",children:_r(Hi,{activeItem:String(n),items:f,onChange:function(e){r(e,u)}})})]}),_r("div",{ref:o,children:[0===n&&_r(sd,{rows:t,headerCells:s,defaultSortColumn:"value",tableCells:function(e){return _r(fd,{row:e,totalSeries:a,onActionClick:l})}}),1===n&&_r(dd,{data:[t.map((function(e){return e.name})),t.map((function(e){return e.value})),t.map((function(e,t){return t%12==0?1:t%10==0?2:0}))],container:(null===o||void 0===o?void 0:o.current)||null,configs:Cd})]})]})},Sd=function(){var e=uo(),t=e.topN,n=e.match,r=e.date,i=e.focusLabel,o=lo();!function(){var e=uo(),t=e.topN,n=e.match,r=e.date,i=e.focusLabel,o=e.extraLabel,a=function(){var e=nf({topN:t,date:r,match:n,extraLabel:o,focusLabel:i});pr(e)};te(a,[t,n,r,i,o]),te(a,[])}();var a=St(X(n||""),2),u=a[0],l=a[1],c=St(X(0),2),s=c[0],f=c[1],d=St(X([]),2),h=d[0],p=d[1],v=function(){var e=new Zf,t=uo(),n=t.topN,r=t.extraLabel,i=t.match,o=t.date,a=t.runQuery,u=t.focusLabel,l=Dr().serverUrl,c=St(X(!1),2),s=c[0],f=c[1],d=St(X(),2),h=d[0],p=d[1],v=St(X(e.defaultTSDBStatus),2),m=v[0],y=v[1];te((function(){h&&(y(e.defaultTSDBStatus),f(!1))}),[h]);var g=function(){var t=vs(hs().mark((function t(n){var r,i,o,a;return hs().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(l){t.next=2;break}return t.abrupt("return");case 2:return p(""),f(!0),y(e.defaultTSDBStatus),r=Jf(l,n),t.prev=6,t.next=9,fetch(r);case 9:return i=t.sent,t.next=12,i.json();case 12:o=t.sent,i.ok?(a=o.data,y(ar({},a)),f(!1)):(p(o.error),y(e.defaultTSDBStatus),f(!1)),t.next=20;break;case 16:t.prev=16,t.t0=t.catch(6),f(!1),t.t0 instanceof Error&&p("".concat(t.t0.name,": ").concat(t.t0.message));case 20:case"end":return t.stop()}}),t,null,[[6,16]])})));return function(e){return t.apply(this,arguments)}}();return te((function(){g({topN:n,extraLabel:r,match:i,date:o,focusLabel:u})}),[l,a,o]),e.tsdbStatusData=m,{isLoading:s,appConfigurator:e,error:h}}(),m=v.isLoading,y=v.appConfigurator,g=v.error,_=St(X(y.defaultState.defaultActiveTab),2),b=_[0],D=_[1],w=y.tsdbStatusData,x=y.defaultState,k=y.tablesHeaders,C=function(e,t){D(ar(ar({},b),{},er({},t,+e)))};return _r("div",{className:"vm-cardinality-panel",children:[m&&_r(qs,{message:"Please wait while cardinality stats is calculated. \n This may take some time if the db contains big number of time series."}),_r(od,{error:"",query:u,topN:t,date:r,match:n,totalSeries:w.totalSeries,totalLabelValuePairs:w.totalLabelValuePairs,focusLabel:i,onRunQuery:function(){p((function(e){return[].concat(At(e),[u])})),f((function(e){return e+1})),o({type:"SET_MATCH",payload:u}),o({type:"RUN_QUERY"})},onSetQuery:function(e){l(e)},onSetHistory:function(e){var t=s+e;t<0||t>=h.length||(f(t),l(h[t]))},onTopNChange:function(e){o({type:"SET_TOP_N",payload:+e})},onFocusLabelChange:function(e){o({type:"SET_FOCUS_LABEL",payload:e})}}),g&&_r(mo,{variant:"error",children:g}),y.keys(i).map((function(e){return _r(Ed,{sectionTitle:y.sectionsTitles(i)[e],activeTab:b[e],rows:w[e],onChange:C,onActionClick:(t=e,function(e){var n=e.currentTarget.id,r=rd[t](i,n);l(r),p((function(e){return[].concat(At(e),[r])})),f((function(e){return e+1})),o({type:"SET_MATCH",payload:r});var a="";"labelValueCountByLabelName"!==t&&"seriesCountByLabelName"!=t||(a=n),o({type:"SET_FOCUS_LABEL",payload:a}),o({type:"RUN_QUERY"})}),tabs:x.tabs[e],chartContainer:x.containerRefs[e],totalSeries:y.totalSeries(e),tabId:e,tableHeaderCells:k[e]},e);var t}))]})},Ad=function(e){var t=e.rows,n=e.columns,r=St(X(e.defaultOrderBy||"count"),2),i=r[0],o=r[1],a=St(X("desc"),2),u=a[0],l=a[1],c=oe((function(){return cd(t,ld(u,i))}),[t,i,u]),s=function(e){return function(){var t;t=e,l((function(e){return"asc"===e&&i===t?"desc":"asc"})),o(t)}};return _r("table",{className:"vm-table",children:[_r("thead",{className:"vm-table-header",children:_r("tr",{className:"vm-table__row vm-table__row_header",children:n.map((function(e){return _r("th",{className:"vm-table-cell vm-table-cell_header vm-table-cell_sort",onClick:s(e.key),children:_r("div",{className:"vm-table-cell__content",children:[e.title||e.key,_r("div",{className:Ri()({"vm-table__sort-icon":!0,"vm-table__sort-icon_active":i===e.key,"vm-table__sort-icon_desc":"desc"===u&&i===e.key}),children:_r(wi,{})})]})},e.key)}))})}),_r("tbody",{className:"vm-table-body",children:c.map((function(e,t){return _r("tr",{className:"vm-table__row",children:n.map((function(t){return _r("td",{className:"vm-table-cell",children:e[t.key]||"-"},t.key)}))},t)}))})]})},Fd=["table","JSON"].map((function(e,t){return{value:String(t),label:e,icon:_r(0===t?Ni:Oi,{})}})),Nd=function(e){var t=e.rows,n=e.title,r=e.columns,i=e.defaultOrderBy,o=St(X(0),2),a=o[0],u=o[1];return _r("div",{className:"vm-top-queries-panel vm-block",children:[_r("div",{className:"vm-top-queries-panel-header vm-section-header",children:[_r("h5",{className:"vm-section-header__title",children:n}),_r("div",{className:"vm-section-header__tabs",children:_r(Hi,{activeItem:String(a),items:Fd,onChange:function(e){u(+e)}})})]}),_r("div",{children:[0===a&&_r(Ad,{rows:t,columns:r,defaultOrderBy:i}),1===a&&_r(Us,{data:t})]})]})},Od=function(){var e=function(){var e=Dr().serverUrl,t=po(),n=t.topN,r=t.maxLifetime,i=t.runQuery,o=St(X(null),2),a=o[0],u=o[1],l=St(X(!1),2),c=l[0],s=l[1],f=St(X(),2),d=f[0],h=f[1],p=oe((function(){return function(e,t,n){return"".concat(e,"/api/v1/status/top_queries?topN=").concat(t||"","&maxLifetime=").concat(n||"")}(e,n,r)}),[e,n,r]),v=function(){var e=vs(hs().mark((function e(){var t,n;return hs().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return s(!0),e.prev=1,e.next=4,fetch(p);case 4:return t=e.sent,e.next=7,t.json();case 7:n=e.sent,t.ok&&["topByAvgDuration","topByCount","topBySumDuration"].forEach((function(e){var t=n[e];Array.isArray(t)&&t.forEach((function(e){return e.timeRangeHours=+(e.timeRangeSeconds/3600).toFixed(2)}))})),u(t.ok?n:null),h(String(n.error||"")),e.next=16;break;case 13:e.prev=13,e.t0=e.catch(1),e.t0 instanceof Error&&"AbortError"!==e.t0.name&&h("".concat(e.t0.name,": ").concat(e.t0.message));case 16:s(!1);case 17:case"end":return e.stop()}}),e,null,[[1,13]])})));return function(){return e.apply(this,arguments)}}();return te((function(){v()}),[i]),{data:a,error:d,loading:c}}(),t=e.data,n=e.error,r=e.loading,i=po(),o=i.topN,a=i.maxLifetime,u=ue(ho).dispatch;!function(){var e=po(),t=e.topN,n=e.maxLifetime,r=function(){var e=nf({topN:String(t),maxLifetime:n});pr(e)};te(r,[t,n]),te(r,[])}();var l=oe((function(){var e=a.trim().split(" ").reduce((function(e,t){var n=Mr(t);return n?ar(ar({},e),n):ar({},e)}),{});return!!gt().duration(e).asMilliseconds()}),[a]),c=oe((function(){return!!o&&o<1}),[o]),s=oe((function(){return c?"Number must be bigger than zero":""}),[c]),f=oe((function(){return l?"":"Invalid duration value"}),[l]),d=function(e){if(!t)return e;var n=t[e];return"number"===typeof n?es(n):n||e},h=function(){u({type:"SET_RUN_QUERY"})},p=function(e){"Enter"===e.key&&h()};return te((function(){t&&(o||u({type:"SET_TOP_N",payload:+t.topN}),a||u({type:"SET_MAX_LIFE_TIME",payload:t.maxLifetime}))}),[t]),_r("div",{className:"vm-top-queries",children:[r&&_r(qs,{containerStyles:{height:"500px"}}),_r("div",{className:"vm-top-queries-controls vm-block",children:[_r("div",{className:"vm-top-queries-controls__fields",children:[_r($o,{label:"Max lifetime",value:a,error:f,helperText:"For example ".concat("30ms, 15s, 3d4h, 1y2w"),onChange:function(e){u({type:"SET_MAX_LIFE_TIME",payload:e})},onKeyDown:p}),_r($o,{label:"Number of returned queries",type:"number",value:o||"",error:s,onChange:function(e){u({type:"SET_TOP_N",payload:+e})},onKeyDown:p})]}),_r("div",{className:"vm-top-queries-controls-bottom",children:[_r("div",{className:"vm-top-queries-controls-bottom__info",children:["VictoriaMetrics tracks the last\xa0",_r(xo,{title:"search.queryStats.lastQueriesCount",children:_r("b",{children:d("search.queryStats.lastQueriesCount")})}),"\xa0queries with durations at least\xa0",_r(xo,{title:"search.queryStats.minQueryDuration",children:_r("b",{children:d("search.queryStats.minQueryDuration")})})]}),_r("div",{className:"vm-top-queries-controls-bottom__button",children:_r(bo,{startIcon:_r(Si,{}),onClick:h,children:"Execute"})})]})]}),n&&_r(mo,{variant:"error",children:n}),t&&_r(m,{children:_r("div",{className:"vm-top-queries-panels",children:[_r(Nd,{rows:t.topByCount,title:"Most frequently executed queries",columns:[{key:"query"},{key:"timeRangeHours",title:"time range, hours"},{key:"count"}]}),_r(Nd,{rows:t.topByAvgDuration,title:"Most heavy queries",columns:[{key:"query"},{key:"avgDurationSeconds",title:"avg duration, seconds"},{key:"timeRangeHours",title:"time range, hours"},{key:"count"}],defaultOrderBy:"avgDurationSeconds"}),_r(Nd,{rows:t.topBySumDuration,title:"Queries with most summary time to execute",columns:[{key:"query"},{key:"sumDurationSeconds",title:"sum duration, seconds"},{key:"timeRangeHours",title:"time range, hours"},{key:"count"}],defaultOrderBy:"sumDurationSeconds"})]})})]})},Td=["primary","secondary","error","warning","info","success"],Md=function(e){var t=e.setLoadingTheme,n=ur().palette,r=void 0===n?{}:n,i=function(){Td.forEach((function(e){var t=function(e){var t=e.replace("#","").trim();if(3===t.length&&(t=t[0]+t[0]+t[1]+t[1]+t[2]+t[2]),6!==t.length)throw new Error("Invalid HEX color.");return(299*parseInt(t.slice(0,2),16)+587*parseInt(t.slice(2,4),16)+114*parseInt(t.slice(4,6),16))/1e3>=128?"#000000":"#FFFFFF"}(ji("color-".concat(e)));Ui("".concat(e,"-text"),t)}))};return te((function(){Td.forEach((function(e){var t=r[e];t&&Ui("color-".concat(e),t)})),function(){var e=window,t=e.innerWidth,n=e.innerHeight,r=document.documentElement,i=r.clientWidth,o=r.clientHeight;Ui("scrollbar-width","".concat(t-i,"px")),Ui("scrollbar-height","".concat(n-o,"px"))}(),i(),t(!1)}),[]),null},Bd=function(){var e=St(X(!1),2),t=e[0],n=e[1],r=St(X([]),2),i=r[0],o=r[1],a=St(X([]),2),u=a[0],l=a[1],s=oe((function(){return!!i.length}),[i]),f=function(){n(!0)},d=function(){n(!1)},h=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";l((function(n){return[{filename:t,text:": ".concat(e.message)}].concat(At(n))}))},p=function(e,t){try{var n=JSON.parse(e),r=n.trace||n;if(!r.duration_msec)return void h(new Error(To.traceNotFound),t);var i=new Rs(r,t);o((function(e){return[i].concat(At(e))}))}catch(c){c instanceof Error&&h(c,t)}},v=function(e){l([]),Array.from(e.target.files||[]).map((function(e){var t=new FileReader,n=(null===e||void 0===e?void 0:e.name)||"";t.onload=function(e){var t,r=String(null===(t=e.target)||void 0===t?void 0:t.result);p(r,n)},t.readAsText(e)})),e.target.value=""},m=function(e){return function(){!function(e){l((function(t){return t.filter((function(t,n){return n!==e}))}))}(e)}},y=function(){return _r("div",{className:"vm-trace-page-controls",children:[_r(bo,{variant:"outlined",onClick:f,children:"Paste JSON"}),_r(xo,{title:"The file must contain tracing information in JSON format",children:_r(bo,{children:["Upload Files",_r("input",{id:"json",type:"file",accept:"application/json",multiple:!0,title:" ",onChange:v})]})})]})};return _r("div",{className:"vm-trace-page",children:[_r("div",{className:"vm-trace-page-header",children:[_r("div",{className:"vm-trace-page-header-errors",children:u.map((function(e,t){return _r("div",{className:"vm-trace-page-header-errors-item",children:[_r(mo,{variant:"error",children:[_r("b",{className:"vm-trace-page-header-errors-item__filename",children:e.filename}),_r("span",{children:e.text})]}),_r(bo,{className:"vm-trace-page-header-errors-item__close",startIcon:_r(hi,{}),variant:"text",color:"error",onClick:m(t)})]},"".concat(e,"_").concat(t))}))}),_r("div",{children:s&&_r(y,{})})]}),s&&_r("div",{children:_r(Zs,{jsonEditor:!0,traces:i,onDeleteClick:function(e){var t=i.filter((function(t){return t.idValue!==e.idValue}));o(At(t))}})}),!s&&_r("div",{className:"vm-trace-page-preview",children:[_r("p",{className:"vm-trace-page-preview__text",children:["Please, upload file with JSON response content.","\n","The file must contain tracing information in JSON format.","\n","In order to use tracing please refer to the doc:\xa0",_r("a",{href:"https://docs.victoriametrics.com/#query-tracing",target:"_blank",rel:"noreferrer",children:"https://docs.victoriametrics.com/#query-tracing"}),"\n","Tracing graph will be displayed after file upload."]}),_r(y,{})]}),t&&_r(Uo,{title:"Paste JSON",onClose:d,children:_r(Js,{editable:!0,displayTitle:!0,defaultTile:"JSON ".concat(i.length+1),onClose:d,onUpload:p})})]})},Ld=function(){var e=St(X(!0),2),t=e[0],n=e[1];return _r(m,t?{children:[_r(qs,{}),_r(Md,{setLoadingTheme:n}),";"]}:{children:_r(Jn,{children:_r(_o,{children:_r(Qn,{children:_r(qn,{path:"/",element:_r(ta,{}),children:[_r(qn,{path:ir.home,element:_r(af,{})}),_r(qn,{path:ir.dashboards,element:_r(Gf,{})}),_r(qn,{path:ir.cardinality,element:_r(Sd,{})}),_r(qn,{path:ir.topQueries,element:_r(Od,{})}),_r(qn,{path:ir.trace,element:_r(Bd,{})})]})})})})})},Pd=function(e){e&&n.e(27).then(n.bind(n,27)).then((function(t){var n=t.getCLS,r=t.getFID,i=t.getFCP,o=t.getLCP,a=t.getTTFB;n(e),r(e),i(e),o(e),a(e)}))},Id=document.getElementById("root");Id&&Ye(_r(Ld,{}),Id),Pd()}()}();
\ No newline at end of file
diff --git a/app/vmselect/vmui/static/js/main.e18cda26.js.LICENSE.txt b/app/vmselect/vmui/static/js/main.c552245f.js.LICENSE.txt
similarity index 100%
rename from app/vmselect/vmui/static/js/main.e18cda26.js.LICENSE.txt
rename to app/vmselect/vmui/static/js/main.c552245f.js.LICENSE.txt
diff --git a/app/vmselect/vmui/static/js/main.e18cda26.js b/app/vmselect/vmui/static/js/main.e18cda26.js
deleted file mode 100644
index 6c631acf06..0000000000
--- a/app/vmselect/vmui/static/js/main.e18cda26.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/*! For license information please see main.e18cda26.js.LICENSE.txt */
-!function(){var e={680:function(e,t,n){"use strict";var r=n(476),i=n(962),o=i(r("String.prototype.indexOf"));e.exports=function(e,t){var n=r(e,!!t);return"function"===typeof n&&o(e,".prototype.")>-1?i(n):n}},962:function(e,t,n){"use strict";var r=n(199),i=n(476),o=i("%Function.prototype.apply%"),a=i("%Function.prototype.call%"),u=i("%Reflect.apply%",!0)||r.call(a,o),l=i("%Object.getOwnPropertyDescriptor%",!0),c=i("%Object.defineProperty%",!0),s=i("%Math.max%");if(c)try{c({},"a",{value:1})}catch(d){c=null}e.exports=function(e){var t=u(r,a,arguments);if(l&&c){var n=l(t,"length");n.configurable&&c(t,"length",{value:1+s(0,e.length-(arguments.length-1))})}return t};var f=function(){return u(r,o,arguments)};c?c(e.exports,"apply",{value:f}):e.exports.apply=f},123:function(e,t){var n;!function(){"use strict";var r={}.hasOwnProperty;function i(){for(var e=[],t=0;t=t?e:""+Array(t+1-r.length).join(n)+e},g={s:y,z:function(e){var t=-e.utcOffset(),n=Math.abs(t),r=Math.floor(n/60),i=n%60;return(t<=0?"+":"-")+y(r,2,"0")+":"+y(i,2,"0")},m:function e(t,n){if(t.date()1)return e(a[0])}else{var u=t.name;b[u]=t,i=u}return!r&&i&&(_=i),i||!r&&_},x=function(e,t){if(D(e))return e.clone();var n="object"==typeof t?t:{};return n.date=e,n.args=arguments,new C(n)},k=g;k.l=w,k.i=D,k.w=function(e,t){return x(e,{locale:t.$L,utc:t.$u,x:t.$x,$offset:t.$offset})};var C=function(){function m(e){this.$L=w(e.locale,null,!0),this.parse(e)}var y=m.prototype;return y.parse=function(e){this.$d=function(e){var t=e.date,n=e.utc;if(null===t)return new Date(NaN);if(k.u(t))return new Date;if(t instanceof Date)return new Date(t);if("string"==typeof t&&!/Z$/i.test(t)){var r=t.match(p);if(r){var i=r[2]-1||0,o=(r[7]||"0").substring(0,3);return n?new Date(Date.UTC(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,o)):new Date(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,o)}}return new Date(t)}(e),this.$x=e.x||{},this.init()},y.init=function(){var e=this.$d;this.$y=e.getFullYear(),this.$M=e.getMonth(),this.$D=e.getDate(),this.$W=e.getDay(),this.$H=e.getHours(),this.$m=e.getMinutes(),this.$s=e.getSeconds(),this.$ms=e.getMilliseconds()},y.$utils=function(){return k},y.isValid=function(){return!(this.$d.toString()===h)},y.isSame=function(e,t){var n=x(e);return this.startOf(t)<=n&&n<=this.endOf(t)},y.isAfter=function(e,t){return x(e)1&&"boolean"!==typeof t)throw new a('"allowMissing" argument must be a boolean');if(null===k(/^%?[^%]*%?$/,e))throw new i("`%` may not be present anywhere but at the beginning and end of the intrinsic name");var n=S(e),r=n.length>0?n[0]:"",o=A("%"+r+"%",t),u=o.name,c=o.value,s=!1,f=o.alias;f&&(r=f[0],D(n,b([0,1],f)));for(var d=1,h=!0;d=n.length){var g=l(c,p);c=(h=!!g)&&"get"in g&&!("originalValue"in g.get)?g.get:c[p]}else h=_(c,p),c=c[p];h&&!s&&(v[u]=c)}}return c}},520:function(e,t,n){"use strict";var r="undefined"!==typeof Symbol&&Symbol,i=n(541);e.exports=function(){return"function"===typeof r&&("function"===typeof Symbol&&("symbol"===typeof r("foo")&&("symbol"===typeof Symbol("bar")&&i())))}},541:function(e){"use strict";e.exports=function(){if("function"!==typeof Symbol||"function"!==typeof Object.getOwnPropertySymbols)return!1;if("symbol"===typeof Symbol.iterator)return!0;var e={},t=Symbol("test"),n=Object(t);if("string"===typeof t)return!1;if("[object Symbol]"!==Object.prototype.toString.call(t))return!1;if("[object Symbol]"!==Object.prototype.toString.call(n))return!1;for(t in e[t]=42,e)return!1;if("function"===typeof Object.keys&&0!==Object.keys(e).length)return!1;if("function"===typeof Object.getOwnPropertyNames&&0!==Object.getOwnPropertyNames(e).length)return!1;var r=Object.getOwnPropertySymbols(e);if(1!==r.length||r[0]!==t)return!1;if(!Object.prototype.propertyIsEnumerable.call(e,t))return!1;if("function"===typeof Object.getOwnPropertyDescriptor){var i=Object.getOwnPropertyDescriptor(e,t);if(42!==i.value||!0!==i.enumerable)return!1}return!0}},838:function(e,t,n){"use strict";var r=n(199);e.exports=r.call(Function.call,Object.prototype.hasOwnProperty)},936:function(e,t,n){var r=/^\s+|\s+$/g,i=/^[-+]0x[0-9a-f]+$/i,o=/^0b[01]+$/i,a=/^0o[0-7]+$/i,u=parseInt,l="object"==typeof n.g&&n.g&&n.g.Object===Object&&n.g,c="object"==typeof self&&self&&self.Object===Object&&self,s=l||c||Function("return this")(),f=Object.prototype.toString,d=Math.max,h=Math.min,p=function(){return s.Date.now()};function v(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}function m(e){if("number"==typeof e)return e;if(function(e){return"symbol"==typeof e||function(e){return!!e&&"object"==typeof e}(e)&&"[object Symbol]"==f.call(e)}(e))return NaN;if(v(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=v(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(r,"");var n=o.test(e);return n||a.test(e)?u(e.slice(2),n?2:8):i.test(e)?NaN:+e}e.exports=function(e,t,n){var r,i,o,a,u,l,c=0,s=!1,f=!1,y=!0;if("function"!=typeof e)throw new TypeError("Expected a function");function g(t){var n=r,o=i;return r=i=void 0,c=t,a=e.apply(o,n)}function _(e){return c=e,u=setTimeout(D,t),s?g(e):a}function b(e){var n=e-l;return void 0===l||n>=t||n<0||f&&e-c>=o}function D(){var e=p();if(b(e))return w(e);u=setTimeout(D,function(e){var n=t-(e-l);return f?h(n,o-(e-c)):n}(e))}function w(e){return u=void 0,y&&r?g(e):(r=i=void 0,a)}function x(){var e=p(),n=b(e);if(r=arguments,i=this,l=e,n){if(void 0===u)return _(l);if(f)return u=setTimeout(D,t),g(l)}return void 0===u&&(u=setTimeout(D,t)),a}return t=m(t)||0,v(n)&&(s=!!n.leading,o=(f="maxWait"in n)?d(m(n.maxWait)||0,t):o,y="trailing"in n?!!n.trailing:y),x.cancel=function(){void 0!==u&&clearTimeout(u),c=0,r=l=i=u=void 0},x.flush=function(){return void 0===u?a:w(p())},x}},7:function(e,t,n){var r="__lodash_hash_undefined__",i="[object Function]",o="[object GeneratorFunction]",a=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,u=/^\w*$/,l=/^\./,c=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,s=/\\(\\)?/g,f=/^\[object .+?Constructor\]$/,d="object"==typeof n.g&&n.g&&n.g.Object===Object&&n.g,h="object"==typeof self&&self&&self.Object===Object&&self,p=d||h||Function("return this")();var v=Array.prototype,m=Function.prototype,y=Object.prototype,g=p["__core-js_shared__"],_=function(){var e=/[^.]+$/.exec(g&&g.keys&&g.keys.IE_PROTO||"");return e?"Symbol(src)_1."+e:""}(),b=m.toString,D=y.hasOwnProperty,w=y.toString,x=RegExp("^"+b.call(D).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),k=p.Symbol,C=v.splice,E=I(p,"Map"),S=I(Object,"create"),A=k?k.prototype:void 0,F=A?A.toString:void 0;function N(e){var t=-1,n=e?e.length:0;for(this.clear();++t-1},O.prototype.set=function(e,t){var n=this.__data__,r=B(n,e);return r<0?n.push([e,t]):n[r][1]=t,this},T.prototype.clear=function(){this.__data__={hash:new N,map:new(E||O),string:new N}},T.prototype.delete=function(e){return P(this,e).delete(e)},T.prototype.get=function(e){return P(this,e).get(e)},T.prototype.has=function(e){return P(this,e).has(e)},T.prototype.set=function(e,t){return P(this,e).set(e,t),this};var $=j((function(e){var t;e=null==(t=e)?"":function(e){if("string"==typeof e)return e;if(H(e))return F?F.call(e):"";var t=e+"";return"0"==t&&1/e==-1/0?"-0":t}(t);var n=[];return l.test(e)&&n.push(""),e.replace(c,(function(e,t,r,i){n.push(r?i.replace(s,"$1"):t||e)})),n}));function R(e){if("string"==typeof e||H(e))return e;var t=e+"";return"0"==t&&1/e==-1/0?"-0":t}function j(e,t){if("function"!=typeof e||t&&"function"!=typeof t)throw new TypeError("Expected a function");var n=function n(){var r=arguments,i=t?t.apply(this,r):r[0],o=n.cache;if(o.has(i))return o.get(i);var a=e.apply(this,r);return n.cache=o.set(i,a),a};return n.cache=new(j.Cache||T),n}j.Cache=T;var z=Array.isArray;function U(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}function H(e){return"symbol"==typeof e||function(e){return!!e&&"object"==typeof e}(e)&&"[object Symbol]"==w.call(e)}e.exports=function(e,t,n){var r=null==e?void 0:M(e,t);return void 0===r?n:r}},61:function(e,t,n){var r="Expected a function",i=/^\s+|\s+$/g,o=/^[-+]0x[0-9a-f]+$/i,a=/^0b[01]+$/i,u=/^0o[0-7]+$/i,l=parseInt,c="object"==typeof n.g&&n.g&&n.g.Object===Object&&n.g,s="object"==typeof self&&self&&self.Object===Object&&self,f=c||s||Function("return this")(),d=Object.prototype.toString,h=Math.max,p=Math.min,v=function(){return f.Date.now()};function m(e,t,n){var i,o,a,u,l,c,s=0,f=!1,d=!1,m=!0;if("function"!=typeof e)throw new TypeError(r);function _(t){var n=i,r=o;return i=o=void 0,s=t,u=e.apply(r,n)}function b(e){return s=e,l=setTimeout(w,t),f?_(e):u}function D(e){var n=e-c;return void 0===c||n>=t||n<0||d&&e-s>=a}function w(){var e=v();if(D(e))return x(e);l=setTimeout(w,function(e){var n=t-(e-c);return d?p(n,a-(e-s)):n}(e))}function x(e){return l=void 0,m&&i?_(e):(i=o=void 0,u)}function k(){var e=v(),n=D(e);if(i=arguments,o=this,c=e,n){if(void 0===l)return b(c);if(d)return l=setTimeout(w,t),_(c)}return void 0===l&&(l=setTimeout(w,t)),u}return t=g(t)||0,y(n)&&(f=!!n.leading,a=(d="maxWait"in n)?h(g(n.maxWait)||0,t):a,m="trailing"in n?!!n.trailing:m),k.cancel=function(){void 0!==l&&clearTimeout(l),s=0,i=c=o=l=void 0},k.flush=function(){return void 0===l?u:x(v())},k}function y(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}function g(e){if("number"==typeof e)return e;if(function(e){return"symbol"==typeof e||function(e){return!!e&&"object"==typeof e}(e)&&"[object Symbol]"==d.call(e)}(e))return NaN;if(y(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=y(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(i,"");var n=a.test(e);return n||u.test(e)?l(e.slice(2),n?2:8):o.test(e)?NaN:+e}e.exports=function(e,t,n){var i=!0,o=!0;if("function"!=typeof e)throw new TypeError(r);return y(n)&&(i="leading"in n?!!n.leading:i,o="trailing"in n?!!n.trailing:o),m(e,t,{leading:i,maxWait:t,trailing:o})}},154:function(e,t,n){var r="function"===typeof Map&&Map.prototype,i=Object.getOwnPropertyDescriptor&&r?Object.getOwnPropertyDescriptor(Map.prototype,"size"):null,o=r&&i&&"function"===typeof i.get?i.get:null,a=r&&Map.prototype.forEach,u="function"===typeof Set&&Set.prototype,l=Object.getOwnPropertyDescriptor&&u?Object.getOwnPropertyDescriptor(Set.prototype,"size"):null,c=u&&l&&"function"===typeof l.get?l.get:null,s=u&&Set.prototype.forEach,f="function"===typeof WeakMap&&WeakMap.prototype?WeakMap.prototype.has:null,d="function"===typeof WeakSet&&WeakSet.prototype?WeakSet.prototype.has:null,h="function"===typeof WeakRef&&WeakRef.prototype?WeakRef.prototype.deref:null,p=Boolean.prototype.valueOf,v=Object.prototype.toString,m=Function.prototype.toString,y=String.prototype.match,g=String.prototype.slice,_=String.prototype.replace,b=String.prototype.toUpperCase,D=String.prototype.toLowerCase,w=RegExp.prototype.test,x=Array.prototype.concat,k=Array.prototype.join,C=Array.prototype.slice,E=Math.floor,S="function"===typeof BigInt?BigInt.prototype.valueOf:null,A=Object.getOwnPropertySymbols,F="function"===typeof Symbol&&"symbol"===typeof Symbol.iterator?Symbol.prototype.toString:null,N="function"===typeof Symbol&&"object"===typeof Symbol.iterator,O="function"===typeof Symbol&&Symbol.toStringTag&&(typeof Symbol.toStringTag===N||"symbol")?Symbol.toStringTag:null,T=Object.prototype.propertyIsEnumerable,B=("function"===typeof Reflect?Reflect.getPrototypeOf:Object.getPrototypeOf)||([].__proto__===Array.prototype?function(e){return e.__proto__}:null);function M(e,t){if(e===1/0||e===-1/0||e!==e||e&&e>-1e3&&e<1e3||w.call(/e/,t))return t;var n=/[0-9](?=(?:[0-9]{3})+(?![0-9]))/g;if("number"===typeof e){var r=e<0?-E(-e):E(e);if(r!==e){var i=String(r),o=g.call(t,i.length+1);return _.call(i,n,"$&_")+"."+_.call(_.call(o,/([0-9]{3})/g,"$&_"),/_$/,"")}}return _.call(t,n,"$&_")}var L=n(654),P=L.custom,I=U(P)?P:null;function $(e,t,n){var r="double"===(n.quoteStyle||t)?'"':"'";return r+e+r}function R(e){return _.call(String(e),/"/g,""")}function j(e){return"[object Array]"===V(e)&&(!O||!("object"===typeof e&&O in e))}function z(e){return"[object RegExp]"===V(e)&&(!O||!("object"===typeof e&&O in e))}function U(e){if(N)return e&&"object"===typeof e&&e instanceof Symbol;if("symbol"===typeof e)return!0;if(!e||"object"!==typeof e||!F)return!1;try{return F.call(e),!0}catch(t){}return!1}e.exports=function e(t,n,r,i){var u=n||{};if(Y(u,"quoteStyle")&&"single"!==u.quoteStyle&&"double"!==u.quoteStyle)throw new TypeError('option "quoteStyle" must be "single" or "double"');if(Y(u,"maxStringLength")&&("number"===typeof u.maxStringLength?u.maxStringLength<0&&u.maxStringLength!==1/0:null!==u.maxStringLength))throw new TypeError('option "maxStringLength", if provided, must be a positive integer, Infinity, or `null`');var l=!Y(u,"customInspect")||u.customInspect;if("boolean"!==typeof l&&"symbol"!==l)throw new TypeError("option \"customInspect\", if provided, must be `true`, `false`, or `'symbol'`");if(Y(u,"indent")&&null!==u.indent&&"\t"!==u.indent&&!(parseInt(u.indent,10)===u.indent&&u.indent>0))throw new TypeError('option "indent" must be "\\t", an integer > 0, or `null`');if(Y(u,"numericSeparator")&&"boolean"!==typeof u.numericSeparator)throw new TypeError('option "numericSeparator", if provided, must be `true` or `false`');var v=u.numericSeparator;if("undefined"===typeof t)return"undefined";if(null===t)return"null";if("boolean"===typeof t)return t?"true":"false";if("string"===typeof t)return W(t,u);if("number"===typeof t){if(0===t)return 1/0/t>0?"0":"-0";var b=String(t);return v?M(t,b):b}if("bigint"===typeof t){var w=String(t)+"n";return v?M(t,w):w}var E="undefined"===typeof u.depth?5:u.depth;if("undefined"===typeof r&&(r=0),r>=E&&E>0&&"object"===typeof t)return j(t)?"[Array]":"[Object]";var A=function(e,t){var n;if("\t"===e.indent)n="\t";else{if(!("number"===typeof e.indent&&e.indent>0))return null;n=k.call(Array(e.indent+1)," ")}return{base:n,prev:k.call(Array(t+1),n)}}(u,r);if("undefined"===typeof i)i=[];else if(q(i,t)>=0)return"[Circular]";function P(t,n,o){if(n&&(i=C.call(i)).push(n),o){var a={depth:u.depth};return Y(u,"quoteStyle")&&(a.quoteStyle=u.quoteStyle),e(t,a,r+1,i)}return e(t,u,r+1,i)}if("function"===typeof t&&!z(t)){var H=function(e){if(e.name)return e.name;var t=y.call(m.call(e),/^function\s*([\w$]+)/);if(t)return t[1];return null}(t),Q=X(t,P);return"[Function"+(H?": "+H:" (anonymous)")+"]"+(Q.length>0?" { "+k.call(Q,", ")+" }":"")}if(U(t)){var ee=N?_.call(String(t),/^(Symbol\(.*\))_[^)]*$/,"$1"):F.call(t);return"object"!==typeof t||N?ee:G(ee)}if(function(e){if(!e||"object"!==typeof e)return!1;if("undefined"!==typeof HTMLElement&&e instanceof HTMLElement)return!0;return"string"===typeof e.nodeName&&"function"===typeof e.getAttribute}(t)){for(var te="<"+D.call(String(t.nodeName)),ne=t.attributes||[],re=0;re",t.childNodes&&t.childNodes.length&&(te+="..."),te+=""+D.call(String(t.nodeName))+">"}if(j(t)){if(0===t.length)return"[]";var ie=X(t,P);return A&&!function(e){for(var t=0;t=0)return!1;return!0}(ie)?"["+K(ie,A)+"]":"[ "+k.call(ie,", ")+" ]"}if(function(e){return"[object Error]"===V(e)&&(!O||!("object"===typeof e&&O in e))}(t)){var oe=X(t,P);return"cause"in Error.prototype||!("cause"in t)||T.call(t,"cause")?0===oe.length?"["+String(t)+"]":"{ ["+String(t)+"] "+k.call(oe,", ")+" }":"{ ["+String(t)+"] "+k.call(x.call("[cause]: "+P(t.cause),oe),", ")+" }"}if("object"===typeof t&&l){if(I&&"function"===typeof t[I]&&L)return L(t,{depth:E-r});if("symbol"!==l&&"function"===typeof t.inspect)return t.inspect()}if(function(e){if(!o||!e||"object"!==typeof e)return!1;try{o.call(e);try{c.call(e)}catch(te){return!0}return e instanceof Map}catch(t){}return!1}(t)){var ae=[];return a.call(t,(function(e,n){ae.push(P(n,t,!0)+" => "+P(e,t))})),Z("Map",o.call(t),ae,A)}if(function(e){if(!c||!e||"object"!==typeof e)return!1;try{c.call(e);try{o.call(e)}catch(t){return!0}return e instanceof Set}catch(n){}return!1}(t)){var ue=[];return s.call(t,(function(e){ue.push(P(e,t))})),Z("Set",c.call(t),ue,A)}if(function(e){if(!f||!e||"object"!==typeof e)return!1;try{f.call(e,f);try{d.call(e,d)}catch(te){return!0}return e instanceof WeakMap}catch(t){}return!1}(t))return J("WeakMap");if(function(e){if(!d||!e||"object"!==typeof e)return!1;try{d.call(e,d);try{f.call(e,f)}catch(te){return!0}return e instanceof WeakSet}catch(t){}return!1}(t))return J("WeakSet");if(function(e){if(!h||!e||"object"!==typeof e)return!1;try{return h.call(e),!0}catch(t){}return!1}(t))return J("WeakRef");if(function(e){return"[object Number]"===V(e)&&(!O||!("object"===typeof e&&O in e))}(t))return G(P(Number(t)));if(function(e){if(!e||"object"!==typeof e||!S)return!1;try{return S.call(e),!0}catch(t){}return!1}(t))return G(P(S.call(t)));if(function(e){return"[object Boolean]"===V(e)&&(!O||!("object"===typeof e&&O in e))}(t))return G(p.call(t));if(function(e){return"[object String]"===V(e)&&(!O||!("object"===typeof e&&O in e))}(t))return G(P(String(t)));if(!function(e){return"[object Date]"===V(e)&&(!O||!("object"===typeof e&&O in e))}(t)&&!z(t)){var le=X(t,P),ce=B?B(t)===Object.prototype:t instanceof Object||t.constructor===Object,se=t instanceof Object?"":"null prototype",fe=!ce&&O&&Object(t)===t&&O in t?g.call(V(t),8,-1):se?"Object":"",de=(ce||"function"!==typeof t.constructor?"":t.constructor.name?t.constructor.name+" ":"")+(fe||se?"["+k.call(x.call([],fe||[],se||[]),": ")+"] ":"");return 0===le.length?de+"{}":A?de+"{"+K(le,A)+"}":de+"{ "+k.call(le,", ")+" }"}return String(t)};var H=Object.prototype.hasOwnProperty||function(e){return e in this};function Y(e,t){return H.call(e,t)}function V(e){return v.call(e)}function q(e,t){if(e.indexOf)return e.indexOf(t);for(var n=0,r=e.length;nt.maxStringLength){var n=e.length-t.maxStringLength,r="... "+n+" more character"+(n>1?"s":"");return W(g.call(e,0,t.maxStringLength),t)+r}return $(_.call(_.call(e,/(['\\])/g,"\\$1"),/[\x00-\x1f]/g,Q),"single",t)}function Q(e){var t=e.charCodeAt(0),n={8:"b",9:"t",10:"n",12:"f",13:"r"}[t];return n?"\\"+n:"\\x"+(t<16?"0":"")+b.call(t.toString(16))}function G(e){return"Object("+e+")"}function J(e){return e+" { ? }"}function Z(e,t,n,r){return e+" ("+t+") {"+(r?K(n,r):k.call(n,", "))+"}"}function K(e,t){if(0===e.length)return"";var n="\n"+t.prev+t.base;return n+k.call(e,","+n)+"\n"+t.prev}function X(e,t){var n=j(e),r=[];if(n){r.length=e.length;for(var i=0;i-1?e.split(","):e},c=function(e,t,n,r){if(e){var o=n.allowDots?e.replace(/\.([^.[]+)/g,"[$1]"):e,a=/(\[[^[\]]*])/g,u=n.depth>0&&/(\[[^[\]]*])/.exec(o),c=u?o.slice(0,u.index):o,s=[];if(c){if(!n.plainObjects&&i.call(Object.prototype,c)&&!n.allowPrototypes)return;s.push(c)}for(var f=0;n.depth>0&&null!==(u=a.exec(o))&&f=0;--o){var a,u=e[o];if("[]"===u&&n.parseArrays)a=[].concat(i);else{a=n.plainObjects?Object.create(null):{};var c="["===u.charAt(0)&&"]"===u.charAt(u.length-1)?u.slice(1,-1):u,s=parseInt(c,10);n.parseArrays||""!==c?!isNaN(s)&&u!==c&&String(s)===c&&s>=0&&n.parseArrays&&s<=n.arrayLimit?(a=[])[s]=i:"__proto__"!==c&&(a[c]=i):a={0:i}}i=a}return i}(s,t,n,r)}};e.exports=function(e,t){var n=function(e){if(!e)return a;if(null!==e.decoder&&void 0!==e.decoder&&"function"!==typeof e.decoder)throw new TypeError("Decoder has to be a function.");if("undefined"!==typeof e.charset&&"utf-8"!==e.charset&&"iso-8859-1"!==e.charset)throw new TypeError("The charset option must be either utf-8, iso-8859-1, or undefined");var t="undefined"===typeof e.charset?a.charset:e.charset;return{allowDots:"undefined"===typeof e.allowDots?a.allowDots:!!e.allowDots,allowPrototypes:"boolean"===typeof e.allowPrototypes?e.allowPrototypes:a.allowPrototypes,allowSparse:"boolean"===typeof e.allowSparse?e.allowSparse:a.allowSparse,arrayLimit:"number"===typeof e.arrayLimit?e.arrayLimit:a.arrayLimit,charset:t,charsetSentinel:"boolean"===typeof e.charsetSentinel?e.charsetSentinel:a.charsetSentinel,comma:"boolean"===typeof e.comma?e.comma:a.comma,decoder:"function"===typeof e.decoder?e.decoder:a.decoder,delimiter:"string"===typeof e.delimiter||r.isRegExp(e.delimiter)?e.delimiter:a.delimiter,depth:"number"===typeof e.depth||!1===e.depth?+e.depth:a.depth,ignoreQueryPrefix:!0===e.ignoreQueryPrefix,interpretNumericEntities:"boolean"===typeof e.interpretNumericEntities?e.interpretNumericEntities:a.interpretNumericEntities,parameterLimit:"number"===typeof e.parameterLimit?e.parameterLimit:a.parameterLimit,parseArrays:!1!==e.parseArrays,plainObjects:"boolean"===typeof e.plainObjects?e.plainObjects:a.plainObjects,strictNullHandling:"boolean"===typeof e.strictNullHandling?e.strictNullHandling:a.strictNullHandling}}(t);if(""===e||null===e||"undefined"===typeof e)return n.plainObjects?Object.create(null):{};for(var s="string"===typeof e?function(e,t){var n,c={},s=t.ignoreQueryPrefix?e.replace(/^\?/,""):e,f=t.parameterLimit===1/0?void 0:t.parameterLimit,d=s.split(t.delimiter,f),h=-1,p=t.charset;if(t.charsetSentinel)for(n=0;n-1&&(m=o(m)?[m]:m),i.call(c,v)?c[v]=r.combine(c[v],m):c[v]=m}return c}(e,n):e,f=n.plainObjects?Object.create(null):{},d=Object.keys(s),h=0;h0?C.join(",")||null:void 0}];else if(l(h))M=h;else{var P=Object.keys(C);M=m?P.sort(m):P}for(var I=a&&l(C)&&1===C.length?n+"[]":n,$=0;$0?D+b:""}},837:function(e,t,n){"use strict";var r=n(609),i=Object.prototype.hasOwnProperty,o=Array.isArray,a=function(){for(var e=[],t=0;t<256;++t)e.push("%"+((t<16?"0":"")+t.toString(16)).toUpperCase());return e}(),u=function(e,t){for(var n=t&&t.plainObjects?Object.create(null):{},r=0;r1;){var t=e.pop(),n=t.obj[t.prop];if(o(n)){for(var r=[],i=0;i=48&&s<=57||s>=65&&s<=90||s>=97&&s<=122||o===r.RFC1738&&(40===s||41===s)?l+=u.charAt(c):s<128?l+=a[s]:s<2048?l+=a[192|s>>6]+a[128|63&s]:s<55296||s>=57344?l+=a[224|s>>12]+a[128|s>>6&63]+a[128|63&s]:(c+=1,s=65536+((1023&s)<<10|1023&u.charCodeAt(c)),l+=a[240|s>>18]+a[128|s>>12&63]+a[128|s>>6&63]+a[128|63&s])}return l},isBuffer:function(e){return!(!e||"object"!==typeof e)&&!!(e.constructor&&e.constructor.isBuffer&&e.constructor.isBuffer(e))},isRegExp:function(e){return"[object RegExp]"===Object.prototype.toString.call(e)},maybeMap:function(e,t){if(o(e)){for(var n=[],r=0;r2&&(u.children=arguments.length>3?t.call(arguments,2):r),"function"==typeof e&&null!=e.defaultProps)for(a in e.defaultProps)void 0===u[a]&&(u[a]=e.defaultProps[a]);return p(e,u,i,o,null)}function p(e,t,n,o,a){var u={type:e,props:t,key:n,ref:o,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,__h:null,constructor:void 0,__v:null==a?++i:a};return null==a&&null!=r.vnode&&r.vnode(u),u}function v(){return{current:null}}function m(e){return e.children}function y(e,t){this.props=e,this.context=t}function g(e,t){if(null==t)return e.__?g(e.__,e.__.__k.indexOf(e)+1):null;for(var n;t0?p(y.type,y.props,y.key,y.ref?y.ref:null,y.__v):y)){if(y.__=n,y.__b=n.__b+1,null===(v=w[d])||v&&y.key==v.key&&y.type===v.type)w[d]=void 0;else for(h=0;h2&&(u.children=arguments.length>3?t.call(arguments,2):r),p(e.type,u,i||e.key,o||e.ref,null)}function R(e,t){var n={__c:t="__cC"+u++,__:e,Consumer:function(e,t){return e.children(t)},Provider:function(e){var n,r;return this.getChildContext||(n=[],(r={})[t]=this,this.getChildContext=function(){return r},this.shouldComponentUpdate=function(e){this.props.value!==e.value&&n.some(b)},this.sub=function(e){n.push(e);var t=e.componentWillUnmount;e.componentWillUnmount=function(){n.splice(n.indexOf(e),1),t&&t.call(e)}}),e.children}};return n.Provider.__=n.Consumer.contextType=n}t=c.slice,r={__e:function(e,t,n,r){for(var i,o,a;t=t.__;)if((i=t.__c)&&!i.__)try{if((o=i.constructor)&&null!=o.getDerivedStateFromError&&(i.setState(o.getDerivedStateFromError(e)),a=i.__d),null!=i.componentDidCatch&&(i.componentDidCatch(e,r||{}),a=i.__d),a)return i.__E=i}catch(t){e=t}throw e}},i=0,y.prototype.setState=function(e,t){var n;n=null!=this.__s&&this.__s!==this.state?this.__s:this.__s=f({},this.state),"function"==typeof e&&(e=e(f({},n),this.props)),e&&f(n,e),null!=e&&this.__v&&(t&&this._sb.push(t),b(this))},y.prototype.forceUpdate=function(e){this.__v&&(this.__e=!0,e&&this.__h.push(e),b(this))},y.prototype.render=m,o=[],D.__r=0,u=0;var j,z,U,H,Y=0,V=[],q=[],W=r.__b,Q=r.__r,G=r.diffed,J=r.__c,Z=r.unmount;function K(e,t){r.__h&&r.__h(z,e,Y||t),Y=0;var n=z.__H||(z.__H={__:[],__h:[]});return e>=n.__.length&&n.__.push({__V:q}),n.__[e]}function X(e){return Y=1,ee(ye,e)}function ee(e,t,n){var r=K(j++,2);if(r.t=e,!r.__c&&(r.__=[n?n(t):ye(void 0,t),function(e){var t=r.__N?r.__N[0]:r.__[0],n=r.t(t,e);t!==n&&(r.__N=[n,r.__[1]],r.__c.setState({}))}],r.__c=z,!z.u)){z.u=!0;var i=z.shouldComponentUpdate;z.shouldComponentUpdate=function(e,t,n){if(!r.__c.__H)return!0;var o=r.__c.__H.__.filter((function(e){return e.__c}));if(o.every((function(e){return!e.__N})))return!i||i.call(this,e,t,n);var a=!1;return o.forEach((function(e){if(e.__N){var t=e.__[0];e.__=e.__N,e.__N=void 0,t!==e.__[0]&&(a=!0)}})),!(!a&&r.__c.props===e)&&(!i||i.call(this,e,t,n))}}return r.__N||r.__}function te(e,t){var n=K(j++,3);!r.__s&&me(n.__H,t)&&(n.__=e,n.i=t,z.__H.__h.push(n))}function ne(e,t){var n=K(j++,4);!r.__s&&me(n.__H,t)&&(n.__=e,n.i=t,z.__h.push(n))}function re(e){return Y=5,oe((function(){return{current:e}}),[])}function ie(e,t,n){Y=6,ne((function(){return"function"==typeof e?(e(t()),function(){return e(null)}):e?(e.current=t(),function(){return e.current=null}):void 0}),null==n?n:n.concat(e))}function oe(e,t){var n=K(j++,7);return me(n.__H,t)?(n.__V=e(),n.i=t,n.__h=e,n.__V):n.__}function ae(e,t){return Y=8,oe((function(){return e}),t)}function ue(e){var t=z.context[e.__c],n=K(j++,9);return n.c=e,t?(null==n.__&&(n.__=!0,t.sub(z)),t.props.value):e.__}function le(e,t){r.useDebugValue&&r.useDebugValue(t?t(e):e)}function ce(e){var t=K(j++,10),n=X();return t.__=e,z.componentDidCatch||(z.componentDidCatch=function(e,r){t.__&&t.__(e,r),n[1](e)}),[n[0],function(){n[1](void 0)}]}function se(){var e=K(j++,11);if(!e.__){for(var t=z.__v;null!==t&&!t.__m&&null!==t.__;)t=t.__;var n=t.__m||(t.__m=[0,0]);e.__="P"+n[0]+"-"+n[1]++}return e.__}function fe(){for(var e;e=V.shift();)if(e.__P&&e.__H)try{e.__H.__h.forEach(pe),e.__H.__h.forEach(ve),e.__H.__h=[]}catch(u){e.__H.__h=[],r.__e(u,e.__v)}}r.__b=function(e){z=null,W&&W(e)},r.__r=function(e){Q&&Q(e),j=0;var t=(z=e.__c).__H;t&&(U===z?(t.__h=[],z.__h=[],t.__.forEach((function(e){e.__N&&(e.__=e.__N),e.__V=q,e.__N=e.i=void 0}))):(t.__h.forEach(pe),t.__h.forEach(ve),t.__h=[])),U=z},r.diffed=function(e){G&&G(e);var t=e.__c;t&&t.__H&&(t.__H.__h.length&&(1!==V.push(t)&&H===r.requestAnimationFrame||((H=r.requestAnimationFrame)||he)(fe)),t.__H.__.forEach((function(e){e.i&&(e.__H=e.i),e.__V!==q&&(e.__=e.__V),e.i=void 0,e.__V=q}))),U=z=null},r.__c=function(e,t){t.some((function(e){try{e.__h.forEach(pe),e.__h=e.__h.filter((function(e){return!e.__||ve(e)}))}catch(i){t.some((function(e){e.__h&&(e.__h=[])})),t=[],r.__e(i,e.__v)}})),J&&J(e,t)},r.unmount=function(e){Z&&Z(e);var t,n=e.__c;n&&n.__H&&(n.__H.__.forEach((function(e){try{pe(e)}catch(e){t=e}})),n.__H=void 0,t&&r.__e(t,n.__v))};var de="function"==typeof requestAnimationFrame;function he(e){var t,n=function(){clearTimeout(r),de&&cancelAnimationFrame(t),setTimeout(e)},r=setTimeout(n,100);de&&(t=requestAnimationFrame(n))}function pe(e){var t=z,n=e.__c;"function"==typeof n&&(e.__c=void 0,n()),z=t}function ve(e){var t=z;e.__c=e.__(),z=t}function me(e,t){return!e||e.length!==t.length||t.some((function(t,n){return t!==e[n]}))}function ye(e,t){return"function"==typeof t?t(e):t}function ge(e,t){for(var n in t)e[n]=t[n];return e}function _e(e,t){for(var n in e)if("__source"!==n&&!(n in t))return!0;for(var r in t)if("__source"!==r&&e[r]!==t[r])return!0;return!1}function be(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t}function De(e){this.props=e}function we(e,t){function n(e){var n=this.props.ref,r=n==e.ref;return!r&&n&&(n.call?n(null):n.current=null),t?!t(this.props,e)||!r:_e(this.props,e)}function r(t){return this.shouldComponentUpdate=n,h(e,t)}return r.displayName="Memo("+(e.displayName||e.name)+")",r.prototype.isReactComponent=!0,r.__f=!0,r}(De.prototype=new y).isPureReactComponent=!0,De.prototype.shouldComponentUpdate=function(e,t){return _e(this.props,e)||_e(this.state,t)};var xe=r.__b;r.__b=function(e){e.type&&e.type.__f&&e.ref&&(e.props.ref=e.ref,e.ref=null),xe&&xe(e)};var ke="undefined"!=typeof Symbol&&Symbol.for&&Symbol.for("react.forward_ref")||3911;function Ce(e){function t(t){var n=ge({},t);return delete n.ref,e(n,t.ref||null)}return t.$$typeof=ke,t.render=t,t.prototype.isReactComponent=t.__f=!0,t.displayName="ForwardRef("+(e.displayName||e.name)+")",t}var Ee=function(e,t){return null==e?null:k(k(e).map(t))},Se={map:Ee,forEach:Ee,count:function(e){return e?k(e).length:0},only:function(e){var t=k(e);if(1!==t.length)throw"Children.only";return t[0]},toArray:k},Ae=r.__e;r.__e=function(e,t,n,r){if(e.then)for(var i,o=t;o=o.__;)if((i=o.__c)&&i.__c)return null==t.__e&&(t.__e=n.__e,t.__k=n.__k),i.__c(e,t);Ae(e,t,n,r)};var Fe=r.unmount;function Ne(e,t,n){return e&&(e.__c&&e.__c.__H&&(e.__c.__H.__.forEach((function(e){"function"==typeof e.__c&&e.__c()})),e.__c.__H=null),null!=(e=ge({},e)).__c&&(e.__c.__P===n&&(e.__c.__P=t),e.__c=null),e.__k=e.__k&&e.__k.map((function(e){return Ne(e,t,n)}))),e}function Oe(e,t,n){return e&&(e.__v=null,e.__k=e.__k&&e.__k.map((function(e){return Oe(e,t,n)})),e.__c&&e.__c.__P===t&&(e.__e&&n.insertBefore(e.__e,e.__d),e.__c.__e=!0,e.__c.__P=n)),e}function Te(){this.__u=0,this.t=null,this.__b=null}function Be(e){var t=e.__.__c;return t&&t.__a&&t.__a(e)}function Me(e){var t,n,r;function i(i){if(t||(t=e()).then((function(e){n=e.default||e}),(function(e){r=e})),r)throw r;if(!n)throw t;return h(n,i)}return i.displayName="Lazy",i.__f=!0,i}function Le(){this.u=null,this.o=null}r.unmount=function(e){var t=e.__c;t&&t.__R&&t.__R(),t&&!0===e.__h&&(e.type=null),Fe&&Fe(e)},(Te.prototype=new y).__c=function(e,t){var n=t.__c,r=this;null==r.t&&(r.t=[]),r.t.push(n);var i=Be(r.__v),o=!1,a=function(){o||(o=!0,n.__R=null,i?i(u):u())};n.__R=a;var u=function(){if(!--r.__u){if(r.state.__a){var e=r.state.__a;r.__v.__k[0]=Oe(e,e.__c.__P,e.__c.__O)}var t;for(r.setState({__a:r.__b=null});t=r.t.pop();)t.forceUpdate()}},l=!0===t.__h;r.__u++||l||r.setState({__a:r.__b=r.__v.__k[0]}),e.then(a,a)},Te.prototype.componentWillUnmount=function(){this.t=[]},Te.prototype.render=function(e,t){if(this.__b){if(this.__v.__k){var n=document.createElement("div"),r=this.__v.__k[0].__c;this.__v.__k[0]=Ne(this.__b,n,r.__O=r.__P)}this.__b=null}var i=t.__a&&h(m,null,e.fallback);return i&&(i.__h=null),[h(m,null,t.__a?null:e.children),i]};var Pe=function(e,t,n){if(++n[1]===n[0]&&e.o.delete(t),e.props.revealOrder&&("t"!==e.props.revealOrder[0]||!e.o.size))for(n=e.u;n;){for(;n.length>3;)n.pop()();if(n[1]>>1,1),t.i.removeChild(e)}}),P(h(Ie,{context:t.context},e.__v),t.l)):t.l&&t.componentWillUnmount()}function Re(e,t){var n=h($e,{__v:e,i:t});return n.containerInfo=t,n}(Le.prototype=new y).__a=function(e){var t=this,n=Be(t.__v),r=t.o.get(e);return r[0]++,function(i){var o=function(){t.props.revealOrder?(r.push(i),Pe(t,e,r)):i()};n?n(o):o()}},Le.prototype.render=function(e){this.u=null,this.o=new Map;var t=k(e.children);e.revealOrder&&"b"===e.revealOrder[0]&&t.reverse();for(var n=t.length;n--;)this.o.set(t[n],this.u=[1,0,this.u]);return e.children},Le.prototype.componentDidUpdate=Le.prototype.componentDidMount=function(){var e=this;this.o.forEach((function(t,n){Pe(e,n,t)}))};var je="undefined"!=typeof Symbol&&Symbol.for&&Symbol.for("react.element")||60103,ze=/^(?:accent|alignment|arabic|baseline|cap|clip(?!PathU)|color|dominant|fill|flood|font|glyph(?!R)|horiz|image|letter|lighting|marker(?!H|W|U)|overline|paint|pointer|shape|stop|strikethrough|stroke|text(?!L)|transform|underline|unicode|units|v|vector|vert|word|writing|x(?!C))[A-Z]/,Ue="undefined"!=typeof document,He=function(e){return("undefined"!=typeof Symbol&&"symbol"==typeof Symbol()?/fil|che|rad/i:/fil|che|ra/i).test(e)};function Ye(e,t,n){return null==t.__k&&(t.textContent=""),P(e,t),"function"==typeof n&&n(),e?e.__c:null}function Ve(e,t,n){return I(e,t),"function"==typeof n&&n(),e?e.__c:null}y.prototype.isReactComponent={},["componentWillMount","componentWillReceiveProps","componentWillUpdate"].forEach((function(e){Object.defineProperty(y.prototype,e,{configurable:!0,get:function(){return this["UNSAFE_"+e]},set:function(t){Object.defineProperty(this,e,{configurable:!0,writable:!0,value:t})}})}));var qe=r.event;function We(){}function Qe(){return this.cancelBubble}function Ge(){return this.defaultPrevented}r.event=function(e){return qe&&(e=qe(e)),e.persist=We,e.isPropagationStopped=Qe,e.isDefaultPrevented=Ge,e.nativeEvent=e};var Je,Ze={configurable:!0,get:function(){return this.class}},Ke=r.vnode;r.vnode=function(e){var t=e.type,n=e.props,r=n;if("string"==typeof t){var i=-1===t.indexOf("-");for(var o in r={},n){var a=n[o];Ue&&"children"===o&&"noscript"===t||"value"===o&&"defaultValue"in n&&null==a||("defaultValue"===o&&"value"in n&&null==n.value?o="value":"download"===o&&!0===a?a="":/ondoubleclick/i.test(o)?o="ondblclick":/^onchange(textarea|input)/i.test(o+t)&&!He(n.type)?o="oninput":/^onfocus$/i.test(o)?o="onfocusin":/^onblur$/i.test(o)?o="onfocusout":/^on(Ani|Tra|Tou|BeforeInp|Compo)/.test(o)?o=o.toLowerCase():i&&ze.test(o)?o=o.replace(/[A-Z0-9]/g,"-$&").toLowerCase():null===a&&(a=void 0),/^oninput$/i.test(o)&&(o=o.toLowerCase(),r[o]&&(o="oninputCapture")),r[o]=a)}"select"==t&&r.multiple&&Array.isArray(r.value)&&(r.value=k(n.children).forEach((function(e){e.props.selected=-1!=r.value.indexOf(e.props.value)}))),"select"==t&&null!=r.defaultValue&&(r.value=k(n.children).forEach((function(e){e.props.selected=r.multiple?-1!=r.defaultValue.indexOf(e.props.value):r.defaultValue==e.props.value}))),e.props=r,n.class!=n.className&&(Ze.enumerable="className"in n,null!=n.className&&(r.class=n.className),Object.defineProperty(r,"className",Ze))}e.$$typeof=je,Ke&&Ke(e)};var Xe=r.__r;r.__r=function(e){Xe&&Xe(e),Je=e.__c};var et={ReactCurrentDispatcher:{current:{readContext:function(e){return Je.__n[e.__c].props.value}}}},tt="17.0.2";function nt(e){return h.bind(null,e)}function rt(e){return!!e&&e.$$typeof===je}function it(e){return rt(e)?$.apply(null,arguments):e}function ot(e){return!!e.__k&&(P(null,e),!0)}function at(e){return e&&(e.base||1===e.nodeType&&e)||null}var ut=function(e,t){return e(t)},lt=function(e,t){return e(t)},ct=m;function st(e){e()}function ft(e){return e}function dt(){return[!1,st]}var ht=ne;function pt(e,t){var n=t(),r=X({h:{__:n,v:t}}),i=r[0].h,o=r[1];return ne((function(){i.__=n,i.v=t,be(i.__,t())||o({h:i})}),[e,n,t]),te((function(){return be(i.__,i.v())||o({h:i}),e((function(){be(i.__,i.v())||o({h:i})}))}),[e]),n}var vt,mt={useState:X,useId:se,useReducer:ee,useEffect:te,useLayoutEffect:ne,useInsertionEffect:ht,useTransition:dt,useDeferredValue:ft,useSyncExternalStore:pt,startTransition:st,useRef:re,useImperativeHandle:ie,useMemo:oe,useCallback:ae,useContext:ue,useDebugValue:le,version:"17.0.2",Children:Se,render:Ye,hydrate:Ve,unmountComponentAtNode:ot,createPortal:Re,createElement:h,createContext:R,createFactory:nt,cloneElement:it,createRef:v,Fragment:m,isValidElement:rt,findDOMNode:at,Component:y,PureComponent:De,memo:we,forwardRef:Ce,flushSync:lt,unstable_batchedUpdates:ut,StrictMode:ct,Suspense:Te,SuspenseList:Le,lazy:Me,__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED:et};function yt(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n=0&&(t.hash=e.substr(n),e=e.substr(0,n));var r=e.indexOf("?");r>=0&&(t.search=e.substr(r),e=e.substr(0,r)),e&&(t.pathname=e)}return t}function zt(e){var t="undefined"!==typeof window&&"undefined"!==typeof window.location&&"null"!==window.location.origin?window.location.origin:"unknown://unknown",n="string"===typeof e?e:Rt(e);return new URL(n,t)}function Ut(e,t,n,r){void 0===r&&(r={});var i=r,o=i.window,a=void 0===o?document.defaultView:o,u=i.v5Compat,l=void 0!==u&&u,c=a.history,s=vt.Pop,f=null;function d(){s=vt.Pop,f&&f({action:s,location:h.location})}var h={get action(){return s},get location(){return e(a,c)},listen:function(e){if(f)throw new Error("A history only accepts one active listener");return a.addEventListener(Lt,d),f=e,function(){a.removeEventListener(Lt,d),f=null}},createHref:function(e){return t(a,e)},encodeLocation:function(e){var t=zt(Rt(e));return Bt({},e,{pathname:t.pathname,search:t.search,hash:t.hash})},push:function(e,t){s=vt.Push;var r=$t(h.location,e,t);n&&n(r,e);var i=It(r),o=h.createHref(r);try{c.pushState(i,"",o)}catch(u){a.location.assign(o)}l&&f&&f({action:s,location:h.location})},replace:function(e,t){s=vt.Replace;var r=$t(h.location,e,t);n&&n(r,e);var i=It(r),o=h.createHref(r);c.replaceState(i,"",o),l&&f&&f({action:s,location:h.location})},go:function(e){return c.go(e)}};return h}function Ht(e,t,n){void 0===n&&(n="/");var r=Zt(("string"===typeof t?jt(t):t).pathname||"/",n);if(null==r)return null;var i=Yt(e);!function(e){e.sort((function(e,t){return e.score!==t.score?t.score-e.score:function(e,t){var n=e.length===t.length&&e.slice(0,-1).every((function(e,n){return e===t[n]}));return n?e[e.length-1]-t[t.length-1]:0}(e.routesMeta.map((function(e){return e.childrenIndex})),t.routesMeta.map((function(e){return e.childrenIndex})))}))}(i);for(var o=null,a=0;null==o&&a0&&(Kt(!0!==e.index,'Index routes must not have child routes. Please remove all child routes from route path "'+a+'".'),Yt(e.children,t,u,a)),(null!=e.path||e.index)&&t.push({path:a,score:Wt(a,e.index),routesMeta:u})})),t}!function(e){e.data="data",e.deferred="deferred",e.redirect="redirect",e.error="error"}(Mt||(Mt={}));var Vt=/^:\w+$/,qt=function(e){return"*"===e};function Wt(e,t){var n=e.split("/"),r=n.length;return n.some(qt)&&(r+=-2),t&&(r+=2),n.filter((function(e){return!qt(e)})).reduce((function(e,t){return e+(Vt.test(t)?3:""===t?1:10)}),r)}function Qt(e,t){for(var n=e.routesMeta,r={},i="/",o=[],a=0;a and the router will parse it for you.'}function tn(e){return e.filter((function(e,t){return 0===t||e.route.path&&e.route.path.length>0}))}function nn(e,t,n,r){var i;void 0===r&&(r=!1),"string"===typeof e?i=jt(e):(Kt(!(i=Bt({},e)).pathname||!i.pathname.includes("?"),en("?","pathname","search",i)),Kt(!i.pathname||!i.pathname.includes("#"),en("#","pathname","hash",i)),Kt(!i.search||!i.search.includes("#"),en("#","search","hash",i)));var o,a=""===e||""===i.pathname,u=a?"/":i.pathname;if(r||null==u)o=n;else{var l=t.length-1;if(u.startsWith("..")){for(var c=u.split("/");".."===c[0];)c.shift(),l-=1;i.pathname=c.join("/")}o=l>=0?t[l]:"/"}var s=function(e,t){void 0===t&&(t="/");var n="string"===typeof e?jt(e):e,r=n.pathname,i=n.search,o=void 0===i?"":i,a=n.hash,u=void 0===a?"":a,l=r?r.startsWith("/")?r:function(e,t){var n=t.replace(/\/+$/,"").split("/");return e.split("/").forEach((function(e){".."===e?n.length>1&&n.pop():"."!==e&&n.push(e)})),n.length>1?n.join("/"):"/"}(r,t):t;return{pathname:l,search:an(o),hash:un(u)}}(i,o),f=u&&"/"!==u&&u.endsWith("/"),d=(a||"."===u)&&n.endsWith("/");return s.pathname.endsWith("/")||!f&&!d||(s.pathname+="/"),s}var rn=function(e){return e.join("/").replace(/\/\/+/g,"/")},on=function(e){return e.replace(/\/+$/,"").replace(/^\/*/,"/")},an=function(e){return e&&"?"!==e?e.startsWith("?")?e:"?"+e:""},un=function(e){return e&&"#"!==e?e.startsWith("#")?e:"#"+e:""};Error;var ln=xt((function e(t,n,r){Dt(this,e),this.status=t,this.statusText=n||"",this.data=r}));function cn(e){return e instanceof ln}"undefined"!==typeof window&&"undefined"!==typeof window.document&&window.document.createElement;var sn=new Set(["POST","PUT","PATCH","DELETE"]);new Set(["GET","HEAD"].concat(bt(sn)));function fn(){return fn=Object.assign?Object.assign.bind():function(e){for(var t=1;t")))}var Nn,On,Tn=function(e){Ct(n,e);var t=Nt(n);function n(e){var r;return Dt(this,n),(r=t.call(this,e)).state={location:e.location,error:e.error},r}return xt(n,[{key:"componentDidCatch",value:function(e,t){console.error("React Router caught the following error during render",e,t)}},{key:"render",value:function(){return this.state.error?h(kn.Provider,{value:this.state.error,children:this.props.component}):this.props.children}}],[{key:"getDerivedStateFromError",value:function(e){return{error:e}}},{key:"getDerivedStateFromProps",value:function(e,t){return t.location!==e.location?{error:e.error,location:e.location}:{error:e.error||t.error,location:t.location}}}]),n}(y);function Bn(e){var t=e.routeContext,n=e.match,r=e.children,i=ue(gn);return i&&n.route.errorElement&&(i._deepestRenderedBoundaryId=n.route.id),h(xn.Provider,{value:t},r)}function Mn(e,t,n){if(void 0===t&&(t=[]),null==e){if(null==n||!n.errors)return null;e=n.matches}var r=e,i=null==n?void 0:n.errors;if(null!=i){var o=r.findIndex((function(e){return e.route.id&&(null==i?void 0:i[e.route.id])}));o>=0||Kt(!1),r=r.slice(0,Math.min(r.length,o+1))}return r.reduceRight((function(e,o,a){var u=o.route.id?null==i?void 0:i[o.route.id]:null,l=n?o.route.errorElement||h(Fn,null):null,c=function(){return h(Bn,{match:o,routeContext:{outlet:e,matches:t.concat(r.slice(0,a+1))}},u?l:void 0!==o.route.element?o.route.element:e)};return n&&(o.route.errorElement||0===a)?h(Tn,{location:n.location,component:l,error:u,children:c()}):c()}),null)}function Ln(e){var t=ue(bn);return t||Kt(!1),t}!function(e){e.UseRevalidator="useRevalidator"}(Nn||(Nn={})),function(e){e.UseLoaderData="useLoaderData",e.UseActionData="useActionData",e.UseRouteError="useRouteError",e.UseNavigation="useNavigation",e.UseRouteLoaderData="useRouteLoaderData",e.UseMatches="useMatches",e.UseRevalidator="useRevalidator"}(On||(On={}));var Pn;function In(e){return function(e){var t=ue(xn).outlet;return t?h(An.Provider,{value:e},t):t}(e.context)}function $n(e){Kt(!1)}function Rn(e){var t=e.basename,n=void 0===t?"/":t,r=e.children,i=void 0===r?null:r,o=e.location,a=e.navigationType,u=void 0===a?vt.Pop:a,l=e.navigator,c=e.static,s=void 0!==c&&c;Cn()&&Kt(!1);var f=n.replace(/^\/*/,"/"),d=oe((function(){return{basename:f,navigator:l,static:s}}),[f,l,s]);"string"===typeof o&&(o=jt(o));var p=o,v=p.pathname,m=void 0===v?"/":v,y=p.search,g=void 0===y?"":y,_=p.hash,b=void 0===_?"":_,D=p.state,w=void 0===D?null:D,x=p.key,k=void 0===x?"default":x,C=oe((function(){var e=Zt(m,f);return null==e?null:{pathname:e,search:g,hash:b,state:w,key:k}}),[f,m,g,b,w,k]);return null==C?null:h(Dn.Provider,{value:d},h(wn.Provider,{children:i,value:{location:C,navigationType:u}}))}function jn(e){var t=e.children,n=e.location,r=ue(_n);return function(e,t){Cn()||Kt(!1);var n,r=ue(bn),i=ue(xn).matches,o=i[i.length-1],a=o?o.params:{},u=(o&&o.pathname,o?o.pathnameBase:"/"),l=(o&&o.route,En());if(t){var c,s="string"===typeof t?jt(t):t;"/"===u||(null==(c=s.pathname)?void 0:c.startsWith(u))||Kt(!1),n=s}else n=l;var f=n.pathname||"/",d=Ht(e,{pathname:"/"===u?f:f.slice(u.length)||"/"}),p=Mn(d&&d.map((function(e){return Object.assign({},e,{params:Object.assign({},a,e.params),pathname:rn([u,e.pathname]),pathnameBase:"/"===e.pathnameBase?u:rn([u,e.pathnameBase])})})),i,r||void 0);return t&&p?h(wn.Provider,{value:{location:fn({pathname:"/",search:"",hash:"",state:null,key:"default"},n),navigationType:vt.Pop}},p):p}(r&&!t?r.router.routes:zn(t),n)}!function(e){e[e.pending=0]="pending",e[e.success=1]="success",e[e.error=2]="error"}(Pn||(Pn={}));new Promise((function(){}));function zn(e,t){void 0===t&&(t=[]);var n=[];return Se.forEach(e,(function(e,r){if(rt(e))if(e.type!==m){e.type!==$n&&Kt(!1),e.props.index&&e.props.children&&Kt(!1);var i=[].concat(bt(t),[r]),o={id:e.props.id||i.join("-"),caseSensitive:e.props.caseSensitive,element:e.props.element,index:e.props.index,path:e.props.path,loader:e.props.loader,action:e.props.action,errorElement:e.props.errorElement,hasErrorBoundary:null!=e.props.errorElement,shouldRevalidate:e.props.shouldRevalidate,handle:e.props.handle};e.props.children&&(o.children=zn(e.props.children,i)),n.push(o)}else n.push.apply(n,zn(e.props.children,t))})),n}function Un(e){var t=e.basename,n=e.children,r=e.window,i=re();null==i.current&&(i.current=function(e){return void 0===e&&(e={}),Ut((function(e,t){var n=jt(e.location.hash.substr(1)),r=n.pathname,i=void 0===r?"/":r,o=n.search,a=void 0===o?"":o,u=n.hash;return $t("",{pathname:i,search:a,hash:void 0===u?"":u},t.state&&t.state.usr||null,t.state&&t.state.key||"default")}),(function(e,t){var n=e.document.querySelector("base"),r="";if(n&&n.getAttribute("href")){var i=e.location.href,o=i.indexOf("#");r=-1===o?i:i.slice(0,o)}return r+"#"+("string"===typeof t?t:Rt(t))}),(function(e,t){Pt("/"===e.pathname.charAt(0),"relative pathnames are not supported in hash history.push("+JSON.stringify(t)+")")}),e)}({window:r,v5Compat:!0}));var o=i.current,a=_t(X({action:o.action,location:o.location}),2),u=a[0],l=a[1];return ne((function(){return o.listen(l)}),[o]),h(Rn,{basename:t,children:n,location:u.location,navigationType:u.action,navigator:o})}var Hn,Yn;(function(e){e.UseScrollRestoration="useScrollRestoration",e.UseSubmitImpl="useSubmitImpl",e.UseFetcher="useFetcher"})(Hn||(Hn={})),function(e){e.UseFetchers="useFetchers",e.UseScrollRestoration="useScrollRestoration"}(Yn||(Yn={}));var Vn;function qn(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var Wn={home:"/",dashboards:"/dashboards",cardinality:"/cardinality",topQueries:"/top-queries",trace:"/trace"},Qn={header:{timeSelector:!0,executionControls:!0}},Gn=(qn(Vn={},Wn.home,Qn),qn(Vn,Wn.dashboards,Qn),qn(Vn,Wn.cardinality,{header:{cardinalityDatePicker:!0}}),Vn),Jn=Wn;function Zn(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function Kn(e){for(var t=1;t2&&void 0!==arguments[2]?arguments[2]:window.location.search,r=nr().parse(n,{ignoreQueryPrefix:!0});return ir()(r,e,t||"")},lr={serverUrl:Xn().serverURL||window.location.href.replace(/\/(?:prometheus\/)?(?:graph|vmui)\/.*/,"/prometheus"),tenantId:Number(ur("g0.tenantID",0))};function cr(e,t){switch(t.type){case"SET_SERVER":return Kn(Kn({},e),{},{serverUrl:t.payload});case"SET_TENANT_ID":return Kn(Kn({},e),{},{tenantId:t.payload});default:throw new Error}}var sr=0;function fr(e,t,n,i,o){var a,u,l={};for(u in t)"ref"==u?a=t[u]:l[u]=t[u];var c={type:e,props:l,key:n,ref:a,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,__h:null,constructor:void 0,__v:--sr,__source:o,__self:i};if("function"==typeof e&&(a=e.defaultProps))for(u in a)void 0===l[u]&&(l[u]=a[u]);return r.vnode&&r.vnode(c),c}var dr=R({}),hr=function(){return ue(dr).state},pr=function(){return ue(dr).dispatch},vr=Object.entries(lr).reduce((function(e,t){var n=_t(t,2),r=n[0],i=n[1];return Kn(Kn({},e),{},qn({},r,ur(r)||i))}),{}),mr=n(658),yr=n.n(mr),gr=n(446),_r=n.n(gr),br=n(635),Dr=n.n(br),wr="YYYY-MM-DD",xr="YYYY-MM-DD HH:mm:ss",kr="YYYY-MM-DD[T]HH:mm:ss";yr().extend(_r()),yr().extend(Dr());var Cr,Er=window.innerWidth/4,Sr=1,Ar=1578e8,Fr=[{long:"days",short:"d",possible:"day"},{long:"weeks",short:"w",possible:"week"},{long:"months",short:"M",possible:"mon"},{long:"years",short:"y",possible:"year"},{long:"hours",short:"h",possible:"hour"},{long:"minutes",short:"m",possible:"min"},{long:"seconds",short:"s",possible:"sec"},{long:"milliseconds",short:"ms",possible:"millisecond"}].map((function(e){return e.short})),Nr=function(e){return Math.round(1e3*e)/1e3},Or=function(e){var t=e.match(/\d+/g),n=e.match(/[a-zA-Z]+/g);if(n&&t&&Fr.includes(n[0]))return qn({},n[0],t[0])},Tr=function(e,t){var n=(t||new Date).valueOf()/1e3,r=e.trim().split(" ").reduce((function(e,t){var n=Or(t);return n?Kn(Kn({},e),n):Kn({},e)}),{}),i=yr().duration(r).asSeconds();return{start:n-i,end:n,step:Nr(i/Er)||.001,date:Br(t||new Date)}},Br=function(e){return yr()(e).utc().format(kr)},Mr=function(e){return yr()(e).format(kr)},Lr=function(e){var t=Math.floor(e%1e3),n=Math.floor(e/1e3%60),r=Math.floor(e/1e3/60%60),i=Math.floor(e/1e3/3600%24),o=Math.floor(e/864e5),a=["d","h","m","s","ms"],u=[o,i,r,n,t].map((function(e,t){return e?"".concat(e).concat(a[t]):""}));return u.filter((function(e){return e})).join(" ")},Pr=function(e){return new Date(1e3*e)},Ir=[{title:"Last 5 minutes",duration:"5m"},{title:"Last 15 minutes",duration:"15m"},{title:"Last 30 minutes",duration:"30m",isDefault:!0},{title:"Last 1 hour",duration:"1h"},{title:"Last 3 hours",duration:"3h"},{title:"Last 6 hours",duration:"6h"},{title:"Last 12 hours",duration:"12h"},{title:"Last 24 hours",duration:"24h"},{title:"Last 2 days",duration:"2d"},{title:"Last 7 days",duration:"7d"},{title:"Last 30 days",duration:"30d"},{title:"Last 90 days",duration:"90d"},{title:"Last 180 days",duration:"180d"},{title:"Last 1 year",duration:"1y"},{title:"Yesterday",duration:"1d",until:function(){return yr()().subtract(1,"day").endOf("day").toDate()}},{title:"Today",duration:"1d",until:function(){return yr()().endOf("day").toDate()}}].map((function(e){return Kn({id:e.title.replace(/\s/g,"_").toLocaleLowerCase(),until:e.until?e.until:function(){return yr()().toDate()}},e)})),$r=function(e){var t,n=e.relativeTimeId,r=e.defaultDuration,i=e.defaultEndInput,o=null===(t=Ir.find((function(e){return e.isDefault})))||void 0===t?void 0:t.id,a=n||ur("g0.relative_time",o),u=Ir.find((function(e){return e.id===a}));return{relativeTimeId:u?a:"none",duration:u?u.duration:r,endInput:u?u.until():i}},Rr=ur("g0.range_input"),jr=$r({defaultDuration:Rr||"1h",defaultEndInput:new Date((Cr=ur("g0.end_input",new Date(yr()().utc().format(kr))),yr()(Cr).utcOffset(0,!0).local().format(kr))),relativeTimeId:Rr?ur("g0.relative_time","none"):void 0}),zr=jr.duration,Ur=jr.endInput,Hr=jr.relativeTimeId,Yr={duration:zr,period:Tr(zr,Ur),relativeTime:Hr};function Vr(e,t){switch(t.type){case"SET_DURATION":return Kn(Kn({},e),{},{duration:t.payload,period:Tr(t.payload,Pr(e.period.end)),relativeTime:"none"});case"SET_RELATIVE_TIME":return Kn(Kn({},e),{},{duration:t.payload.duration,period:Tr(t.payload.duration,new Date(t.payload.until)),relativeTime:t.payload.id});case"SET_PERIOD":var n=function(e){var t=e.to.valueOf()-e.from.valueOf();return Lr(t)}(t.payload);return Kn(Kn({},e),{},{duration:n,period:Tr(n,t.payload.to),relativeTime:"none"});case"RUN_QUERY":var r=$r({relativeTimeId:e.relativeTime,defaultDuration:e.duration,defaultEndInput:Pr(e.period.end)}),i=r.duration,o=r.endInput;return Kn(Kn({},e),{},{period:Tr(i,o)});case"RUN_QUERY_TO_NOW":return Kn(Kn({},e),{},{period:Tr(e.duration)});default:throw new Error}}var qr=R({}),Wr=function(){return ue(qr).state},Qr=function(){return ue(qr).dispatch},Gr=function(e,t){t?window.localStorage.setItem(e,JSON.stringify({value:t})):Zr([e])},Jr=function(e){var t=window.localStorage.getItem(e);if(null!==t)try{var n;return null===(n=JSON.parse(t))||void 0===n?void 0:n.value}catch(c){return t}},Zr=function(e){return e.forEach((function(e){return window.localStorage.removeItem(e)}))},Kr=function(){var e,t=(null===(e=window.location.search.match(/g\d+.expr/gim))||void 0===e?void 0:e.length)||1;return new Array(t>4?4:t).fill(1).map((function(e,t){return ur("g".concat(t,".expr"),"")}))}(),Xr={query:Kr,queryHistory:Kr.map((function(e){return{index:0,values:[e]}})),autocomplete:Jr("AUTOCOMPLETE")||!1};function ei(e,t){switch(t.type){case"SET_QUERY":return Kn(Kn({},e),{},{query:t.payload.map((function(e){return e}))});case"SET_QUERY_HISTORY":return Kn(Kn({},e),{},{queryHistory:t.payload});case"SET_QUERY_HISTORY_BY_INDEX":return e.queryHistory.splice(t.payload.queryNumber,1,t.payload.value),Kn(Kn({},e),{},{queryHistory:e.queryHistory});case"TOGGLE_AUTOCOMPLETE":return Gr("AUTOCOMPLETE",!e.autocomplete),Kn(Kn({},e),{},{autocomplete:!e.autocomplete});default:throw new Error}}var ti=R({}),ni=function(){return ue(ti).state},ri=function(){return ue(ti).dispatch},ii=function(){return fr("svg",{viewBox:"0 0 74 24",fill:"currentColor",children:[fr("path",{d:"M6.11771 9.47563C6.4774 9.7554 6.91935 9.90875 7.37507 9.9119H7.42685C7.9076 9.90451 8.38836 9.71964 8.67681 9.46823C10.1856 8.18898 14.5568 4.18115 14.5568 4.18115C15.7254 3.09415 12.4637 2.00716 7.42685 1.99977H7.36768C2.33084 2.00716 -0.930893 3.09415 0.237711 4.18115C0.237711 4.18115 4.60888 8.18898 6.11771 9.47563ZM8.67681 11.6422C8.31807 11.9246 7.87603 12.0806 7.41945 12.0859H7.37507C6.91849 12.0806 6.47645 11.9246 6.11771 11.6422C5.08224 10.7549 1.38413 7.41995 0.00103198 6.14809V8.07806C0.00103198 8.2925 0.0823905 8.57349 0.222919 8.70659L0.293358 8.77097L0.293386 8.77099C1.33788 9.72556 4.83907 12.9253 6.11771 14.0159C6.47645 14.2983 6.91849 14.4543 7.37507 14.4595H7.41945C7.9076 14.4447 8.38096 14.2599 8.67681 14.0159C9.98594 12.9067 13.6249 9.57175 14.5642 8.70659C14.7121 8.57349 14.7861 8.2925 14.7861 8.07806V6.14809C12.7662 7.99781 10.7297 9.82926 8.67681 11.6422ZM7.41945 16.6261C7.87517 16.623 8.31712 16.4696 8.67681 16.1898C10.7298 14.3744 12.7663 12.5405 14.7861 10.6883V12.6257C14.7861 12.8327 14.7121 13.1137 14.5642 13.2468C13.6249 14.1194 9.98594 17.4469 8.67681 18.5561C8.38096 18.8075 7.9076 18.9924 7.41945 18.9998H7.37507C6.91935 18.9966 6.4774 18.8433 6.11771 18.5635C4.91431 17.5371 1.74223 14.6362 0.502336 13.5023C0.3934 13.4027 0.299379 13.3167 0.222919 13.2468C0.0823905 13.1137 0.00103198 12.8327 0.00103198 12.6257V10.6883C1.38413 11.9528 5.08224 15.2951 6.11771 16.1825C6.47645 16.4649 6.91849 16.6209 7.37507 16.6261H7.41945Z",fill:"currentColor"}),fr("path",{d:"M35 3.54L29.16 18H26.73L20.89 3.54H23.05C23.2833 3.54 23.4733 3.59667 23.62 3.71C23.7667 3.82333 23.8767 3.97 23.95 4.15L27.36 12.97C27.4733 13.2567 27.58 13.5733 27.68 13.92C27.7867 14.26 27.8867 14.6167 27.98 14.99C28.06 14.6167 28.1467 14.26 28.24 13.92C28.3333 13.5733 28.4367 13.2567 28.55 12.97L31.94 4.15C31.9933 3.99667 32.0967 3.85667 32.25 3.73C32.41 3.60333 32.6033 3.54 32.83 3.54H35ZM52.1767 3.54V18H49.8067V8.66C49.8067 8.28667 49.8267 7.88333 49.8667 7.45L45.4967 15.66C45.2901 16.0533 44.9734 16.25 44.5467 16.25H44.1667C43.7401 16.25 43.4234 16.0533 43.2167 15.66L38.7967 7.42C38.8167 7.64 38.8334 7.85667 38.8467 8.07C38.8601 8.28333 38.8667 8.48 38.8667 8.66V18H36.4967V3.54H38.5267C38.6467 3.54 38.7501 3.54333 38.8367 3.55C38.9234 3.55667 39.0001 3.57333 39.0667 3.6C39.1401 3.62667 39.2034 3.67 39.2567 3.73C39.3167 3.79 39.3734 3.87 39.4267 3.97L43.7567 12C43.8701 12.2133 43.9734 12.4333 44.0667 12.66C44.1667 12.8867 44.2634 13.12 44.3567 13.36C44.4501 13.1133 44.5467 12.8767 44.6467 12.65C44.7467 12.4167 44.8534 12.1933 44.9667 11.98L49.2367 3.97C49.2901 3.87 49.3467 3.79 49.4067 3.73C49.4667 3.67 49.5301 3.62667 49.5967 3.6C49.6701 3.57333 49.7501 3.55667 49.8367 3.55C49.9234 3.54333 50.0267 3.54 50.1467 3.54H52.1767ZM61.063 17.27C61.743 17.27 62.3496 17.1533 62.883 16.92C63.423 16.68 63.8796 16.35 64.253 15.93C64.6263 15.51 64.9096 15.0167 65.103 14.45C65.303 13.8767 65.403 13.26 65.403 12.6V3.85H66.423V12.6C66.423 13.38 66.2996 14.11 66.053 14.79C65.8063 15.4633 65.4496 16.0533 64.983 16.56C64.523 17.06 63.9596 17.4533 63.293 17.74C62.633 18.0267 61.8896 18.17 61.063 18.17C60.2363 18.17 59.4896 18.0267 58.823 17.74C58.163 17.4533 57.5996 17.06 57.133 16.56C56.673 16.0533 56.3196 15.4633 56.073 14.79C55.8263 14.11 55.703 13.38 55.703 12.6V3.85H56.733V12.59C56.733 13.25 56.8296 13.8667 57.023 14.44C57.223 15.0067 57.5063 15.5 57.873 15.92C58.2463 16.34 58.6996 16.67 59.233 16.91C59.773 17.15 60.383 17.27 61.063 17.27ZM71.4442 18H70.4142V3.85H71.4442V18Z",fill:"currentColor"})]})},oi=function(){return fr("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:fr("path",{d:"M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.07-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.74 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.07.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .44-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.47-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z"})})},ai=function(){return fr("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:fr("path",{d:"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"})})},ui=function(){return fr("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:fr("path",{d:"M12 5V2L8 6l4 4V7c3.31 0 6 2.69 6 6 0 2.97-2.17 5.43-5 5.91v2.02c3.95-.49 7-3.85 7-7.93 0-4.42-3.58-8-8-8zm-6 8c0-1.65.67-3.15 1.76-4.24L6.34 7.34C4.9 8.79 4 10.79 4 13c0 4.08 3.05 7.44 7 7.93v-2.02c-2.83-.48-5-2.94-5-5.91z"})})},li=function(){return fr("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:fr("path",{d:"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z"})})},ci=function(){return fr("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:fr("path",{d:"M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z"})})},si=function(){return fr("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:fr("path",{d:"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z"})})},fi=function(){return fr("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:fr("path",{d:"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z"})})},di=function(){return fr("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:fr("path",{d:"M12 6v3l4-4-4-4v3c-4.42 0-8 3.58-8 8 0 1.57.46 3.03 1.24 4.26L6.7 14.8c-.45-.83-.7-1.79-.7-2.8 0-3.31 2.69-6 6-6zm6.76 1.74L17.3 9.2c.44.84.7 1.79.7 2.8 0 3.31-2.69 6-6 6v-3l-4 4 4 4v-3c4.42 0 8-3.58 8-8 0-1.57-.46-3.03-1.24-4.26z"})})},hi=function(){return fr("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:fr("path",{d:"M7.41 8.59 12 13.17l4.59-4.58L18 10l-6 6-6-6 1.41-1.41z"})})},pi=function(){return fr("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:fr("path",{d:"m12 8-6 6 1.41 1.41L12 10.83l4.59 4.58L18 14z"})})},vi=function(){return fr("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:fr("path",{d:"m7 10 5 5 5-5z"})})},mi=function(){return fr("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:[fr("path",{d:"M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z"}),fr("path",{d:"M12.5 7H11v6l5.25 3.15.75-1.23-4.5-2.67z"})]})},yi=function(){return fr("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:fr("path",{d:"M20 3h-1V1h-2v2H7V1H5v2H4c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 18H4V8h16v13z"})})},gi=function(){return fr("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:fr("path",{d:"m22 5.72-4.6-3.86-1.29 1.53 4.6 3.86L22 5.72zM7.88 3.39 6.6 1.86 2 5.71l1.29 1.53 4.59-3.85zM12.5 8H11v6l4.75 2.85.75-1.23-4-2.37V8zM12 4c-4.97 0-9 4.03-9 9s4.02 9 9 9c4.97 0 9-4.03 9-9s-4.03-9-9-9zm0 16c-3.87 0-7-3.13-7-7s3.13-7 7-7 7 3.13 7 7-3.13 7-7 7z"})})},_i=function(){return fr("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:fr("path",{d:"M20 5H4c-1.1 0-1.99.9-1.99 2L2 17c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm-9 3h2v2h-2V8zm0 3h2v2h-2v-2zM8 8h2v2H8V8zm0 3h2v2H8v-2zm-1 2H5v-2h2v2zm0-3H5V8h2v2zm9 7H8v-2h8v2zm0-4h-2v-2h2v2zm0-3h-2V8h2v2zm3 3h-2v-2h2v2zm0-3h-2V8h2v2z"})})},bi=function(){return fr("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:fr("path",{d:"M8 5v14l11-7z"})})},Di=function(){return fr("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:fr("path",{d:"m10 16.5 6-4.5-6-4.5v9zM12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"})})},wi=function(){return fr("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:fr("path",{d:"m3.5 18.49 6-6.01 4 4L22 6.92l-1.41-1.41-7.09 7.97-4-4L2 16.99z"})})},xi=function(){return fr("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:fr("path",{d:"M10 10.02h5V21h-5zM17 21h3c1.1 0 2-.9 2-2v-9h-5v11zm3-18H5c-1.1 0-2 .9-2 2v3h19V5c0-1.1-.9-2-2-2zM3 19c0 1.1.9 2 2 2h3V10H3v9z"})})},ki=function(){return fr("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:fr("path",{d:"M9.4 16.6 4.8 12l4.6-4.6L8 6l-6 6 6 6 1.4-1.4zm5.2 0 4.6-4.6-4.6-4.6L16 6l6 6-6 6-1.4-1.4z"})})},Ci=function(){return fr("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:fr("path",{d:"M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z"})})},Ei=function(){return fr("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:fr("path",{d:"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"})})},Si=function(){return fr("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:fr("path",{d:"M8.9999 14.7854L18.8928 4.8925C19.0803 4.70497 19.3347 4.59961 19.5999 4.59961C19.8651 4.59961 20.1195 4.70497 20.307 4.8925L21.707 6.2925C22.0975 6.68303 22.0975 7.31619 21.707 7.70672L9.70701 19.7067C9.31648 20.0972 8.68332 20.0972 8.2928 19.7067L2.6928 14.1067C2.50526 13.9192 2.3999 13.6648 2.3999 13.3996C2.3999 13.1344 2.50526 12.88 2.6928 12.6925L4.0928 11.2925C4.48332 10.902 5.11648 10.902 5.50701 11.2925L8.9999 14.7854Z"})})},Ai=function(){return fr("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:fr("path",{d:"M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5zM12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z"})})},Fi=function(){return fr("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:fr("path",{d:"M12 7c2.76 0 5 2.24 5 5 0 .65-.13 1.26-.36 1.83l2.92 2.92c1.51-1.26 2.7-2.89 3.43-4.75-1.73-4.39-6-7.5-11-7.5-1.4 0-2.74.25-3.98.7l2.16 2.16C10.74 7.13 11.35 7 12 7zM2 4.27l2.28 2.28.46.46C3.08 8.3 1.78 10.02 1 12c1.73 4.39 6 7.5 11 7.5 1.55 0 3.03-.3 4.38-.84l.42.42L19.73 22 21 20.73 3.27 3 2 4.27zM7.53 9.8l1.55 1.55c-.05.21-.08.43-.08.65 0 1.66 1.34 3 3 3 .22 0 .44-.03.65-.08l1.55 1.55c-.67.33-1.41.53-2.2.53-2.76 0-5-2.24-5-5 0-.79.2-1.53.53-2.2zm4.31-.78 3.15 3.15.02-.16c0-1.66-1.34-3-3-3l-.17.01z"})})},Ni=function(){return fr("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:fr("path",{d:"M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z"})})},Oi=function(){return fr("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:fr("path",{d:"M20 9H4v2h16V9zM4 15h16v-2H4v2z"})})},Ti=n(123),Bi=n.n(Ti),Mi=function(e){return getComputedStyle(document.documentElement).getPropertyValue("--".concat(e))},Li=function(e,t){document.documentElement.style.setProperty("--".concat(e),t)},Pi=function(e){var t=e.activeItem,n=e.items,r=e.color,i=void 0===r?Mi("color-primary"):r,o=e.onChange,a=e.indicatorPlacement,u=void 0===a?"bottom":a,l=re(null),c=_t(X({left:0,width:0,bottom:0}),2),s=c[0],f=c[1];return te((function(){if(l.current){var e=l.current,t=e.offsetLeft,n=e.offsetWidth,r=e.offsetHeight;f({left:t,width:n,bottom:"top"===u?r-2:0})}}),[t,l,n]),fr("div",{className:"vm-tabs",children:[n.map((function(e){return fr("div",{className:Bi()(qn({"vm-tabs-item":!0,"vm-tabs-item_active":t===e.value},e.className||"",e.className)),ref:t===e.value?l:void 0,style:{color:i},onClick:(n=e.value,function(){o(n)}),children:[e.icon&&fr("div",{className:Bi()({"vm-tabs-item__icon":!0,"vm-tabs-item__icon_single":!e.label}),children:e.icon}),e.label]},e.value);var n})),fr("div",{className:"vm-tabs__indicator",style:Kn(Kn({},s),{},{borderColor:i})})]})},Ii=[{value:"chart",icon:fr(wi,{}),label:"Graph",prometheusCode:0},{value:"code",icon:fr(ki,{}),label:"JSON",prometheusCode:3},{value:"table",icon:fr(xi,{}),label:"Table",prometheusCode:1}],$i=function(){var e=Vi().displayType,t=qi();return fr(Pi,{activeItem:e,items:Ii,onChange:function(n){var r;t({type:"SET_DISPLAY_TYPE",payload:null!==(r=n)&&void 0!==r?r:e})}})},Ri=ur("g0.tab",0),ji=Ii.find((function(e){return e.prometheusCode===+Ri||e.value===Ri})),zi=Jr("SERIES_LIMITS"),Ui={displayType:(null===ji||void 0===ji?void 0:ji.value)||"chart",nocache:!1,isTracingEnabled:!1,seriesLimits:zi?JSON.parse(Jr("SERIES_LIMITS")):or,tableCompact:Jr("TABLE_COMPACT")||!1};function Hi(e,t){switch(t.type){case"SET_DISPLAY_TYPE":return Kn(Kn({},e),{},{displayType:t.payload});case"SET_SERIES_LIMITS":return Gr("SERIES_LIMITS",JSON.stringify(t.payload)),Kn(Kn({},e),{},{seriesLimits:t.payload});case"TOGGLE_QUERY_TRACING":return Kn(Kn({},e),{},{isTracingEnabled:!e.isTracingEnabled});case"TOGGLE_NO_CACHE":return Kn(Kn({},e),{},{nocache:!e.nocache});case"TOGGLE_TABLE_COMPACT":return Gr("TABLE_COMPACT",!e.tableCompact),Kn(Kn({},e),{},{tableCompact:!e.tableCompact});default:throw new Error}}var Yi=R({}),Vi=function(){return ue(Yi).state},qi=function(){return ue(Yi).dispatch},Wi={customStep:parseFloat(ur("g0.step_input","0")),yaxis:{limits:{enable:!1,range:{1:[0,0]}}}};function Qi(e,t){switch(t.type){case"TOGGLE_ENABLE_YAXIS_LIMITS":return Kn(Kn({},e),{},{yaxis:Kn(Kn({},e.yaxis),{},{limits:Kn(Kn({},e.yaxis.limits),{},{enable:!e.yaxis.limits.enable})})});case"SET_CUSTOM_STEP":return Kn(Kn({},e),{},{customStep:t.payload});case"SET_YAXIS_LIMITS":return Kn(Kn({},e),{},{yaxis:Kn(Kn({},e.yaxis),{},{limits:Kn(Kn({},e.yaxis.limits),{},{range:t.payload})})});default:throw new Error}}var Gi=R({}),Ji=function(){return ue(Gi).dispatch},Zi={runQuery:0,topN:ur("topN",10),date:ur("date",yr()(new Date).format(wr)),focusLabel:ur("focusLabel",""),match:ur("match",""),extraLabel:ur("extra_label","")};function Ki(e,t){switch(t.type){case"SET_TOP_N":return Kn(Kn({},e),{},{topN:t.payload});case"SET_DATE":return Kn(Kn({},e),{},{date:t.payload});case"SET_MATCH":return Kn(Kn({},e),{},{match:t.payload});case"SET_EXTRA_LABEL":return Kn(Kn({},e),{},{extraLabel:t.payload});case"SET_FOCUS_LABEL":return Kn(Kn({},e),{},{focusLabel:t.payload});case"RUN_QUERY":return Kn(Kn({},e),{},{runQuery:e.runQuery+1});default:throw new Error}}var Xi=R({}),eo=function(){return ue(Xi).state},to=function(){return ue(Xi).dispatch},no={topN:ur("topN",null),maxLifetime:ur("maxLifetime",""),runQuery:0};function ro(e,t){switch(t.type){case"SET_TOP_N":return Kn(Kn({},e),{},{topN:t.payload});case"SET_MAX_LIFE_TIME":return Kn(Kn({},e),{},{maxLifetime:t.payload});case"SET_RUN_QUERY":return Kn(Kn({},e),{},{runQuery:e.runQuery+1});default:throw new Error}}var io,oo=R({}),ao=function(){return ue(oo).state},uo={success:fr(fi,{}),error:fr(si,{}),warning:fr(ci,{}),info:fr(li,{})},lo=function(e){var t=e.variant,n=e.children;return fr("div",{className:Bi()(qn({"vm-alert":!0},"vm-alert_".concat(t),t)),children:[fr("div",{className:"vm-alert__icon",children:uo[t||"info"]}),fr("div",{className:"vm-alert__content",children:n})]})},co=R({showInfoMessage:function(){}}),so=function(){return ue(co)},fo=function(){for(var e=arguments.length,t=new Array(e),n=0;nd,v=r.top-20<0,m=r.left+g.width+20>f,y=r.left-20<0;return h&&(r.top=t.top-g.height-u),v&&(r.top=t.height+t.top+u),m&&(r.left=t.right-g.width-l),y&&(r.left=t.left+l),r}),[n,i,p,t]);d&&po(b,(function(){return v(!1)}),n);var x=Bi()(qn({"vm-popper":!0,"vm-popper_open":p},"vm-popper_open_".concat(l),l));return fr(m,{children:p&&mt.createPortal(fr("div",{className:x,ref:b,style:w,children:t}),document.body)})},mo=function(e){var t=e.children,n=e.title,r=e.open,i=e.placement,o=void 0===i?"bottom-center":i,a=e.offset,u=void 0===a?{top:6,left:0}:a,l=_t(X(!1),2),c=l[0],s=l[1],f=_t(X({width:0,height:0}),2),d=f[0],h=f[1],p=re(null),v=re(null),y=function(){return s(!1)};te((function(){return window.addEventListener("scroll",y),function(){window.removeEventListener("scroll",y)}}),[]),te((function(){v.current&&c&&h({width:v.current.clientWidth,height:v.current.clientHeight})}),[c]);var g=oe((function(){var e,t=null===p||void 0===p||null===(e=p.current)||void 0===e?void 0:e.base;if(!t||!c)return{};var n=t.getBoundingClientRect(),r={top:0,left:0},i="bottom-right"===o||"top-right"===o,a="bottom-left"===o||"top-left"===o,l=null===o||void 0===o?void 0:o.includes("top"),s=(null===u||void 0===u?void 0:u.top)||0,f=(null===u||void 0===u?void 0:u.left)||0;r.left=n.left-(d.width-n.width)/2+f,r.top=n.height+n.top+s,i&&(r.left=n.right-d.width),a&&(r.left=n.left+f),l&&(r.top=n.top-d.height-s);var h=window,v=h.innerWidth,m=h.innerHeight,y=r.top+d.height+20>m,g=r.top-20<0,_=r.left+d.width+20>v,b=r.left-20<0;return y&&(r.top=n.top-d.height-s),g&&(r.top=n.height+n.top+s),_&&(r.left=n.right-d.width-f),b&&(r.left=n.left+f),r.top<0&&(r.top=20),r.left<0&&(r.left=20),r}),[p,o,c,d]),_=function(){"boolean"!==typeof r&&s(!0)},b=function(){s(!1)};return te((function(){"boolean"===typeof r&&s(r)}),[r]),te((function(){var e,t=null===p||void 0===p||null===(e=p.current)||void 0===e?void 0:e.base;if(t)return t.addEventListener("mouseenter",_),t.addEventListener("mouseleave",b),function(){t.removeEventListener("mouseenter",_),t.removeEventListener("mouseleave",b)}}),[p]),fr(m,{children:[fr(m,{ref:p,children:t}),c&&mt.createPortal(fr("div",{className:"vm-tooltip",ref:v,style:g,children:n}),document.body)]})},yo=[{seconds:0,title:"Off"},{seconds:1,title:"1s"},{seconds:2,title:"2s"},{seconds:5,title:"5s"},{seconds:10,title:"10s"},{seconds:30,title:"30s"},{seconds:60,title:"1m"},{seconds:300,title:"5m"},{seconds:900,title:"15m"},{seconds:1800,title:"30m"},{seconds:3600,title:"1h"},{seconds:7200,title:"2h"}],go=function(){var e=Qr(),t=er(),n=_t(X(!1),2),r=n[0],i=n[1],o=_t(X(yo[0]),2),a=o[0],u=o[1];te((function(){var t,n=a.seconds;return r?t=setInterval((function(){e({type:"RUN_QUERY"})}),1e3*n):u(yo[0]),function(){t&&clearInterval(t)}}),[a,r]);var l=_t(X(!1),2),c=l[0],s=l[1],f=re(null),d=function(e){return function(){!function(e){(r&&!e.seconds||!r&&e.seconds)&&i((function(e){return!e})),u(e),s(!1)}(e)}};return fr(m,{children:[fr("div",{className:"vm-execution-controls",children:fr("div",{className:Bi()({"vm-execution-controls-buttons":!0,"vm-header-button":!t}),children:[fr(mo,{title:"Refresh dashboard",children:fr(ho,{variant:"contained",color:"primary",onClick:function(){e({type:"RUN_QUERY"})},startIcon:fr(di,{})})}),fr(mo,{title:"Auto-refresh control",children:fr("div",{ref:f,children:fr(ho,{variant:"contained",color:"primary",fullWidth:!0,endIcon:fr("div",{className:Bi()({"vm-execution-controls-buttons__arrow":!0,"vm-execution-controls-buttons__arrow_open":c}),children:fr(hi,{})}),onClick:function(){s((function(e){return!e}))},children:a.title})})})]})}),fr(vo,{open:c,placement:"bottom-right",onClose:function(){s(!1)},buttonRef:f,children:fr("div",{className:"vm-execution-controls-list",children:yo.map((function(e){return fr("div",{className:Bi()({"vm-list__item":!0,"vm-list__item_active":e.seconds===a.seconds}),onClick:d(e),children:e.title},e.seconds)}))})})]})},_o=function(e){var t=e.relativeTime,n=e.setDuration;return fr("div",{className:"vm-time-duration",children:Ir.map((function(e){var r,i=e.id,o=e.duration,a=e.until,u=e.title;return fr("div",{className:Bi()({"vm-list__item":!0,"vm-list__item_active":i===t}),onClick:(r={duration:o,until:a(),id:i},function(){n(r)}),children:u||o},i)}))})},bo=function(e){var t=_t(X({width:0,height:0}),2),n=t[0],r=t[1];return te((function(){var t=new ResizeObserver((function(e){var t=e[0].contentRect,n=t.width,i=t.height;r({width:n,height:i})}));return e&&t.observe(e),function(){e&&t.unobserve(e)}}),[]),n},Do=function(e){var t=e.viewDate,n=e.displayYears,r=e.onChangeViewDate;return fr("div",{className:"vm-calendar-header",children:[fr("div",{className:"vm-calendar-header-left",onClick:e.toggleDisplayYears,children:[fr("span",{className:"vm-calendar-header-left__date",children:t.format("MMMM YYYY")}),fr("div",{className:"vm-calendar-header-left__select-year",children:fr(vi,{})})]}),!n&&fr("div",{className:"vm-calendar-header-right",children:[fr("div",{className:"vm-calendar-header-right__prev",onClick:function(){r(t.subtract(1,"month"))},children:fr(hi,{})}),fr("div",{className:"vm-calendar-header-right__next",onClick:function(){r(t.add(1,"month"))},children:fr(hi,{})})]})]})},wo=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],xo=function(e){var t=e.viewDate,n=e.selectDate,r=e.onChangeSelectDate,i=yr()().startOf("day"),o=oe((function(){var e=new Array(42).fill(null),n=t.startOf("month"),r=t.endOf("month").diff(n,"day")+1,i=new Array(r).fill(n).map((function(e,t){return e.add(t,"day")})),o=n.day();return e.splice.apply(e,[o,r].concat(bt(i))),e}),[t]),a=function(e){return function(){e&&r(e)}};return fr("div",{className:"vm-calendar-body",children:[wo.map((function(e){return fr("div",{className:"vm-calendar-body-cell vm-calendar-body-cell_weekday",children:e[0]},e)})),o.map((function(e,t){return fr("div",{className:Bi()({"vm-calendar-body-cell":!0,"vm-calendar-body-cell_day":!0,"vm-calendar-body-cell_day_empty":!e,"vm-calendar-body-cell_day_active":(e&&e.toISOString())===n.startOf("day").toISOString(),"vm-calendar-body-cell_day_today":(e&&e.toISOString())===i.toISOString()}),onClick:a(e),children:e&&e.format("D")},e?e.toISOString():t)}))]})},ko=function(e){var t=e.viewDate,n=e.onChangeViewDate,r=oe((function(){return t.format("YYYY")}),[t]),i=oe((function(){var e=yr()().subtract(103,"year");return new Array(206).fill(e).map((function(e,t){return e.add(t,"year")}))}),[t]);te((function(){var e=document.getElementById("vm-calendar-year-".concat(r));e&&e.scrollIntoView({block:"center"})}),[]);return fr("div",{className:"vm-calendar-years",children:i.map((function(e){return fr("div",{className:Bi()({"vm-calendar-years__year":!0,"vm-calendar-years__year_selected":e.format("YYYY")===r}),id:"vm-calendar-year-".concat(e.format("YYYY")),onClick:(t=e,function(){n(t)}),children:e.format("YYYY")},e.format("YYYY"));var t}))})};!function(e){e[e.hour=0]="hour",e[e.minutes=1]="minutes",e[e.seconds=2]="seconds"}(io||(io={}));var Co,Eo=function(e){var t=e.selectDate,n=e.onChangeTime,r=e.onClose,i=_t(X(io.hour),2),o=i[0],a=i[1],u=_t(X(t.format("HH")),2),l=u[0],c=u[1],s=_t(X(t.format("mm")),2),f=s[0],d=s[1],h=_t(X(t.format("ss")),2),p=h[0],v=h[1],m=oe((function(){return o===io.hour?new Array(24).fill("00").map((function(e,t){return{value:t,degrees:t/12*360,offset:0===t||t>12,title:t?"".concat(t):e}})):new Array(60).fill("00").map((function(e,t){return{value:t,degrees:t/60*360,offset:!1,title:t?"".concat(t):e}}))}),[o,l,f,p]),y=oe((function(){switch(o){case io.hour:return+l/12*360;case io.minutes:return+f/60*360;case io.seconds:return+p/60*360}}),[o,l,f,p]),g=re(null),_=re(null),b=re(null),D=function(e){return function(t){!function(e,t){t.target.select(),a(e)}(e,t)}};return te((function(){n("".concat(l,":").concat(f,":").concat(p))}),[l,f,p]),te((function(){c(t.format("HH")),d(t.format("mm")),v(t.format("ss"))}),[t]),te((function(){g.current&&g.current.focus()}),[]),fr("div",{className:"vm-calendar-time-picker",children:[fr("div",{className:"vm-calendar-time-picker-clock",children:[fr("div",{className:Bi()({"vm-calendar-time-picker-clock__arrow":!0,"vm-calendar-time-picker-clock__arrow_offset":o===io.hour&&("00"===l||+l>12)}),style:{transform:"rotate(".concat(y,"deg)")}}),m.map((function(e){return fr("div",{className:Bi()({"vm-calendar-time-picker-clock__time":!0,"vm-calendar-time-picker-clock__time_offset":e.offset,"vm-calendar-time-picker-clock__time_hide":m.length>24&&e.value%5}),style:{transform:"rotate(".concat(e.degrees,"deg)")},onClick:(t=e.value,function(){var e=String(t);switch(o){case io.hour:c(e),_.current&&_.current.focus();break;case io.minutes:d(e),b.current&&b.current.focus();break;case io.seconds:v(e),r()}}),children:fr("span",{style:{transform:"rotate(-".concat(e.degrees,"deg)")},children:e.title})},e.value);var t}))]}),fr("div",{className:"vm-calendar-time-picker-fields",children:[fr("input",{className:"vm-calendar-time-picker-fields__input",value:l,onChange:function(e){var t=e.target,n=t.value,r=+n>23?"23":n;t.value=r,c(r),n.length>1&&_.current&&_.current.focus()},onFocus:D(io.hour),ref:g,type:"number",min:0,max:24}),fr("span",{children:":"}),fr("input",{className:"vm-calendar-time-picker-fields__input",value:f,onChange:function(e){var t=e.target,n=t.value,r=+n>59?"59":n;t.value=r,d(r),n.length>1&&b.current&&b.current.focus()},onFocus:D(io.minutes),ref:_,type:"number",min:0,max:60}),fr("span",{children:":"}),fr("input",{className:"vm-calendar-time-picker-fields__input",value:p,onChange:function(e){var t=e.target,n=t.value,i=+n>59?"59":n;t.value=i,v(i),n.length>1&&b.current&&r()},onFocus:D(io.seconds),ref:b,type:"number",min:0,max:60})]})]})},So=[{value:"date",icon:fr(yi,{})},{value:"time",icon:fr(mi,{})}],Ao=function(e){var t=e.date,n=e.timepicker,r=void 0!==n&&n,i=e.format,o=void 0===i?xr:i,a=e.onChange,u=e.onClose,l=_t(X(!1),2),c=l[0],s=l[1],f=_t(X(yr()(t)),2),d=f[0],h=f[1],p=_t(X(yr()(t)),2),v=p[0],y=p[1],g=_t(X(So[0].value),2),_=g[0],b=g[1],D=function(e){h(e),s(!1)};return te((function(){v.format()!==yr()(t).format()&&a(v.format(o))}),[v]),fr("div",{className:"vm-calendar",children:["date"===_&&fr(Do,{viewDate:d,onChangeViewDate:D,toggleDisplayYears:function(){s((function(e){return!e}))},displayYears:c}),"date"===_&&fr(m,{children:[!c&&fr(xo,{viewDate:d,selectDate:v,onChangeSelectDate:function(e){y(e),r&&b("time")}}),c&&fr(ko,{viewDate:d,onChangeViewDate:D})]}),"time"===_&&fr(Eo,{selectDate:v,onChangeTime:function(e){var t=_t(e.split(":"),3),n=t[0],r=t[1],i=t[2];y((function(e){return e.set("hour",+n).set("minute",+r).set("second",+i)}))},onClose:function(){u&&u()}}),r&&fr("div",{className:"vm-calendar__tabs",children:fr(Pi,{activeItem:_,items:So,onChange:function(e){b(e)},indicatorPlacement:"top"})})]})},Fo=Ce((function(e,t){var n=e.date,r=e.targetRef,i=e.format,o=void 0===i?xr:i,a=e.timepicker,u=e.onChange,l=_t(X(!1),2),c=l[0],s=l[1],f=oe((function(){return n?yr()(n):yr()()}),[n]),d=function(){s((function(e){return!e}))},h=function(){s(!1)},p=function(e){"Escape"!==e.key&&"Enter"!==e.key||h()};return te((function(){var e;return null===(e=r.current)||void 0===e||e.addEventListener("click",d),function(){var e;null===(e=r.current)||void 0===e||e.removeEventListener("click",d)}}),[r]),te((function(){return window.addEventListener("keyup",p),function(){window.removeEventListener("keyup",p)}}),[]),fr(m,{children:fr(vo,{open:c,buttonRef:r,placement:"bottom-right",onClose:h,children:fr("div",{ref:t,children:fr(Ao,{date:f,format:o,timepicker:a,onChange:function(e){a||h(),u(e)},onClose:h})})})})})),No=Fo,Oo=function(){var e=re(null),t=bo(document.body),n=oe((function(){return t.width>1120}),[t]),r=_t(X(),2),i=r[0],o=r[1],a=_t(X(),2),u=a[0],l=a[1],c=oe((function(){return yr()(u).format(xr)}),[u]),s=oe((function(){return yr()(i).format(xr)}),[i]),f=Wr(),d=f.period,h=d.end,p=d.start,v=f.relativeTime,y=Qr(),g=er();te((function(){o(Mr(Pr(h)))}),[h]),te((function(){l(Mr(Pr(p)))}),[p]);var _=oe((function(){return{start:yr()(Pr(p)).format(xr),end:yr()(Pr(h)).format(xr)}}),[p,h]),b=oe((function(){return v&&"none"!==v?v.replace(/_/g," "):"".concat(_.start," - ").concat(_.end)}),[v,_]),D=re(null),w=re(null),x=re(null),k=re(null),C=_t(X(!1),2),E=C[0],S=C[1],A=re(null),F=function(){S(!1)};return po(e,(function(e){var t,n,r=e.target,i=(null===D||void 0===D?void 0:D.current)&&D.current.contains(r),o=(null===w||void 0===w?void 0:w.current)&&w.current.contains(r),a=(null===x||void 0===x?void 0:x.current)&&(null===x||void 0===x||null===(t=x.current)||void 0===t?void 0:t.contains(r)),u=(null===k||void 0===k?void 0:k.current)&&(null===k||void 0===k||null===(n=k.current)||void 0===n?void 0:n.contains(r));i||o||a||u||F()})),fr(m,{children:[fr("div",{ref:A,children:fr(mo,{title:"Time range controls",children:fr(ho,{className:g?"":"vm-header-button",variant:"contained",color:"primary",startIcon:fr(mi,{}),onClick:function(){S((function(e){return!e}))},children:n&&fr("span",{children:b})})})}),fr(vo,{open:E,buttonRef:A,placement:"bottom-right",onClose:F,clickOutside:!1,children:fr("div",{className:"vm-time-selector",ref:e,children:[fr("div",{className:"vm-time-selector-left",children:[fr("div",{className:"vm-time-selector-left-inputs",children:[fr("div",{className:"vm-time-selector-left-inputs__date",ref:D,children:[fr("label",{children:"From:"}),fr("span",{children:c}),fr(yi,{}),fr(No,{ref:x,date:u||"",onChange:function(e){return l(e)},targetRef:D,timepicker:!0})]}),fr("div",{className:"vm-time-selector-left-inputs__date",ref:w,children:[fr("label",{children:"To:"}),fr("span",{children:s}),fr(yi,{}),fr(No,{ref:k,date:i||"",onChange:function(e){return o(e)},targetRef:w,timepicker:!0})]})]}),fr(ho,{variant:"text",startIcon:fr(gi,{}),onClick:function(){return y({type:"RUN_QUERY_TO_NOW"})},children:"switch to now"}),fr("div",{className:"vm-time-selector-left__controls",children:[fr(ho,{color:"error",variant:"outlined",onClick:function(){o(Mr(Pr(h))),l(Mr(Pr(p))),S(!1)},children:"Cancel"}),fr(ho,{color:"primary",onClick:function(){return u&&i&&y({type:"SET_PERIOD",payload:{from:new Date(u),to:new Date(i)}}),void S(!1)},children:"Apply"})]})]}),fr(_o,{relativeTime:v||"",setDuration:function(e){var t=e.duration,n=e.until,r=e.id;y({type:"SET_RELATIVE_TIME",payload:{duration:t,until:n,id:r}}),S(!1)}})]})})]})};!function(e){e.emptyServer="Please enter Server URL",e.validServer="Please provide a valid Server URL",e.validQuery="Please enter a valid Query and execute it",e.traceNotFound="Not found the tracing information",e.emptyTitle="Please enter title",e.positiveNumber="Please enter positive number"}(Co||(Co={}));var To=function(e){var t=e.label,n=e.value,r=e.type,i=void 0===r?"text":r,o=e.error,a=void 0===o?"":o,u=e.endIcon,l=e.startIcon,c=e.disabled,s=void 0!==c&&c,f=e.autofocus,d=void 0!==f&&f,h=e.helperText,p=e.onChange,v=e.onEnter,m=e.onKeyDown,y=re(null),g=re(null),_=oe((function(){return"textarea"===i?g:y}),[i]),b=Bi()({"vm-text-field__input":!0,"vm-text-field__input_error":a,"vm-text-field__input_icon-start":l,"vm-text-field__input_disabled":s,"vm-text-field__input_textarea":"textarea"===i}),D=function(e){m&&m(e),"Enter"!==e.key||e.shiftKey||(e.preventDefault(),v&&v())},w=function(e){s||p&&p(e.target.value)};return te((function(){var e;d&&(null===_||void 0===_||null===(e=_.current)||void 0===e?void 0:e.focus)&&_.current.focus()}),[_,d]),fr("label",{className:Bi()({"vm-text-field":!0,"vm-text-field_textarea":"textarea"===i}),"data-replicated-value":n,children:[l&&fr("div",{className:"vm-text-field__icon-start",children:l}),u&&fr("div",{className:"vm-text-field__icon-end",children:u}),"textarea"===i?fr("textarea",{className:b,disabled:s,ref:g,value:n,onInput:w,onKeyDown:D,rows:1}):fr("input",{className:b,disabled:s,ref:y,value:n,onInput:w,onKeyDown:D,type:i}),t&&fr("span",{className:"vm-text-field__label",children:t}),fr("span",{className:"vm-text-field__error","data-show":!!a,children:a}),h&&!a&&fr("span",{className:"vm-text-field__helper-text",children:h})]})},Bo=function(e){var t;try{t=new URL(e)}catch(g){return!1}return"http:"===t.protocol||"https:"===t.protocol},Mo=function(e){var t=e.serverUrl,n=e.onChange,r=e.onEnter,i=_t(X(""),2),o=i[0],a=i[1];return fr(To,{autofocus:!0,label:"Server URL",value:t,error:o,onChange:function(e){var t=e||"";n(t),a(""),t||a(Co.emptyServer),Bo(t)||a(Co.validServer)},onEnter:r})},Lo=function(e){var t=e.title,n=e.children,r=e.onClose,i=function(e){"Escape"===e.key&&r()};return te((function(){return window.addEventListener("keyup",i),function(){window.removeEventListener("keyup",i)}}),[]),mt.createPortal(fr("div",{className:"vm-modal",onMouseDown:r,children:fr("div",{className:"vm-modal-content",children:[fr("div",{className:"vm-modal-content-header",children:[t&&fr("div",{className:"vm-modal-content-header__title",children:t}),fr("div",{className:"vm-modal-header__close",children:fr(ho,{variant:"text",size:"small",onClick:r,children:fr(ai,{})})})]}),fr("div",{className:"vm-modal-content-body",onMouseDown:function(e){e.stopPropagation()},children:n})]})}),document.body)},Po=[{label:"Graph",type:"chart"},{label:"JSON",type:"code"},{label:"Table",type:"table"}],Io=function(e){var t=e.limits,n=e.onChange,r=e.onEnter,i=_t(X({table:"",chart:"",code:""}),2),o=i[0],a=i[1],u=function(e){return function(r){!function(e,r){var i=e||"";a((function(e){return Kn(Kn({},e),{},qn({},r,+i<0?Co.positiveNumber:""))})),n(Kn(Kn({},t),{},qn({},r,i||1/0)))}(r,e)}};return fr("div",{className:"vm-limits-configurator",children:[fr("div",{className:"vm-limits-configurator-title",children:["Series limits by tabs",fr(mo,{title:"To disable limits set to 0",children:fr(ho,{variant:"text",color:"primary",size:"small",startIcon:fr(li,{})})}),fr("div",{className:"vm-limits-configurator-title__reset",children:fr(ho,{variant:"text",color:"primary",size:"small",startIcon:fr(ui,{}),onClick:function(){n(or)},children:"Reset"})})]}),fr("div",{className:"vm-limits-configurator__inputs",children:Po.map((function(e){return fr(To,{label:e.label,value:t[e.type],error:o[e.type],onChange:u(e.type),onEnter:r,type:"number"},e.type)}))})]})},$o="Settings",Ro=function(){var e=er(),t=hr().serverUrl,n=Vi().seriesLimits,r=pr(),i=qi(),o=_t(X(t),2),a=o[0],u=o[1],l=_t(X(n),2),c=l[0],s=l[1],f=_t(X(!1),2),d=f[0],h=f[1],p=function(){return h(!1)},v=function(){r({type:"SET_SERVER",payload:a}),i({type:"SET_SERIES_LIMITS",payload:c}),p()};return fr(m,{children:[fr(mo,{title:$o,children:fr(ho,{className:Bi()({"vm-header-button":!e}),variant:"contained",color:"primary",startIcon:fr(oi,{}),onClick:function(){return h(!0)}})}),d&&fr(Lo,{title:$o,onClose:p,children:fr("div",{className:"vm-server-configurator",children:[!e&&fr("div",{className:"vm-server-configurator__input",children:fr(Mo,{serverUrl:a,onChange:u,onEnter:v})}),fr("div",{className:"vm-server-configurator__input",children:fr(Io,{limits:c,onChange:s,onEnter:v})}),fr("div",{className:"vm-server-configurator__footer",children:[fr(ho,{variant:"outlined",color:"error",onClick:p,children:"Cancel"}),fr(ho,{variant:"contained",onClick:v,children:"apply"})]})]})})]})},jo={windows:"Windows",mac:"Mac OS",linux:"Linux"},zo=(Object.values(jo).find((function(e){return navigator.userAgent.indexOf(e)>=0}))||"unknown")===jo.mac?"Cmd":"Ctrl",Uo=[{title:"Query",list:[{keys:["Enter"],description:"Run"},{keys:["Shift","Enter"],description:"Multi-line queries"},{keys:[zo,"Arrow Up"],description:"Previous command from the Query history"},{keys:[zo,"Arrow Down"],description:"Next command from the Query history"}]},{title:"Graph",list:[{keys:[zo,"Scroll Up"],description:"Zoom in"},{keys:[zo,"Scroll Down"],description:"Zoom out"},{keys:[zo,"Click and Drag"],description:"Move the graph left/right"}]},{title:"Legend",list:[{keys:["Mouse Click"],description:"Select series"},{keys:[zo,"Mouse Click"],description:"Toggle multiple series"}]}],Ho=function(){var e=_t(X(!1),2),t=e[0],n=e[1],r=er();return fr(m,{children:[fr(mo,{title:"Shortcut keys",placement:"bottom-center",children:fr(ho,{className:r?"":"vm-header-button",variant:"contained",color:"primary",startIcon:fr(_i,{}),onClick:function(){n(!0)}})}),t&&fr(Lo,{title:"Shortcut keys",onClose:function(){n(!1)},children:fr("div",{className:"vm-shortcuts",children:Uo.map((function(e){return fr("div",{className:"vm-shortcuts-section",children:[fr("h3",{className:"vm-shortcuts-section__title",children:e.title}),fr("div",{className:"vm-shortcuts-section-list",children:e.list.map((function(e){return fr("div",{className:"vm-shortcuts-section-list-item",children:[fr("div",{className:"vm-shortcuts-section-list-item__key",children:e.keys.map((function(t,n){return fr(m,{children:[fr("code",{children:t},t),n!==e.keys.length-1?"+":""]})}))}),fr("p",{className:"vm-shortcuts-section-list-item__description",children:e.description})]},e.keys.join("+"))}))})]},e.title)}))})})]})},Yo=function(){var e=er(),t=re(null),n=eo().date,r=to(),i=oe((function(){return yr()(n).format(wr)}),[n]);return fr("div",{children:[fr("div",{ref:t,children:fr(mo,{title:"Date control",children:fr(ho,{className:e?"":"vm-header-button",variant:"contained",color:"primary",startIcon:fr(yi,{}),children:i})})}),fr(No,{date:n||"",format:wr,onChange:function(e){r({type:"SET_DATE",payload:e})},targetRef:t})]})},Vo=function(){var e=Mi("color-primary"),t=er(),n=Xn().headerStyles,r=(n=void 0===n?{}:n).background,i=void 0===r?t?"#FFF":e:r,o=n.color,a=void 0===o?t?e:"#FFF":o,u=Sn(),l=En(),c=l.search,s=l.pathname,f=oe((function(){return[{label:"Custom panel",value:Jn.home},{label:"Dashboards",value:Jn.dashboards,hide:t},{label:"Cardinality",value:Jn.cardinality},{label:"Top queries",value:Jn.topQueries},{label:"Trace analyzer",value:Jn.trace}]}),[t]),d=_t(X(s),2),h=d[0],p=d[1],v=oe((function(){return(Gn[s]||{}).header||{}}),[s]),m=function(e){u({pathname:e,search:c})};return te((function(){p(s)}),[s]),fr("header",{className:Bi()({"vm-header":!0,"vm-header_app":t}),style:{background:i,color:a},children:[!t&&fr("div",{className:"vm-header-logo",style:{color:a},children:[fr("div",{className:"vm-header-logo__icon",onClick:function(){m(Jn.home),ar({}),window.location.reload()},children:fr(ii,{})}),fr("a",{className:"vm-header-logo__issue",target:"_blank",href:"https://github.com/VictoriaMetrics/VictoriaMetrics/issues/new",rel:"noreferrer",children:"create an issue"})]}),fr("div",{className:"vm-header-nav",children:fr(Pi,{activeItem:h,items:f.filter((function(e){return!e.hide})),color:a,onChange:function(e){p(e),u(e)}})}),fr("div",{className:"vm-header__settings",children:[(null===v||void 0===v?void 0:v.timeSelector)&&fr(Oo,{}),(null===v||void 0===v?void 0:v.cardinalityDatePicker)&&fr(Yo,{}),(null===v||void 0===v?void 0:v.executionControls)&&fr(go,{}),fr(Ro,{}),fr(Ho,{})]})]})},qo=function(){var e=er();return fr("section",{className:"vm-container",children:[fr(Vo,{}),fr("div",{className:Bi()({"vm-container-body":!0,"vm-container-body_app":e}),children:fr(In,{})})]})};function Wo(e,t){var n="undefined"!==typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=gt(e))||t&&e&&"number"===typeof e.length){n&&(e=n);var r=0,i=function(){};return{s:i,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,a=!0,u=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return a=e.done,e},e:function(e){u=!0,o=e},f:function(){try{a||null==n.return||n.return()}finally{if(u)throw o}}}}var Qo,Go,Jo="u-off",Zo="u-label",Ko="width",Xo="height",ea="top",ta="bottom",na="left",ra="right",ia="#000",oa="#0000",aa="mousemove",ua="mousedown",la="mouseup",ca="mouseenter",sa="mouseleave",fa="dblclick",da="change",ha="dppxchange",pa="undefined"!=typeof window,va=pa?document:null,ma=pa?window:null,ya=pa?navigator:null;function ga(e,t){if(null!=t){var n=e.classList;!n.contains(t)&&n.add(t)}}function _a(e,t){var n=e.classList;n.contains(t)&&n.remove(t)}function ba(e,t,n){e.style[t]=n+"px"}function Da(e,t,n,r){var i=va.createElement(e);return null!=t&&ga(i,t),null!=n&&n.insertBefore(i,r),i}function wa(e,t){return Da("div",e,t)}var xa=new WeakMap;function ka(e,t,n,r,i){var o="translate("+t+"px,"+n+"px)";o!=xa.get(e)&&(e.style.transform=o,xa.set(e,o),t<0||n<0||t>r||n>i?ga(e,Jo):_a(e,Jo))}var Ca=new WeakMap;function Ea(e,t,n){var r=t+n;r!=Ca.get(e)&&(Ca.set(e,r),e.style.background=t,e.style.borderColor=n)}var Sa=new WeakMap;function Aa(e,t,n,r){var i=t+""+n;i!=Sa.get(e)&&(Sa.set(e,i),e.style.height=n+"px",e.style.width=t+"px",e.style.marginLeft=r?-t/2+"px":0,e.style.marginTop=r?-n/2+"px":0)}var Fa={passive:!0},Na=Kn(Kn({},Fa),{},{capture:!0});function Oa(e,t,n,r){t.addEventListener(e,n,r?Na:Fa)}function Ta(e,t,n,r){t.removeEventListener(e,n,r?Na:Fa)}function Ba(e,t,n,r){var i;n=n||0;for(var o=(r=r||t.length-1)<=2147483647;r-n>1;)t[i=o?n+r>>1:Ka((n+r)/2)]=t&&i<=n;i+=r)if(null!=e[i])return i;return-1}function La(e,t,n,r){var i=lu,o=-lu;if(1==r)i=e[t],o=e[n];else if(-1==r)i=e[n],o=e[t];else for(var a=t;a<=n;a++)null!=e[a]&&(i=tu(i,e[a]),o=nu(o,e[a]));return[i,o]}function Pa(e,t,n){for(var r=lu,i=-lu,o=t;o<=n;o++)e[o]>0&&(r=tu(r,e[o]),i=nu(i,e[o]));return[r==lu?1:r,i==-lu?10:i]}pa&&function e(){var t=devicePixelRatio;Qo!=t&&(Qo=t,Go&&Ta(da,Go,e),Go=matchMedia("(min-resolution: ".concat(Qo-.001,"dppx) and (max-resolution: ").concat(Qo+.001,"dppx)")),Oa(da,Go,e),ma.dispatchEvent(new CustomEvent(ha)))}();var Ia=[0,0];function $a(e,t,n,r){return Ia[0]=n<0?bu(e,-n):e,Ia[1]=r<0?bu(t,-r):t,Ia}function Ra(e,t,n,r){var i,o,a,u=iu(e),l=10==n?ou:au;return e==t&&(-1==u?(e*=n,t/=n):(e/=n,t*=n)),r?(i=Ka(l(e)),o=eu(l(t)),e=(a=$a(ru(n,i),ru(n,o),i,o))[0],t=a[1]):(i=Ka(l(Za(e))),o=Ka(l(Za(t))),e=_u(e,(a=$a(ru(n,i),ru(n,o),i,o))[0]),t=gu(t,a[1])),[e,t]}function ja(e,t,n,r){var i=Ra(e,t,n,r);return 0==e&&(i[0]=0),0==t&&(i[1]=0),i}var za={mode:3,pad:.1},Ua={pad:0,soft:null,mode:0},Ha={min:Ua,max:Ua};function Ya(e,t,n,r){return Fu(n)?qa(e,t,n):(Ua.pad=n,Ua.soft=r?0:null,Ua.mode=r?3:0,qa(e,t,Ha))}function Va(e,t){return null==e?t:e}function qa(e,t,n){var r=n.min,i=n.max,o=Va(r.pad,0),a=Va(i.pad,0),u=Va(r.hard,-lu),l=Va(i.hard,lu),c=Va(r.soft,lu),s=Va(i.soft,-lu),f=Va(r.mode,0),d=Va(i.mode,0),h=t-e;h<1e-9&&(h=0,0!=e&&0!=t||(h=1e-9,2==f&&c!=lu&&(o=0),2==d&&s!=-lu&&(a=0)));var p=h||Za(t)||1e3,v=ou(p),m=ru(10,Ka(v)),y=bu(_u(e-p*(0==h?0==e?.1:1:o),m/10),9),g=e>=c&&(1==f||3==f&&y<=c||2==f&&y>=c)?c:lu,_=nu(u,y=g?g:tu(g,y)),b=bu(gu(t+p*(0==h?0==t?.1:1:a),m/10),9),D=t<=s&&(1==d||3==d&&b>=s||2==d&&b<=s)?s:-lu,w=tu(l,b>D&&t<=D?D:nu(D,b));return _==w&&0==_&&(w=100),[_,w]}var Wa=new Intl.NumberFormat(pa?ya.language:"en-US"),Qa=function(e){return Wa.format(e)},Ga=Math,Ja=Ga.PI,Za=Ga.abs,Ka=Ga.floor,Xa=Ga.round,eu=Ga.ceil,tu=Ga.min,nu=Ga.max,ru=Ga.pow,iu=Ga.sign,ou=Ga.log10,au=Ga.log2,uu=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;return Ga.asinh(e/t)},lu=1/0;function cu(e){return 1+(0|ou((e^e>>31)-(e>>31)))}function su(e,t){return Xa(e/t)*t}function fu(e,t,n){return tu(nu(e,t),n)}function du(e){return"function"==typeof e?e:function(){return e}}var hu=function(e){return e},pu=function(e,t){return t},vu=function(e){return null},mu=function(e){return!0},yu=function(e,t){return e==t};function gu(e,t){return eu(e/t)*t}function _u(e,t){return Ka(e/t)*t}function bu(e,t){return Xa(e*(t=Math.pow(10,t)))/t}var Du=new Map;function wu(e){return((""+e).split(".")[1]||"").length}function xu(e,t,n,r){for(var i=[],o=r.map(wu),a=t;a=0&&a>=0?0:u)+(a>=o[c]?0:o[c]),d=bu(s,f);i.push(d),Du.set(d,f)}return i}var ku={},Cu=[],Eu=[null,null],Su=Array.isArray;function Au(e){return"string"==typeof e}function Fu(e){var t=!1;if(null!=e){var n=e.constructor;t=null==n||n==Object}return t}function Nu(e){return null!=e&&"object"==typeof e}var Ou=Object.getPrototypeOf(Uint8Array);function Tu(e){var t,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Fu;if(Su(e)){var r=e.find((function(e){return null!=e}));if(Su(r)||n(r)){t=Array(e.length);for(var i=0;io){for(r=a-1;r>=0&&null==e[r];)e[r--]=null;for(r=a+1;r12?t-12:t},AA:function(e){return e.getHours()>=12?"PM":"AM"},aa:function(e){return e.getHours()>=12?"pm":"am"},a:function(e){return e.getHours()>=12?"p":"a"},mm:function(e){return Uu(e.getMinutes())},m:function(e){return e.getMinutes()},ss:function(e){return Uu(e.getSeconds())},s:function(e){return e.getSeconds()},fff:function(e){return((t=e.getMilliseconds())<10?"00":t<100?"0":"")+t;var t}};function Yu(e,t){t=t||zu;for(var n,r=[],i=/\{([a-z]+)\}|[^{]+/gi;n=i.exec(e);)r.push("{"==n[0][0]?Hu[n[1]]:n[0]);return function(e){for(var n="",i=0;i=a,v=f>=o&&f=i?i:f,N=_+(Ka(c)-Ka(y))+gu(y-_,F);h.push(N);for(var O=t(N),T=O.getHours()+O.getMinutes()/n+O.getSeconds()/r,B=f/r,M=d/u.axes[l]._space;!((N=bu(N+f,1==e?0:3))>s);)if(B>1){var L=Ka(bu(T+B,6))%24,P=t(N).getHours()-L;P>1&&(P=-1),T=(T+B)%24,bu(((N-=P*r)-h[h.length-1])/f,3)*M>=.7&&h.push(N)}else h.push(N)}return h}}]}var cl=_t(ll(1),3),sl=cl[0],fl=cl[1],dl=cl[2],hl=_t(ll(.001),3),pl=hl[0],vl=hl[1],ml=hl[2];function yl(e,t){return e.map((function(e){return e.map((function(n,r){return 0==r||8==r||null==n?n:t(1==r||0==e[8]?n:e[1]+n)}))}))}function gl(e,t){return function(n,r,i,o,a){var u,l,c,s,f,d,h=t.find((function(e){return a>=e[0]}))||t[t.length-1];return r.map((function(t){var n=e(t),r=n.getFullYear(),i=n.getMonth(),o=n.getDate(),a=n.getHours(),p=n.getMinutes(),v=n.getSeconds(),m=r!=u&&h[2]||i!=l&&h[3]||o!=c&&h[4]||a!=s&&h[5]||p!=f&&h[6]||v!=d&&h[7]||h[1];return u=r,l=i,c=o,s=a,f=p,d=v,m(n)}))}}function _l(e,t,n){return new Date(e,t,n)}function bl(e,t){return t(e)}xu(2,-53,53,[1]);function Dl(e,t){return function(n,r){return t(e(r))}}var wl={show:!0,live:!0,isolate:!1,markers:{show:!0,width:2,stroke:function(e,t){var n=e.series[t];return n.width?n.stroke(e,t):n.points.width?n.points.stroke(e,t):null},fill:function(e,t){return e.series[t].fill(e,t)},dash:"solid"},idx:null,idxs:null,values:[]};var xl=[0,0];function kl(e,t,n){return function(e){0==e.button&&n(e)}}function Cl(e,t,n){return n}var El={show:!0,x:!0,y:!0,lock:!1,move:function(e,t,n){return xl[0]=t,xl[1]=n,xl},points:{show:function(e,t){var n=e.cursor.points,r=wa(),i=n.size(e,t);ba(r,Ko,i),ba(r,Xo,i);var o=i/-2;ba(r,"marginLeft",o),ba(r,"marginTop",o);var a=n.width(e,t,i);return a&&ba(r,"borderWidth",a),r},size:function(e,t){return ql(e.series[t].points.width,1)},width:0,stroke:function(e,t){var n=e.series[t].points;return n._stroke||n._fill},fill:function(e,t){var n=e.series[t].points;return n._fill||n._stroke}},bind:{mousedown:kl,mouseup:kl,click:kl,dblclick:kl,mousemove:Cl,mouseleave:Cl,mouseenter:Cl},drag:{setScale:!0,x:!0,y:!1,dist:0,uni:null,_x:!1,_y:!1},focus:{prox:-1},left:-10,top:-10,idx:null,dataIdx:function(e,t,n){return n},idxs:null},Sl={show:!0,stroke:"rgba(0,0,0,0.07)",width:2},Al=Bu({},Sl,{filter:pu}),Fl=Bu({},Al,{size:10}),Nl=Bu({},Sl,{show:!1}),Ol='12px system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"',Tl="bold "+Ol,Bl={show:!0,scale:"x",stroke:ia,space:50,gap:5,size:50,labelGap:0,labelSize:30,labelFont:Tl,side:2,grid:Al,ticks:Fl,border:Nl,font:Ol,rotate:0},Ml={show:!0,scale:"x",auto:!1,sorted:1,min:lu,max:-lu,idxs:[]};function Ll(e,t,n,r,i){return t.map((function(e){return null==e?"":Qa(e)}))}function Pl(e,t,n,r,i,o,a){for(var u=[],l=Du.get(i)||0,c=n=a?n:bu(gu(n,i),l);c<=r;c=bu(c+i,l))u.push(Object.is(c,-0)?0:c);return u}function Il(e,t,n,r,i,o,a){var u=[],l=e.scales[e.axes[t].scale].log,c=Ka((10==l?ou:au)(n));i=ru(l,c),c<0&&(i=bu(i,-c));var s=n;do{u.push(s),(s=bu(s+i,Du.get(i)))>=i*l&&(i=s)}while(s<=r);return u}function $l(e,t,n,r,i,o,a){var u=e.scales[e.axes[t].scale].asinh,l=r>u?Il(e,t,nu(u,n),r,i):[u],c=r>=0&&n<=0?[0]:[];return(n<-u?Il(e,t,nu(u,-r),-n,i):[u]).reverse().map((function(e){return-e})).concat(c,l)}var Rl=/./,jl=/[12357]/,zl=/[125]/,Ul=/1/;function Hl(e,t,n,r,i){var o=e.axes[n],a=o.scale,u=e.scales[a];if(3==u.distr&&2==u.log)return t;var l=e.valToPos,c=o._space,s=l(10,a),f=l(9,a)-s>=c?Rl:l(7,a)-s>=c?jl:l(5,a)-s>=c?zl:Ul;return t.map((function(e){return 4==u.distr&&0==e||f.test(e)?e:null}))}function Yl(e,t){return null==t?"":Qa(t)}var Vl={show:!0,scale:"y",stroke:ia,space:30,gap:5,size:50,labelGap:0,labelSize:30,labelFont:Tl,side:3,grid:Al,ticks:Fl,border:Nl,font:Ol,rotate:0};function ql(e,t){return bu((3+2*(e||1))*t,3)}var Wl={scale:null,auto:!0,sorted:0,min:lu,max:-lu},Ql={show:!0,auto:!0,sorted:0,alpha:1,facets:[Bu({},Wl,{scale:"x"}),Bu({},Wl,{scale:"y"})]},Gl={scale:"y",auto:!0,sorted:0,show:!0,spanGaps:!1,gaps:function(e,t,n,r,i){return i},alpha:1,points:{show:function(e,t){var n=e.series[0],r=n.scale,i=n.idxs,o=e._data[0],a=e.valToPos(o[i[0]],r,!0),u=e.valToPos(o[i[1]],r,!0),l=Za(u-a)/(e.series[t].points.space*Qo);return i[1]-i[0]<=l},filter:null},values:null,min:lu,max:-lu,idxs:[],path:null,clip:null};function Jl(e,t,n,r,i){return n/10}var Zl={time:!0,auto:!0,distr:1,log:10,asinh:1,min:null,max:null,dir:1,ori:0},Kl=Bu({},Zl,{time:!1,ori:1}),Xl={};function ec(e,t){var n=Xl[e];return n||(n={key:e,plots:[],sub:function(e){n.plots.push(e)},unsub:function(e){n.plots=n.plots.filter((function(t){return t!=e}))},pub:function(e,t,r,i,o,a,u){for(var l=0;l0){a=new Path2D;for(var u=0==t?hc:pc,l=n,c=0;cs[0]){var f=s[0]-l;f>0&&u(a,l,r,f,r+o),l=s[1]}}var d=n+i-l;d>0&&u(a,l,r,d,r+o)}return a}function ac(e,t,n,r,i,o,a){for(var u=[],l=1==i?n:r;l>=n&&l<=r;l+=i){if(null===t[l]){var c=l,s=l;if(1==i)for(;++l<=r&&null===t[l];)s=l;else for(;--l>=n&&null===t[l];)s=l;var f=o(e[c]),d=s==c?f:o(e[s]);f=a<=0?o(e[c-i]):f,(d=a>=0?o(e[s+i]):d)>=f&&u.push([f,d])}}return u}function uc(e){return 0==e?hu:1==e?Xa:function(t){return su(t,e)}}function lc(e){var t=0==e?cc:sc,n=0==e?function(e,t,n,r,i,o){e.arcTo(t,n,r,i,o)}:function(e,t,n,r,i,o){e.arcTo(n,t,i,r,o)},r=0==e?function(e,t,n,r,i){e.rect(t,n,r,i)}:function(e,t,n,r,i){e.rect(n,t,i,r)};return function(e,i,o,a,u){var l=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0;0==l?r(e,i,o,a,u):(l=tu(l,a/2,u/2),t(e,i+l,o),n(e,i+a,o,i+a,o+u,l),n(e,i+a,o+u,i,o+u,l),n(e,i,o+u,i,o,l),n(e,i,o,i+a,o,l),e.closePath())}}var cc=function(e,t,n){e.moveTo(t,n)},sc=function(e,t,n){e.moveTo(n,t)},fc=function(e,t,n){e.lineTo(t,n)},dc=function(e,t,n){e.lineTo(n,t)},hc=lc(0),pc=lc(1),vc=function(e,t,n,r,i,o){e.arc(t,n,r,i,o)},mc=function(e,t,n,r,i,o){e.arc(n,t,r,i,o)},yc=function(e,t,n,r,i,o,a){e.bezierCurveTo(t,n,r,i,o,a)},gc=function(e,t,n,r,i,o,a){e.bezierCurveTo(n,t,i,r,a,o)};function _c(e){return function(e,t,n,r,i){return tc(e,t,(function(t,o,a,u,l,c,s,f,d,h,p){var v,m,y=t.pxRound,g=t.points;0==u.ori?(v=cc,m=vc):(v=sc,m=mc);var _=bu(g.width*Qo,3),b=(g.size-g.width)/2*Qo,D=bu(2*b,3),w=new Path2D,x=new Path2D,k=e.bbox,C=k.left,E=k.top,S=k.width,A=k.height;hc(x,C-D,E-D,S+2*D,A+2*D);var F=function(e){if(null!=a[e]){var t=y(c(o[e],u,h,f)),n=y(s(a[e],l,p,d));v(w,t+b,n),m(w,t,n,b,0,2*Ja)}};if(i)i.forEach(F);else for(var N=n;N<=r;N++)F(N);return{stroke:_>0?w:null,fill:w,clip:x,flags:3}}))}}function bc(e){return function(t,n,r,i,o,a){r!=i&&(o!=r&&a!=r&&e(t,n,r),o!=i&&a!=i&&e(t,n,i),e(t,n,a))}}var Dc=bc(fc),wc=bc(dc);function xc(e){var t=Va(null===e||void 0===e?void 0:e.alignGaps,0);return function(e,n,r,i){return tc(e,n,(function(o,a,u,l,c,s,f,d,h,p,v){var m,y,g=o.pxRound,_=function(e){return g(s(e,l,p,d))},b=function(e){return g(f(e,c,v,h))};0==l.ori?(m=fc,y=Dc):(m=dc,y=wc);for(var D,w,x,k=l.dir*(0==l.ori?1:-1),C={stroke:new Path2D,fill:null,clip:null,band:null,gaps:null,flags:1},E=C.stroke,S=lu,A=-lu,F=_(a[1==k?r:i]),N=Ma(u,r,i,1*k),O=Ma(u,r,i,-1*k),T=_(a[N]),B=_(a[O]),M=1==k?r:i;M>=r&&M<=i;M+=k){var L=_(a[M]);L==F?null!=u[M]&&(w=b(u[M]),S==lu&&(m(E,L,w),D=w),S=tu(w,S),A=nu(w,A)):(S!=lu&&(y(E,F,S,A,D,w),x=F),null!=u[M]?(m(E,L,w=b(u[M])),S=A=D=w):(S=lu,A=-lu),F=L)}S!=lu&&S!=A&&x!=F&&y(E,F,S,A,D,w);var P=_t(nc(e,n),2),I=P[0],$=P[1];if(null!=o.fill||0!=I){var R=C.fill=new Path2D(E),j=b(o.fillTo(e,n,o.min,o.max,I));m(R,B,j),m(R,T,j)}if(!o.spanGaps){var z,U=[];(z=U).push.apply(z,bt(ac(a,u,r,i,k,_,t))),C.gaps=U=o.gaps(e,n,r,i,U),C.clip=oc(U,l.ori,d,h,p,v)}return 0!=$&&(C.band=2==$?[ic(e,n,r,i,E,-1),ic(e,n,r,i,E,1)]:ic(e,n,r,i,E,$)),C}))}}function kc(e,t,n,r,i,o){var a=e.length;if(a<2)return null;var u=new Path2D;if(n(u,e[0],t[0]),2==a)r(u,e[1],t[1]);else{for(var l=Array(a),c=Array(a-1),s=Array(a-1),f=Array(a-1),d=0;d0!==c[h]>0?l[h]=0:(l[h]=3*(f[h-1]+f[h])/((2*f[h]+f[h-1])/c[h-1]+(f[h]+2*f[h-1])/c[h]),isFinite(l[h])||(l[h]=0));l[a-1]=c[a-2];for(var p=0;p=i&&o+(l<5?Du.get(l):0)<=17)return[l,c]}while(++u0?e:t.clamp(r,e,t.min,t.max,t.key)):4==t.distr?uu(e,t.asinh):e)-t._min)/(t._max-t._min)}function a(e,t,n,r){var i=o(e,t);return r+n*(-1==t.dir?1-i:i)}function u(e,t,n,r){var i=o(e,t);return r+n*(-1==t.dir?i:1-i)}function l(e,t,n,r){return 0==t.ori?a(e,t,n,r):u(e,t,n,r)}r.valToPosH=a,r.valToPosV=u;var c=!1;r.status=0;var s=r.root=wa("uplot");(null!=e.id&&(s.id=e.id),ga(s,e.class),e.title)&&(wa("u-title",s).textContent=e.title);var f=Da("canvas"),d=r.ctx=f.getContext("2d"),h=wa("u-wrap",s),p=r.under=wa("u-under",h);h.appendChild(f);var v=r.over=wa("u-over",h),m=+Va((e=Tu(e)).pxAlign,1),y=uc(m);(e.plugins||[]).forEach((function(t){t.opts&&(e=t.opts(r,e)||e)}));var g=e.ms||.001,_=r.series=1==i?Fc(e.series||[],Ml,Gl,!1):function(e,t){return e.map((function(e,n){return 0==n?null:Bu({},t,e)}))}(e.series||[null],Ql),b=r.axes=Fc(e.axes||[],Bl,Vl,!0),D=r.scales={},w=r.bands=e.bands||[];w.forEach((function(e){e.fill=du(e.fill||null),e.dir=Va(e.dir,-1)}));var x=2==i?_[1].facets[0].scale:_[0].scale,k={axes:function(){for(var e=function(e){var t=b[e];if(!t.show||!t._show)return"continue";var n=t.side,i=n%2,o=void 0,a=void 0,u=t.stroke(r,e),c=0==n||3==n?-1:1;if(t.label){var s=t.labelGap*c,f=Xa((t._lpos+s)*Qo);Ze(t.labelFont[0],u,"center",2==n?ea:ta),d.save(),1==i?(o=a=0,d.translate(f,Xa(de+pe/2)),d.rotate((3==n?-Ja:Ja)/2)):(o=Xa(fe+he/2),a=f),d.fillText(t.label,o,a),d.restore()}var h=_t(t._found,2),p=h[0],v=h[1];if(0==v)return"continue";var m=D[t.scale],g=0==i?he:pe,_=0==i?fe:de,w=Xa(t.gap*Qo),x=t._splits,k=2==m.distr?x.map((function(e){return qe[e]})):x,C=2==m.distr?qe[x[1]]-qe[x[0]]:p,E=t.ticks,S=t.border,A=E.show?Xa(E.size*Qo):0,F=t._rotate*-Ja/180,N=y(t._pos*Qo),O=N+(A+w)*c;a=0==i?O:0,o=1==i?O:0,Ze(t.font[0],u,1==t.align?na:2==t.align?ra:F>0?na:F<0?ra:0==i?"center":3==n?ra:na,F||1==i?"middle":2==n?ea:ta);for(var T=1.5*t.font[1],B=x.map((function(e){return y(l(e,m,g,_))})),M=t._values,L=0;L0&&(_.forEach((function(e,n){if(n>0&&e.show&&null==e._paths){var i=function(e){var t=fu(He-1,0,Ne-1),n=fu(Ye+1,0,Ne-1);for(;null==e[t]&&t>0;)t--;for(;null==e[n]&&n0&&e.show){je!=e.alpha&&(d.globalAlpha=je=e.alpha),Xe(t,!1),e._paths&&et(t,!1),Xe(t,!0);var n=e.points.show(r,t,He,Ye),i=e.points.filter(r,t,n,e._paths?e._paths.gaps:null);(n||i)&&(e.points._paths=e.points.paths(r,t,He,Ye,i),et(t,!0)),1!=je&&(d.globalAlpha=je=1),on("drawSeries",t)}})))}},C=(e.drawOrder||["axes","series"]).map((function(e){return k[e]}));function E(t){var n=D[t];if(null==n){var r=(e.scales||ku)[t]||ku;if(null!=r.from)E(r.from),D[t]=Bu({},D[r.from],r,{key:t});else{(n=D[t]=Bu({},t==x?Zl:Kl,r)).key=t;var o=n.time,a=n.range,u=Su(a);if((t!=x||2==i&&!o)&&(!u||null!=a[0]&&null!=a[1]||(a={min:null==a[0]?za:{mode:1,hard:a[0],soft:a[0]},max:null==a[1]?za:{mode:1,hard:a[1],soft:a[1]}},u=!1),!u&&Fu(a))){var l=a;a=function(e,t,n){return null==t?Eu:Ya(t,n,l)}}n.range=du(a||(o?Tc:t==x?3==n.distr?Lc:4==n.distr?Ic:Oc:3==n.distr?Mc:4==n.distr?Pc:Bc)),n.auto=du(!u&&n.auto),n.clamp=du(n.clamp||Jl),n._min=n._max=null}}}for(var S in E("x"),E("y"),1==i&&_.forEach((function(e){E(e.scale)})),b.forEach((function(e){E(e.scale)})),e.scales)E(S);var A,F,N=D[x],O=N.distr;0==N.ori?(ga(s,"u-hz"),A=a,F=u):(ga(s,"u-vt"),A=u,F=a);var T={};for(var B in D){var M=D[B];null==M.min&&null==M.max||(T[B]={min:M.min,max:M.max},M.min=M.max=null)}var L,P=e.tzDate||function(e){return new Date(Xa(e/g))},I=e.fmtDate||Yu,$=1==g?dl(P):ml(P),R=gl(P,yl(1==g?fl:vl,I)),j=Dl(P,bl("{YYYY}-{MM}-{DD} {h}:{mm}{aa}",I)),z=[],U=r.legend=Bu({},wl,e.legend),H=U.show,Y=U.markers;U.idxs=z,Y.width=du(Y.width),Y.dash=du(Y.dash),Y.stroke=du(Y.stroke),Y.fill=du(Y.fill);var V,q=[],W=[],Q=!1,G={};if(U.live){var J=_[1]?_[1].values:null;for(var Z in V=(Q=null!=J)?J(r,1,0):{_:0})G[Z]="--"}if(H)if(L=Da("table","u-legend",s),Q){var K=Da("tr","u-thead",L);for(var X in Da("th",null,K),V)Da("th",Zo,K).textContent=X}else ga(L,"u-inline"),U.live&&ga(L,"u-live");var ee={show:!0},te={show:!1};var ne=new Map;function re(e,t,n){var i=ne.get(t)||{},o=we.bind[e](r,t,n);o&&(Oa(e,t,i[e]=o),ne.set(t,i))}function ie(e,t,n){var r=ne.get(t)||{};for(var i in r)null!=e&&i!=e||(Ta(i,t,r[i]),delete r[i]);null==e&&ne.delete(t)}var oe=0,ae=0,ue=0,le=0,ce=0,se=0,fe=0,de=0,he=0,pe=0;r.bbox={};var ve=!1,me=!1,ye=!1,ge=!1,_e=!1;function be(e,t,n){(n||e!=r.width||t!=r.height)&&De(e,t),ut(!1),ye=!0,me=!0,ge=_e=we.left>=0,wt()}function De(e,t){r.width=oe=ue=e,r.height=ae=le=t,ce=se=0,function(){var e=!1,t=!1,n=!1,r=!1;b.forEach((function(i,o){if(i.show&&i._show){var a=i.side,u=a%2,l=i._size+(null!=i.label?i.labelSize:0);l>0&&(u?(ue-=l,3==a?(ce+=l,r=!0):n=!0):(le-=l,0==a?(se+=l,e=!0):t=!0))}})),Ae[0]=e,Ae[1]=n,Ae[2]=t,Ae[3]=r,ue-=Ue[1]+Ue[3],ce+=Ue[3],le-=Ue[2]+Ue[0],se+=Ue[0]}(),function(){var e=ce+ue,t=se+le,n=ce,r=se;function i(i,o){switch(i){case 1:return(e+=o)-o;case 2:return(t+=o)-o;case 3:return(n-=o)+o;case 0:return(r-=o)+o}}b.forEach((function(e,t){if(e.show&&e._show){var n=e.side;e._pos=i(n,e._size),null!=e.label&&(e._lpos=i(n,e.labelSize))}}))}();var n=r.bbox;fe=n.left=su(ce*Qo,.5),de=n.top=su(se*Qo,.5),he=n.width=su(ue*Qo,.5),pe=n.height=su(le*Qo,.5)}r.setSize=function(e){be(e.width,e.height)};var we=r.cursor=Bu({},El,{drag:{y:2==i}},e.cursor);we.idxs=z,we._lock=!1;var xe=we.points;xe.show=du(xe.show),xe.size=du(xe.size),xe.stroke=du(xe.stroke),xe.width=du(xe.width),xe.fill=du(xe.fill);var ke=r.focus=Bu({},e.focus||{alpha:.3},we.focus),Ce=ke.prox>=0,Ee=[null];function Se(e,t){if(1==i||t>0){var n=1==i&&D[e.scale].time,o=e.value;e.value=n?Au(o)?Dl(P,bl(o,I)):o||j:o||Yl,e.label=e.label||(n?"Time":"Value")}if(t>0){e.width=null==e.width?1:e.width,e.paths=e.paths||Sc||vu,e.fillTo=du(e.fillTo||rc),e.pxAlign=+Va(e.pxAlign,m),e.pxRound=uc(e.pxAlign),e.stroke=du(e.stroke||null),e.fill=du(e.fill||null),e._stroke=e._fill=e._paths=e._focus=null;var a=ql(e.width,1),u=e.points=Bu({},{size:a,width:nu(1,.2*a),stroke:e.stroke,space:2*a,paths:Ac,_stroke:null,_fill:null},e.points);u.show=du(u.show),u.filter=du(u.filter),u.fill=du(u.fill),u.stroke=du(u.stroke),u.paths=du(u.paths),u.pxAlign=e.pxAlign}if(H){var l=function(e,t){if(0==t&&(Q||!U.live||2==i))return Eu;var n=[],o=Da("tr","u-series",L,L.childNodes[t]);ga(o,e.class),e.show||ga(o,Jo);var a=Da("th",null,o);if(Y.show){var u=wa("u-marker",a);if(t>0){var l=Y.width(r,t);l&&(u.style.border=l+"px "+Y.dash(r,t)+" "+Y.stroke(r,t)),u.style.background=Y.fill(r,t)}}var c=wa(Zo,a);for(var s in c.textContent=e.label,t>0&&(Y.show||(c.style.color=e.width>0?Y.stroke(r,t):Y.fill(r,t)),re("click",a,(function(t){if(!we._lock){var n=_.indexOf(e);if((t.ctrlKey||t.metaKey)!=U.isolate){var r=_.some((function(e,t){return t>0&&t!=n&&e.show}));_.forEach((function(e,t){t>0&&Pt(t,r?t==n?ee:te:ee,!0,an.setSeries)}))}else Pt(n,{show:!e.show},!0,an.setSeries)}})),Ce&&re(ca,a,(function(t){we._lock||Pt(_.indexOf(e),It,!0,an.setSeries)}))),V){var f=Da("td","u-value",o);f.textContent="--",n.push(f)}return[o,n]}(e,t);q.splice(t,0,l[0]),W.splice(t,0,l[1]),U.values.push(null)}if(we.show){z.splice(t,0,null);var c=function(e,t){if(t>0){var n=we.points.show(r,t);if(n)return ga(n,"u-cursor-pt"),ga(n,e.class),ka(n,-10,-10,ue,le),v.insertBefore(n,Ee[t]),n}}(e,t);c&&Ee.splice(t,0,c)}on("addSeries",t)}r.addSeries=function(e,t){e=Nc(e,t=null==t?_.length:t,Ml,Gl),_.splice(t,0,e),Se(_[t],t)},r.delSeries=function(e){if(_.splice(e,1),H){U.values.splice(e,1),W.splice(e,1);var t=q.splice(e,1)[0];ie(null,t.firstChild),t.remove()}we.show&&(z.splice(e,1),Ee.length>1&&Ee.splice(e,1)[0].remove()),on("delSeries",e)};var Ae=[!1,!1,!1,!1];function Fe(e,t,n,r){var i=_t(n,4),o=i[0],a=i[1],u=i[2],l=i[3],c=t%2,s=0;return 0==c&&(l||a)&&(s=0==t&&!o||2==t&&!u?Xa(Bl.size/3):0),1==c&&(o||u)&&(s=1==t&&!a||3==t&&!l?Xa(Vl.size/2):0),s}var Ne,Oe,Te,Be,Me,Le,Pe,Ie,$e,Re,je,ze=r.padding=(e.padding||[Fe,Fe,Fe,Fe]).map((function(e){return du(Va(e,Fe))})),Ue=r._padding=ze.map((function(e,t){return e(r,t,Ae,0)})),He=null,Ye=null,Ve=1==i?_[0].idxs:null,qe=null,We=!1;function Qe(e,n){if(t=null==e?[]:Tu(e,Nu),2==i){Ne=0;for(var o=1;o<_.length;o++)Ne+=t[o][0].length;r.data=t=e}else if(null==t[0]&&(t[0]=[]),r.data=t.slice(),qe=t[0],Ne=qe.length,2==O){t[0]=Array(Ne);for(var a=0;a=0,_e=!0,wt()}}function Ge(){var e,n;if(We=!0,1==i)if(Ne>0){if(He=Ve[0]=0,Ye=Ve[1]=Ne-1,e=t[0][He],n=t[0][Ye],2==O)e=He,n=Ye;else if(1==Ne)if(3==O){var r=_t(Ra(e,e,N.log,!1),2);e=r[0],n=r[1]}else if(4==O){var o=_t(ja(e,e,N.log,!1),2);e=o[0],n=o[1]}else if(N.time)n=e+Xa(86400/g);else{var a=_t(Ya(e,n,.1,!0),2);e=a[0],n=a[1]}}else He=Ve[0]=e=null,Ye=Ve[1]=n=null;Lt(x,e,n)}function Je(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:oa,t=arguments.length>1?arguments[1]:void 0,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:Cu,r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"butt",i=arguments.length>4&&void 0!==arguments[4]?arguments[4]:oa,o=arguments.length>5&&void 0!==arguments[5]?arguments[5]:"round";e!=Oe&&(d.strokeStyle=Oe=e),i!=Te&&(d.fillStyle=Te=i),t!=Be&&(d.lineWidth=Be=t),o!=Le&&(d.lineJoin=Le=o),r!=Pe&&(d.lineCap=Pe=r),n!=Me&&d.setLineDash(Me=n)}function Ze(e,t,n,r){t!=Te&&(d.fillStyle=Te=t),e!=Ie&&(d.font=Ie=e),n!=$e&&(d.textAlign=$e=n),r!=Re&&(d.textBaseline=Re=r)}function Ke(e,t,n,i){var o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:0;if(i.length>0&&e.auto(r,We)&&(null==t||null==t.min)){var a=Va(He,0),u=Va(Ye,i.length-1),l=null==n.min?3==e.distr?Pa(i,a,u):La(i,a,u,o):[n.min,n.max];e.min=tu(e.min,n.min=l[0]),e.max=nu(e.max,n.max=l[1])}}function Xe(e,t){var n=t?_[e].points:_[e];n._stroke=n.stroke(r,e),n._fill=n.fill(r,e)}function et(e,n){var i=n?_[e].points:_[e],o=i._stroke,a=i._fill,u=i._paths,l=u.stroke,c=u.fill,s=u.clip,f=u.flags,h=null,p=bu(i.width*Qo,3),v=p%2/2;n&&null==a&&(a=p>0?"#fff":o);var m=1==i.pxAlign;if(m&&d.translate(v,v),!n){var y=fe,g=de,b=he,D=pe,x=p*Qo/2;0==i.min&&(D+=x),0==i.max&&(g-=x,D+=x),(h=new Path2D).rect(y,g,b,D)}n?tt(o,p,i.dash,i.cap,a,l,c,f,s):function(e,n,i,o,a,u,l,c,s,f,d){var h=!1;w.forEach((function(p,v){if(p.series[0]==e){var m,y=_[p.series[1]],g=t[p.series[1]],b=(y._paths||ku).band;Su(b)&&(b=1==p.dir?b[0]:b[1]);var D=null;y.show&&b&&function(e,t,n){for(t=Va(t,0),n=Va(n,e.length-1);t<=n;){if(null!=e[t])return!0;t++}return!1}(g,He,Ye)?(D=p.fill(r,v)||u,m=y._paths.clip):b=null,tt(n,i,o,a,D,l,c,s,f,d,m,b),h=!0}})),h||tt(n,i,o,a,u,l,c,s,f,d)}(e,o,p,i.dash,i.cap,a,l,c,f,h,s),m&&d.translate(-v,-v)}r.setData=Qe;function tt(e,t,n,r,i,o,a,u,l,c,s,f){Je(e,t,n,r,i),(l||c||f)&&(d.save(),l&&d.clip(l),c&&d.clip(c)),f?3==(3&u)?(d.clip(f),s&&d.clip(s),rt(i,a),nt(e,o,t)):2&u?(rt(i,a),d.clip(f),nt(e,o,t)):1&u&&(d.save(),d.clip(f),s&&d.clip(s),rt(i,a),d.restore(),nt(e,o,t)):(rt(i,a),nt(e,o,t)),(l||c||f)&&d.restore()}function nt(e,t,n){n>0&&(t instanceof Map?t.forEach((function(e,t){d.strokeStyle=Oe=t,d.stroke(e)})):null!=t&&e&&d.stroke(t))}function rt(e,t){t instanceof Map?t.forEach((function(e,t){d.fillStyle=Te=t,d.fill(e)})):null!=t&&e&&d.fill(t)}function it(e,t,n,r,i,o,a,u,l,c){var s=a%2/2;1==m&&d.translate(s,s),Je(u,a,l,c,u),d.beginPath();var f,h,p,v,y=i+(0==r||3==r?-o:o);0==n?(h=i,v=y):(f=i,p=y);for(var g=0;g0&&(t._paths=null,e&&(1==i?(t.min=null,t.max=null):t.facets.forEach((function(e){e.min=null,e.max=null}))))}))}var lt,ct,st,ft,dt,ht,pt,vt,mt,yt,gt,bt,Dt=!1;function wt(){Dt||(Lu(xt),Dt=!0)}function xt(){ve&&(!function(){var e=Tu(D,Nu);for(var n in e){var o=e[n],a=T[n];if(null!=a&&null!=a.min)Bu(o,a),n==x&&ut(!0);else if(n!=x||2==i)if(0==Ne&&null==o.from){var u=o.range(r,null,null,n);o.min=u[0],o.max=u[1]}else o.min=lu,o.max=-lu}if(Ne>0)for(var l in _.forEach((function(n,o){if(1==i){var a=n.scale,u=e[a],l=T[a];if(0==o){var c=u.range(r,u.min,u.max,a);u.min=c[0],u.max=c[1],He=Ba(u.min,t[0]),Ye=Ba(u.max,t[0]),t[0][He]u.max&&Ye--,n.min=qe[He],n.max=qe[Ye]}else n.show&&n.auto&&Ke(u,l,n,t[o],n.sorted);n.idxs[0]=He,n.idxs[1]=Ye}else if(o>0&&n.show&&n.auto){var s=_t(n.facets,2),f=s[0],d=s[1],h=f.scale,p=d.scale,v=_t(t[o],2),m=v[0],y=v[1];Ke(e[h],T[h],f,m,f.sorted),Ke(e[p],T[p],d,y,d.sorted),n.min=d.min,n.max=d.max}})),e){var c=e[l],s=T[l];if(null==c.from&&(null==s||null==s.min)){var f=c.range(r,c.min==lu?null:c.min,c.max==-lu?null:c.max,l);c.min=f[0],c.max=f[1]}}for(var d in e){var h=e[d];if(null!=h.from){var p=e[h.from];if(null==p.min)h.min=h.max=null;else{var v=h.range(r,p.min,p.max,d);h.min=v[0],h.max=v[1]}}}var m={},y=!1;for(var g in e){var b=e[g],w=D[g];if(w.min!=b.min||w.max!=b.max){w.min=b.min,w.max=b.max;var k=w.distr;w._min=3==k?ou(w.min):4==k?uu(w.min,w.asinh):w.min,w._max=3==k?ou(w.max):4==k?uu(w.max,w.asinh):w.max,m[g]=y=!0}}if(y){for(var C in _.forEach((function(e,t){2==i?t>0&&m.y&&(e._paths=null):m[e.scale]&&(e._paths=null)})),m)ye=!0,on("setScale",C);we.show&&(ge=_e=we.left>=0)}for(var E in T)T[E]=null}(),ve=!1),ye&&(!function(){for(var e=!1,t=0;!e;){var n=ot(++t),i=at(t);(e=3==t||n&&i)||(De(r.width,r.height),me=!0)}}(),ye=!1),me&&(ba(p,na,ce),ba(p,ea,se),ba(p,Ko,ue),ba(p,Xo,le),ba(v,na,ce),ba(v,ea,se),ba(v,Ko,ue),ba(v,Xo,le),ba(h,Ko,oe),ba(h,Xo,ae),f.width=Xa(oe*Qo),f.height=Xa(ae*Qo),b.forEach((function(e){var t=e._el,n=e._show,r=e._size,i=e._pos,o=e.side;if(null!=t)if(n){var a=o%2==1;ba(t,a?"left":"top",i-(3===o||0===o?r:0)),ba(t,a?"width":"height",r),ba(t,a?"top":"left",a?se:ce),ba(t,a?"height":"width",a?le:ue),_a(t,Jo)}else ga(t,Jo)})),Oe=Te=Be=Le=Pe=Ie=$e=Re=Me=null,je=1,Wt(!0),on("setSize"),me=!1),oe>0&&ae>0&&(d.clearRect(0,0,f.width,f.height),on("drawClear"),C.forEach((function(e){return e()})),on("draw")),we.show&&ge&&(Vt(null,!0,!1),ge=!1),c||(c=!0,r.status=1,on("ready")),We=!1,Dt=!1}function kt(e,n){var i=D[e];if(null==i.from){if(0==Ne){var o=i.range(r,n.min,n.max,e);n.min=o[0],n.max=o[1]}if(n.min>n.max){var a=n.min;n.min=n.max,n.max=a}if(Ne>1&&null!=n.min&&null!=n.max&&n.max-n.min<1e-16)return;e==x&&2==i.distr&&Ne>0&&(n.min=Ba(n.min,t[0]),n.max=Ba(n.max,t[0]),n.min==n.max&&n.max++),T[e]=n,ve=!0,wt()}}r.redraw=function(e,t){ye=t||!1,!1!==e?Lt(x,N.min,N.max):wt()},r.setScale=kt;var Ct=!1,Et=we.drag,St=Et.x,At=Et.y;we.show&&(we.x&&(lt=wa("u-cursor-x",v)),we.y&&(ct=wa("u-cursor-y",v)),0==N.ori?(st=lt,ft=ct):(st=ct,ft=lt),gt=we.left,bt=we.top);var Ft,Nt,Ot,Tt=r.select=Bu({show:!0,over:!0,left:0,width:0,top:0,height:0},e.select),Bt=Tt.show?wa("u-select",Tt.over?v:p):null;function Mt(e,t){if(Tt.show){for(var n in e)ba(Bt,n,Tt[n]=e[n]);!1!==t&&on("setSelect")}}function Lt(e,t,n){kt(e,{min:t,max:n})}function Pt(e,t,n,o){null!=t.focus&&function(e){if(e!=Ot){var t=null==e,n=1!=ke.alpha;_.forEach((function(r,i){var o=t||0==i||i==e;r._focus=t?null:o,n&&function(e,t){_[e].alpha=t,we.show&&Ee[e]&&(Ee[e].style.opacity=t);H&&q[e]&&(q[e].style.opacity=t)}(i,o?1:ke.alpha)})),Ot=e,n&&wt()}}(e),null!=t.show&&_.forEach((function(n,r){r>0&&(e==r||null==e)&&(n.show=t.show,function(e,t){var n=_[e],r=H?q[e]:null;n.show?r&&_a(r,Jo):(r&&ga(r,Jo),Ee.length>1&&ka(Ee[e],-10,-10,ue,le))}(r,t.show),Lt(2==i?n.facets[1].scale:n.scale,null,null),wt())})),!1!==n&&on("setSeries",e,t),o&&cn("setSeries",r,e,t)}r.setSelect=Mt,r.setSeries=Pt,r.addBand=function(e,t){e.fill=du(e.fill||null),e.dir=Va(e.dir,-1),t=null==t?w.length:t,w.splice(t,0,e)},r.setBand=function(e,t){Bu(w[e],t)},r.delBand=function(e){null==e?w.length=0:w.splice(e,1)};var It={focus:!0};function $t(e,t,n){var r=D[t];n&&(e=e/Qo-(1==r.ori?se:ce));var i=ue;1==r.ori&&(e=(i=le)-e),-1==r.dir&&(e=i-e);var o=r._min,a=o+(r._max-o)*(e/i),u=r.distr;return 3==u?ru(10,a):4==u?function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;return Ga.sinh(e)*t}(a,r.asinh):a}function Rt(e,t){ba(Bt,na,Tt.left=e),ba(Bt,Ko,Tt.width=t)}function jt(e,t){ba(Bt,ea,Tt.top=e),ba(Bt,Xo,Tt.height=t)}H&&Ce&&Oa(sa,L,(function(e){we._lock||null!=Ot&&Pt(null,It,!0,an.setSeries)})),r.valToIdx=function(e){return Ba(e,t[0])},r.posToIdx=function(e,n){return Ba($t(e,x,n),t[0],He,Ye)},r.posToVal=$t,r.valToPos=function(e,t,n){return 0==D[t].ori?a(e,D[t],n?he:ue,n?fe:0):u(e,D[t],n?pe:le,n?de:0)},r.batch=function(e){e(r),wt()},r.setCursor=function(e,t,n){gt=e.left,bt=e.top,Vt(null,t,n)};var zt=0==N.ori?Rt:jt,Ut=1==N.ori?Rt:jt;function Ht(e,t){if(null!=e){var n=e.idx;U.idx=n,_.forEach((function(e,t){(t>0||!Q)&&Yt(t,n)}))}H&&U.live&&function(){if(H&&U.live)for(var e=2==i?1:0;e<_.length;e++)if(0!=e||!Q){var t=U.values[e],n=0;for(var r in t)W[e][n++].firstChild.nodeValue=t[r]}}(),_e=!1,!1!==t&&on("setLegend")}function Yt(e,n){var i;if(null==n)i=G;else{var o=_[e],a=0==e&&2==O?qe:t[e];i=Q?o.values(r,e,n):{_:o.value(r,a[n],e,n)}}U.values[e]=i}function Vt(e,n,o){mt=gt,yt=bt;var a,u=_t(we.move(r,gt,bt),2);gt=u[0],bt=u[1],we.show&&(st&&ka(st,Xa(gt),0,ue,le),ft&&ka(ft,0,Xa(bt),ue,le));var l=He>Ye;Ft=lu;var s=0==N.ori?ue:le,f=1==N.ori?ue:le;if(gt<0||0==Ne||l){a=null;for(var d=0;d<_.length;d++)d>0&&Ee.length>1&&ka(Ee[d],-10,-10,ue,le);if(Ce&&Pt(null,It,!0,null==e&&an.setSeries),U.live){z.fill(null),_e=!0;for(var h=0;h<_.length;h++)U.values[h]=G}}else{var p,v;1==i&&(a=Ba(p=$t(0==N.ori?gt:bt,x),t[0],He,Ye),v=gu(A(t[0][a],N,s,0),.5));for(var m=2==i?1:0;m<_.length;m++){var y=_[m],g=z[m],b=1==i?t[m][g]:t[m][1][g],w=we.dataIdx(r,m,a,p),k=1==i?t[m][w]:t[m][1][w];_e=_e||k!=b||w!=g,z[m]=w;var C=w==a?v:gu(A(1==i?t[0][w]:t[m][0][w],N,s,0),.5);if(m>0&&y.show){var E=null==k?-10:gu(F(k,1==i?D[y.scale]:D[y.facets[1].scale],f,0),.5);if(E>0&&1==i){var S=Za(E-bt);S<=Ft&&(Ft=S,Nt=m)}var O=void 0,T=void 0;if(0==N.ori?(O=C,T=E):(O=E,T=C),_e&&Ee.length>1){Ea(Ee[m],we.points.fill(r,m),we.points.stroke(r,m));var B=void 0,M=void 0,L=void 0,P=void 0,I=!0,$=we.points.bbox;if(null!=$){I=!1;var R=$(r,m);L=R.left,P=R.top,B=R.width,M=R.height}else L=O,P=T,B=M=we.points.size(r,m);Aa(Ee[m],B,M,I),ka(Ee[m],L,P,ue,le)}}if(U.live){if(!_e||0==m&&Q)continue;Yt(m,w)}}}if(we.idx=a,we.left=gt,we.top=bt,_e&&(U.idx=a,Ht()),Tt.show&&Ct)if(null!=e){var j=_t(an.scales,2),H=j[0],Y=j[1],V=_t(an.match,2),q=V[0],W=V[1],J=_t(e.cursor.sync.scales,2),Z=J[0],K=J[1],X=e.cursor.drag;if(St=X._x,At=X._y,St||At){var ee,te,ne,re,ie,oe=e.select,ae=oe.left,ce=oe.top,se=oe.width,fe=oe.height,de=e.scales[H].ori,he=e.posToVal,pe=null!=H&&q(H,Z),ve=null!=Y&&W(Y,K);pe&&St?(0==de?(ee=ae,te=se):(ee=ce,te=fe),ne=D[H],re=A(he(ee,Z),ne,s,0),ie=A(he(ee+te,Z),ne,s,0),zt(tu(re,ie),Za(ie-re))):zt(0,s),ve&&At?(1==de?(ee=ae,te=se):(ee=ce,te=fe),ne=D[Y],re=F(he(ee,K),ne,f,0),ie=F(he(ee+te,K),ne,f,0),Ut(tu(re,ie),Za(ie-re))):Ut(0,f)}else Zt()}else{var me=Za(mt-dt),ye=Za(yt-ht);if(1==N.ori){var ge=me;me=ye,ye=ge}St=Et.x&&me>=Et.dist,At=Et.y&&ye>=Et.dist;var be,De,xe=Et.uni;null!=xe?St&&At&&(At=ye>=xe,(St=me>=xe)||At||(ye>me?At=!0:St=!0)):Et.x&&Et.y&&(St||At)&&(St=At=!0),St&&(0==N.ori?(be=pt,De=gt):(be=vt,De=bt),zt(tu(be,De),Za(De-be)),At||Ut(0,f)),At&&(1==N.ori?(be=pt,De=gt):(be=vt,De=bt),Ut(tu(be,De),Za(De-be)),St||zt(0,s)),St||At||(zt(0,0),Ut(0,0))}if(Et._x=St,Et._y=At,null==e){if(o){if(null!=un){var Se=_t(an.scales,2),Ae=Se[0],Fe=Se[1];an.values[0]=null!=Ae?$t(0==N.ori?gt:bt,Ae):null,an.values[1]=null!=Fe?$t(1==N.ori?gt:bt,Fe):null}cn(aa,r,gt,bt,ue,le,a)}if(Ce){var Oe=o&&an.setSeries,Te=ke.prox;null==Ot?Ft<=Te&&Pt(Nt,It,!0,Oe):Ft>Te?Pt(null,It,!0,Oe):Nt!=Ot&&Pt(Nt,It,!0,Oe)}}c&&!1!==n&&on("setCursor")}r.setLegend=Ht;var qt=null;function Wt(e){!0===e?qt=null:on("syncRect",qt=v.getBoundingClientRect())}function Qt(e,t,n,r,i,o,a){we._lock||(Gt(e,t,n,r,i,o,a,!1,null!=e),null!=e?Vt(null,!0,!0):Vt(t,!0,!1))}function Gt(e,t,n,i,o,a,u,c,s){if(null==qt&&Wt(!1),null!=e)n=e.clientX-qt.left,i=e.clientY-qt.top;else{if(n<0||i<0)return gt=-10,void(bt=-10);var f=_t(an.scales,2),d=f[0],h=f[1],p=t.cursor.sync,v=_t(p.values,2),m=v[0],y=v[1],g=_t(p.scales,2),_=g[0],b=g[1],w=_t(an.match,2),x=w[0],k=w[1],C=t.axes[0].side%2==1,E=0==N.ori?ue:le,S=1==N.ori?ue:le,A=C?a:o,F=C?o:a,O=C?i:n,T=C?n:i;if(n=null!=_?x(d,_)?l(m,D[d],E,0):-10:E*(O/A),i=null!=b?k(h,b)?l(y,D[h],S,0):-10:S*(T/F),1==N.ori){var B=n;n=i,i=B}}if(s&&((n<=1||n>=ue-1)&&(n=su(n,ue)),(i<=1||i>=le-1)&&(i=su(i,le))),c){dt=n,ht=i;var M=_t(we.move(r,n,i),2);pt=M[0],vt=M[1]}else gt=n,bt=i}var Jt={width:0,height:0};function Zt(){Mt(Jt,!1)}function Kt(e,t,n,i,o,a,u){Ct=!0,St=At=Et._x=Et._y=!1,Gt(e,t,n,i,o,a,0,!0,!1),null!=e&&(re(la,va,Xt),cn(ua,r,pt,vt,ue,le,null))}function Xt(e,t,n,i,o,a,u){Ct=Et._x=Et._y=!1,Gt(e,t,n,i,o,a,0,!1,!0);var l=Tt.left,c=Tt.top,s=Tt.width,f=Tt.height,d=s>0||f>0;if(d&&Mt(Tt),Et.setScale&&d){var h=l,p=s,v=c,m=f;if(1==N.ori&&(h=c,p=f,v=l,m=s),St&&Lt(x,$t(h,x),$t(h+p,x)),At)for(var y in D){var g=D[y];y!=x&&null==g.from&&g.min!=lu&&Lt(y,$t(v+m,y),$t(v,y))}Zt()}else we.lock&&(we._lock=!we._lock,we._lock||Vt(null,!0,!1));null!=e&&(ie(la,va),cn(la,r,gt,bt,ue,le,null))}function en(e,t,n,i,o,a,u){Ge(),Zt(),null!=e&&cn(fa,r,gt,bt,ue,le,null)}function tn(){b.forEach(jc),be(r.width,r.height,!0)}Oa(ha,ma,tn);var nn={};nn.mousedown=Kt,nn.mousemove=Qt,nn.mouseup=Xt,nn.dblclick=en,nn.setSeries=function(e,t,n,r){Pt(n,r,!0,!1)},we.show&&(re(ua,v,Kt),re(aa,v,Qt),re(ca,v,Wt),re(sa,v,(function(e,t,n,r,i,o,a){if(!we._lock){var u=Ct;if(Ct){var l,c,s=!0,f=!0;0==N.ori?(l=St,c=At):(l=At,c=St),l&&c&&(s=gt<=10||gt>=ue-10,f=bt<=10||bt>=le-10),l&&s&&(gt=gt=3?Hl:pu)),e.font=Rc(e.font),e.labelFont=Rc(e.labelFont),e._size=e.size(r,null,t,0),e._space=e._rotate=e._incrs=e._found=e._splits=e._values=null,e._size>0&&(Ae[t]=!0,e._el=wa("u-axis",h))}})),n?n instanceof HTMLElement?(n.appendChild(s),sn()):n(r,sn):sn(),r}zc.assign=Bu,zc.fmtNum=Qa,zc.rangeNum=Ya,zc.rangeLog=Ra,zc.rangeAsinh=ja,zc.orient=tc,zc.pxRatio=Qo,zc.join=function(e,t){for(var n=new Set,r=0;r=o&&A<=a;A+=k){var F=c[A];if(null!=F){var N=_(l[A]),O=b(F);1==t?D(x,N,C):D(x,S,O),D(x,N,O),C=O,S=N}}var T=_t(nc(e,i),2),B=T[0],M=T[1];if(null!=u.fill||0!=B){var L=w.fill=new Path2D(x),P=b(u.fillTo(e,i,u.min,u.max,B));D(L,S,P),D(L,E,P)}if(!u.spanGaps){var I,$=[];(I=$).push.apply(I,bt(ac(l,c,o,a,k,_,r)));var R=u.width*Qo/2,j=n||1==t?R:-R,z=n||-1==t?-R:R;$.forEach((function(e){e[0]+=j,e[1]+=z})),w.gaps=$=u.gaps(e,i,o,a,$),w.clip=oc($,s.ori,p,v,m,y)}return 0!=M&&(w.band=2==M?[ic(e,i,o,a,x,-1),ic(e,i,o,a,x,1)]:ic(e,i,o,a,x,M)),w}))}},Uc.bars=function(e){var t=Va((e=e||ku).size,[.6,lu,1]),n=e.align||0,r=(e.gap||0)*Qo,i=Va(e.radius,0),o=1-t[0],a=Va(t[1],lu)*Qo,u=Va(t[2],1)*Qo,l=Va(e.disp,ku),c=Va(e.each,(function(e){})),s=l.fill,f=l.stroke;return function(e,t,d,h){return tc(e,t,(function(p,v,m,y,g,_,b,D,w,x,k){var C,E,S=p.pxRound,A=y.dir*(0==y.ori?1:-1),F=g.dir*(1==g.ori?1:-1),N=0==y.ori?hc:pc,O=0==y.ori?c:function(e,t,n,r,i,o,a){c(e,t,n,i,r,a,o)},T=_t(nc(e,t),2),B=T[0],M=T[1],L=3==g.distr?1==B?g.max:g.min:0,P=b(L,g,k,w),I=S(p.width*Qo),$=!1,R=null,j=null,z=null,U=null;null==s||0!=I&&null==f||($=!0,R=s.values(e,t,d,h),j=new Map,new Set(R).forEach((function(e){null!=e&&j.set(e,new Path2D)})),I>0&&(z=f.values(e,t,d,h),U=new Map,new Set(z).forEach((function(e){null!=e&&U.set(e,new Path2D)}))));var H=l.x0,Y=l.size;if(null!=H&&null!=Y){v=H.values(e,t,d,h),2==H.unit&&(v=v.map((function(t){return e.posToVal(D+t*x,y.key,!0)})));var V=Y.values(e,t,d,h);E=S((E=2==Y.unit?V[0]*x:_(V[0],y,x,D)-_(0,y,x,D))-I),C=1==A?-I/2:E+I/2}else{var q=x;if(v.length>1)for(var W=null,Q=0,G=1/0;Q=d&&Q<=h;Q+=A){var ie=m[Q];if(void 0!==ie){var oe=_(2!=y.distr||null!=l?v[Q]:Q,y,x,D),ae=b(Va(ie,L),g,k,w);null!=re&&null!=ie&&(P=b(re[Q],g,k,w));var ue=S(oe-C),le=S(nu(ae,P)),ce=S(tu(ae,P)),se=le-ce,fe=i*E;null!=ie&&($?(I>0&&null!=z[Q]&&N(U.get(z[Q]),ue,ce+Ka(I/2),E,nu(0,se-I),fe),null!=R[Q]&&N(j.get(R[Q]),ue,ce+Ka(I/2),E,nu(0,se-I),fe)):N(X,ue,ce+Ka(I/2),E,nu(0,se-I),fe),O(e,t,Q,ue-I/2,ce,E+I,se)),0!=M&&(F*M==1?(le=ce,ce=Z):(ce=le,le=Z),N(ee,ue-I/2,ce,E+I,nu(0,se=le-ce),0))}}return I>0&&(K.stroke=$?U:X),K.fill=$?j:X,K}))}},Uc.spline=function(e){return function(e,t){var n=Va(null===t||void 0===t?void 0:t.alignGaps,0);return function(t,r,i,o){return tc(t,r,(function(a,u,l,c,s,f,d,h,p,v,m){var y,g,_,b=a.pxRound,D=function(e){return b(f(e,c,v,h))},w=function(e){return b(d(e,s,m,p))};0==c.ori?(y=cc,_=fc,g=yc):(y=sc,_=dc,g=gc);var x=c.dir*(0==c.ori?1:-1);i=Ma(l,i,o,1),o=Ma(l,i,o,-1);for(var k=D(u[1==x?i:o]),C=k,E=[],S=[],A=1==x?i:o;A>=i&&A<=o;A+=x)if(null!=l[A]){var F=D(u[A]);E.push(C=F),S.push(w(l[A]))}var N={stroke:e(E,S,y,_,g,b),fill:null,clip:null,band:null,gaps:null,flags:1},O=N.stroke,T=_t(nc(t,r),2),B=T[0],M=T[1];if(null!=a.fill||0!=B){var L=N.fill=new Path2D(O),P=w(a.fillTo(t,r,a.min,a.max,B));_(L,C,P),_(L,k,P)}if(!a.spanGaps){var I,$=[];(I=$).push.apply(I,bt(ac(u,l,i,o,x,D,n))),N.gaps=$=a.gaps(t,r,i,o,$),N.clip=oc($,c.ori,h,p,v,m)}return 0!=M&&(N.band=2==M?[ic(t,r,i,o,O,-1),ic(t,r,i,o,O,1)]:ic(t,r,i,o,O,M)),N}))}}(kc,e)};var Hc,Yc={height:500,legend:{show:!1},cursor:{drag:{x:!0,y:!1},focus:{prox:30},points:{size:5.6,width:1.4},bind:{click:function(){return null},dblclick:function(){return null}}}},Vc=function(e){return void 0===e||null===e?"":e.toLocaleString("en-US",{maximumSignificantDigits:20})},qc=function(e,t,n,r){var i,o=e.axes[n];if(r>1)return o._size||60;var a=6+((null===o||void 0===o||null===(i=o.ticks)||void 0===i?void 0:i.size)||0)+(o.gap||0),u=(null!==t&&void 0!==t?t:[]).reduce((function(e,t){return t.length>e.length?t:e}),"");return""!=u&&(a+=function(e,t){var n=document.createElement("span");n.innerText=e,n.style.cssText="position: absolute; z-index: -1; pointer-events: none; opacity: 0; font: ".concat(t),document.body.appendChild(n);var r=n.offsetWidth;return n.remove(),r}(u,e.ctx.font)),Math.ceil(a)},Wc=function(e){return function(e){for(var t=0,n=0;n>8*i&255).toString(16)).substr(-2);return r}(e)},Qc=function(e){return e.replace(/^\[\d+]/,"").replace(/{.+}/gim,"")},Gc=function(e){for(var t=e.length,n=-1/0;t--;){var r=e[t];Number.isFinite(r)&&r>n&&(n=r)}return Number.isFinite(n)?n:null},Jc=function(e){for(var t=e.length,n=1/0;t--;){var r=e[t];Number.isFinite(r)&&r2&&void 0!==arguments[2]?arguments[2]:"";return t.map((function(e){return"".concat(Vc(e)," ").concat(n)}))}(e,n,t)}};return e?Number(e)%2?n:Kn(Kn({},n),{},{side:1}):{space:80}}))},Kc=function(e,t){if(null==e||null==t)return[-1,1];var n=.02*(Math.abs(t-e)||Math.abs(e)||1);return[e-n,t+n]},Xc=n(61),es=n.n(Xc),ts=function(e){var t=e.u,n=e.id,r=e.unit,i=void 0===r?"":r,o=e.metrics,a=e.series,u=e.tooltipIdx,l=e.tooltipOffset,c=e.isSticky,s=e.onClose,f=re(null),d=_t(X({top:-999,left:-999}),2),h=d[0],p=d[1],v=_t(X(!1),2),y=v[0],g=v[1],_=_t(X(!1),2),b=_[0],D=_[1],w=_t(X(u.seriesIdx),2),x=w[0],k=w[1],C=_t(X(u.dataIdx),2),E=C[0],S=C[1],A=oe((function(){return t.root.querySelector(".u-wrap")}),[t]),F=oe((function(){return ir()(t,["data",x,E],0)}),[t,x,E]),N=oe((function(){return Vc(F)}),[F]),O=oe((function(){return t.data[0][E]}),[t,E]),T=oe((function(){return yr()(new Date(1e3*O)).format("YYYY-MM-DD HH:mm:ss:SSS (Z)")}),[O]),B=oe((function(){var e;return Wc((null===(e=a[x])||void 0===e?void 0:e.label)||"")}),[a,x]),M=oe((function(){var e,t=((null===(e=a[x])||void 0===e?void 0:e.label)||"").replace(/{.+}/gim,"").trim();return Qc(t)}),[]),L=oe((function(){var e,t=(null===(e=o[x-1])||void 0===e?void 0:e.metric)||{},n=Object.keys(t).filter((function(e){return"__name__"!==e}));return n.map((function(e){return"".concat(e,'="').concat(t[e],'"')}))}),[o,x]),P=function(e){if(y){var t=e.clientX,n=e.clientY;p({top:n,left:t})}},I=function(){g(!1)};return te((function(){var e;if(f.current){var n=t.valToPos(F||0,(null===(e=a[x])||void 0===e?void 0:e.scale)||"1"),r=t.valToPos(O,"x"),i=f.current.getBoundingClientRect(),o=i.width,u=i.height,c=t.over.getBoundingClientRect(),s=r+o>=c.width?o+20:0,d=n+u>=c.height?u+20:0;p({top:n+l.top+10-d,left:r+l.left+10-s})}}),[t,F,O,x,l,f]),te((function(){k(u.seriesIdx),S(u.dataIdx)}),[u]),te((function(){return y&&(document.addEventListener("mousemove",P),document.addEventListener("mouseup",I)),function(){document.removeEventListener("mousemove",P),document.removeEventListener("mouseup",I)}}),[y]),!A||u.seriesIdx<0||u.dataIdx<0?null:mt.createPortal(fr("div",{className:Bi()({"vm-chart-tooltip":!0,"vm-chart-tooltip_sticky":c,"vm-chart-tooltip_moved":b}),ref:f,style:h,children:[fr("div",{className:"vm-chart-tooltip-header",children:[fr("div",{className:"vm-chart-tooltip-header__date",children:T}),c&&fr(m,{children:[fr(ho,{className:"vm-chart-tooltip-header__drag",variant:"text",size:"small",startIcon:fr(Oi,{}),onMouseDown:function(e){D(!0),g(!0);var t=e.clientX,n=e.clientY;p({top:n,left:t})}}),fr(ho,{className:"vm-chart-tooltip-header__close",variant:"text",size:"small",startIcon:fr(ai,{}),onClick:function(){s&&s(n)}})]})]}),fr("div",{className:"vm-chart-tooltip-data",children:[fr("div",{className:"vm-chart-tooltip-data__marker",style:{background:B}}),fr("p",{children:[M,":",fr("b",{className:"vm-chart-tooltip-data__value",children:N}),i]})]}),!!L.length&&fr("div",{className:"vm-chart-tooltip-info",children:L.map((function(e,t){return fr("div",{children:e},"".concat(e,"_").concat(t))}))})]}),A)};!function(e){e.xRange="xRange",e.yRange="yRange",e.data="data"}(Hc||(Hc={}));var ns=function(e){var t=e.data,n=e.series,r=e.metrics,i=void 0===r?[]:r,o=e.period,a=e.yaxis,u=e.unit,l=e.setPeriod,c=e.container,s=re(null),f=_t(X(!1),2),d=f[0],p=f[1],v=_t(X({min:o.start,max:o.end}),2),m=v[0],y=v[1],g=_t(X(),2),_=g[0],b=g[1],D=bo(c),w=_t(X(!1),2),x=w[0],k=w[1],C=_t(X({seriesIdx:-1,dataIdx:-1}),2),E=C[0],S=C[1],A=_t(X({left:0,top:0}),2),F=A[0],N=A[1],O=_t(X([]),2),T=O[0],B=O[1],M=oe((function(){return"".concat(E.seriesIdx,"_").concat(E.dataIdx)}),[E]),L=ae(es()((function(e){var t=e.min,n=e.max;l({from:new Date(1e3*t),to:new Date(1e3*n)})}),500),[]),P=function(e){var t=e.u,n=e.min,r=e.max,i=1e3*(r-n);iAr||(t.setScale("x",{min:n,max:r}),y({min:n,max:r}),L({min:n,max:r}))},I=function(e){var t=e.target,n=e.ctrlKey,r=e.metaKey,i=e.key,o=t instanceof HTMLInputElement||t instanceof HTMLTextAreaElement;if(_&&!o){var a="+"===i||"="===i;if(("-"===i||a)&&!n&&!r){e.preventDefault();var u=(m.max-m.min)/10*(a?1:-1);P({u:_,min:m.min+u,max:m.max-u})}}},$=function(){var e="".concat(E.seriesIdx,"_").concat(E.dataIdx),t={id:e,unit:u,series:n,metrics:i,tooltipIdx:E,tooltipOffset:F};if(!T.find((function(t){return t.id===e}))){var r=JSON.parse(JSON.stringify(t));B((function(e){return[].concat(bt(e),[r])}))}},R=function(e){B((function(t){return t.filter((function(t){return t.id!==e}))}))},j=function(){return[m.min,m.max]},z=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1,r=arguments.length>3?arguments[3]:void 0;return a.limits.enable?a.limits.range[r]:Kc(t,n)},U=Kn(Kn({},Yc),{},{series:n,axes:Zc([{},{scale:"1"}],u),scales:Kn({},function(){var e={x:{range:j}},t=Object.keys(a.limits.range);return(t.length?t:["1"]).forEach((function(t){e[t]={range:function(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1;return z(e,n,r,t)}}})),e}()),width:D.width||400,plugins:[{hooks:{ready:function(e){N({left:parseFloat(e.over.style.left),top:parseFloat(e.over.style.top)}),e.over.addEventListener("mousedown",(function(t){var n=t.ctrlKey,r=t.metaKey;0===t.button&&(n||r)&&function(e){var t=e.e,n=e.factor,r=void 0===n?.85:n,i=e.u,o=e.setPanning,a=e.setPlotScale;t.preventDefault(),o(!0);var u=t.clientX,l=i.posToVal(1,"x")-i.posToVal(0,"x"),c=i.scales.x.min||0,s=i.scales.x.max||0,f=function(e){e.preventDefault();var t=l*((e.clientX-u)*r);a({u:i,min:c-t,max:s-t})};document.addEventListener("mousemove",f),document.addEventListener("mouseup",(function e(){o(!1),document.removeEventListener("mousemove",f),document.removeEventListener("mouseup",e)}))}({u:e,e:t,setPanning:p,setPlotScale:P,factor:.9})})),e.over.addEventListener("wheel",(function(t){if(t.ctrlKey||t.metaKey){t.preventDefault();var n=e.over.getBoundingClientRect().width,r=e.cursor.left&&e.cursor.left>0?e.cursor.left:0,i=e.posToVal(r,"x"),o=(e.scales.x.max||0)-(e.scales.x.min||0),a=t.deltaY<0?.9*o:o/.9,u=i-r/n*a,l=u+a;e.batch((function(){return P({u:e,min:u,max:l})}))}}))},setCursor:function(e){var t,n=null!==(t=e.cursor.idx)&&void 0!==t?t:-1;S((function(e){return Kn(Kn({},e),{},{dataIdx:n})}))},setSeries:function(e,t){var n=null!==t&&void 0!==t?t:-1;S((function(e){return Kn(Kn({},e),{},{seriesIdx:n})}))}}}],hooks:{setSelect:[function(e){var t=e.posToVal(e.select.left,"x"),n=e.posToVal(e.select.left+e.select.width,"x");P({u:e,min:t,max:n})}]}}),H=function(e){if(_){switch(e){case Hc.xRange:_.scales.x.range=j;break;case Hc.yRange:Object.keys(a.limits.range).forEach((function(e){_.scales[e]&&(_.scales[e].range=function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1;return z(t,n,r,e)})}));break;case Hc.data:_.setData(t)}d||_.redraw()}};return te((function(){return y({min:o.start,max:o.end})}),[o]),te((function(){if(B([]),S({seriesIdx:-1,dataIdx:-1}),s.current){var e=new zc(U,t,s.current);return b(e),y({min:o.start,max:o.end}),e.destroy}}),[s.current,n,D]),te((function(){return window.addEventListener("keydown",I),function(){window.removeEventListener("keydown",I)}}),[m]),te((function(){return H(Hc.data)}),[t]),te((function(){return H(Hc.xRange)}),[m]),te((function(){return H(Hc.yRange)}),[a]),te((function(){var e=-1!==E.dataIdx&&-1!==E.seriesIdx;return k(e),e&&window.addEventListener("click",$),function(){window.removeEventListener("click",$)}}),[E,T]),fr("div",{className:Bi()({"vm-line-chart":!0,"vm-line-chart_panning":d}),children:[fr("div",{className:"vm-line-chart__u-plot",ref:s}),_&&x&&fr(ts,{unit:u,u:_,series:n,metrics:i,tooltipIdx:E,tooltipOffset:F,id:M}),_&&T.map((function(e){return h(ts,Kn(Kn({},e),{},{isSticky:!0,u:_,key:e.id,onClose:R}))}))]})};function rs(){rs=function(){return e};var e={},t=Object.prototype,n=t.hasOwnProperty,r=Object.defineProperty||function(e,t,n){e[t]=n.value},i="function"==typeof Symbol?Symbol:{},o=i.iterator||"@@iterator",a=i.asyncIterator||"@@asyncIterator",u=i.toStringTag||"@@toStringTag";function l(e,t,n){return Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}),e[t]}try{l({},"")}catch(A){l=function(e,t,n){return e[t]=n}}function c(e,t,n,i){var o=t&&t.prototype instanceof d?t:d,a=Object.create(o.prototype),u=new C(i||[]);return r(a,"_invoke",{value:D(e,n,u)}),a}function s(e,t,n){try{return{type:"normal",arg:e.call(t,n)}}catch(A){return{type:"throw",arg:A}}}e.wrap=c;var f={};function d(){}function h(){}function p(){}var v={};l(v,o,(function(){return this}));var m=Object.getPrototypeOf,y=m&&m(m(E([])));y&&y!==t&&n.call(y,o)&&(v=y);var g=p.prototype=d.prototype=Object.create(v);function _(e){["next","throw","return"].forEach((function(t){l(e,t,(function(e){return this._invoke(t,e)}))}))}function b(e,t){function i(r,o,a,u){var l=s(e[r],e,o);if("throw"!==l.type){var c=l.arg,f=c.value;return f&&"object"==At(f)&&n.call(f,"__await")?t.resolve(f.__await).then((function(e){i("next",e,a,u)}),(function(e){i("throw",e,a,u)})):t.resolve(f).then((function(e){c.value=e,a(c)}),(function(e){return i("throw",e,a,u)}))}u(l.arg)}var o;r(this,"_invoke",{value:function(e,n){function r(){return new t((function(t,r){i(e,n,t,r)}))}return o=o?o.then(r,r):r()}})}function D(e,t,n){var r="suspendedStart";return function(i,o){if("executing"===r)throw new Error("Generator is already running");if("completed"===r){if("throw"===i)throw o;return S()}for(n.method=i,n.arg=o;;){var a=n.delegate;if(a){var u=w(a,n);if(u){if(u===f)continue;return u}}if("next"===n.method)n.sent=n._sent=n.arg;else if("throw"===n.method){if("suspendedStart"===r)throw r="completed",n.arg;n.dispatchException(n.arg)}else"return"===n.method&&n.abrupt("return",n.arg);r="executing";var l=s(e,t,n);if("normal"===l.type){if(r=n.done?"completed":"suspendedYield",l.arg===f)continue;return{value:l.arg,done:n.done}}"throw"===l.type&&(r="completed",n.method="throw",n.arg=l.arg)}}}function w(e,t){var n=e.iterator[t.method];if(void 0===n){if(t.delegate=null,"throw"===t.method){if(e.iterator.return&&(t.method="return",t.arg=void 0,w(e,t),"throw"===t.method))return f;t.method="throw",t.arg=new TypeError("The iterator does not provide a 'throw' method")}return f}var r=s(n,e.iterator,t.arg);if("throw"===r.type)return t.method="throw",t.arg=r.arg,t.delegate=null,f;var i=r.arg;return i?i.done?(t[e.resultName]=i.value,t.next=e.nextLoc,"return"!==t.method&&(t.method="next",t.arg=void 0),t.delegate=null,f):i:(t.method="throw",t.arg=new TypeError("iterator result is not an object"),t.delegate=null,f)}function x(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function k(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function C(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(x,this),this.reset(!0)}function E(e){if(e){var t=e[o];if(t)return t.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var r=-1,i=function t(){for(;++r=0;--i){var o=this.tryEntries[i],a=o.completion;if("root"===o.tryLoc)return r("end");if(o.tryLoc<=this.prev){var u=n.call(o,"catchLoc"),l=n.call(o,"finallyLoc");if(u&&l){if(this.prev=0;--r){var i=this.tryEntries[r];if(i.tryLoc<=this.prev&&n.call(i,"finallyLoc")&&this.prev=0;--t){var n=this.tryEntries[t];if(n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),k(n),f}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.tryLoc===e){var r=n.completion;if("throw"===r.type){var i=r.arg;k(n)}return i}}throw new Error("illegal catch attempt")},delegateYield:function(e,t,n){return this.delegate={iterator:E(e),resultName:t,nextLoc:n},"next"===this.method&&(this.arg=void 0),f}},e}function is(e,t,n,r,i,o,a){try{var u=e[o](a),l=u.value}catch(c){return void n(c)}u.done?t(l):Promise.resolve(l).then(r,i)}function os(e){return function(){var t=this,n=arguments;return new Promise((function(r,i){var o=e.apply(t,n);function a(e){is(o,r,i,a,u,"next",e)}function u(e){is(o,r,i,a,u,"throw",e)}a(void 0)}))}}var as=function(e){var t=e.legend,n=e.onChange,r=_t(X(""),2),i=r[0],o=r[1],a=oe((function(){return function(e){var t=Object.keys(e.freeFormFields).filter((function(e){return"__name__"!==e}));return t.map((function(t){var n="".concat(t,'="').concat(e.freeFormFields[t],'"');return{id:"".concat(e.label,".").concat(n),freeField:n,key:t}}))}(t)}),[t]),u=function(){var e=os(rs().mark((function e(t,n){return rs().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,navigator.clipboard.writeText(t);case 2:o(n),setTimeout((function(){return o("")}),2e3);case 4:case"end":return e.stop()}}),e)})));return function(t,n){return e.apply(this,arguments)}}();return fr("div",{className:Bi()({"vm-legend-item":!0,"vm-legend-item_hide":!t.checked}),onClick:function(e){return function(t){n(e,t.ctrlKey||t.metaKey)}}(t),children:[fr("div",{className:"vm-legend-item__marker",style:{backgroundColor:t.color}}),fr("div",{className:"vm-legend-item-info",children:[fr("span",{className:"vm-legend-item-info__label",children:Qc(t.label)}),"\xa0{",a.map((function(e){return fr(mo,{open:i===e.id,title:"Copied!",placement:"top-center",children:fr("span",{className:"vm-legend-item-info__free-fields",onClick:(t=e.freeField,n=e.id,function(e){e.stopPropagation(),u(t,n)}),children:e.freeField},e.key)},e.id);var t,n})),"}"]})]})},us=function(e){var t=e.labels,n=e.query,r=e.onChange,i=oe((function(){return Array.from(new Set(t.map((function(e){return e.group}))))}),[t]);return fr(m,{children:fr("div",{className:"vm-legend",children:i.map((function(e){return fr("div",{className:"vm-legend-group",children:[fr("div",{className:"vm-legend-group-title",children:[fr("span",{className:"vm-legend-group-title__count",children:["Query ",e,": "]}),fr("span",{className:"vm-legend-group-title__query",children:n[e-1]})]}),fr("div",{children:t.filter((function(t){return t.group===e})).map((function(e){return fr(as,{legend:e,onChange:r},e.label)}))})]},e)}))})})};function ls(e,t){if(null==e)return{};var n,r,i=function(e,t){if(null==e)return{};var n,r,i={},o=Object.keys(e);for(r=0;r=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var cs=["__name__"],ss=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:": ",r=arguments.length>3&&void 0!==arguments[3]&&arguments[3],i=e.metric,o=i.__name__,a=ls(i,cs),u=t||o||"";return 0===Object.keys(e.metric).length?u||"Result ".concat(e.group):"".concat(u," {").concat(Object.entries(a).map((function(e){return"".concat(e[0]).concat(n).concat(r?'"'.concat(e[1],'"'):e[1])})).join(", "),"}")},fs=function(e,t,n){var r=ss(e,n[e.group-1]),i="[".concat(e.group,"]").concat(r);return{label:i,freeFormFields:e.metric,width:1.4,stroke:Wc(i),show:!hs(i,t),scale:"1",points:{size:4.2,width:1.4}}},ds=function(e,t){return{group:t,label:e.label||"",color:e.stroke,checked:e.show||!1,freeFormFields:e.freeFormFields}},hs=function(e,t){return t.includes("".concat(e))},ps=function(e){switch(e){case"NaN":return NaN;case"Inf":case"+Inf":return 1/0;case"-Inf":return-1/0;default:return parseFloat(e)}},vs=function(e){var t=e.data,n=void 0===t?[]:t,r=e.period,i=e.customStep,o=e.query,a=e.yaxis,u=e.unit,l=e.showLegend,c=void 0===l||l,s=e.setYaxisLimits,f=e.setPeriod,d=e.alias,h=void 0===d?[]:d,p=e.fullWidth,v=void 0===p||p,m=oe((function(){return i||r.step||1}),[r.step,i]),y=_t(X([[]]),2),g=y[0],_=y[1],b=_t(X([]),2),D=b[0],w=b[1],x=_t(X([]),2),k=x[0],C=x[1],E=_t(X([]),2),S=E[0],A=E[1],F=function(e){var t=function(e){var t={},n=Object.values(e).flat(),r=Jc(n),i=Gc(n);return t[1]=Kc(r,i),t}(e);s(t)};te((function(){var e=[],t={},i=[],o=[{}];null===n||void 0===n||n.forEach((function(n){var r=fs(n,S,h);o.push(r),i.push(ds(r,n.group));var a,u=t[n.group]||[],l=Wo(n.values);try{for(l.s();!(a=l.n()).done;){var c=a.value;e.push(c[0]),u.push(ps(c[1]))}}catch(s){l.e(s)}finally{l.f()}t[n.group]=u}));var a=function(e,t,n){for(var r=Array.from(new Set(e)).sort((function(e,t){return e-t})),i=n.start,o=Nr(n.end+t),a=0,u=[];i<=o;){for(;a=r.length||r[a]>i)&&u.push(i)}for(;u.length<2;)u.push(i),i=Nr(i+t);return u}(e,m,r),u=n.map((function(e){var t,n=[],r=e.values,i=r.length,o=0,u=Wo(a);try{for(u.s();!(t=u.n()).done;){for(var l=t.value;o1e10*h?n.map((function(){return f})):n}));u.unshift(a),F(t),_(u),w(o),C(i)}),[n]),te((function(){var e=[],t=[{}];null===n||void 0===n||n.forEach((function(n){var r=fs(n,S,h);t.push(r),e.push(ds(r,n.group))})),w(t),C(e)}),[S]);var N=re(null);return fr("div",{className:Bi()({"vm-graph-view":!0,"vm-graph-view_full-width":v}),ref:N,children:[(null===N||void 0===N?void 0:N.current)&&fr(ns,{data:g,series:D,metrics:n,period:r,yaxis:a,unit:u,setPeriod:f,container:null===N||void 0===N?void 0:N.current}),c&&fr(us,{labels:k,query:o,onChange:function(e,t){A(function(e){var t=e.hideSeries,n=e.legend,r=e.metaKey,i=e.series,o=n.label,a=hs(o,t),u=i.map((function(e){return e.label||""}));return r?a?t.filter((function(e){return e!==o})):[].concat(bt(t),[o]):t.length?a?bt(u.filter((function(e){return e!==o}))):[]:bt(u.filter((function(e){return e!==o})))}({hideSeries:S,legend:e,metaKey:t,series:D}))}})]})},ms=function(e){var t=e.value,n=e.options,r=e.anchor,i=e.disabled,o=e.maxWords,a=void 0===o?1:o,u=e.onSelect,l=re(null),s=_t(X(!1),2),f=s[0],d=s[1],h=_t(X(-1),2),p=h[0],v=h[1],m=oe((function(){if(!f)return[];try{var e=new RegExp(String(t),"i");return n.filter((function(n){return e.test(n)&&n!==t})).sort((function(t,n){var r,i;return((null===(r=t.match(e))||void 0===r?void 0:r.index)||0)-((null===(i=n.match(e))||void 0===i?void 0:i.index)||0)}))}catch(c){return[]}}),[f,n,t]),y=function(){d(!1)},g=function(e){var t=e.key,n=e.ctrlKey,r=e.metaKey,i=e.shiftKey,o=n||r||i;if("ArrowUp"!==t||o||(e.preventDefault(),v((function(e){return e<=0?0:e-1}))),"ArrowDown"===t&&!o){e.preventDefault();var a=m.length-1;v((function(e){return e>=a?a:e+1}))}if("Enter"===t){var l=m[p];l&&u(l),y()}"Escape"===t&&y()};return te((function(){var e=(t.match(/[a-zA-Z_:.][a-zA-Z0-9_:.]*/gm)||[]).length;d(t.length>2&&e<=a)}),[t]),te((function(){return function(){if(l.current){var e=l.current.childNodes[p];null!==e&&void 0!==e&&e.scrollIntoView&&e.scrollIntoView({block:"center"})}}(),window.addEventListener("keydown",g),function(){window.removeEventListener("keydown",g)}}),[p,m]),te((function(){v(-1)}),[m]),po(l,y),fr(vo,{open:f,buttonRef:r,placement:"bottom-left",onClose:y,children:fr("div",{className:"vm-autocomplete",ref:l,children:m.map((function(e,t){return fr("div",{className:Bi()({"vm-list__item":!0,"vm-list__item_active":t===p}),id:"$autocomplete$".concat(e),onClick:(n=e,function(){i||(u(n),y())}),children:e},e);var n}))})})},ys=function(e){var t=e.value,n=e.onChange,r=e.onEnter,i=e.onArrowUp,o=e.onArrowDown,a=e.autocomplete,u=e.error,l=e.options,c=e.label,s=e.disabled,f=void 0!==s&&s,d=re(null);return fr("div",{className:"vm-query-editor",ref:d,children:[fr(To,{value:t,label:c,type:"textarea",autofocus:!!t,error:u,onKeyDown:function(e){var t=e.key,n=e.ctrlKey,a=e.metaKey,u=e.shiftKey,l=n||a,c="ArrowDown"===t,s="Enter"===t;"ArrowUp"===t&&l&&(e.preventDefault(),i()),c&&l&&(e.preventDefault(),o()),s&&!u&&r()},onChange:n,disabled:f}),a&&fr(ms,{value:t,options:l,anchor:d,onSelect:function(e){n(e)}})]})},gs=n(936),_s=n.n(gs),bs=function(e){var t=e.defaultStep,n=e.setStep,r=_t(X(t),2),i=r[0],o=r[1],a=_t(X(""),2),u=a[0],l=a[1],c=ae(_s()((function(e){return n(e||1)}),700),[]),s=function(e){e>0?(o(e),c(e),l("")):l("step is out of allowed range")};return te((function(){t&&s(t)}),[t]),fr(To,{label:"Step value",type:"number",value:i,error:u,onChange:function(e){var t=+e;t&&s(t)},endIcon:fr(mo,{title:"Reset step to default",children:fr(ho,{variant:"text",size:"small",startIcon:fr(ui,{}),onClick:function(){s(t||1)}})})})},Ds=function(){var e=Xn().serverURL,t=hr().tenantId,n=pr(),r=Qr(),i=_t(X(t||0),2),o=i[0],a=i[1],u=ae(_s()((function(t){var i=Number(t);if(n({type:"SET_TENANT_ID",payload:i}),e){var o=e.replace(/(\/select\/)([\d]+)(\/prometheus)/gim,"$1".concat(i,"$3"));n({type:"SET_SERVER",payload:o}),r({type:"RUN_QUERY"})}}),700),[]);return te((function(){o!==t&&a(t)}),[t]),fr(To,{label:"Tenant ID",type:"number",value:o,onChange:function(e){a(e),u(e)},endIcon:fr(mo,{title:"Define tenant id if you need request to another storage",children:fr(ho,{variant:"text",size:"small",startIcon:fr(li,{})})})})},ws=function(e){var t,n=e.value,r=void 0!==n&&n,i=e.disabled,o=void 0!==i&&i,a=e.label,u=e.color,l=void 0===u?"secondary":u,c=e.onChange;return fr("div",{className:Bi()((qn(t={"vm-switch":!0,"vm-switch_disabled":o,"vm-switch_active":r},"vm-switch_".concat(l,"_active"),r),qn(t,"vm-switch_".concat(l),l),t)),onClick:function(){o||c(!r)},children:[fr("div",{className:"vm-switch-track",children:fr("div",{className:"vm-switch-track__thumb"})}),a&&fr("span",{className:"vm-switch__label",children:a})]})},xs=function(){var e=Ji(),t=Xn().inputTenantID,n=ni().autocomplete,r=ri(),i=Vi(),o=i.nocache,a=i.isTracingEnabled,u=qi(),l=Wr().period.step;return fr("div",{className:"vm-additional-settings",children:[fr(ws,{label:"Autocomplete",value:n,onChange:function(){r({type:"TOGGLE_AUTOCOMPLETE"})}}),fr(ws,{label:"Disable cache",value:o,onChange:function(){u({type:"TOGGLE_NO_CACHE"})}}),fr(ws,{label:"Trace query",value:a,onChange:function(){u({type:"TOGGLE_QUERY_TRACING"})}}),fr("div",{className:"vm-additional-settings__input",children:fr(bs,{defaultStep:l,setStep:function(t){e({type:"SET_CUSTOM_STEP",payload:t})}})}),!!t&&fr("div",{className:"vm-additional-settings__input",children:fr(Ds,{})})]})};var ks=function(e){var t=re();return te((function(){t.current=e}),[e]),t.current},Cs=function(e){var t=e.error,n=e.queryOptions,r=e.onHideQuery,i=ni(),o=i.query,a=i.queryHistory,u=i.autocomplete,l=ri(),c=Qr(),s=_t(X(o||[]),2),f=s[0],d=s[1],h=_t(X([]),2),p=h[0],v=h[1],m=ks(f),y=function(){l({type:"SET_QUERY_HISTORY",payload:f.map((function(e,t){var n=a[t]||{values:[]},r=e===n.values[n.values.length-1];return{index:n.values.length-Number(r),values:!r&&e?[].concat(bt(n.values),[e]):n.values}}))}),l({type:"SET_QUERY",payload:f}),c({type:"RUN_QUERY"})},g=function(e,t){d((function(n){return n.map((function(n,r){return r===t?e:n}))}))},_=function(e,t){return function(){!function(e,t){var n=a[t],r=n.index,i=n.values,o=r+e;o<0||o>=i.length||(g(i[o]||"",t),l({type:"SET_QUERY_HISTORY_BY_INDEX",payload:{value:{values:i,index:o},queryNumber:t}}))}(e,t)}},b=function(e){return function(t){g(t,e)}},D=function(e){return function(){var t;t=e,d((function(e){return e.filter((function(e,n){return n!==t}))})),v((function(t){return t.map((function(t){return t>e?t-1:t}))}))}},w=function(e){return function(){var t;t=e,v((function(e){return e.includes(t)?e.filter((function(e){return e!==t})):[].concat(bt(e),[t])}))}};return te((function(){m&&f.length1&&fr(mo,{title:"Remove Query",children:fr("div",{className:"vm-query-configurator-list-row__button",children:fr(ho,{variant:"text",color:"error",startIcon:fr(Ci,{}),onClick:D(r)})})})]},r)}))}),fr("div",{className:"vm-query-configurator-settings",children:[fr(xs,{}),fr("div",{className:"vm-query-configurator-settings__buttons",children:[f.length<4&&fr(ho,{variant:"outlined",onClick:function(){d((function(e){return[].concat(bt(e),[""])}))},startIcon:fr(Ei,{}),children:"Add Query"}),fr(ho,{variant:"contained",onClick:y,startIcon:fr(bi,{}),children:"Execute Query"})]})]})]})};function Es(e){var t,n,r,i=2;for("undefined"!=typeof Symbol&&(n=Symbol.asyncIterator,r=Symbol.iterator);i--;){if(n&&null!=(t=e[n]))return t.call(e);if(r&&null!=(t=e[r]))return new Ss(t.call(e));n="@@asyncIterator",r="@@iterator"}throw new TypeError("Object is not async iterable")}function Ss(e){function t(e){if(Object(e)!==e)return Promise.reject(new TypeError(e+" is not an object."));var t=e.done;return Promise.resolve(e.value).then((function(e){return{value:e,done:t}}))}return Ss=function(e){this.s=e,this.n=e.next},Ss.prototype={s:null,n:null,next:function(){return t(this.n.apply(this.s,arguments))},return:function(e){var n=this.s.return;return void 0===n?Promise.resolve({value:e,done:!0}):t(n.apply(this.s,arguments))},throw:function(e){var n=this.s.return;return void 0===n?Promise.reject(e):t(n.apply(this.s,arguments))}},new Ss(e)}var As=0,Fs=function(){function e(t,n){Dt(this,e),this.tracing=void 0,this.query=void 0,this.tracingChildren=void 0,this.originalTracing=void 0,this.id=void 0,this.tracing=t,this.originalTracing=JSON.parse(JSON.stringify(t)),this.query=n,this.id=As++;var r=t.children||[];this.tracingChildren=r.map((function(t){return new e(t,n)}))}return xt(e,[{key:"queryValue",get:function(){return this.query}},{key:"idValue",get:function(){return this.id}},{key:"children",get:function(){return this.tracingChildren}},{key:"message",get:function(){return this.tracing.message}},{key:"duration",get:function(){return this.tracing.duration_msec}},{key:"JSON",get:function(){return JSON.stringify(this.tracing,null,2)}},{key:"originalJSON",get:function(){return JSON.stringify(this.originalTracing,null,2)}},{key:"setTracing",value:function(t){var n=this;this.tracing=t;var r=t.children||[];this.tracingChildren=r.map((function(t){return new e(t,n.query)}))}},{key:"setQuery",value:function(e){this.query=e}},{key:"resetTracing",value:function(){this.tracing=this.originalTracing}}]),e}(),Ns=function(e){var t=e.predefinedQuery,n=e.visible,r=e.display,i=e.customStep,o=e.hideQuery,a=e.showAllSeries,u=ni().query,l=Wr().period,c=Vi(),s=c.displayType,f=c.nocache,d=c.isTracingEnabled,h=c.seriesLimits,p=hr().serverUrl,v=_t(X(!1),2),m=v[0],y=v[1],g=_t(X(),2),_=g[0],b=g[1],D=_t(X(),2),w=D[0],x=D[1],k=_t(X(),2),C=k[0],E=k[1],S=_t(X(),2),A=S[0],F=S[1],N=_t(X(),2),O=N[0],T=N[1],B=_t(X([]),2),M=B[0],L=B[1];te((function(){A&&(b(void 0),x(void 0),E(void 0))}),[A]);var P=function(){var e=os(rs().mark((function e(t){var n,r,i,o,a,u,l,c,s,f,d,h;return rs().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.fetchUrl,r=t.fetchQueue,i=t.displayType,o=t.query,a=t.stateSeriesLimits,u=t.showAllSeries,l=new AbortController,L([].concat(bt(r),[l])),e.prev=3,e.delegateYield(rs().mark((function e(){var t,r,p,v,m,y,g,_,D,w,k,C;return rs().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:t="chart"===i,r=u?1/0:a[i],p=[],v=[],m=1,y=0,c=!1,s=!1,e.prev=8,d=Es(n);case 10:return e.next=12,d.next();case 12:if(!(c=!(h=e.sent).done)){e.next=24;break}return g=h.value,e.next=16,fetch(g,{signal:l.signal});case 16:return _=e.sent,e.next=19,_.json();case 19:D=e.sent,_.ok?(F(void 0),D.trace&&(w=new Fs(D.trace,o[m-1]),v.push(w)),k=r-p.length,D.data.result.slice(0,k).forEach((function(e){e.group=m,p.push(e)})),y+=D.data.result.length,m++):F("".concat(D.errorType,"\r\n").concat(null===D||void 0===D?void 0:D.error));case 21:c=!1,e.next=10;break;case 24:e.next=30;break;case 26:e.prev=26,e.t0=e.catch(8),s=!0,f=e.t0;case 30:if(e.prev=30,e.prev=31,!c||null==d.return){e.next=35;break}return e.next=35,d.return();case 35:if(e.prev=35,!s){e.next=38;break}throw f;case 38:return e.finish(35);case 39:return e.finish(30);case 40:C="Showing ".concat(r," series out of ").concat(y," series due to performance reasons. Please narrow down the query, so it returns less series"),T(y>r?C:""),t?b(p):x(p),E(v);case 44:case"end":return e.stop()}}),e,null,[[8,26,30,40],[31,,35,39]])}))(),"t0",5);case 5:e.next=10;break;case 7:e.prev=7,e.t1=e.catch(3),e.t1 instanceof Error&&"AbortError"!==e.t1.name&&F("".concat(e.t1.name,": ").concat(e.t1.message));case 10:y(!1);case 11:case"end":return e.stop()}}),e,null,[[3,7]])})));return function(t){return e.apply(this,arguments)}}(),I=ae(_s()(P,800),[]),$=function(e,t){var n=e.trim(),r=!o||!o.includes(t);return n&&r},R=oe((function(){var e=null!==t&&void 0!==t?t:u,n="chart"===(r||s);if(l)if(p)if(e.every((function(e){return!e.trim()})))F(Co.validQuery);else{if(Bo(p)){var o=Kn({},l);return o.step=i,e.filter($).map((function(e){return n?function(e,t,n,r,i){return"".concat(e,"/api/v1/query_range?query=").concat(encodeURIComponent(t),"&start=").concat(n.start,"&end=").concat(n.end,"&step=").concat(n.step).concat(r?"&nocache=1":"").concat(i?"&trace=1":"")}(p,e,o,f,d):function(e,t,n,r){return"".concat(e,"/api/v1/query?query=").concat(encodeURIComponent(t),"&time=").concat(n.end,"&step=").concat(n.step).concat(r?"&trace=1":"")}(p,e,o,d)}))}F(Co.validServer)}else F(Co.emptyServer)}),[p,l,s,i,o]);return te((function(){n&&null!==R&&void 0!==R&&R.length&&(y(!0),I({fetchUrl:R,fetchQueue:M,displayType:r||s,query:null!==t&&void 0!==t?t:u,stateSeriesLimits:h,showAllSeries:a}))}),[R,n,h,a]),te((function(){var e=M.slice(0,-1);e.length&&(e.map((function(e){return e.abort()})),L(M.filter((function(e){return!e.signal.aborted}))))}),[M]),{fetchUrl:R,isLoading:m,graphData:_,liveData:w,error:A,warning:O,traces:C}},Os=function(e){var t=e.data,n=so().showInfoMessage,r=oe((function(){return JSON.stringify(t,null,2)}),[t]);return fr("div",{className:"vm-json-view",children:[fr("div",{className:"vm-json-view__copy",children:fr(ho,{variant:"outlined",onClick:function(){navigator.clipboard.writeText(r),n({text:"Formatted JSON has been copied",type:"success"})},children:"Copy JSON"})}),fr("pre",{className:"vm-json-view__code",children:fr("code",{children:r})})]})},Ts=function(e){var t=e.yaxis,n=e.setYaxisLimits,r=e.toggleEnableLimits,i=oe((function(){return Object.keys(t.limits.range)}),[t.limits.range]),o=ae(_s()((function(e,r,i){var o=t.limits.range;o[r][i]=+e,o[r][0]===o[r][1]||o[r][0]>o[r][1]||n(o)}),500),[t.limits.range]),a=function(e,t){return function(n){o(n,e,t)}};return fr("div",{className:"vm-axes-limits",children:[fr(ws,{value:t.limits.enable,onChange:r,label:"Fix the limits for y-axis"}),fr("div",{className:"vm-axes-limits-list",children:i.map((function(e){return fr("div",{className:"vm-axes-limits-list__inputs",children:[fr(To,{label:"Min ".concat(e),type:"number",disabled:!t.limits.enable,value:t.limits.range[e][0],onChange:a(e,0)}),fr(To,{label:"Max ".concat(e),type:"number",disabled:!t.limits.enable,value:t.limits.range[e][1],onChange:a(e,1)})]},e)}))})]})},Bs="Axes settings",Ms=function(e){var t=e.yaxis,n=e.setYaxisLimits,r=e.toggleEnableLimits,i=re(null),o=_t(X(!1),2),a=o[0],u=o[1],l=re(null);po(i,(function(){return u(!1)}),l);var c=function(){u(!1)};return fr("div",{className:"vm-graph-settings",children:[fr(mo,{title:Bs,children:fr("div",{ref:l,children:fr(ho,{variant:"text",startIcon:fr(oi,{}),onClick:function(){u((function(e){return!e}))}})})}),fr(vo,{open:a,buttonRef:l,placement:"bottom-right",onClose:c,children:fr("div",{className:"vm-graph-settings-popper",ref:i,children:[fr("div",{className:"vm-popper-header",children:[fr("h3",{className:"vm-popper-header__title",children:Bs}),fr(ho,{size:"small",startIcon:fr(ai,{}),onClick:c})]}),fr("div",{className:"vm-graph-settings-popper__body",children:fr(Ts,{yaxis:t,setYaxisLimits:n,toggleEnableLimits:r})})]})})]})},Ls=function(e){var t=e.containerStyles,n=void 0===t?{}:t,r=e.message;return fr("div",{className:"vm-spinner",style:n&&{},children:[fr("div",{className:"half-circle-spinner",children:[fr("div",{className:"circle circle-1"}),fr("div",{className:"circle circle-2"})]}),r&&fr("div",{className:"vm-spinner__message",children:r})]})},Ps=function(){var e=hr().serverUrl,t=_t(X([]),2),n=t[0],r=t[1],i=function(){var t=os(rs().mark((function t(){var n,i,o;return rs().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(e){t.next=2;break}return t.abrupt("return");case 2:return n="".concat(e,"/api/v1/label/__name__/values"),t.prev=3,t.next=6,fetch(n);case 6:return i=t.sent,t.next=9,i.json();case 9:o=t.sent,i.ok&&r(o.data),t.next=16;break;case 13:t.prev=13,t.t0=t.catch(3),console.error(t.t0);case 16:case"end":return t.stop()}}),t,null,[[3,13]])})));return function(){return t.apply(this,arguments)}}();return te((function(){i()}),[e]),{queryOptions:n}},Is=function(e){var t=e.value;return fr("div",{className:"vm-line-progress",children:[fr("div",{className:"vm-line-progress-track",children:fr("div",{className:"vm-line-progress-track__thumb",style:{width:"".concat(t,"%")}})}),fr("span",{children:[t.toFixed(2),"%"]})]})},$s=function e(t){var n,r=t.trace,i=t.totalMsec,o=_t(X({}),2),a=o[0],u=o[1],l=r.children&&!!r.children.length,c=r.duration/i*100;return fr("div",{className:"vm-nested-nav",children:[fr("div",{className:"vm-nested-nav-header",onClick:(n=r.idValue,function(){u((function(e){return Kn(Kn({},e),{},qn({},n,!e[n]))}))}),children:[l&&fr("div",{className:Bi()({"vm-nested-nav-header__icon":!0,"vm-nested-nav-header__icon_open":a[r.idValue]}),children:fr(pi,{})}),fr("div",{className:"vm-nested-nav-header__progress",children:fr(Is,{value:c})}),fr("div",{className:"vm-nested-nav-header__message",children:r.message}),fr("div",{className:"vm-nested-nav-header__duration",children:"duration: ".concat(r.duration," ms")})]}),a[r.idValue]&&fr("div",{children:l&&r.children.map((function(t){return fr(e,{trace:t,totalMsec:i},t.duration)}))})]})},Rs=function(e){var t=e.editable,n=void 0!==t&&t,r=e.defaultTile,i=void 0===r?"JSON":r,o=e.displayTitle,a=void 0===o||o,u=e.defaultJson,l=void 0===u?"":u,s=e.resetValue,f=void 0===s?"":s,d=e.onClose,h=e.onUpload,p=so().showInfoMessage,v=_t(X(l),2),m=v[0],y=v[1],g=_t(X(i),2),_=g[0],b=g[1],D=_t(X(""),2),w=D[0],x=D[1],k=_t(X(""),2),C=k[0],E=k[1],S=oe((function(){try{var e=JSON.parse(m),t=e.trace||e;return t.duration_msec?(new Fs(t,""),""):Co.traceNotFound}catch(c){return c instanceof Error?c.message:"Unknown error"}}),[m]),A=function(){var e=os(rs().mark((function e(){return rs().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,navigator.clipboard.writeText(m);case 2:p({text:"Formatted JSON has been copied",type:"success"});case 3:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}(),F=function(){E(S),_.trim()||x(Co.emptyTitle),S||w||(h(m,_),d())};return fr("div",{className:Bi()({"vm-json-form":!0,"vm-json-form_one-field":!a}),children:[a&&fr(To,{value:_,label:"Title",error:w,onEnter:F,onChange:function(e){b(e)}}),fr(To,{value:m,label:"JSON",type:"textarea",error:C,autofocus:!0,onChange:function(e){E(""),y(e)},disabled:!n}),fr("div",{className:"vm-json-form-footer",children:[fr("div",{className:"vm-json-form-footer__controls",children:[fr(ho,{variant:"outlined",startIcon:fr(Ni,{}),onClick:A,children:"Copy JSON"}),f&&fr(ho,{variant:"text",startIcon:fr(ui,{}),onClick:function(){y(f)},children:"Reset JSON"})]}),fr("div",{className:"vm-json-form-footer__controls vm-json-form-footer__controls_right",children:[fr(ho,{variant:"outlined",color:"error",onClick:d,children:"Cancel"}),fr(ho,{variant:"contained",onClick:F,children:"apply"})]})]})]})},js=function(e){var t=e.traces,n=e.jsonEditor,r=void 0!==n&&n,i=e.onDeleteClick,o=_t(X(null),2),a=o[0],u=o[1],l=function(){u(null)};if(!t.length)return fr(lo,{variant:"info",children:"Please re-run the query to see results of the tracing"});var s=function(e){return function(){i(e)}};return fr(m,{children:[fr("div",{className:"vm-tracings-view",children:t.map((function(e){return fr("div",{className:"vm-tracings-view-trace vm-block vm-block_empty-padding",children:[fr("div",{className:"vm-tracings-view-trace-header",children:[fr("h3",{className:"vm-tracings-view-trace-header-title",children:["Trace for ",fr("b",{className:"vm-tracings-view-trace-header-title__query",children:e.queryValue})]}),fr(mo,{title:"Open JSON",children:fr(ho,{variant:"text",startIcon:fr(ki,{}),onClick:(t=e,function(){u(t)})})}),fr(mo,{title:"Remove trace",children:fr(ho,{variant:"text",color:"error",startIcon:fr(Ci,{}),onClick:s(e)})})]}),fr("nav",{className:"vm-tracings-view-trace__nav",children:fr($s,{trace:e,totalMsec:e.duration})})]},e.idValue);var t}))}),a&&fr(Lo,{title:a.queryValue,onClose:l,children:fr(Rs,{editable:r,displayTitle:r,defaultTile:a.queryValue,defaultJson:a.JSON,resetValue:a.originalJSON,onClose:l,onUpload:function(e,t){if(r&&a)try{a.setTracing(JSON.parse(e)),a.setQuery(t),u(null)}catch(c){console.error(c)}}})})]})},zs=function(e,t){return oe((function(){var n={};e.forEach((function(e){return Object.entries(e.metric).forEach((function(e){return n[e[0]]?n[e[0]].options.add(e[1]):n[e[0]]={options:new Set([e[1]])}}))}));var r=Object.entries(n).map((function(e){return{key:e[0],variations:e[1].options.size}})).sort((function(e,t){return e.variations-t.variations}));return t?r.filter((function(e){return t.includes(e.key)})):r}),[e,t])},Us=function(e){var t,n=e.checked,r=void 0!==n&&n,i=e.disabled,o=void 0!==i&&i,a=e.label,u=e.color,l=void 0===u?"secondary":u,c=e.onChange;return fr("div",{className:Bi()((qn(t={"vm-checkbox":!0,"vm-checkbox_disabled":o,"vm-checkbox_active":r},"vm-checkbox_".concat(l,"_active"),r),qn(t,"vm-checkbox_".concat(l),l),t)),onClick:function(){o||c(!r)},children:[fr("div",{className:"vm-checkbox-track",children:fr("div",{className:"vm-checkbox-track__thumb",children:fr(Si,{})})}),a&&fr("span",{className:"vm-checkbox__label",children:a})]})},Hs="Table settings",Ys=function(e){var t=e.data,n=e.defaultColumns,r=void 0===n?[]:n,i=e.onChange,o=Vi().tableCompact,a=qi(),u=zs(t),l=re(null),c=_t(X(!1),2),s=c[0],f=c[1],d=oe((function(){return!u.length}),[u]),h=function(){f(!1)},p=function(e){return function(){!function(e){i(r.includes(e)?r.filter((function(t){return t!==e})):[].concat(bt(r),[e]))}(e)}};return te((function(){var e=u.map((function(e){return e.key}));(function(e,t){return e.length===t.length&&e.every((function(e,n){return e===t[n]}))})(e,r)||i(e)}),[u]),fr("div",{className:"vm-table-settings",children:[fr(mo,{title:Hs,children:fr("div",{ref:l,children:fr(ho,{variant:"text",startIcon:fr(oi,{}),onClick:function(){f((function(e){return!e}))},disabled:d})})}),fr(vo,{open:s,onClose:h,placement:"bottom-right",buttonRef:l,children:fr("div",{className:"vm-table-settings-popper",children:[fr("div",{className:"vm-popper-header",children:[fr("h3",{className:"vm-popper-header__title",children:Hs}),fr(ho,{onClick:h,startIcon:fr(ai,{}),size:"small"})]}),fr("div",{className:"vm-table-settings-popper-list",children:fr(ws,{label:"Compact view",value:o,onChange:function(){a({type:"TOGGLE_TABLE_COMPACT"})}})}),fr("div",{className:"vm-table-settings-popper-list",children:[fr("div",{className:"vm-table-settings-popper-list-header",children:[fr("h3",{className:"vm-table-settings-popper-list-header__title",children:"Display columns"}),fr(mo,{title:"Reset to default",children:fr(ho,{color:"primary",variant:"text",size:"small",onClick:function(){f(!1),i(u.map((function(e){return e.key})))},startIcon:fr(ui,{})})})]}),u.map((function(e){return fr("div",{className:"vm-table-settings-popper-list__item",children:fr(Us,{checked:r.includes(e.key),onChange:p(e.key),label:e.key,disabled:o})},e.key)}))]})]})})]})};function Vs(e){return function(e,t){return Object.fromEntries(Object.entries(e).filter(t))}(e,(function(e){return!!e[1]}))}var qs=["__name__"],Ws=function(e){var t=e.data,n=e.displayColumns,r=so().showInfoMessage,i=Vi().tableCompact,o=bo(document.body),a=re(null),u=_t(X(0),2),l=u[0],c=u[1],s=_t(X(0),2),f=s[0],d=s[1],h=_t(X(""),2),p=h[0],v=h[1],m=_t(X("asc"),2),y=m[0],g=m[1],_=i?zs([{group:0,metric:{Data:"Data"}}],["Data"]):zs(t,n),b=function(e){var t=e.__name__,n=ls(e,qs);return t||Object.keys(n).length?"".concat(t," ").concat(JSON.stringify(n)):""},D=oe((function(){var e=null===t||void 0===t?void 0:t.map((function(e){return{metadata:_.map((function(t){return i?ss(e,void 0,"=",!0):e.metric[t.key]||"-"})),value:e.value?e.value[1]:"-",copyValue:b(e.metric)}})),n="Value"===p,r=_.findIndex((function(e){return e.key===p}));return n||-1!==r?e.sort((function(e,t){var i=n?Number(e.value):e.metadata[r],o=n?Number(t.value):t.metadata[r];return("asc"===y?io)?-1:1})):e}),[_,t,p,y,i]),w=oe((function(){return D.some((function(e){return e.copyValue}))}),[D]),x=function(){var e=os(rs().mark((function e(t){return rs().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,navigator.clipboard.writeText(t);case 2:r({text:"Row has been copied",type:"success"});case 3:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}(),k=function(e){return function(){!function(e){g((function(t){return"asc"===t&&p===e?"desc":"asc"})),v(e)}(e)}},C=function(){if(a.current){var e=a.current.getBoundingClientRect().top;d(e<0?window.scrollY-l:0)}};return te((function(){return window.addEventListener("scroll",C),function(){window.removeEventListener("scroll",C)}}),[a,l,o]),te((function(){if(a.current){var e=a.current.getBoundingClientRect().top;c(e+window.scrollY)}}),[a,o]),D.length?fr("div",{className:"vm-table-view",children:fr("table",{className:"vm-table",ref:a,children:[fr("thead",{className:"vm-table-header",children:fr("tr",{className:"vm-table__row vm-table__row_header",style:{transform:"translateY(".concat(f,"px)")},children:[_.map((function(e,t){return fr("td",{className:"vm-table-cell vm-table-cell_header vm-table-cell_sort",onClick:k(e.key),children:fr("div",{className:"vm-table-cell__content",children:[e.key,fr("div",{className:Bi()({"vm-table__sort-icon":!0,"vm-table__sort-icon_active":p===e.key,"vm-table__sort-icon_desc":"desc"===y&&p===e.key}),children:fr(vi,{})})]})},t)})),fr("td",{className:"vm-table-cell vm-table-cell_header vm-table-cell_right vm-table-cell_sort",onClick:k("Value"),children:fr("div",{className:"vm-table-cell__content",children:[fr("div",{className:Bi()({"vm-table__sort-icon":!0,"vm-table__sort-icon_active":"Value"===p,"vm-table__sort-icon_desc":"desc"===y}),children:fr(vi,{})}),"Value"]})}),w&&fr("td",{className:"vm-table-cell vm-table-cell_header"})]})}),fr("tbody",{className:"vm-table-body",children:D.map((function(e,t){return fr("tr",{className:"vm-table__row",children:[e.metadata.map((function(e,n){return fr("td",{className:Bi()({"vm-table-cell vm-table-cell_no-wrap":!0,"vm-table-cell_gray":D[t-1]&&D[t-1].metadata[n]===e}),children:e},n)})),fr("td",{className:"vm-table-cell vm-table-cell_right",children:e.value}),w&&fr("td",{className:"vm-table-cell vm-table-cell_right",children:e.copyValue&&fr("div",{className:"vm-table-cell__content",children:fr(mo,{title:"Copy row",children:fr(ho,{variant:"text",color:"gray",size:"small",startIcon:fr(Ni,{}),onClick:(n=e.copyValue,function(){x(n)})})})})})]},t);var n}))})]})}):fr(lo,{variant:"warning",children:"No data to show"})},Qs=function(){var e=Vi(),t=e.displayType,n=e.isTracingEnabled,r=ni().query,i=Wr().period,o=Qr();!function(){var e=hr().tenantId,t=Vi().displayType,n=ni().query,r=Wr(),i=r.duration,o=r.relativeTime,a=r.period,u=a.date,l=a.step,c=function(){var r={};n.forEach((function(n,a){var c,s="g".concat(a);r["".concat(s,".expr")]=n,r["".concat(s,".range_input")]=i,r["".concat(s,".end_input")]=u,r["".concat(s,".step_input")]=l,r["".concat(s,".tab")]=(null===(c=Ii.find((function(e){return e.value===t})))||void 0===c?void 0:c.prometheusCode)||0,r["".concat(s,".relative_time")]=o,r["".concat(s,".tenantID")]=e})),ar(Vs(r))};te(c,[e,t,n,i,o,u,l]),te(c,[])}();var a=_t(X(),2),u=a[0],l=a[1],c=_t(X([]),2),s=c[0],f=c[1],d=_t(X([]),2),h=d[0],p=d[1],v=_t(X(!1),2),m=v[0],y=v[1],g=ue(Gi).state,_=g.customStep,b=g.yaxis,D=Ji(),w=Ps().queryOptions,x=Ns({visible:!0,customStep:_,hideQuery:h,showAllSeries:m}),k=x.isLoading,C=x.liveData,E=x.graphData,S=x.error,A=x.warning,F=x.traces,N=function(e){D({type:"SET_YAXIS_LIMITS",payload:e})};return te((function(){F&&f([].concat(bt(s),bt(F)))}),[F]),te((function(){f([])}),[t]),te((function(){y(!1)}),[r]),fr("div",{className:"vm-custom-panel",children:[fr(Cs,{error:S,queryOptions:w,onHideQuery:function(e){p(e)}}),n&&fr("div",{className:"vm-custom-panel__trace",children:fr(js,{traces:s,onDeleteClick:function(e){var t=s.filter((function(t){return t.idValue!==e.idValue}));f(bt(t))}})}),k&&fr(Ls,{}),S&&fr(lo,{variant:"error",children:S}),A&&fr(lo,{variant:"warning",children:fr("div",{className:"vm-custom-panel__warning",children:[fr("p",{children:A}),fr(ho,{color:"warning",variant:"outlined",onClick:function(){y(!0)},children:"Show all"})]})}),fr("div",{className:"vm-custom-panel-body vm-block",children:[fr("div",{className:"vm-custom-panel-body-header",children:[fr($i,{}),"chart"===t&&fr(Ms,{yaxis:b,setYaxisLimits:N,toggleEnableLimits:function(){D({type:"TOGGLE_ENABLE_YAXIS_LIMITS"})}}),"table"===t&&fr(Ys,{data:C||[],defaultColumns:u,onChange:l})]}),E&&i&&"chart"===t&&fr(vs,{data:E,period:i,customStep:_,query:r,yaxis:b,setYaxisLimits:N,setPeriod:function(e){var t=e.from,n=e.to;o({type:"SET_PERIOD",payload:{from:t,to:n}})}}),C&&"code"===t&&fr(Os,{data:C}),C&&"table"===t&&fr(Ws,{data:C,displayColumns:u})]})]})},Gs=function(){var e=os(rs().mark((function e(t){var n,r;return rs().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,fetch("./dashboards/".concat(t));case 2:return n=e.sent,e.next=5,n.json();case 5:return r=e.sent,e.abrupt("return",r);case 7:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}(),Js=os(rs().mark((function e(){var t;return rs().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=window.__VMUI_PREDEFINED_DASHBOARDS__,e.next=3,Promise.all(t.map(function(){var e=os(rs().mark((function e(t){return rs().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",Gs(t));case 1:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}()));case 3:return e.abrupt("return",e.sent);case 4:case"end":return e.stop()}}),e)})));function Zs(){return{async:!1,baseUrl:null,breaks:!1,extensions:null,gfm:!0,headerIds:!0,headerPrefix:"",highlight:null,langPrefix:"language-",mangle:!0,pedantic:!1,renderer:null,sanitize:!1,sanitizer:null,silent:!1,smartypants:!1,tokenizer:null,walkTokens:null,xhtml:!1}}var Ks={async:!1,baseUrl:null,breaks:!1,extensions:null,gfm:!0,headerIds:!0,headerPrefix:"",highlight:null,langPrefix:"language-",mangle:!0,pedantic:!1,renderer:null,sanitize:!1,sanitizer:null,silent:!1,smartypants:!1,tokenizer:null,walkTokens:null,xhtml:!1};var Xs=/[&<>"']/,ef=/[&<>"']/g,tf=/[<>"']|&(?!#?\w+;)/,nf=/[<>"']|&(?!#?\w+;)/g,rf={"&":"&","<":"<",">":">",'"':""","'":"'"},of=function(e){return rf[e]};function af(e,t){if(t){if(Xs.test(e))return e.replace(ef,of)}else if(tf.test(e))return e.replace(nf,of);return e}var uf=/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/gi;function lf(e){return e.replace(uf,(function(e,t){return"colon"===(t=t.toLowerCase())?":":"#"===t.charAt(0)?"x"===t.charAt(1)?String.fromCharCode(parseInt(t.substring(2),16)):String.fromCharCode(+t.substring(1)):""}))}var cf=/(^|[^\[])\^/g;function sf(e,t){e="string"===typeof e?e:e.source,t=t||"";var n={replace:function(t,r){return r=(r=r.source||r).replace(cf,"$1"),e=e.replace(t,r),n},getRegex:function(){return new RegExp(e,t)}};return n}var ff=/[^\w:]/g,df=/^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;function hf(e,t,n){if(e){var r;try{r=decodeURIComponent(lf(n)).replace(ff,"").toLowerCase()}catch(c){return null}if(0===r.indexOf("javascript:")||0===r.indexOf("vbscript:")||0===r.indexOf("data:"))return null}t&&!df.test(n)&&(n=function(e,t){pf[" "+e]||(vf.test(e)?pf[" "+e]=e+"/":pf[" "+e]=Df(e,"/",!0));var n=-1===(e=pf[" "+e]).indexOf(":");return"//"===t.substring(0,2)?n?t:e.replace(mf,"$1")+t:"/"===t.charAt(0)?n?t:e.replace(yf,"$1")+t:e+t}(t,n));try{n=encodeURI(n).replace(/%25/g,"%")}catch(c){return null}return n}var pf={},vf=/^[^:]+:\/*[^/]*$/,mf=/^([^:]+:)[\s\S]*$/,yf=/^([^:]+:\/*[^/]*)[\s\S]*$/;var gf={exec:function(){}};function _f(e){for(var t,n,r=1;r=0&&"\\"===n[i];)r=!r;return r?"|":" |"})).split(/ \|/),r=0;if(n[0].trim()||n.shift(),n.length>0&&!n[n.length-1].trim()&&n.pop(),n.length>t)n.splice(t);else for(;n.length1;)1&t&&(n+=e),t>>=1,e+=e;return n+e}function kf(e,t,n,r){var i=t.href,o=t.title?af(t.title):null,a=e[1].replace(/\\([\[\]])/g,"$1");if("!"!==e[0].charAt(0)){r.state.inLink=!0;var u={type:"link",raw:n,href:i,title:o,text:a,tokens:r.inlineTokens(a)};return r.state.inLink=!1,u}return{type:"image",raw:n,href:i,title:o,text:af(a)}}var Cf=function(){function e(t){Dt(this,e),this.options=t||Ks}return xt(e,[{key:"space",value:function(e){var t=this.rules.block.newline.exec(e);if(t&&t[0].length>0)return{type:"space",raw:t[0]}}},{key:"code",value:function(e){var t=this.rules.block.code.exec(e);if(t){var n=t[0].replace(/^ {1,4}/gm,"");return{type:"code",raw:t[0],codeBlockStyle:"indented",text:this.options.pedantic?n:Df(n,"\n")}}}},{key:"fences",value:function(e){var t=this.rules.block.fences.exec(e);if(t){var n=t[0],r=function(e,t){var n=e.match(/^(\s+)(?:```)/);if(null===n)return t;var r=n[1];return t.split("\n").map((function(e){var t=e.match(/^\s+/);return null===t?e:_t(t,1)[0].length>=r.length?e.slice(r.length):e})).join("\n")}(n,t[3]||"");return{type:"code",raw:n,lang:t[2]?t[2].trim().replace(this.rules.inline._escapes,"$1"):t[2],text:r}}}},{key:"heading",value:function(e){var t=this.rules.block.heading.exec(e);if(t){var n=t[2].trim();if(/#$/.test(n)){var r=Df(n,"#");this.options.pedantic?n=r.trim():r&&!/ $/.test(r)||(n=r.trim())}return{type:"heading",raw:t[0],depth:t[1].length,text:n,tokens:this.lexer.inline(n)}}}},{key:"hr",value:function(e){var t=this.rules.block.hr.exec(e);if(t)return{type:"hr",raw:t[0]}}},{key:"blockquote",value:function(e){var t=this.rules.block.blockquote.exec(e);if(t){var n=t[0].replace(/^ *>[ \t]?/gm,"");return{type:"blockquote",raw:t[0],tokens:this.lexer.blockTokens(n,[]),text:n}}}},{key:"list",value:function(e){var t=this.rules.block.list.exec(e);if(t){var n,r,i,o,a,u,l,c,s,f,d,h,p=t[1].trim(),v=p.length>1,m={type:"list",raw:"",ordered:v,start:v?+p.slice(0,-1):"",loose:!1,items:[]};p=v?"\\d{1,9}\\".concat(p.slice(-1)):"\\".concat(p),this.options.pedantic&&(p=v?p:"[*+-]");for(var y=new RegExp("^( {0,3}".concat(p,")((?:[\t ][^\\n]*)?(?:\\n|$))"));e&&(h=!1,t=y.exec(e))&&!this.rules.block.hr.test(e);){if(n=t[0],e=e.substring(n.length),c=t[2].split("\n",1)[0],s=e.split("\n",1)[0],this.options.pedantic?(o=2,d=c.trimLeft()):(o=(o=t[2].search(/[^ ]/))>4?1:o,d=c.slice(o),o+=t[1].length),u=!1,!c&&/^ *$/.test(s)&&(n+=s+"\n",e=e.substring(s.length+1),h=!0),!h)for(var g=new RegExp("^ {0,".concat(Math.min(3,o-1),"}(?:[*+-]|\\d{1,9}[.)])((?: [^\\n]*)?(?:\\n|$))")),_=new RegExp("^ {0,".concat(Math.min(3,o-1),"}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)")),b=new RegExp("^ {0,".concat(Math.min(3,o-1),"}(?:```|~~~)")),D=new RegExp("^ {0,".concat(Math.min(3,o-1),"}#"));e&&(c=f=e.split("\n",1)[0],this.options.pedantic&&(c=c.replace(/^ {1,4}(?=( {4})*[^ ])/g," ")),!b.test(c))&&!D.test(c)&&!g.test(c)&&!_.test(e);){if(c.search(/[^ ]/)>=o||!c.trim())d+="\n"+c.slice(o);else{if(u)break;d+="\n"+c}u||c.trim()||(u=!0),n+=f+"\n",e=e.substring(f.length+1)}m.loose||(l?m.loose=!0:/\n *\n *$/.test(n)&&(l=!0)),this.options.gfm&&(r=/^\[[ xX]\] /.exec(d))&&(i="[ ] "!==r[0],d=d.replace(/^\[[ xX]\] +/,"")),m.items.push({type:"list_item",raw:n,task:!!r,checked:i,loose:!1,text:d}),m.raw+=n}m.items[m.items.length-1].raw=n.trimRight(),m.items[m.items.length-1].text=d.trimRight(),m.raw=m.raw.trimRight();var w=m.items.length;for(a=0;a1)return!0}}catch(i){r.e(i)}finally{r.f()}return!1}));!m.loose&&x.length&&k&&(m.loose=!0,m.items[a].loose=!0)}return m}}},{key:"html",value:function(e){var t=this.rules.block.html.exec(e);if(t){var n={type:"html",raw:t[0],pre:!this.options.sanitizer&&("pre"===t[1]||"script"===t[1]||"style"===t[1]),text:t[0]};if(this.options.sanitize){var r=this.options.sanitizer?this.options.sanitizer(t[0]):af(t[0]);n.type="paragraph",n.text=r,n.tokens=this.lexer.inline(r)}return n}}},{key:"def",value:function(e){var t=this.rules.block.def.exec(e);if(t)return t[3]&&(t[3]=t[3].substring(1,t[3].length-1)),{type:"def",tag:t[1].toLowerCase().replace(/\s+/g," "),raw:t[0],href:t[2]?t[2].replace(this.rules.inline._escapes,"$1"):t[2],title:t[3]?t[3].replace(this.rules.inline._escapes,"$1"):t[3]}}},{key:"table",value:function(e){var t=this.rules.block.table.exec(e);if(t){var n={type:"table",header:bf(t[1]).map((function(e){return{text:e}})),align:t[2].replace(/^ *|\| *$/g,"").split(/ *\| */),rows:t[3]&&t[3].trim()?t[3].replace(/\n[ \t]*$/,"").split("\n"):[]};if(n.header.length===n.align.length){n.raw=t[0];var r,i,o,a,u=n.align.length;for(r=0;r/i.test(t[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&/^<(pre|code|kbd|script)(\s|>)/i.test(t[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&/^<\/(pre|code|kbd|script)(\s|>)/i.test(t[0])&&(this.lexer.state.inRawBlock=!1),{type:this.options.sanitize?"text":"html",raw:t[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,text:this.options.sanitize?this.options.sanitizer?this.options.sanitizer(t[0]):af(t[0]):t[0]}}},{key:"link",value:function(e){var t=this.rules.inline.link.exec(e);if(t){var n=t[2].trim();if(!this.options.pedantic&&/^$/.test(n))return;var r=Df(n.slice(0,-1),"\\");if((n.length-r.length)%2===0)return}else{var i=function(e,t){if(-1===e.indexOf(t[1]))return-1;for(var n=e.length,r=0,i=0;i-1){var o=(0===t[0].indexOf("!")?5:4)+t[1].length+i;t[2]=t[2].substring(0,i),t[0]=t[0].substring(0,o).trim(),t[3]=""}}var a=t[2],u="";if(this.options.pedantic){var l=/^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(a);l&&(a=l[1],u=l[3])}else u=t[3]?t[3].slice(1,-1):"";return a=a.trim(),/^$/.test(n)?a.slice(1):a.slice(1,-1)),kf(t,{href:a?a.replace(this.rules.inline._escapes,"$1"):a,title:u?u.replace(this.rules.inline._escapes,"$1"):u},t[0],this.lexer)}}},{key:"reflink",value:function(e,t){var n;if((n=this.rules.inline.reflink.exec(e))||(n=this.rules.inline.nolink.exec(e))){var r=(n[2]||n[1]).replace(/\s+/g," ");if(!(r=t[r.toLowerCase()])||!r.href){var i=n[0].charAt(0);return{type:"text",raw:i,text:i}}return kf(n,r,n[0],this.lexer)}}},{key:"emStrong",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"",r=this.rules.inline.emStrong.lDelim.exec(e);if(r&&(!r[3]||!n.match(/(?:[0-9A-Za-z\xAA\xB2\xB3\xB5\xB9\xBA\xBC-\xBE\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u05D0-\u05EA\u05EF-\u05F2\u0620-\u064A\u0660-\u0669\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07C0-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u0870-\u0887\u0889-\u088E\u08A0-\u08C9\u0904-\u0939\u093D\u0950\u0958-\u0961\u0966-\u096F\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09E6-\u09F1\u09F4-\u09F9\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A66-\u0A6F\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AE6-\u0AEF\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B66-\u0B6F\u0B71-\u0B77\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0BE6-\u0BF2\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C5D\u0C60\u0C61\u0C66-\u0C6F\u0C78-\u0C7E\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDD\u0CDE\u0CE0\u0CE1\u0CE6-\u0CEF\u0CF1\u0CF2\u0D04-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D58-\u0D61\u0D66-\u0D78\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DE6-\u0DEF\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F20-\u0F33\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F-\u1049\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u1090-\u1099\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1369-\u137C\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u1711\u171F-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u17E0-\u17E9\u17F0-\u17F9\u1810-\u1819\u1820-\u1878\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A16\u1A20-\u1A54\u1A80-\u1A89\u1A90-\u1A99\u1AA7\u1B05-\u1B33\u1B45-\u1B4C\u1B50-\u1B59\u1B83-\u1BA0\u1BAE-\u1BE5\u1C00-\u1C23\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2070\u2071\u2074-\u2079\u207F-\u2089\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2150-\u2189\u2460-\u249B\u24EA-\u24FF\u2776-\u2793\u2C00-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2CFD\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u3192-\u3195\u31A0-\u31BF\u31F0-\u31FF\u3220-\u3229\u3248-\u324F\u3251-\u325F\u3280-\u3289\u32B1-\u32BF\u3400-\u4DBF\u4E00-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7CA\uA7D0\uA7D1\uA7D3\uA7D5-\uA7D9\uA7F2-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA830-\uA835\uA840-\uA873\uA882-\uA8B3\uA8D0-\uA8D9\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA900-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF-\uA9D9\uA9E0-\uA9E4\uA9E6-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA50-\uAA59\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABE2\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD07-\uDD33\uDD40-\uDD78\uDD8A\uDD8B\uDE80-\uDE9C\uDEA0-\uDED0\uDEE1-\uDEFB\uDF00-\uDF23\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDD70-\uDD7A\uDD7C-\uDD8A\uDD8C-\uDD92\uDD94\uDD95\uDD97-\uDDA1\uDDA3-\uDDB1\uDDB3-\uDDB9\uDDBB\uDDBC\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67\uDF80-\uDF85\uDF87-\uDFB0\uDFB2-\uDFBA]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC58-\uDC76\uDC79-\uDC9E\uDCA7-\uDCAF\uDCE0-\uDCF2\uDCF4\uDCF5\uDCFB-\uDD1B\uDD20-\uDD39\uDD80-\uDDB7\uDDBC-\uDDCF\uDDD2-\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE40-\uDE48\uDE60-\uDE7E\uDE80-\uDE9F\uDEC0-\uDEC7\uDEC9-\uDEE4\uDEEB-\uDEEF\uDF00-\uDF35\uDF40-\uDF55\uDF58-\uDF72\uDF78-\uDF91\uDFA9-\uDFAF]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDCFA-\uDD23\uDD30-\uDD39\uDE60-\uDE7E\uDE80-\uDEA9\uDEB0\uDEB1\uDF00-\uDF27\uDF30-\uDF45\uDF51-\uDF54\uDF70-\uDF81\uDFB0-\uDFCB\uDFE0-\uDFF6]|\uD804[\uDC03-\uDC37\uDC52-\uDC6F\uDC71\uDC72\uDC75\uDC83-\uDCAF\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD03-\uDD26\uDD36-\uDD3F\uDD44\uDD47\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDD0-\uDDDA\uDDDC\uDDE1-\uDDF4\uDE00-\uDE11\uDE13-\uDE2B\uDE3F\uDE40\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDEF0-\uDEF9\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC50-\uDC59\uDC5F-\uDC61\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE50-\uDE59\uDE80-\uDEAA\uDEB8\uDEC0-\uDEC9\uDF00-\uDF1A\uDF30-\uDF3B\uDF40-\uDF46]|\uD806[\uDC00-\uDC2B\uDCA0-\uDCF2\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD2F\uDD3F\uDD41\uDD50-\uDD59\uDDA0-\uDDA7\uDDAA-\uDDD0\uDDE1\uDDE3\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE89\uDE9D\uDEB0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC50-\uDC6C\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46\uDD50-\uDD59\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD89\uDD98\uDDA0-\uDDA9\uDEE0-\uDEF2\uDF02\uDF04-\uDF10\uDF12-\uDF33\uDF50-\uDF59\uDFB0\uDFC0-\uDFD4]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|\uD80B[\uDF90-\uDFF0]|[\uD80C\uD81C-\uD820\uD822\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879\uD880-\uD883\uD885-\uD887][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2F\uDC41-\uDC46]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDE70-\uDEBE\uDEC0-\uDEC9\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF50-\uDF59\uDF5B-\uDF61\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDE40-\uDE96\uDF00-\uDF4A\uDF50\uDF93-\uDF9F\uDFE0\uDFE1\uDFE3]|\uD821[\uDC00-\uDFF7]|\uD823[\uDC00-\uDCD5\uDD00-\uDD08]|\uD82B[\uDFF0-\uDFF3\uDFF5-\uDFFB\uDFFD\uDFFE]|\uD82C[\uDC00-\uDD22\uDD32\uDD50-\uDD52\uDD55\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD834[\uDEC0-\uDED3\uDEE0-\uDEF3\uDF60-\uDF78]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD837[\uDF00-\uDF1E\uDF25-\uDF2A]|\uD838[\uDC30-\uDC6D\uDD00-\uDD2C\uDD37-\uDD3D\uDD40-\uDD49\uDD4E\uDE90-\uDEAD\uDEC0-\uDEEB\uDEF0-\uDEF9]|\uD839[\uDCD0-\uDCEB\uDCF0-\uDCF9\uDFE0-\uDFE6\uDFE8-\uDFEB\uDFED\uDFEE\uDFF0-\uDFFE]|\uD83A[\uDC00-\uDCC4\uDCC7-\uDCCF\uDD00-\uDD43\uDD4B\uDD50-\uDD59]|\uD83B[\uDC71-\uDCAB\uDCAD-\uDCAF\uDCB1-\uDCB4\uDD01-\uDD2D\uDD2F-\uDD3D\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD83C[\uDD00-\uDD0C]|\uD83E[\uDFF0-\uDFF9]|\uD869[\uDC00-\uDEDF\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF39\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A\uDF50-\uDFFF]|\uD888[\uDC00-\uDFAF])/))){var i=r[1]||r[2]||"";if(!i||i&&(""===n||this.rules.inline.punctuation.exec(n))){var o,a,u=r[0].length-1,l=u,c=0,s="*"===r[0][0]?this.rules.inline.emStrong.rDelimAst:this.rules.inline.emStrong.rDelimUnd;for(s.lastIndex=0,t=t.slice(-1*e.length+u);null!=(r=s.exec(t));)if(o=r[1]||r[2]||r[3]||r[4]||r[5]||r[6])if(a=o.length,r[3]||r[4])l+=a;else if(!((r[5]||r[6])&&u%3)||(u+a)%3){if(!((l-=a)>0)){a=Math.min(a,a+l+c);var f=e.slice(0,u+r.index+(r[0].length-o.length)+a);if(Math.min(u,a)%2){var d=f.slice(1,-1);return{type:"em",raw:f,text:d,tokens:this.lexer.inlineTokens(d)}}var h=f.slice(2,-2);return{type:"strong",raw:f,text:h,tokens:this.lexer.inlineTokens(h)}}}else c+=a}}}},{key:"codespan",value:function(e){var t=this.rules.inline.code.exec(e);if(t){var n=t[2].replace(/\n/g," "),r=/[^ ]/.test(n),i=/^ /.test(n)&&/ $/.test(n);return r&&i&&(n=n.substring(1,n.length-1)),n=af(n,!0),{type:"codespan",raw:t[0],text:n}}}},{key:"br",value:function(e){var t=this.rules.inline.br.exec(e);if(t)return{type:"br",raw:t[0]}}},{key:"del",value:function(e){var t=this.rules.inline.del.exec(e);if(t)return{type:"del",raw:t[0],text:t[2],tokens:this.lexer.inlineTokens(t[2])}}},{key:"autolink",value:function(e,t){var n,r,i=this.rules.inline.autolink.exec(e);if(i)return r="@"===i[2]?"mailto:"+(n=af(this.options.mangle?t(i[1]):i[1])):n=af(i[1]),{type:"link",raw:i[0],text:n,href:r,tokens:[{type:"text",raw:n,text:n}]}}},{key:"url",value:function(e,t){var n;if(n=this.rules.inline.url.exec(e)){var r,i;if("@"===n[2])i="mailto:"+(r=af(this.options.mangle?t(n[0]):n[0]));else{var o;do{o=n[0],n[0]=this.rules.inline._backpedal.exec(n[0])[0]}while(o!==n[0]);r=af(n[0]),i="www."===n[1]?"http://"+r:r}return{type:"link",raw:n[0],text:r,href:i,tokens:[{type:"text",raw:r,text:r}]}}}},{key:"inlineText",value:function(e,t){var n,r=this.rules.inline.text.exec(e);if(r)return n=this.lexer.state.inRawBlock?this.options.sanitize?this.options.sanitizer?this.options.sanitizer(r[0]):af(r[0]):r[0]:af(this.options.smartypants?t(r[0]):r[0]),{type:"text",raw:r[0],text:n}}}]),e}(),Ef={newline:/^(?: *(?:\n|$))+/,code:/^( {4}[^\n]+(?:\n(?: *(?:\n|$))*)?)+/,fences:/^ {0,3}(`{3,}(?=[^`\n]*\n)|~{3,})([^\n]*)\n(?:|([\s\S]*?)\n)(?: {0,3}\1[~`]* *(?=\n|$)|$)/,hr:/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,heading:/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,blockquote:/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,list:/^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/,html:"^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:\\1>[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:(?:\\n *)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$)|(?!script|pre|style|textarea)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$))",def:/^ {0,3}\[(label)\]: *(?:\n *)?([^\s>]+)>?(?:(?: +(?:\n *)?| *\n *)(title))? *(?:\n+|$)/,table:gf,lheading:/^([^\n]+)\n {0,3}(=+|-+) *(?:\n+|$)/,_paragraph:/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,text:/^[^\n]+/,_label:/(?!\s*\])(?:\\.|[^\[\]\\])+/,_title:/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/};Ef.def=sf(Ef.def).replace("label",Ef._label).replace("title",Ef._title).getRegex(),Ef.bullet=/(?:[*+-]|\d{1,9}[.)])/,Ef.listItemStart=sf(/^( *)(bull) */).replace("bull",Ef.bullet).getRegex(),Ef.list=sf(Ef.list).replace(/bull/g,Ef.bullet).replace("hr","\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))").replace("def","\\n+(?="+Ef.def.source+")").getRegex(),Ef._tag="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",Ef._comment=/|$)/,Ef.html=sf(Ef.html,"i").replace("comment",Ef._comment).replace("tag",Ef._tag).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),Ef.paragraph=sf(Ef._paragraph).replace("hr",Ef.hr).replace("heading"," {0,3}#{1,6} ").replace("|lheading","").replace("|table","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html","?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",Ef._tag).getRegex(),Ef.blockquote=sf(Ef.blockquote).replace("paragraph",Ef.paragraph).getRegex(),Ef.normal=_f({},Ef),Ef.gfm=_f({},Ef.normal,{table:"^ *([^\\n ].*\\|.*)\\n {0,3}(?:\\| *)?(:?-+:? *(?:\\| *:?-+:? *)*)(?:\\| *)?(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)"}),Ef.gfm.table=sf(Ef.gfm.table).replace("hr",Ef.hr).replace("heading"," {0,3}#{1,6} ").replace("blockquote"," {0,3}>").replace("code"," {4}[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html","?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",Ef._tag).getRegex(),Ef.gfm.paragraph=sf(Ef._paragraph).replace("hr",Ef.hr).replace("heading"," {0,3}#{1,6} ").replace("|lheading","").replace("table",Ef.gfm.table).replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html","?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",Ef._tag).getRegex(),Ef.pedantic=_f({},Ef.normal,{html:sf("^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+?\\1> *(?:\\n{2,}|\\s*$)| \\s]*)*?/?> *(?:\\n{2,}|\\s*$))").replace("comment",Ef._comment).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:gf,paragraph:sf(Ef.normal._paragraph).replace("hr",Ef.hr).replace("heading"," *#{1,6} *[^\n]").replace("lheading",Ef.lheading).replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").getRegex()});var Sf={escape:/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,autolink:/^<(scheme:[^\s\x00-\x1f<>]*|email)>/,url:gf,tag:"^comment|^[a-zA-Z][\\w:-]*\\s*>|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^",link:/^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/,reflink:/^!?\[(label)\]\[(ref)\]/,nolink:/^!?\[(ref)\](?:\[\])?/,reflinkSearch:"reflink|nolink(?!\\()",emStrong:{lDelim:/^(?:\*+(?:([punct_])|[^\s*]))|^_+(?:([punct*])|([^\s_]))/,rDelimAst:/^(?:[^_*\\]|\\.)*?\_\_(?:[^_*\\]|\\.)*?\*(?:[^_*\\]|\\.)*?(?=\_\_)|(?:[^*\\]|\\.)+(?=[^*])|[punct_](\*+)(?=[\s]|$)|(?:[^punct*_\s\\]|\\.)(\*+)(?=[punct_\s]|$)|[punct_\s](\*+)(?=[^punct*_\s])|[\s](\*+)(?=[punct_])|[punct_](\*+)(?=[punct_])|(?:[^punct*_\s\\]|\\.)(\*+)(?=[^punct*_\s])/,rDelimUnd:/^(?:[^_*\\]|\\.)*?\*\*(?:[^_*\\]|\\.)*?\_(?:[^_*\\]|\\.)*?(?=\*\*)|(?:[^_\\]|\\.)+(?=[^_])|[punct*](\_+)(?=[\s]|$)|(?:[^punct*_\s\\]|\\.)(\_+)(?=[punct*\s]|$)|[punct*\s](\_+)(?=[^punct*_\s])|[\s](\_+)(?=[punct*])|[punct*](\_+)(?=[punct*])/},code:/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,br:/^( {2,}|\\)\n(?!\s*$)/,del:gf,text:/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\.5&&(n="x"+n.toString(16)),r+=""+n+";";return r}Sf._punctuation="!\"#$%&'()+\\-.,/:;<=>?@\\[\\]`^{|}~",Sf.punctuation=sf(Sf.punctuation).replace(/punctuation/g,Sf._punctuation).getRegex(),Sf.blockSkip=/\[[^\]]*?\]\([^\)]*?\)|`[^`]*?`|<[^>]*?>/g,Sf.escapedEmSt=/(?:^|[^\\])(?:\\\\)*\\[*_]/g,Sf._comment=sf(Ef._comment).replace("(?:--\x3e|$)","--\x3e").getRegex(),Sf.emStrong.lDelim=sf(Sf.emStrong.lDelim).replace(/punct/g,Sf._punctuation).getRegex(),Sf.emStrong.rDelimAst=sf(Sf.emStrong.rDelimAst,"g").replace(/punct/g,Sf._punctuation).getRegex(),Sf.emStrong.rDelimUnd=sf(Sf.emStrong.rDelimUnd,"g").replace(/punct/g,Sf._punctuation).getRegex(),Sf._escapes=/\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g,Sf._scheme=/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/,Sf._email=/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/,Sf.autolink=sf(Sf.autolink).replace("scheme",Sf._scheme).replace("email",Sf._email).getRegex(),Sf._attribute=/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/,Sf.tag=sf(Sf.tag).replace("comment",Sf._comment).replace("attribute",Sf._attribute).getRegex(),Sf._label=/(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/,Sf._href=/<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/,Sf._title=/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/,Sf.link=sf(Sf.link).replace("label",Sf._label).replace("href",Sf._href).replace("title",Sf._title).getRegex(),Sf.reflink=sf(Sf.reflink).replace("label",Sf._label).replace("ref",Ef._label).getRegex(),Sf.nolink=sf(Sf.nolink).replace("ref",Ef._label).getRegex(),Sf.reflinkSearch=sf(Sf.reflinkSearch,"g").replace("reflink",Sf.reflink).replace("nolink",Sf.nolink).getRegex(),Sf.normal=_f({},Sf),Sf.pedantic=_f({},Sf.normal,{strong:{start:/^__|\*\*/,middle:/^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,endAst:/\*\*(?!\*)/g,endUnd:/__(?!_)/g},em:{start:/^_|\*/,middle:/^()\*(?=\S)([\s\S]*?\S)\*(?!\*)|^_(?=\S)([\s\S]*?\S)_(?!_)/,endAst:/\*(?!\*)/g,endUnd:/_(?!_)/g},link:sf(/^!?\[(label)\]\((.*?)\)/).replace("label",Sf._label).getRegex(),reflink:sf(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",Sf._label).getRegex()}),Sf.gfm=_f({},Sf.normal,{escape:sf(Sf.escape).replace("])","~|])").getRegex(),_extended_email:/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,url:/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,_backpedal:/(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])([\s\S]*?[^\s~])\1(?=[^~]|$)/,text:/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\1&&void 0!==arguments[1]?arguments[1]:[];for(e=this.options.pedantic?e.replace(/\t/g," ").replace(/^ +$/gm,""):e.replace(/^( *)(\t+)/gm,(function(e,t,n){return t+" ".repeat(n.length)}));e;)if(!(this.options.extensions&&this.options.extensions.block&&this.options.extensions.block.some((function(n){return!!(t=n.call({lexer:o},e,a))&&(e=e.substring(t.raw.length),a.push(t),!0)}))))if(t=this.tokenizer.space(e))e=e.substring(t.raw.length),1===t.raw.length&&a.length>0?a[a.length-1].raw+="\n":a.push(t);else if(t=this.tokenizer.code(e))e=e.substring(t.raw.length),!(n=a[a.length-1])||"paragraph"!==n.type&&"text"!==n.type?a.push(t):(n.raw+="\n"+t.raw,n.text+="\n"+t.text,this.inlineQueue[this.inlineQueue.length-1].src=n.text);else if(t=this.tokenizer.fences(e))e=e.substring(t.raw.length),a.push(t);else if(t=this.tokenizer.heading(e))e=e.substring(t.raw.length),a.push(t);else if(t=this.tokenizer.hr(e))e=e.substring(t.raw.length),a.push(t);else if(t=this.tokenizer.blockquote(e))e=e.substring(t.raw.length),a.push(t);else if(t=this.tokenizer.list(e))e=e.substring(t.raw.length),a.push(t);else if(t=this.tokenizer.html(e))e=e.substring(t.raw.length),a.push(t);else if(t=this.tokenizer.def(e))e=e.substring(t.raw.length),!(n=a[a.length-1])||"paragraph"!==n.type&&"text"!==n.type?this.tokens.links[t.tag]||(this.tokens.links[t.tag]={href:t.href,title:t.title}):(n.raw+="\n"+t.raw,n.text+="\n"+t.raw,this.inlineQueue[this.inlineQueue.length-1].src=n.text);else if(t=this.tokenizer.table(e))e=e.substring(t.raw.length),a.push(t);else if(t=this.tokenizer.lheading(e))e=e.substring(t.raw.length),a.push(t);else if(r=e,this.options.extensions&&this.options.extensions.startBlock&&function(){var t=1/0,n=e.slice(1),i=void 0;o.options.extensions.startBlock.forEach((function(e){"number"===typeof(i=e.call({lexer:this},n))&&i>=0&&(t=Math.min(t,i))})),t<1/0&&t>=0&&(r=e.substring(0,t+1))}(),this.state.top&&(t=this.tokenizer.paragraph(r)))n=a[a.length-1],i&&"paragraph"===n.type?(n.raw+="\n"+t.raw,n.text+="\n"+t.text,this.inlineQueue.pop(),this.inlineQueue[this.inlineQueue.length-1].src=n.text):a.push(t),i=r.length!==e.length,e=e.substring(t.raw.length);else if(t=this.tokenizer.text(e))e=e.substring(t.raw.length),(n=a[a.length-1])&&"text"===n.type?(n.raw+="\n"+t.raw,n.text+="\n"+t.text,this.inlineQueue.pop(),this.inlineQueue[this.inlineQueue.length-1].src=n.text):a.push(t);else if(e){var u="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(u);break}throw new Error(u)}return this.state.top=!0,a}},{key:"inline",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];return this.inlineQueue.push({src:e,tokens:t}),t}},{key:"inlineTokens",value:function(e){var t,n,r,i,o,a,u=this,l=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],c=e;if(this.tokens.links){var s=Object.keys(this.tokens.links);if(s.length>0)for(;null!=(i=this.tokenizer.rules.inline.reflinkSearch.exec(c));)s.includes(i[0].slice(i[0].lastIndexOf("[")+1,-1))&&(c=c.slice(0,i.index)+"["+xf("a",i[0].length-2)+"]"+c.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;null!=(i=this.tokenizer.rules.inline.blockSkip.exec(c));)c=c.slice(0,i.index)+"["+xf("a",i[0].length-2)+"]"+c.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);for(;null!=(i=this.tokenizer.rules.inline.escapedEmSt.exec(c));)c=c.slice(0,i.index+i[0].length-2)+"++"+c.slice(this.tokenizer.rules.inline.escapedEmSt.lastIndex),this.tokenizer.rules.inline.escapedEmSt.lastIndex--;for(;e;)if(o||(a=""),o=!1,!(this.options.extensions&&this.options.extensions.inline&&this.options.extensions.inline.some((function(n){return!!(t=n.call({lexer:u},e,l))&&(e=e.substring(t.raw.length),l.push(t),!0)}))))if(t=this.tokenizer.escape(e))e=e.substring(t.raw.length),l.push(t);else if(t=this.tokenizer.tag(e))e=e.substring(t.raw.length),(n=l[l.length-1])&&"text"===t.type&&"text"===n.type?(n.raw+=t.raw,n.text+=t.text):l.push(t);else if(t=this.tokenizer.link(e))e=e.substring(t.raw.length),l.push(t);else if(t=this.tokenizer.reflink(e,this.tokens.links))e=e.substring(t.raw.length),(n=l[l.length-1])&&"text"===t.type&&"text"===n.type?(n.raw+=t.raw,n.text+=t.text):l.push(t);else if(t=this.tokenizer.emStrong(e,c,a))e=e.substring(t.raw.length),l.push(t);else if(t=this.tokenizer.codespan(e))e=e.substring(t.raw.length),l.push(t);else if(t=this.tokenizer.br(e))e=e.substring(t.raw.length),l.push(t);else if(t=this.tokenizer.del(e))e=e.substring(t.raw.length),l.push(t);else if(t=this.tokenizer.autolink(e,Ff))e=e.substring(t.raw.length),l.push(t);else if(this.state.inLink||!(t=this.tokenizer.url(e,Ff))){if(r=e,this.options.extensions&&this.options.extensions.startInline&&function(){var t=1/0,n=e.slice(1),i=void 0;u.options.extensions.startInline.forEach((function(e){"number"===typeof(i=e.call({lexer:this},n))&&i>=0&&(t=Math.min(t,i))})),t<1/0&&t>=0&&(r=e.substring(0,t+1))}(),t=this.tokenizer.inlineText(r,Af))e=e.substring(t.raw.length),"_"!==t.raw.slice(-1)&&(a=t.raw.slice(-1)),o=!0,(n=l[l.length-1])&&"text"===n.type?(n.raw+=t.raw,n.text+=t.text):l.push(t);else if(e){var f="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(f);break}throw new Error(f)}}else e=e.substring(t.raw.length),l.push(t);return l}}],[{key:"rules",get:function(){return{block:Ef,inline:Sf}}},{key:"lex",value:function(t,n){return new e(n).lex(t)}},{key:"lexInline",value:function(t,n){return new e(n).inlineTokens(t)}}]),e}(),Of=function(){function e(t){Dt(this,e),this.options=t||Ks}return xt(e,[{key:"code",value:function(e,t,n){var r=(t||"").match(/\S*/)[0];if(this.options.highlight){var i=this.options.highlight(e,r);null!=i&&i!==e&&(n=!0,e=i)}return e=e.replace(/\n$/,"")+"\n",r?''+(n?e:af(e,!0))+"
\n":""+(n?e:af(e,!0))+"
\n"}},{key:"blockquote",value:function(e){return"\n".concat(e," \n")}},{key:"html",value:function(e){return e}},{key:"heading",value:function(e,t,n,r){if(this.options.headerIds){var i=this.options.headerPrefix+r.slug(n);return"').concat(e," \n")}return"").concat(e," \n")}},{key:"hr",value:function(){return this.options.xhtml?" \n":" \n"}},{key:"list",value:function(e,t,n){var r=t?"ol":"ul";return"<"+r+(t&&1!==n?' start="'+n+'"':"")+">\n"+e+""+r+">\n"}},{key:"listitem",value:function(e){return"".concat(e," \n")}},{key:"checkbox",value:function(e){return" "}},{key:"paragraph",value:function(e){return"".concat(e,"
\n")}},{key:"table",value:function(e,t){return t&&(t="".concat(t," ")),"\n"}},{key:"tablerow",value:function(e){return"\n".concat(e," \n")}},{key:"tablecell",value:function(e,t){var n=t.header?"th":"td";return(t.align?"<".concat(n,' align="').concat(t.align,'">'):"<".concat(n,">"))+e+"".concat(n,">\n")}},{key:"strong",value:function(e){return"".concat(e," ")}},{key:"em",value:function(e){return"".concat(e," ")}},{key:"codespan",value:function(e){return"".concat(e,"
")}},{key:"br",value:function(){return this.options.xhtml?" ":" "}},{key:"del",value:function(e){return"".concat(e,"")}},{key:"link",value:function(e,t,n){if(null===(e=hf(this.options.sanitize,this.options.baseUrl,e)))return n;var r='"+n+" "}},{key:"image",value:function(e,t,n){if(null===(e=hf(this.options.sanitize,this.options.baseUrl,e)))return n;var r=' ":">"}},{key:"text",value:function(e){return e}}]),e}(),Tf=function(){function e(){Dt(this,e)}return xt(e,[{key:"strong",value:function(e){return e}},{key:"em",value:function(e){return e}},{key:"codespan",value:function(e){return e}},{key:"del",value:function(e){return e}},{key:"html",value:function(e){return e}},{key:"text",value:function(e){return e}},{key:"link",value:function(e,t,n){return""+n}},{key:"image",value:function(e,t,n){return""+n}},{key:"br",value:function(){return""}}]),e}(),Bf=function(){function e(){Dt(this,e),this.seen={}}return xt(e,[{key:"serialize",value:function(e){return e.toLowerCase().trim().replace(/<[!\/a-z].*?>/gi,"").replace(/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g,"").replace(/\s/g,"-")}},{key:"getNextSafeSlug",value:function(e,t){var n=e,r=0;if(this.seen.hasOwnProperty(n)){r=this.seen[e];do{n=e+"-"+ ++r}while(this.seen.hasOwnProperty(n))}return t||(this.seen[e]=r,this.seen[n]=0),n}},{key:"slug",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=this.serialize(e);return this.getNextSafeSlug(n,t.dryrun)}}]),e}(),Mf=function(){function e(t){Dt(this,e),this.options=t||Ks,this.options.renderer=this.options.renderer||new Of,this.renderer=this.options.renderer,this.renderer.options=this.options,this.textRenderer=new Tf,this.slugger=new Bf}return xt(e,[{key:"parse",value:function(e){var t,n,r,i,o,a,u,l,c,s,f,d,h,p,v,m,y,g,_,b=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],D="",w=e.length;for(t=0;t0&&"paragraph"===v.tokens[0].type?(v.tokens[0].text=g+" "+v.tokens[0].text,v.tokens[0].tokens&&v.tokens[0].tokens.length>0&&"text"===v.tokens[0].tokens[0].type&&(v.tokens[0].tokens[0].text=g+" "+v.tokens[0].tokens[0].text)):v.tokens.unshift({type:"text",text:g}):p+=g),p+=this.parse(v.tokens,h),c+=this.renderer.listitem(p,y,m);D+=this.renderer.list(c,f,d);continue;case"html":D+=this.renderer.html(s.text);continue;case"paragraph":D+=this.renderer.paragraph(this.parseInline(s.tokens));continue;case"text":for(c=s.tokens?this.parseInline(s.tokens):s.text;t+1An error occurred:"+af(e.message+"",!0)+" ";throw e}try{var l=Nf.lex(e,t);if(t.walkTokens){if(t.async)return Promise.all(Lf.walkTokens(l,t.walkTokens)).then((function(){return Mf.parse(l,t)})).catch(u);Lf.walkTokens(l,t.walkTokens)}return Mf.parse(l,t)}catch(c){u(c)}}Lf.options=Lf.setOptions=function(e){var t;return _f(Lf.defaults,e),t=Lf.defaults,Ks=t,Lf},Lf.getDefaults=Zs,Lf.defaults=Ks,Lf.use=function(){for(var e=arguments.length,t=new Array(e),n=0;nAn error occurred:"+af(c.message+"",!0)+" ";throw c}},Lf.Parser=Mf,Lf.parser=Mf.parse,Lf.Renderer=Of,Lf.TextRenderer=Tf,Lf.Lexer=Nf,Lf.lexer=Nf.lex,Lf.Tokenizer=Cf,Lf.Slugger=Bf,Lf.parse=Lf;Lf.options,Lf.setOptions,Lf.use,Lf.walkTokens,Lf.parseInline,Mf.parse,Nf.lex;var Pf=function(e){var t=e.title,n=e.description,r=e.unit,i=e.expr,o=e.showLegend,a=e.filename,u=e.alias,l=Wr().period,c=Qr(),s=re(null),f=_t(X(!0),2),d=f[0],h=f[1],p=_t(X(l.step||1),2),v=p[0],y=p[1],g=_t(X({limits:{enable:!1,range:{1:[0,0]}}}),2),_=g[0],b=g[1],D=oe((function(){return Array.isArray(i)&&i.every((function(e){return e}))}),[i]),w=Ns({predefinedQuery:D?i:[],display:"chart",visible:d,customStep:v}),x=w.isLoading,k=w.graphData,C=w.error,E=w.warning,S=function(e){var t=Kn({},_);t.limits.range=e,b(t)};if(te((function(){var e=new IntersectionObserver((function(e){e.forEach((function(e){return h(e.isIntersecting)}))}),{threshold:.1});return s.current&&e.observe(s.current),function(){s.current&&e.unobserve(s.current)}}),[]),!D)return fr(lo,{variant:"error",children:[fr("code",{children:'"expr"'})," not found. Check the configuration file ",fr("b",{children:a}),"."]});var A=function(){return fr("div",{className:"vm-predefined-panel-header__description vm-default-styles",children:[n&&fr(m,{children:[fr("div",{children:[fr("span",{children:"Description:"}),fr("div",{dangerouslySetInnerHTML:{__html:Lf.parse(n)}})]}),fr("hr",{})]}),fr("div",{children:[fr("span",{children:"Queries:"}),fr("div",{children:i.map((function(e,t){return fr("div",{children:e},"".concat(t,"_").concat(e))}))})]})]})};return fr("div",{className:"vm-predefined-panel",ref:s,children:[fr("div",{className:"vm-predefined-panel-header",children:[fr(mo,{title:fr(A,{}),children:fr("div",{className:"vm-predefined-panel-header__info",children:fr(li,{})})}),fr("h3",{className:"vm-predefined-panel-header__title",children:t||""}),fr("div",{className:"vm-predefined-panel-header__step",children:fr(bs,{defaultStep:l.step,setStep:y})}),fr(Ms,{yaxis:_,setYaxisLimits:S,toggleEnableLimits:function(){var e=Kn({},_);e.limits.enable=!e.limits.enable,b(e)}})]}),fr("div",{className:"vm-predefined-panel-body",children:[x&&fr(Ls,{}),C&&fr(lo,{variant:"error",children:C}),E&&fr(lo,{variant:"warning",children:E}),k&&fr(vs,{data:k,period:l,customStep:v,query:i,yaxis:_,unit:r,alias:u,showLegend:o,setYaxisLimits:S,setPeriod:function(e){var t=e.from,n=e.to;c({type:"SET_PERIOD",payload:{from:t,to:n}})},fullWidth:!1})]})]})},If=function(e){var t=e.defaultExpanded,n=void 0!==t&&t,r=e.onChange,i=e.title,o=e.children,a=_t(X(n),2),u=a[0],l=a[1];return te((function(){r&&r(u)}),[u]),fr(m,{children:[fr("header",{className:"vm-accordion-header ".concat(u&&"vm-accordion-header_open"),onClick:function(){l((function(e){return!e}))},children:[i,fr("div",{className:"vm-accordion-header__arrow ".concat(u&&"vm-accordion-header__arrow_open"),children:fr(hi,{})})]}),u&&fr("section",{className:"vm-accordion-section",children:o},"content")]})},$f=function(e){var t=e.index,n=e.title,r=e.panels,i=e.filename,o=bo(document.body),a=oe((function(){return o.width/12}),[o]),u=_t(X(!t),2),l=u[0],c=u[1],s=_t(X([]),2),f=s[0],d=s[1];te((function(){d(r&&r.map((function(e){return e.width||12})))}),[r]);var h=_t(X({start:0,target:0,enable:!1}),2),p=h[0],v=h[1],m=function(e){if(p.enable){var t=p.start,n=Math.ceil((t-e.clientX)/a);if(!(Math.abs(n)>=12)){var r=f.map((function(e,t){return e-(t===p.target?n:0)}));d(r)}}},y=function(){v(Kn(Kn({},p),{},{enable:!1}))},g=function(e){return function(t){!function(e,t){v({start:e.clientX,target:t,enable:!0})}(t,e)}};return te((function(){return window.addEventListener("mousemove",m),window.addEventListener("mouseup",y),function(){window.removeEventListener("mousemove",m),window.removeEventListener("mouseup",y)}}),[p]),fr("div",{className:"vm-predefined-dashboard",children:fr(If,{defaultExpanded:l,onChange:function(e){return c(e)},title:fr((function(){return fr("div",{className:Bi()({"vm-predefined-dashboard-header":!0,"vm-predefined-dashboard-header_open":l}),children:[(n||i)&&fr("span",{className:"vm-predefined-dashboard-header__title",children:n||"".concat(t+1,". ").concat(i)}),r&&fr("span",{className:"vm-predefined-dashboard-header__count",children:["(",r.length," panels)"]})]})}),{}),children:fr("div",{className:"vm-predefined-dashboard-panels",children:Array.isArray(r)&&r.length?r.map((function(e,t){return fr("div",{className:"vm-predefined-dashboard-panels-panel vm-block vm-block_empty-padding",style:{gridColumn:"span ".concat(f[t])},children:[fr(Pf,{title:e.title,description:e.description,unit:e.unit,expr:e.expr,alias:e.alias,filename:i,showLegend:e.showLegend}),fr("button",{className:"vm-predefined-dashboard-panels-panel__resizer",onMouseDown:g(t)})]},t)})):fr("div",{className:"vm-predefined-dashboard-panels-panel__alert",children:fr(lo,{variant:"error",children:[fr("code",{children:'"panels"'})," not found. Check the configuration file ",fr("b",{children:i}),"."]})})})})})},Rf=function(){!function(){var e=Wr(),t=e.duration,n=e.relativeTime,r=e.period,i=r.date,o=r.step,a=function(){var e,r=Vs((qn(e={},"g0.range_input",t),qn(e,"g0.end_input",i),qn(e,"g0.step_input",o),qn(e,"g0.relative_time",n),e));ar(r)};te(a,[t,n,i,o]),te(a,[])}();var e=_t(X([]),2),t=e[0],n=e[1],r=_t(X("0"),2),i=r[0],o=r[1],a=oe((function(){return t.map((function(e,t){return{label:e.title||"",value:"".concat(t),className:"vm-predefined-panels-tabs__tab"}}))}),[t]),u=oe((function(){return t[+i]||{}}),[t,i]),l=oe((function(){return null===u||void 0===u?void 0:u.rows}),[u]),c=oe((function(){return u.title||u.filename||""}),[u]),s=oe((function(){return Array.isArray(l)&&!!l.length}),[l]);return te((function(){Js().then((function(e){return e.length&&n(e)}))}),[]),fr("div",{className:"vm-predefined-panels",children:[!t.length&&fr(lo,{variant:"info",children:"Dashboards not found"}),a.length>1&&fr("div",{className:"vm-predefined-panels-tabs vm-block vm-block_empty-padding",children:fr(Pi,{activeItem:i,items:a,onChange:function(e){o(e)}})}),fr("div",{className:"vm-predefined-panels__dashboards",children:[s&&l.map((function(e,t){return fr($f,{index:t,filename:c,title:e.title,panels:e.panels},"".concat(i,"_").concat(t))})),!!t.length&&!s&&fr(lo,{variant:"error",children:[fr("code",{children:'"rows"'})," not found. Check the configuration file ",fr("b",{children:c}),"."]})]})]})},jf=function(e,t){var n=t.match?"&match[]="+encodeURIComponent(t.match):"",r=t.focusLabel?"&focusLabel="+encodeURIComponent(t.focusLabel):"";return"".concat(e,"/api/v1/status/tsdb?topN=").concat(t.topN,"&date=").concat(t.date).concat(n).concat(r)},zf=function(){function e(){Dt(this,e),this.tsdbStatus=void 0,this.tabsNames=void 0,this.tsdbStatus=this.defaultTSDBStatus,this.tabsNames=["table","graph"]}return xt(e,[{key:"tsdbStatusData",get:function(){return this.tsdbStatus},set:function(e){this.tsdbStatus=e}},{key:"defaultTSDBStatus",get:function(){return{totalSeries:0,totalLabelValuePairs:0,seriesCountByMetricName:[],seriesCountByLabelName:[],seriesCountByFocusLabelValue:[],seriesCountByLabelValuePair:[],labelValueCountByLabelName:[]}}},{key:"keys",value:function(e){var t=[];return e&&(t=t.concat("seriesCountByFocusLabelValue")),t=t.concat("seriesCountByMetricName","seriesCountByLabelName","seriesCountByLabelValuePair","labelValueCountByLabelName"),t}},{key:"defaultState",get:function(){var e=this;return this.keys("job").reduce((function(t,n){return Kn(Kn({},t),{},{tabs:Kn(Kn({},t.tabs),{},qn({},n,e.tabsNames)),containerRefs:Kn(Kn({},t.containerRefs),{},qn({},n,re(null))),defaultActiveTab:Kn(Kn({},t.defaultActiveTab),{},qn({},n,0))})}),{tabs:{},containerRefs:{},defaultActiveTab:{}})}},{key:"sectionsTitles",value:function(e){return{seriesCountByMetricName:"Metric names with the highest number of series",seriesCountByLabelName:"Labels with the highest number of series",seriesCountByFocusLabelValue:'Values for "'.concat(e,'" label with the highest number of series'),seriesCountByLabelValuePair:"Label=value pairs with the highest number of series",labelValueCountByLabelName:"Labels with the highest number of unique values"}}},{key:"tablesHeaders",get:function(){return{seriesCountByMetricName:Uf,seriesCountByLabelName:Hf,seriesCountByFocusLabelValue:Yf,seriesCountByLabelValuePair:Vf,labelValueCountByLabelName:qf}}},{key:"totalSeries",value:function(e){return"labelValueCountByLabelName"===e?-1:this.tsdbStatus.totalSeries}}]),e}(),Uf=[{id:"name",label:"Metric name"},{id:"value",label:"Number of series"},{id:"percentage",label:"Percent of series"},{id:"action",label:"Action"}],Hf=[{id:"name",label:"Label name"},{id:"value",label:"Number of series"},{id:"percentage",label:"Percent of series"},{id:"action",label:"Action"}],Yf=[{id:"name",label:"Label value"},{id:"value",label:"Number of series"},{id:"percentage",label:"Percent of series"},{disablePadding:!1,id:"action",label:"Action",numeric:!1}],Vf=[{id:"name",label:"Label=value pair"},{id:"value",label:"Number of series"},{id:"percentage",label:"Percent of series"},{id:"action",label:"Action"}],qf=[{id:"name",label:"Label name"},{id:"value",label:"Number of unique values"},{id:"action",label:"Action"}],Wf={seriesCountByMetricName:function(e,t){return Qf("__name__",t)},seriesCountByLabelName:function(e,t){return"{".concat(t,'!=""}')},seriesCountByFocusLabelValue:function(e,t){return Qf(e,t)},seriesCountByLabelValuePair:function(e,t){var n=t.split("="),r=n[0],i=n.slice(1).join("=");return Qf(r,i)},labelValueCountByLabelName:function(e,t){return"{".concat(t,'!=""}')}},Qf=function(e,t){return e?"{"+e+"="+JSON.stringify(t)+"}":""},Gf=function(e){var t=e.topN,n=e.error,r=e.query,i=e.onSetHistory,o=e.onRunQuery,a=e.onSetQuery,u=e.onTopNChange,l=e.onFocusLabelChange,c=e.totalSeries,s=e.totalLabelValuePairs,f=e.date,d=e.match,h=e.focusLabel,p=ni().autocomplete,v=ri(),m=Ps().queryOptions,y=oe((function(){return t<1?"Number must be bigger than zero":""}),[t]);return fr("div",{className:"vm-cardinality-configurator vm-block",children:[fr("div",{className:"vm-cardinality-configurator-controls",children:[fr("div",{className:"vm-cardinality-configurator-controls__query",children:fr(ys,{value:r||d||"",autocomplete:p,options:m,error:n,onArrowUp:function(){i(-1)},onArrowDown:function(){i(1)},onEnter:o,onChange:a,label:"Time series selector"})}),fr("div",{className:"vm-cardinality-configurator-controls__item",children:fr(To,{label:"Number of entries per table",type:"number",value:t,error:y,onChange:u})}),fr("div",{className:"vm-cardinality-configurator-controls__item",children:fr(To,{label:"Focus label",type:"text",value:h||"",onChange:l})}),fr("div",{className:"vm-cardinality-configurator-controls__item",children:fr(ws,{label:"Autocomplete",value:p,onChange:function(){v({type:"TOGGLE_AUTOCOMPLETE"})}})})]}),fr("div",{className:"vm-cardinality-configurator-bottom",children:[fr("div",{className:"vm-cardinality-configurator-bottom__info",children:["Analyzed ",fr("b",{children:c})," series with ",fr("b",{children:s}),' "label=value" pairs at ',fr("b",{children:f}),d&&fr("span",{children:[" for series selector ",fr("b",{children:d})]}),". Show top ",t," entries per table."]}),fr(ho,{startIcon:fr(bi,{}),onClick:o,children:"Execute Query"})]})]})};function Jf(e){var t=e.order,n=e.orderBy,r=e.onRequestSort,i=e.headerCells;return fr("thead",{className:"vm-table-header",children:fr("tr",{className:"vm-table__row vm-table__row_header",children:i.map((function(e){return fr("th",{className:Bi()({"vm-table-cell vm-table-cell_header":!0,"vm-table-cell_sort":"action"!==e.id&&"percentage"!==e.id,"vm-table-cell_right":"action"===e.id}),onClick:(i=e.id,function(e){r(e,i)}),children:fr("div",{className:"vm-table-cell__content",children:[e.label,"action"!==e.id&&"percentage"!==e.id&&fr("div",{className:Bi()({"vm-table__sort-icon":!0,"vm-table__sort-icon_active":n===e.id,"vm-table__sort-icon_desc":"desc"===t&&n===e.id}),children:fr(vi,{})})]})},e.id);var i}))})})}function Zf(e,t,n){return t[n]e[n]?1:0}function Kf(e,t){return"desc"===e?function(e,n){return Zf(e,n,t)}:function(e,n){return-Zf(e,n,t)}}function Xf(e,t){var n=e.map((function(e,t){return[e,t]}));return n.sort((function(e,n){var r=t(e[0],n[0]);return 0!==r?r:e[1]-n[1]})),n.map((function(e){return e[0]}))}var ed=function(e){var t=e.rows,n=e.headerCells,r=e.defaultSortColumn,i=e.tableCells,o=_t(X("desc"),2),a=o[0],u=o[1],l=_t(X(r),2),c=l[0],s=l[1],f=_t(X([]),2),d=f[0],h=f[1],p=function(e){return function(){var t=d.indexOf(e),n=[];-1===t?n=n.concat(d,e):0===t?n=n.concat(d.slice(1)):t===d.length-1?n=n.concat(d.slice(0,-1)):t>0&&(n=n.concat(d.slice(0,t),d.slice(t+1))),h(n)}},v=Xf(t,Kf(a,c));return fr("table",{className:"vm-table",children:[fr(Jf,{numSelected:d.length,order:a,orderBy:c,onSelectAllClick:function(e){if(e.target.checked){var n=t.map((function(e){return e.name}));h(n)}else h([])},onRequestSort:function(e,t){u(c===t&&"asc"===a?"desc":"asc"),s(t)},rowCount:t.length,headerCells:n}),fr("tbody",{className:"vm-table-header",children:v.map((function(e){return fr("tr",{className:Bi()({"vm-table__row":!0,"vm-table__row_selected":(t=e.name,-1!==d.indexOf(t))}),onClick:p(e.name),children:i(e)},e.name);var t}))})]})},td=function(e){var t=e.row,n=e.totalSeries,r=e.onActionClick,i=n>0?t.value/n*100:-1;return fr(m,{children:[fr("td",{className:"vm-table-cell",children:t.name},t.name),fr("td",{className:"vm-table-cell",children:t.value},t.value),i>0&&fr("td",{className:"vm-table-cell",children:fr(Is,{value:i})},t.progressValue),fr("td",{className:"vm-table-cell vm-table-cell_right",children:fr("div",{className:"vm-table-cell__content",children:fr(mo,{title:"Filter by ".concat(t.name),children:fr(ho,{variant:"text",size:"small",onClick:r,children:fr(Di,{})})})})},"action")]})},nd=function(e){var t=e.data,n=e.container,r=e.configs,i=re(null),o=_t(X(),2),a=o[0],u=o[1],l=bo(n),c=Kn(Kn({},r),{},{width:l.width||400});return te((function(){if(i.current){var e=new zc(c,t,i.current);return u(e),e.destroy}}),[i.current,l]),te((function(){a&&a.setData(t)}),[t]),fr("div",{style:{height:"100%"},children:fr("div",{ref:i})})},rd=function(e,t){return Math.round(e*(t=Math.pow(10,t)))/t},id=1,od=function(e,t,n,r){return rd(t+e*(n+r),6)},ad=function(e,t,n,r,i){var o=1-t,a=n===id?o/(e-1):2===n?o/e:3===n?o/(e+1):0;(isNaN(a)||a===1/0)&&(a=0);var u=n===id?0:2===n?a/2:3===n?a:0,l=t/e,c=rd(l,6);if(null==r)for(var s=0;s=n&&e<=i&&t>=r&&t<=o};function ld(e,t,n,r,i){var o=this;o.x=e,o.y=t,o.w=n,o.h=r,o.l=i||0,o.o=[],o.q=null}var cd={split:function(){var e=this,t=e.x,n=e.y,r=e.w/2,i=e.h/2,o=e.l+1;e.q=[new ld(t+r,n,r,i,o),new ld(t,n,r,i,o),new ld(t,n+i,r,i,o),new ld(t+r,n+i,r,i,o)]},quads:function(e,t,n,r,i){var o=this,a=o.q,u=o.x+o.w/2,l=o.y+o.h/2,c=tu,d=t+r>l;c&&f&&i(a[0]),s&&c&&i(a[1]),s&&d&&i(a[2]),f&&d&&i(a[3])},add:function(e){var t=this;if(null!=t.q)t.quads(e.x,e.y,e.w,e.h,(function(t){t.add(e)}));else{var n=t.o;if(n.push(e),n.length>10&&t.l<4){t.split();for(var r=function(e){var r=n[e];t.quads(r.x,r.y,r.w,r.h,(function(e){e.add(r)}))},i=0;i=0?"left":"right",e.ctx.textBaseline=1===s?"middle":i[n]>=0?"bottom":"top",e.ctx.fillText(i[n],f,g)}}))})),e.ctx.restore()}function b(e,t,n){return[0,zc.rangeNum(0,n,.05,!0)[1]]}return{hooks:{drawClear:function(t){var n;if((y=y||new ld(0,0,t.bbox.width,t.bbox.height)).clear(),t.series.forEach((function(e){e._paths=null})),l=d?[null].concat(m(t.data.length-1-o.length,t.data[0].length)):2===t.series.length?[null].concat(m(t.data[0].length,1)):[null].concat(function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:h,r=Array.from({length:t},(function(){return{offs:Array(e).fill(0),size:Array(e).fill(0)}}));return ad(e,n,p,null,(function(e,n,i){ad(t,1,v,null,(function(t,o,a){r[t].offs[e]=n+i*o,r[t].size[e]=i*a}))})),r}(t.data[0].length,t.data.length-1-o.length,1===t.data[0].length?1:h)),null!=(null===(n=e.disp)||void 0===n?void 0:n.fill)){c=[null];for(var r=1;r0&&!o.includes(t)&&zc.assign(e,{paths:g,points:{show:_}})}))}}}((sd=[1],fd=0,dd=1,hd=0,pd=function(e,t){return{stroke:e,fill:t}}({unit:3,values:function(e){return e.data[1].map((function(e,t){return 0!==t?"#33BB55":"#F79420"}))}},{unit:3,values:function(e){return e.data[1].map((function(e,t){return 0!==t?"#33BB55":"#F79420"}))}}),{which:sd,ori:fd,dir:dd,radius:hd,disp:pd}))]},md=function(e){var t=e.rows,n=e.activeTab,r=e.onChange,i=e.tabs,o=e.chartContainer,a=e.totalSeries,u=e.tabId,l=e.onActionClick,c=e.sectionTitle,s=e.tableHeaderCells,f=oe((function(){return i.map((function(e,t){return{value:String(t),label:e,icon:fr(0===t?xi:wi,{})}}))}),[i]);return fr("div",{className:"vm-metrics-content vm-block",children:[fr("div",{className:"vm-metrics-content-header vm-section-header",children:[fr("h5",{className:"vm-section-header__title",children:c}),fr("div",{className:"vm-section-header__tabs",children:fr(Pi,{activeItem:String(n),items:f,onChange:function(e){r(e,u)}})})]}),fr("div",{ref:o,children:[0===n&&fr(ed,{rows:t,headerCells:s,defaultSortColumn:"value",tableCells:function(e){return fr(td,{row:e,totalSeries:a,onActionClick:l})}}),1===n&&fr(nd,{data:[t.map((function(e){return e.name})),t.map((function(e){return e.value})),t.map((function(e,t){return t%12==0?1:t%10==0?2:0}))],container:(null===o||void 0===o?void 0:o.current)||null,configs:vd})]})]})},yd=function(){var e=eo(),t=e.topN,n=e.match,r=e.date,i=e.focusLabel,o=to();!function(){var e=eo(),t=e.topN,n=e.match,r=e.date,i=e.focusLabel,o=e.extraLabel,a=function(){var e=Vs({topN:t,date:r,match:n,extraLabel:o,focusLabel:i});ar(e)};te(a,[t,n,r,i,o]),te(a,[])}();var a=_t(X(n||""),2),u=a[0],l=a[1],c=_t(X(0),2),s=c[0],f=c[1],d=_t(X([]),2),h=d[0],p=d[1],v=function(){var e=new zf,t=eo(),n=t.topN,r=t.extraLabel,i=t.match,o=t.date,a=t.runQuery,u=t.focusLabel,l=hr().serverUrl,c=_t(X(!1),2),s=c[0],f=c[1],d=_t(X(),2),h=d[0],p=d[1],v=_t(X(e.defaultTSDBStatus),2),m=v[0],y=v[1];te((function(){h&&(y(e.defaultTSDBStatus),f(!1))}),[h]);var g=function(){var t=os(rs().mark((function t(n){var r,i,o,a;return rs().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(l){t.next=2;break}return t.abrupt("return");case 2:return p(""),f(!0),y(e.defaultTSDBStatus),r=jf(l,n),t.prev=6,t.next=9,fetch(r);case 9:return i=t.sent,t.next=12,i.json();case 12:o=t.sent,i.ok?(a=o.data,y(Kn({},a)),f(!1)):(p(o.error),y(e.defaultTSDBStatus),f(!1)),t.next=20;break;case 16:t.prev=16,t.t0=t.catch(6),f(!1),t.t0 instanceof Error&&p("".concat(t.t0.name,": ").concat(t.t0.message));case 20:case"end":return t.stop()}}),t,null,[[6,16]])})));return function(e){return t.apply(this,arguments)}}();return te((function(){g({topN:n,extraLabel:r,match:i,date:o,focusLabel:u})}),[l,a,o]),e.tsdbStatusData=m,{isLoading:s,appConfigurator:e,error:h}}(),m=v.isLoading,y=v.appConfigurator,g=v.error,_=_t(X(y.defaultState.defaultActiveTab),2),b=_[0],D=_[1],w=y.tsdbStatusData,x=y.defaultState,k=y.tablesHeaders,C=function(e,t){D(Kn(Kn({},b),{},qn({},t,+e)))};return fr("div",{className:"vm-cardinality-panel",children:[m&&fr(Ls,{message:"Please wait while cardinality stats is calculated. \n This may take some time if the db contains big number of time series."}),fr(Gf,{error:"",query:u,topN:t,date:r,match:n,totalSeries:w.totalSeries,totalLabelValuePairs:w.totalLabelValuePairs,focusLabel:i,onRunQuery:function(){p((function(e){return[].concat(bt(e),[u])})),f((function(e){return e+1})),o({type:"SET_MATCH",payload:u}),o({type:"RUN_QUERY"})},onSetQuery:function(e){l(e)},onSetHistory:function(e){var t=s+e;t<0||t>=h.length||(f(t),l(h[t]))},onTopNChange:function(e){o({type:"SET_TOP_N",payload:+e})},onFocusLabelChange:function(e){o({type:"SET_FOCUS_LABEL",payload:e})}}),g&&fr(lo,{variant:"error",children:g}),y.keys(i).map((function(e){return fr(md,{sectionTitle:y.sectionsTitles(i)[e],activeTab:b[e],rows:w[e],onChange:C,onActionClick:(t=e,function(e){var n=e.currentTarget.id,r=Wf[t](i,n);l(r),p((function(e){return[].concat(bt(e),[r])})),f((function(e){return e+1})),o({type:"SET_MATCH",payload:r});var a="";"labelValueCountByLabelName"!==t&&"seriesCountByLabelName"!=t||(a=n),o({type:"SET_FOCUS_LABEL",payload:a}),o({type:"RUN_QUERY"})}),tabs:x.tabs[e],chartContainer:x.containerRefs[e],totalSeries:y.totalSeries(e),tabId:e,tableHeaderCells:k[e]},e);var t}))]})},gd=function(e){var t=e.rows,n=e.columns,r=_t(X(e.defaultOrderBy||"count"),2),i=r[0],o=r[1],a=_t(X("desc"),2),u=a[0],l=a[1],c=oe((function(){return Xf(t,Kf(u,i))}),[t,i,u]),s=function(e){return function(){var t;t=e,l((function(e){return"asc"===e&&i===t?"desc":"asc"})),o(t)}};return fr("table",{className:"vm-table",children:[fr("thead",{className:"vm-table-header",children:fr("tr",{className:"vm-table__row vm-table__row_header",children:n.map((function(e){return fr("th",{className:"vm-table-cell vm-table-cell_header vm-table-cell_sort",onClick:s(e.key),children:fr("div",{className:"vm-table-cell__content",children:[e.title||e.key,fr("div",{className:Bi()({"vm-table__sort-icon":!0,"vm-table__sort-icon_active":i===e.key,"vm-table__sort-icon_desc":"desc"===u&&i===e.key}),children:fr(vi,{})})]})},e.key)}))})}),fr("tbody",{className:"vm-table-body",children:c.map((function(e,t){return fr("tr",{className:"vm-table__row",children:n.map((function(t){return fr("td",{className:"vm-table-cell",children:e[t.key]||"-"},t.key)}))},t)}))})]})},_d=["table","JSON"].map((function(e,t){return{value:String(t),label:e,icon:fr(0===t?xi:ki,{})}})),bd=function(e){var t=e.rows,n=e.title,r=e.columns,i=e.defaultOrderBy,o=_t(X(0),2),a=o[0],u=o[1];return fr("div",{className:"vm-top-queries-panel vm-block",children:[fr("div",{className:"vm-top-queries-panel-header vm-section-header",children:[fr("h5",{className:"vm-section-header__title",children:n}),fr("div",{className:"vm-section-header__tabs",children:fr(Pi,{activeItem:String(a),items:_d,onChange:function(e){u(+e)}})})]}),fr("div",{children:[0===a&&fr(gd,{rows:t,columns:r,defaultOrderBy:i}),1===a&&fr(Os,{data:t})]})]})},Dd=function(){var e=function(){var e=hr().serverUrl,t=ao(),n=t.topN,r=t.maxLifetime,i=t.runQuery,o=_t(X(null),2),a=o[0],u=o[1],l=_t(X(!1),2),c=l[0],s=l[1],f=_t(X(),2),d=f[0],h=f[1],p=oe((function(){return function(e,t,n){return"".concat(e,"/api/v1/status/top_queries?topN=").concat(t||"","&maxLifetime=").concat(n||"")}(e,n,r)}),[e,n,r]),v=function(){var e=os(rs().mark((function e(){var t,n;return rs().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return s(!0),e.prev=1,e.next=4,fetch(p);case 4:return t=e.sent,e.next=7,t.json();case 7:n=e.sent,t.ok&&["topByAvgDuration","topByCount","topBySumDuration"].forEach((function(e){var t=n[e];Array.isArray(t)&&t.forEach((function(e){return e.timeRangeHours=+(e.timeRangeSeconds/3600).toFixed(2)}))})),u(t.ok?n:null),h(String(n.error||"")),e.next=16;break;case 13:e.prev=13,e.t0=e.catch(1),e.t0 instanceof Error&&"AbortError"!==e.t0.name&&h("".concat(e.t0.name,": ").concat(e.t0.message));case 16:s(!1);case 17:case"end":return e.stop()}}),e,null,[[1,13]])})));return function(){return e.apply(this,arguments)}}();return te((function(){v()}),[i]),{data:a,error:d,loading:c}}(),t=e.data,n=e.error,r=e.loading,i=ao(),o=i.topN,a=i.maxLifetime,u=ue(oo).dispatch;!function(){var e=ao(),t=e.topN,n=e.maxLifetime,r=function(){var e=Vs({topN:String(t),maxLifetime:n});ar(e)};te(r,[t,n]),te(r,[])}();var l=oe((function(){var e=a.trim().split(" ").reduce((function(e,t){var n=Or(t);return n?Kn(Kn({},e),n):Kn({},e)}),{});return!!yr().duration(e).asMilliseconds()}),[a]),c=oe((function(){return!!o&&o<1}),[o]),s=oe((function(){return c?"Number must be bigger than zero":""}),[c]),f=oe((function(){return l?"":"Invalid duration value"}),[l]),d=function(e){if(!t)return e;var n=t[e];return"number"===typeof n?Vc(n):n||e},h=function(){u({type:"SET_RUN_QUERY"})},p=function(e){"Enter"===e.key&&h()};return te((function(){t&&(o||u({type:"SET_TOP_N",payload:+t.topN}),a||u({type:"SET_MAX_LIFE_TIME",payload:t.maxLifetime}))}),[t]),fr("div",{className:"vm-top-queries",children:[r&&fr(Ls,{containerStyles:{height:"500px"}}),fr("div",{className:"vm-top-queries-controls vm-block",children:[fr("div",{className:"vm-top-queries-controls__fields",children:[fr(To,{label:"Max lifetime",value:a,error:f,helperText:"For example ".concat("30ms, 15s, 3d4h, 1y2w"),onChange:function(e){u({type:"SET_MAX_LIFE_TIME",payload:e})},onKeyDown:p}),fr(To,{label:"Number of returned queries",type:"number",value:o||"",error:s,onChange:function(e){u({type:"SET_TOP_N",payload:+e})},onKeyDown:p})]}),fr("div",{className:"vm-top-queries-controls-bottom",children:[fr("div",{className:"vm-top-queries-controls-bottom__info",children:["VictoriaMetrics tracks the last\xa0",fr(mo,{title:"search.queryStats.lastQueriesCount",children:fr("b",{children:d("search.queryStats.lastQueriesCount")})}),"\xa0queries with durations at least\xa0",fr(mo,{title:"search.queryStats.minQueryDuration",children:fr("b",{children:d("search.queryStats.minQueryDuration")})})]}),fr("div",{className:"vm-top-queries-controls-bottom__button",children:fr(ho,{startIcon:fr(bi,{}),onClick:h,children:"Execute"})})]})]}),n&&fr(lo,{variant:"error",children:n}),t&&fr(m,{children:fr("div",{className:"vm-top-queries-panels",children:[fr(bd,{rows:t.topByCount,title:"Most frequently executed queries",columns:[{key:"query"},{key:"timeRangeHours",title:"time range, hours"},{key:"count"}]}),fr(bd,{rows:t.topByAvgDuration,title:"Most heavy queries",columns:[{key:"query"},{key:"avgDurationSeconds",title:"avg duration, seconds"},{key:"timeRangeHours",title:"time range, hours"},{key:"count"}],defaultOrderBy:"avgDurationSeconds"}),fr(bd,{rows:t.topBySumDuration,title:"Queries with most summary time to execute",columns:[{key:"query"},{key:"sumDurationSeconds",title:"sum duration, seconds"},{key:"timeRangeHours",title:"time range, hours"},{key:"count"}],defaultOrderBy:"sumDurationSeconds"})]})})]})},wd=["primary","secondary","error","warning","info","success"],xd=function(e){var t=e.setLoadingTheme,n=Xn().palette,r=void 0===n?{}:n,i=function(){wd.forEach((function(e){var t=function(e){var t=e.replace("#","").trim();if(3===t.length&&(t=t[0]+t[0]+t[1]+t[1]+t[2]+t[2]),6!==t.length)throw new Error("Invalid HEX color.");return(299*parseInt(t.slice(0,2),16)+587*parseInt(t.slice(2,4),16)+114*parseInt(t.slice(4,6),16))/1e3>=128?"#000000":"#FFFFFF"}(Mi("color-".concat(e)));Li("".concat(e,"-text"),t)}))};return te((function(){wd.forEach((function(e){var t=r[e];t&&Li("color-".concat(e),t)})),function(){var e=window,t=e.innerWidth,n=e.innerHeight,r=document.documentElement,i=r.clientWidth,o=r.clientHeight;Li("scrollbar-width","".concat(t-i,"px")),Li("scrollbar-height","".concat(n-o,"px"))}(),i(),t(!1)}),[]),null},kd=function(){var e=_t(X(!1),2),t=e[0],n=e[1],r=_t(X([]),2),i=r[0],o=r[1],a=_t(X([]),2),u=a[0],l=a[1],s=oe((function(){return!!i.length}),[i]),f=function(){n(!0)},d=function(){n(!1)},h=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";l((function(n){return[{filename:t,text:": ".concat(e.message)}].concat(bt(n))}))},p=function(e,t){try{var n=JSON.parse(e),r=n.trace||n;if(!r.duration_msec)return void h(new Error(Co.traceNotFound),t);var i=new Fs(r,t);o((function(e){return[i].concat(bt(e))}))}catch(c){c instanceof Error&&h(c,t)}},v=function(e){l([]),Array.from(e.target.files||[]).map((function(e){var t=new FileReader,n=(null===e||void 0===e?void 0:e.name)||"";t.onload=function(e){var t,r=String(null===(t=e.target)||void 0===t?void 0:t.result);p(r,n)},t.readAsText(e)})),e.target.value=""},m=function(e){return function(){!function(e){l((function(t){return t.filter((function(t,n){return n!==e}))}))}(e)}},y=function(){return fr("div",{className:"vm-trace-page-controls",children:[fr(ho,{variant:"outlined",onClick:f,children:"Paste JSON"}),fr(mo,{title:"The file must contain tracing information in JSON format",children:fr(ho,{children:["Upload Files",fr("input",{id:"json",type:"file",accept:"application/json",multiple:!0,title:" ",onChange:v})]})})]})};return fr("div",{className:"vm-trace-page",children:[fr("div",{className:"vm-trace-page-header",children:[fr("div",{className:"vm-trace-page-header-errors",children:u.map((function(e,t){return fr("div",{className:"vm-trace-page-header-errors-item",children:[fr(lo,{variant:"error",children:[fr("b",{className:"vm-trace-page-header-errors-item__filename",children:e.filename}),fr("span",{children:e.text})]}),fr(ho,{className:"vm-trace-page-header-errors-item__close",startIcon:fr(ai,{}),variant:"text",color:"error",onClick:m(t)})]},"".concat(e,"_").concat(t))}))}),fr("div",{children:s&&fr(y,{})})]}),s&&fr("div",{children:fr(js,{jsonEditor:!0,traces:i,onDeleteClick:function(e){var t=i.filter((function(t){return t.idValue!==e.idValue}));o(bt(t))}})}),!s&&fr("div",{className:"vm-trace-page-preview",children:[fr("p",{className:"vm-trace-page-preview__text",children:["Please, upload file with JSON response content.","\n","The file must contain tracing information in JSON format.","\n","In order to use tracing please refer to the doc:\xa0",fr("a",{href:"https://docs.victoriametrics.com/#query-tracing",target:"_blank",rel:"noreferrer",children:"https://docs.victoriametrics.com/#query-tracing"}),"\n","Tracing graph will be displayed after file upload."]}),fr(y,{})]}),t&&fr(Lo,{title:"Paste JSON",onClose:d,children:fr(Rs,{editable:!0,displayTitle:!0,defaultTile:"JSON ".concat(i.length+1),onClose:d,onUpload:p})})]})},Cd=function(){var e=_t(X(!0),2),t=e[0],n=e[1];return fr(m,t?{children:[fr(Ls,{}),fr(xd,{setLoadingTheme:n}),";"]}:{children:fr(Un,{children:fr(fo,{children:fr(jn,{children:fr($n,{path:"/",element:fr(qo,{}),children:[fr($n,{path:Jn.home,element:fr(Qs,{})}),fr($n,{path:Jn.dashboards,element:fr(Rf,{})}),fr($n,{path:Jn.cardinality,element:fr(yd,{})}),fr($n,{path:Jn.topQueries,element:fr(Dd,{})}),fr($n,{path:Jn.trace,element:fr(kd,{})})]})})})})})},Ed=function(e){e&&n.e(27).then(n.bind(n,27)).then((function(t){var n=t.getCLS,r=t.getFID,i=t.getFCP,o=t.getLCP,a=t.getTTFB;n(e),r(e),i(e),o(e),a(e)}))},Sd=document.getElementById("root");Sd&&Ye(fr(Cd,{}),Sd),Ed()}()}();
\ No newline at end of file
From a40c50f4fea75ce51b1ae7ea550086540580d39c Mon Sep 17 00:00:00 2001
From: Aliaksandr Valialkin
Date: Mon, 5 Dec 2022 23:10:17 -0800
Subject: [PATCH 38/38] docs/CHANGELOG.md: document
1e0666abb4a5a5e7c79d683b3db8a159937aa2cc
---
docs/CHANGELOG.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md
index 7f7886bb54..d73dc154a3 100644
--- a/docs/CHANGELOG.md
+++ b/docs/CHANGELOG.md
@@ -45,6 +45,7 @@ The following tip changes can be tested by building VictoriaMetrics components f
* `vm_rows{type="storage/inmemory"}` - the total number of in-memory `storage` rows
* `vm_rows{type="indexdb/inmemory"}` - the total number of in-memory `indexdb` rows
* `vm_rows{type="indexdb/file"}` - the total number of file-based `indexdb` rows
+* FEATURE: [DataDog parser](https://docs.victoriametrics.com/#how-to-send-data-from-datadog-agent): add `device` tag when it is passed in the `device` field is present in the `series` object of the input request. Thanks to @PerGon for the provided [pull request](https://github.com/VictoriaMetrics/VictoriaMetrics/pull/3431).
* FEATURE: [vmagent](https://docs.victoriametrics.com/vmagent.html): improve [service discovery](https://docs.victoriametrics.com/sd_configs.html) performance when discovering big number of targets (10K and more).
* FEATURE: [vmagent](https://docs.victoriametrics.com/vmagent.html): add `exported_` prefix to metric names exported by scrape targets if these metric names clash with [automatically generated metrics](https://docs.victoriametrics.com/vmagent.html#automatically-generated-metrics) such as `up`, `scrape_samples_scraped`, etc. This prevents from corruption of automatically generated metrics. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3406).
* FEATURE: [VictoriaMetrics cluster](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html): improve error message when the requested path cannot be properly parsed, so users could identify the issue and properly fix the path. Now the error message links to [url format docs](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#url-format). See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3402).