diff --git a/scripts/dashboards_render_atlas.py b/scripts/dashboards_render_atlas.py index e4e3a35f..7397b111 100644 --- a/scripts/dashboards_render_atlas.py +++ b/scripts/dashboards_render_atlas.py @@ -505,12 +505,6 @@ JENKINS_BUILD_WEATHER_LAST_SUCCESS_AGE_HOURS_BY_JOB = ( JENKINS_BUILD_WEATHER_LAST_FAILURE_AGE_HOURS_BY_JOB = ( f"min by (exported_job,job_url,weather_icon) ({JENKINS_BUILD_WEATHER_LAST_FAILURE_AGE_HOURS})" ) -JENKINS_BUILD_WEATHER_LAST_SUCCESS_NEWEST_6_HOURS = ( - f"sort(bottomk(6, {JENKINS_BUILD_WEATHER_LAST_SUCCESS_AGE_HOURS_BY_JOB}))" -) -JENKINS_BUILD_WEATHER_LAST_FAILURE_NEWEST_6_HOURS = ( - f"sort(bottomk(6, {JENKINS_BUILD_WEATHER_LAST_FAILURE_AGE_HOURS_BY_JOB}))" -) JENKINS_BUILD_WEATHER_LAST_DURATION_MINUTES = ( "ariadne_jenkins_build_weather_job_last_duration_seconds / 60" ) @@ -1614,6 +1608,79 @@ def jenkins_weather_statlist_panel( return panel +def jenkins_weather_scroll_table_panel( + panel_id, + title, + expr, + grid, + *, + unit="h", + decimals=1, + sort_order="asc", + links=None, + description=None, +): + table = table_panel( + panel_id, + title, + expr, + grid, + unit=unit, + instant=True, + format="table", + filterable=False, + options={"showHeader": False, "columnFilters": False, "cellHeight": "sm"}, + footer={"show": False, "fields": "", "calcs": []}, + transformations=[ + {"id": "labelsToFields", "options": {}}, + {"id": "sortBy", "options": {"fields": ["Value"], "order": sort_order}}, + { + "id": "organize", + "options": { + "excludeByName": {"Time": True, "job_url": True}, + "renameByName": {"weather_icon": "", "exported_job": "Job", "Value": "h"}, + }, + }, + ], + field_overrides=[ + { + "matcher": {"id": "byName", "options": "weather_icon"}, + "properties": [ + {"id": "custom.width", "value": 26}, + {"id": "custom.align", "value": "center"}, + ], + }, + { + "matcher": {"id": "byName", "options": "exported_job"}, + "properties": [ + {"id": "custom.width", "value": 190}, + { + "id": "links", + "value": [ + { + "title": "Open Jenkins job", + "url": "${__data.fields.job_url}", + "targetBlank": True, + } + ], + }, + ], + }, + { + "matcher": {"id": "byName", "options": "Value"}, + "properties": [ + {"id": "decimals", "value": decimals}, + {"id": "custom.width", "value": 74}, + {"id": "custom.align", "value": "right"}, + ], + }, + ], + links=links, + description=description, + ) + return table + + def text_panel(panel_id, title, content, grid): return { "id": panel_id, @@ -2195,35 +2262,35 @@ def build_overview(): ) panels.append(test_success) panels.append( - jenkins_weather_statlist_panel( + jenkins_weather_scroll_table_panel( 142, "Jenkins Last Success (h, newest first)", - JENKINS_BUILD_WEATHER_LAST_SUCCESS_NEWEST_6_HOURS, + JENKINS_BUILD_WEATHER_LAST_SUCCESS_AGE_HOURS_BY_JOB, {"h": 5, "w": 4, "x": 8, "y": 32}, unit="h", decimals=1, sort_order="asc", - limit=None, - title_size=12, - value_size=12, links=link_to("atlas-jobs"), - description="Age since each job's most recent successful run; newest runs appear first.", + description=( + "Scrollable list of all Jenkins jobs ordered by age since most recent successful run " + "(newest first)." + ), ) ) panels.append( - jenkins_weather_statlist_panel( + jenkins_weather_scroll_table_panel( 243, "Jenkins Last Failure (h, newest first)", - JENKINS_BUILD_WEATHER_LAST_FAILURE_NEWEST_6_HOURS, + JENKINS_BUILD_WEATHER_LAST_FAILURE_AGE_HOURS_BY_JOB, {"h": 5, "w": 4, "x": 12, "y": 32}, unit="h", decimals=1, sort_order="asc", - limit=None, - title_size=12, - value_size=12, links=link_to("atlas-jobs"), - description="Age since each job's most recent failed run; newest failures appear first.", + description=( + "Scrollable list of all Jenkins jobs ordered by age since most recent failed run " + "(newest first)." + ), ) ) panels.append( diff --git a/services/monitoring/dashboards/atlas-overview.json b/services/monitoring/dashboards/atlas-overview.json index a7af2f69..3216bce6 100644 --- a/services/monitoring/dashboards/atlas-overview.json +++ b/services/monitoring/dashboards/atlas-overview.json @@ -2283,7 +2283,7 @@ }, { "id": 142, - "type": "stat", + "type": "table", "title": "Jenkins Last Success (h, newest first)", "datasource": { "type": "prometheus", @@ -2297,126 +2297,95 @@ }, "targets": [ { + "expr": "min by (exported_job,job_url,weather_icon) ((time() - ariadne_jenkins_build_weather_job_last_success_timestamp_seconds) / 3600)", "refId": "A", - "expr": "(sort(bottomk(6, min by (exported_job,job_url,weather_icon) ((time() - ariadne_jenkins_build_weather_job_last_success_timestamp_seconds) / 3600)))) and on(exported_job,job_url,weather_icon) (max by (exported_job,job_url,weather_icon) (ariadne_jenkins_build_weather_job_last_status) == 1)", - "legendFormat": "{{weather_icon}} {{exported_job}}", - "instant": true - }, - { - "refId": "B", - "expr": "(sort(bottomk(6, min by (exported_job,job_url,weather_icon) ((time() - ariadne_jenkins_build_weather_job_last_success_timestamp_seconds) / 3600)))) and on(exported_job,job_url,weather_icon) (max by (exported_job,job_url,weather_icon) (ariadne_jenkins_build_weather_job_last_status) == 0)", - "legendFormat": "{{weather_icon}} {{exported_job}}", - "instant": true - }, - { - "refId": "C", - "expr": "(sort(bottomk(6, min by (exported_job,job_url,weather_icon) ((time() - ariadne_jenkins_build_weather_job_last_success_timestamp_seconds) / 3600)))) and on(exported_job,job_url,weather_icon) (max by (exported_job,job_url,weather_icon) (ariadne_jenkins_build_weather_job_last_status) == 2)", - "legendFormat": "{{weather_icon}} {{exported_job}}", - "instant": true - }, - { - "refId": "D", - "expr": "(sort(bottomk(6, min by (exported_job,job_url,weather_icon) ((time() - ariadne_jenkins_build_weather_job_last_success_timestamp_seconds) / 3600)))) and on(exported_job,job_url,weather_icon) (max by (exported_job,job_url,weather_icon) (ariadne_jenkins_build_weather_job_last_status) < 0)", - "legendFormat": "{{weather_icon}} {{exported_job}}", - "instant": true + "instant": true, + "format": "table" } ], "fieldConfig": { "defaults": { "unit": "h", - "decimals": 1, - "min": 0, - "links": [ - { - "title": "Open Jenkins job", - "url": "${__field.labels.job_url}", - "targetBlank": true - } - ] + "custom": { + "filterable": false + } }, "overrides": [ { "matcher": { - "id": "byFrameRefID", - "options": "A" + "id": "byName", + "options": "weather_icon" }, "properties": [ { - "id": "color", - "value": { - "mode": "fixed", - "fixedColor": "green" - } + "id": "custom.width", + "value": 26 + }, + { + "id": "custom.align", + "value": "center" } ] }, { "matcher": { - "id": "byFrameRefID", - "options": "B" + "id": "byName", + "options": "exported_job" }, "properties": [ { - "id": "color", - "value": { - "mode": "fixed", - "fixedColor": "red" - } + "id": "custom.width", + "value": 190 + }, + { + "id": "links", + "value": [ + { + "title": "Open Jenkins job", + "url": "${__data.fields.job_url}", + "targetBlank": true + } + ] } ] }, { "matcher": { - "id": "byFrameRefID", - "options": "C" + "id": "byName", + "options": "Value" }, "properties": [ { - "id": "color", - "value": { - "mode": "fixed", - "fixedColor": "yellow" - } - } - ] - }, - { - "matcher": { - "id": "byFrameRefID", - "options": "D" - }, - "properties": [ + "id": "decimals", + "value": 1 + }, { - "id": "color", - "value": { - "mode": "fixed", - "fixedColor": "gray" - } + "id": "custom.width", + "value": 74 + }, + { + "id": "custom.align", + "value": "right" } ] } ] }, "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "left", - "orientation": "horizontal", - "wideLayout": true, - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], + "showHeader": false, + "columnFilters": false, + "cellHeight": "sm", + "footer": { + "show": false, "fields": "", - "values": false - }, - "textMode": "name_and_value", - "text": { - "titleSize": 12, - "valueSize": 12 + "calcs": [] } }, "transformations": [ + { + "id": "labelsToFields", + "options": {} + }, { "id": "sortBy", "options": { @@ -2425,6 +2394,20 @@ ], "order": "asc" } + }, + { + "id": "organize", + "options": { + "excludeByName": { + "Time": true, + "job_url": true + }, + "renameByName": { + "weather_icon": "", + "exported_job": "Job", + "Value": "h" + } + } } ], "links": [ @@ -2434,11 +2417,11 @@ "targetBlank": true } ], - "description": "Age since each job's most recent successful run; newest runs appear first." + "description": "Scrollable list of all Jenkins jobs ordered by age since most recent successful run (newest first)." }, { "id": 243, - "type": "stat", + "type": "table", "title": "Jenkins Last Failure (h, newest first)", "datasource": { "type": "prometheus", @@ -2452,126 +2435,95 @@ }, "targets": [ { + "expr": "min by (exported_job,job_url,weather_icon) ((time() - ariadne_jenkins_build_weather_job_last_failure_timestamp_seconds) / 3600)", "refId": "A", - "expr": "(sort(bottomk(6, min by (exported_job,job_url,weather_icon) ((time() - ariadne_jenkins_build_weather_job_last_failure_timestamp_seconds) / 3600)))) and on(exported_job,job_url,weather_icon) (max by (exported_job,job_url,weather_icon) (ariadne_jenkins_build_weather_job_last_status) == 1)", - "legendFormat": "{{weather_icon}} {{exported_job}}", - "instant": true - }, - { - "refId": "B", - "expr": "(sort(bottomk(6, min by (exported_job,job_url,weather_icon) ((time() - ariadne_jenkins_build_weather_job_last_failure_timestamp_seconds) / 3600)))) and on(exported_job,job_url,weather_icon) (max by (exported_job,job_url,weather_icon) (ariadne_jenkins_build_weather_job_last_status) == 0)", - "legendFormat": "{{weather_icon}} {{exported_job}}", - "instant": true - }, - { - "refId": "C", - "expr": "(sort(bottomk(6, min by (exported_job,job_url,weather_icon) ((time() - ariadne_jenkins_build_weather_job_last_failure_timestamp_seconds) / 3600)))) and on(exported_job,job_url,weather_icon) (max by (exported_job,job_url,weather_icon) (ariadne_jenkins_build_weather_job_last_status) == 2)", - "legendFormat": "{{weather_icon}} {{exported_job}}", - "instant": true - }, - { - "refId": "D", - "expr": "(sort(bottomk(6, min by (exported_job,job_url,weather_icon) ((time() - ariadne_jenkins_build_weather_job_last_failure_timestamp_seconds) / 3600)))) and on(exported_job,job_url,weather_icon) (max by (exported_job,job_url,weather_icon) (ariadne_jenkins_build_weather_job_last_status) < 0)", - "legendFormat": "{{weather_icon}} {{exported_job}}", - "instant": true + "instant": true, + "format": "table" } ], "fieldConfig": { "defaults": { "unit": "h", - "decimals": 1, - "min": 0, - "links": [ - { - "title": "Open Jenkins job", - "url": "${__field.labels.job_url}", - "targetBlank": true - } - ] + "custom": { + "filterable": false + } }, "overrides": [ { "matcher": { - "id": "byFrameRefID", - "options": "A" + "id": "byName", + "options": "weather_icon" }, "properties": [ { - "id": "color", - "value": { - "mode": "fixed", - "fixedColor": "green" - } + "id": "custom.width", + "value": 26 + }, + { + "id": "custom.align", + "value": "center" } ] }, { "matcher": { - "id": "byFrameRefID", - "options": "B" + "id": "byName", + "options": "exported_job" }, "properties": [ { - "id": "color", - "value": { - "mode": "fixed", - "fixedColor": "red" - } + "id": "custom.width", + "value": 190 + }, + { + "id": "links", + "value": [ + { + "title": "Open Jenkins job", + "url": "${__data.fields.job_url}", + "targetBlank": true + } + ] } ] }, { "matcher": { - "id": "byFrameRefID", - "options": "C" + "id": "byName", + "options": "Value" }, "properties": [ { - "id": "color", - "value": { - "mode": "fixed", - "fixedColor": "yellow" - } - } - ] - }, - { - "matcher": { - "id": "byFrameRefID", - "options": "D" - }, - "properties": [ + "id": "decimals", + "value": 1 + }, { - "id": "color", - "value": { - "mode": "fixed", - "fixedColor": "gray" - } + "id": "custom.width", + "value": 74 + }, + { + "id": "custom.align", + "value": "right" } ] } ] }, "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "left", - "orientation": "horizontal", - "wideLayout": true, - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], + "showHeader": false, + "columnFilters": false, + "cellHeight": "sm", + "footer": { + "show": false, "fields": "", - "values": false - }, - "textMode": "name_and_value", - "text": { - "titleSize": 12, - "valueSize": 12 + "calcs": [] } }, "transformations": [ + { + "id": "labelsToFields", + "options": {} + }, { "id": "sortBy", "options": { @@ -2580,6 +2532,20 @@ ], "order": "asc" } + }, + { + "id": "organize", + "options": { + "excludeByName": { + "Time": true, + "job_url": true + }, + "renameByName": { + "weather_icon": "", + "exported_job": "Job", + "Value": "h" + } + } } ], "links": [ @@ -2589,7 +2555,7 @@ "targetBlank": true } ], - "description": "Age since each job's most recent failed run; newest failures appear first." + "description": "Scrollable list of all Jenkins jobs ordered by age since most recent failed run (newest first)." }, { "id": 47, diff --git a/services/monitoring/grafana-dashboard-overview.yaml b/services/monitoring/grafana-dashboard-overview.yaml index 0a2ee1cc..fa0bd037 100644 --- a/services/monitoring/grafana-dashboard-overview.yaml +++ b/services/monitoring/grafana-dashboard-overview.yaml @@ -2292,7 +2292,7 @@ data: }, { "id": 142, - "type": "stat", + "type": "table", "title": "Jenkins Last Success (h, newest first)", "datasource": { "type": "prometheus", @@ -2306,126 +2306,95 @@ data: }, "targets": [ { + "expr": "min by (exported_job,job_url,weather_icon) ((time() - ariadne_jenkins_build_weather_job_last_success_timestamp_seconds) / 3600)", "refId": "A", - "expr": "(sort(bottomk(6, min by (exported_job,job_url,weather_icon) ((time() - ariadne_jenkins_build_weather_job_last_success_timestamp_seconds) / 3600)))) and on(exported_job,job_url,weather_icon) (max by (exported_job,job_url,weather_icon) (ariadne_jenkins_build_weather_job_last_status) == 1)", - "legendFormat": "{{weather_icon}} {{exported_job}}", - "instant": true - }, - { - "refId": "B", - "expr": "(sort(bottomk(6, min by (exported_job,job_url,weather_icon) ((time() - ariadne_jenkins_build_weather_job_last_success_timestamp_seconds) / 3600)))) and on(exported_job,job_url,weather_icon) (max by (exported_job,job_url,weather_icon) (ariadne_jenkins_build_weather_job_last_status) == 0)", - "legendFormat": "{{weather_icon}} {{exported_job}}", - "instant": true - }, - { - "refId": "C", - "expr": "(sort(bottomk(6, min by (exported_job,job_url,weather_icon) ((time() - ariadne_jenkins_build_weather_job_last_success_timestamp_seconds) / 3600)))) and on(exported_job,job_url,weather_icon) (max by (exported_job,job_url,weather_icon) (ariadne_jenkins_build_weather_job_last_status) == 2)", - "legendFormat": "{{weather_icon}} {{exported_job}}", - "instant": true - }, - { - "refId": "D", - "expr": "(sort(bottomk(6, min by (exported_job,job_url,weather_icon) ((time() - ariadne_jenkins_build_weather_job_last_success_timestamp_seconds) / 3600)))) and on(exported_job,job_url,weather_icon) (max by (exported_job,job_url,weather_icon) (ariadne_jenkins_build_weather_job_last_status) < 0)", - "legendFormat": "{{weather_icon}} {{exported_job}}", - "instant": true + "instant": true, + "format": "table" } ], "fieldConfig": { "defaults": { "unit": "h", - "decimals": 1, - "min": 0, - "links": [ - { - "title": "Open Jenkins job", - "url": "${__field.labels.job_url}", - "targetBlank": true - } - ] + "custom": { + "filterable": false + } }, "overrides": [ { "matcher": { - "id": "byFrameRefID", - "options": "A" + "id": "byName", + "options": "weather_icon" }, "properties": [ { - "id": "color", - "value": { - "mode": "fixed", - "fixedColor": "green" - } + "id": "custom.width", + "value": 26 + }, + { + "id": "custom.align", + "value": "center" } ] }, { "matcher": { - "id": "byFrameRefID", - "options": "B" + "id": "byName", + "options": "exported_job" }, "properties": [ { - "id": "color", - "value": { - "mode": "fixed", - "fixedColor": "red" - } + "id": "custom.width", + "value": 190 + }, + { + "id": "links", + "value": [ + { + "title": "Open Jenkins job", + "url": "${__data.fields.job_url}", + "targetBlank": true + } + ] } ] }, { "matcher": { - "id": "byFrameRefID", - "options": "C" + "id": "byName", + "options": "Value" }, "properties": [ { - "id": "color", - "value": { - "mode": "fixed", - "fixedColor": "yellow" - } - } - ] - }, - { - "matcher": { - "id": "byFrameRefID", - "options": "D" - }, - "properties": [ + "id": "decimals", + "value": 1 + }, { - "id": "color", - "value": { - "mode": "fixed", - "fixedColor": "gray" - } + "id": "custom.width", + "value": 74 + }, + { + "id": "custom.align", + "value": "right" } ] } ] }, "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "left", - "orientation": "horizontal", - "wideLayout": true, - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], + "showHeader": false, + "columnFilters": false, + "cellHeight": "sm", + "footer": { + "show": false, "fields": "", - "values": false - }, - "textMode": "name_and_value", - "text": { - "titleSize": 12, - "valueSize": 12 + "calcs": [] } }, "transformations": [ + { + "id": "labelsToFields", + "options": {} + }, { "id": "sortBy", "options": { @@ -2434,6 +2403,20 @@ data: ], "order": "asc" } + }, + { + "id": "organize", + "options": { + "excludeByName": { + "Time": true, + "job_url": true + }, + "renameByName": { + "weather_icon": "", + "exported_job": "Job", + "Value": "h" + } + } } ], "links": [ @@ -2443,11 +2426,11 @@ data: "targetBlank": true } ], - "description": "Age since each job's most recent successful run; newest runs appear first." + "description": "Scrollable list of all Jenkins jobs ordered by age since most recent successful run (newest first)." }, { "id": 243, - "type": "stat", + "type": "table", "title": "Jenkins Last Failure (h, newest first)", "datasource": { "type": "prometheus", @@ -2461,126 +2444,95 @@ data: }, "targets": [ { + "expr": "min by (exported_job,job_url,weather_icon) ((time() - ariadne_jenkins_build_weather_job_last_failure_timestamp_seconds) / 3600)", "refId": "A", - "expr": "(sort(bottomk(6, min by (exported_job,job_url,weather_icon) ((time() - ariadne_jenkins_build_weather_job_last_failure_timestamp_seconds) / 3600)))) and on(exported_job,job_url,weather_icon) (max by (exported_job,job_url,weather_icon) (ariadne_jenkins_build_weather_job_last_status) == 1)", - "legendFormat": "{{weather_icon}} {{exported_job}}", - "instant": true - }, - { - "refId": "B", - "expr": "(sort(bottomk(6, min by (exported_job,job_url,weather_icon) ((time() - ariadne_jenkins_build_weather_job_last_failure_timestamp_seconds) / 3600)))) and on(exported_job,job_url,weather_icon) (max by (exported_job,job_url,weather_icon) (ariadne_jenkins_build_weather_job_last_status) == 0)", - "legendFormat": "{{weather_icon}} {{exported_job}}", - "instant": true - }, - { - "refId": "C", - "expr": "(sort(bottomk(6, min by (exported_job,job_url,weather_icon) ((time() - ariadne_jenkins_build_weather_job_last_failure_timestamp_seconds) / 3600)))) and on(exported_job,job_url,weather_icon) (max by (exported_job,job_url,weather_icon) (ariadne_jenkins_build_weather_job_last_status) == 2)", - "legendFormat": "{{weather_icon}} {{exported_job}}", - "instant": true - }, - { - "refId": "D", - "expr": "(sort(bottomk(6, min by (exported_job,job_url,weather_icon) ((time() - ariadne_jenkins_build_weather_job_last_failure_timestamp_seconds) / 3600)))) and on(exported_job,job_url,weather_icon) (max by (exported_job,job_url,weather_icon) (ariadne_jenkins_build_weather_job_last_status) < 0)", - "legendFormat": "{{weather_icon}} {{exported_job}}", - "instant": true + "instant": true, + "format": "table" } ], "fieldConfig": { "defaults": { "unit": "h", - "decimals": 1, - "min": 0, - "links": [ - { - "title": "Open Jenkins job", - "url": "${__field.labels.job_url}", - "targetBlank": true - } - ] + "custom": { + "filterable": false + } }, "overrides": [ { "matcher": { - "id": "byFrameRefID", - "options": "A" + "id": "byName", + "options": "weather_icon" }, "properties": [ { - "id": "color", - "value": { - "mode": "fixed", - "fixedColor": "green" - } + "id": "custom.width", + "value": 26 + }, + { + "id": "custom.align", + "value": "center" } ] }, { "matcher": { - "id": "byFrameRefID", - "options": "B" + "id": "byName", + "options": "exported_job" }, "properties": [ { - "id": "color", - "value": { - "mode": "fixed", - "fixedColor": "red" - } + "id": "custom.width", + "value": 190 + }, + { + "id": "links", + "value": [ + { + "title": "Open Jenkins job", + "url": "${__data.fields.job_url}", + "targetBlank": true + } + ] } ] }, { "matcher": { - "id": "byFrameRefID", - "options": "C" + "id": "byName", + "options": "Value" }, "properties": [ { - "id": "color", - "value": { - "mode": "fixed", - "fixedColor": "yellow" - } - } - ] - }, - { - "matcher": { - "id": "byFrameRefID", - "options": "D" - }, - "properties": [ + "id": "decimals", + "value": 1 + }, { - "id": "color", - "value": { - "mode": "fixed", - "fixedColor": "gray" - } + "id": "custom.width", + "value": 74 + }, + { + "id": "custom.align", + "value": "right" } ] } ] }, "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "left", - "orientation": "horizontal", - "wideLayout": true, - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], + "showHeader": false, + "columnFilters": false, + "cellHeight": "sm", + "footer": { + "show": false, "fields": "", - "values": false - }, - "textMode": "name_and_value", - "text": { - "titleSize": 12, - "valueSize": 12 + "calcs": [] } }, "transformations": [ + { + "id": "labelsToFields", + "options": {} + }, { "id": "sortBy", "options": { @@ -2589,6 +2541,20 @@ data: ], "order": "asc" } + }, + { + "id": "organize", + "options": { + "excludeByName": { + "Time": true, + "job_url": true + }, + "renameByName": { + "weather_icon": "", + "exported_job": "Job", + "Value": "h" + } + } } ], "links": [ @@ -2598,7 +2564,7 @@ data: "targetBlank": true } ], - "description": "Age since each job's most recent failed run; newest failures appear first." + "description": "Scrollable list of all Jenkins jobs ordered by age since most recent failed run (newest first)." }, { "id": 47,