monitoring: refine overview and failure colors
This commit is contained in:
parent
f0520d652a
commit
b4229c5a8f
@ -489,8 +489,8 @@ ARIADNE_TASK_RUNS_BY_STATUS_1H = 'sum by (status) (increase(ariadne_task_runs_to
|
||||
ARIADNE_TASK_ERRORS_1H_TOTAL = 'sum(increase(ariadne_task_runs_total{status="error"}[1h]))'
|
||||
ARIADNE_TASK_ERRORS_24H_TOTAL = 'sum(increase(ariadne_task_runs_total{status="error"}[24h]))'
|
||||
ARIADNE_TASK_RUNS_1H_TOTAL = 'sum(increase(ariadne_task_runs_total[1h]))'
|
||||
ARIADNE_TASK_ATTEMPTS_SERIES = 'sum(increase(ariadne_task_runs_total[$__interval]))'
|
||||
ARIADNE_TASK_FAILURES_SERIES = 'sum(increase(ariadne_task_runs_total{status="error"}[$__interval]))'
|
||||
ARIADNE_TASK_ATTEMPTS_SERIES = 'sum(increase(ariadne_task_runs_total[5m]))'
|
||||
ARIADNE_TASK_FAILURES_SERIES = 'sum(increase(ariadne_task_runs_total{status="error"}[5m]))'
|
||||
ARIADNE_TASK_WARNINGS_SERIES = (
|
||||
'sum(increase(ariadne_task_runs_total{status!~"ok|error"}[$__interval])) or on() vector(0)'
|
||||
)
|
||||
@ -683,6 +683,10 @@ GITOPS_HELM_TOTAL_COUNT = (
|
||||
GITOPS_HELM_SUSPENDED = (
|
||||
f"sum(max by (namespace, name) (ananke_gitops_helmrelease_suspended{{{GITOPS_SELECTOR}}})) or on() vector(0)"
|
||||
)
|
||||
GITOPS_NOT_SUSPENDED_PCT = (
|
||||
f"100 * (1 - (({GITOPS_KUSTOMIZATION_SUSPENDED}) + ({GITOPS_HELM_SUSPENDED})) "
|
||||
f"/ clamp_min(({GITOPS_KUSTOMIZATION_TOTAL_COUNT}) + ({GITOPS_HELM_TOTAL_COUNT}), 1))"
|
||||
)
|
||||
GITOPS_SCRAPE_SUCCESS = f"min(ananke_gitops_scrape_success{{{GITOPS_SELECTOR}}}) or on() vector(0)"
|
||||
GITOPS_LAST_SCRAPE_AGE = (
|
||||
f"(time() - max(ananke_gitops_last_scrape_timestamp_seconds{{{GITOPS_SELECTOR}}})) or on() vector(0)"
|
||||
@ -1082,6 +1086,8 @@ def apply_bar_timeseries_style(panel, *, stacked=False, fill_opacity=70):
|
||||
"barAlignment": 0,
|
||||
"lineWidth": 0,
|
||||
"fillOpacity": fill_opacity,
|
||||
"gradientMode": "none",
|
||||
"showPoints": "never",
|
||||
"spanNulls": True,
|
||||
}
|
||||
if stacked:
|
||||
@ -1089,6 +1095,17 @@ def apply_bar_timeseries_style(panel, *, stacked=False, fill_opacity=70):
|
||||
return panel
|
||||
|
||||
|
||||
def fixed_color_overrides(series_colors):
|
||||
"""Return fixed-color overrides keyed by exact series name."""
|
||||
return [
|
||||
{
|
||||
"matcher": {"id": "byName", "options": series_name},
|
||||
"properties": [{"id": "color", "value": {"mode": "fixed", "fixedColor": color}}],
|
||||
}
|
||||
for series_name, color in series_colors.items()
|
||||
]
|
||||
|
||||
|
||||
def table_panel(
|
||||
panel_id,
|
||||
title,
|
||||
@ -1377,6 +1394,7 @@ def bargauge_panel(
|
||||
overrides=None,
|
||||
data_links=None,
|
||||
include_color=True,
|
||||
description=None,
|
||||
):
|
||||
"""Return a bar gauge panel with label-aware reduction."""
|
||||
cleaned_expr = expr.strip()
|
||||
@ -1424,7 +1442,7 @@ def bargauge_panel(
|
||||
"overrides": [],
|
||||
},
|
||||
"options": {
|
||||
"displayMode": "gradient",
|
||||
"displayMode": "basic",
|
||||
"orientation": "horizontal",
|
||||
"reduceOptions": {
|
||||
"calcs": ["lastNotNull"],
|
||||
@ -1439,6 +1457,8 @@ def bargauge_panel(
|
||||
panel["fieldConfig"]["defaults"]["decimals"] = decimals
|
||||
if links:
|
||||
panel["links"] = links
|
||||
if description:
|
||||
panel["description"] = description
|
||||
if data_links:
|
||||
panel["fieldConfig"]["defaults"]["links"] = data_links
|
||||
# Keep bars ordered by value descending for readability.
|
||||
@ -1783,14 +1803,19 @@ def build_overview():
|
||||
{"color": "green", "value": 98},
|
||||
],
|
||||
}
|
||||
dark_red = "dark-red"
|
||||
dark_orange = "dark-orange"
|
||||
dark_yellow = "dark-yellow"
|
||||
dark_green = "dark-green"
|
||||
dark_blue = "dark-blue"
|
||||
test_success_thresholds = {
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{"color": "red", "value": None},
|
||||
{"color": "orange", "value": 90},
|
||||
{"color": "yellow", "value": 93},
|
||||
{"color": "green", "value": 95},
|
||||
{"color": "blue", "value": 100},
|
||||
{"color": dark_red, "value": None},
|
||||
{"color": dark_orange, "value": 70},
|
||||
{"color": dark_yellow, "value": 85},
|
||||
{"color": dark_green, "value": 95},
|
||||
{"color": dark_blue, "value": 100},
|
||||
],
|
||||
}
|
||||
ups_text = {"titleSize": 14, "valueSize": 30}
|
||||
@ -1834,6 +1859,9 @@ def build_overview():
|
||||
{"refId": "A", "expr": ANANKE_UPS_DRAW_WATTS_DB_SERIES, "legendFormat": ANANKE_UPS_DB_NAME},
|
||||
{"refId": "B", "expr": ANANKE_UPS_DRAW_WATTS_TETHYS_SERIES, "legendFormat": ANANKE_UPS_TETHYS_NAME},
|
||||
],
|
||||
field_overrides=fixed_color_overrides(
|
||||
{ANANKE_UPS_DB_NAME: dark_blue, ANANKE_UPS_TETHYS_NAME: dark_yellow}
|
||||
),
|
||||
legend_display="table",
|
||||
legend_placement="right",
|
||||
links=overview_link("atlas-power"),
|
||||
@ -2016,69 +2044,52 @@ def build_overview():
|
||||
links=overview_link("atlas-power"),
|
||||
)
|
||||
)
|
||||
panels.append(
|
||||
table_panel(
|
||||
140,
|
||||
"Flux Source",
|
||||
f"{GITOPS_SOURCE_INFO} or on() vector(0)",
|
||||
{"h": 2, "w": 6, "x": 18, "y": 13},
|
||||
instant=True,
|
||||
format="table",
|
||||
transformations=[
|
||||
{"id": "labelsToFields", "options": {}},
|
||||
{
|
||||
"id": "organize",
|
||||
"options": {
|
||||
"excludeByName": {
|
||||
"Time": True,
|
||||
"Value": True,
|
||||
"namespace": True,
|
||||
"name": True,
|
||||
}
|
||||
},
|
||||
},
|
||||
],
|
||||
options={"showColumnFilters": False},
|
||||
filterable=False,
|
||||
footer={"show": False, "fields": "", "calcs": []},
|
||||
links=overview_link("atlas-gitops"),
|
||||
description="Flux GitRepository branch and revision reported by Ananke. Value is hidden here on purpose.",
|
||||
)
|
||||
)
|
||||
gitops_counts = stat_panel(
|
||||
150,
|
||||
"GitOps Counts",
|
||||
flux_source = stat_panel(
|
||||
140,
|
||||
"Flux Source",
|
||||
None,
|
||||
{"h": 2, "w": 6, "x": 18, "y": 15},
|
||||
{"h": 2, "w": 6, "x": 18, "y": 13},
|
||||
unit="none",
|
||||
text_mode="name_and_value",
|
||||
decimals=0,
|
||||
text_mode="name",
|
||||
thresholds={
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{"color": dark_red, "value": None},
|
||||
{"color": dark_blue, "value": 1},
|
||||
],
|
||||
},
|
||||
targets=[
|
||||
{"expr": GITOPS_KUSTOMIZATION_READY_COUNT, "refId": "A", "legendFormat": "K Ready", "instant": True},
|
||||
{"expr": GITOPS_KUSTOMIZATION_TOTAL_COUNT, "refId": "B", "legendFormat": "K Total", "instant": True},
|
||||
{"expr": GITOPS_KUSTOMIZATION_SUSPENDED, "refId": "C", "legendFormat": "K Susp", "instant": True},
|
||||
{"expr": GITOPS_HELM_READY_COUNT, "refId": "D", "legendFormat": "H Ready", "instant": True},
|
||||
{"expr": GITOPS_HELM_TOTAL_COUNT, "refId": "E", "legendFormat": "H Total", "instant": True},
|
||||
{"expr": GITOPS_HELM_SUSPENDED, "refId": "F", "legendFormat": "H Susp", "instant": True},
|
||||
{
|
||||
"expr": f"{GITOPS_SOURCE_INFO} or on() vector(0)",
|
||||
"refId": "A",
|
||||
"legendFormat": "{{branch}} @ {{revision}}",
|
||||
"instant": True,
|
||||
}
|
||||
],
|
||||
links=overview_link("atlas-gitops"),
|
||||
description="K = Kustomizations, H = HelmReleases. Ready and total are shown as counts; suspended should stay zero.",
|
||||
description="Flux GitRepository branch and revision reported by Ananke. Full object detail lives in Atlas GitOps.",
|
||||
)
|
||||
gitops_counts["options"]["text"] = {"titleSize": 11, "valueSize": 18}
|
||||
panels.append(gitops_counts)
|
||||
flux_source["options"]["graphMode"] = "none"
|
||||
flux_source["options"]["text"] = {"titleSize": 13, "valueSize": 18}
|
||||
panels.append(flux_source)
|
||||
panels.append(
|
||||
state_timeline_panel(
|
||||
151,
|
||||
"GitOps Ready History",
|
||||
bargauge_panel(
|
||||
150,
|
||||
"GitOps Health",
|
||||
(
|
||||
f'label_replace({GITOPS_KUSTOMIZATION_READY_PCT}, "kind", "Kustomizations", "__name__", ".*") '
|
||||
f'or label_replace({GITOPS_HELM_READY_PCT}, "kind", "HelmReleases", "__name__", ".*")'
|
||||
f'label_replace({GITOPS_KUSTOMIZATION_READY_PCT}, "signal", "Kustomizations Ready", "__name__", ".*") '
|
||||
f'or label_replace({GITOPS_HELM_READY_PCT}, "signal", "HelmReleases Ready", "__name__", ".*") '
|
||||
f'or label_replace({GITOPS_NOT_SUSPENDED_PCT}, "signal", "Objects Not Suspended", "__name__", ".*")'
|
||||
),
|
||||
{"h": 2, "w": 6, "x": 18, "y": 17},
|
||||
{"h": 4, "w": 6, "x": 18, "y": 15},
|
||||
unit="percent",
|
||||
instant=True,
|
||||
legend="{{signal}}",
|
||||
sort_order="asc",
|
||||
thresholds=test_success_thresholds,
|
||||
legend="{{kind}}",
|
||||
decimals=0,
|
||||
links=overview_link("atlas-gitops"),
|
||||
description="Compact readiness history. Full object tables live in Atlas GitOps.",
|
||||
description="Compact GitOps health: readiness percentages plus percent of Flux objects not suspended.",
|
||||
)
|
||||
)
|
||||
|
||||
@ -2112,21 +2123,14 @@ def build_overview():
|
||||
legend_placement="right",
|
||||
links=overview_link("atlas-jobs"),
|
||||
)
|
||||
ariadne_volume["fieldConfig"]["overrides"] = [
|
||||
{
|
||||
"matcher": {"id": "byName", "options": "Attempts"},
|
||||
"properties": [{"id": "color", "value": {"mode": "fixed", "fixedColor": "green"}}],
|
||||
},
|
||||
{
|
||||
"matcher": {"id": "byName", "options": "Failures"},
|
||||
"properties": [{"id": "color", "value": {"mode": "fixed", "fixedColor": "red"}}],
|
||||
},
|
||||
]
|
||||
ariadne_volume["fieldConfig"]["overrides"] = fixed_color_overrides(
|
||||
{"Attempts": dark_blue, "Failures": dark_red}
|
||||
)
|
||||
panels.append(apply_bar_timeseries_style(ariadne_volume, stacked=False))
|
||||
panels.append(
|
||||
bargauge_panel(
|
||||
46,
|
||||
"Platform Gate Health by Suite",
|
||||
"Gate Checks Passing by Suite",
|
||||
PLATFORM_TEST_CURRENT_GATE_HEALTH_BY_SUITE,
|
||||
{"h": 6, "w": 6, "x": 18, "y": 7},
|
||||
unit="percent",
|
||||
@ -2134,13 +2138,12 @@ def build_overview():
|
||||
legend="{{suite}}",
|
||||
sort_order="asc",
|
||||
thresholds=test_success_thresholds,
|
||||
decimals=1,
|
||||
decimals=0,
|
||||
links=overview_link("atlas-testing"),
|
||||
)
|
||||
)
|
||||
panels[-1]["description"] = (
|
||||
"Latest quality-gate health by suite. This mirrors the testing dashboard's current gate health "
|
||||
"instead of plotting sparse per-run success spikes."
|
||||
"Percent of current gate dimensions passing per suite. There are seven gate dimensions, so 85.7% means one gate is failing."
|
||||
)
|
||||
for panel_id, title, metric, x_pos, description in [
|
||||
(
|
||||
@ -3679,7 +3682,8 @@ def build_jobs_dashboard():
|
||||
failures_thresholds = {
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{"color": dark_green, "value": None},
|
||||
{"color": dark_blue, "value": None},
|
||||
{"color": dark_green, "value": 0.01},
|
||||
{"color": dark_yellow, "value": 1},
|
||||
{"color": dark_orange, "value": 3},
|
||||
{"color": dark_red, "value": 5},
|
||||
@ -4623,6 +4627,9 @@ def build_power_dashboard():
|
||||
{"refId": "A", "expr": ANANKE_UPS_DRAW_WATTS_DB_SERIES, "legendFormat": ANANKE_UPS_DB_NAME},
|
||||
{"refId": "B", "expr": ANANKE_UPS_DRAW_WATTS_TETHYS_SERIES, "legendFormat": ANANKE_UPS_TETHYS_NAME},
|
||||
],
|
||||
field_overrides=fixed_color_overrides(
|
||||
{ANANKE_UPS_DB_NAME: "dark-blue", ANANKE_UPS_TETHYS_NAME: "dark-yellow"}
|
||||
),
|
||||
legend_display="table",
|
||||
legend_placement="right",
|
||||
description="Historical UPS power consumption in watts for titan-db and tethys.",
|
||||
|
||||
@ -68,13 +68,14 @@ def test_overview_uses_readable_quality_power_and_gitops_panels():
|
||||
panels_by_title = {panel["title"]: panel for panel in flatten_panels(dashboard["panels"])}
|
||||
|
||||
assert "Platform Test Success Rate" not in panels_by_title
|
||||
assert panels_by_title["Platform Gate Health by Suite"]["type"] == "bargauge"
|
||||
assert panels_by_title["Gate Checks Passing by Suite"]["type"] == "bargauge"
|
||||
assert panels_by_title["Gate Checks Passing by Suite"]["options"]["displayMode"] == "basic"
|
||||
assert panels_by_title["UPS History (Power Draw)"]["fieldConfig"]["defaults"]["custom"]["drawStyle"] == "bars"
|
||||
assert panels_by_title["Ariadne Run Volume"]["fieldConfig"]["defaults"]["custom"]["drawStyle"] == "bars"
|
||||
|
||||
assert panels_by_title["Flux Source"]["type"] == "table"
|
||||
assert panels_by_title["GitOps Counts"]["type"] == "stat"
|
||||
assert panels_by_title["GitOps Ready History"]["type"] == "state-timeline"
|
||||
assert panels_by_title["Flux Source"]["type"] == "stat"
|
||||
assert panels_by_title["GitOps Health"]["type"] == "bargauge"
|
||||
assert panels_by_title["GitOps Health"]["gridPos"]["h"] == 4
|
||||
|
||||
|
||||
def test_render_configmap_writes(tmp_path):
|
||||
@ -211,6 +212,7 @@ def test_jobs_dashboard_collapses_heavy_drilldowns_for_light_first_paint():
|
||||
assert failure_rate_panel["type"] == "state-timeline"
|
||||
assert failure_rate_panel["fieldConfig"]["defaults"]["unit"] == "percent"
|
||||
assert failure_rate_panel["fieldConfig"]["defaults"]["max"] == 100
|
||||
assert failure_rate_panel["fieldConfig"]["defaults"]["thresholds"]["steps"][0]["color"] == "dark-blue"
|
||||
assert "increase(" not in failure_rate_panel["targets"][0]["expr"]
|
||||
assert "0 *" in failure_rate_panel["targets"][0]["expr"]
|
||||
|
||||
|
||||
@ -183,9 +183,13 @@
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "dark-green",
|
||||
"color": "dark-blue",
|
||||
"value": null
|
||||
},
|
||||
{
|
||||
"color": "dark-green",
|
||||
"value": 0.01
|
||||
},
|
||||
{
|
||||
"color": "dark-yellow",
|
||||
"value": 1
|
||||
@ -1130,9 +1134,13 @@
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "dark-green",
|
||||
"color": "dark-blue",
|
||||
"value": null
|
||||
},
|
||||
{
|
||||
"color": "dark-green",
|
||||
"value": 0.01
|
||||
},
|
||||
{
|
||||
"color": "dark-yellow",
|
||||
"value": 1
|
||||
@ -1202,9 +1210,13 @@
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "dark-green",
|
||||
"color": "dark-blue",
|
||||
"value": null
|
||||
},
|
||||
{
|
||||
"color": "dark-green",
|
||||
"value": 0.01
|
||||
},
|
||||
{
|
||||
"color": "dark-yellow",
|
||||
"value": 1
|
||||
@ -1274,9 +1286,13 @@
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "dark-green",
|
||||
"color": "dark-blue",
|
||||
"value": null
|
||||
},
|
||||
{
|
||||
"color": "dark-green",
|
||||
"value": 0.01
|
||||
},
|
||||
{
|
||||
"color": "dark-yellow",
|
||||
"value": 1
|
||||
@ -1346,9 +1362,13 @@
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "dark-green",
|
||||
"color": "dark-blue",
|
||||
"value": null
|
||||
},
|
||||
{
|
||||
"color": "dark-green",
|
||||
"value": 0.01
|
||||
},
|
||||
{
|
||||
"color": "dark-yellow",
|
||||
"value": 1
|
||||
@ -1418,9 +1438,13 @@
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "dark-green",
|
||||
"color": "dark-blue",
|
||||
"value": null
|
||||
},
|
||||
{
|
||||
"color": "dark-green",
|
||||
"value": 0.01
|
||||
},
|
||||
{
|
||||
"color": "dark-yellow",
|
||||
"value": 1
|
||||
@ -1490,9 +1514,13 @@
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "dark-green",
|
||||
"color": "dark-blue",
|
||||
"value": null
|
||||
},
|
||||
{
|
||||
"color": "dark-green",
|
||||
"value": 0.01
|
||||
},
|
||||
{
|
||||
"color": "dark-yellow",
|
||||
"value": 1
|
||||
@ -1562,9 +1590,13 @@
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "dark-green",
|
||||
"color": "dark-blue",
|
||||
"value": null
|
||||
},
|
||||
{
|
||||
"color": "dark-green",
|
||||
"value": 0.01
|
||||
},
|
||||
{
|
||||
"color": "dark-yellow",
|
||||
"value": 1
|
||||
@ -2194,9 +2226,13 @@
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "dark-green",
|
||||
"color": "dark-blue",
|
||||
"value": null
|
||||
},
|
||||
{
|
||||
"color": "dark-green",
|
||||
"value": 0.01
|
||||
},
|
||||
{
|
||||
"color": "dark-yellow",
|
||||
"value": 1
|
||||
@ -2376,9 +2412,13 @@
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "dark-green",
|
||||
"color": "dark-blue",
|
||||
"value": null
|
||||
},
|
||||
{
|
||||
"color": "dark-green",
|
||||
"value": 0.01
|
||||
},
|
||||
{
|
||||
"color": "dark-yellow",
|
||||
"value": 1
|
||||
@ -3845,9 +3885,13 @@
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "dark-green",
|
||||
"color": "dark-blue",
|
||||
"value": null
|
||||
},
|
||||
{
|
||||
"color": "dark-green",
|
||||
"value": 0.01
|
||||
},
|
||||
{
|
||||
"color": "dark-yellow",
|
||||
"value": 1
|
||||
@ -3914,9 +3958,13 @@
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "dark-green",
|
||||
"color": "dark-blue",
|
||||
"value": null
|
||||
},
|
||||
{
|
||||
"color": "dark-green",
|
||||
"value": 0.01
|
||||
},
|
||||
{
|
||||
"color": "dark-yellow",
|
||||
"value": 1
|
||||
|
||||
@ -1302,10 +1302,43 @@
|
||||
"barAlignment": 0,
|
||||
"lineWidth": 0,
|
||||
"fillOpacity": 70,
|
||||
"gradientMode": "none",
|
||||
"showPoints": "never",
|
||||
"spanNulls": true
|
||||
}
|
||||
},
|
||||
"overrides": []
|
||||
"overrides": [
|
||||
{
|
||||
"matcher": {
|
||||
"id": "byName",
|
||||
"options": "Pyrphoros"
|
||||
},
|
||||
"properties": [
|
||||
{
|
||||
"id": "color",
|
||||
"value": {
|
||||
"mode": "fixed",
|
||||
"fixedColor": "dark-blue"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"matcher": {
|
||||
"id": "byName",
|
||||
"options": "Statera"
|
||||
},
|
||||
"properties": [
|
||||
{
|
||||
"id": "color",
|
||||
"value": {
|
||||
"mode": "fixed",
|
||||
"fixedColor": "dark-yellow"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"options": {
|
||||
"legend": {
|
||||
@ -1889,7 +1922,7 @@
|
||||
},
|
||||
{
|
||||
"id": 140,
|
||||
"type": "table",
|
||||
"type": "stat",
|
||||
"title": "Flux Source",
|
||||
"datasource": {
|
||||
"type": "prometheus",
|
||||
@ -1905,104 +1938,7 @@
|
||||
{
|
||||
"expr": "max by (branch, revision) (ananke_gitops_flux_source_info{job=\"ananke-power\",namespace=\"flux-system\",name=\"flux-system\"}) or on() vector(0)",
|
||||
"refId": "A",
|
||||
"instant": true,
|
||||
"format": "table"
|
||||
}
|
||||
],
|
||||
"fieldConfig": {
|
||||
"defaults": {
|
||||
"unit": "none",
|
||||
"custom": {
|
||||
"filterable": false
|
||||
}
|
||||
},
|
||||
"overrides": []
|
||||
},
|
||||
"options": {
|
||||
"showHeader": true,
|
||||
"columnFilters": false,
|
||||
"showColumnFilters": false,
|
||||
"footer": {
|
||||
"show": false,
|
||||
"fields": "",
|
||||
"calcs": []
|
||||
}
|
||||
},
|
||||
"transformations": [
|
||||
{
|
||||
"id": "labelsToFields",
|
||||
"options": {}
|
||||
},
|
||||
{
|
||||
"id": "organize",
|
||||
"options": {
|
||||
"excludeByName": {
|
||||
"Time": true,
|
||||
"Value": true,
|
||||
"namespace": true,
|
||||
"name": true
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"description": "Flux GitRepository branch and revision reported by Ananke. Value is hidden here on purpose.",
|
||||
"links": [
|
||||
{
|
||||
"title": "Open atlas-gitops dashboard",
|
||||
"url": "/d/atlas-gitops",
|
||||
"targetBlank": true
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": 150,
|
||||
"type": "stat",
|
||||
"title": "GitOps Counts",
|
||||
"datasource": {
|
||||
"type": "prometheus",
|
||||
"uid": "atlas-vm"
|
||||
},
|
||||
"gridPos": {
|
||||
"h": 2,
|
||||
"w": 6,
|
||||
"x": 18,
|
||||
"y": 15
|
||||
},
|
||||
"targets": [
|
||||
{
|
||||
"expr": "sum(max by (namespace, name) (ananke_gitops_kustomization_ready{job=\"ananke-power\"})) or on() vector(0)",
|
||||
"refId": "A",
|
||||
"legendFormat": "K Ready",
|
||||
"instant": true
|
||||
},
|
||||
{
|
||||
"expr": "count(max by (namespace, name) (ananke_gitops_kustomization_ready{job=\"ananke-power\"})) or on() vector(0)",
|
||||
"refId": "B",
|
||||
"legendFormat": "K Total",
|
||||
"instant": true
|
||||
},
|
||||
{
|
||||
"expr": "sum(max by (namespace, name) (ananke_gitops_kustomization_suspended{job=\"ananke-power\"})) or on() vector(0)",
|
||||
"refId": "C",
|
||||
"legendFormat": "K Susp",
|
||||
"instant": true
|
||||
},
|
||||
{
|
||||
"expr": "sum(max by (namespace, name) (ananke_gitops_helmrelease_ready{job=\"ananke-power\"})) or on() vector(0)",
|
||||
"refId": "D",
|
||||
"legendFormat": "H Ready",
|
||||
"instant": true
|
||||
},
|
||||
{
|
||||
"expr": "count(max by (namespace, name) (ananke_gitops_helmrelease_ready{job=\"ananke-power\"})) or on() vector(0)",
|
||||
"refId": "E",
|
||||
"legendFormat": "H Total",
|
||||
"instant": true
|
||||
},
|
||||
{
|
||||
"expr": "sum(max by (namespace, name) (ananke_gitops_helmrelease_suspended{job=\"ananke-power\"})) or on() vector(0)",
|
||||
"refId": "F",
|
||||
"legendFormat": "H Susp",
|
||||
"legendFormat": "{{branch}} @ {{revision}}",
|
||||
"instant": true
|
||||
}
|
||||
],
|
||||
@ -2016,11 +1952,11 @@
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "rgba(115, 115, 115, 1)",
|
||||
"color": "dark-red",
|
||||
"value": null
|
||||
},
|
||||
{
|
||||
"color": "dark-green",
|
||||
"color": "dark-blue",
|
||||
"value": 1
|
||||
}
|
||||
]
|
||||
@ -2028,14 +1964,13 @@
|
||||
"unit": "none",
|
||||
"custom": {
|
||||
"displayMode": "auto"
|
||||
},
|
||||
"decimals": 0
|
||||
}
|
||||
},
|
||||
"overrides": []
|
||||
},
|
||||
"options": {
|
||||
"colorMode": "value",
|
||||
"graphMode": "area",
|
||||
"graphMode": "none",
|
||||
"justifyMode": "center",
|
||||
"reduceOptions": {
|
||||
"calcs": [
|
||||
@ -2044,9 +1979,9 @@
|
||||
"fields": "",
|
||||
"values": false
|
||||
},
|
||||
"textMode": "name_and_value",
|
||||
"textMode": "name",
|
||||
"text": {
|
||||
"titleSize": 11,
|
||||
"titleSize": 13,
|
||||
"valueSize": 18
|
||||
}
|
||||
},
|
||||
@ -2057,28 +1992,28 @@
|
||||
"targetBlank": true
|
||||
}
|
||||
],
|
||||
"description": "K = Kustomizations, H = HelmReleases. Ready and total are shown as counts; suspended should stay zero."
|
||||
"description": "Flux GitRepository branch and revision reported by Ananke. Full object detail lives in Atlas GitOps."
|
||||
},
|
||||
{
|
||||
"id": 151,
|
||||
"type": "state-timeline",
|
||||
"title": "GitOps Ready History",
|
||||
"description": "Compact readiness history. Full object tables live in Atlas GitOps.",
|
||||
"id": 150,
|
||||
"type": "bargauge",
|
||||
"title": "GitOps Health",
|
||||
"datasource": {
|
||||
"type": "prometheus",
|
||||
"uid": "atlas-vm"
|
||||
},
|
||||
"gridPos": {
|
||||
"h": 2,
|
||||
"h": 4,
|
||||
"w": 6,
|
||||
"x": 18,
|
||||
"y": 17
|
||||
"y": 15
|
||||
},
|
||||
"targets": [
|
||||
{
|
||||
"expr": "label_replace(100 * sum(max by (namespace, name) (ananke_gitops_kustomization_ready{job=\"ananke-power\"})) / clamp_min(count(max by (namespace, name) (ananke_gitops_kustomization_ready{job=\"ananke-power\"})), 1), \"kind\", \"Kustomizations\", \"__name__\", \".*\") or label_replace(100 * sum(max by (namespace, name) (ananke_gitops_helmrelease_ready{job=\"ananke-power\"})) / clamp_min(count(max by (namespace, name) (ananke_gitops_helmrelease_ready{job=\"ananke-power\"})), 1), \"kind\", \"HelmReleases\", \"__name__\", \".*\")",
|
||||
"expr": "sort(label_replace(100 * sum(max by (namespace, name) (ananke_gitops_kustomization_ready{job=\"ananke-power\"})) / clamp_min(count(max by (namespace, name) (ananke_gitops_kustomization_ready{job=\"ananke-power\"})), 1), \"signal\", \"Kustomizations Ready\", \"__name__\", \".*\") or label_replace(100 * sum(max by (namespace, name) (ananke_gitops_helmrelease_ready{job=\"ananke-power\"})) / clamp_min(count(max by (namespace, name) (ananke_gitops_helmrelease_ready{job=\"ananke-power\"})), 1), \"signal\", \"HelmReleases Ready\", \"__name__\", \".*\") or label_replace(100 * (1 - ((sum(max by (namespace, name) (ananke_gitops_kustomization_suspended{job=\"ananke-power\"})) or on() vector(0)) + (sum(max by (namespace, name) (ananke_gitops_helmrelease_suspended{job=\"ananke-power\"})) or on() vector(0))) / clamp_min((count(max by (namespace, name) (ananke_gitops_kustomization_ready{job=\"ananke-power\"})) or on() vector(0)) + (count(max by (namespace, name) (ananke_gitops_helmrelease_ready{job=\"ananke-power\"})) or on() vector(0)), 1)), \"signal\", \"Objects Not Suspended\", \"__name__\", \".*\"))",
|
||||
"refId": "A",
|
||||
"legendFormat": "{{kind}}"
|
||||
"legendFormat": "{{signal}}",
|
||||
"instant": true
|
||||
}
|
||||
],
|
||||
"fieldConfig": {
|
||||
@ -2087,6 +2022,8 @@
|
||||
"mode": "thresholds"
|
||||
},
|
||||
"unit": "percent",
|
||||
"min": 0,
|
||||
"max": 100,
|
||||
"thresholds": {
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
@ -2096,11 +2033,11 @@
|
||||
},
|
||||
{
|
||||
"color": "dark-orange",
|
||||
"value": 90
|
||||
"value": 70
|
||||
},
|
||||
{
|
||||
"color": "dark-yellow",
|
||||
"value": 93
|
||||
"value": 85
|
||||
},
|
||||
{
|
||||
"color": "dark-green",
|
||||
@ -2112,26 +2049,19 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
"custom": {
|
||||
"fillOpacity": 70,
|
||||
"lineWidth": 0,
|
||||
"spanNulls": true
|
||||
},
|
||||
"min": 0,
|
||||
"max": 100
|
||||
"decimals": 0
|
||||
},
|
||||
"overrides": []
|
||||
},
|
||||
"options": {
|
||||
"mergeValues": true,
|
||||
"showValue": "never",
|
||||
"legend": {
|
||||
"displayMode": "list",
|
||||
"placement": "bottom"
|
||||
},
|
||||
"tooltip": {
|
||||
"mode": "single",
|
||||
"sort": "none"
|
||||
"displayMode": "basic",
|
||||
"orientation": "horizontal",
|
||||
"reduceOptions": {
|
||||
"calcs": [
|
||||
"lastNotNull"
|
||||
],
|
||||
"fields": "",
|
||||
"values": false
|
||||
}
|
||||
},
|
||||
"links": [
|
||||
@ -2140,6 +2070,18 @@
|
||||
"url": "/d/atlas-gitops",
|
||||
"targetBlank": true
|
||||
}
|
||||
],
|
||||
"description": "Compact GitOps health: readiness percentages plus percent of Flux objects not suspended.",
|
||||
"transformations": [
|
||||
{
|
||||
"id": "sortBy",
|
||||
"options": {
|
||||
"fields": [
|
||||
"Value"
|
||||
],
|
||||
"order": "asc"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
@ -2195,7 +2137,7 @@
|
||||
"overrides": []
|
||||
},
|
||||
"options": {
|
||||
"displayMode": "gradient",
|
||||
"displayMode": "basic",
|
||||
"orientation": "horizontal",
|
||||
"reduceOptions": {
|
||||
"calcs": [
|
||||
@ -2246,12 +2188,12 @@
|
||||
},
|
||||
"targets": [
|
||||
{
|
||||
"expr": "sum(increase(ariadne_task_runs_total[$__interval])) or on() vector(0)",
|
||||
"expr": "sum(increase(ariadne_task_runs_total[5m])) or on() vector(0)",
|
||||
"refId": "A",
|
||||
"legendFormat": "Attempts"
|
||||
},
|
||||
{
|
||||
"expr": "sum(increase(ariadne_task_runs_total{status=\"error\"}[$__interval])) or on() vector(0)",
|
||||
"expr": "sum(increase(ariadne_task_runs_total{status=\"error\"}[5m])) or on() vector(0)",
|
||||
"refId": "B",
|
||||
"legendFormat": "Failures"
|
||||
}
|
||||
@ -2264,6 +2206,8 @@
|
||||
"barAlignment": 0,
|
||||
"lineWidth": 0,
|
||||
"fillOpacity": 70,
|
||||
"gradientMode": "none",
|
||||
"showPoints": "never",
|
||||
"spanNulls": true
|
||||
}
|
||||
},
|
||||
@ -2278,7 +2222,7 @@
|
||||
"id": "color",
|
||||
"value": {
|
||||
"mode": "fixed",
|
||||
"fixedColor": "dark-green"
|
||||
"fixedColor": "dark-blue"
|
||||
}
|
||||
}
|
||||
]
|
||||
@ -2320,7 +2264,7 @@
|
||||
{
|
||||
"id": 46,
|
||||
"type": "bargauge",
|
||||
"title": "Platform Gate Health by Suite",
|
||||
"title": "Gate Checks Passing by Suite",
|
||||
"datasource": {
|
||||
"type": "prometheus",
|
||||
"uid": "atlas-vm"
|
||||
@ -2356,11 +2300,11 @@
|
||||
},
|
||||
{
|
||||
"color": "dark-orange",
|
||||
"value": 90
|
||||
"value": 70
|
||||
},
|
||||
{
|
||||
"color": "dark-yellow",
|
||||
"value": 93
|
||||
"value": 85
|
||||
},
|
||||
{
|
||||
"color": "dark-green",
|
||||
@ -2372,12 +2316,12 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
"decimals": 1
|
||||
"decimals": 0
|
||||
},
|
||||
"overrides": []
|
||||
},
|
||||
"options": {
|
||||
"displayMode": "gradient",
|
||||
"displayMode": "basic",
|
||||
"orientation": "horizontal",
|
||||
"reduceOptions": {
|
||||
"calcs": [
|
||||
@ -2405,7 +2349,7 @@
|
||||
}
|
||||
}
|
||||
],
|
||||
"description": "Latest quality-gate health by suite. This mirrors the testing dashboard's current gate health instead of plotting sparse per-run success spikes."
|
||||
"description": "Percent of current gate dimensions passing per suite. There are seven gate dimensions, so 85.7% means one gate is failing."
|
||||
},
|
||||
{
|
||||
"id": 142,
|
||||
@ -2673,7 +2617,7 @@
|
||||
"overrides": []
|
||||
},
|
||||
"options": {
|
||||
"displayMode": "gradient",
|
||||
"displayMode": "basic",
|
||||
"orientation": "horizontal",
|
||||
"reduceOptions": {
|
||||
"calcs": [
|
||||
@ -3632,7 +3576,7 @@
|
||||
"overrides": []
|
||||
},
|
||||
"options": {
|
||||
"displayMode": "gradient",
|
||||
"displayMode": "basic",
|
||||
"orientation": "horizontal",
|
||||
"reduceOptions": {
|
||||
"calcs": [
|
||||
|
||||
@ -479,7 +479,7 @@
|
||||
"overrides": []
|
||||
},
|
||||
"options": {
|
||||
"displayMode": "gradient",
|
||||
"displayMode": "basic",
|
||||
"orientation": "horizontal",
|
||||
"reduceOptions": {
|
||||
"calcs": [
|
||||
|
||||
@ -255,10 +255,43 @@
|
||||
"barAlignment": 0,
|
||||
"lineWidth": 0,
|
||||
"fillOpacity": 70,
|
||||
"gradientMode": "none",
|
||||
"showPoints": "never",
|
||||
"spanNulls": true
|
||||
}
|
||||
},
|
||||
"overrides": []
|
||||
"overrides": [
|
||||
{
|
||||
"matcher": {
|
||||
"id": "byName",
|
||||
"options": "Pyrphoros"
|
||||
},
|
||||
"properties": [
|
||||
{
|
||||
"id": "color",
|
||||
"value": {
|
||||
"mode": "fixed",
|
||||
"fixedColor": "dark-blue"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"matcher": {
|
||||
"id": "byName",
|
||||
"options": "Statera"
|
||||
},
|
||||
"properties": [
|
||||
{
|
||||
"id": "color",
|
||||
"value": {
|
||||
"mode": "fixed",
|
||||
"fixedColor": "dark-yellow"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"options": {
|
||||
"legend": {
|
||||
|
||||
@ -183,9 +183,13 @@
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "dark-green",
|
||||
"color": "dark-blue",
|
||||
"value": null
|
||||
},
|
||||
{
|
||||
"color": "dark-green",
|
||||
"value": 0.01
|
||||
},
|
||||
{
|
||||
"color": "dark-yellow",
|
||||
"value": 1
|
||||
@ -1130,9 +1134,13 @@
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "dark-green",
|
||||
"color": "dark-blue",
|
||||
"value": null
|
||||
},
|
||||
{
|
||||
"color": "dark-green",
|
||||
"value": 0.01
|
||||
},
|
||||
{
|
||||
"color": "dark-yellow",
|
||||
"value": 1
|
||||
@ -1202,9 +1210,13 @@
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "dark-green",
|
||||
"color": "dark-blue",
|
||||
"value": null
|
||||
},
|
||||
{
|
||||
"color": "dark-green",
|
||||
"value": 0.01
|
||||
},
|
||||
{
|
||||
"color": "dark-yellow",
|
||||
"value": 1
|
||||
@ -1274,9 +1286,13 @@
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "dark-green",
|
||||
"color": "dark-blue",
|
||||
"value": null
|
||||
},
|
||||
{
|
||||
"color": "dark-green",
|
||||
"value": 0.01
|
||||
},
|
||||
{
|
||||
"color": "dark-yellow",
|
||||
"value": 1
|
||||
@ -1346,9 +1362,13 @@
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "dark-green",
|
||||
"color": "dark-blue",
|
||||
"value": null
|
||||
},
|
||||
{
|
||||
"color": "dark-green",
|
||||
"value": 0.01
|
||||
},
|
||||
{
|
||||
"color": "dark-yellow",
|
||||
"value": 1
|
||||
@ -1418,9 +1438,13 @@
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "dark-green",
|
||||
"color": "dark-blue",
|
||||
"value": null
|
||||
},
|
||||
{
|
||||
"color": "dark-green",
|
||||
"value": 0.01
|
||||
},
|
||||
{
|
||||
"color": "dark-yellow",
|
||||
"value": 1
|
||||
@ -1490,9 +1514,13 @@
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "dark-green",
|
||||
"color": "dark-blue",
|
||||
"value": null
|
||||
},
|
||||
{
|
||||
"color": "dark-green",
|
||||
"value": 0.01
|
||||
},
|
||||
{
|
||||
"color": "dark-yellow",
|
||||
"value": 1
|
||||
@ -1562,9 +1590,13 @@
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "dark-green",
|
||||
"color": "dark-blue",
|
||||
"value": null
|
||||
},
|
||||
{
|
||||
"color": "dark-green",
|
||||
"value": 0.01
|
||||
},
|
||||
{
|
||||
"color": "dark-yellow",
|
||||
"value": 1
|
||||
@ -2194,9 +2226,13 @@
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "dark-green",
|
||||
"color": "dark-blue",
|
||||
"value": null
|
||||
},
|
||||
{
|
||||
"color": "dark-green",
|
||||
"value": 0.01
|
||||
},
|
||||
{
|
||||
"color": "dark-yellow",
|
||||
"value": 1
|
||||
@ -2376,9 +2412,13 @@
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "dark-green",
|
||||
"color": "dark-blue",
|
||||
"value": null
|
||||
},
|
||||
{
|
||||
"color": "dark-green",
|
||||
"value": 0.01
|
||||
},
|
||||
{
|
||||
"color": "dark-yellow",
|
||||
"value": 1
|
||||
@ -3845,9 +3885,13 @@
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "dark-green",
|
||||
"color": "dark-blue",
|
||||
"value": null
|
||||
},
|
||||
{
|
||||
"color": "dark-green",
|
||||
"value": 0.01
|
||||
},
|
||||
{
|
||||
"color": "dark-yellow",
|
||||
"value": 1
|
||||
@ -3914,9 +3958,13 @@
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "dark-green",
|
||||
"color": "dark-blue",
|
||||
"value": null
|
||||
},
|
||||
{
|
||||
"color": "dark-green",
|
||||
"value": 0.01
|
||||
},
|
||||
{
|
||||
"color": "dark-yellow",
|
||||
"value": 1
|
||||
|
||||
@ -192,9 +192,13 @@ data:
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "dark-green",
|
||||
"color": "dark-blue",
|
||||
"value": null
|
||||
},
|
||||
{
|
||||
"color": "dark-green",
|
||||
"value": 0.01
|
||||
},
|
||||
{
|
||||
"color": "dark-yellow",
|
||||
"value": 1
|
||||
@ -1139,9 +1143,13 @@ data:
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "dark-green",
|
||||
"color": "dark-blue",
|
||||
"value": null
|
||||
},
|
||||
{
|
||||
"color": "dark-green",
|
||||
"value": 0.01
|
||||
},
|
||||
{
|
||||
"color": "dark-yellow",
|
||||
"value": 1
|
||||
@ -1211,9 +1219,13 @@ data:
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "dark-green",
|
||||
"color": "dark-blue",
|
||||
"value": null
|
||||
},
|
||||
{
|
||||
"color": "dark-green",
|
||||
"value": 0.01
|
||||
},
|
||||
{
|
||||
"color": "dark-yellow",
|
||||
"value": 1
|
||||
@ -1283,9 +1295,13 @@ data:
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "dark-green",
|
||||
"color": "dark-blue",
|
||||
"value": null
|
||||
},
|
||||
{
|
||||
"color": "dark-green",
|
||||
"value": 0.01
|
||||
},
|
||||
{
|
||||
"color": "dark-yellow",
|
||||
"value": 1
|
||||
@ -1355,9 +1371,13 @@ data:
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "dark-green",
|
||||
"color": "dark-blue",
|
||||
"value": null
|
||||
},
|
||||
{
|
||||
"color": "dark-green",
|
||||
"value": 0.01
|
||||
},
|
||||
{
|
||||
"color": "dark-yellow",
|
||||
"value": 1
|
||||
@ -1427,9 +1447,13 @@ data:
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "dark-green",
|
||||
"color": "dark-blue",
|
||||
"value": null
|
||||
},
|
||||
{
|
||||
"color": "dark-green",
|
||||
"value": 0.01
|
||||
},
|
||||
{
|
||||
"color": "dark-yellow",
|
||||
"value": 1
|
||||
@ -1499,9 +1523,13 @@ data:
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "dark-green",
|
||||
"color": "dark-blue",
|
||||
"value": null
|
||||
},
|
||||
{
|
||||
"color": "dark-green",
|
||||
"value": 0.01
|
||||
},
|
||||
{
|
||||
"color": "dark-yellow",
|
||||
"value": 1
|
||||
@ -1571,9 +1599,13 @@ data:
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "dark-green",
|
||||
"color": "dark-blue",
|
||||
"value": null
|
||||
},
|
||||
{
|
||||
"color": "dark-green",
|
||||
"value": 0.01
|
||||
},
|
||||
{
|
||||
"color": "dark-yellow",
|
||||
"value": 1
|
||||
@ -2203,9 +2235,13 @@ data:
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "dark-green",
|
||||
"color": "dark-blue",
|
||||
"value": null
|
||||
},
|
||||
{
|
||||
"color": "dark-green",
|
||||
"value": 0.01
|
||||
},
|
||||
{
|
||||
"color": "dark-yellow",
|
||||
"value": 1
|
||||
@ -2385,9 +2421,13 @@ data:
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "dark-green",
|
||||
"color": "dark-blue",
|
||||
"value": null
|
||||
},
|
||||
{
|
||||
"color": "dark-green",
|
||||
"value": 0.01
|
||||
},
|
||||
{
|
||||
"color": "dark-yellow",
|
||||
"value": 1
|
||||
@ -3854,9 +3894,13 @@ data:
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "dark-green",
|
||||
"color": "dark-blue",
|
||||
"value": null
|
||||
},
|
||||
{
|
||||
"color": "dark-green",
|
||||
"value": 0.01
|
||||
},
|
||||
{
|
||||
"color": "dark-yellow",
|
||||
"value": 1
|
||||
@ -3923,9 +3967,13 @@ data:
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "dark-green",
|
||||
"color": "dark-blue",
|
||||
"value": null
|
||||
},
|
||||
{
|
||||
"color": "dark-green",
|
||||
"value": 0.01
|
||||
},
|
||||
{
|
||||
"color": "dark-yellow",
|
||||
"value": 1
|
||||
|
||||
@ -1311,10 +1311,43 @@ data:
|
||||
"barAlignment": 0,
|
||||
"lineWidth": 0,
|
||||
"fillOpacity": 70,
|
||||
"gradientMode": "none",
|
||||
"showPoints": "never",
|
||||
"spanNulls": true
|
||||
}
|
||||
},
|
||||
"overrides": []
|
||||
"overrides": [
|
||||
{
|
||||
"matcher": {
|
||||
"id": "byName",
|
||||
"options": "Pyrphoros"
|
||||
},
|
||||
"properties": [
|
||||
{
|
||||
"id": "color",
|
||||
"value": {
|
||||
"mode": "fixed",
|
||||
"fixedColor": "dark-blue"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"matcher": {
|
||||
"id": "byName",
|
||||
"options": "Statera"
|
||||
},
|
||||
"properties": [
|
||||
{
|
||||
"id": "color",
|
||||
"value": {
|
||||
"mode": "fixed",
|
||||
"fixedColor": "dark-yellow"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"options": {
|
||||
"legend": {
|
||||
@ -1898,7 +1931,7 @@ data:
|
||||
},
|
||||
{
|
||||
"id": 140,
|
||||
"type": "table",
|
||||
"type": "stat",
|
||||
"title": "Flux Source",
|
||||
"datasource": {
|
||||
"type": "prometheus",
|
||||
@ -1914,104 +1947,7 @@ data:
|
||||
{
|
||||
"expr": "max by (branch, revision) (ananke_gitops_flux_source_info{job=\"ananke-power\",namespace=\"flux-system\",name=\"flux-system\"}) or on() vector(0)",
|
||||
"refId": "A",
|
||||
"instant": true,
|
||||
"format": "table"
|
||||
}
|
||||
],
|
||||
"fieldConfig": {
|
||||
"defaults": {
|
||||
"unit": "none",
|
||||
"custom": {
|
||||
"filterable": false
|
||||
}
|
||||
},
|
||||
"overrides": []
|
||||
},
|
||||
"options": {
|
||||
"showHeader": true,
|
||||
"columnFilters": false,
|
||||
"showColumnFilters": false,
|
||||
"footer": {
|
||||
"show": false,
|
||||
"fields": "",
|
||||
"calcs": []
|
||||
}
|
||||
},
|
||||
"transformations": [
|
||||
{
|
||||
"id": "labelsToFields",
|
||||
"options": {}
|
||||
},
|
||||
{
|
||||
"id": "organize",
|
||||
"options": {
|
||||
"excludeByName": {
|
||||
"Time": true,
|
||||
"Value": true,
|
||||
"namespace": true,
|
||||
"name": true
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"description": "Flux GitRepository branch and revision reported by Ananke. Value is hidden here on purpose.",
|
||||
"links": [
|
||||
{
|
||||
"title": "Open atlas-gitops dashboard",
|
||||
"url": "/d/atlas-gitops",
|
||||
"targetBlank": true
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": 150,
|
||||
"type": "stat",
|
||||
"title": "GitOps Counts",
|
||||
"datasource": {
|
||||
"type": "prometheus",
|
||||
"uid": "atlas-vm"
|
||||
},
|
||||
"gridPos": {
|
||||
"h": 2,
|
||||
"w": 6,
|
||||
"x": 18,
|
||||
"y": 15
|
||||
},
|
||||
"targets": [
|
||||
{
|
||||
"expr": "sum(max by (namespace, name) (ananke_gitops_kustomization_ready{job=\"ananke-power\"})) or on() vector(0)",
|
||||
"refId": "A",
|
||||
"legendFormat": "K Ready",
|
||||
"instant": true
|
||||
},
|
||||
{
|
||||
"expr": "count(max by (namespace, name) (ananke_gitops_kustomization_ready{job=\"ananke-power\"})) or on() vector(0)",
|
||||
"refId": "B",
|
||||
"legendFormat": "K Total",
|
||||
"instant": true
|
||||
},
|
||||
{
|
||||
"expr": "sum(max by (namespace, name) (ananke_gitops_kustomization_suspended{job=\"ananke-power\"})) or on() vector(0)",
|
||||
"refId": "C",
|
||||
"legendFormat": "K Susp",
|
||||
"instant": true
|
||||
},
|
||||
{
|
||||
"expr": "sum(max by (namespace, name) (ananke_gitops_helmrelease_ready{job=\"ananke-power\"})) or on() vector(0)",
|
||||
"refId": "D",
|
||||
"legendFormat": "H Ready",
|
||||
"instant": true
|
||||
},
|
||||
{
|
||||
"expr": "count(max by (namespace, name) (ananke_gitops_helmrelease_ready{job=\"ananke-power\"})) or on() vector(0)",
|
||||
"refId": "E",
|
||||
"legendFormat": "H Total",
|
||||
"instant": true
|
||||
},
|
||||
{
|
||||
"expr": "sum(max by (namespace, name) (ananke_gitops_helmrelease_suspended{job=\"ananke-power\"})) or on() vector(0)",
|
||||
"refId": "F",
|
||||
"legendFormat": "H Susp",
|
||||
"legendFormat": "{{branch}} @ {{revision}}",
|
||||
"instant": true
|
||||
}
|
||||
],
|
||||
@ -2025,11 +1961,11 @@ data:
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "rgba(115, 115, 115, 1)",
|
||||
"color": "dark-red",
|
||||
"value": null
|
||||
},
|
||||
{
|
||||
"color": "dark-green",
|
||||
"color": "dark-blue",
|
||||
"value": 1
|
||||
}
|
||||
]
|
||||
@ -2037,14 +1973,13 @@ data:
|
||||
"unit": "none",
|
||||
"custom": {
|
||||
"displayMode": "auto"
|
||||
},
|
||||
"decimals": 0
|
||||
}
|
||||
},
|
||||
"overrides": []
|
||||
},
|
||||
"options": {
|
||||
"colorMode": "value",
|
||||
"graphMode": "area",
|
||||
"graphMode": "none",
|
||||
"justifyMode": "center",
|
||||
"reduceOptions": {
|
||||
"calcs": [
|
||||
@ -2053,9 +1988,9 @@ data:
|
||||
"fields": "",
|
||||
"values": false
|
||||
},
|
||||
"textMode": "name_and_value",
|
||||
"textMode": "name",
|
||||
"text": {
|
||||
"titleSize": 11,
|
||||
"titleSize": 13,
|
||||
"valueSize": 18
|
||||
}
|
||||
},
|
||||
@ -2066,28 +2001,28 @@ data:
|
||||
"targetBlank": true
|
||||
}
|
||||
],
|
||||
"description": "K = Kustomizations, H = HelmReleases. Ready and total are shown as counts; suspended should stay zero."
|
||||
"description": "Flux GitRepository branch and revision reported by Ananke. Full object detail lives in Atlas GitOps."
|
||||
},
|
||||
{
|
||||
"id": 151,
|
||||
"type": "state-timeline",
|
||||
"title": "GitOps Ready History",
|
||||
"description": "Compact readiness history. Full object tables live in Atlas GitOps.",
|
||||
"id": 150,
|
||||
"type": "bargauge",
|
||||
"title": "GitOps Health",
|
||||
"datasource": {
|
||||
"type": "prometheus",
|
||||
"uid": "atlas-vm"
|
||||
},
|
||||
"gridPos": {
|
||||
"h": 2,
|
||||
"h": 4,
|
||||
"w": 6,
|
||||
"x": 18,
|
||||
"y": 17
|
||||
"y": 15
|
||||
},
|
||||
"targets": [
|
||||
{
|
||||
"expr": "label_replace(100 * sum(max by (namespace, name) (ananke_gitops_kustomization_ready{job=\"ananke-power\"})) / clamp_min(count(max by (namespace, name) (ananke_gitops_kustomization_ready{job=\"ananke-power\"})), 1), \"kind\", \"Kustomizations\", \"__name__\", \".*\") or label_replace(100 * sum(max by (namespace, name) (ananke_gitops_helmrelease_ready{job=\"ananke-power\"})) / clamp_min(count(max by (namespace, name) (ananke_gitops_helmrelease_ready{job=\"ananke-power\"})), 1), \"kind\", \"HelmReleases\", \"__name__\", \".*\")",
|
||||
"expr": "sort(label_replace(100 * sum(max by (namespace, name) (ananke_gitops_kustomization_ready{job=\"ananke-power\"})) / clamp_min(count(max by (namespace, name) (ananke_gitops_kustomization_ready{job=\"ananke-power\"})), 1), \"signal\", \"Kustomizations Ready\", \"__name__\", \".*\") or label_replace(100 * sum(max by (namespace, name) (ananke_gitops_helmrelease_ready{job=\"ananke-power\"})) / clamp_min(count(max by (namespace, name) (ananke_gitops_helmrelease_ready{job=\"ananke-power\"})), 1), \"signal\", \"HelmReleases Ready\", \"__name__\", \".*\") or label_replace(100 * (1 - ((sum(max by (namespace, name) (ananke_gitops_kustomization_suspended{job=\"ananke-power\"})) or on() vector(0)) + (sum(max by (namespace, name) (ananke_gitops_helmrelease_suspended{job=\"ananke-power\"})) or on() vector(0))) / clamp_min((count(max by (namespace, name) (ananke_gitops_kustomization_ready{job=\"ananke-power\"})) or on() vector(0)) + (count(max by (namespace, name) (ananke_gitops_helmrelease_ready{job=\"ananke-power\"})) or on() vector(0)), 1)), \"signal\", \"Objects Not Suspended\", \"__name__\", \".*\"))",
|
||||
"refId": "A",
|
||||
"legendFormat": "{{kind}}"
|
||||
"legendFormat": "{{signal}}",
|
||||
"instant": true
|
||||
}
|
||||
],
|
||||
"fieldConfig": {
|
||||
@ -2096,6 +2031,8 @@ data:
|
||||
"mode": "thresholds"
|
||||
},
|
||||
"unit": "percent",
|
||||
"min": 0,
|
||||
"max": 100,
|
||||
"thresholds": {
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
@ -2105,11 +2042,11 @@ data:
|
||||
},
|
||||
{
|
||||
"color": "dark-orange",
|
||||
"value": 90
|
||||
"value": 70
|
||||
},
|
||||
{
|
||||
"color": "dark-yellow",
|
||||
"value": 93
|
||||
"value": 85
|
||||
},
|
||||
{
|
||||
"color": "dark-green",
|
||||
@ -2121,26 +2058,19 @@ data:
|
||||
}
|
||||
]
|
||||
},
|
||||
"custom": {
|
||||
"fillOpacity": 70,
|
||||
"lineWidth": 0,
|
||||
"spanNulls": true
|
||||
},
|
||||
"min": 0,
|
||||
"max": 100
|
||||
"decimals": 0
|
||||
},
|
||||
"overrides": []
|
||||
},
|
||||
"options": {
|
||||
"mergeValues": true,
|
||||
"showValue": "never",
|
||||
"legend": {
|
||||
"displayMode": "list",
|
||||
"placement": "bottom"
|
||||
},
|
||||
"tooltip": {
|
||||
"mode": "single",
|
||||
"sort": "none"
|
||||
"displayMode": "basic",
|
||||
"orientation": "horizontal",
|
||||
"reduceOptions": {
|
||||
"calcs": [
|
||||
"lastNotNull"
|
||||
],
|
||||
"fields": "",
|
||||
"values": false
|
||||
}
|
||||
},
|
||||
"links": [
|
||||
@ -2149,6 +2079,18 @@ data:
|
||||
"url": "/d/atlas-gitops",
|
||||
"targetBlank": true
|
||||
}
|
||||
],
|
||||
"description": "Compact GitOps health: readiness percentages plus percent of Flux objects not suspended.",
|
||||
"transformations": [
|
||||
{
|
||||
"id": "sortBy",
|
||||
"options": {
|
||||
"fields": [
|
||||
"Value"
|
||||
],
|
||||
"order": "asc"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
@ -2204,7 +2146,7 @@ data:
|
||||
"overrides": []
|
||||
},
|
||||
"options": {
|
||||
"displayMode": "gradient",
|
||||
"displayMode": "basic",
|
||||
"orientation": "horizontal",
|
||||
"reduceOptions": {
|
||||
"calcs": [
|
||||
@ -2255,12 +2197,12 @@ data:
|
||||
},
|
||||
"targets": [
|
||||
{
|
||||
"expr": "sum(increase(ariadne_task_runs_total[$__interval])) or on() vector(0)",
|
||||
"expr": "sum(increase(ariadne_task_runs_total[5m])) or on() vector(0)",
|
||||
"refId": "A",
|
||||
"legendFormat": "Attempts"
|
||||
},
|
||||
{
|
||||
"expr": "sum(increase(ariadne_task_runs_total{status=\"error\"}[$__interval])) or on() vector(0)",
|
||||
"expr": "sum(increase(ariadne_task_runs_total{status=\"error\"}[5m])) or on() vector(0)",
|
||||
"refId": "B",
|
||||
"legendFormat": "Failures"
|
||||
}
|
||||
@ -2273,6 +2215,8 @@ data:
|
||||
"barAlignment": 0,
|
||||
"lineWidth": 0,
|
||||
"fillOpacity": 70,
|
||||
"gradientMode": "none",
|
||||
"showPoints": "never",
|
||||
"spanNulls": true
|
||||
}
|
||||
},
|
||||
@ -2287,7 +2231,7 @@ data:
|
||||
"id": "color",
|
||||
"value": {
|
||||
"mode": "fixed",
|
||||
"fixedColor": "dark-green"
|
||||
"fixedColor": "dark-blue"
|
||||
}
|
||||
}
|
||||
]
|
||||
@ -2329,7 +2273,7 @@ data:
|
||||
{
|
||||
"id": 46,
|
||||
"type": "bargauge",
|
||||
"title": "Platform Gate Health by Suite",
|
||||
"title": "Gate Checks Passing by Suite",
|
||||
"datasource": {
|
||||
"type": "prometheus",
|
||||
"uid": "atlas-vm"
|
||||
@ -2365,11 +2309,11 @@ data:
|
||||
},
|
||||
{
|
||||
"color": "dark-orange",
|
||||
"value": 90
|
||||
"value": 70
|
||||
},
|
||||
{
|
||||
"color": "dark-yellow",
|
||||
"value": 93
|
||||
"value": 85
|
||||
},
|
||||
{
|
||||
"color": "dark-green",
|
||||
@ -2381,12 +2325,12 @@ data:
|
||||
}
|
||||
]
|
||||
},
|
||||
"decimals": 1
|
||||
"decimals": 0
|
||||
},
|
||||
"overrides": []
|
||||
},
|
||||
"options": {
|
||||
"displayMode": "gradient",
|
||||
"displayMode": "basic",
|
||||
"orientation": "horizontal",
|
||||
"reduceOptions": {
|
||||
"calcs": [
|
||||
@ -2414,7 +2358,7 @@ data:
|
||||
}
|
||||
}
|
||||
],
|
||||
"description": "Latest quality-gate health by suite. This mirrors the testing dashboard's current gate health instead of plotting sparse per-run success spikes."
|
||||
"description": "Percent of current gate dimensions passing per suite. There are seven gate dimensions, so 85.7% means one gate is failing."
|
||||
},
|
||||
{
|
||||
"id": 142,
|
||||
@ -2682,7 +2626,7 @@ data:
|
||||
"overrides": []
|
||||
},
|
||||
"options": {
|
||||
"displayMode": "gradient",
|
||||
"displayMode": "basic",
|
||||
"orientation": "horizontal",
|
||||
"reduceOptions": {
|
||||
"calcs": [
|
||||
@ -3641,7 +3585,7 @@ data:
|
||||
"overrides": []
|
||||
},
|
||||
"options": {
|
||||
"displayMode": "gradient",
|
||||
"displayMode": "basic",
|
||||
"orientation": "horizontal",
|
||||
"reduceOptions": {
|
||||
"calcs": [
|
||||
|
||||
@ -488,7 +488,7 @@ data:
|
||||
"overrides": []
|
||||
},
|
||||
"options": {
|
||||
"displayMode": "gradient",
|
||||
"displayMode": "basic",
|
||||
"orientation": "horizontal",
|
||||
"reduceOptions": {
|
||||
"calcs": [
|
||||
|
||||
@ -264,10 +264,43 @@ data:
|
||||
"barAlignment": 0,
|
||||
"lineWidth": 0,
|
||||
"fillOpacity": 70,
|
||||
"gradientMode": "none",
|
||||
"showPoints": "never",
|
||||
"spanNulls": true
|
||||
}
|
||||
},
|
||||
"overrides": []
|
||||
"overrides": [
|
||||
{
|
||||
"matcher": {
|
||||
"id": "byName",
|
||||
"options": "Pyrphoros"
|
||||
},
|
||||
"properties": [
|
||||
{
|
||||
"id": "color",
|
||||
"value": {
|
||||
"mode": "fixed",
|
||||
"fixedColor": "dark-blue"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"matcher": {
|
||||
"id": "byName",
|
||||
"options": "Statera"
|
||||
},
|
||||
"properties": [
|
||||
{
|
||||
"id": "color",
|
||||
"value": {
|
||||
"mode": "fixed",
|
||||
"fixedColor": "dark-yellow"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"options": {
|
||||
"legend": {
|
||||
|
||||
@ -192,9 +192,13 @@ data:
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "dark-green",
|
||||
"color": "dark-blue",
|
||||
"value": null
|
||||
},
|
||||
{
|
||||
"color": "dark-green",
|
||||
"value": 0.01
|
||||
},
|
||||
{
|
||||
"color": "dark-yellow",
|
||||
"value": 1
|
||||
@ -1139,9 +1143,13 @@ data:
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "dark-green",
|
||||
"color": "dark-blue",
|
||||
"value": null
|
||||
},
|
||||
{
|
||||
"color": "dark-green",
|
||||
"value": 0.01
|
||||
},
|
||||
{
|
||||
"color": "dark-yellow",
|
||||
"value": 1
|
||||
@ -1211,9 +1219,13 @@ data:
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "dark-green",
|
||||
"color": "dark-blue",
|
||||
"value": null
|
||||
},
|
||||
{
|
||||
"color": "dark-green",
|
||||
"value": 0.01
|
||||
},
|
||||
{
|
||||
"color": "dark-yellow",
|
||||
"value": 1
|
||||
@ -1283,9 +1295,13 @@ data:
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "dark-green",
|
||||
"color": "dark-blue",
|
||||
"value": null
|
||||
},
|
||||
{
|
||||
"color": "dark-green",
|
||||
"value": 0.01
|
||||
},
|
||||
{
|
||||
"color": "dark-yellow",
|
||||
"value": 1
|
||||
@ -1355,9 +1371,13 @@ data:
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "dark-green",
|
||||
"color": "dark-blue",
|
||||
"value": null
|
||||
},
|
||||
{
|
||||
"color": "dark-green",
|
||||
"value": 0.01
|
||||
},
|
||||
{
|
||||
"color": "dark-yellow",
|
||||
"value": 1
|
||||
@ -1427,9 +1447,13 @@ data:
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "dark-green",
|
||||
"color": "dark-blue",
|
||||
"value": null
|
||||
},
|
||||
{
|
||||
"color": "dark-green",
|
||||
"value": 0.01
|
||||
},
|
||||
{
|
||||
"color": "dark-yellow",
|
||||
"value": 1
|
||||
@ -1499,9 +1523,13 @@ data:
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "dark-green",
|
||||
"color": "dark-blue",
|
||||
"value": null
|
||||
},
|
||||
{
|
||||
"color": "dark-green",
|
||||
"value": 0.01
|
||||
},
|
||||
{
|
||||
"color": "dark-yellow",
|
||||
"value": 1
|
||||
@ -1571,9 +1599,13 @@ data:
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "dark-green",
|
||||
"color": "dark-blue",
|
||||
"value": null
|
||||
},
|
||||
{
|
||||
"color": "dark-green",
|
||||
"value": 0.01
|
||||
},
|
||||
{
|
||||
"color": "dark-yellow",
|
||||
"value": 1
|
||||
@ -2203,9 +2235,13 @@ data:
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "dark-green",
|
||||
"color": "dark-blue",
|
||||
"value": null
|
||||
},
|
||||
{
|
||||
"color": "dark-green",
|
||||
"value": 0.01
|
||||
},
|
||||
{
|
||||
"color": "dark-yellow",
|
||||
"value": 1
|
||||
@ -2385,9 +2421,13 @@ data:
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "dark-green",
|
||||
"color": "dark-blue",
|
||||
"value": null
|
||||
},
|
||||
{
|
||||
"color": "dark-green",
|
||||
"value": 0.01
|
||||
},
|
||||
{
|
||||
"color": "dark-yellow",
|
||||
"value": 1
|
||||
@ -3854,9 +3894,13 @@ data:
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "dark-green",
|
||||
"color": "dark-blue",
|
||||
"value": null
|
||||
},
|
||||
{
|
||||
"color": "dark-green",
|
||||
"value": 0.01
|
||||
},
|
||||
{
|
||||
"color": "dark-yellow",
|
||||
"value": 1
|
||||
@ -3923,9 +3967,13 @@ data:
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "dark-green",
|
||||
"color": "dark-blue",
|
||||
"value": null
|
||||
},
|
||||
{
|
||||
"color": "dark-green",
|
||||
"value": 0.01
|
||||
},
|
||||
{
|
||||
"color": "dark-yellow",
|
||||
"value": 1
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user