mirror of
https://github.com/VictoriaMetrics/VictoriaMetrics.git
synced 2024-11-21 14:44:00 +00:00
vmui: add metric relabel debug (#3889)
* feat: add metric relabel debug (#3807) * fix: add link to relabeling cookbook * lib/promrelabel: merge, fix conflicts * lib/promrelabel: fix diff * docs/vmui: add metric relabel playground --------- Co-authored-by: dmitryk-dk <kozlovdmitriyy@gmail.com>
This commit is contained in:
parent
45a551df9c
commit
4f3f9950d0
14 changed files with 793 additions and 284 deletions
|
@ -461,6 +461,7 @@ func RequestHandler(w http.ResponseWriter, r *http.Request) bool {
|
||||||
return true
|
return true
|
||||||
case "/metric-relabel-debug":
|
case "/metric-relabel-debug":
|
||||||
promscrapeMetricRelabelDebugRequests.Inc()
|
promscrapeMetricRelabelDebugRequests.Inc()
|
||||||
|
httpserver.EnableCORS(w, r)
|
||||||
promscrape.WriteMetricRelabelDebug(w, r)
|
promscrape.WriteMetricRelabelDebug(w, r)
|
||||||
return true
|
return true
|
||||||
case "/target-relabel-debug":
|
case "/target-relabel-debug":
|
||||||
|
|
|
@ -12,6 +12,7 @@ import TracePage from "./pages/TracePage";
|
||||||
import ExploreMetrics from "./pages/ExploreMetrics";
|
import ExploreMetrics from "./pages/ExploreMetrics";
|
||||||
import PreviewIcons from "./components/Main/Icons/PreviewIcons";
|
import PreviewIcons from "./components/Main/Icons/PreviewIcons";
|
||||||
import WithTemplate from "./pages/WithTemplate";
|
import WithTemplate from "./pages/WithTemplate";
|
||||||
|
import Relabel from "./pages/Relabel";
|
||||||
|
|
||||||
const App: FC = () => {
|
const App: FC = () => {
|
||||||
|
|
||||||
|
@ -56,6 +57,10 @@ const App: FC = () => {
|
||||||
path={router.withTemplate}
|
path={router.withTemplate}
|
||||||
element={<WithTemplate/>}
|
element={<WithTemplate/>}
|
||||||
/>
|
/>
|
||||||
|
<Route
|
||||||
|
path={router.relabel}
|
||||||
|
element={<Relabel/>}
|
||||||
|
/>
|
||||||
<Route
|
<Route
|
||||||
path={router.icons}
|
path={router.icons}
|
||||||
element={<PreviewIcons/>}
|
element={<PreviewIcons/>}
|
||||||
|
|
8
app/vmui/packages/vmui/src/api/metric-relabel.ts
Normal file
8
app/vmui/packages/vmui/src/api/metric-relabel.ts
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
export const getMetricRelabelDebug = (server: string, configs: string, metric: string): string => {
|
||||||
|
const params = [
|
||||||
|
"format=json",
|
||||||
|
`relabel_configs=${encodeURIComponent(configs)}`,
|
||||||
|
`metric=${encodeURIComponent(metric)}`
|
||||||
|
];
|
||||||
|
return `${server}/metric-relabel-debug?${params.join("&")}`;
|
||||||
|
};
|
|
@ -55,6 +55,10 @@ const HeaderNav: FC<HeaderNavProps> = ({ color, background, direction }) => {
|
||||||
label: routerOptions[router.withTemplate].title,
|
label: routerOptions[router.withTemplate].title,
|
||||||
value: router.withTemplate,
|
value: router.withTemplate,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
label: routerOptions[router.relabel].title,
|
||||||
|
value: router.relabel,
|
||||||
|
},
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
|
@ -0,0 +1,36 @@
|
||||||
|
import { useAppState } from "../../../state/common/StateContext";
|
||||||
|
import { useState } from "react";
|
||||||
|
import { ErrorTypes, RelabelData } from "../../../types";
|
||||||
|
import { getMetricRelabelDebug } from "../../../api/metric-relabel";
|
||||||
|
|
||||||
|
export const useRelabelDebug = () => {
|
||||||
|
const { serverUrl } = useAppState();
|
||||||
|
|
||||||
|
const [data, setData] = useState<RelabelData | null>(null);
|
||||||
|
const [loading, setLoading] = useState(false);
|
||||||
|
const [error, setError] = useState<ErrorTypes | string>();
|
||||||
|
|
||||||
|
const fetchData = async (config: string, metric: string) => {
|
||||||
|
const fetchUrl = getMetricRelabelDebug(serverUrl, config, metric);
|
||||||
|
setLoading(true);
|
||||||
|
try {
|
||||||
|
const response = await fetch(fetchUrl);
|
||||||
|
const resp = await response.json();
|
||||||
|
|
||||||
|
setData(resp.error ? null : resp);
|
||||||
|
setError(String(resp.error || ""));
|
||||||
|
} catch (e) {
|
||||||
|
if (e instanceof Error && e.name !== "AbortError") {
|
||||||
|
setError(`${e.name}: ${e.message}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
setLoading(false);
|
||||||
|
};
|
||||||
|
|
||||||
|
return {
|
||||||
|
data,
|
||||||
|
error,
|
||||||
|
loading,
|
||||||
|
fetchData
|
||||||
|
};
|
||||||
|
};
|
181
app/vmui/packages/vmui/src/pages/Relabel/index.tsx
Normal file
181
app/vmui/packages/vmui/src/pages/Relabel/index.tsx
Normal file
|
@ -0,0 +1,181 @@
|
||||||
|
import React, { FC, useEffect } from "preact/compat";
|
||||||
|
import "./style.scss";
|
||||||
|
import TextField from "../../components/Main/TextField/TextField";
|
||||||
|
import { useState } from "react";
|
||||||
|
import Button from "../../components/Main/Button/Button";
|
||||||
|
import { InfoIcon, PlayIcon, WikiIcon } from "../../components/Main/Icons";
|
||||||
|
import "./style.scss";
|
||||||
|
import { useRelabelDebug } from "./hooks/useRelabelDebug";
|
||||||
|
import Spinner from "../../components/Main/Spinner/Spinner";
|
||||||
|
import Alert from "../../components/Main/Alert/Alert";
|
||||||
|
import { useSearchParams } from "react-router-dom";
|
||||||
|
|
||||||
|
const example = {
|
||||||
|
config: `- if: '{bar_label=~"b.*"}'
|
||||||
|
source_labels: [foo_label, bar_label]
|
||||||
|
separator: "_"
|
||||||
|
target_label: foobar
|
||||||
|
- action: labeldrop
|
||||||
|
regex: "foo_.*"
|
||||||
|
- target_label: job
|
||||||
|
replacement: "my-application-2"`,
|
||||||
|
labels: "{__name__=\"my_metric\", bar_label=\"bar\", foo_label=\"foo\", job=\"my-application\", instance=\"192.168.0.1\"}"
|
||||||
|
};
|
||||||
|
|
||||||
|
const Relabel: FC = () => {
|
||||||
|
const [searchParams, setSearchParams] = useSearchParams();
|
||||||
|
|
||||||
|
const { data, loading, error, fetchData } = useRelabelDebug();
|
||||||
|
|
||||||
|
const [config, setConfig] = useState("");
|
||||||
|
const [labels, setLabels] = useState("");
|
||||||
|
|
||||||
|
const handleChangeConfig = (val: string) => {
|
||||||
|
setConfig(val);
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleChangeLabels = (val: string) => {
|
||||||
|
setLabels(val);
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleRunQuery = () => {
|
||||||
|
fetchData(config, labels);
|
||||||
|
searchParams.set("config", config);
|
||||||
|
searchParams.set("labels", labels);
|
||||||
|
setSearchParams(searchParams);
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleRunExample = () => {
|
||||||
|
const { config, labels } = example;
|
||||||
|
setConfig(config);
|
||||||
|
setLabels(labels);
|
||||||
|
fetchData(config, labels);
|
||||||
|
searchParams.set("config", config);
|
||||||
|
searchParams.set("labels", labels);
|
||||||
|
setSearchParams(searchParams);
|
||||||
|
};
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const queryConfig = searchParams.get("config") || "";
|
||||||
|
const queryLabels = searchParams.get("labels") || "";
|
||||||
|
if (queryLabels || queryConfig) {
|
||||||
|
fetchData(queryConfig, queryLabels);
|
||||||
|
setConfig(queryConfig);
|
||||||
|
setLabels(queryLabels);
|
||||||
|
}
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<section className="vm-relabeling">
|
||||||
|
{loading && <Spinner/>}
|
||||||
|
<div className="vm-relabeling-header vm-block">
|
||||||
|
<div className="vm-relabeling-header__configs">
|
||||||
|
<TextField
|
||||||
|
type="textarea"
|
||||||
|
label="Relabel configs"
|
||||||
|
value={config}
|
||||||
|
autofocus
|
||||||
|
onChange={handleChangeConfig}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div className="vm-relabeling-header__labels">
|
||||||
|
<TextField
|
||||||
|
type="textarea"
|
||||||
|
label="Labels"
|
||||||
|
value={labels}
|
||||||
|
onChange={handleChangeLabels}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div className="vm-relabeling-header-bottom">
|
||||||
|
<a
|
||||||
|
className="vm-link vm-link_with-icon"
|
||||||
|
target="_blank"
|
||||||
|
href="https://docs.victoriametrics.com/relabeling.html"
|
||||||
|
rel="help noreferrer"
|
||||||
|
>
|
||||||
|
<InfoIcon/>
|
||||||
|
Relabeling cookbook
|
||||||
|
</a>
|
||||||
|
<a
|
||||||
|
className="vm-link vm-link_with-icon"
|
||||||
|
target="_blank"
|
||||||
|
href="https://docs.victoriametrics.com/vmagent.html#relabeling"
|
||||||
|
rel="help noreferrer"
|
||||||
|
>
|
||||||
|
<WikiIcon/>
|
||||||
|
Documentation
|
||||||
|
</a>
|
||||||
|
<Button
|
||||||
|
variant="text"
|
||||||
|
onClick={handleRunExample}
|
||||||
|
>
|
||||||
|
Try example
|
||||||
|
</Button>
|
||||||
|
<Button
|
||||||
|
variant="contained"
|
||||||
|
onClick={handleRunQuery}
|
||||||
|
startIcon={<PlayIcon/>}
|
||||||
|
>
|
||||||
|
Submit
|
||||||
|
</Button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{error && <Alert variant="error">{error}</Alert>}
|
||||||
|
|
||||||
|
{data && (
|
||||||
|
<div className="vm-relabeling-steps vm-block">
|
||||||
|
{data.originalLabels && (
|
||||||
|
<div className="vm-relabeling-steps-item">
|
||||||
|
<div className="vm-relabeling-steps-item__row">
|
||||||
|
<span>Original labels:</span>
|
||||||
|
<code dangerouslySetInnerHTML={{ __html: data.originalLabels }}/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
|
||||||
|
{data.steps.map((step, index) => (
|
||||||
|
<div
|
||||||
|
className="vm-relabeling-steps-item"
|
||||||
|
key={index}
|
||||||
|
>
|
||||||
|
<div className="vm-relabeling-steps-item__row">
|
||||||
|
<span>Step:</span>
|
||||||
|
{index + 1}
|
||||||
|
</div>
|
||||||
|
<div className="vm-relabeling-steps-item__row">
|
||||||
|
<span>Relabeling Rule:</span>
|
||||||
|
<code>
|
||||||
|
<pre>{step.rule}</pre>
|
||||||
|
</code>
|
||||||
|
</div>
|
||||||
|
<div className="vm-relabeling-steps-item__row">
|
||||||
|
<span>Input Labels:</span>
|
||||||
|
<code>
|
||||||
|
<pre dangerouslySetInnerHTML={{ __html: step.inLabels }}/>
|
||||||
|
</code>
|
||||||
|
</div>
|
||||||
|
<div className="vm-relabeling-steps-item__row">
|
||||||
|
<span>Output labels:</span>
|
||||||
|
<code>
|
||||||
|
<pre dangerouslySetInnerHTML={{ __html: step.outLabels }}/>
|
||||||
|
</code>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
|
||||||
|
{data.resultingLabels && (
|
||||||
|
<div className="vm-relabeling-steps-item">
|
||||||
|
<div className="vm-relabeling-steps-item__row">
|
||||||
|
<span>Resulting labels:</span>
|
||||||
|
<code dangerouslySetInnerHTML={{ __html: data.resultingLabels }}/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</section>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default Relabel;
|
74
app/vmui/packages/vmui/src/pages/Relabel/style.scss
Normal file
74
app/vmui/packages/vmui/src/pages/Relabel/style.scss
Normal file
|
@ -0,0 +1,74 @@
|
||||||
|
@use "src/styles/variables" as *;
|
||||||
|
|
||||||
|
.vm-relabeling {
|
||||||
|
display: grid;
|
||||||
|
gap: $padding-medium;
|
||||||
|
|
||||||
|
&-header {
|
||||||
|
display: grid;
|
||||||
|
gap: $padding-global;
|
||||||
|
align-items: flex-start;
|
||||||
|
width: 100%;
|
||||||
|
|
||||||
|
&__configs {
|
||||||
|
textarea {
|
||||||
|
min-height: 200px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&__labels {
|
||||||
|
textarea {
|
||||||
|
min-height: 60px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
textarea {
|
||||||
|
overflow: auto;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
&-bottom {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: flex-end;
|
||||||
|
gap: $padding-global;
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: $color-text-secondary;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&-steps {
|
||||||
|
display: grid;
|
||||||
|
gap: $padding-global;
|
||||||
|
|
||||||
|
&-item {
|
||||||
|
display: grid;
|
||||||
|
gap: $padding-global;
|
||||||
|
padding: 0 $padding-global $padding-global;
|
||||||
|
border-bottom: $border-divider;
|
||||||
|
|
||||||
|
&:last-child {
|
||||||
|
border-bottom: none;
|
||||||
|
padding-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
&__row {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: 100px 1fr;
|
||||||
|
|
||||||
|
@media (max-width: 500px) {
|
||||||
|
grid-template-columns: 1fr;
|
||||||
|
gap: 4px;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
pre {
|
||||||
|
white-space: pre-wrap;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -6,7 +6,8 @@ const router = {
|
||||||
topQueries: "/top-queries",
|
topQueries: "/top-queries",
|
||||||
trace: "/trace",
|
trace: "/trace",
|
||||||
withTemplate: "/expand-with-exprs",
|
withTemplate: "/expand-with-exprs",
|
||||||
icons: "/icons" // for dev
|
relabel: "/relabeling",
|
||||||
|
icons: "/icons"
|
||||||
};
|
};
|
||||||
|
|
||||||
export interface RouterOptionsHeader {
|
export interface RouterOptionsHeader {
|
||||||
|
@ -70,6 +71,10 @@ export const routerOptions: {[key: string]: RouterOptions} = {
|
||||||
title: "WITH templates",
|
title: "WITH templates",
|
||||||
header: {}
|
header: {}
|
||||||
},
|
},
|
||||||
|
[router.relabel]: {
|
||||||
|
title: "Metric relabel debug",
|
||||||
|
header: {}
|
||||||
|
},
|
||||||
[router.icons]: {
|
[router.icons]: {
|
||||||
title: "Icons",
|
title: "Icons",
|
||||||
header: {}
|
header: {}
|
||||||
|
|
|
@ -125,3 +125,16 @@ export enum Theme {
|
||||||
light = "light",
|
light = "light",
|
||||||
dark = "dark",
|
dark = "dark",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface RelabelStep {
|
||||||
|
rule: string;
|
||||||
|
inLabels: string;
|
||||||
|
outLabels: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface RelabelData {
|
||||||
|
status: string;
|
||||||
|
originalLabels?: string;
|
||||||
|
resultingLabels?: string;
|
||||||
|
steps: RelabelStep[];
|
||||||
|
}
|
||||||
|
|
|
@ -27,6 +27,7 @@ The following tip changes can be tested by building VictoriaMetrics components f
|
||||||
* FEATURE: [vmui](https://docs.victoriametrics.com/#vmui): integrate WITH template playground. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3811).
|
* FEATURE: [vmui](https://docs.victoriametrics.com/#vmui): integrate WITH template playground. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3811).
|
||||||
* FEATURE: [vmui](https://docs.victoriametrics.com/#vmui): add a comparison of data from the previous day with data from the current day to the `Cardinality Explorer`. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3967).
|
* FEATURE: [vmui](https://docs.victoriametrics.com/#vmui): add a comparison of data from the previous day with data from the current day to the `Cardinality Explorer`. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3967).
|
||||||
* FEATURE: [vmui](https://docs.victoriametrics.com/#vmui): display histogram metrics as a heatmap in the `explore metrics` tab. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/4111).
|
* FEATURE: [vmui](https://docs.victoriametrics.com/#vmui): display histogram metrics as a heatmap in the `explore metrics` tab. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/4111).
|
||||||
|
* FEATURE: [vmui](https://docs.victoriametrics.com/#vmui): add the metric relabel playground feature to the vmui. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3807).
|
||||||
* FEATURE: [vmauth](https://docs.victoriametrics.com/vmauth.html): add ability to proxy requests for unauthorized users. See [this doc](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/4083).
|
* FEATURE: [vmauth](https://docs.victoriametrics.com/vmauth.html): add ability to proxy requests for unauthorized users. See [this doc](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/4083).
|
||||||
|
|
||||||
* BUGFIX: reduce the probability of sudden increase in the number of small parts on systems with small number of CPU cores.
|
* BUGFIX: reduce the probability of sudden increase in the number of small parts on systems with small number of CPU cores.
|
||||||
|
|
|
@ -8,39 +8,39 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
// WriteMetricRelabelDebug writes /metric-relabel-debug page to w with the corresponding args.
|
// WriteMetricRelabelDebug writes /metric-relabel-debug page to w with the corresponding args.
|
||||||
func WriteMetricRelabelDebug(w io.Writer, targetID, metric, relabelConfigs string, err error) {
|
func WriteMetricRelabelDebug(w io.Writer, targetID, metric, relabelConfigs, format string, err error) {
|
||||||
writeRelabelDebug(w, false, targetID, metric, relabelConfigs, err)
|
writeRelabelDebug(w, false, targetID, metric, relabelConfigs, format, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// WriteTargetRelabelDebug writes /target-relabel-debug page to w with the corresponding args.
|
// WriteTargetRelabelDebug writes /target-relabel-debug page to w with the corresponding args.
|
||||||
func WriteTargetRelabelDebug(w io.Writer, targetID, metric, relabelConfigs string, err error) {
|
func WriteTargetRelabelDebug(w io.Writer, targetID, metric, relabelConfigs, format string, err error) {
|
||||||
writeRelabelDebug(w, true, targetID, metric, relabelConfigs, err)
|
writeRelabelDebug(w, true, targetID, metric, relabelConfigs, format, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
func writeRelabelDebug(w io.Writer, isTargetRelabel bool, targetID, metric, relabelConfigs string, err error) {
|
func writeRelabelDebug(w io.Writer, isTargetRelabel bool, targetID, metric, relabelConfigs, format string, err error) {
|
||||||
if metric == "" {
|
if metric == "" {
|
||||||
metric = "{}"
|
metric = "{}"
|
||||||
}
|
}
|
||||||
targetURL := ""
|
targetURL := ""
|
||||||
if err != nil {
|
if err != nil {
|
||||||
WriteRelabelDebugSteps(w, targetURL, targetID, nil, metric, relabelConfigs, err)
|
WriteRelabelDebugSteps(w, targetURL, targetID, format, nil, metric, relabelConfigs, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
labels, err := promutils.NewLabelsFromString(metric)
|
labels, err := promutils.NewLabelsFromString(metric)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
err = fmt.Errorf("cannot parse metric: %s", err)
|
err = fmt.Errorf("cannot parse metric: %s", err)
|
||||||
WriteRelabelDebugSteps(w, targetURL, targetID, nil, metric, relabelConfigs, err)
|
WriteRelabelDebugSteps(w, targetURL, targetID, format, nil, metric, relabelConfigs, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
pcs, err := ParseRelabelConfigsData([]byte(relabelConfigs))
|
pcs, err := ParseRelabelConfigsData([]byte(relabelConfigs))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
err = fmt.Errorf("cannot parse relabel configs: %s", err)
|
err = fmt.Errorf("cannot parse relabel configs: %s", err)
|
||||||
WriteRelabelDebugSteps(w, targetURL, targetID, nil, metric, relabelConfigs, err)
|
WriteRelabelDebugSteps(w, targetURL, targetID, format, nil, metric, relabelConfigs, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
dss, targetURL := newDebugRelabelSteps(pcs, labels, isTargetRelabel)
|
dss, targetURL := newDebugRelabelSteps(pcs, labels, isTargetRelabel)
|
||||||
WriteRelabelDebugSteps(w, targetURL, targetID, dss, metric, relabelConfigs, nil)
|
WriteRelabelDebugSteps(w, targetURL, targetID, format, dss, metric, relabelConfigs, nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
func newDebugRelabelSteps(pcs *ParsedConfigs, labels *promutils.Labels, isTargetRelabel bool) ([]DebugStep, string) {
|
func newDebugRelabelSteps(pcs *ParsedConfigs, labels *promutils.Labels, isTargetRelabel bool) ([]DebugStep, string) {
|
||||||
|
|
|
@ -1,11 +1,20 @@
|
||||||
{% import (
|
{% import (
|
||||||
|
"fmt"
|
||||||
"github.com/VictoriaMetrics/VictoriaMetrics/lib/htmlcomponents"
|
"github.com/VictoriaMetrics/VictoriaMetrics/lib/htmlcomponents"
|
||||||
"github.com/VictoriaMetrics/VictoriaMetrics/lib/promutils"
|
"github.com/VictoriaMetrics/VictoriaMetrics/lib/promutils"
|
||||||
) %}
|
) %}
|
||||||
|
|
||||||
{% stripspace %}
|
{% stripspace %}
|
||||||
|
|
||||||
{% func RelabelDebugSteps(targetURL string, targetID string, dss []DebugStep, metric, relabelConfigs string, err error) %}
|
{% func RelabelDebugSteps(targetURL, targetID, format string, dss []DebugStep, metric, relabelConfigs string, err error) %}
|
||||||
|
{% if format == "json" %}
|
||||||
|
{%= RelabelDebugStepsJSON(targetURL, targetID, dss, metric, relabelConfigs, err) %}
|
||||||
|
{% else %}
|
||||||
|
{%= RelabelDebugStepsHTML(targetURL, targetID, dss, metric, relabelConfigs, err) %}
|
||||||
|
{% endif %}
|
||||||
|
{% endfunc %}
|
||||||
|
|
||||||
|
{% func RelabelDebugStepsHTML(targetURL, targetID string, dss []DebugStep, metric, relabelConfigs string, err error) %}
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
|
@ -128,6 +137,36 @@ function submitRelabelDebugForm(e) {
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endfunc %}
|
{% endfunc %}
|
||||||
|
|
||||||
|
{% func RelabelDebugStepsJSON(targetURL, targetID string, dss []DebugStep, metric, relabelConfigs string, err error) %}
|
||||||
|
{
|
||||||
|
{% if err != nil %}
|
||||||
|
"status": "error",
|
||||||
|
"error": {%q= fmt.Sprintf("Error: %s", err) %}
|
||||||
|
{% else %}
|
||||||
|
"status": "success",
|
||||||
|
{% if len(dss) > 0 %}
|
||||||
|
"originalLabels": {%q= string(mustFormatLabels(dss[0].In)) %},
|
||||||
|
"resultingLabels": {%q= string(mustFormatLabels(dss[len(dss)-1].Out)) %},
|
||||||
|
{% endif %}
|
||||||
|
"steps": [
|
||||||
|
{% for i, ds := range dss %}
|
||||||
|
{% code
|
||||||
|
inLabels := promutils.MustNewLabelsFromString(ds.In)
|
||||||
|
outLabels := promutils.MustNewLabelsFromString(ds.Out)
|
||||||
|
changedLabels := getChangedLabelNames(inLabels, outLabels)
|
||||||
|
%}
|
||||||
|
{
|
||||||
|
"inLabels": {%q= labelsWithHighlight(inLabels, changedLabels, "red") %},
|
||||||
|
"outLabels": {%q= labelsWithHighlight(outLabels, changedLabels, "blue") %},
|
||||||
|
"rule": {%q= ds.Rule %}
|
||||||
|
}
|
||||||
|
{% if i != len(dss)-1 %},{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
]
|
||||||
|
{% endif %}
|
||||||
|
}
|
||||||
|
{% endfunc %}
|
||||||
|
|
||||||
{% func labelsWithHighlight(labels *promutils.Labels, highlight map[string]struct{}, color string) %}
|
{% func labelsWithHighlight(labels *promutils.Labels, highlight map[string]struct{}, color string) %}
|
||||||
{% code
|
{% code
|
||||||
labelsList := labels.GetLabels()
|
labelsList := labels.GetLabels()
|
||||||
|
|
|
@ -6,296 +6,432 @@ package promrelabel
|
||||||
|
|
||||||
//line lib/promrelabel/debug.qtpl:1
|
//line lib/promrelabel/debug.qtpl:1
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"github.com/VictoriaMetrics/VictoriaMetrics/lib/htmlcomponents"
|
"github.com/VictoriaMetrics/VictoriaMetrics/lib/htmlcomponents"
|
||||||
"github.com/VictoriaMetrics/VictoriaMetrics/lib/promutils"
|
"github.com/VictoriaMetrics/VictoriaMetrics/lib/promutils"
|
||||||
)
|
)
|
||||||
|
|
||||||
//line lib/promrelabel/debug.qtpl:8
|
//line lib/promrelabel/debug.qtpl:9
|
||||||
import (
|
import (
|
||||||
qtio422016 "io"
|
qtio422016 "io"
|
||||||
|
|
||||||
qt422016 "github.com/valyala/quicktemplate"
|
qt422016 "github.com/valyala/quicktemplate"
|
||||||
)
|
)
|
||||||
|
|
||||||
//line lib/promrelabel/debug.qtpl:8
|
//line lib/promrelabel/debug.qtpl:9
|
||||||
var (
|
var (
|
||||||
_ = qtio422016.Copy
|
_ = qtio422016.Copy
|
||||||
_ = qt422016.AcquireByteBuffer
|
_ = qt422016.AcquireByteBuffer
|
||||||
)
|
)
|
||||||
|
|
||||||
//line lib/promrelabel/debug.qtpl:8
|
//line lib/promrelabel/debug.qtpl:9
|
||||||
func StreamRelabelDebugSteps(qw422016 *qt422016.Writer, targetURL string, targetID string, dss []DebugStep, metric, relabelConfigs string, err error) {
|
func StreamRelabelDebugSteps(qw422016 *qt422016.Writer, targetURL, targetID, format string, dss []DebugStep, metric, relabelConfigs string, err error) {
|
||||||
//line lib/promrelabel/debug.qtpl:8
|
//line lib/promrelabel/debug.qtpl:10
|
||||||
qw422016.N().S(`<!DOCTYPE html><html lang="en"><head>`)
|
if format == "json" {
|
||||||
|
//line lib/promrelabel/debug.qtpl:11
|
||||||
|
StreamRelabelDebugStepsJSON(qw422016, targetURL, targetID, dss, metric, relabelConfigs, err)
|
||||||
//line lib/promrelabel/debug.qtpl:12
|
//line lib/promrelabel/debug.qtpl:12
|
||||||
htmlcomponents.StreamCommonHeader(qw422016)
|
|
||||||
//line lib/promrelabel/debug.qtpl:12
|
|
||||||
qw422016.N().S(`<title>Metric relabel debug</title><script>function submitRelabelDebugForm(e) {var form = e.target;var method = "GET";if (form.elements["relabel_configs"].value.length + form.elements["metric"].value.length > 1000) {method = "POST";}form.method = method;}</script></head><body>`)
|
|
||||||
//line lib/promrelabel/debug.qtpl:26
|
|
||||||
htmlcomponents.StreamNavbar(qw422016)
|
|
||||||
//line lib/promrelabel/debug.qtpl:26
|
|
||||||
qw422016.N().S(`<div class="container-fluid"><a href="https://docs.victoriametrics.com/relabeling.html" target="_blank">Relabeling docs</a>`)
|
|
||||||
//line lib/promrelabel/debug.qtpl:28
|
|
||||||
qw422016.N().S(` `)
|
|
||||||
//line lib/promrelabel/debug.qtpl:30
|
|
||||||
if targetURL != "" {
|
|
||||||
//line lib/promrelabel/debug.qtpl:30
|
|
||||||
qw422016.N().S(`<a href="metric-relabel-debug`)
|
|
||||||
//line lib/promrelabel/debug.qtpl:31
|
|
||||||
if targetID != "" {
|
|
||||||
//line lib/promrelabel/debug.qtpl:31
|
|
||||||
qw422016.N().S(`?id=`)
|
|
||||||
//line lib/promrelabel/debug.qtpl:31
|
|
||||||
qw422016.E().S(targetID)
|
|
||||||
//line lib/promrelabel/debug.qtpl:31
|
|
||||||
}
|
|
||||||
//line lib/promrelabel/debug.qtpl:31
|
|
||||||
qw422016.N().S(`">Metric relabel debug</a>`)
|
|
||||||
//line lib/promrelabel/debug.qtpl:32
|
|
||||||
} else {
|
} else {
|
||||||
//line lib/promrelabel/debug.qtpl:32
|
//line lib/promrelabel/debug.qtpl:13
|
||||||
qw422016.N().S(`<a href="target-relabel-debug`)
|
StreamRelabelDebugStepsHTML(qw422016, targetURL, targetID, dss, metric, relabelConfigs, err)
|
||||||
//line lib/promrelabel/debug.qtpl:33
|
//line lib/promrelabel/debug.qtpl:14
|
||||||
if targetID != "" {
|
|
||||||
//line lib/promrelabel/debug.qtpl:33
|
|
||||||
qw422016.N().S(`?id=`)
|
|
||||||
//line lib/promrelabel/debug.qtpl:33
|
|
||||||
qw422016.E().S(targetID)
|
|
||||||
//line lib/promrelabel/debug.qtpl:33
|
|
||||||
}
|
|
||||||
//line lib/promrelabel/debug.qtpl:33
|
|
||||||
qw422016.N().S(`">Target relabel debug</a>`)
|
|
||||||
//line lib/promrelabel/debug.qtpl:34
|
|
||||||
}
|
}
|
||||||
//line lib/promrelabel/debug.qtpl:34
|
//line lib/promrelabel/debug.qtpl:15
|
||||||
qw422016.N().S(`<br>`)
|
}
|
||||||
|
|
||||||
|
//line lib/promrelabel/debug.qtpl:15
|
||||||
|
func WriteRelabelDebugSteps(qq422016 qtio422016.Writer, targetURL, targetID, format string, dss []DebugStep, metric, relabelConfigs string, err error) {
|
||||||
|
//line lib/promrelabel/debug.qtpl:15
|
||||||
|
qw422016 := qt422016.AcquireWriter(qq422016)
|
||||||
|
//line lib/promrelabel/debug.qtpl:15
|
||||||
|
StreamRelabelDebugSteps(qw422016, targetURL, targetID, format, dss, metric, relabelConfigs, err)
|
||||||
|
//line lib/promrelabel/debug.qtpl:15
|
||||||
|
qt422016.ReleaseWriter(qw422016)
|
||||||
|
//line lib/promrelabel/debug.qtpl:15
|
||||||
|
}
|
||||||
|
|
||||||
|
//line lib/promrelabel/debug.qtpl:15
|
||||||
|
func RelabelDebugSteps(targetURL, targetID, format string, dss []DebugStep, metric, relabelConfigs string, err error) string {
|
||||||
|
//line lib/promrelabel/debug.qtpl:15
|
||||||
|
qb422016 := qt422016.AcquireByteBuffer()
|
||||||
|
//line lib/promrelabel/debug.qtpl:15
|
||||||
|
WriteRelabelDebugSteps(qb422016, targetURL, targetID, format, dss, metric, relabelConfigs, err)
|
||||||
|
//line lib/promrelabel/debug.qtpl:15
|
||||||
|
qs422016 := string(qb422016.B)
|
||||||
|
//line lib/promrelabel/debug.qtpl:15
|
||||||
|
qt422016.ReleaseByteBuffer(qb422016)
|
||||||
|
//line lib/promrelabel/debug.qtpl:15
|
||||||
|
return qs422016
|
||||||
|
//line lib/promrelabel/debug.qtpl:15
|
||||||
|
}
|
||||||
|
|
||||||
|
//line lib/promrelabel/debug.qtpl:17
|
||||||
|
func StreamRelabelDebugStepsHTML(qw422016 *qt422016.Writer, targetURL, targetID string, dss []DebugStep, metric, relabelConfigs string, err error) {
|
||||||
|
//line lib/promrelabel/debug.qtpl:17
|
||||||
|
qw422016.N().S(`<!DOCTYPE html><html lang="en"><head>`)
|
||||||
|
//line lib/promrelabel/debug.qtpl:21
|
||||||
|
htmlcomponents.StreamCommonHeader(qw422016)
|
||||||
|
//line lib/promrelabel/debug.qtpl:21
|
||||||
|
qw422016.N().S(`<title>Metric relabel debug</title><script>function submitRelabelDebugForm(e) {var form = e.target;var method = "GET";if (form.elements["relabel_configs"].value.length + form.elements["metric"].value.length > 1000) {method = "POST";}form.method = method;}</script></head><body>`)
|
||||||
|
//line lib/promrelabel/debug.qtpl:35
|
||||||
|
htmlcomponents.StreamNavbar(qw422016)
|
||||||
|
//line lib/promrelabel/debug.qtpl:35
|
||||||
|
qw422016.N().S(`<div class="container-fluid"><a href="https://docs.victoriametrics.com/relabeling.html" target="_blank">Relabeling docs</a>`)
|
||||||
//line lib/promrelabel/debug.qtpl:37
|
//line lib/promrelabel/debug.qtpl:37
|
||||||
if err != nil {
|
qw422016.N().S(` `)
|
||||||
//line lib/promrelabel/debug.qtpl:38
|
|
||||||
htmlcomponents.StreamErrorNotification(qw422016, err)
|
|
||||||
//line lib/promrelabel/debug.qtpl:39
|
//line lib/promrelabel/debug.qtpl:39
|
||||||
}
|
if targetURL != "" {
|
||||||
//line lib/promrelabel/debug.qtpl:39
|
//line lib/promrelabel/debug.qtpl:39
|
||||||
qw422016.N().S(`<div class="m-3"><form method="POST" onsubmit="submitRelabelDebugForm(event)">`)
|
qw422016.N().S(`<a href="metric-relabel-debug`)
|
||||||
|
//line lib/promrelabel/debug.qtpl:40
|
||||||
|
if targetID != "" {
|
||||||
|
//line lib/promrelabel/debug.qtpl:40
|
||||||
|
qw422016.N().S(`?id=`)
|
||||||
|
//line lib/promrelabel/debug.qtpl:40
|
||||||
|
qw422016.E().S(targetID)
|
||||||
|
//line lib/promrelabel/debug.qtpl:40
|
||||||
|
}
|
||||||
|
//line lib/promrelabel/debug.qtpl:40
|
||||||
|
qw422016.N().S(`">Metric relabel debug</a>`)
|
||||||
|
//line lib/promrelabel/debug.qtpl:41
|
||||||
|
} else {
|
||||||
|
//line lib/promrelabel/debug.qtpl:41
|
||||||
|
qw422016.N().S(`<a href="target-relabel-debug`)
|
||||||
|
//line lib/promrelabel/debug.qtpl:42
|
||||||
|
if targetID != "" {
|
||||||
|
//line lib/promrelabel/debug.qtpl:42
|
||||||
|
qw422016.N().S(`?id=`)
|
||||||
|
//line lib/promrelabel/debug.qtpl:42
|
||||||
|
qw422016.E().S(targetID)
|
||||||
|
//line lib/promrelabel/debug.qtpl:42
|
||||||
|
}
|
||||||
|
//line lib/promrelabel/debug.qtpl:42
|
||||||
|
qw422016.N().S(`">Target relabel debug</a>`)
|
||||||
//line lib/promrelabel/debug.qtpl:43
|
//line lib/promrelabel/debug.qtpl:43
|
||||||
|
}
|
||||||
|
//line lib/promrelabel/debug.qtpl:43
|
||||||
|
qw422016.N().S(`<br>`)
|
||||||
|
//line lib/promrelabel/debug.qtpl:46
|
||||||
|
if err != nil {
|
||||||
|
//line lib/promrelabel/debug.qtpl:47
|
||||||
|
htmlcomponents.StreamErrorNotification(qw422016, err)
|
||||||
|
//line lib/promrelabel/debug.qtpl:48
|
||||||
|
}
|
||||||
|
//line lib/promrelabel/debug.qtpl:48
|
||||||
|
qw422016.N().S(`<div class="m-3"><form method="POST" onsubmit="submitRelabelDebugForm(event)">`)
|
||||||
|
//line lib/promrelabel/debug.qtpl:52
|
||||||
streamrelabelDebugFormInputs(qw422016, metric, relabelConfigs)
|
streamrelabelDebugFormInputs(qw422016, metric, relabelConfigs)
|
||||||
//line lib/promrelabel/debug.qtpl:44
|
//line lib/promrelabel/debug.qtpl:53
|
||||||
if targetID != "" {
|
if targetID != "" {
|
||||||
//line lib/promrelabel/debug.qtpl:44
|
//line lib/promrelabel/debug.qtpl:53
|
||||||
qw422016.N().S(`<input type="hidden" name="id" value="`)
|
qw422016.N().S(`<input type="hidden" name="id" value="`)
|
||||||
//line lib/promrelabel/debug.qtpl:45
|
//line lib/promrelabel/debug.qtpl:54
|
||||||
qw422016.E().S(targetID)
|
qw422016.E().S(targetID)
|
||||||
//line lib/promrelabel/debug.qtpl:45
|
//line lib/promrelabel/debug.qtpl:54
|
||||||
qw422016.N().S(`" />`)
|
qw422016.N().S(`" />`)
|
||||||
//line lib/promrelabel/debug.qtpl:46
|
//line lib/promrelabel/debug.qtpl:55
|
||||||
}
|
}
|
||||||
//line lib/promrelabel/debug.qtpl:46
|
//line lib/promrelabel/debug.qtpl:55
|
||||||
qw422016.N().S(`<input type="submit" value="Submit" class="btn btn-primary m-1" />`)
|
qw422016.N().S(`<input type="submit" value="Submit" class="btn btn-primary m-1" />`)
|
||||||
//line lib/promrelabel/debug.qtpl:48
|
//line lib/promrelabel/debug.qtpl:57
|
||||||
if targetID != "" {
|
if targetID != "" {
|
||||||
//line lib/promrelabel/debug.qtpl:48
|
//line lib/promrelabel/debug.qtpl:57
|
||||||
qw422016.N().S(`<button type="button" onclick="location.href='?id=`)
|
qw422016.N().S(`<button type="button" onclick="location.href='?id=`)
|
||||||
//line lib/promrelabel/debug.qtpl:49
|
//line lib/promrelabel/debug.qtpl:58
|
||||||
qw422016.E().S(targetID)
|
qw422016.E().S(targetID)
|
||||||
//line lib/promrelabel/debug.qtpl:49
|
//line lib/promrelabel/debug.qtpl:58
|
||||||
qw422016.N().S(`'" class="btn btn-secondary m-1">Reset</button>`)
|
qw422016.N().S(`'" class="btn btn-secondary m-1">Reset</button>`)
|
||||||
//line lib/promrelabel/debug.qtpl:50
|
//line lib/promrelabel/debug.qtpl:59
|
||||||
}
|
}
|
||||||
//line lib/promrelabel/debug.qtpl:50
|
//line lib/promrelabel/debug.qtpl:59
|
||||||
qw422016.N().S(`</form></div><div class="row"><main class="col-12">`)
|
qw422016.N().S(`</form></div><div class="row"><main class="col-12">`)
|
||||||
//line lib/promrelabel/debug.qtpl:56
|
//line lib/promrelabel/debug.qtpl:65
|
||||||
streamrelabelDebugSteps(qw422016, dss, targetURL, targetID)
|
streamrelabelDebugSteps(qw422016, dss, targetURL, targetID)
|
||||||
//line lib/promrelabel/debug.qtpl:56
|
//line lib/promrelabel/debug.qtpl:65
|
||||||
qw422016.N().S(`</main></div></div></body></html>`)
|
qw422016.N().S(`</main></div></div></body></html>`)
|
||||||
//line lib/promrelabel/debug.qtpl:62
|
//line lib/promrelabel/debug.qtpl:71
|
||||||
}
|
}
|
||||||
|
|
||||||
//line lib/promrelabel/debug.qtpl:62
|
//line lib/promrelabel/debug.qtpl:71
|
||||||
func WriteRelabelDebugSteps(qq422016 qtio422016.Writer, targetURL string, targetID string, dss []DebugStep, metric, relabelConfigs string, err error) {
|
func WriteRelabelDebugStepsHTML(qq422016 qtio422016.Writer, targetURL, targetID string, dss []DebugStep, metric, relabelConfigs string, err error) {
|
||||||
//line lib/promrelabel/debug.qtpl:62
|
//line lib/promrelabel/debug.qtpl:71
|
||||||
qw422016 := qt422016.AcquireWriter(qq422016)
|
qw422016 := qt422016.AcquireWriter(qq422016)
|
||||||
//line lib/promrelabel/debug.qtpl:62
|
//line lib/promrelabel/debug.qtpl:71
|
||||||
StreamRelabelDebugSteps(qw422016, targetURL, targetID, dss, metric, relabelConfigs, err)
|
StreamRelabelDebugStepsHTML(qw422016, targetURL, targetID, dss, metric, relabelConfigs, err)
|
||||||
//line lib/promrelabel/debug.qtpl:62
|
//line lib/promrelabel/debug.qtpl:71
|
||||||
qt422016.ReleaseWriter(qw422016)
|
qt422016.ReleaseWriter(qw422016)
|
||||||
//line lib/promrelabel/debug.qtpl:62
|
//line lib/promrelabel/debug.qtpl:71
|
||||||
}
|
}
|
||||||
|
|
||||||
//line lib/promrelabel/debug.qtpl:62
|
//line lib/promrelabel/debug.qtpl:71
|
||||||
func RelabelDebugSteps(targetURL string, targetID string, dss []DebugStep, metric, relabelConfigs string, err error) string {
|
func RelabelDebugStepsHTML(targetURL, targetID string, dss []DebugStep, metric, relabelConfigs string, err error) string {
|
||||||
//line lib/promrelabel/debug.qtpl:62
|
//line lib/promrelabel/debug.qtpl:71
|
||||||
qb422016 := qt422016.AcquireByteBuffer()
|
qb422016 := qt422016.AcquireByteBuffer()
|
||||||
//line lib/promrelabel/debug.qtpl:62
|
//line lib/promrelabel/debug.qtpl:71
|
||||||
WriteRelabelDebugSteps(qb422016, targetURL, targetID, dss, metric, relabelConfigs, err)
|
WriteRelabelDebugStepsHTML(qb422016, targetURL, targetID, dss, metric, relabelConfigs, err)
|
||||||
//line lib/promrelabel/debug.qtpl:62
|
//line lib/promrelabel/debug.qtpl:71
|
||||||
qs422016 := string(qb422016.B)
|
qs422016 := string(qb422016.B)
|
||||||
//line lib/promrelabel/debug.qtpl:62
|
//line lib/promrelabel/debug.qtpl:71
|
||||||
qt422016.ReleaseByteBuffer(qb422016)
|
qt422016.ReleaseByteBuffer(qb422016)
|
||||||
//line lib/promrelabel/debug.qtpl:62
|
//line lib/promrelabel/debug.qtpl:71
|
||||||
return qs422016
|
return qs422016
|
||||||
//line lib/promrelabel/debug.qtpl:62
|
//line lib/promrelabel/debug.qtpl:71
|
||||||
}
|
}
|
||||||
|
|
||||||
//line lib/promrelabel/debug.qtpl:64
|
//line lib/promrelabel/debug.qtpl:73
|
||||||
func streamrelabelDebugFormInputs(qw422016 *qt422016.Writer, metric, relabelConfigs string) {
|
func streamrelabelDebugFormInputs(qw422016 *qt422016.Writer, metric, relabelConfigs string) {
|
||||||
//line lib/promrelabel/debug.qtpl:64
|
//line lib/promrelabel/debug.qtpl:73
|
||||||
qw422016.N().S(`<div>Relabel configs:<br/><textarea name="relabel_configs" style="width: 100%; height: 15em" class="m-1">`)
|
qw422016.N().S(`<div>Relabel configs:<br/><textarea name="relabel_configs" style="width: 100%; height: 15em" class="m-1">`)
|
||||||
//line lib/promrelabel/debug.qtpl:67
|
|
||||||
qw422016.E().S(relabelConfigs)
|
|
||||||
//line lib/promrelabel/debug.qtpl:67
|
|
||||||
qw422016.N().S(`</textarea></div><div>Labels:<br/><textarea name="metric" style="width: 100%; height: 5em" class="m-1">`)
|
|
||||||
//line lib/promrelabel/debug.qtpl:72
|
|
||||||
qw422016.E().S(metric)
|
|
||||||
//line lib/promrelabel/debug.qtpl:72
|
|
||||||
qw422016.N().S(`</textarea></div>`)
|
|
||||||
//line lib/promrelabel/debug.qtpl:74
|
|
||||||
}
|
|
||||||
|
|
||||||
//line lib/promrelabel/debug.qtpl:74
|
|
||||||
func writerelabelDebugFormInputs(qq422016 qtio422016.Writer, metric, relabelConfigs string) {
|
|
||||||
//line lib/promrelabel/debug.qtpl:74
|
|
||||||
qw422016 := qt422016.AcquireWriter(qq422016)
|
|
||||||
//line lib/promrelabel/debug.qtpl:74
|
|
||||||
streamrelabelDebugFormInputs(qw422016, metric, relabelConfigs)
|
|
||||||
//line lib/promrelabel/debug.qtpl:74
|
|
||||||
qt422016.ReleaseWriter(qw422016)
|
|
||||||
//line lib/promrelabel/debug.qtpl:74
|
|
||||||
}
|
|
||||||
|
|
||||||
//line lib/promrelabel/debug.qtpl:74
|
|
||||||
func relabelDebugFormInputs(metric, relabelConfigs string) string {
|
|
||||||
//line lib/promrelabel/debug.qtpl:74
|
|
||||||
qb422016 := qt422016.AcquireByteBuffer()
|
|
||||||
//line lib/promrelabel/debug.qtpl:74
|
|
||||||
writerelabelDebugFormInputs(qb422016, metric, relabelConfigs)
|
|
||||||
//line lib/promrelabel/debug.qtpl:74
|
|
||||||
qs422016 := string(qb422016.B)
|
|
||||||
//line lib/promrelabel/debug.qtpl:74
|
|
||||||
qt422016.ReleaseByteBuffer(qb422016)
|
|
||||||
//line lib/promrelabel/debug.qtpl:74
|
|
||||||
return qs422016
|
|
||||||
//line lib/promrelabel/debug.qtpl:74
|
|
||||||
}
|
|
||||||
|
|
||||||
//line lib/promrelabel/debug.qtpl:76
|
//line lib/promrelabel/debug.qtpl:76
|
||||||
|
qw422016.E().S(relabelConfigs)
|
||||||
|
//line lib/promrelabel/debug.qtpl:76
|
||||||
|
qw422016.N().S(`</textarea></div><div>Labels:<br/><textarea name="metric" style="width: 100%; height: 5em" class="m-1">`)
|
||||||
|
//line lib/promrelabel/debug.qtpl:81
|
||||||
|
qw422016.E().S(metric)
|
||||||
|
//line lib/promrelabel/debug.qtpl:81
|
||||||
|
qw422016.N().S(`</textarea></div>`)
|
||||||
|
//line lib/promrelabel/debug.qtpl:83
|
||||||
|
}
|
||||||
|
|
||||||
|
//line lib/promrelabel/debug.qtpl:83
|
||||||
|
func writerelabelDebugFormInputs(qq422016 qtio422016.Writer, metric, relabelConfigs string) {
|
||||||
|
//line lib/promrelabel/debug.qtpl:83
|
||||||
|
qw422016 := qt422016.AcquireWriter(qq422016)
|
||||||
|
//line lib/promrelabel/debug.qtpl:83
|
||||||
|
streamrelabelDebugFormInputs(qw422016, metric, relabelConfigs)
|
||||||
|
//line lib/promrelabel/debug.qtpl:83
|
||||||
|
qt422016.ReleaseWriter(qw422016)
|
||||||
|
//line lib/promrelabel/debug.qtpl:83
|
||||||
|
}
|
||||||
|
|
||||||
|
//line lib/promrelabel/debug.qtpl:83
|
||||||
|
func relabelDebugFormInputs(metric, relabelConfigs string) string {
|
||||||
|
//line lib/promrelabel/debug.qtpl:83
|
||||||
|
qb422016 := qt422016.AcquireByteBuffer()
|
||||||
|
//line lib/promrelabel/debug.qtpl:83
|
||||||
|
writerelabelDebugFormInputs(qb422016, metric, relabelConfigs)
|
||||||
|
//line lib/promrelabel/debug.qtpl:83
|
||||||
|
qs422016 := string(qb422016.B)
|
||||||
|
//line lib/promrelabel/debug.qtpl:83
|
||||||
|
qt422016.ReleaseByteBuffer(qb422016)
|
||||||
|
//line lib/promrelabel/debug.qtpl:83
|
||||||
|
return qs422016
|
||||||
|
//line lib/promrelabel/debug.qtpl:83
|
||||||
|
}
|
||||||
|
|
||||||
|
//line lib/promrelabel/debug.qtpl:85
|
||||||
func streamrelabelDebugSteps(qw422016 *qt422016.Writer, dss []DebugStep, targetURL, targetID string) {
|
func streamrelabelDebugSteps(qw422016 *qt422016.Writer, dss []DebugStep, targetURL, targetID string) {
|
||||||
//line lib/promrelabel/debug.qtpl:77
|
//line lib/promrelabel/debug.qtpl:86
|
||||||
if len(dss) > 0 {
|
if len(dss) > 0 {
|
||||||
//line lib/promrelabel/debug.qtpl:77
|
//line lib/promrelabel/debug.qtpl:86
|
||||||
qw422016.N().S(`<div class="m-3"><b>Original labels:</b> <samp>`)
|
qw422016.N().S(`<div class="m-3"><b>Original labels:</b> <samp>`)
|
||||||
//line lib/promrelabel/debug.qtpl:79
|
//line lib/promrelabel/debug.qtpl:88
|
||||||
streammustFormatLabels(qw422016, dss[0].In)
|
streammustFormatLabels(qw422016, dss[0].In)
|
||||||
//line lib/promrelabel/debug.qtpl:79
|
//line lib/promrelabel/debug.qtpl:88
|
||||||
qw422016.N().S(`</samp></div>`)
|
qw422016.N().S(`</samp></div>`)
|
||||||
//line lib/promrelabel/debug.qtpl:81
|
//line lib/promrelabel/debug.qtpl:90
|
||||||
}
|
}
|
||||||
//line lib/promrelabel/debug.qtpl:81
|
//line lib/promrelabel/debug.qtpl:90
|
||||||
qw422016.N().S(`<table class="table table-striped table-hover table-bordered table-sm"><thead><tr><th scope="col" style="width: 5%">Step</th><th scope="col" style="width: 25%">Relabeling Rule</th><th scope="col" style="width: 35%">Input Labels</th><th scope="col" stile="width: 35%">Output labels</a></tr></thead><tbody>`)
|
qw422016.N().S(`<table class="table table-striped table-hover table-bordered table-sm"><thead><tr><th scope="col" style="width: 5%">Step</th><th scope="col" style="width: 25%">Relabeling Rule</th><th scope="col" style="width: 35%">Input Labels</th><th scope="col" stile="width: 35%">Output labels</a></tr></thead><tbody>`)
|
||||||
//line lib/promrelabel/debug.qtpl:92
|
//line lib/promrelabel/debug.qtpl:101
|
||||||
for i, ds := range dss {
|
for i, ds := range dss {
|
||||||
//line lib/promrelabel/debug.qtpl:94
|
//line lib/promrelabel/debug.qtpl:103
|
||||||
inLabels := promutils.MustNewLabelsFromString(ds.In)
|
inLabels := promutils.MustNewLabelsFromString(ds.In)
|
||||||
outLabels := promutils.MustNewLabelsFromString(ds.Out)
|
outLabels := promutils.MustNewLabelsFromString(ds.Out)
|
||||||
changedLabels := getChangedLabelNames(inLabels, outLabels)
|
changedLabels := getChangedLabelNames(inLabels, outLabels)
|
||||||
|
|
||||||
//line lib/promrelabel/debug.qtpl:97
|
//line lib/promrelabel/debug.qtpl:106
|
||||||
qw422016.N().S(`<tr><td>`)
|
qw422016.N().S(`<tr><td>`)
|
||||||
//line lib/promrelabel/debug.qtpl:99
|
//line lib/promrelabel/debug.qtpl:108
|
||||||
qw422016.N().D(i)
|
qw422016.N().D(i)
|
||||||
//line lib/promrelabel/debug.qtpl:99
|
//line lib/promrelabel/debug.qtpl:108
|
||||||
qw422016.N().S(`</td><td><b><pre class="m-2">`)
|
qw422016.N().S(`</td><td><b><pre class="m-2">`)
|
||||||
//line lib/promrelabel/debug.qtpl:100
|
//line lib/promrelabel/debug.qtpl:109
|
||||||
qw422016.E().S(ds.Rule)
|
qw422016.E().S(ds.Rule)
|
||||||
//line lib/promrelabel/debug.qtpl:100
|
//line lib/promrelabel/debug.qtpl:109
|
||||||
qw422016.N().S(`</pre></b></td><td><div class="m-2" style="font-size: 0.9em" title="deleted and updated labels highlighted in red">`)
|
qw422016.N().S(`</pre></b></td><td><div class="m-2" style="font-size: 0.9em" title="deleted and updated labels highlighted in red">`)
|
||||||
//line lib/promrelabel/debug.qtpl:103
|
//line lib/promrelabel/debug.qtpl:112
|
||||||
streamlabelsWithHighlight(qw422016, inLabels, changedLabels, "red")
|
streamlabelsWithHighlight(qw422016, inLabels, changedLabels, "red")
|
||||||
//line lib/promrelabel/debug.qtpl:103
|
//line lib/promrelabel/debug.qtpl:112
|
||||||
qw422016.N().S(`</div></td><td><div class="m-2" style="font-size: 0.9em" title="added and updated labels highlighted in blue">`)
|
qw422016.N().S(`</div></td><td><div class="m-2" style="font-size: 0.9em" title="added and updated labels highlighted in blue">`)
|
||||||
//line lib/promrelabel/debug.qtpl:108
|
//line lib/promrelabel/debug.qtpl:117
|
||||||
streamlabelsWithHighlight(qw422016, outLabels, changedLabels, "blue")
|
streamlabelsWithHighlight(qw422016, outLabels, changedLabels, "blue")
|
||||||
//line lib/promrelabel/debug.qtpl:108
|
//line lib/promrelabel/debug.qtpl:117
|
||||||
qw422016.N().S(`</div></td></tr>`)
|
qw422016.N().S(`</div></td></tr>`)
|
||||||
//line lib/promrelabel/debug.qtpl:112
|
|
||||||
}
|
|
||||||
//line lib/promrelabel/debug.qtpl:112
|
|
||||||
qw422016.N().S(`</tbody></table>`)
|
|
||||||
//line lib/promrelabel/debug.qtpl:115
|
|
||||||
if len(dss) > 0 {
|
|
||||||
//line lib/promrelabel/debug.qtpl:115
|
|
||||||
qw422016.N().S(`<div class="m-3"><b>Resulting labels:</b> <samp>`)
|
|
||||||
//line lib/promrelabel/debug.qtpl:117
|
|
||||||
streammustFormatLabels(qw422016, dss[len(dss)-1].Out)
|
|
||||||
//line lib/promrelabel/debug.qtpl:117
|
|
||||||
qw422016.N().S(`</samp>`)
|
|
||||||
//line lib/promrelabel/debug.qtpl:118
|
|
||||||
if targetURL != "" {
|
|
||||||
//line lib/promrelabel/debug.qtpl:118
|
|
||||||
qw422016.N().S(`<div><b>Target URL:</b>`)
|
|
||||||
//line lib/promrelabel/debug.qtpl:120
|
|
||||||
qw422016.N().S(` `)
|
|
||||||
//line lib/promrelabel/debug.qtpl:120
|
|
||||||
qw422016.N().S(`<a href="`)
|
|
||||||
//line lib/promrelabel/debug.qtpl:120
|
|
||||||
qw422016.E().S(targetURL)
|
|
||||||
//line lib/promrelabel/debug.qtpl:120
|
|
||||||
qw422016.N().S(`" target="_blank">`)
|
|
||||||
//line lib/promrelabel/debug.qtpl:120
|
|
||||||
qw422016.E().S(targetURL)
|
|
||||||
//line lib/promrelabel/debug.qtpl:120
|
|
||||||
qw422016.N().S(`</a>`)
|
|
||||||
//line lib/promrelabel/debug.qtpl:121
|
//line lib/promrelabel/debug.qtpl:121
|
||||||
if targetID != "" {
|
|
||||||
//line lib/promrelabel/debug.qtpl:122
|
|
||||||
qw422016.N().S(` `)
|
|
||||||
//line lib/promrelabel/debug.qtpl:122
|
|
||||||
qw422016.N().S(`(<a href="target_response?id=`)
|
|
||||||
//line lib/promrelabel/debug.qtpl:123
|
|
||||||
qw422016.E().S(targetID)
|
|
||||||
//line lib/promrelabel/debug.qtpl:123
|
|
||||||
qw422016.N().S(`" target="_blank" title="click to fetch target response on behalf of the scraper">response</a>)`)
|
|
||||||
//line lib/promrelabel/debug.qtpl:124
|
|
||||||
}
|
|
||||||
//line lib/promrelabel/debug.qtpl:124
|
|
||||||
qw422016.N().S(`</div>`)
|
|
||||||
//line lib/promrelabel/debug.qtpl:126
|
|
||||||
}
|
|
||||||
//line lib/promrelabel/debug.qtpl:126
|
|
||||||
qw422016.N().S(`</div>`)
|
|
||||||
//line lib/promrelabel/debug.qtpl:128
|
|
||||||
}
|
}
|
||||||
|
//line lib/promrelabel/debug.qtpl:121
|
||||||
|
qw422016.N().S(`</tbody></table>`)
|
||||||
|
//line lib/promrelabel/debug.qtpl:124
|
||||||
|
if len(dss) > 0 {
|
||||||
|
//line lib/promrelabel/debug.qtpl:124
|
||||||
|
qw422016.N().S(`<div class="m-3"><b>Resulting labels:</b> <samp>`)
|
||||||
|
//line lib/promrelabel/debug.qtpl:126
|
||||||
|
streammustFormatLabels(qw422016, dss[len(dss)-1].Out)
|
||||||
|
//line lib/promrelabel/debug.qtpl:126
|
||||||
|
qw422016.N().S(`</samp>`)
|
||||||
|
//line lib/promrelabel/debug.qtpl:127
|
||||||
|
if targetURL != "" {
|
||||||
|
//line lib/promrelabel/debug.qtpl:127
|
||||||
|
qw422016.N().S(`<div><b>Target URL:</b>`)
|
||||||
//line lib/promrelabel/debug.qtpl:129
|
//line lib/promrelabel/debug.qtpl:129
|
||||||
}
|
qw422016.N().S(` `)
|
||||||
|
|
||||||
//line lib/promrelabel/debug.qtpl:129
|
//line lib/promrelabel/debug.qtpl:129
|
||||||
func writerelabelDebugSteps(qq422016 qtio422016.Writer, dss []DebugStep, targetURL, targetID string) {
|
qw422016.N().S(`<a href="`)
|
||||||
//line lib/promrelabel/debug.qtpl:129
|
//line lib/promrelabel/debug.qtpl:129
|
||||||
qw422016 := qt422016.AcquireWriter(qq422016)
|
qw422016.E().S(targetURL)
|
||||||
//line lib/promrelabel/debug.qtpl:129
|
//line lib/promrelabel/debug.qtpl:129
|
||||||
streamrelabelDebugSteps(qw422016, dss, targetURL, targetID)
|
qw422016.N().S(`" target="_blank">`)
|
||||||
//line lib/promrelabel/debug.qtpl:129
|
//line lib/promrelabel/debug.qtpl:129
|
||||||
qt422016.ReleaseWriter(qw422016)
|
qw422016.E().S(targetURL)
|
||||||
//line lib/promrelabel/debug.qtpl:129
|
//line lib/promrelabel/debug.qtpl:129
|
||||||
}
|
qw422016.N().S(`</a>`)
|
||||||
|
//line lib/promrelabel/debug.qtpl:130
|
||||||
//line lib/promrelabel/debug.qtpl:129
|
if targetID != "" {
|
||||||
func relabelDebugSteps(dss []DebugStep, targetURL, targetID string) string {
|
|
||||||
//line lib/promrelabel/debug.qtpl:129
|
|
||||||
qb422016 := qt422016.AcquireByteBuffer()
|
|
||||||
//line lib/promrelabel/debug.qtpl:129
|
|
||||||
writerelabelDebugSteps(qb422016, dss, targetURL, targetID)
|
|
||||||
//line lib/promrelabel/debug.qtpl:129
|
|
||||||
qs422016 := string(qb422016.B)
|
|
||||||
//line lib/promrelabel/debug.qtpl:129
|
|
||||||
qt422016.ReleaseByteBuffer(qb422016)
|
|
||||||
//line lib/promrelabel/debug.qtpl:129
|
|
||||||
return qs422016
|
|
||||||
//line lib/promrelabel/debug.qtpl:129
|
|
||||||
}
|
|
||||||
|
|
||||||
//line lib/promrelabel/debug.qtpl:131
|
//line lib/promrelabel/debug.qtpl:131
|
||||||
func streamlabelsWithHighlight(qw422016 *qt422016.Writer, labels *promutils.Labels, highlight map[string]struct{}, color string) {
|
qw422016.N().S(` `)
|
||||||
|
//line lib/promrelabel/debug.qtpl:131
|
||||||
|
qw422016.N().S(`(<a href="target_response?id=`)
|
||||||
|
//line lib/promrelabel/debug.qtpl:132
|
||||||
|
qw422016.E().S(targetID)
|
||||||
|
//line lib/promrelabel/debug.qtpl:132
|
||||||
|
qw422016.N().S(`" target="_blank" title="click to fetch target response on behalf of the scraper">response</a>)`)
|
||||||
//line lib/promrelabel/debug.qtpl:133
|
//line lib/promrelabel/debug.qtpl:133
|
||||||
|
}
|
||||||
|
//line lib/promrelabel/debug.qtpl:133
|
||||||
|
qw422016.N().S(`</div>`)
|
||||||
|
//line lib/promrelabel/debug.qtpl:135
|
||||||
|
}
|
||||||
|
//line lib/promrelabel/debug.qtpl:135
|
||||||
|
qw422016.N().S(`</div>`)
|
||||||
|
//line lib/promrelabel/debug.qtpl:137
|
||||||
|
}
|
||||||
|
//line lib/promrelabel/debug.qtpl:138
|
||||||
|
}
|
||||||
|
|
||||||
|
//line lib/promrelabel/debug.qtpl:138
|
||||||
|
func writerelabelDebugSteps(qq422016 qtio422016.Writer, dss []DebugStep, targetURL, targetID string) {
|
||||||
|
//line lib/promrelabel/debug.qtpl:138
|
||||||
|
qw422016 := qt422016.AcquireWriter(qq422016)
|
||||||
|
//line lib/promrelabel/debug.qtpl:138
|
||||||
|
streamrelabelDebugSteps(qw422016, dss, targetURL, targetID)
|
||||||
|
//line lib/promrelabel/debug.qtpl:138
|
||||||
|
qt422016.ReleaseWriter(qw422016)
|
||||||
|
//line lib/promrelabel/debug.qtpl:138
|
||||||
|
}
|
||||||
|
|
||||||
|
//line lib/promrelabel/debug.qtpl:138
|
||||||
|
func relabelDebugSteps(dss []DebugStep, targetURL, targetID string) string {
|
||||||
|
//line lib/promrelabel/debug.qtpl:138
|
||||||
|
qb422016 := qt422016.AcquireByteBuffer()
|
||||||
|
//line lib/promrelabel/debug.qtpl:138
|
||||||
|
writerelabelDebugSteps(qb422016, dss, targetURL, targetID)
|
||||||
|
//line lib/promrelabel/debug.qtpl:138
|
||||||
|
qs422016 := string(qb422016.B)
|
||||||
|
//line lib/promrelabel/debug.qtpl:138
|
||||||
|
qt422016.ReleaseByteBuffer(qb422016)
|
||||||
|
//line lib/promrelabel/debug.qtpl:138
|
||||||
|
return qs422016
|
||||||
|
//line lib/promrelabel/debug.qtpl:138
|
||||||
|
}
|
||||||
|
|
||||||
|
//line lib/promrelabel/debug.qtpl:140
|
||||||
|
func StreamRelabelDebugStepsJSON(qw422016 *qt422016.Writer, targetURL, targetID string, dss []DebugStep, metric, relabelConfigs string, err error) {
|
||||||
|
//line lib/promrelabel/debug.qtpl:140
|
||||||
|
qw422016.N().S(`{`)
|
||||||
|
//line lib/promrelabel/debug.qtpl:142
|
||||||
|
if err != nil {
|
||||||
|
//line lib/promrelabel/debug.qtpl:142
|
||||||
|
qw422016.N().S(`"status": "error","error":`)
|
||||||
|
//line lib/promrelabel/debug.qtpl:144
|
||||||
|
qw422016.N().Q(fmt.Sprintf("Error: %s", err))
|
||||||
|
//line lib/promrelabel/debug.qtpl:145
|
||||||
|
} else {
|
||||||
|
//line lib/promrelabel/debug.qtpl:145
|
||||||
|
qw422016.N().S(`"status": "success",`)
|
||||||
|
//line lib/promrelabel/debug.qtpl:147
|
||||||
|
if len(dss) > 0 {
|
||||||
|
//line lib/promrelabel/debug.qtpl:147
|
||||||
|
qw422016.N().S(`"originalLabels":`)
|
||||||
|
//line lib/promrelabel/debug.qtpl:148
|
||||||
|
qw422016.N().Q(string(mustFormatLabels(dss[0].In)))
|
||||||
|
//line lib/promrelabel/debug.qtpl:148
|
||||||
|
qw422016.N().S(`,"resultingLabels":`)
|
||||||
|
//line lib/promrelabel/debug.qtpl:149
|
||||||
|
qw422016.N().Q(string(mustFormatLabels(dss[len(dss)-1].Out)))
|
||||||
|
//line lib/promrelabel/debug.qtpl:149
|
||||||
|
qw422016.N().S(`,`)
|
||||||
|
//line lib/promrelabel/debug.qtpl:150
|
||||||
|
}
|
||||||
|
//line lib/promrelabel/debug.qtpl:150
|
||||||
|
qw422016.N().S(`"steps": [`)
|
||||||
|
//line lib/promrelabel/debug.qtpl:152
|
||||||
|
for i, ds := range dss {
|
||||||
|
//line lib/promrelabel/debug.qtpl:154
|
||||||
|
inLabels := promutils.MustNewLabelsFromString(ds.In)
|
||||||
|
outLabels := promutils.MustNewLabelsFromString(ds.Out)
|
||||||
|
changedLabels := getChangedLabelNames(inLabels, outLabels)
|
||||||
|
|
||||||
|
//line lib/promrelabel/debug.qtpl:157
|
||||||
|
qw422016.N().S(`{"inLabels":`)
|
||||||
|
//line lib/promrelabel/debug.qtpl:159
|
||||||
|
qw422016.N().Q(labelsWithHighlight(inLabels, changedLabels, "red"))
|
||||||
|
//line lib/promrelabel/debug.qtpl:159
|
||||||
|
qw422016.N().S(`,"outLabels":`)
|
||||||
|
//line lib/promrelabel/debug.qtpl:160
|
||||||
|
qw422016.N().Q(labelsWithHighlight(outLabels, changedLabels, "blue"))
|
||||||
|
//line lib/promrelabel/debug.qtpl:160
|
||||||
|
qw422016.N().S(`,"rule":`)
|
||||||
|
//line lib/promrelabel/debug.qtpl:161
|
||||||
|
qw422016.N().Q(ds.Rule)
|
||||||
|
//line lib/promrelabel/debug.qtpl:161
|
||||||
|
qw422016.N().S(`}`)
|
||||||
|
//line lib/promrelabel/debug.qtpl:163
|
||||||
|
if i != len(dss)-1 {
|
||||||
|
//line lib/promrelabel/debug.qtpl:163
|
||||||
|
qw422016.N().S(`,`)
|
||||||
|
//line lib/promrelabel/debug.qtpl:163
|
||||||
|
}
|
||||||
|
//line lib/promrelabel/debug.qtpl:164
|
||||||
|
}
|
||||||
|
//line lib/promrelabel/debug.qtpl:164
|
||||||
|
qw422016.N().S(`]`)
|
||||||
|
//line lib/promrelabel/debug.qtpl:166
|
||||||
|
}
|
||||||
|
//line lib/promrelabel/debug.qtpl:166
|
||||||
|
qw422016.N().S(`}`)
|
||||||
|
//line lib/promrelabel/debug.qtpl:168
|
||||||
|
}
|
||||||
|
|
||||||
|
//line lib/promrelabel/debug.qtpl:168
|
||||||
|
func WriteRelabelDebugStepsJSON(qq422016 qtio422016.Writer, targetURL, targetID string, dss []DebugStep, metric, relabelConfigs string, err error) {
|
||||||
|
//line lib/promrelabel/debug.qtpl:168
|
||||||
|
qw422016 := qt422016.AcquireWriter(qq422016)
|
||||||
|
//line lib/promrelabel/debug.qtpl:168
|
||||||
|
StreamRelabelDebugStepsJSON(qw422016, targetURL, targetID, dss, metric, relabelConfigs, err)
|
||||||
|
//line lib/promrelabel/debug.qtpl:168
|
||||||
|
qt422016.ReleaseWriter(qw422016)
|
||||||
|
//line lib/promrelabel/debug.qtpl:168
|
||||||
|
}
|
||||||
|
|
||||||
|
//line lib/promrelabel/debug.qtpl:168
|
||||||
|
func RelabelDebugStepsJSON(targetURL, targetID string, dss []DebugStep, metric, relabelConfigs string, err error) string {
|
||||||
|
//line lib/promrelabel/debug.qtpl:168
|
||||||
|
qb422016 := qt422016.AcquireByteBuffer()
|
||||||
|
//line lib/promrelabel/debug.qtpl:168
|
||||||
|
WriteRelabelDebugStepsJSON(qb422016, targetURL, targetID, dss, metric, relabelConfigs, err)
|
||||||
|
//line lib/promrelabel/debug.qtpl:168
|
||||||
|
qs422016 := string(qb422016.B)
|
||||||
|
//line lib/promrelabel/debug.qtpl:168
|
||||||
|
qt422016.ReleaseByteBuffer(qb422016)
|
||||||
|
//line lib/promrelabel/debug.qtpl:168
|
||||||
|
return qs422016
|
||||||
|
//line lib/promrelabel/debug.qtpl:168
|
||||||
|
}
|
||||||
|
|
||||||
|
//line lib/promrelabel/debug.qtpl:170
|
||||||
|
func streamlabelsWithHighlight(qw422016 *qt422016.Writer, labels *promutils.Labels, highlight map[string]struct{}, color string) {
|
||||||
|
//line lib/promrelabel/debug.qtpl:172
|
||||||
labelsList := labels.GetLabels()
|
labelsList := labels.GetLabels()
|
||||||
metricName := ""
|
metricName := ""
|
||||||
for i, label := range labelsList {
|
for i, label := range labelsList {
|
||||||
|
@ -306,137 +442,137 @@ func streamlabelsWithHighlight(qw422016 *qt422016.Writer, labels *promutils.Labe
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//line lib/promrelabel/debug.qtpl:143
|
//line lib/promrelabel/debug.qtpl:182
|
||||||
if metricName != "" {
|
if metricName != "" {
|
||||||
//line lib/promrelabel/debug.qtpl:144
|
//line lib/promrelabel/debug.qtpl:183
|
||||||
if _, ok := highlight["__name__"]; ok {
|
if _, ok := highlight["__name__"]; ok {
|
||||||
//line lib/promrelabel/debug.qtpl:144
|
//line lib/promrelabel/debug.qtpl:183
|
||||||
qw422016.N().S(`<span style="font-weight:bold;color:`)
|
qw422016.N().S(`<span style="font-weight:bold;color:`)
|
||||||
//line lib/promrelabel/debug.qtpl:145
|
//line lib/promrelabel/debug.qtpl:184
|
||||||
qw422016.E().S(color)
|
qw422016.E().S(color)
|
||||||
//line lib/promrelabel/debug.qtpl:145
|
//line lib/promrelabel/debug.qtpl:184
|
||||||
qw422016.N().S(`">`)
|
qw422016.N().S(`">`)
|
||||||
//line lib/promrelabel/debug.qtpl:145
|
//line lib/promrelabel/debug.qtpl:184
|
||||||
qw422016.E().S(metricName)
|
qw422016.E().S(metricName)
|
||||||
//line lib/promrelabel/debug.qtpl:145
|
//line lib/promrelabel/debug.qtpl:184
|
||||||
qw422016.N().S(`</span>`)
|
qw422016.N().S(`</span>`)
|
||||||
//line lib/promrelabel/debug.qtpl:146
|
//line lib/promrelabel/debug.qtpl:185
|
||||||
} else {
|
} else {
|
||||||
//line lib/promrelabel/debug.qtpl:147
|
//line lib/promrelabel/debug.qtpl:186
|
||||||
qw422016.E().S(metricName)
|
qw422016.E().S(metricName)
|
||||||
//line lib/promrelabel/debug.qtpl:148
|
//line lib/promrelabel/debug.qtpl:187
|
||||||
}
|
}
|
||||||
//line lib/promrelabel/debug.qtpl:149
|
//line lib/promrelabel/debug.qtpl:188
|
||||||
if len(labelsList) == 0 {
|
if len(labelsList) == 0 {
|
||||||
//line lib/promrelabel/debug.qtpl:149
|
//line lib/promrelabel/debug.qtpl:188
|
||||||
return
|
return
|
||||||
//line lib/promrelabel/debug.qtpl:149
|
//line lib/promrelabel/debug.qtpl:188
|
||||||
}
|
}
|
||||||
//line lib/promrelabel/debug.qtpl:150
|
//line lib/promrelabel/debug.qtpl:189
|
||||||
}
|
}
|
||||||
//line lib/promrelabel/debug.qtpl:150
|
//line lib/promrelabel/debug.qtpl:189
|
||||||
qw422016.N().S(`{`)
|
qw422016.N().S(`{`)
|
||||||
//line lib/promrelabel/debug.qtpl:152
|
//line lib/promrelabel/debug.qtpl:191
|
||||||
for i, label := range labelsList {
|
for i, label := range labelsList {
|
||||||
//line lib/promrelabel/debug.qtpl:153
|
//line lib/promrelabel/debug.qtpl:192
|
||||||
if _, ok := highlight[label.Name]; ok {
|
if _, ok := highlight[label.Name]; ok {
|
||||||
//line lib/promrelabel/debug.qtpl:153
|
//line lib/promrelabel/debug.qtpl:192
|
||||||
qw422016.N().S(`<span style="font-weight:bold;color:`)
|
qw422016.N().S(`<span style="font-weight:bold;color:`)
|
||||||
//line lib/promrelabel/debug.qtpl:154
|
//line lib/promrelabel/debug.qtpl:193
|
||||||
qw422016.E().S(color)
|
qw422016.E().S(color)
|
||||||
//line lib/promrelabel/debug.qtpl:154
|
//line lib/promrelabel/debug.qtpl:193
|
||||||
qw422016.N().S(`">`)
|
qw422016.N().S(`">`)
|
||||||
//line lib/promrelabel/debug.qtpl:154
|
//line lib/promrelabel/debug.qtpl:193
|
||||||
qw422016.E().S(label.Name)
|
qw422016.E().S(label.Name)
|
||||||
//line lib/promrelabel/debug.qtpl:154
|
//line lib/promrelabel/debug.qtpl:193
|
||||||
qw422016.N().S(`=`)
|
qw422016.N().S(`=`)
|
||||||
//line lib/promrelabel/debug.qtpl:154
|
//line lib/promrelabel/debug.qtpl:193
|
||||||
qw422016.E().Q(label.Value)
|
qw422016.E().Q(label.Value)
|
||||||
//line lib/promrelabel/debug.qtpl:154
|
//line lib/promrelabel/debug.qtpl:193
|
||||||
qw422016.N().S(`</span>`)
|
qw422016.N().S(`</span>`)
|
||||||
//line lib/promrelabel/debug.qtpl:155
|
//line lib/promrelabel/debug.qtpl:194
|
||||||
} else {
|
} else {
|
||||||
//line lib/promrelabel/debug.qtpl:156
|
//line lib/promrelabel/debug.qtpl:195
|
||||||
qw422016.E().S(label.Name)
|
qw422016.E().S(label.Name)
|
||||||
//line lib/promrelabel/debug.qtpl:156
|
//line lib/promrelabel/debug.qtpl:195
|
||||||
qw422016.N().S(`=`)
|
qw422016.N().S(`=`)
|
||||||
//line lib/promrelabel/debug.qtpl:156
|
//line lib/promrelabel/debug.qtpl:195
|
||||||
qw422016.E().Q(label.Value)
|
qw422016.E().Q(label.Value)
|
||||||
//line lib/promrelabel/debug.qtpl:157
|
//line lib/promrelabel/debug.qtpl:196
|
||||||
}
|
}
|
||||||
//line lib/promrelabel/debug.qtpl:158
|
//line lib/promrelabel/debug.qtpl:197
|
||||||
if i < len(labelsList)-1 {
|
if i < len(labelsList)-1 {
|
||||||
//line lib/promrelabel/debug.qtpl:158
|
//line lib/promrelabel/debug.qtpl:197
|
||||||
qw422016.N().S(`,`)
|
qw422016.N().S(`,`)
|
||||||
//line lib/promrelabel/debug.qtpl:158
|
//line lib/promrelabel/debug.qtpl:197
|
||||||
qw422016.N().S(` `)
|
qw422016.N().S(` `)
|
||||||
//line lib/promrelabel/debug.qtpl:158
|
//line lib/promrelabel/debug.qtpl:197
|
||||||
}
|
}
|
||||||
//line lib/promrelabel/debug.qtpl:159
|
//line lib/promrelabel/debug.qtpl:198
|
||||||
}
|
}
|
||||||
//line lib/promrelabel/debug.qtpl:159
|
//line lib/promrelabel/debug.qtpl:198
|
||||||
qw422016.N().S(`}`)
|
qw422016.N().S(`}`)
|
||||||
//line lib/promrelabel/debug.qtpl:161
|
//line lib/promrelabel/debug.qtpl:200
|
||||||
}
|
}
|
||||||
|
|
||||||
//line lib/promrelabel/debug.qtpl:161
|
//line lib/promrelabel/debug.qtpl:200
|
||||||
func writelabelsWithHighlight(qq422016 qtio422016.Writer, labels *promutils.Labels, highlight map[string]struct{}, color string) {
|
func writelabelsWithHighlight(qq422016 qtio422016.Writer, labels *promutils.Labels, highlight map[string]struct{}, color string) {
|
||||||
//line lib/promrelabel/debug.qtpl:161
|
//line lib/promrelabel/debug.qtpl:200
|
||||||
qw422016 := qt422016.AcquireWriter(qq422016)
|
qw422016 := qt422016.AcquireWriter(qq422016)
|
||||||
//line lib/promrelabel/debug.qtpl:161
|
//line lib/promrelabel/debug.qtpl:200
|
||||||
streamlabelsWithHighlight(qw422016, labels, highlight, color)
|
streamlabelsWithHighlight(qw422016, labels, highlight, color)
|
||||||
//line lib/promrelabel/debug.qtpl:161
|
//line lib/promrelabel/debug.qtpl:200
|
||||||
qt422016.ReleaseWriter(qw422016)
|
qt422016.ReleaseWriter(qw422016)
|
||||||
//line lib/promrelabel/debug.qtpl:161
|
//line lib/promrelabel/debug.qtpl:200
|
||||||
}
|
}
|
||||||
|
|
||||||
//line lib/promrelabel/debug.qtpl:161
|
//line lib/promrelabel/debug.qtpl:200
|
||||||
func labelsWithHighlight(labels *promutils.Labels, highlight map[string]struct{}, color string) string {
|
func labelsWithHighlight(labels *promutils.Labels, highlight map[string]struct{}, color string) string {
|
||||||
//line lib/promrelabel/debug.qtpl:161
|
//line lib/promrelabel/debug.qtpl:200
|
||||||
qb422016 := qt422016.AcquireByteBuffer()
|
qb422016 := qt422016.AcquireByteBuffer()
|
||||||
//line lib/promrelabel/debug.qtpl:161
|
//line lib/promrelabel/debug.qtpl:200
|
||||||
writelabelsWithHighlight(qb422016, labels, highlight, color)
|
writelabelsWithHighlight(qb422016, labels, highlight, color)
|
||||||
//line lib/promrelabel/debug.qtpl:161
|
//line lib/promrelabel/debug.qtpl:200
|
||||||
qs422016 := string(qb422016.B)
|
qs422016 := string(qb422016.B)
|
||||||
//line lib/promrelabel/debug.qtpl:161
|
//line lib/promrelabel/debug.qtpl:200
|
||||||
qt422016.ReleaseByteBuffer(qb422016)
|
qt422016.ReleaseByteBuffer(qb422016)
|
||||||
//line lib/promrelabel/debug.qtpl:161
|
//line lib/promrelabel/debug.qtpl:200
|
||||||
return qs422016
|
return qs422016
|
||||||
//line lib/promrelabel/debug.qtpl:161
|
//line lib/promrelabel/debug.qtpl:200
|
||||||
}
|
}
|
||||||
|
|
||||||
//line lib/promrelabel/debug.qtpl:163
|
//line lib/promrelabel/debug.qtpl:202
|
||||||
func streammustFormatLabels(qw422016 *qt422016.Writer, s string) {
|
func streammustFormatLabels(qw422016 *qt422016.Writer, s string) {
|
||||||
//line lib/promrelabel/debug.qtpl:164
|
//line lib/promrelabel/debug.qtpl:203
|
||||||
labels := promutils.MustNewLabelsFromString(s)
|
labels := promutils.MustNewLabelsFromString(s)
|
||||||
|
|
||||||
//line lib/promrelabel/debug.qtpl:165
|
//line lib/promrelabel/debug.qtpl:204
|
||||||
streamlabelsWithHighlight(qw422016, labels, nil, "")
|
streamlabelsWithHighlight(qw422016, labels, nil, "")
|
||||||
//line lib/promrelabel/debug.qtpl:166
|
//line lib/promrelabel/debug.qtpl:205
|
||||||
}
|
}
|
||||||
|
|
||||||
//line lib/promrelabel/debug.qtpl:166
|
//line lib/promrelabel/debug.qtpl:205
|
||||||
func writemustFormatLabels(qq422016 qtio422016.Writer, s string) {
|
func writemustFormatLabels(qq422016 qtio422016.Writer, s string) {
|
||||||
//line lib/promrelabel/debug.qtpl:166
|
//line lib/promrelabel/debug.qtpl:205
|
||||||
qw422016 := qt422016.AcquireWriter(qq422016)
|
qw422016 := qt422016.AcquireWriter(qq422016)
|
||||||
//line lib/promrelabel/debug.qtpl:166
|
//line lib/promrelabel/debug.qtpl:205
|
||||||
streammustFormatLabels(qw422016, s)
|
streammustFormatLabels(qw422016, s)
|
||||||
//line lib/promrelabel/debug.qtpl:166
|
//line lib/promrelabel/debug.qtpl:205
|
||||||
qt422016.ReleaseWriter(qw422016)
|
qt422016.ReleaseWriter(qw422016)
|
||||||
//line lib/promrelabel/debug.qtpl:166
|
//line lib/promrelabel/debug.qtpl:205
|
||||||
}
|
}
|
||||||
|
|
||||||
//line lib/promrelabel/debug.qtpl:166
|
//line lib/promrelabel/debug.qtpl:205
|
||||||
func mustFormatLabels(s string) string {
|
func mustFormatLabels(s string) string {
|
||||||
//line lib/promrelabel/debug.qtpl:166
|
//line lib/promrelabel/debug.qtpl:205
|
||||||
qb422016 := qt422016.AcquireByteBuffer()
|
qb422016 := qt422016.AcquireByteBuffer()
|
||||||
//line lib/promrelabel/debug.qtpl:166
|
//line lib/promrelabel/debug.qtpl:205
|
||||||
writemustFormatLabels(qb422016, s)
|
writemustFormatLabels(qb422016, s)
|
||||||
//line lib/promrelabel/debug.qtpl:166
|
//line lib/promrelabel/debug.qtpl:205
|
||||||
qs422016 := string(qb422016.B)
|
qs422016 := string(qb422016.B)
|
||||||
//line lib/promrelabel/debug.qtpl:166
|
//line lib/promrelabel/debug.qtpl:205
|
||||||
qt422016.ReleaseByteBuffer(qb422016)
|
qt422016.ReleaseByteBuffer(qb422016)
|
||||||
//line lib/promrelabel/debug.qtpl:166
|
//line lib/promrelabel/debug.qtpl:205
|
||||||
return qs422016
|
return qs422016
|
||||||
//line lib/promrelabel/debug.qtpl:166
|
//line lib/promrelabel/debug.qtpl:205
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,8 +12,13 @@ func WriteMetricRelabelDebug(w http.ResponseWriter, r *http.Request) {
|
||||||
targetID := r.FormValue("id")
|
targetID := r.FormValue("id")
|
||||||
metric := r.FormValue("metric")
|
metric := r.FormValue("metric")
|
||||||
relabelConfigs := r.FormValue("relabel_configs")
|
relabelConfigs := r.FormValue("relabel_configs")
|
||||||
|
format := r.FormValue("format")
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
|
if format == "json" {
|
||||||
|
w.Header().Set("Content-Type", "application/json")
|
||||||
|
}
|
||||||
|
|
||||||
if metric == "" && relabelConfigs == "" && targetID != "" {
|
if metric == "" && relabelConfigs == "" && targetID != "" {
|
||||||
pcs, labels, ok := getMetricRelabelContextByTargetID(targetID)
|
pcs, labels, ok := getMetricRelabelContextByTargetID(targetID)
|
||||||
if !ok {
|
if !ok {
|
||||||
|
@ -24,7 +29,7 @@ func WriteMetricRelabelDebug(w http.ResponseWriter, r *http.Request) {
|
||||||
relabelConfigs = pcs.String()
|
relabelConfigs = pcs.String()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
promrelabel.WriteMetricRelabelDebug(w, targetID, metric, relabelConfigs, err)
|
promrelabel.WriteMetricRelabelDebug(w, targetID, metric, relabelConfigs, format, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// WriteTargetRelabelDebug generates response for /target-relabel-debug page
|
// WriteTargetRelabelDebug generates response for /target-relabel-debug page
|
||||||
|
@ -32,6 +37,7 @@ func WriteTargetRelabelDebug(w http.ResponseWriter, r *http.Request) {
|
||||||
targetID := r.FormValue("id")
|
targetID := r.FormValue("id")
|
||||||
metric := r.FormValue("metric")
|
metric := r.FormValue("metric")
|
||||||
relabelConfigs := r.FormValue("relabel_configs")
|
relabelConfigs := r.FormValue("relabel_configs")
|
||||||
|
format := r.FormValue("format")
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
if metric == "" && relabelConfigs == "" && targetID != "" {
|
if metric == "" && relabelConfigs == "" && targetID != "" {
|
||||||
|
@ -44,5 +50,5 @@ func WriteTargetRelabelDebug(w http.ResponseWriter, r *http.Request) {
|
||||||
relabelConfigs = pcs.String()
|
relabelConfigs = pcs.String()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
promrelabel.WriteTargetRelabelDebug(w, targetID, metric, relabelConfigs, err)
|
promrelabel.WriteTargetRelabelDebug(w, targetID, metric, relabelConfigs, format, err)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue