mirror of
https://github.com/VictoriaMetrics/VictoriaMetrics.git
synced 2025-01-20 15:16:42 +00:00
Merge branch 'public-single-node' into victorialogs-wip
This commit is contained in:
commit
fda37a3256
32 changed files with 479 additions and 197 deletions
|
@ -1,13 +1,13 @@
|
||||||
{
|
{
|
||||||
"files": {
|
"files": {
|
||||||
"main.css": "./static/css/main.1c2f4a93.css",
|
"main.css": "./static/css/main.7e9644cd.css",
|
||||||
"main.js": "./static/js/main.c3285306.js",
|
"main.js": "./static/js/main.bfdd2931.js",
|
||||||
"static/js/685.bebe1265.chunk.js": "./static/js/685.bebe1265.chunk.js",
|
"static/js/685.bebe1265.chunk.js": "./static/js/685.bebe1265.chunk.js",
|
||||||
"static/media/MetricsQL.md": "./static/media/MetricsQL.df7574389d8f8bbcf0c7.md",
|
"static/media/MetricsQL.md": "./static/media/MetricsQL.cb83d071da309a358bc0.md",
|
||||||
"index.html": "./index.html"
|
"index.html": "./index.html"
|
||||||
},
|
},
|
||||||
"entrypoints": [
|
"entrypoints": [
|
||||||
"static/css/main.1c2f4a93.css",
|
"static/css/main.7e9644cd.css",
|
||||||
"static/js/main.c3285306.js"
|
"static/js/main.bfdd2931.js"
|
||||||
]
|
]
|
||||||
}
|
}
|
|
@ -1 +1 @@
|
||||||
<!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="./favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=5"/><meta name="theme-color" content="#000000"/><meta name="description" content="UI for VictoriaMetrics"/><link rel="apple-touch-icon" href="./apple-touch-icon.png"/><link rel="icon" type="image/png" sizes="32x32" href="./favicon-32x32.png"><link rel="manifest" href="./manifest.json"/><title>VM UI</title><script src="./dashboards/index.js" type="module"></script><meta name="twitter:card" content="summary_large_image"><meta name="twitter:image" content="./preview.jpg"><meta name="twitter:title" content="UI for VictoriaMetrics"><meta name="twitter:description" content="Explore and troubleshoot your VictoriaMetrics data"><meta name="twitter:site" content="@VictoriaMetrics"><meta property="og:title" content="Metric explorer for VictoriaMetrics"><meta property="og:description" content="Explore and troubleshoot your VictoriaMetrics data"><meta property="og:image" content="./preview.jpg"><meta property="og:type" content="website"><script defer="defer" src="./static/js/main.c3285306.js"></script><link href="./static/css/main.1c2f4a93.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>
|
<!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="./favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=5"/><meta name="theme-color" content="#000000"/><meta name="description" content="UI for VictoriaMetrics"/><link rel="apple-touch-icon" href="./apple-touch-icon.png"/><link rel="icon" type="image/png" sizes="32x32" href="./favicon-32x32.png"><link rel="manifest" href="./manifest.json"/><title>VM UI</title><script src="./dashboards/index.js" type="module"></script><meta name="twitter:card" content="summary_large_image"><meta name="twitter:image" content="./preview.jpg"><meta name="twitter:title" content="UI for VictoriaMetrics"><meta name="twitter:description" content="Explore and troubleshoot your VictoriaMetrics data"><meta name="twitter:site" content="@VictoriaMetrics"><meta property="og:title" content="Metric explorer for VictoriaMetrics"><meta property="og:description" content="Explore and troubleshoot your VictoriaMetrics data"><meta property="og:image" content="./preview.jpg"><meta property="og:type" content="website"><script defer="defer" src="./static/js/main.bfdd2931.js"></script><link href="./static/css/main.7e9644cd.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>
|
File diff suppressed because one or more lines are too long
1
app/vlselect/vmui/static/css/main.7e9644cd.css
Normal file
1
app/vlselect/vmui/static/css/main.7e9644cd.css
Normal file
File diff suppressed because one or more lines are too long
2
app/vlselect/vmui/static/js/main.bfdd2931.js
Normal file
2
app/vlselect/vmui/static/js/main.bfdd2931.js
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -328,6 +328,7 @@ See also [increases_over_time](#increases_over_time).
|
||||||
|
|
||||||
`default_rollup(series_selector[d])` is a [rollup function](#rollup-functions), which returns the last [raw sample](https://docs.victoriametrics.com/keyconcepts/#raw-samples)
|
`default_rollup(series_selector[d])` is a [rollup function](#rollup-functions), which returns the last [raw sample](https://docs.victoriametrics.com/keyconcepts/#raw-samples)
|
||||||
value on the given lookbehind window `d` per each time series returned from the given [series_selector](https://docs.victoriametrics.com/keyconcepts/#filtering).
|
value on the given lookbehind window `d` per each time series returned from the given [series_selector](https://docs.victoriametrics.com/keyconcepts/#filtering).
|
||||||
|
Compared to [last_over_time](#last_over_time) it accounts for [staleness markers](https://docs.victoriametrics.com/vmagent/#prometheus-staleness-markers) to detect stale series.
|
||||||
|
|
||||||
If the lookbehind window is skipped in square brackets, then it is automatically calculated as `max(step, scrape_interval)`, where `step` is the query arg value
|
If the lookbehind window is skipped in square brackets, then it is automatically calculated as `max(step, scrape_interval)`, where `step` is the query arg value
|
||||||
passed to [/api/v1/query_range](https://docs.victoriametrics.com/keyconcepts/#range-query) or [/api/v1/query](https://docs.victoriametrics.com/keyconcepts/#instant-query),
|
passed to [/api/v1/query_range](https://docs.victoriametrics.com/keyconcepts/#range-query) or [/api/v1/query](https://docs.victoriametrics.com/keyconcepts/#instant-query),
|
58
app/vmui/packages/vmui/package-lock.json
generated
58
app/vmui/packages/vmui/package-lock.json
generated
|
@ -44,6 +44,7 @@
|
||||||
"eslint": "^8.44.0",
|
"eslint": "^8.44.0",
|
||||||
"eslint-config-react-app": "^7.0.1",
|
"eslint-config-react-app": "^7.0.1",
|
||||||
"eslint-plugin-react": "^7.29.4",
|
"eslint-plugin-react": "^7.29.4",
|
||||||
|
"http-proxy-middleware": "^3.0.0",
|
||||||
"react-app-rewired": "^2.2.1",
|
"react-app-rewired": "^2.2.1",
|
||||||
"webpack": "^5.88.1"
|
"webpack": "^5.88.1"
|
||||||
}
|
}
|
||||||
|
@ -4199,7 +4200,6 @@
|
||||||
"resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz",
|
"resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz",
|
||||||
"integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==",
|
"integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@types/node": "*"
|
"@types/node": "*"
|
||||||
}
|
}
|
||||||
|
@ -8631,8 +8631,7 @@
|
||||||
"version": "4.0.7",
|
"version": "4.0.7",
|
||||||
"resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
|
"resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
|
||||||
"integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
|
"integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
|
||||||
"dev": true,
|
"dev": true
|
||||||
"peer": true
|
|
||||||
},
|
},
|
||||||
"node_modules/events": {
|
"node_modules/events": {
|
||||||
"version": "3.3.0",
|
"version": "3.3.0",
|
||||||
|
@ -9029,7 +9028,6 @@
|
||||||
"url": "https://github.com/sponsors/RubenVerborgh"
|
"url": "https://github.com/sponsors/RubenVerborgh"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"peer": true,
|
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=4.0"
|
"node": ">=4.0"
|
||||||
},
|
},
|
||||||
|
@ -9969,7 +9967,6 @@
|
||||||
"resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
|
"resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
|
||||||
"integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
|
"integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"eventemitter3": "^4.0.0",
|
"eventemitter3": "^4.0.0",
|
||||||
"follow-redirects": "^1.0.0",
|
"follow-redirects": "^1.0.0",
|
||||||
|
@ -9995,28 +9992,20 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/http-proxy-middleware": {
|
"node_modules/http-proxy-middleware": {
|
||||||
"version": "2.0.6",
|
"version": "3.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz",
|
"resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-3.0.0.tgz",
|
||||||
"integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==",
|
"integrity": "sha512-36AV1fIaI2cWRzHo+rbcxhe3M3jUDCNzc4D5zRl57sEWRAxdXYtw7FSQKYY6PDKssiAKjLYypbssHk+xs/kMXw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@types/http-proxy": "^1.17.8",
|
"@types/http-proxy": "^1.17.10",
|
||||||
|
"debug": "^4.3.4",
|
||||||
"http-proxy": "^1.18.1",
|
"http-proxy": "^1.18.1",
|
||||||
"is-glob": "^4.0.1",
|
"is-glob": "^4.0.1",
|
||||||
"is-plain-obj": "^3.0.0",
|
"is-plain-obj": "^3.0.0",
|
||||||
"micromatch": "^4.0.2"
|
"micromatch": "^4.0.5"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=12.0.0"
|
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
|
||||||
},
|
|
||||||
"peerDependencies": {
|
|
||||||
"@types/express": "^4.17.13"
|
|
||||||
},
|
|
||||||
"peerDependenciesMeta": {
|
|
||||||
"@types/express": {
|
|
||||||
"optional": true
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/https-proxy-agent": {
|
"node_modules/https-proxy-agent": {
|
||||||
|
@ -10480,7 +10469,6 @@
|
||||||
"resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz",
|
||||||
"integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==",
|
"integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"peer": true,
|
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=10"
|
"node": ">=10"
|
||||||
},
|
},
|
||||||
|
@ -16932,8 +16920,7 @@
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
|
||||||
"integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
|
"integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
|
||||||
"dev": true,
|
"dev": true
|
||||||
"peer": true
|
|
||||||
},
|
},
|
||||||
"node_modules/resolve": {
|
"node_modules/resolve": {
|
||||||
"version": "1.22.8",
|
"version": "1.22.8",
|
||||||
|
@ -19666,6 +19653,31 @@
|
||||||
"ajv": "^8.8.2"
|
"ajv": "^8.8.2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/webpack-dev-server/node_modules/http-proxy-middleware": {
|
||||||
|
"version": "2.0.6",
|
||||||
|
"resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz",
|
||||||
|
"integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==",
|
||||||
|
"dev": true,
|
||||||
|
"peer": true,
|
||||||
|
"dependencies": {
|
||||||
|
"@types/http-proxy": "^1.17.8",
|
||||||
|
"http-proxy": "^1.18.1",
|
||||||
|
"is-glob": "^4.0.1",
|
||||||
|
"is-plain-obj": "^3.0.0",
|
||||||
|
"micromatch": "^4.0.2"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=12.0.0"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"@types/express": "^4.17.13"
|
||||||
|
},
|
||||||
|
"peerDependenciesMeta": {
|
||||||
|
"@types/express": {
|
||||||
|
"optional": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/webpack-dev-server/node_modules/json-schema-traverse": {
|
"node_modules/webpack-dev-server/node_modules/json-schema-traverse": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
|
||||||
|
|
|
@ -71,6 +71,7 @@
|
||||||
"eslint": "^8.44.0",
|
"eslint": "^8.44.0",
|
||||||
"eslint-config-react-app": "^7.0.1",
|
"eslint-config-react-app": "^7.0.1",
|
||||||
"eslint-plugin-react": "^7.29.4",
|
"eslint-plugin-react": "^7.29.4",
|
||||||
|
"http-proxy-middleware": "^3.0.0",
|
||||||
"react-app-rewired": "^2.2.1",
|
"react-app-rewired": "^2.2.1",
|
||||||
"webpack": "^5.88.1"
|
"webpack": "^5.88.1"
|
||||||
},
|
},
|
||||||
|
|
|
@ -328,6 +328,7 @@ See also [increases_over_time](#increases_over_time).
|
||||||
|
|
||||||
`default_rollup(series_selector[d])` is a [rollup function](#rollup-functions), which returns the last [raw sample](https://docs.victoriametrics.com/keyconcepts/#raw-samples)
|
`default_rollup(series_selector[d])` is a [rollup function](#rollup-functions), which returns the last [raw sample](https://docs.victoriametrics.com/keyconcepts/#raw-samples)
|
||||||
value on the given lookbehind window `d` per each time series returned from the given [series_selector](https://docs.victoriametrics.com/keyconcepts/#filtering).
|
value on the given lookbehind window `d` per each time series returned from the given [series_selector](https://docs.victoriametrics.com/keyconcepts/#filtering).
|
||||||
|
Compared to [last_over_time](#last_over_time) it accounts for [staleness markers](https://docs.victoriametrics.com/vmagent/#prometheus-staleness-markers) to detect stale series.
|
||||||
|
|
||||||
If the lookbehind window is skipped in square brackets, then it is automatically calculated as `max(step, scrape_interval)`, where `step` is the query arg value
|
If the lookbehind window is skipped in square brackets, then it is automatically calculated as `max(step, scrape_interval)`, where `step` is the query arg value
|
||||||
passed to [/api/v1/query_range](https://docs.victoriametrics.com/keyconcepts/#range-query) or [/api/v1/query](https://docs.victoriametrics.com/keyconcepts/#instant-query),
|
passed to [/api/v1/query_range](https://docs.victoriametrics.com/keyconcepts/#range-query) or [/api/v1/query](https://docs.victoriametrics.com/keyconcepts/#instant-query),
|
||||||
|
|
|
@ -9,6 +9,9 @@ import useDeviceDetect from "../../hooks/useDeviceDetect";
|
||||||
import { useAppState } from "../../state/common/StateContext";
|
import { useAppState } from "../../state/common/StateContext";
|
||||||
import classNames from "classnames";
|
import classNames from "classnames";
|
||||||
import "./style.scss";
|
import "./style.scss";
|
||||||
|
import { useQueryState } from "../../state/query/QueryStateContext";
|
||||||
|
import { useTimeState } from "../../state/time/TimeStateContext";
|
||||||
|
import { getStepFromDuration } from "../../utils/time";
|
||||||
|
|
||||||
const AnomalyConfig: FC = () => {
|
const AnomalyConfig: FC = () => {
|
||||||
const { serverUrl } = useAppState();
|
const { serverUrl } = useAppState();
|
||||||
|
@ -20,6 +23,8 @@ const AnomalyConfig: FC = () => {
|
||||||
setFalse: setCloseModal,
|
setFalse: setCloseModal,
|
||||||
} = useBoolean(false);
|
} = useBoolean(false);
|
||||||
|
|
||||||
|
const { query } = useQueryState();
|
||||||
|
const { period } = useTimeState();
|
||||||
const [isLoading, setIsLoading] = useState(false);
|
const [isLoading, setIsLoading] = useState(false);
|
||||||
const [textConfig, setTextConfig] = useState<string>("");
|
const [textConfig, setTextConfig] = useState<string>("");
|
||||||
const [downloadUrl, setDownloadUrl] = useState<string>("");
|
const [downloadUrl, setDownloadUrl] = useState<string>("");
|
||||||
|
@ -28,15 +33,22 @@ const AnomalyConfig: FC = () => {
|
||||||
const fetchConfig = async () => {
|
const fetchConfig = async () => {
|
||||||
setIsLoading(true);
|
setIsLoading(true);
|
||||||
try {
|
try {
|
||||||
const url = `${serverUrl}/api/vmanomaly/config.yaml`;
|
const queryParam = encodeURIComponent(query[0] || "");
|
||||||
|
const stepParam = encodeURIComponent(period.step || getStepFromDuration(period.end - period.start, false));
|
||||||
|
|
||||||
|
const url = `${serverUrl}/api/vmanomaly/config.yaml?query=${queryParam}&step=${stepParam}`;
|
||||||
const response = await fetch(url);
|
const response = await fetch(url);
|
||||||
|
const contentType = response.headers.get("Content-Type");
|
||||||
if (!response.ok) {
|
if (!response.ok) {
|
||||||
setError(` ${response.status} ${response.statusText}`);
|
const bodyText = await response.text();
|
||||||
} else {
|
setError(` ${response.status} ${response.statusText}: ${bodyText}`);
|
||||||
|
} else if (contentType == "application/yaml") {
|
||||||
const blob = await response.blob();
|
const blob = await response.blob();
|
||||||
const yamlAsString = await blob.text();
|
const yamlAsString = await blob.text();
|
||||||
setTextConfig(yamlAsString);
|
setTextConfig(yamlAsString);
|
||||||
setDownloadUrl(URL.createObjectURL(blob));
|
setDownloadUrl(URL.createObjectURL(blob));
|
||||||
|
} else {
|
||||||
|
setError("Response Content-Type is not YAML, does `Server URL` point to VMAnomaly server?");
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error(error);
|
console.error(error);
|
||||||
|
|
|
@ -88,9 +88,11 @@ const Modal: FC<ModalProps> = ({
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
{/* tabIndex to fix Ctrl-A */}
|
||||||
<div
|
<div
|
||||||
className="vm-modal-content-body"
|
className="vm-modal-content-body"
|
||||||
onMouseDown={handleMouseDown}
|
onMouseDown={handleMouseDown}
|
||||||
|
tabIndex={0}
|
||||||
>
|
>
|
||||||
{children}
|
{children}
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -12,7 +12,7 @@ import { useTimeState } from "../state/time/TimeStateContext";
|
||||||
import { useCustomPanelState } from "../state/customPanel/CustomPanelStateContext";
|
import { useCustomPanelState } from "../state/customPanel/CustomPanelStateContext";
|
||||||
import { isHistogramData } from "../utils/metric";
|
import { isHistogramData } from "../utils/metric";
|
||||||
import { useGraphState } from "../state/graph/GraphStateContext";
|
import { useGraphState } from "../state/graph/GraphStateContext";
|
||||||
import { getSecondsFromDuration, getStepFromDuration } from "../utils/time";
|
import { getStepFromDuration } from "../utils/time";
|
||||||
import { AppType } from "../types/appType";
|
import { AppType } from "../types/appType";
|
||||||
|
|
||||||
interface FetchQueryParams {
|
interface FetchQueryParams {
|
||||||
|
@ -183,7 +183,7 @@ export const useFetchQuery = ({
|
||||||
setQueryErrors(expr.map(() => ErrorTypes.validQuery));
|
setQueryErrors(expr.map(() => ErrorTypes.validQuery));
|
||||||
} else if (isValidHttpUrl(serverUrl)) {
|
} else if (isValidHttpUrl(serverUrl)) {
|
||||||
const updatedPeriod = { ...period };
|
const updatedPeriod = { ...period };
|
||||||
updatedPeriod.step = isAnomalyUI ? `${getSecondsFromDuration(customStep)*1000}ms` : customStep;
|
updatedPeriod.step = customStep;
|
||||||
return expr.map(q => displayChart
|
return expr.map(q => displayChart
|
||||||
? getQueryRangeUrl(serverUrl, q, updatedPeriod, nocache, isTracingEnabled)
|
? getQueryRangeUrl(serverUrl, q, updatedPeriod, nocache, isTracingEnabled)
|
||||||
: getQueryUrl(serverUrl, q, updatedPeriod, nocache, isTracingEnabled));
|
: getQueryUrl(serverUrl, q, updatedPeriod, nocache, isTracingEnabled));
|
||||||
|
|
|
@ -87,7 +87,7 @@ const ExploreAnomaly: FC = () => {
|
||||||
setHideError={setHideError}
|
setHideError={setHideError}
|
||||||
stats={queryStats}
|
stats={queryStats}
|
||||||
onRunQuery={handleRunQuery}
|
onRunQuery={handleRunQuery}
|
||||||
hideButtons={{ addQuery: true, prettify: true, autocomplete: true, traceQuery: true, anomalyConfig: true }}
|
hideButtons={{ addQuery: true, prettify: false, autocomplete: false, traceQuery: true, anomalyConfig: true }}
|
||||||
/>
|
/>
|
||||||
{isLoading && <Spinner/>}
|
{isLoading && <Spinner/>}
|
||||||
{(!hideError && error) && <Alert variant="error">{error}</Alert>}
|
{(!hideError && error) && <Alert variant="error">{error}</Alert>}
|
||||||
|
|
|
@ -14,7 +14,7 @@ import { useTimeState } from "../../state/time/TimeStateContext";
|
||||||
import { getFromStorage, saveToStorage } from "../../utils/storage";
|
import { getFromStorage, saveToStorage } from "../../utils/storage";
|
||||||
|
|
||||||
const storageLimit = Number(getFromStorage("LOGS_LIMIT"));
|
const storageLimit = Number(getFromStorage("LOGS_LIMIT"));
|
||||||
const defaultLimit = isNaN(storageLimit) ? 1000 : storageLimit;
|
const defaultLimit = isNaN(storageLimit) ? 50 : storageLimit;
|
||||||
|
|
||||||
const ExploreLogs: FC = () => {
|
const ExploreLogs: FC = () => {
|
||||||
const { serverUrl } = useAppState();
|
const { serverUrl } = useAppState();
|
||||||
|
@ -22,7 +22,7 @@ const ExploreLogs: FC = () => {
|
||||||
const { setSearchParamsFromKeys } = useSearchParamsFromObject();
|
const { setSearchParamsFromKeys } = useSearchParamsFromObject();
|
||||||
|
|
||||||
const [limit, setLimit] = useStateSearchParams(defaultLimit, "limit");
|
const [limit, setLimit] = useStateSearchParams(defaultLimit, "limit");
|
||||||
const [query, setQuery] = useStateSearchParams("", "query");
|
const [query, setQuery] = useStateSearchParams("*", "query");
|
||||||
const { logs, isLoading, error, fetchLogs } = useFetchLogs(serverUrl, query, limit);
|
const { logs, isLoading, error, fetchLogs } = useFetchLogs(serverUrl, query, limit);
|
||||||
const [queryError, setQueryError] = useState<ErrorTypes | string>("");
|
const [queryError, setQueryError] = useState<ErrorTypes | string>("");
|
||||||
const [loaded, isLoaded] = useState(false);
|
const [loaded, isLoaded] = useState(false);
|
||||||
|
|
|
@ -13,7 +13,8 @@ import useSearchParamsFromObject from "../../../hooks/useSearchParamsFromObject"
|
||||||
import TableSettings from "../../../components/Table/TableSettings/TableSettings";
|
import TableSettings from "../../../components/Table/TableSettings/TableSettings";
|
||||||
import useBoolean from "../../../hooks/useBoolean";
|
import useBoolean from "../../../hooks/useBoolean";
|
||||||
import TableLogs from "./TableLogs";
|
import TableLogs from "./TableLogs";
|
||||||
import GroupLogs from "./GroupLogs";
|
import GroupLogs from "../GroupLogs/GroupLogs";
|
||||||
|
import { DATE_TIME_FORMAT } from "../../../constants/date";
|
||||||
|
|
||||||
export interface ExploreLogBodyProps {
|
export interface ExploreLogBodyProps {
|
||||||
data: Logs[];
|
data: Logs[];
|
||||||
|
@ -42,14 +43,14 @@ const ExploreLogsBody: FC<ExploreLogBodyProps> = ({ data, loaded }) => {
|
||||||
const { value: tableCompact, toggle: toggleTableCompact } = useBoolean(false);
|
const { value: tableCompact, toggle: toggleTableCompact } = useBoolean(false);
|
||||||
|
|
||||||
const logs = useMemo(() => data.map((item) => ({
|
const logs = useMemo(() => data.map((item) => ({
|
||||||
time: dayjs(item._time).tz().format("MMM DD, YYYY \nHH:mm:ss.SSS"),
|
|
||||||
data: JSON.stringify(item, null, 2),
|
|
||||||
...item,
|
...item,
|
||||||
|
_vmui_time: item._time ? dayjs(item._time).tz().format(`${DATE_TIME_FORMAT}.SSS`) : "",
|
||||||
|
_vmui_data: JSON.stringify(item, null, 2),
|
||||||
})) as Logs[], [data, timezone]);
|
})) as Logs[], [data, timezone]);
|
||||||
|
|
||||||
const columns = useMemo(() => {
|
const columns = useMemo(() => {
|
||||||
if (!logs?.length) return [];
|
if (!logs?.length) return [];
|
||||||
const hideColumns = ["data", "_time"];
|
const hideColumns = ["_vmui_data", "_vmui_time"];
|
||||||
const keys = new Set<string>();
|
const keys = new Set<string>();
|
||||||
for (const item of logs) {
|
for (const item of logs) {
|
||||||
for (const key in item) {
|
for (const key in item) {
|
||||||
|
|
|
@ -1,65 +0,0 @@
|
||||||
import React, { FC, useMemo } from "preact/compat";
|
|
||||||
import "./style.scss";
|
|
||||||
import { Logs } from "../../../api/types";
|
|
||||||
import Accordion from "../../../components/Main/Accordion/Accordion";
|
|
||||||
import { groupByMultipleKeys } from "../../../utils/array";
|
|
||||||
|
|
||||||
interface TableLogsProps {
|
|
||||||
logs: Logs[];
|
|
||||||
columns: string[];
|
|
||||||
}
|
|
||||||
|
|
||||||
const GroupLogs: FC<TableLogsProps> = ({ logs, columns }) => {
|
|
||||||
|
|
||||||
const groupData = useMemo(() => {
|
|
||||||
const excludeColumns = ["_msg", "time", "data", "_time"];
|
|
||||||
const keys = columns.filter((c) => !excludeColumns.includes(c as string));
|
|
||||||
return groupByMultipleKeys(logs, keys);
|
|
||||||
}, [logs]);
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div className="vm-explore-logs-body-content">
|
|
||||||
{groupData.map((item) => (
|
|
||||||
<div
|
|
||||||
className="vm-explore-logs-body-content-group"
|
|
||||||
key={item.keys.join("")}
|
|
||||||
>
|
|
||||||
<Accordion
|
|
||||||
defaultExpanded={true}
|
|
||||||
title={(
|
|
||||||
<div className="vm-explore-logs-body-content-group-keys">
|
|
||||||
<span className="vm-explore-logs-body-content-group-keys__title">Group by:</span>
|
|
||||||
{item.keys.map((key) => (
|
|
||||||
<div
|
|
||||||
className="vm-explore-logs-body-content-group-keys__key"
|
|
||||||
key={key}
|
|
||||||
>
|
|
||||||
{key}
|
|
||||||
</div>
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
>
|
|
||||||
<div className="vm-explore-logs-body-content-group-rows">
|
|
||||||
{item.values.map((value) => (
|
|
||||||
<div
|
|
||||||
className="vm-explore-logs-body-content-group-rows-item"
|
|
||||||
key={`${value._msg}${value._time}`}
|
|
||||||
>
|
|
||||||
<div className="vm-explore-logs-body-content-group-rows-item__time">
|
|
||||||
{value.time}
|
|
||||||
</div>
|
|
||||||
<div className="vm-explore-logs-body-content-group-rows-item__msg">
|
|
||||||
{value._msg}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
</Accordion>
|
|
||||||
</div>
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
export default GroupLogs;
|
|
|
@ -13,9 +13,9 @@ interface TableLogsProps {
|
||||||
const TableLogs: FC<TableLogsProps> = ({ logs, displayColumns, tableCompact, columns }) => {
|
const TableLogs: FC<TableLogsProps> = ({ logs, displayColumns, tableCompact, columns }) => {
|
||||||
const getColumnClass = (key: string) => {
|
const getColumnClass = (key: string) => {
|
||||||
switch (key) {
|
switch (key) {
|
||||||
case "time":
|
case "_time":
|
||||||
return "vm-table-cell_logs-time";
|
return "vm-table-cell_logs-time";
|
||||||
case "data":
|
case "_vmui_data":
|
||||||
return "vm-table-cell_logs vm-table-cell_pre";
|
return "vm-table-cell_logs vm-table-cell_pre";
|
||||||
default:
|
default:
|
||||||
return "vm-table-cell_logs";
|
return "vm-table-cell_logs";
|
||||||
|
@ -25,9 +25,9 @@ const TableLogs: FC<TableLogsProps> = ({ logs, displayColumns, tableCompact, col
|
||||||
const tableColumns = useMemo(() => {
|
const tableColumns = useMemo(() => {
|
||||||
if (tableCompact) {
|
if (tableCompact) {
|
||||||
return [{
|
return [{
|
||||||
key: "data",
|
key: "_vmui_data",
|
||||||
title: "Data",
|
title: "Data",
|
||||||
className: getColumnClass("data")
|
className: getColumnClass("_vmui_data")
|
||||||
}];
|
}];
|
||||||
}
|
}
|
||||||
return columns.map((key) => ({
|
return columns.map((key) => ({
|
||||||
|
@ -48,8 +48,8 @@ const TableLogs: FC<TableLogsProps> = ({ logs, displayColumns, tableCompact, col
|
||||||
<Table
|
<Table
|
||||||
rows={logs}
|
rows={logs}
|
||||||
columns={filteredColumns}
|
columns={filteredColumns}
|
||||||
defaultOrderBy={"time"}
|
defaultOrderBy={"_vmui_time"}
|
||||||
copyToClipboard={"data"}
|
copyToClipboard={"_vmui_data"}
|
||||||
paginationOffset={{ startIndex: 0, endIndex: Infinity }}
|
paginationOffset={{ startIndex: 0, endIndex: Infinity }}
|
||||||
/>
|
/>
|
||||||
</>
|
</>
|
||||||
|
|
|
@ -41,54 +41,4 @@
|
||||||
min-width: 700px;
|
min-width: 700px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&-content {
|
|
||||||
&-group {
|
|
||||||
|
|
||||||
&-keys {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
gap: $padding-small;
|
|
||||||
border-bottom: $border-divider;
|
|
||||||
padding: $padding-global 0;
|
|
||||||
|
|
||||||
&__title {
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
|
|
||||||
&__key {
|
|
||||||
padding: 4px 12px;
|
|
||||||
background-color: $color-primary;
|
|
||||||
color: $color-primary-text;
|
|
||||||
border-radius: $border-radius-small;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&-rows {
|
|
||||||
display: grid;
|
|
||||||
|
|
||||||
&-item {
|
|
||||||
display: grid;
|
|
||||||
grid-template-columns: 107px 1fr;
|
|
||||||
gap: $padding-small;
|
|
||||||
padding: $padding-global 0;
|
|
||||||
border-bottom: $border-divider;
|
|
||||||
|
|
||||||
&__time {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
line-height: 1.3;
|
|
||||||
}
|
|
||||||
|
|
||||||
&__msg {
|
|
||||||
font-family: $font-family-monospace;
|
|
||||||
overflow-wrap: anywhere;
|
|
||||||
line-height: 1.1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,90 @@
|
||||||
|
import React, { FC, useEffect, useMemo } from "preact/compat";
|
||||||
|
import { MouseEvent, useState } from "react";
|
||||||
|
import "./style.scss";
|
||||||
|
import { Logs } from "../../../api/types";
|
||||||
|
import Accordion from "../../../components/Main/Accordion/Accordion";
|
||||||
|
import { groupByMultipleKeys } from "../../../utils/array";
|
||||||
|
import Tooltip from "../../../components/Main/Tooltip/Tooltip";
|
||||||
|
import useCopyToClipboard from "../../../hooks/useCopyToClipboard";
|
||||||
|
import GroupLogsItem from "./GroupLogsItem";
|
||||||
|
|
||||||
|
interface TableLogsProps {
|
||||||
|
logs: Logs[];
|
||||||
|
columns: string[];
|
||||||
|
}
|
||||||
|
|
||||||
|
const GroupLogs: FC<TableLogsProps> = ({ logs }) => {
|
||||||
|
const copyToClipboard = useCopyToClipboard();
|
||||||
|
|
||||||
|
const [copied, setCopied] = useState<string | null>(null);
|
||||||
|
|
||||||
|
const groupData = useMemo(() => {
|
||||||
|
return groupByMultipleKeys(logs, ["_stream"]).map((item) => {
|
||||||
|
const streamValue = item.values[0]?._stream || "";
|
||||||
|
const pairs = streamValue.slice(1, -1).match(/(?:[^\\,]+|\\,)+?(?=,|$)/g) || [streamValue];
|
||||||
|
return {
|
||||||
|
...item,
|
||||||
|
pairs: pairs.filter(Boolean),
|
||||||
|
};
|
||||||
|
});
|
||||||
|
}, [logs]);
|
||||||
|
|
||||||
|
const handleClickByPair = (pair: string) => async (e: MouseEvent<HTMLDivElement>) => {
|
||||||
|
e.stopPropagation();
|
||||||
|
const isCopied = await copyToClipboard(`${pair}`);
|
||||||
|
if (isCopied) {
|
||||||
|
setCopied(pair);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (copied === null) return;
|
||||||
|
const timeout = setTimeout(() => setCopied(null), 2000);
|
||||||
|
return () => clearTimeout(timeout);
|
||||||
|
}, [copied]);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="vm-group-logs">
|
||||||
|
{groupData.map((item) => (
|
||||||
|
<div
|
||||||
|
className="vm-group-logs-section"
|
||||||
|
key={item.keys.join("")}
|
||||||
|
>
|
||||||
|
<Accordion
|
||||||
|
defaultExpanded={true}
|
||||||
|
title={(
|
||||||
|
<div className="vm-group-logs-section-keys">
|
||||||
|
<span className="vm-group-logs-section-keys__title">Group by _stream:</span>
|
||||||
|
{item.pairs.map((pair) => (
|
||||||
|
<Tooltip
|
||||||
|
title={copied === pair ? "Copied" : "Copy to clipboard"}
|
||||||
|
key={`${item.keys.join("")}_${pair}`}
|
||||||
|
placement={"top-center"}
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
className="vm-group-logs-section-keys__pair"
|
||||||
|
onClick={handleClickByPair(pair)}
|
||||||
|
>
|
||||||
|
{pair}
|
||||||
|
</div>
|
||||||
|
</Tooltip>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
>
|
||||||
|
<div className="vm-group-logs-section-rows">
|
||||||
|
{item.values.map((value) => (
|
||||||
|
<GroupLogsItem
|
||||||
|
key={`${value._msg}${value._time}`}
|
||||||
|
log={value}
|
||||||
|
/>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</Accordion>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default GroupLogs;
|
|
@ -0,0 +1,113 @@
|
||||||
|
import React, { FC, useEffect, useState } from "preact/compat";
|
||||||
|
import { Logs } from "../../../api/types";
|
||||||
|
import "./style.scss";
|
||||||
|
import useBoolean from "../../../hooks/useBoolean";
|
||||||
|
import Button from "../../../components/Main/Button/Button";
|
||||||
|
import Tooltip from "../../../components/Main/Tooltip/Tooltip";
|
||||||
|
import { ArrowDropDownIcon, CopyIcon } from "../../../components/Main/Icons";
|
||||||
|
import useCopyToClipboard from "../../../hooks/useCopyToClipboard";
|
||||||
|
import classNames from "classnames";
|
||||||
|
|
||||||
|
interface Props {
|
||||||
|
log: Logs;
|
||||||
|
}
|
||||||
|
|
||||||
|
const GroupLogsItem: FC<Props> = ({ log }) => {
|
||||||
|
const {
|
||||||
|
value: isOpenFields,
|
||||||
|
toggle: toggleOpenFields,
|
||||||
|
} = useBoolean(false);
|
||||||
|
|
||||||
|
const excludeKeys = ["_stream", "_msg", "_time", "_vmui_time", "_vmui_data"];
|
||||||
|
const fields = Object.entries(log).filter(([key]) => !excludeKeys.includes(key));
|
||||||
|
const hasFields = fields.length > 0;
|
||||||
|
|
||||||
|
const copyToClipboard = useCopyToClipboard();
|
||||||
|
const [copied, setCopied] = useState<number | null>(null);
|
||||||
|
|
||||||
|
const createCopyHandler = (copyValue: string, rowIndex: number) => async () => {
|
||||||
|
if (copied === rowIndex) return;
|
||||||
|
try {
|
||||||
|
await copyToClipboard(copyValue);
|
||||||
|
setCopied(rowIndex);
|
||||||
|
} catch (e) {
|
||||||
|
console.error(e);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (copied === null) return;
|
||||||
|
const timeout = setTimeout(() => setCopied(null), 2000);
|
||||||
|
return () => clearTimeout(timeout);
|
||||||
|
}, [copied]);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="vm-group-logs-row">
|
||||||
|
<div
|
||||||
|
className="vm-group-logs-row-content"
|
||||||
|
onClick={toggleOpenFields}
|
||||||
|
key={`${log._msg}${log._time}`}
|
||||||
|
>
|
||||||
|
{hasFields && (
|
||||||
|
<div
|
||||||
|
className={classNames({
|
||||||
|
"vm-group-logs-row-content__arrow": true,
|
||||||
|
"vm-group-logs-row-content__arrow_open": isOpenFields,
|
||||||
|
})}
|
||||||
|
>
|
||||||
|
<ArrowDropDownIcon/>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
<div
|
||||||
|
className={classNames({
|
||||||
|
"vm-group-logs-row-content__time": true,
|
||||||
|
"vm-group-logs-row-content__time_missing": !log._vmui_time
|
||||||
|
})}
|
||||||
|
>
|
||||||
|
{log._vmui_time || "timestamp missing"}
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
className={classNames({
|
||||||
|
"vm-group-logs-row-content__msg": true,
|
||||||
|
"vm-group-logs-row-content__msg_missing": !log._msg
|
||||||
|
})}
|
||||||
|
>
|
||||||
|
{log._msg || "message missing"}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{hasFields && isOpenFields && (
|
||||||
|
<div className="vm-group-logs-row-fields">
|
||||||
|
<table>
|
||||||
|
<tbody>
|
||||||
|
{fields.map(([key, value], i) => (
|
||||||
|
<tr
|
||||||
|
key={key}
|
||||||
|
className="vm-group-logs-row-fields-item"
|
||||||
|
>
|
||||||
|
<td className="vm-group-logs-row-fields-item-controls">
|
||||||
|
<div className="vm-group-logs-row-fields-item-controls__wrapper">
|
||||||
|
<Tooltip title={copied === i ? "Copied" : "Copy to clipboard"}>
|
||||||
|
<Button
|
||||||
|
variant="text"
|
||||||
|
color="gray"
|
||||||
|
size="small"
|
||||||
|
startIcon={<CopyIcon/>}
|
||||||
|
onClick={createCopyHandler(`${key}: ${value}`, i)}
|
||||||
|
ariaLabel="copy to clipboard"
|
||||||
|
/>
|
||||||
|
</Tooltip>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
<td className="vm-group-logs-row-fields-item__key">{key}</td>
|
||||||
|
<td className="vm-group-logs-row-fields-item__value">{value}</td>
|
||||||
|
</tr>
|
||||||
|
))}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default GroupLogsItem;
|
|
@ -0,0 +1,148 @@
|
||||||
|
@use "src/styles/variables" as *;
|
||||||
|
|
||||||
|
.vm-group-logs {
|
||||||
|
margin-top: calc(-1 * $padding-medium);
|
||||||
|
|
||||||
|
&-section {
|
||||||
|
&-keys {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
gap: $padding-small;
|
||||||
|
border-bottom: $border-divider;
|
||||||
|
padding: $padding-small 0;
|
||||||
|
|
||||||
|
&__title {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
&__pair {
|
||||||
|
padding: calc($padding-global / 2) $padding-global;
|
||||||
|
background-color: lighten($color-tropical-blue, 6%);
|
||||||
|
color: darken($color-dodger-blue, 20%);
|
||||||
|
border-radius: $border-radius-medium;
|
||||||
|
transition: background-color 0.3s ease-in, transform 0.1s ease-in;;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background-color: $color-tropical-blue;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:active {
|
||||||
|
transform: translate(0, 3px);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&-rows {
|
||||||
|
display: grid;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&-row {
|
||||||
|
position: relative;
|
||||||
|
border-bottom: $border-divider;
|
||||||
|
|
||||||
|
&-content {
|
||||||
|
position: relative;
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: minmax(180px, max-content) 1fr;
|
||||||
|
gap: $padding-small;
|
||||||
|
padding: $padding-global;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: background-color 0.2s ease-in;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background-color: $color-hover-black;
|
||||||
|
}
|
||||||
|
|
||||||
|
&__arrow {
|
||||||
|
position: absolute;
|
||||||
|
top: $padding-global;
|
||||||
|
left: 0;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
width: 14px;
|
||||||
|
height: 14px;
|
||||||
|
transform: rotate(-90deg);
|
||||||
|
transition: transform 0.2s ease-out;
|
||||||
|
|
||||||
|
&_open {
|
||||||
|
transform: rotate(0deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&__time {
|
||||||
|
display: flex;
|
||||||
|
align-items: flex-start;
|
||||||
|
justify-content: flex-end;
|
||||||
|
line-height: 1;
|
||||||
|
white-space: nowrap;
|
||||||
|
|
||||||
|
&_missing {
|
||||||
|
color: $color-text-disabled;
|
||||||
|
font-style: italic;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&__msg {
|
||||||
|
font-family: $font-family-monospace;
|
||||||
|
overflow-wrap: anywhere;
|
||||||
|
line-height: 1.1;
|
||||||
|
|
||||||
|
&_missing {
|
||||||
|
color: $color-text-disabled;
|
||||||
|
font-style: italic;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&-fields {
|
||||||
|
grid-row: 2;
|
||||||
|
padding: $padding-small 0;
|
||||||
|
margin-bottom: $padding-small;
|
||||||
|
border: $border-divider;
|
||||||
|
border-radius: $border-radius-small;
|
||||||
|
overflow: auto;
|
||||||
|
max-height: 300px;
|
||||||
|
|
||||||
|
&-item {
|
||||||
|
border-radius: $border-radius-small;
|
||||||
|
transition: background-color 0.2s ease-in;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background-color: $color-hover-black;
|
||||||
|
}
|
||||||
|
|
||||||
|
&-controls {
|
||||||
|
padding: 0;
|
||||||
|
|
||||||
|
&__wrapper {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&__key,
|
||||||
|
&__value {
|
||||||
|
vertical-align: top;
|
||||||
|
padding: calc($padding-small / 2) $padding-global;
|
||||||
|
}
|
||||||
|
|
||||||
|
&__key {
|
||||||
|
overflow-wrap: break-word;
|
||||||
|
width: max-content;
|
||||||
|
}
|
||||||
|
|
||||||
|
&__value {
|
||||||
|
width: 100%;
|
||||||
|
word-break: break-all;
|
||||||
|
white-space: pre-wrap;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
11
app/vmui/packages/vmui/src/setupProxy.js
Normal file
11
app/vmui/packages/vmui/src/setupProxy.js
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
const { createProxyMiddleware } = require('http-proxy-middleware');
|
||||||
|
|
||||||
|
module.exports = function (app) {
|
||||||
|
app.use(
|
||||||
|
"/api",
|
||||||
|
createProxyMiddleware({
|
||||||
|
target: "http://localhost:8490/api",
|
||||||
|
changeOrigin: true,
|
||||||
|
})
|
||||||
|
);
|
||||||
|
};
|
|
@ -78,13 +78,15 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
&_logs-time {
|
&_logs-time {
|
||||||
white-space: pre;
|
white-space: nowrap;
|
||||||
overflow-wrap: normal;
|
overflow-wrap: normal;
|
||||||
}
|
}
|
||||||
|
|
||||||
&_logs {
|
&_logs {
|
||||||
font-family: $font-family-monospace;
|
font-family: $font-family-monospace;
|
||||||
line-height: 1.2;
|
line-height: 1.2;
|
||||||
|
width: 100%;
|
||||||
|
overflow-wrap: normal;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,7 @@ import dayjs, { UnitTypeShort } from "dayjs";
|
||||||
import { getQueryStringValue } from "./query-string";
|
import { getQueryStringValue } from "./query-string";
|
||||||
import { DATE_ISO_FORMAT } from "../constants/date";
|
import { DATE_ISO_FORMAT } from "../constants/date";
|
||||||
import timezones from "../constants/timezones";
|
import timezones from "../constants/timezones";
|
||||||
|
import { AppType } from "../types/appType";
|
||||||
|
|
||||||
const MAX_ITEMS_PER_CHART = window.innerWidth / 4;
|
const MAX_ITEMS_PER_CHART = window.innerWidth / 4;
|
||||||
const MAX_ITEMS_PER_HISTOGRAM = window.innerWidth / 40;
|
const MAX_ITEMS_PER_HISTOGRAM = window.innerWidth / 40;
|
||||||
|
@ -34,7 +35,7 @@ export const humanizeSeconds = (num: number): string => {
|
||||||
return getDurationFromMilliseconds(dayjs.duration(num, "seconds").asMilliseconds());
|
return getDurationFromMilliseconds(dayjs.duration(num, "seconds").asMilliseconds());
|
||||||
};
|
};
|
||||||
|
|
||||||
export const roundStep = (step: number) => {
|
export const roundStep = (step: number): string => {
|
||||||
let result = roundToMilliseconds(step);
|
let result = roundToMilliseconds(step);
|
||||||
const integerStep = Math.round(step);
|
const integerStep = Math.round(step);
|
||||||
|
|
||||||
|
@ -87,7 +88,7 @@ export const getSecondsFromDuration = (dur: string) => {
|
||||||
return dayjs.duration(durObject).asSeconds();
|
return dayjs.duration(durObject).asSeconds();
|
||||||
};
|
};
|
||||||
|
|
||||||
export const getStepFromDuration = (dur: number, histogram?: boolean) => {
|
export const getStepFromDuration = (dur: number, histogram?: boolean): string => {
|
||||||
const size = histogram ? MAX_ITEMS_PER_HISTOGRAM : MAX_ITEMS_PER_CHART;
|
const size = histogram ? MAX_ITEMS_PER_HISTOGRAM : MAX_ITEMS_PER_CHART;
|
||||||
return roundStep(dur / size);
|
return roundStep(dur / size);
|
||||||
};
|
};
|
||||||
|
@ -159,10 +160,11 @@ export const dateFromSeconds = (epochTimeInSeconds: number): Date => {
|
||||||
const getYesterday = () => dayjs().tz().subtract(1, "day").endOf("day").toDate();
|
const getYesterday = () => dayjs().tz().subtract(1, "day").endOf("day").toDate();
|
||||||
const getToday = () => dayjs().tz().endOf("day").toDate();
|
const getToday = () => dayjs().tz().endOf("day").toDate();
|
||||||
|
|
||||||
|
const isLogsApp = process.env.REACT_APP_TYPE === AppType.logs;
|
||||||
export const relativeTimeOptions: RelativeTimeOption[] = [
|
export const relativeTimeOptions: RelativeTimeOption[] = [
|
||||||
{ title: "Last 5 minutes", duration: "5m" },
|
{ title: "Last 5 minutes", duration: "5m", isDefault: isLogsApp },
|
||||||
{ title: "Last 15 minutes", duration: "15m" },
|
{ title: "Last 15 minutes", duration: "15m" },
|
||||||
{ title: "Last 30 minutes", duration: "30m", isDefault: true },
|
{ title: "Last 30 minutes", duration: "30m", isDefault: !isLogsApp },
|
||||||
{ title: "Last 1 hour", duration: "1h" },
|
{ title: "Last 1 hour", duration: "1h" },
|
||||||
{ title: "Last 3 hours", duration: "3h" },
|
{ title: "Last 3 hours", duration: "3h" },
|
||||||
{ title: "Last 6 hours", duration: "6h" },
|
{ title: "Last 6 hours", duration: "6h" },
|
||||||
|
|
|
@ -19,6 +19,7 @@ according to [these docs](https://docs.victoriametrics.com/victorialogs/quicksta
|
||||||
|
|
||||||
## tip
|
## tip
|
||||||
|
|
||||||
|
* FEATURE: [web UI](https://docs.victoriametrics.com/victorialogs/querying/#web-ui): improve displaying of logs. See [this pull request](https://github.com/VictoriaMetrics/VictoriaMetrics/pull/6419) and the following issues: [6408](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/6408), [6405](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/6405), [6406](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/6406) and [6407](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/6407).
|
||||||
* FEATURE: add support for [day range filter](https://docs.victoriametrics.com/victorialogs/logsql/#day-range-filter) and [week range filter](https://docs.victoriametrics.com/victorialogs/logsql/#week-range-filter). These filters allow selecting logs on a particular time range per every day or on a particular day of the week.
|
* FEATURE: add support for [day range filter](https://docs.victoriametrics.com/victorialogs/logsql/#day-range-filter) and [week range filter](https://docs.victoriametrics.com/victorialogs/logsql/#week-range-filter). These filters allow selecting logs on a particular time range per every day or on a particular day of the week.
|
||||||
* FEATURE: allow using `eval` instead of `math` keyword in [`math` pipe](https://docs.victoriametrics.com/victorialogs/logsql/#math-pipe).
|
* FEATURE: allow using `eval` instead of `math` keyword in [`math` pipe](https://docs.victoriametrics.com/victorialogs/logsql/#math-pipe).
|
||||||
|
|
||||||
|
|
|
@ -130,7 +130,7 @@ aliases:
|
||||||
- [operator](./README.md): adds new `status.updateStatus` field to the all objects with pods. It helps to track rollout updates properly.
|
- [operator](./README.md): adds new `status.updateStatus` field to the all objects with pods. It helps to track rollout updates properly.
|
||||||
- [operator](./README.md): adds annotation `operator.victoriametrics/last-applied-spec` to all objects with pods. It helps to track changes and implements proper resource deletion later as part of [issue](https://github.com/VictoriaMetrics/operator/issues/758).
|
- [operator](./README.md): adds annotation `operator.victoriametrics/last-applied-spec` to all objects with pods. It helps to track changes and implements proper resource deletion later as part of [issue](https://github.com/VictoriaMetrics/operator/issues/758).
|
||||||
- [vmagent](./api.md#vmagent): adds `flush_on_shutdown` to the streamAggrConfig. See this [issue](https://github.com/VictoriaMetrics/operator/issues/860) for details.
|
- [vmagent](./api.md#vmagent): adds `flush_on_shutdown` to the streamAggrConfig. See this [issue](https://github.com/VictoriaMetrics/operator/issues/860) for details.
|
||||||
- [vmagent](./api.md#vmagent): adds `spec.ingestOnlyMode` experimental field. It switches vmagent into special mode without scrape configuration and config-reloaders. Currently it also disables tls and auth options for remoteWrites, it must be addressed at the next release.
|
- [vmagent](./api.md#vmagent): adds `spec.ingestOnlyMode` experimental field. It switches vmagent into special mode without scrape configuration and config-reloaders. Currently it also disables tls and auth options for remoteWrites, it must be addressed at the next releaes.
|
||||||
- [vmalertmanager](./api.html#vmalertmanager): use `blackhole` as default router if not configuration provided instead of dummy webhook. 9ee567ff9bc93f43dfedcf9361be1be54a5e7597
|
- [vmalertmanager](./api.html#vmalertmanager): use `blackhole` as default router if not configuration provided instead of dummy webhook. 9ee567ff9bc93f43dfedcf9361be1be54a5e7597
|
||||||
- [vmalertmanager](./api.html#vmalertmanager): properly assign path for templates, if it's configured at config file and defined via `spec.templates`. 1128fa9e152a52c7a566fe7ac1375fefbfc6b276
|
- [vmalertmanager](./api.html#vmalertmanager): properly assign path for templates, if it's configured at config file and defined via `spec.templates`. 1128fa9e152a52c7a566fe7ac1375fefbfc6b276
|
||||||
- [vmauth](./api.html#vmauth): adds new field `spec.configSecret`, which allows to use vmauth with external configuration stored at secret under `config.yaml` key. Configuration changes can be tracked with extraArgs: `configCheckInterval: 10s` or manually defined config-reloader container.
|
- [vmauth](./api.html#vmauth): adds new field `spec.configSecret`, which allows to use vmauth with external configuration stored at secret under `config.yaml` key. Configuration changes can be tracked with extraArgs: `configCheckInterval: 10s` or manually defined config-reloader container.
|
||||||
|
@ -442,7 +442,7 @@ aliases:
|
||||||
### Fixes
|
### Fixes
|
||||||
|
|
||||||
- vmalertmanagerconfig: properly build `name` setting for `mute_time_intervals`. It must be uniq https://github.com/VictoriaMetrics/operator/commit/4db1c89abd5360a119e68874d51c27872265acb6
|
- vmalertmanagerconfig: properly build `name` setting for `mute_time_intervals`. It must be uniq https://github.com/VictoriaMetrics/operator/commit/4db1c89abd5360a119e68874d51c27872265acb6
|
||||||
- vmcluster: add `dedupMinScrape` only if replicationFactor > 1. It must improve overall cluster performance. Thanks [@hagen1778](https://github.com/hagen1778) https://github.com/VictoriaMetrics/operator/commit/837d6e71c6298e5a44c3f73f85235560aec4ee60
|
- vmcluster: add `dedupMinScrape` only if replicationFactor > 1. It must improve overall cluster perfomance. Thanks [@hagen1778](https://github.com/hagen1778) https://github.com/VictoriaMetrics/operator/commit/837d6e71c6298e5a44c3f73f85235560aec4ee60
|
||||||
- controllers/vmalert: do not delete annotations from created secret. Thanks [@zoetrope](https://github.com/zoetrope) https://github.com/VictoriaMetrics/operator/pull/588
|
- controllers/vmalert: do not delete annotations from created secret. Thanks [@zoetrope](https://github.com/zoetrope) https://github.com/VictoriaMetrics/operator/pull/588
|
||||||
|
|
||||||
### Features
|
### Features
|
||||||
|
@ -486,12 +486,12 @@ aliases:
|
||||||
- dependency: upgrade deps for fs-notify https://github.com/VictoriaMetrics/operator/pull/576 Thanks [@yanggangtony](https://github.com/yanggangtony)
|
- dependency: upgrade deps for fs-notify https://github.com/VictoriaMetrics/operator/pull/576 Thanks [@yanggangtony](https://github.com/yanggangtony)
|
||||||
- controllers/options: fixes incorrectly used flags at options https://github.com/VictoriaMetrics/operator/commit/eac040c947ab4821bf6eb0eeae22b9b2d02b938c
|
- controllers/options: fixes incorrectly used flags at options https://github.com/VictoriaMetrics/operator/commit/eac040c947ab4821bf6eb0eeae22b9b2d02b938c
|
||||||
- controllers/self-serviceScrape: prevents matching for auto-created serviceScrapes https://github.com/VictoriaMetrics/operator/issues/578
|
- controllers/self-serviceScrape: prevents matching for auto-created serviceScrapes https://github.com/VictoriaMetrics/operator/issues/578
|
||||||
- controllers/vmauth: fixes missing owns for serviceScrape https://github.com/VictoriaMetrics/operator/issues/579
|
- controllers/vmauth: fixes missing ows for serviceScrape https://github.com/VictoriaMetrics/operator/issues/579
|
||||||
|
|
||||||
### Features
|
### Features
|
||||||
|
|
||||||
- adds `/ready` and `/health` api endpoints for probes https://github.com/VictoriaMetrics/operator/commit/b74d103998547fae5e69966bb68eddd08ae1ac00
|
- adds `/ready` and `/health` api endpoints for probes https://github.com/VictoriaMetrics/operator/commit/b74d103998547fae5e69966bb68eddd08ae1ac00
|
||||||
- controllers/concurrency: introduce new setting for reconciliation concurrency `controller.maxConcurrentReconciles` https://github.com/VictoriaMetrics/operator/commit/e8bbf9159cd61257d11e515fa77510ab2444a557 https://github.com/VictoriaMetrics/operator/issues/575
|
- controllers/concurrency: introduce new setting for reconcilation concurrency `controller.maxConcurrentReconciles` https://github.com/VictoriaMetrics/operator/commit/e8bbf9159cd61257d11e515fa77510ab2444a557 https://github.com/VictoriaMetrics/operator/issues/575
|
||||||
- api/relabelConfig: adds missing `if`, `labels` and `match` actions https://github.com/VictoriaMetrics/operator/commit/93c9e780981ceb6869ee2953056a9bd3b6e6eae7
|
- api/relabelConfig: adds missing `if`, `labels` and `match` actions https://github.com/VictoriaMetrics/operator/commit/93c9e780981ceb6869ee2953056a9bd3b6e6eae7
|
||||||
|
|
||||||
[Changes][v0.30.1]
|
[Changes][v0.30.1]
|
||||||
|
@ -564,7 +564,7 @@ aliases:
|
||||||
|
|
||||||
### Features
|
### Features
|
||||||
|
|
||||||
* PodDisruptionBudget: adds configurable selectors https://github.com/VictoriaMetrics/operator/commit/4f3f5eaf29ad85c6e9b142be5b05ef57b962fcb6
|
* podDistruptionBudget: adds configurable selectors https://github.com/VictoriaMetrics/operator/commit/4f3f5eaf29ad85c6e9b142be5b05ef57b962fcb6
|
||||||
|
|
||||||
### New Contributors
|
### New Contributors
|
||||||
|
|
||||||
|
@ -730,7 +730,7 @@ aliases:
|
||||||
|
|
||||||
* security: new alpine image with security fixes https://github.com/VictoriaMetrics/operator/commit/c991b5f315ebb3176b98f5cb00c64430efa0d9c1
|
* security: new alpine image with security fixes https://github.com/VictoriaMetrics/operator/commit/c991b5f315ebb3176b98f5cb00c64430efa0d9c1
|
||||||
* alertmanager: metrics endpoint when routePrefix is configured https://github.com/VictoriaMetrics/operator/pull/488 Thanks [@blesswinsamuel](https://github.com/blesswinsamuel)
|
* alertmanager: metrics endpoint when routePrefix is configured https://github.com/VictoriaMetrics/operator/pull/488 Thanks [@blesswinsamuel](https://github.com/blesswinsamuel)
|
||||||
* alertmanager: Automatically disable high availability mode for 1 replica in https://github.com/VictoriaMetrics/operator/pull/495. Thanks [@hadesy](https://github.com/hadesy)
|
* alertmanager: Automaticly disable high availability mode for 1 replica in https://github.com/VictoriaMetrics/operator/pull/495. Thanks [@hadesy](https://github.com/hadesy)
|
||||||
* vmalertmanager: fix extraArgs, add two dashes https://github.com/VictoriaMetrics/operator/pull/503 Thanks [@flokli](https://github.com/flokli)
|
* vmalertmanager: fix extraArgs, add two dashes https://github.com/VictoriaMetrics/operator/pull/503 Thanks [@flokli](https://github.com/flokli)
|
||||||
* vmcluster: disables selectNode arg passing to vmselect with enabled `HPA`. It should prevent vmselect cascade restarts https://github.com/VictoriaMetrics/operator/issues/499
|
* vmcluster: disables selectNode arg passing to vmselect with enabled `HPA`. It should prevent vmselect cascade restarts https://github.com/VictoriaMetrics/operator/issues/499
|
||||||
* controllers: changes default rate limiter max delay from 16minutes to 2 minutes. https://github.com/VictoriaMetrics/operator/issues/500
|
* controllers: changes default rate limiter max delay from 16minutes to 2 minutes. https://github.com/VictoriaMetrics/operator/issues/500
|
||||||
|
@ -786,7 +786,7 @@ aliases:
|
||||||
- Added `StatefulMode` for `VMAgent` it allows to use `Statefulset` instead of `Deployment` https://github.com/VictoriaMetrics/operator/issues/219
|
- Added `StatefulMode` for `VMAgent` it allows to use `Statefulset` instead of `Deployment` https://github.com/VictoriaMetrics/operator/issues/219
|
||||||
- Added `Validation Webhook` for `VMRule`, it allows check errors at rules https://github.com/VictoriaMetrics/operator/issues/471
|
- Added `Validation Webhook` for `VMRule`, it allows check errors at rules https://github.com/VictoriaMetrics/operator/issues/471
|
||||||
- Added additional metrics for operator `operator_log_messages_total`, `operator_controller_objects_count`, `operator_reconcile_throttled_events_total`, `vm_app_version`, `vm_app_uptime_seconds`, `vm_app_start_timestamp` https://github.com/VictoriaMetrics/operator/commit/b941a42fb6fdfd8ea99ff190e822cb9314efb9d0 https://github.com/VictoriaMetrics/operator/commit/b3c7286e7dc737c46c4d33aa203c0b598a5ef187
|
- Added additional metrics for operator `operator_log_messages_total`, `operator_controller_objects_count`, `operator_reconcile_throttled_events_total`, `vm_app_version`, `vm_app_uptime_seconds`, `vm_app_start_timestamp` https://github.com/VictoriaMetrics/operator/commit/b941a42fb6fdfd8ea99ff190e822cb9314efb9d0 https://github.com/VictoriaMetrics/operator/commit/b3c7286e7dc737c46c4d33aa203c0b598a5ef187
|
||||||
- Adds rate limiting for `VMAgent` and `VMAlert` reconciliation https://github.com/VictoriaMetrics/operator/commit/dfb6a14e1193089ba5ab112e0acf4e459aba68b4
|
- Adds rate limiting for `VMAgent` and `VMAlert` reconcilation https://github.com/VictoriaMetrics/operator/commit/dfb6a14e1193089ba5ab112e0acf4e459aba68b4
|
||||||
|
|
||||||
### New Contributors
|
### New Contributors
|
||||||
* [@pavan541cs](https://github.com/pavan541cs) made their first contribution in https://github.com/VictoriaMetrics/operator/pull/473
|
* [@pavan541cs](https://github.com/pavan541cs) made their first contribution in https://github.com/VictoriaMetrics/operator/pull/473
|
||||||
|
@ -803,7 +803,7 @@ aliases:
|
||||||
- Finalizers at UrlRelabelConfig and additionalScrapeConfigs https://github.com/VictoriaMetrics/operator/issues/442
|
- Finalizers at UrlRelabelConfig and additionalScrapeConfigs https://github.com/VictoriaMetrics/operator/issues/442
|
||||||
- vmagent config update after scrape objects secret data changes https://github.com/VictoriaMetrics/operator/issues/443
|
- vmagent config update after scrape objects secret data changes https://github.com/VictoriaMetrics/operator/issues/443
|
||||||
- Log typos https://github.com/VictoriaMetrics/operator/issues/459
|
- Log typos https://github.com/VictoriaMetrics/operator/issues/459
|
||||||
- Correctly renders `opsgenie_config` for `VMAlertmanagerConfig` https://github.com/VictoriaMetrics/operator/commit/9128b7f24d5d6d98dcf7abc6f212d57cd39b0e7d thanks [@iyuroch](https://github.com/iyuroch)
|
- Correctly renders `opsgenia_config` for `VMAlertmanagerConfig` https://github.com/VictoriaMetrics/operator/commit/9128b7f24d5d6d98dcf7abc6f212d57cd39b0e7d thanks [@iyuroch](https://github.com/iyuroch)
|
||||||
- Updates basic image with CVE fix https://github.com/VictoriaMetrics/operator/commit/f4a9e530be6d5ebd6e450085ec807117b05e80a8
|
- Updates basic image with CVE fix https://github.com/VictoriaMetrics/operator/commit/f4a9e530be6d5ebd6e450085ec807117b05e80a8
|
||||||
- Adds missing finalizer for `VMSingle` deployment https://github.com/VictoriaMetrics/operator/commit/06dada488d629d4d321985e80d14ee04e099bdfd thanks [@lujiajing1126](https://github.com/lujiajing1126)
|
- Adds missing finalizer for `VMSingle` deployment https://github.com/VictoriaMetrics/operator/commit/06dada488d629d4d321985e80d14ee04e099bdfd thanks [@lujiajing1126](https://github.com/lujiajing1126)
|
||||||
- `pager_duty` generation for `VMAlertmanagerConfig` https://github.com/VictoriaMetrics/operator/pull/439/files thanks [@okzheng](https://github.com/okzheng)
|
- `pager_duty` generation for `VMAlertmanagerConfig` https://github.com/VictoriaMetrics/operator/pull/439/files thanks [@okzheng](https://github.com/okzheng)
|
||||||
|
@ -890,7 +890,7 @@ aliases:
|
||||||
|
|
||||||
### Features
|
### Features
|
||||||
|
|
||||||
- bumps VictoriaMetrics applications versions to the v1.72.0 https://github.com/VictoriaMetrics/operator/commit/de289af8af8472e5299fc6ff6e99749b58012edd
|
- bumps VictoriaMetrics appllications versions to the v1.72.0 https://github.com/VictoriaMetrics/operator/commit/de289af8af8472e5299fc6ff6e99749b58012edd
|
||||||
|
|
||||||
[Changes][v0.22.1]
|
[Changes][v0.22.1]
|
||||||
|
|
||||||
|
@ -1001,7 +1001,7 @@ aliases:
|
||||||
### Fixes
|
### Fixes
|
||||||
|
|
||||||
- Regression at `VMStaticScrape` - basic auth was incorrectly handled https://github.com/VictoriaMetrics/operator/issues/337
|
- Regression at `VMStaticScrape` - basic auth was incorrectly handled https://github.com/VictoriaMetrics/operator/issues/337
|
||||||
- Conversion from `PodMonitor` to `VMPodScrape` https://github.com/VictoriaMetrics/operator/issues/335
|
- Convesion from `PodMonitor` to `VMPodScrape` https://github.com/VictoriaMetrics/operator/issues/335
|
||||||
|
|
||||||
[Changes][v0.19.1]
|
[Changes][v0.19.1]
|
||||||
|
|
||||||
|
@ -1290,7 +1290,7 @@ aliases:
|
||||||
|
|
||||||
### Fixes
|
### Fixes
|
||||||
|
|
||||||
- Fixes `VMAlert` `rule` arg - it was improperly escaped https://github.com/VictoriaMetrics/operator/commit/870f258b324dbaec1e3d0d8739ff2feffc27bf0a
|
- Fixes `VMAlert` `rule` arg - it was unproperly escaped https://github.com/VictoriaMetrics/operator/commit/870f258b324dbaec1e3d0d8739ff2feffc27bf0a
|
||||||
- Fixes `VMProbes`, now it supports relabeling for static targets https://github.com/VictoriaMetrics/operator/commit/b4db7d5128a22d4979d7284e15576322acbc9b4c
|
- Fixes `VMProbes`, now it supports relabeling for static targets https://github.com/VictoriaMetrics/operator/commit/b4db7d5128a22d4979d7284e15576322acbc9b4c
|
||||||
- Fixes `VMStaticScrape` - adds `honorLabels` and `honorTimestamps` setting to CRD
|
- Fixes `VMStaticScrape` - adds `honorLabels` and `honorTimestamps` setting to CRD
|
||||||
|
|
||||||
|
@ -1322,7 +1322,7 @@ aliases:
|
||||||
### Features
|
### Features
|
||||||
|
|
||||||
- Added finalizers to objects created by operator. It must fix an issue with resource deletion by controller manager. Note, it requires additional rbac access. https://github.com/VictoriaMetrics/operator/issues/159 https://github.com/VictoriaMetrics/operator/pull/189
|
- Added finalizers to objects created by operator. It must fix an issue with resource deletion by controller manager. Note, it requires additional rbac access. https://github.com/VictoriaMetrics/operator/issues/159 https://github.com/VictoriaMetrics/operator/pull/189
|
||||||
- Added new resource for static targets scrapping - `VMStaticScrape` https://github.com/VictoriaMetrics/operator/issues/155
|
- Added new resouce for static targets scrapping - `VMStaticScrape` https://github.com/VictoriaMetrics/operator/issues/155
|
||||||
- Added `unlimited` param for default resources - https://github.com/VictoriaMetrics/operator/issues/181
|
- Added `unlimited` param for default resources - https://github.com/VictoriaMetrics/operator/issues/181
|
||||||
- Added clusterVersion spec to `VMCluster` it should simplify management https://github.com/VictoriaMetrics/operator/issues/176
|
- Added clusterVersion spec to `VMCluster` it should simplify management https://github.com/VictoriaMetrics/operator/issues/176
|
||||||
|
|
||||||
|
@ -1407,7 +1407,7 @@ aliases:
|
||||||
### Fixes
|
### Fixes
|
||||||
|
|
||||||
- serverName for tlsConfig https://github.com/VictoriaMetrics/operator/issues/144
|
- serverName for tlsConfig https://github.com/VictoriaMetrics/operator/issues/144
|
||||||
- minScrapeInterval for vmstorage https://github.com/VictoriaMetrics/operator/pull/143 Thanks [@umezawatakeshi](https://github.com/umezawatakeshi)
|
- minScrapeInterval for vmstorage https://github.com/VictoriaMetrics/operator/pull/143 Thansk [@umezawatakeshi](https://github.com/umezawatakeshi)
|
||||||
|
|
||||||
[Changes][v0.7.2]
|
[Changes][v0.7.2]
|
||||||
|
|
||||||
|
@ -1490,7 +1490,7 @@ aliases:
|
||||||
|
|
||||||
- PodSecurityPolicy automatically created for each object, with own ServiceAccount, ClusterRole and ClusterRoleBinding. Its possible to use custom PSP. https://github.com/VictoriaMetrics/operator/issues/109
|
- PodSecurityPolicy automatically created for each object, with own ServiceAccount, ClusterRole and ClusterRoleBinding. Its possible to use custom PSP. https://github.com/VictoriaMetrics/operator/issues/109
|
||||||
- Adds `VMAgent` rbac auto-creation.
|
- Adds `VMAgent` rbac auto-creation.
|
||||||
- Adds ServiceAccount auto-creation. Its possible to use custom ServiceAccount instead of default.
|
- Adds ServiceAccount auto-creation. Its possible to use custome ServiceAccount instead of default.
|
||||||
- Adds `ownerReferences` for converted resources from `Prometheus-operator` CRDs, https://github.com/VictoriaMetrics/operator/pull/105 thanks [@teqwve](https://github.com/teqwve) .
|
- Adds `ownerReferences` for converted resources from `Prometheus-operator` CRDs, https://github.com/VictoriaMetrics/operator/pull/105 thanks [@teqwve](https://github.com/teqwve) .
|
||||||
- Adds `runtimeClassName`, `schedulerName` for all VictoriaMetrics applications.
|
- Adds `runtimeClassName`, `schedulerName` for all VictoriaMetrics applications.
|
||||||
- Adds `topologySpreadConstraints` for all VictoriaMetrics applications. https://github.com/VictoriaMetrics/operator/issues/107.
|
- Adds `topologySpreadConstraints` for all VictoriaMetrics applications. https://github.com/VictoriaMetrics/operator/issues/107.
|
||||||
|
|
|
@ -220,7 +220,7 @@ VMAlertmanagerSpec is a specification of the desired behavior of the VMAlertmana
|
||||||
| volumeMounts | VolumeMounts allows configuration of additional VolumeMounts on the output StatefulSet definition. VolumeMounts specified will be appended to other VolumeMounts in the alertmanager container, that are generated as a result of StorageSpec objects. | [][v1.VolumeMount](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.27/#volumemount-v1-core) | false |
|
| volumeMounts | VolumeMounts allows configuration of additional VolumeMounts on the output StatefulSet definition. VolumeMounts specified will be appended to other VolumeMounts in the alertmanager container, that are generated as a result of StorageSpec objects. | [][v1.VolumeMount](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.27/#volumemount-v1-core) | false |
|
||||||
| externalURL | ExternalURL the VMAlertmanager instances will be available under. This is necessary to generate correct URLs. This is necessary if VMAlertmanager is not served from root of a DNS name. | string | false |
|
| externalURL | ExternalURL the VMAlertmanager instances will be available under. This is necessary to generate correct URLs. This is necessary if VMAlertmanager is not served from root of a DNS name. | string | false |
|
||||||
| routePrefix | RoutePrefix VMAlertmanager registers HTTP handlers for. This is useful, if using ExternalURL and a proxy is rewriting HTTP routes of a request, and the actual ExternalURL is still true, but the server serves requests under a different route prefix. For example for use with `kubectl proxy`. | string | false |
|
| routePrefix | RoutePrefix VMAlertmanager registers HTTP handlers for. This is useful, if using ExternalURL and a proxy is rewriting HTTP routes of a request, and the actual ExternalURL is still true, but the server serves requests under a different route prefix. For example for use with `kubectl proxy`. | string | false |
|
||||||
| paused | Paused If set to true all actions on the underlaying managed objects are not going to be performed, except for delete actions. | bool | false |
|
| paused | Paused If set to true all actions on the underlying managed objects are not going to be performed, except for delete actions. | bool | false |
|
||||||
| nodeSelector | NodeSelector Define which Nodes the Pods are scheduled on. | map[string]string | false |
|
| nodeSelector | NodeSelector Define which Nodes the Pods are scheduled on. | map[string]string | false |
|
||||||
| resources | Resources container resource request and limits, https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/ | [v1.ResourceRequirements](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.27/#resourcerequirements-v1-core) | false |
|
| resources | Resources container resource request and limits, https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/ | [v1.ResourceRequirements](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.27/#resourcerequirements-v1-core) | false |
|
||||||
| affinity | Affinity If specified, the pod's scheduling constraints. | *[v1.Affinity](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.27/#affinity-v1-core) | false |
|
| affinity | Affinity If specified, the pod's scheduling constraints. | *[v1.Affinity](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.27/#affinity-v1-core) | false |
|
||||||
|
@ -927,7 +927,7 @@ VMAgentSpec defines the desired state of VMAgent
|
||||||
| useStrictSecurity | UseStrictSecurity enables strict security mode for component it restricts disk writes access uses non-root user out of the box drops not needed security permissions | *bool | false |
|
| useStrictSecurity | UseStrictSecurity enables strict security mode for component it restricts disk writes access uses non-root user out of the box drops not needed security permissions | *bool | false |
|
||||||
| ingestOnlyMode | IngestOnlyMode switches vmagent into unmanaged mode it disables any config generation for scraping Currently it prevents vmagent from managing tls and auth options for remote write | bool | false |
|
| ingestOnlyMode | IngestOnlyMode switches vmagent into unmanaged mode it disables any config generation for scraping Currently it prevents vmagent from managing tls and auth options for remote write | bool | false |
|
||||||
| license | License allows to configure license key to be used for enterprise features. Using license key is supported starting from VictoriaMetrics v1.94.0. See: https://docs.victoriametrics.com/enterprise.html | *[License](#license) | false |
|
| license | License allows to configure license key to be used for enterprise features. Using license key is supported starting from VictoriaMetrics v1.94.0. See: https://docs.victoriametrics.com/enterprise.html | *[License](#license) | false |
|
||||||
| paused | Paused If set to true all actions on the underlaying managed objects are not going to be performed, except for delete actions. | bool | false |
|
| paused | Paused If set to true all actions on the underlying managed objects are not going to be performed, except for delete actions. | bool | false |
|
||||||
|
|
||||||
[Back to TOC](#table-of-contents)
|
[Back to TOC](#table-of-contents)
|
||||||
|
|
||||||
|
@ -954,7 +954,7 @@ ServiceSpec defines additional service for CRD with user-defined params. by defa
|
||||||
|
|
||||||
| Field | Description | Scheme | Required |
|
| Field | Description | Scheme | Required |
|
||||||
| ----- | ----------- | ------ | -------- |
|
| ----- | ----------- | ------ | -------- |
|
||||||
| useAsDefault | UseAsDefault applies changes from given service definition to the main object Service Changing from headless service to clusterIP or load balancer may break cross-component communication | bool | false |
|
| useAsDefault | UseAsDefault applies changes from given service definition to the main object Service Changing from headless service to clusterIP or loadbalancer may break cross-component communication | bool | false |
|
||||||
| metadata | EmbeddedObjectMetadata defines objectMeta for additional service. | [EmbeddedObjectMetadata](#embeddedobjectmetadata) | false |
|
| metadata | EmbeddedObjectMetadata defines objectMeta for additional service. | [EmbeddedObjectMetadata](#embeddedobjectmetadata) | false |
|
||||||
| spec | ServiceSpec describes the attributes that a user creates on a service. More info: https://kubernetes.io/docs/concepts/services-networking/service/ | v1.ServiceSpec | true |
|
| spec | ServiceSpec describes the attributes that a user creates on a service. More info: https://kubernetes.io/docs/concepts/services-networking/service/ | v1.ServiceSpec | true |
|
||||||
|
|
||||||
|
@ -1305,7 +1305,7 @@ VMAlertSpec defines the desired state of VMAlert
|
||||||
| readinessGates | ReadinessGates defines pod readiness gates | []v1.PodReadinessGate | false |
|
| readinessGates | ReadinessGates defines pod readiness gates | []v1.PodReadinessGate | false |
|
||||||
| useStrictSecurity | UseStrictSecurity enables strict security mode for component it restricts disk writes access uses non-root user out of the box drops not needed security permissions | *bool | false |
|
| useStrictSecurity | UseStrictSecurity enables strict security mode for component it restricts disk writes access uses non-root user out of the box drops not needed security permissions | *bool | false |
|
||||||
| license | License allows to configure license key to be used for enterprise features. Using license key is supported starting from VictoriaMetrics v1.94.0. See: https://docs.victoriametrics.com/enterprise.html | *[License](#license) | false |
|
| license | License allows to configure license key to be used for enterprise features. Using license key is supported starting from VictoriaMetrics v1.94.0. See: https://docs.victoriametrics.com/enterprise.html | *[License](#license) | false |
|
||||||
| paused | Paused If set to true all actions on the underlaying managed objects are not going to be performed, except for delete actions. | bool | false |
|
| paused | Paused If set to true all actions on the underlying managed objects are not going to be performed, except for delete actions. | bool | false |
|
||||||
|
|
||||||
[Back to TOC](#table-of-contents)
|
[Back to TOC](#table-of-contents)
|
||||||
|
|
||||||
|
@ -1400,7 +1400,7 @@ VMSingleSpec defines the desired state of VMSingle
|
||||||
| readinessGates | ReadinessGates defines pod readiness gates | []v1.PodReadinessGate | false |
|
| readinessGates | ReadinessGates defines pod readiness gates | []v1.PodReadinessGate | false |
|
||||||
| streamAggrConfig | StreamAggrConfig defines stream aggregation configuration for VMSingle | *[StreamAggrConfig](#streamaggrconfig) | false |
|
| streamAggrConfig | StreamAggrConfig defines stream aggregation configuration for VMSingle | *[StreamAggrConfig](#streamaggrconfig) | false |
|
||||||
| useStrictSecurity | UseStrictSecurity enables strict security mode for component it restricts disk writes access uses non-root user out of the box drops not needed security permissions | *bool | false |
|
| useStrictSecurity | UseStrictSecurity enables strict security mode for component it restricts disk writes access uses non-root user out of the box drops not needed security permissions | *bool | false |
|
||||||
| paused | Paused If set to true all actions on the underlaying managed objects are not going to be performed, except for delete actions. | bool | false |
|
| paused | Paused If set to true all actions on the underlying managed objects are not going to be performed, except for delete actions. | bool | false |
|
||||||
|
|
||||||
[Back to TOC](#table-of-contents)
|
[Back to TOC](#table-of-contents)
|
||||||
|
|
||||||
|
@ -1887,7 +1887,7 @@ VMClusterSpec defines the desired state of VMCluster
|
||||||
| vmselect | | *[VMSelect](#vmselect) | false |
|
| vmselect | | *[VMSelect](#vmselect) | false |
|
||||||
| vminsert | | *[VMInsert](#vminsert) | false |
|
| vminsert | | *[VMInsert](#vminsert) | false |
|
||||||
| vmstorage | | *[VMStorage](#vmstorage) | false |
|
| vmstorage | | *[VMStorage](#vmstorage) | false |
|
||||||
| paused | Paused If set to true all actions on the underlaying managed objects are not going to be performed, except for delete actions. | bool | false |
|
| paused | Paused If set to true all actions on the underlying managed objects are not going to be performed, except for delete actions. | bool | false |
|
||||||
| useStrictSecurity | UseStrictSecurity enables strict security mode for component it restricts disk writes access uses non-root user out of the box drops not needed security permissions | *bool | false |
|
| useStrictSecurity | UseStrictSecurity enables strict security mode for component it restricts disk writes access uses non-root user out of the box drops not needed security permissions | *bool | false |
|
||||||
|
|
||||||
[Back to TOC](#table-of-contents)
|
[Back to TOC](#table-of-contents)
|
||||||
|
@ -2405,7 +2405,7 @@ VMAuthSpec defines the desired state of VMAuth
|
||||||
| useStrictSecurity | UseStrictSecurity enables strict security mode for component it restricts disk writes access uses non-root user out of the box drops not needed security permissions | *bool | false |
|
| useStrictSecurity | UseStrictSecurity enables strict security mode for component it restricts disk writes access uses non-root user out of the box drops not needed security permissions | *bool | false |
|
||||||
| license | License allows to configure license key to be used for enterprise features. Using license key is supported starting from VictoriaMetrics v1.94.0. See: https://docs.victoriametrics.com/enterprise.html | *[License](#license) | false |
|
| license | License allows to configure license key to be used for enterprise features. Using license key is supported starting from VictoriaMetrics v1.94.0. See: https://docs.victoriametrics.com/enterprise.html | *[License](#license) | false |
|
||||||
| configSecret | ConfigSecret is the name of a Kubernetes Secret in the same namespace as the VMAuth object, which contains auth configuration for vmauth, configuration must be inside secret key: config.yaml. It must be created and managed manually. If it's defined, configuration for vmauth becomes unmanaged and operator'll not create any related secrets/config-reloaders | string | false |
|
| configSecret | ConfigSecret is the name of a Kubernetes Secret in the same namespace as the VMAuth object, which contains auth configuration for vmauth, configuration must be inside secret key: config.yaml. It must be created and managed manually. If it's defined, configuration for vmauth becomes unmanaged and operator'll not create any related secrets/config-reloaders | string | false |
|
||||||
| paused | Paused If set to true all actions on the underlaying managed objects are not going to be performed, except for delete actions. | bool | false |
|
| paused | Paused If set to true all actions on the underlying managed objects are not going to be performed, except for delete actions. | bool | false |
|
||||||
|
|
||||||
[Back to TOC](#table-of-contents)
|
[Back to TOC](#table-of-contents)
|
||||||
|
|
||||||
|
|
|
@ -28,13 +28,13 @@ Operator doesn't have enterprise version for itself, but it supports
|
||||||
- [Multiple retentions / Retention filters](./resources/vmcluster.md#retention-filters)
|
- [Multiple retentions / Retention filters](./resources/vmcluster.md#retention-filters)
|
||||||
- [Advanced per-tenant statistic](./resources/vmcluster.md#advanced-per-tenant-statistic)
|
- [Advanced per-tenant statistic](./resources/vmcluster.md#advanced-per-tenant-statistic)
|
||||||
- [mTLS protection](./resources/vmcluster.md#mtls-protection)
|
- [mTLS protection](./resources/vmcluster.md#mtls-protection)
|
||||||
- [Backup automation](./resources/vmcluster.md#backup-automation)
|
- [Backup atomation](./resources/vmcluster.md#backup-atomation)
|
||||||
- [VMRule Enterprise features](./resources/vmrule.md#enterprise-features)
|
- [VMRule Enterprise features](./resources/vmrule.md#enterprise-features)
|
||||||
- [Multitenancy](./resources/vmrule.md#multitenancy)
|
- [Multitenancy](./resources/vmrule.md#multitenancy)
|
||||||
- [VMSingle Enterprise features](./resources/vmsingle.md#enterprise-features)
|
- [VMSingle Enterprise features](./resources/vmsingle.md#enterprise-features)
|
||||||
- [Downsampling](./resources/vmsingle.md#downsampling)
|
- [Downsampling](./resources/vmsingle.md#downsampling)
|
||||||
- [Retention filters](./resources/vmsingle.md#retention-filters)
|
- [Retention filters](./resources/vmsingle.md#retention-filters)
|
||||||
- [Backup automation](./resources/vmsingle.md#backup-automation)
|
- [Backup atomation](./resources/vmsingle.md#backup-atomation)
|
||||||
- [VMUser Enterprise features](./resources/vmuser.md#enterprise-features)
|
- [VMUser Enterprise features](./resources/vmuser.md#enterprise-features)
|
||||||
- [IP Filters](./resources/vmuser.md#ip-filters)
|
- [IP Filters](./resources/vmuser.md#ip-filters)
|
||||||
|
|
||||||
|
|
|
@ -183,13 +183,13 @@ Operator supports following [Enterprise features for VictoriaMetrics components]
|
||||||
- [Multiple retentions / Retention filters](./vmcluster.md#retention-filters)
|
- [Multiple retentions / Retention filters](./vmcluster.md#retention-filters)
|
||||||
- [Advanced per-tenant statistic](./vmcluster.md#advanced-per-tenant-statistic)
|
- [Advanced per-tenant statistic](./vmcluster.md#advanced-per-tenant-statistic)
|
||||||
- [mTLS protection](./vmcluster.md#mtls-protection)
|
- [mTLS protection](./vmcluster.md#mtls-protection)
|
||||||
- [Backup automation](./vmcluster.md#backup-automation)
|
- [Backup atomation](./vmcluster.md#backup-atomation)
|
||||||
- [VMRule Enterprise features](./vmrule.md#enterprise-features)
|
- [VMRule Enterprise features](./vmrule.md#enterprise-features)
|
||||||
- [Multitenancy](./vmrule.md#multitenancy)
|
- [Multitenancy](./vmrule.md#multitenancy)
|
||||||
- [VMSingle Enterprise features](./vmsingle.md#enterprise-features)
|
- [VMSingle Enterprise features](./vmsingle.md#enterprise-features)
|
||||||
- [Downsampling](./vmsingle.md#downsampling)
|
- [Downsampling](./vmsingle.md#downsampling)
|
||||||
- [Retention filters](./vmsingle.md#retention-filters)
|
- [Retention filters](./vmsingle.md#retention-filters)
|
||||||
- [Backup automation](./vmsingle.md#backup-automation)
|
- [Backup atomation](./vmsingle.md#backup-atomation)
|
||||||
- [VMUser Enterprise features](./vmuser.md#enterprise-features)
|
- [VMUser Enterprise features](./vmuser.md#enterprise-features)
|
||||||
- [IP Filters](./vmuser.md#ip-filters)
|
- [IP Filters](./vmuser.md#ip-filters)
|
||||||
|
|
||||||
|
|
|
@ -10,10 +10,10 @@ menu:
|
||||||
|
|
||||||
<!-- this doc autogenerated - don't edit it manually -->
|
<!-- this doc autogenerated - don't edit it manually -->
|
||||||
# Auto Generated vars for package config
|
# Auto Generated vars for package config
|
||||||
updated at Thu May 30 08:56:34 UTC 2024
|
updated at Wed Jun 5 06:58:55 UTC 2024
|
||||||
|
|
||||||
|
|
||||||
| variable name | variable default value | variable required | variable description |
|
| varible name | variable default value | variable required | variable description |
|
||||||
| --- | --- | --- | --- |
|
| --- | --- | --- | --- |
|
||||||
| VM_USECUSTOMCONFIGRELOADER | false | false | enables custom config reloader for vmauth and vmagent,it should speed-up config reloading process. |
|
| VM_USECUSTOMCONFIGRELOADER | false | false | enables custom config reloader for vmauth and vmagent,it should speed-up config reloading process. |
|
||||||
| VM_CONTAINERREGISTRY | - | false | container registry name prefix, e.g. docker.io |
|
| VM_CONTAINERREGISTRY | - | false | container registry name prefix, e.g. docker.io |
|
||||||
|
|
Loading…
Reference in a new issue