diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml new file mode 100644 index 00000000..1ed610f4 --- /dev/null +++ b/.github/workflows/checks.yml @@ -0,0 +1,9 @@ +name: Static checks + +on: pull_request + +jobs: + security: + uses: lidofinance/linters/.github/workflows/security.yml@master + docker: + uses: lidofinance/linters/.github/workflows/docker.yml@master diff --git a/docker/grafana/provisioning/dashboards/operators.json b/docker/grafana/provisioning/dashboards/operators.json index e78bdde7..77498fa5 100644 --- a/docker/grafana/provisioning/dashboards/operators.json +++ b/docker/grafana/provisioning/dashboards/operators.json @@ -21,7 +21,7 @@ "editable": true, "fiscalYearStartMonth": 0, "graphTooltip": 0, - "iteration": 1659506556287, + "iteration": 1663681740737, "links": [ { "asDropdown": false, @@ -48,7 +48,7 @@ }, "id": 60, "panels": [], - "title": "General", + "title": "App", "type": "row" }, { @@ -57,24 +57,27 @@ "color": { "mode": "thresholds" }, - "decimals": 1, + "decimals": 0, "mappings": [], - "max": 604800000, "min": 0, "thresholds": { "mode": "absolute", "steps": [ { - "color": "green", + "color": "text", "value": null }, + { + "color": "green", + "value": 0 + }, { "color": "dark-yellow", "value": 1800000 }, { "color": "red", - "value": 3600010 + "value": 3600000 } ] }, @@ -83,12 +86,12 @@ "overrides": [] }, "gridPos": { - "h": 2, - "w": 3, + "h": 4, + "w": 5, "x": 0, "y": 1 }, - "id": 114, + "id": 1703, "options": { "colorMode": "value", "graphMode": "area", @@ -101,7 +104,6 @@ "fields": "", "values": false }, - "text": {}, "textMode": "auto" }, "pluginVersion": "8.4.6", @@ -112,7 +114,7 @@ "uid": "PBFA97CFB590B2093" }, "exemplar": true, - "expr": "ethereum_validators_monitoring_data_actuality", + "expr": "sum(ethereum_validators_monitoring_data_actuality)", "interval": "", "legendFormat": "", "refId": "A" @@ -122,6 +124,7 @@ "type": "stat" }, { + "description": "Last processed for a specified time period", "fieldConfig": { "defaults": { "color": { @@ -144,11 +147,11 @@ }, "gridPos": { "h": 2, - "w": 3, - "x": 3, + "w": 5, + "x": 5, "y": 1 }, - "id": 168, + "id": 1705, "options": { "colorMode": "value", "graphMode": "area", @@ -172,58 +175,49 @@ "uid": "PBFA97CFB590B2093" }, "exemplar": true, - "expr": "ethereum_validators_monitoring_slot_number", + "expr": "sum(ethereum_validators_monitoring_slot_number)", "interval": "", "legendFormat": "", "refId": "A" } ], - "title": "Latest slot", + "title": "Slot", "type": "stat" }, { - "description": "AVG", + "description": "Last processed for a specified time period", "fieldConfig": { "defaults": { "color": { - "mode": "thresholds" + "fixedColor": "text", + "mode": "fixed" }, + "decimals": 0, "mappings": [], - "max": 100, - "min": 0, "thresholds": { - "mode": "percentage", + "mode": "absolute", "steps": [ { - "color": "text", + "color": "super-light-blue", "value": null - }, - { - "color": "red", - "value": 0 - }, - { - "color": "yellow", - "value": 60 - }, - { - "color": "green", - "value": 90 } ] }, - "unit": "percent" + "unit": "none" }, "overrides": [] }, "gridPos": { - "h": 6, - "w": 6, - "x": 0, + "h": 2, + "w": 5, + "x": 5, "y": 3 }, - "id": 990, + "id": 1707, "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", "orientation": "auto", "reduceOptions": { "calcs": [ @@ -232,9 +226,8 @@ "fields": "", "values": false }, - "showThresholdLabels": false, - "showThresholdMarkers": true, - "text": {} + "text": {}, + "textMode": "auto" }, "pluginVersion": "8.4.6", "targets": [ @@ -244,15 +237,14 @@ "uid": "PBFA97CFB590B2093" }, "exemplar": true, - "expr": "ethereum_validators_monitoring_chain_sync_participation_avg_percent", - "format": "time_series", + "expr": "sum(ethereum_validators_monitoring_slot_number) / 32", "interval": "", "legendFormat": "", "refId": "A" } ], - "title": "Blockchain Sync Committee validators participation", - "type": "gauge" + "title": "Epoch", + "type": "stat" }, { "collapsed": false, @@ -260,60 +252,43 @@ "h": 1, "w": 24, "x": 0, - "y": 9 + "y": 5 }, - "id": 4, + "id": 1709, "panels": [], - "title": "$nos_name_var", + "title": "🏠 General", "type": "row" }, { - "datasource": { - "type": "vertamedia-clickhouse-datasource", - "uid": "PDEE91DDB90597936" - }, - "description": "AVG", "fieldConfig": { "defaults": { "color": { "mode": "thresholds" }, "mappings": [], - "max": 100, - "min": 0, "thresholds": { - "mode": "percentage", + "mode": "absolute", "steps": [ { "color": "text", "value": null - }, - { - "color": "red", - "value": 0 - }, - { - "color": "yellow", - "value": 60 - }, - { - "color": "green", - "value": 90 } ] - }, - "unit": "percent" + } }, "overrides": [] }, "gridPos": { - "h": 6, - "w": 6, + "h": 3, + "w": 24, "x": 0, - "y": 10 + "y": 6 }, - "id": 799, + "id": 1725, "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", "orientation": "auto", "reduceOptions": { "calcs": [ @@ -322,82 +297,40 @@ "fields": "", "values": false }, - "showThresholdLabels": false, - "showThresholdMarkers": true, - "text": {} + "text": {}, + "textMode": "name" }, "pluginVersion": "8.4.6", "targets": [ { "datasource": { - "type": "vertamedia-clickhouse-datasource", - "uid": "PDEE91DDB90597936" + "type": "prometheus", + "uid": "PBFA97CFB590B2093" }, - "dateTimeType": "DATETIME", - "extrapolate": true, - "format": "table", - "formattedQuery": "SELECT $timeSeries as t, count() FROM $table WHERE $timeFilter GROUP BY t ORDER BY t", - "intervalFactor": 1, - "query": "\n SELECT\n avg(epoch_participation_percent)\n FROM\n stats.validator_sync\n WHERE\n last_slot_of_epoch = ${slot_number_var} AND nos_name = '${nos_name_var}'\n\n", - "rawQuery": "SELECT\n avg(epoch_participation_percent)\n FROM\n stats.validator_sync\n WHERE\n last_slot_of_epoch = 3583199 AND nos_name = 'Allnodes'", - "refId": "A", - "round": "0s", - "skip_comments": true + "exemplar": true, + "expr": "sum(ethereum_validators_monitoring_user_validators{nos_name=\"${nos_name_var}\"})", + "interval": "", + "legendFormat": "🏖️ ${nos_name_var}", + "refId": "A" } ], - "title": "Sync Committee validators participation", - "type": "gauge" + "title": "Node operator", + "type": "stat" }, { - "description": "Delta: current slot - 192 slot", "fieldConfig": { "defaults": { "color": { - "fixedColor": "super-light-blue", - "mode": "continuous-GrYlRd", - "seriesBy": "min" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "right", - "axisSoftMax": 200000, - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "area" - } + "fixedColor": "green", + "mode": "fixed" }, "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { - "color": "red", + "color": "super-light-blue", "value": null - }, - { - "color": "transparent", - "value": 0 } ] }, @@ -406,23 +339,28 @@ "overrides": [] }, "gridPos": { - "h": 6, - "w": 6, - "x": 6, - "y": 10 + "h": 3, + "w": 5, + "x": 0, + "y": 9 }, - "id": 2, + "id": 1713, "options": { - "legend": { - "calcs": [], - "displayMode": "hidden", - "placement": "bottom" + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false }, - "tooltip": { - "mode": "single", - "sort": "none" - } + "text": {}, + "textMode": "auto" }, + "pluginVersion": "8.4.6", "targets": [ { "datasource": { @@ -430,89 +368,59 @@ "uid": "PBFA97CFB590B2093" }, "exemplar": true, - "expr": "ethereum_validators_monitoring_validator_balances_delta{nos_name=\"${nos_name_var:string}\"}", + "expr": "sum(ethereum_validators_monitoring_user_validators{status=\"ongoing\",nos_name=\"${nos_name_var}\"})", "interval": "", - "legendFormat": "{{nos_name}}", + "legendFormat": "{{owner}}", "refId": "A" } ], - "title": "Average validator balances delta", - "type": "timeseries" + "title": "Ongoing validators", + "type": "stat" }, { - "description": "", "fieldConfig": { "defaults": { "color": { - "fixedColor": "dark-red", + "fixedColor": "blue", "mode": "fixed" }, - "custom": { - "axisLabel": "", - "axisPlacement": "right", - "axisSoftMax": 10, - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 50, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "decimals": 0, "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { - "color": "dark-red", + "color": "super-light-blue", "value": null } ] }, - "unit": "none" + "unit": "locale" }, "overrides": [] }, "gridPos": { - "h": 6, - "w": 6, - "x": 12, - "y": 10 + "h": 3, + "w": 5, + "x": 5, + "y": 9 }, - "id": 5, + "id": 1717, "options": { - "legend": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { "calcs": [ - "max" + "lastNotNull" ], - "displayMode": "hidden", - "placement": "bottom" + "fields": "", + "values": false }, - "tooltip": { - "mode": "single", - "sort": "none" - } + "text": {}, + "textMode": "auto" }, - "pluginVersion": "8.1.5", + "pluginVersion": "8.4.6", "targets": [ { "datasource": { @@ -520,65 +428,36 @@ "uid": "PBFA97CFB590B2093" }, "exemplar": true, - "expr": "ethereum_validators_monitoring_validator_count_with_negative_balances_delta{nos_name=\"${nos_name_var:string}\"}", + "expr": "sum(ethereum_validators_monitoring_user_validators{status=\"pending\",nos_name=\"${nos_name_var}\"})", "interval": "", - "legendFormat": "{{nos_name}}", + "legendFormat": "{{owner}}", "refId": "A" } ], - "title": "Number of validators with negative delta", - "type": "timeseries" + "title": "Pending validators", + "type": "stat" }, { - "description": "Delta: current slot - 192 slot", "fieldConfig": { "defaults": { "color": { - "fixedColor": "red", - "mode": "continuous-GrYlRd", - "seriesBy": "min" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "right", - "axisSoftMax": 200000, - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "area" - } + "mode": "thresholds" }, "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { - "color": "red", + "color": "text", "value": null }, { - "color": "transparent", + "color": "super-light-red", "value": 0 + }, + { + "color": "red", + "value": 1 } ] }, @@ -587,23 +466,28 @@ "overrides": [] }, "gridPos": { - "h": 6, - "w": 6, - "x": 18, - "y": 10 + "h": 3, + "w": 5, + "x": 10, + "y": 9 }, - "id": 6, + "id": 1721, "options": { - "legend": { - "calcs": [], - "displayMode": "hidden", - "placement": "bottom" + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false }, - "tooltip": { - "mode": "single", - "sort": "none" - } + "text": {}, + "textMode": "auto" }, + "pluginVersion": "8.4.6", "targets": [ { "datasource": { @@ -611,98 +495,1853 @@ "uid": "PBFA97CFB590B2093" }, "exemplar": true, - "expr": "ethereum_validators_monitoring_validator_quantile_001_balances_delta{nos_name=\"${nos_name_var:string}\"}", + "expr": "sum(ethereum_validators_monitoring_user_validators{status=\"slashed\",nos_name=\"${nos_name_var}\"})", "interval": "", - "legendFormat": "{{nos_name}}", + "legendFormat": "{{owner}}", "refId": "A" } ], - "title": "Worst validator balances delta [0.1% percentile]", - "type": "timeseries" + "title": "Slashed validators", + "type": "stat" }, { - "datasource": { - "type": "vertamedia-clickhouse-datasource", - "uid": "PDEE91DDB90597936" - }, - "description": "User only", "fieldConfig": { "defaults": { "color": { - "mode": "thresholds" + "mode": "palette-classic" }, "custom": { - "align": "auto", - "displayMode": "auto", - "filterable": false + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + } }, - "links": [], - "mappings": [ - { - "options": { - "from": 3, - "result": { - "color": "red", - "index": 0 - }, - "to": 6 - }, - "type": "range" - }, - { - "options": { - "from": 1, - "result": { - "color": "yellow", - "index": 1 - }, - "to": 2 - }, - "type": "range" + "mappings": [], + "unit": "locale" + }, + "overrides": [ + { + "matcher": { + "id": "byFrameRefID", + "options": "A" }, - { - "options": { - "from": 0, - "result": { - "color": "green", - "index": 2 - }, - "to": 0 - }, - "type": "range" - } - ], - "thresholds": { - "mode": "absolute", - "steps": [ + "properties": [ { - "color": "red", - "value": null + "id": "color", + "value": { + "fixedColor": "green", + "mode": "fixed" + } } ] - } - }, - "overrides": [ + }, { "matcher": { - "id": "byName", - "options": "count_fail" + "id": "byFrameRefID", + "options": "B" }, "properties": [ { - "id": "custom.width", - "value": 70 - }, - { - "id": "unit", - "value": "none" - }, - { - "id": "custom.displayMode", - "value": "color-text" + "id": "color", + "value": { + "fixedColor": "super-light-green", + "mode": "fixed" + } } ] - }, + } + ] + }, + "gridPos": { + "h": 7, + "w": 5, + "x": 0, + "y": 12 + }, + "id": 1715, + "options": { + "legend": { + "displayMode": "table", + "placement": "bottom", + "values": [ + "value", + "percent" + ] + }, + "pieType": "donut", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "8.1.5", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "exemplar": true, + "expr": "sum(ethereum_validators_monitoring_user_validators{status=\"ongoing\",nos_name=\"${nos_name_var}\"})", + "interval": "", + "legendFormat": "Selected", + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "exemplar": true, + "expr": "sum(ethereum_validators_monitoring_user_validators{status=\"ongoing\",nos_name!=\"${nos_name_var}\"})", + "hide": false, + "interval": "", + "legendFormat": "User (other)", + "refId": "B" + } + ], + "title": "Ongoing validators share", + "type": "piechart" + }, + { + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + } + }, + "mappings": [], + "unit": "locale" + }, + "overrides": [ + { + "matcher": { + "id": "byFrameRefID", + "options": "A" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "blue", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byFrameRefID", + "options": "B" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "super-light-blue", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 7, + "w": 5, + "x": 5, + "y": 12 + }, + "id": 1719, + "options": { + "legend": { + "displayMode": "table", + "placement": "bottom", + "values": [ + "value", + "percent" + ] + }, + "pieType": "donut", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "8.1.5", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "exemplar": true, + "expr": "sum(ethereum_validators_monitoring_user_validators{status=\"pending\",nos_name=\"${nos_name_var}\"})", + "interval": "", + "legendFormat": "Selected", + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "exemplar": true, + "expr": "sum(ethereum_validators_monitoring_user_validators{status=\"pending\",nos_name!=\"${nos_name_var}\"})", + "hide": false, + "interval": "", + "legendFormat": "User (other)", + "refId": "B" + } + ], + "title": "Pending validators share", + "type": "piechart" + }, + { + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + } + }, + "mappings": [], + "unit": "locale" + }, + "overrides": [ + { + "matcher": { + "id": "byFrameRefID", + "options": "A" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "red", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byFrameRefID", + "options": "B" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "super-light-red", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 7, + "w": 5, + "x": 10, + "y": 12 + }, + "id": 1723, + "options": { + "legend": { + "displayMode": "table", + "placement": "bottom", + "values": [ + "value" + ] + }, + "pieType": "donut", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "8.1.5", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "exemplar": true, + "expr": "sum(ethereum_validators_monitoring_user_validators{status=\"slashed\",nos_name=\"${nos_name_var}\"})", + "interval": "", + "legendFormat": "Selected", + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "exemplar": true, + "expr": "sum(ethereum_validators_monitoring_user_validators{status=\"slashed\",nos_name!=\"${nos_name_var}\"})", + "hide": false, + "interval": "", + "legendFormat": "User (other)", + "refId": "B" + } + ], + "title": "Slashed validators share", + "type": "piechart" + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 19 + }, + "id": 1727, + "panels": [ + { + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 15, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "smooth", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 3, + "pointSize": 3, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 2, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "red" + } + ] + }, + "unit": "locale" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "delta" + }, + "properties": [ + { + "id": "unit", + "value": "ETH" + } + ] + } + ] + }, + "gridPos": { + "h": 5, + "w": 24, + "x": 0, + "y": 20 + }, + "id": 1729, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom" + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "8.4.6", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "exemplar": true, + "expr": "sum(ethereum_validators_monitoring_operator_balance_24h_difference{nos_name=\"${nos_name_var}\"}) / 10 ^ 9", + "hide": false, + "interval": "", + "legendFormat": "delta", + "refId": "A" + } + ], + "title": "Operator balance 24h delta", + "transformations": [], + "type": "timeseries" + }, + { + "description": "Delta: current slot - 192 slot", + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "super-light-blue", + "mode": "continuous-GrYlRd", + "seriesBy": "min" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "right", + "axisSoftMax": 200000, + "axisSoftMin": 0, + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "smooth", + "lineWidth": 3, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "area" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "red" + }, + { + "color": "transparent", + "value": 0 + } + ] + }, + "unit": "GWei" + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 12, + "x": 0, + "y": 25 + }, + "id": 2, + "options": { + "legend": { + "calcs": [], + "displayMode": "hidden", + "placement": "bottom" + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "exemplar": true, + "expr": "sum(ethereum_validators_monitoring_validator_balances_delta{nos_name=\"${nos_name_var}\"})", + "interval": "", + "legendFormat": "{{nos_name}}", + "refId": "A" + } + ], + "title": "Avg validator balances delta", + "type": "timeseries" + }, + { + "description": "Delta: current slot - 192 slot", + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "red", + "mode": "continuous-GrYlRd", + "seriesBy": "min" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "right", + "axisSoftMax": 200000, + "axisSoftMin": 0, + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 3, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "area" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "red" + }, + { + "color": "transparent", + "value": 0 + } + ] + }, + "unit": "GWei" + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 12, + "x": 12, + "y": 25 + }, + "id": 6, + "options": { + "legend": { + "calcs": [], + "displayMode": "hidden", + "placement": "bottom" + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "exemplar": true, + "expr": "sum(ethereum_validators_monitoring_validator_quantile_001_balances_delta{nos_name=\"${nos_name_var}\"})", + "interval": "", + "legendFormat": "{{nos_name}}", + "refId": "A" + } + ], + "title": "Worst validator balances delta [0.1% percentile]", + "type": "timeseries" + }, + { + "datasource": { + "type": "vertamedia-clickhouse-datasource", + "uid": "PDEE91DDB90597936" + }, + "description": "Delta: current slot - 192 slot", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "align": "auto", + "displayMode": "auto" + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "red" + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "GWei" + }, + "properties": [ + { + "id": "custom.width", + "value": 80 + }, + { + "id": "unit", + "value": "locale" + }, + { + "id": "custom.displayMode", + "value": "color-text" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Pubkey" + }, + "properties": [ + { + "id": "links", + "value": [ + { + "targetBlank": true, + "title": "beaconcha.in", + "url": "https://beaconcha.in/validator/${__value.raw}" + } + ] + }, + { + "id": "unit", + "value": "string" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Operator" + }, + "properties": [ + { + "id": "custom.width", + "value": 120 + } + ] + } + ] + }, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 31 + }, + "id": 1733, + "options": { + "footer": { + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": true, + "sortBy": [ + { + "desc": false, + "displayName": "delta" + } + ] + }, + "pluginVersion": "8.4.6", + "targets": [ + { + "datasource": { + "type": "vertamedia-clickhouse-datasource", + "uid": "PDEE91DDB90597936" + }, + "dateTimeType": "DATETIME", + "extrapolate": true, + "format": "table", + "formattedQuery": "SELECT $timeSeries as t, count() FROM $table WHERE $timeFilter GROUP BY t ORDER BY t", + "intervalFactor": 1, + "query": "SELECT\n current.balance - previous.balance AS GWei,\n current.validator_pubkey as Pubkey\nFROM \n (\n SELECT balance, validator_pubkey, status, nos_id, nos_name \n FROM stats.validator_balances \n WHERE \n status != 'pending_queued' AND \n nos_name = '${nos_name_var}' AND\n slot = ${slot_number_var}\n ) AS current\nLEFT JOIN\n (\n SELECT balance, validator_pubkey, nos_id, nos_name \n FROM stats.validator_balances \n WHERE\n status != 'pending_queued' AND \n nos_name = '${nos_name_var}' AND\n slot = (${slot_number_var} - ${fetch_interval_var} * 6)\n ) AS previous\nON\n previous.nos_id = current.nos_id AND \n previous.validator_pubkey = current.validator_pubkey\nORDER BY GWei ASC\nLIMIT ${limit}", + "rawQuery": "SELECT\n current.balance - previous.balance AS GWei,\n current.validator_pubkey as Pubkey\nFROM \n (\n SELECT balance, validator_pubkey, status, nos_id, nos_name \n FROM stats.validator_balances \n WHERE \n status != 'pending_queued' AND \n nos_name = 'P2P.ORG - P2P Validator' AND\n slot = 4708383\n ) AS current\nLEFT JOIN\n (\n SELECT balance, validator_pubkey, nos_id, nos_name \n FROM stats.validator_balances \n WHERE\n status != 'pending_queued' AND \n nos_name = 'P2P.ORG - P2P Validator' AND\n slot = (4708383 - 32 * 6)\n ) AS previous\nON\n previous.nos_id = current.nos_id AND \n previous.validator_pubkey = current.validator_pubkey\nORDER BY GWei ASC\nLIMIT 100", + "refId": "A", + "round": "0s", + "skip_comments": true + } + ], + "title": "Validators with worst balance delta", + "type": "table" + }, + { + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "dark-red", + "mode": "fixed" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "right", + "axisSoftMax": 10, + "axisSoftMin": 0, + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 15, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "smooth", + "lineWidth": 3, + "pointSize": 3, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "noValue": "0", + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "dark-red" + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 16, + "x": 8, + "y": 31 + }, + "id": 5, + "options": { + "legend": { + "calcs": [], + "displayMode": "hidden", + "placement": "bottom" + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "8.1.5", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "exemplar": true, + "expr": "sum(ethereum_validators_monitoring_validator_count_with_negative_balances_delta{nos_name=\"${nos_name_var}\"})", + "hide": false, + "instant": false, + "interval": "", + "legendFormat": "{{nos_name}}", + "refId": "A" + } + ], + "title": "Number of validators with negative delta", + "type": "timeseries" + } + ], + "title": "💸 Balances", + "type": "row" + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 20 + }, + "id": 1735, + "panels": [ + { + "datasource": { + "type": "vertamedia-clickhouse-datasource", + "uid": "PDEE91DDB90597936" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "align": "auto", + "displayMode": "auto" + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "red" + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "validator_pubkey" + }, + "properties": [ + { + "id": "links", + "value": [ + { + "targetBlank": true, + "title": "beaconcha.in", + "url": "https://beaconcha.in/validator/${__value.raw}" + } + ] + }, + { + "id": "unit", + "value": "string" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "nos_name" + }, + "properties": [ + { + "id": "custom.width", + "value": 120 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "slot_to_propose" + }, + "properties": [ + { + "id": "custom.width", + "value": 80 + }, + { + "id": "links", + "value": [ + { + "targetBlank": true, + "title": "beaconcha.in", + "url": "https://beaconcha.in/slot/${__value.raw}" + } + ] + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 0, + "y": 21 + }, + "id": 1737, + "options": { + "footer": { + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": false, + "sortBy": [ + { + "desc": false, + "displayName": "delta" + } + ] + }, + "pluginVersion": "8.4.6", + "targets": [ + { + "datasource": { + "type": "vertamedia-clickhouse-datasource", + "uid": "PDEE91DDB90597936" + }, + "dateTimeType": "DATETIME", + "extrapolate": true, + "format": "table", + "formattedQuery": "SELECT $timeSeries as t, count() FROM $table WHERE $timeFilter GROUP BY t ORDER BY t", + "intervalFactor": 1, + "query": "SELECT\n slot_to_propose,\n validator_pubkey\nFROM stats.validator_proposes\nWHERE proposed = 0 AND (slot_to_propose <= ${slot_number_var} AND slot_to_propose >= (${slot_number_var} - ${fetch_interval_var} * ${epochs})) AND nos_name = '${nos_name_var}'\nORDER BY slot_to_propose DESC, validator_pubkey", + "rawQuery": "SELECT\n slot_to_propose,\n validator_pubkey\nFROM stats.validator_proposes\nWHERE proposed = 0 AND (slot_to_propose <= 4708511 AND slot_to_propose >= (4708511 - 32 * 6)) AND nos_name = 'P2P.ORG - P2P Validator'\nORDER BY slot_to_propose DESC, validator_pubkey", + "refId": "A", + "round": "0s", + "skip_comments": true + } + ], + "title": "Missed proposals (${epochs} epochs range)", + "type": "table" + }, + { + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "red", + "mode": "fixed" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 15, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "smooth", + "lineWidth": 3, + "pointSize": 3, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "semi-dark-green" + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 16, + "x": 8, + "y": 21 + }, + "id": 1739, + "options": { + "legend": { + "calcs": [ + "lastNotNull" + ], + "displayMode": "hidden", + "placement": "right", + "sortBy": "Last *", + "sortDesc": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "8.1.5", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "exemplar": true, + "expr": "sum(ethereum_validators_monitoring_validator_count_miss_propose{nos_name='${nos_name_var}'})", + "interval": "", + "legendFormat": "{{nos_name}}", + "refId": "A" + } + ], + "title": "Number of validators with missed proposals", + "type": "timeseries" + } + ], + "title": "📥 Proposals", + "type": "row" + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 21 + }, + "id": 1711, + "panels": [ + { + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "smooth", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 1, + "pointSize": 3, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "area" + } + }, + "decimals": 2, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "red" + }, + { + "color": "red", + "value": 0 + }, + { + "color": "super-light-yellow", + "value": 60 + }, + { + "color": "green", + "value": 90 + } + ] + }, + "unit": "percent" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "User (other)" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "blue", + "mode": "fixed" + } + }, + { + "id": "custom.lineWidth", + "value": 3 + } + ] + }, + { + "matcher": { + "id": "byFrameRefID", + "options": "C" + }, + "properties": [ + { + "id": "color", + "value": { + "mode": "thresholds" + } + }, + { + "id": "custom.fillOpacity", + "value": 30 + }, + { + "id": "custom.lineWidth", + "value": 3 + } + ] + }, + { + "matcher": { + "id": "byFrameRefID", + "options": "A" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "super-light-blue", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 6, + "w": 24, + "x": 0, + "y": 22 + }, + "id": 1745, + "options": { + "legend": { + "calcs": [ + "lastNotNull" + ], + "displayMode": "table", + "placement": "right", + "sortBy": "Last *", + "sortDesc": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "8.1.5", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "exemplar": true, + "expr": "sum(ethereum_validators_monitoring_chain_sync_participation_avg_percent)", + "hide": false, + "interval": "", + "legendFormat": "Rest chain", + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "exemplar": true, + "expr": "avg(ethereum_validators_monitoring_operator_sync_participation_avg_percent{nos_name!='${nos_name_var}'})", + "hide": false, + "interval": "", + "legendFormat": "User (other)", + "refId": "B" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "exemplar": true, + "expr": "sum(ethereum_validators_monitoring_operator_sync_participation_avg_percent{nos_name='${nos_name_var}'})", + "hide": false, + "interval": "", + "legendFormat": "${nos_name_var}", + "refId": "C" + } + ], + "title": "${nos_name_var} vs Other", + "transformations": [], + "type": "timeseries" + }, + { + "datasource": { + "type": "vertamedia-clickhouse-datasource", + "uid": "PDEE91DDB90597936" + }, + "description": "AVG", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "align": "auto", + "displayMode": "auto" + }, + "links": [], + "mappings": [ + { + "options": { + "from": 0, + "result": { + "color": "red", + "index": 0 + }, + "to": 60 + }, + "type": "range" + }, + { + "options": { + "from": 60, + "result": { + "color": "yellow", + "index": 1 + }, + "to": 90 + }, + "type": "range" + }, + { + "options": { + "from": 90, + "result": { + "color": "green", + "index": 2 + }, + "to": 100 + }, + "type": "range" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "red" + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "validator_pubkey" + }, + "properties": [ + { + "id": "links", + "value": [ + { + "targetBlank": true, + "title": "beaconcha.in", + "url": "https://beaconcha.in/validator/${__value.raw}" + } + ] + }, + { + "id": "unit", + "value": "string" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "nos_name" + }, + "properties": [ + { + "id": "custom.width", + "value": 120 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "epoch_participation_percent" + }, + "properties": [ + { + "id": "custom.displayMode", + "value": "color-text" + }, + { + "id": "custom.width", + "value": 60 + }, + { + "id": "unit", + "value": "percent" + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 0, + "y": 28 + }, + "id": 1747, + "options": { + "footer": { + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": false, + "sortBy": [ + { + "desc": false, + "displayName": "delta" + } + ] + }, + "pluginVersion": "8.4.6", + "targets": [ + { + "datasource": { + "type": "vertamedia-clickhouse-datasource", + "uid": "PDEE91DDB90597936" + }, + "dateTimeType": "DATETIME", + "extrapolate": true, + "format": "table", + "formattedQuery": "SELECT $timeSeries as t, count() FROM $table WHERE $timeFilter GROUP BY t ORDER BY t", + "intervalFactor": 1, + "query": "SELECT\n epoch_participation_percent,\n validator_pubkey\nFROM\n stats.validator_sync\nWHERE last_slot_of_epoch = ${slot_number_var} AND epoch_participation_percent < (epoch_chain_participation_percent_avg - ${sync_participation_distance_var}) AND nos_name = '${nos_name_var}'\nORDER BY epoch_participation_percent", + "rawQuery": "SELECT\n epoch_participation_percent,\n validator_pubkey\nFROM\n stats.validator_sync\nWHERE last_slot_of_epoch = 4708831 AND epoch_participation_percent < (epoch_chain_participation_percent_avg - 10) AND nos_name = 'Allnodes'\nORDER BY epoch_participation_percent", + "refId": "A", + "round": "0s", + "skip_comments": true + } + ], + "title": "Bad Sync Committee participation", + "type": "table" + }, + { + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 15, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "smooth", + "lineWidth": 3, + "pointSize": 3, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "red" + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byFrameRefID", + "options": "A" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "red", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 16, + "x": 8, + "y": 28 + }, + "id": 1749, + "options": { + "legend": { + "calcs": [ + "lastNotNull" + ], + "displayMode": "hidden", + "placement": "right", + "sortBy": "Last *", + "sortDesc": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "8.1.5", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "exemplar": true, + "expr": "sum(ethereum_validators_monitoring_validator_count_with_sync_participation_less_avg{nos_name='${nos_name_var}'})", + "interval": "", + "legendFormat": "{{nos_name}}", + "refId": "A" + } + ], + "title": "Number of validators with sync participation less average", + "type": "timeseries" + } + ], + "title": "🔄 Sync Committee participation", + "type": "row" + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 22 + }, + "id": 1751, + "panels": [ + { + "datasource": { + "type": "vertamedia-clickhouse-datasource", + "uid": "PDEE91DDB90597936" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "align": "auto", + "displayMode": "auto", + "filterable": false + }, + "links": [], + "mappings": [ + { + "options": { + "from": 4, + "result": { + "color": "red", + "index": 0 + }, + "to": 6 + }, + "type": "range" + }, + { + "options": { + "from": 1, + "result": { + "color": "yellow", + "index": 1 + }, + "to": 3 + }, + "type": "range" + }, + { + "options": { + "from": 0, + "result": { + "color": "green", + "index": 2 + }, + "to": 0 + }, + "type": "range" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "red" + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "count_fail" + }, + "properties": [ + { + "id": "custom.width", + "value": 60 + }, + { + "id": "unit", + "value": "none" + }, + { + "id": "custom.displayMode", + "value": "color-text" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "validator_pubkey" + }, + "properties": [ + { + "id": "links", + "value": [ + { + "targetBlank": true, + "title": "beaconcha.in", + "url": "https://beaconcha.in/validator/${__value.raw}" + } + ] + }, + { + "id": "displayName", + "value": "validator" + }, + { + "id": "unit", + "value": "string" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "nos_name" + }, + "properties": [ + { + "id": "custom.width", + "value": 120 + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 0, + "y": 23 + }, + "id": 1755, + "options": { + "footer": { + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": false, + "sortBy": [ + { + "desc": false, + "displayName": "delta" + } + ] + }, + "pluginVersion": "8.4.6", + "targets": [ + { + "datasource": { + "type": "vertamedia-clickhouse-datasource", + "uid": "PDEE91DDB90597936" + }, + "dateTimeType": "DATETIME", + "extrapolate": true, + "format": "table", + "formattedQuery": "SELECT $timeSeries as t, count() FROM $table WHERE $timeFilter GROUP BY t ORDER BY t", + "intervalFactor": 1, + "query": "\nSELECT\n count() as count_fail,\n validator_pubkey\nFROM (\n SELECT\n validator_pubkey,\n nos_name\n FROM stats.validator_attestations\n WHERE attested = 0 AND \n (slot_to_attestation <= ${slot_number_var} AND slot_to_attestation > (${slot_number_var} - ${fetch_interval_var} * ${epochs})) AND\n nos_name = '${nos_name_var}'\n ORDER BY slot_to_attestation DESC, validator_pubkey\n)\nGROUP BY validator_pubkey, nos_name\nORDER BY count_fail DESC, validator_pubkey\nLIMIT ${limit}", + "rawQuery": "SELECT\n count() as count_fail,\n validator_pubkey\nFROM (\n SELECT\n validator_pubkey,\n nos_name\n FROM stats.validator_attestations\n WHERE attested = 0 AND \n (slot_to_attestation <= 4728415 AND slot_to_attestation > (4728415 - 32 * 3)) AND\n nos_name = 'stakefish'\n ORDER BY slot_to_attestation DESC, validator_pubkey\n)\nGROUP BY validator_pubkey, nos_name\nORDER BY count_fail DESC, validator_pubkey\nLIMIT 100", + "refId": "A", + "round": "0s", + "skip_comments": true + } + ], + "title": "Number of missed attestations (${epochs} epochs range)", + "type": "table" + }, + { + "description": "User only", + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "red", + "mode": "fixed" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 15, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "smooth", + "lineWidth": 3, + "pointSize": 3, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "red" + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 16, + "x": 8, + "y": 23 + }, + "id": 1757, + "options": { + "legend": { + "calcs": [ + "lastNotNull" + ], + "displayMode": "hidden", + "placement": "right", + "sortBy": "Last *", + "sortDesc": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "8.1.5", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "exemplar": true, + "expr": "sum(ethereum_validators_monitoring_validator_count_miss_attestation{nos_name='${nos_name_var}'})", + "interval": "", + "legendFormat": "{{nos_name}}", + "refId": "A" + } + ], + "title": "Number of validators with missed attestation", + "type": "timeseries" + } + ], + "title": "📝 Attestations", + "type": "row" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 23 + }, + "id": 1753, + "panels": [], + "title": "💔 Alerting only", + "type": "row" + }, + { + "datasource": { + "type": "vertamedia-clickhouse-datasource", + "uid": "PDEE91DDB90597936" + }, + "description": "Delta: current slot - 192 slot", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "align": "auto", + "displayMode": "auto", + "filterable": false + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "red", + "value": null + } + ] + } + }, + "overrides": [ { "matcher": { "id": "byName", @@ -732,24 +2371,24 @@ { "matcher": { "id": "byName", - "options": "nos_name" + "options": "GWei" }, "properties": [ { "id": "custom.width", - "value": 200 + "value": 100 } ] } ] }, "gridPos": { - "h": 6, - "w": 6, + "h": 8, + "w": 8, "x": 0, - "y": 16 + "y": 24 }, - "id": 480, + "id": 1759, "options": { "footer": { "fields": "", @@ -758,7 +2397,7 @@ ], "show": false }, - "showHeader": false, + "showHeader": true, "sortBy": [ { "desc": false, @@ -778,14 +2417,14 @@ "format": "table", "formattedQuery": "SELECT $timeSeries as t, count() FROM $table WHERE $timeFilter GROUP BY t ORDER BY t", "intervalFactor": 1, - "query": "\nSELECT\n validator_pubkey,\n count() as count_fail\nFROM (\n SELECT\n validator_pubkey,\n nos_name\n FROM stats.validator_sync\n WHERE epoch_participation_percent < (epoch_chain_participation_percent_avg - ${sync_participation_distance_var}) AND \n (last_slot_of_epoch <= ${slot_number_var} AND last_slot_of_epoch > (${slot_number_var} - ${fetch_interval_var} * ${epochs})) AND nos_name = '${nos_name_var}'\n ORDER BY last_slot_of_epoch DESC, validator_pubkey\n)\nGROUP BY validator_pubkey, nos_name\nORDER BY count_fail DESC, validator_pubkey\nLIMIT ${limit}", - "rawQuery": "SELECT\n validator_pubkey,\n count() as count_fail\nFROM (\n SELECT\n validator_pubkey,\n nos_name\n FROM stats.validator_sync\n WHERE epoch_participation_percent < (epoch_chain_participation_percent_avg - 10) AND \n (last_slot_of_epoch <= 3583199 AND last_slot_of_epoch > (3583199 - 32 * 1)) AND nos_name = 'Allnodes'\n ORDER BY last_slot_of_epoch DESC, validator_pubkey\n)\nGROUP BY validator_pubkey, nos_name\nORDER BY count_fail DESC, validator_pubkey\nLIMIT 100", + "query": "SELECT\n current.balance - previous.balance AS GWei,\n current.validator_pubkey as validator_pubkey\nFROM \n (\n SELECT balance, validator_pubkey, status, nos_id, nos_name \n FROM stats.validator_balances \n WHERE \n status != 'pending_queued' AND \n nos_name = '${nos_name_var}' AND\n slot = ${slot_number_var}\n ) AS current\nLEFT JOIN\n (\n SELECT balance, validator_pubkey, nos_id, nos_name \n FROM stats.validator_balances \n WHERE\n status != 'pending_queued' AND \n nos_name = '${nos_name_var}' AND\n slot = (${slot_number_var} - ${fetch_interval_var} * 6)\n ) AS previous\nON\n previous.nos_id = current.nos_id AND \n previous.validator_pubkey = current.validator_pubkey\nHAVING (current.balance - previous.balance) < 0\nORDER BY GWei ASC\nLIMIT ${limit}", + "rawQuery": "SELECT\n current.balance - previous.balance AS GWei,\n current.validator_pubkey as validator_pubkey\nFROM \n (\n SELECT balance, validator_pubkey, status, nos_id, nos_name \n FROM stats.validator_balances \n WHERE \n status != 'pending_queued' AND \n nos_name = 'Allnodes' AND\n slot = 4728767\n ) AS current\nLEFT JOIN\n (\n SELECT balance, validator_pubkey, nos_id, nos_name \n FROM stats.validator_balances \n WHERE\n status != 'pending_queued' AND \n nos_name = 'Allnodes' AND\n slot = (4728767 - 32 * 6)\n ) AS previous\nON\n previous.nos_id = current.nos_id AND \n previous.validator_pubkey = current.validator_pubkey\nHAVING (current.balance - previous.balance) < 0\nORDER BY GWei ASC\nLIMIT 100", "refId": "A", "round": "0s", "skip_comments": true } ], - "title": "Number of times the validator sync participation less chain average (${epochs} epoch(s))", + "title": "Negative balance delta", "type": "table" }, { @@ -793,7 +2432,7 @@ "type": "vertamedia-clickhouse-datasource", "uid": "PDEE91DDB90597936" }, - "description": "User only", + "description": "", "fieldConfig": { "defaults": { "color": { @@ -801,45 +2440,10 @@ }, "custom": { "align": "auto", - "displayMode": "auto", - "filterable": false + "displayMode": "auto" }, "links": [], - "mappings": [ - { - "options": { - "from": 4, - "result": { - "color": "red", - "index": 0 - }, - "to": 6 - }, - "type": "range" - }, - { - "options": { - "from": 1, - "result": { - "color": "yellow", - "index": 1 - }, - "to": 3 - }, - "type": "range" - }, - { - "options": { - "from": 0, - "result": { - "color": "green", - "index": 2 - }, - "to": 0 - }, - "type": "range" - } - ], + "mappings": [], "thresholds": { "mode": "absolute", "steps": [ @@ -851,26 +2455,6 @@ } }, "overrides": [ - { - "matcher": { - "id": "byName", - "options": "count_fail" - }, - "properties": [ - { - "id": "custom.width", - "value": 70 - }, - { - "id": "unit", - "value": "none" - }, - { - "id": "custom.displayMode", - "value": "color-text" - } - ] - }, { "matcher": { "id": "byName", @@ -887,10 +2471,6 @@ } ] }, - { - "id": "displayName", - "value": "validator" - }, { "id": "unit", "value": "string" @@ -900,24 +2480,34 @@ { "matcher": { "id": "byName", - "options": "nos_name" + "options": "slot_to_propose" }, "properties": [ { "id": "custom.width", - "value": 250 + "value": 80 + }, + { + "id": "links", + "value": [ + { + "targetBlank": true, + "title": "beaconcha.in", + "url": "https://beaconcha.in/slot/${__value.raw}" + } + ] } ] } ] }, "gridPos": { - "h": 6, - "w": 6, - "x": 6, - "y": 16 + "h": 8, + "w": 8, + "x": 8, + "y": 24 }, - "id": 352, + "id": 1761, "options": { "footer": { "fields": "", @@ -946,14 +2536,14 @@ "format": "table", "formattedQuery": "SELECT $timeSeries as t, count() FROM $table WHERE $timeFilter GROUP BY t ORDER BY t", "intervalFactor": 1, - "query": "\nSELECT\n validator_pubkey,\n count() as count_fail\nFROM (\n SELECT\n validator_pubkey,\n nos_name\n FROM stats.validator_attestations\n WHERE attested = 0 AND nos_name = '${nos_name_var}' AND\n (slot_to_attestation <= ${slot_number_var} AND slot_to_attestation > (${slot_number_var} - ${fetch_interval_var} * ${epochs}))\n ORDER BY slot_to_attestation DESC, validator_pubkey\n)\nGROUP BY validator_pubkey, nos_name\nORDER BY count_fail DESC, validator_pubkey\nLIMIT ${limit}", - "rawQuery": "SELECT\n validator_pubkey,\n count() as count_fail\nFROM (\n SELECT\n validator_pubkey,\n nos_name\n FROM stats.validator_attestations\n WHERE attested = 0 AND nos_name = 'Allnodes' AND\n (slot_to_attestation <= 3583199 AND slot_to_attestation > (3583199 - 32 * 1))\n ORDER BY slot_to_attestation DESC, validator_pubkey\n)\nGROUP BY validator_pubkey, nos_name\nORDER BY count_fail DESC, validator_pubkey\nLIMIT 100", + "query": "SELECT\n slot_to_propose,\n validator_pubkey\nFROM stats.validator_proposes\nWHERE proposed = 0 AND (slot_to_propose <= ${slot_number_var} AND slot_to_propose >= (${slot_number_var} - ${fetch_interval_var})) AND nos_name = '${nos_name_var}'\nORDER BY slot_to_propose DESC, validator_pubkey", + "rawQuery": "SELECT\n slot_to_propose,\n validator_pubkey\nFROM stats.validator_proposes\nWHERE proposed = 0 AND (slot_to_propose <= 4728543 AND slot_to_propose >= (4728543 - 32)) AND nos_name = 'stakefish'\nORDER BY slot_to_propose DESC, validator_pubkey", "refId": "A", "round": "0s", "skip_comments": true } ], - "title": "Number of times the validator miss attestation (${epochs} epoch(s))", + "title": "Missed proposals", "type": "table" }, { @@ -961,7 +2551,7 @@ "type": "vertamedia-clickhouse-datasource", "uid": "PDEE91DDB90597936" }, - "description": "User only", + "description": "", "fieldConfig": { "defaults": { "color": { @@ -969,7 +2559,8 @@ }, "custom": { "align": "auto", - "displayMode": "auto" + "displayMode": "auto", + "filterable": false }, "links": [], "mappings": [], @@ -1000,33 +2591,25 @@ } ] }, + { + "id": "displayName", + "value": "validator" + }, { "id": "unit", "value": "string" } ] - }, - { - "matcher": { - "id": "byName", - "options": "nos_name" - }, - "properties": [ - { - "id": "custom.width", - "value": 200 - } - ] } ] }, "gridPos": { - "h": 6, - "w": 6, - "x": 12, - "y": 16 + "h": 8, + "w": 8, + "x": 16, + "y": 24 }, - "id": 1202, + "id": 1758, "options": { "footer": { "fields": "", @@ -1055,14 +2638,14 @@ "format": "table", "formattedQuery": "SELECT $timeSeries as t, count() FROM $table WHERE $timeFilter GROUP BY t ORDER BY t", "intervalFactor": 1, - "query": "SELECT\n validator_pubkey,\n slot_to_propose\nFROM stats.validator_proposes\nWHERE proposed = 0 AND (slot_to_propose <= ${slot_number_var} AND slot_to_propose >= (${slot_number_var} - ${fetch_interval_var} * ${epochs})) AND nos_name = '${nos_name_var}'\nORDER BY slot_to_propose DESC, validator_pubkey", - "rawQuery": "SELECT\n validator_pubkey,\n slot_to_propose\nFROM stats.validator_proposes\nWHERE proposed = 0 AND (slot_to_propose <= 3583199 AND slot_to_propose >= (3583199 - 32 * 1)) AND nos_name = 'Allnodes'\nORDER BY slot_to_propose DESC, validator_pubkey", + "query": "SELECT\n status,\n validator_pubkey\nFROM stats.validator_balances\nWHERE (status == 'active_slashed' OR status == 'exited_slashed' OR validator_slashed == 1) and nos_name = '${nos_name_var}' and slot = ${slot_number_var}\nLIMIT ${limit}", + "rawQuery": "SELECT\n status,\n validator_pubkey\nFROM stats.validator_balances\nWHERE (status == 'active_slashed' OR status == 'exited_slashed' OR validator_slashed == 1) and nos_name = 'Allnodes' and slot = 4728479\nLIMIT 100", "refId": "A", "round": "0s", "skip_comments": true } ], - "title": "Validators with missed proposes (${epochs} epoch(s))", + "title": "Slashed", "type": "table" }, { @@ -1078,7 +2661,8 @@ }, "custom": { "align": "auto", - "displayMode": "auto" + "displayMode": "auto", + "filterable": false }, "links": [], "mappings": [], @@ -1093,38 +2677,6 @@ } }, "overrides": [ - { - "matcher": { - "id": "byName", - "options": "delta" - }, - "properties": [ - { - "id": "custom.width", - "value": 70 - }, - { - "id": "unit", - "value": "locale" - }, - { - "id": "custom.displayMode", - "value": "color-text" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "status" - }, - "properties": [ - { - "id": "custom.width", - "value": 110 - } - ] - }, { "matcher": { "id": "byName", @@ -1154,12 +2706,12 @@ ] }, "gridPos": { - "h": 6, - "w": 6, - "x": 18, - "y": 16 + "h": 8, + "w": 8, + "x": 0, + "y": 32 }, - "id": 222, + "id": 1760, "options": { "footer": { "fields": "", @@ -1184,19 +2736,18 @@ "uid": "PDEE91DDB90597936" }, "dateTimeType": "DATETIME", - "extrapolate": false, + "extrapolate": true, "format": "table", "formattedQuery": "SELECT $timeSeries as t, count() FROM $table WHERE $timeFilter GROUP BY t ORDER BY t", - "hide": false, "intervalFactor": 1, - "query": "SELECT\n current.balance - previous.balance AS delta,\n current.status,\n current.validator_pubkey\nFROM \n (\n SELECT balance, validator_pubkey, status, nos_id, nos_name \n FROM stats.validator_balances \n WHERE \n status != 'pending_queued' AND \n nos_name = ${nos_name_var:singlequote} AND\n slot = ${slot_number_var}\n ) AS current\nLEFT JOIN\n (\n SELECT balance, validator_pubkey, nos_id, nos_name \n FROM stats.validator_balances \n WHERE\n status != 'pending_queued' AND \n nos_name = ${nos_name_var:singlequote} AND\n slot = (${slot_number_var} - ${fetch_interval_var} * 6)\n ) AS previous\nON\n previous.nos_id = current.nos_id AND \n previous.validator_pubkey = current.validator_pubkey\nORDER BY delta ASC\nLIMIT ${limit}", - "rawQuery": "SELECT\n current.balance - previous.balance AS delta,\n current.status,\n current.validator_pubkey\nFROM \n (\n SELECT balance, validator_pubkey, status, nos_id, nos_name \n FROM stats.validator_balances \n WHERE \n status != 'pending_queued' AND \n nos_name = 'Allnodes' AND\n slot = 4356159\n ) AS current\nLEFT JOIN\n (\n SELECT balance, validator_pubkey, nos_id, nos_name \n FROM stats.validator_balances \n WHERE\n status != 'pending_queued' AND \n nos_name = 'Allnodes' AND\n slot = (4356159 - 32 * 6)\n ) AS previous\nON\n previous.nos_id = current.nos_id AND \n previous.validator_pubkey = current.validator_pubkey\nORDER BY delta ASC\nLIMIT 100", + "query": "\nSELECT\n validator_pubkey\nFROM (\n SELECT\n validator_pubkey,\n count(validator_pubkey) as count_fail\n FROM stats.validator_attestations\n WHERE attested = 0 AND \n (slot_to_attestation <= ${slot_number_var} AND slot_to_attestation > (${slot_number_var} - ${fetch_interval_var} * ${att_epochs_var})) AND\n nos_name = '${nos_name_var}'\n GROUP BY validator_pubkey\n)\nWHERE count_fail = ${att_epochs_var}\nORDER BY count_fail DESC, validator_pubkey\nLIMIT ${limit}", + "rawQuery": "SELECT\n validator_pubkey\nFROM (\n SELECT\n validator_pubkey,\n count(validator_pubkey) as count_fail\n FROM stats.validator_attestations\n WHERE attested = 0 AND \n (slot_to_attestation <= 4728639 AND slot_to_attestation > (4728639 - 32 * 3)) AND\n nos_name = 'Stakin'\n GROUP BY validator_pubkey\n)\nWHERE count_fail = 3\nORDER BY count_fail DESC, validator_pubkey\nLIMIT 100", "refId": "A", "round": "0s", "skip_comments": true } ], - "title": "Validators with worst balance delta", + "title": "Missed attestation (${att_epochs_var} epochs in a row)", "type": "table" }, { @@ -1204,6 +2755,7 @@ "type": "vertamedia-clickhouse-datasource", "uid": "PDEE91DDB90597936" }, + "description": "", "fieldConfig": { "defaults": { "color": { @@ -1213,18 +2765,48 @@ "align": "auto", "displayMode": "auto" }, - "mappings": [], - "noValue": "-", + "links": [], + "mappings": [ + { + "options": { + "from": 0, + "result": { + "color": "red", + "index": 0 + }, + "to": 60 + }, + "type": "range" + }, + { + "options": { + "from": 60, + "result": { + "color": "yellow", + "index": 1 + }, + "to": 90 + }, + "type": "range" + }, + { + "options": { + "from": 90, + "result": { + "color": "green", + "index": 2 + }, + "to": 100 + }, + "type": "range" + } + ], "thresholds": { "mode": "absolute", "steps": [ - { - "color": "green", - "value": null - }, { "color": "red", - "value": 80 + "value": null } ] } @@ -1236,18 +2818,19 @@ "options": "validator_pubkey" }, "properties": [ - { - "id": "displayName", - "value": "validator" - }, { "id": "links", "value": [ { + "targetBlank": true, "title": "beaconcha.in", "url": "https://beaconcha.in/validator/${__value.raw}" } ] + }, + { + "id": "unit", + "value": "string" } ] }, @@ -1259,31 +2842,27 @@ "properties": [ { "id": "custom.width", - "value": 180 + "value": 120 } ] }, { "matcher": { "id": "byName", - "options": "nos_id" + "options": "epoch_participation_percent" }, "properties": [ { - "id": "custom.width", - "value": 80 - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "status" - }, - "properties": [ + "id": "custom.displayMode", + "value": "color-text" + }, { "id": "custom.width", - "value": 200 + "value": 60 + }, + { + "id": "unit", + "value": "percent" } ] } @@ -1291,11 +2870,11 @@ }, "gridPos": { "h": 8, - "w": 12, - "x": 0, - "y": 22 + "w": 8, + "x": 8, + "y": 32 }, - "id": 1699, + "id": 1762, "options": { "footer": { "fields": "", @@ -1304,7 +2883,13 @@ ], "show": false }, - "showHeader": true + "showHeader": false, + "sortBy": [ + { + "desc": false, + "displayName": "delta" + } + ] }, "pluginVersion": "8.4.6", "targets": [ @@ -1317,19 +2902,20 @@ "extrapolate": true, "format": "table", "formattedQuery": "SELECT $timeSeries as t, count() FROM $table WHERE $timeFilter GROUP BY t ORDER BY t", + "hide": false, "intervalFactor": 1, - "query": "SELECT\n status,\n CAST(validator_pubkey, 'FixedString(100)') as validator_pubkey\nFROM stats.validator_balances\nWHERE (status == 'active_slashed' OR status == 'exited_slashed' OR validator_slashed == 1) and slot = ${slot_number_var} AND nos_name = '${nos_name_var}'", - "rawQuery": "SELECT\n status,\n CAST(validator_pubkey, 'FixedString(100)') as validator_pubkey\nFROM stats.validator_balances\nWHERE (status == 'active_slashed' OR status == 'exited_slashed' OR validator_slashed == 1) and slot = 4356063 AND nos_name = 'ChainLayer'", - "refId": "A", + "query": "SELECT\n validator_pubkey\nFROM (\n SELECT\n validator_pubkey,\n count() AS count_fail\n FROM\n stats.validator_sync\n WHERE\n epoch_participation_percent < (epoch_chain_participation_percent_avg - ${sync_participation_distance_var}) AND\n (last_slot_of_epoch <= ${slot_number_var} AND last_slot_of_epoch > (${slot_number_var} - ${fetch_interval_var} * ${sync_epochs_var})) AND\n nos_name = '${nos_name_var}'\n GROUP BY validator_pubkey\n)\nWHERE count_fail = ${sync_epochs_var}\nORDER BY count_fail DESC, validator_pubkey", + "rawQuery": "SELECT\n validator_pubkey\nFROM (\n SELECT\n validator_pubkey,\n count() AS count_fail\n FROM\n stats.validator_sync\n WHERE\n epoch_participation_percent < (epoch_chain_participation_percent_avg - 10) AND\n (last_slot_of_epoch <= 4728607 AND last_slot_of_epoch > (4728607 - 32 * 3)) AND\n nos_name = 'Stakin'\n GROUP BY validator_pubkey\n)\nWHERE count_fail = 3\nORDER BY count_fail DESC, validator_pubkey", + "refId": "B", "round": "0s", "skip_comments": true } ], - "title": "Slashed validators", + "title": "Bad Sync participation (${sync_epochs_var} epochs in a row)", "type": "table" } ], - "refresh": "", + "refresh": false, "schemaVersion": 35, "style": "dark", "tags": [], @@ -1341,7 +2927,8 @@ "text": "Allnodes", "value": "Allnodes" }, - "definition": "user_validators", + "definition": "query_result(ethereum_validators_monitoring_user_validators)", + "description": "", "hide": 0, "includeAll": false, "label": "Node Operator", @@ -1349,7 +2936,7 @@ "name": "nos_name_var", "options": [], "query": { - "query": "ethereum_validators_monitoring_user_validators", + "query": "query_result(ethereum_validators_monitoring_user_validators)", "refId": "StandardVariableQuery" }, "refresh": 1, @@ -1361,10 +2948,10 @@ { "current": { "selected": false, - "text": "3583199", - "value": "3583199" + "text": "3931071", + "value": "3931071" }, - "definition": "query_result(slot_number)", + "definition": "query_result(ethereum_validators_monitoring_slot_number)", "description": "Last slot number", "hide": 2, "includeAll": false, @@ -1388,7 +2975,7 @@ "text": "32", "value": "32" }, - "definition": "query_result(fetch_interval)", + "definition": "query_result(ethereum_validators_monitoring_fetch_interval)", "description": "App fetch interval", "hide": 2, "includeAll": false, @@ -1412,7 +2999,7 @@ "text": "10", "value": "10" }, - "definition": "query_result(sync_participation_distance_down_from_chain_avg)", + "definition": "query_result(ethereum_validators_monitoring_sync_participation_distance_down_from_chain_avg)", "description": "Sync participation distance down from Blockchain average", "hide": 2, "includeAll": false, @@ -1430,30 +3017,6 @@ "sort": 0, "type": "query" }, - { - "current": { - "selected": false, - "text": "85.19", - "value": "85.19" - }, - "definition": "query_result(chain_sync_participation_avg_percent)", - "description": "Blockchain Sync participation average", - "hide": 2, - "includeAll": false, - "label": "Chain sync participation average", - "multi": false, - "name": "chain_sync_participation_var", - "options": [], - "query": { - "query": "query_result(ethereum_validators_monitoring_chain_sync_participation_avg_percent)", - "refId": "StandardVariableQuery" - }, - "refresh": 2, - "regex": "/.* ([^\\ ]*) .*/", - "skipUrlSync": false, - "sort": 0, - "type": "query" - }, { "current": { "selected": false, @@ -1464,14 +3027,14 @@ "type": "vertamedia-clickhouse-datasource", "uid": "PDEE91DDB90597936" }, - "definition": "WITH epoch_range AS (\n SELECT\n ((${__to:date:seconds} - ${__from:date:seconds}) / 600)::int as val\n)\nSELECT IF (val = 0, 1, val) from epoch_range", + "definition": "WITH epoch_range AS (\n SELECT\n ((${__to:date:seconds} - ${__from:date:seconds}) / 300)::int as val\n)\nSELECT IF (val = 0, 1, val) from epoch_range", "hide": 2, "includeAll": false, "label": "Epoch range", "multi": false, "name": "epochs", "options": [], - "query": "WITH epoch_range AS (\n SELECT\n ((${__to:date:seconds} - ${__from:date:seconds}) / 600)::int as val\n)\nSELECT IF (val = 0, 1, val) from epoch_range", + "query": "WITH epoch_range AS (\n SELECT\n ((${__to:date:seconds} - ${__from:date:seconds}) / 300)::int as val\n)\nSELECT IF (val = 0, 1, val) from epoch_range", "refresh": 2, "regex": "", "skipUrlSync": false, @@ -1497,11 +3060,55 @@ "query": "100", "skipUrlSync": false, "type": "textbox" + }, + { + "current": { + "selected": false, + "text": "3", + "value": "3" + }, + "definition": "label_values(ethereum_validators_monitoring_validator_count_miss_attestation_last_n_epoch, epoch_interval)", + "hide": 2, + "includeAll": false, + "multi": false, + "name": "att_epochs_var", + "options": [], + "query": { + "query": "label_values(ethereum_validators_monitoring_validator_count_miss_attestation_last_n_epoch, epoch_interval)", + "refId": "StandardVariableQuery" + }, + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "type": "query" + }, + { + "current": { + "selected": false, + "text": "3", + "value": "3" + }, + "definition": "label_values(ethereum_validators_monitoring_validator_count_with_sync_participation_less_avg_last_n_epoch, epoch_interval)", + "hide": 2, + "includeAll": false, + "multi": false, + "name": "sync_epochs_var", + "options": [], + "query": { + "query": "label_values(ethereum_validators_monitoring_validator_count_with_sync_participation_less_avg_last_n_epoch, epoch_interval)", + "refId": "StandardVariableQuery" + }, + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "type": "query" } ] }, "time": { - "from": "now-1h", + "from": "now-5m", "to": "now" }, "timepicker": { @@ -1510,5 +3117,5 @@ "timezone": "", "title": "NodeOperators", "uid": "3wimU2H7h", - "version": 11 + "version": 12 } diff --git a/docker/grafana/provisioning/dashboards/validators.json b/docker/grafana/provisioning/dashboards/validators.json index 7c0e80fe..1ce0af90 100644 --- a/docker/grafana/provisioning/dashboards/validators.json +++ b/docker/grafana/provisioning/dashboards/validators.json @@ -21,7 +21,8 @@ "editable": true, "fiscalYearStartMonth": 0, "graphTooltip": 0, - "iteration": 1648447555789, + "id": 15, + "iteration": 1663677853695, "links": [ { "asDropdown": false, @@ -46,42 +47,52 @@ "x": 0, "y": 0 }, - "id": 14, + "id": 85, "panels": [], - "title": "General", + "title": "App and contract", "type": "row" }, { - "datasource": { - "type": "vertamedia-clickhouse-datasource", - "uid": "PDEE91DDB90597936" - }, "fieldConfig": { "defaults": { "color": { "mode": "thresholds" }, + "decimals": 0, "mappings": [], + "min": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "text", "value": null + }, + { + "color": "green", + "value": 0 + }, + { + "color": "dark-yellow", + "value": 1800000 + }, + { + "color": "red", + "value": 3600000 } ] }, - "unit": "decbytes" + "unit": "ms" }, "overrides": [] }, "gridPos": { - "h": 2, - "w": 4, + "h": 4, + "w": 5, "x": 0, "y": 1 }, - "id": 30, + "id": 3, "options": { "colorMode": "value", "graphMode": "area", @@ -94,53 +105,40 @@ "fields": "", "values": false }, - "text": {}, "textMode": "auto" }, - "pluginVersion": "8.4.3", + "pluginVersion": "8.4.6", "targets": [ { "datasource": { - "type": "vertamedia-clickhouse-datasource", - "uid": "PDEE91DDB90597936" + "type": "prometheus", + "uid": "PBFA97CFB590B2093" }, - "dateTimeType": "DATETIME", - "extrapolate": true, - "format": "table", - "formattedQuery": "SELECT $timeSeries as t, count() FROM $table WHERE $timeFilter GROUP BY t ORDER BY t", - "hide": false, - "intervalFactor": 1, - "query": "SELECT sum(bytes) as size\nFROM system.parts\n\n", - "rawQuery": "SELECT sum(bytes) as size\nFROM system.parts", - "refId": "A", - "round": "0s", - "skip_comments": true + "exemplar": true, + "expr": "sum(ethereum_validators_monitoring_data_actuality)", + "interval": "", + "legendFormat": "", + "refId": "A" } ], - "title": "DB size", + "title": "Data actuality", "type": "stat" }, { + "description": "Last processed for a specified time period", "fieldConfig": { "defaults": { "color": { - "mode": "thresholds" + "fixedColor": "text", + "mode": "fixed" }, "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { - "color": "text", + "color": "super-light-blue", "value": null - }, - { - "color": "green", - "value": 0 - }, - { - "color": "red", - "value": 1 } ] }, @@ -149,12 +147,12 @@ "overrides": [] }, "gridPos": { - "h": 3, - "w": 4, - "x": 4, + "h": 2, + "w": 5, + "x": 5, "y": 1 }, - "id": 17, + "id": 2, "options": { "colorMode": "value", "graphMode": "area", @@ -170,7 +168,7 @@ "text": {}, "textMode": "auto" }, - "pluginVersion": "8.4.3", + "pluginVersion": "8.4.6", "targets": [ { "datasource": { @@ -178,13 +176,13 @@ "uid": "PBFA97CFB590B2093" }, "exemplar": true, - "expr": "ethereum_validators_monitoring_validators{owner=\"user\",status=\"slashed\"}", + "expr": "sum(ethereum_validators_monitoring_slot_number)", "interval": "", - "legendFormat": "{{owner}}", + "legendFormat": "", "refId": "A" } ], - "title": "Slashed User Validators", + "title": "Slot", "type": "stat" }, { @@ -204,17 +202,17 @@ } ] }, - "unit": "locale" + "unit": "none" }, "overrides": [] }, "gridPos": { - "h": 3, - "w": 4, - "x": 8, + "h": 2, + "w": 5, + "x": 10, "y": 1 }, - "id": 20, + "id": 45, "options": { "colorMode": "value", "graphMode": "area", @@ -230,7 +228,7 @@ "text": {}, "textMode": "auto" }, - "pluginVersion": "8.4.3", + "pluginVersion": "8.4.6", "targets": [ { "datasource": { @@ -238,13 +236,13 @@ "uid": "PBFA97CFB590B2093" }, "exemplar": true, - "expr": "ethereum_validators_monitoring_validators{owner=\"user\",status=\"pending\"}", + "expr": "sum(ethereum_validators_monitoring_contract_keys_total{type=\"total\"})", "interval": "", - "legendFormat": "{{owner}}", + "legendFormat": "", "refId": "A" } ], - "title": "Pending User Validators", + "title": "Total keys", "type": "stat" }, { @@ -264,17 +262,17 @@ } ] }, - "unit": "locale" + "unit": "ETH" }, "overrides": [] }, "gridPos": { - "h": 3, - "w": 4, - "x": 12, + "h": 4, + "w": 5, + "x": 15, "y": 1 }, - "id": 18, + "id": 43, "options": { "colorMode": "value", "graphMode": "area", @@ -290,7 +288,7 @@ "text": {}, "textMode": "auto" }, - "pluginVersion": "8.4.3", + "pluginVersion": "8.4.6", "targets": [ { "datasource": { @@ -298,22 +296,172 @@ "uid": "PBFA97CFB590B2093" }, "exemplar": true, - "expr": "ethereum_validators_monitoring_validators{owner=\"user\",status=\"ongoing\"}", + "expr": "sum(ethereum_validators_monitoring_steth_buffered_ether_total)", "interval": "", - "legendFormat": "{{owner}}", + "legendFormat": "", "refId": "A" } ], - "title": "Ongoing User Validators", + "title": "Buffered ether", "type": "stat" }, { + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 4, + "x": 20, + "y": 1 + }, + "id": 94, + "options": { + "inlineEditing": false, + "root": { + "anchor": { + "left": true, + "top": true + }, + "background": { + "color": { + "fixed": "#ffffff00" + }, + "image": { + "field": "", + "fixed": "", + "mode": "field" + }, + "size": "original" + }, + "elements": [ + { + "anchor": { + "left": true, + "top": true + }, + "background": { + "color": { + "fixed": "#a352cc40" + }, + "image": { + "mode": "fixed" + }, + "size": "original" + }, + "config": { + "align": "left", + "valign": "middle" + }, + "name": "Element 3", + "placement": { + "height": 516, + "left": 0, + "top": 0, + "width": 1406 + }, + "type": "text-box" + }, + { + "anchor": { + "left": true, + "top": true + }, + "background": { + "size": "original" + }, + "border": { + "width": 0 + }, + "config": { + "fill": { + "fixed": "#FFF899" + }, + "path": { + "fixed": "https://support.ledger.com/hc/article_attachments/4405133294609/lido.svg", + "mode": "fixed" + } + }, + "name": "Element 2", + "placement": { + "height": 114, + "left": 79, + "top": 20, + "width": 114 + }, + "type": "icon" + }, + { + "anchor": { + "left": true, + "top": true + }, + "background": { + "color": { + "fixed": "transparent" + }, + "size": "original" + }, + "config": { + "align": "center", + "size": 20, + "text": { + "fixed": "Made by Lido", + "mode": "fixed" + }, + "valign": "middle" + }, + "name": "Element 1", + "placement": { + "height": 122, + "left": 12, + "top": 14, + "width": 88 + }, + "type": "text-box" + } + ], + "name": "Element 1663323860892", + "placement": { + "height": 100, + "left": 0, + "top": 0, + "width": 100 + }, + "type": "group" + } + }, + "pluginVersion": "8.4.6", + "type": "canvas" + }, + { + "description": "Last processed for a specified time period", "fieldConfig": { "defaults": { "color": { "fixedColor": "text", "mode": "fixed" }, + "decimals": 0, "mappings": [], "thresholds": { "mode": "absolute", @@ -324,17 +472,17 @@ } ] }, - "unit": "ETH" + "unit": "none" }, "overrides": [] }, "gridPos": { - "h": 3, - "w": 3, - "x": 16, - "y": 1 + "h": 2, + "w": 5, + "x": 5, + "y": 3 }, - "id": 43, + "id": 86, "options": { "colorMode": "value", "graphMode": "area", @@ -350,7 +498,7 @@ "text": {}, "textMode": "auto" }, - "pluginVersion": "8.4.3", + "pluginVersion": "8.4.6", "targets": [ { "datasource": { @@ -358,157 +506,120 @@ "uid": "PBFA97CFB590B2093" }, "exemplar": true, - "expr": "ethereum_validators_monitoring_steth_buffered_ether_total", + "expr": "sum(ethereum_validators_monitoring_slot_number) / 32", "interval": "", "legendFormat": "", "refId": "A" } ], - "title": "Buffered ether (contract)", + "title": "Epoch", "type": "stat" }, { - "description": "", "fieldConfig": { "defaults": { "color": { "fixedColor": "text", "mode": "fixed" }, - "custom": { - "align": "auto", - "displayMode": "auto" - }, - "decimals": 0, - "links": [], "mappings": [], - "min": 0, - "noValue": "0", "thresholds": { - "mode": "percentage", + "mode": "absolute", "steps": [ { - "color": "text", + "color": "super-light-blue", "value": null } ] }, - "unit": "locale" + "unit": "none" }, "overrides": [] }, "gridPos": { - "h": 10, + "h": 2, "w": 5, - "x": 19, - "y": 1 + "x": 10, + "y": 3 }, - "id": 75, + "id": 46, "options": { - "footer": { - "fields": "", - "reducer": [ - "sum" + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" ], - "show": false + "fields": "", + "values": false }, - "frameIndex": 0, - "showHeader": true + "text": {}, + "textMode": "auto" }, - "pluginVersion": "8.4.3", + "pluginVersion": "8.4.6", "targets": [ { "datasource": { "type": "prometheus", "uid": "PBFA97CFB590B2093" }, - "exemplar": false, - "expr": "sort_desc(sum by (nos_name, status) (ethereum_validators_monitoring_user_validators{status=~\"ongoing|pending\"}))", - "format": "time_series", - "instant": true, + "exemplar": true, + "expr": "sum(ethereum_validators_monitoring_contract_keys_total{type=\"used\"})", "interval": "", "legendFormat": "", "refId": "A" } ], - "title": "Ongoing and pending operators", - "transformations": [ - { - "id": "labelsToFields", - "options": { - "mode": "columns", - "valueLabel": "status" - } - }, - { - "id": "merge", - "options": {} - }, - { - "id": "organize", - "options": { - "excludeByName": { - "Time": true - }, - "indexByName": { - "Time": 0, - "nos_name": 1, - "ongoing": 2, - "pending": 3 - }, - "renameByName": { - "nos_name": "Name", - "ongoing": "Ongoing", - "pending": "Pending" - } - } - } - ], - "type": "table" + "title": "Total used keys", + "type": "stat" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 5 + }, + "id": 14, + "panels": [], + "title": "🏠 General", + "type": "row" }, { "fieldConfig": { "defaults": { "color": { - "mode": "thresholds" + "fixedColor": "green", + "mode": "fixed" }, - "decimals": 0, "mappings": [], - "max": 604800000, - "min": 0, "thresholds": { "mode": "absolute", "steps": [ { - "color": "text", + "color": "super-light-blue", "value": null - }, - { - "color": "green", - "value": 0 - }, - { - "color": "dark-yellow", - "value": 1800000 - }, - { - "color": "red", - "value": 3600000 } ] }, - "unit": "ms" + "unit": "locale" }, "overrides": [] }, "gridPos": { - "h": 4, - "w": 4, + "h": 3, + "w": 5, "x": 0, - "y": 3 + "y": 6 }, - "id": 3, + "id": 18, "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", "orientation": "auto", "reduceOptions": { "calcs": [ @@ -517,11 +628,10 @@ "fields": "", "values": false }, - "showThresholdLabels": false, - "showThresholdMarkers": false, - "text": {} + "text": {}, + "textMode": "auto" }, - "pluginVersion": "8.4.3", + "pluginVersion": "8.4.6", "targets": [ { "datasource": { @@ -529,49 +639,48 @@ "uid": "PBFA97CFB590B2093" }, "exemplar": true, - "expr": "ethereum_validators_monitoring_data_actuality", + "expr": "sum(ethereum_validators_monitoring_validators{owner=\"user\",status=\"ongoing\"})", "interval": "", - "legendFormat": "", + "legendFormat": "{{owner}}", "refId": "A" } ], - "title": "Data actuality", - "type": "gauge" + "title": "Ongoing User Validators", + "type": "stat" }, { "fieldConfig": { "defaults": { "color": { - "mode": "palette-classic" - }, - "custom": { - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - } + "fixedColor": "blue", + "mode": "fixed" }, "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "super-light-blue", + "value": null + } + ] + }, "unit": "locale" }, "overrides": [] }, "gridPos": { - "h": 7, - "w": 4, - "x": 4, - "y": 4 + "h": 3, + "w": 5, + "x": 5, + "y": 6 }, - "id": 16, + "id": 20, "options": { - "legend": { - "displayMode": "table", - "placement": "bottom", - "values": [ - "value" - ] - }, - "pieType": "donut", + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", "reduceOptions": { "calcs": [ "lastNotNull" @@ -579,12 +688,10 @@ "fields": "", "values": false }, - "tooltip": { - "mode": "single", - "sort": "none" - } + "text": {}, + "textMode": "auto" }, - "pluginVersion": "8.1.5", + "pluginVersion": "8.4.6", "targets": [ { "datasource": { @@ -592,62 +699,55 @@ "uid": "PBFA97CFB590B2093" }, "exemplar": true, - "expr": "ethereum_validators_monitoring_validators{owner=\"user\",status=\"slashed\"}", + "expr": "sum(ethereum_validators_monitoring_validators{owner=\"user\",status=\"pending\"})", "interval": "", "legendFormat": "{{owner}}", "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "PBFA97CFB590B2093" - }, - "exemplar": true, - "expr": "ethereum_validators_monitoring_validators{owner=\"other\",status=\"slashed\"}", - "hide": false, - "interval": "", - "legendFormat": "{{owner}}", - "refId": "B" } ], - "title": "Slashed Validators", - "type": "piechart" + "title": "Pending User Validators", + "type": "stat" }, { "fieldConfig": { "defaults": { "color": { - "mode": "palette-classic" - }, - "custom": { - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - } + "mode": "thresholds" }, "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "text", + "value": null + }, + { + "color": "super-light-red", + "value": 0 + }, + { + "color": "red", + "value": 1 + } + ] + }, "unit": "locale" }, "overrides": [] }, "gridPos": { - "h": 7, - "w": 4, - "x": 8, - "y": 4 + "h": 3, + "w": 5, + "x": 10, + "y": 6 }, - "id": 15, + "id": 17, "options": { - "legend": { - "displayMode": "table", - "placement": "bottom", - "values": [ - "value", - "percent" - ] - }, - "pieType": "donut", + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", "reduceOptions": { "calcs": [ "lastNotNull" @@ -655,12 +755,10 @@ "fields": "", "values": false }, - "tooltip": { - "mode": "single", - "sort": "none" - } + "text": {}, + "textMode": "auto" }, - "pluginVersion": "8.1.5", + "pluginVersion": "8.4.6", "targets": [ { "datasource": { @@ -668,136 +766,228 @@ "uid": "PBFA97CFB590B2093" }, "exemplar": true, - "expr": "ethereum_validators_monitoring_validators{owner=\"user\",status=\"pending\"}", + "expr": "sum(ethereum_validators_monitoring_validators{owner=\"user\",status=\"slashed\"})", "interval": "", "legendFormat": "{{owner}}", "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "PBFA97CFB590B2093" - }, - "exemplar": true, - "expr": "ethereum_validators_monitoring_validators{owner=\"other\",status=\"pending\"}", - "hide": false, - "interval": "", - "legendFormat": "{{owner}}", - "refId": "B" } ], - "title": "Pending Validators", - "type": "piechart" + "title": "Slashed User Validators", + "type": "stat" }, { + "description": "", "fieldConfig": { "defaults": { "color": { - "mode": "palette-classic" + "fixedColor": "text", + "mode": "fixed" }, "custom": { - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - } + "align": "auto", + "displayMode": "auto", + "filterable": false }, + "decimals": 0, + "links": [], "mappings": [], + "min": 0, + "noValue": "0", + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "text", + "value": null + } + ] + }, "unit": "locale" }, - "overrides": [] + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Ongoing" + }, + "properties": [ + { + "id": "custom.width", + "value": 120 + }, + { + "id": "custom.displayMode", + "value": "basic" + }, + { + "id": "color", + "value": { + "fixedColor": "green", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Pending" + }, + "properties": [ + { + "id": "custom.width", + "value": 120 + }, + { + "id": "custom.displayMode", + "value": "basic" + }, + { + "id": "color", + "value": { + "fixedColor": "blue", + "mode": "fixed" + } + } + ] + } + ] }, "gridPos": { - "h": 7, - "w": 4, - "x": 12, - "y": 4 + "h": 10, + "w": 9, + "x": 15, + "y": 6 }, - "id": 5, + "id": 75, "options": { - "legend": { - "displayMode": "table", - "placement": "bottom", - "values": [ - "value", - "percent" - ] - }, - "pieType": "donut", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], + "footer": { "fields": "", - "values": false + "reducer": [ + "sum" + ], + "show": false }, - "tooltip": { - "mode": "single", - "sort": "none" - } + "frameIndex": 0, + "showHeader": true, + "sortBy": [] }, - "pluginVersion": "8.1.5", + "pluginVersion": "8.4.6", "targets": [ { "datasource": { "type": "prometheus", "uid": "PBFA97CFB590B2093" }, - "exemplar": true, - "expr": "ethereum_validators_monitoring_validators{owner=\"user\",status=\"ongoing\"}", + "exemplar": false, + "expr": "(sort_desc(sum by (nos_name, status) (ethereum_validators_monitoring_user_validators{status=~\"ongoing|pending\"})))", + "instant": true, "interval": "", - "legendFormat": "{{owner}}", + "legendFormat": "", "refId": "A" - }, + } + ], + "title": "Ongoing and pending operators", + "transformations": [ { - "datasource": { - "type": "prometheus", - "uid": "PBFA97CFB590B2093" - }, - "exemplar": true, - "expr": "ethereum_validators_monitoring_validators{owner=\"other\",status=\"ongoing\"}", - "hide": false, - "interval": "", - "legendFormat": "{{owner}}", - "refId": "B" + "id": "labelsToFields", + "options": { + "mode": "columns", + "valueLabel": "status" + } + }, + { + "id": "merge", + "options": {} + }, + { + "id": "organize", + "options": { + "excludeByName": { + "Time": true + }, + "indexByName": { + "Time": 0, + "nos_name": 1, + "ongoing": 2, + "pending": 3 + }, + "renameByName": { + "nos_name": "Name", + "ongoing": "Ongoing", + "pending": "Pending" + } + } } ], - "title": "Ongoing Validators", - "type": "piechart" + "type": "table" }, { "fieldConfig": { "defaults": { "color": { - "fixedColor": "text", - "mode": "fixed" + "mode": "palette-classic" + }, + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + } }, "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ + "unit": "locale" + }, + "overrides": [ + { + "matcher": { + "id": "byFrameRefID", + "options": "A" + }, + "properties": [ { - "color": "super-light-blue", - "value": null + "id": "color", + "value": { + "fixedColor": "green", + "mode": "fixed" + } } ] }, - "unit": "none" - }, - "overrides": [] + { + "matcher": { + "id": "byFrameRefID", + "options": "B" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "super-light-green", + "mode": "fixed" + } + } + ] + } + ] }, "gridPos": { - "h": 4, - "w": 3, - "x": 16, - "y": 4 + "h": 7, + "w": 5, + "x": 0, + "y": 9 }, - "id": 46, + "id": 5, "options": { - "colorMode": "value", - "graphMode": "area", - "justifyMode": "auto", - "orientation": "auto", + "legend": { + "displayMode": "table", + "placement": "bottom", + "values": [ + "value", + "percent" + ] + }, + "pieType": "donut", "reduceOptions": { "calcs": [ "lastNotNull" @@ -805,10 +995,12 @@ "fields": "", "values": false }, - "text": {}, - "textMode": "auto" + "tooltip": { + "mode": "single", + "sort": "none" + } }, - "pluginVersion": "8.4.3", + "pluginVersion": "8.1.5", "targets": [ { "datasource": { @@ -816,48 +1008,93 @@ "uid": "PBFA97CFB590B2093" }, "exemplar": true, - "expr": "ethereum_validators_monitoring_contract_keys_total{type=\"used\"}", + "expr": "sum(ethereum_validators_monitoring_validators{owner=\"user\",status=\"ongoing\"})", "interval": "", - "legendFormat": "", + "legendFormat": "User", "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "exemplar": true, + "expr": "sum(ethereum_validators_monitoring_validators{owner=\"other\",status=\"ongoing\"})", + "hide": false, + "interval": "", + "legendFormat": "Other", + "refId": "B" } ], - "title": "Total used keys (contract)", - "type": "stat" + "title": "Ongoing Validators", + "type": "piechart" }, { "fieldConfig": { "defaults": { "color": { - "fixedColor": "text", - "mode": "fixed" + "mode": "palette-classic" + }, + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + } }, "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ + "unit": "locale" + }, + "overrides": [ + { + "matcher": { + "id": "byFrameRefID", + "options": "A" + }, + "properties": [ { - "color": "super-light-blue", - "value": null + "id": "color", + "value": { + "fixedColor": "blue", + "mode": "fixed" + } } ] }, - "unit": "locale" - }, - "overrides": [] + { + "matcher": { + "id": "byFrameRefID", + "options": "B" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "super-light-blue", + "mode": "fixed" + } + } + ] + } + ] }, "gridPos": { - "h": 2, - "w": 4, - "x": 0, - "y": 7 + "h": 7, + "w": 5, + "x": 5, + "y": 9 }, - "id": 2, + "id": 15, "options": { - "colorMode": "value", - "graphMode": "area", - "justifyMode": "auto", - "orientation": "auto", + "legend": { + "displayMode": "table", + "placement": "bottom", + "values": [ + "value", + "percent" + ] + }, + "pieType": "donut", "reduceOptions": { "calcs": [ "lastNotNull" @@ -865,10 +1102,12 @@ "fields": "", "values": false }, - "text": {}, - "textMode": "auto" + "tooltip": { + "mode": "single", + "sort": "none" + } }, - "pluginVersion": "8.4.3", + "pluginVersion": "8.1.5", "targets": [ { "datasource": { @@ -876,48 +1115,92 @@ "uid": "PBFA97CFB590B2093" }, "exemplar": true, - "expr": "ethereum_validators_monitoring_slot_number", + "expr": "sum(ethereum_validators_monitoring_validators{owner=\"user\",status=\"pending\"})", "interval": "", - "legendFormat": "", + "legendFormat": "User", "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "exemplar": true, + "expr": "sum(ethereum_validators_monitoring_validators{owner=\"other\",status=\"pending\"})", + "hide": false, + "interval": "", + "legendFormat": "Other", + "refId": "B" } ], - "title": "Latest slot number", - "type": "stat" + "title": "Pending Validators", + "type": "piechart" }, { "fieldConfig": { "defaults": { "color": { - "fixedColor": "text", - "mode": "fixed" + "mode": "palette-classic" + }, + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + } }, "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ + "unit": "locale" + }, + "overrides": [ + { + "matcher": { + "id": "byFrameRefID", + "options": "A" + }, + "properties": [ { - "color": "super-light-blue", - "value": null + "id": "color", + "value": { + "fixedColor": "red", + "mode": "fixed" + } } ] }, - "unit": "none" - }, - "overrides": [] + { + "matcher": { + "id": "byFrameRefID", + "options": "B" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "super-light-red", + "mode": "fixed" + } + } + ] + } + ] }, "gridPos": { - "h": 3, - "w": 3, - "x": 16, - "y": 8 + "h": 7, + "w": 5, + "x": 10, + "y": 9 }, - "id": 45, + "id": 16, "options": { - "colorMode": "value", - "graphMode": "area", - "justifyMode": "auto", - "orientation": "auto", + "legend": { + "displayMode": "table", + "placement": "bottom", + "values": [ + "value" + ] + }, + "pieType": "donut", "reduceOptions": { "calcs": [ "lastNotNull" @@ -925,10 +1208,12 @@ "fields": "", "values": false }, - "text": {}, - "textMode": "auto" + "tooltip": { + "mode": "single", + "sort": "none" + } }, - "pluginVersion": "8.4.3", + "pluginVersion": "8.1.5", "targets": [ { "datasource": { @@ -936,80 +1221,26 @@ "uid": "PBFA97CFB590B2093" }, "exemplar": true, - "expr": "ethereum_validators_monitoring_contract_keys_total{type=\"total\"}", + "expr": "sum(ethereum_validators_monitoring_validators{owner=\"user\",status=\"slashed\"})", "interval": "", - "legendFormat": "", + "legendFormat": "User", "refId": "A" - } - ], - "title": "Total keys (contract)", - "type": "stat" - }, - { - "description": "ETH", - "fieldConfig": { - "defaults": { - "color": { - "fixedColor": "text", - "mode": "thresholds" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "red", - "value": null - }, - { - "color": "text", - "value": 0 - } - ] - }, - "unit": "locale" - }, - "overrides": [] - }, - "gridPos": { - "h": 2, - "w": 4, - "x": 0, - "y": 9 - }, - "id": 24, - "options": { - "colorMode": "value", - "graphMode": "area", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false }, - "text": {}, - "textMode": "auto" - }, - "pluginVersion": "8.4.3", - "targets": [ { "datasource": { "type": "prometheus", "uid": "PBFA97CFB590B2093" }, "exemplar": true, - "expr": "ethereum_validators_monitoring_total_balance_24h_difference / 10 ^ 9", + "expr": "sum(ethereum_validators_monitoring_validators{owner=\"other\",status=\"slashed\"})", + "hide": false, "interval": "", - "legendFormat": "", - "refId": "A" + "legendFormat": "Other", + "refId": "B" } ], - "title": "Total balance 24h diff", - "transformations": [], - "type": "stat" + "title": "Slashed Validators", + "type": "piechart" }, { "collapsed": false, @@ -1017,185 +1248,19 @@ "h": 1, "w": 24, "x": 0, - "y": 11 + "y": 16 }, - "id": 23, + "id": 79, "panels": [], - "title": "Validator Balance Deltas", + "title": "📒 Performance summary", "type": "row" }, - { - "description": "Delta: current slot - 192 slot", - "fieldConfig": { - "defaults": { - "color": { - "fixedColor": "super-light-blue", - "mode": "thresholds" - }, - "decimals": 0, - "links": [], - "mappings": [], - "min": 0, - "thresholds": { - "mode": "percentage", - "steps": [ - { - "color": "red", - "value": null - }, - { - "color": "yellow", - "value": 50 - }, - { - "color": "green", - "value": 75 - } - ] - }, - "unit": "locale" - }, - "overrides": [] - }, - "gridPos": { - "h": 11, - "w": 8, - "x": 0, - "y": 12 - }, - "id": 21, - "options": { - "displayMode": "basic", - "orientation": "horizontal", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "showUnfilled": true, - "text": {} - }, - "pluginVersion": "8.4.3", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "PBFA97CFB590B2093" - }, - "exemplar": true, - "expr": "sort_desc(ethereum_validators_monitoring_validator_balances_delta)", - "format": "time_series", - "instant": true, - "interval": "", - "legendFormat": "{{nos_name}}", - "refId": "A" - } - ], - "title": "Average validator balances delta", - "transformations": [], - "type": "bargauge" - }, - { - "description": "Delta: current slot - 192 slot", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "semi-dark-green", - "value": null - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 11, - "w": 16, - "x": 8, - "y": 12 - }, - "id": 10, - "options": { - "legend": { - "calcs": [ - "lastNotNull" - ], - "displayMode": "table", - "placement": "right" - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "pluginVersion": "8.1.5", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "PBFA97CFB590B2093" - }, - "exemplar": true, - "expr": "ethereum_validators_monitoring_validator_count_with_negative_balances_delta", - "interval": "", - "legendFormat": "{{nos_name}}", - "refId": "A" - } - ], - "thresholds": [ - { - "colorMode": "critical", - "op": "gt", - "value": 0, - "visible": true - } - ], - "title": "Number of validators with negative delta", - "type": "timeseries" - }, { "datasource": { "type": "vertamedia-clickhouse-datasource", "uid": "PDEE91DDB90597936" }, - "description": "Delta: current slot - 192 slot", + "description": "", "fieldConfig": { "defaults": { "color": { @@ -1203,7 +1268,8 @@ }, "custom": { "align": "auto", - "displayMode": "auto" + "displayMode": "color-text", + "filterable": false }, "links": [], "mappings": [], @@ -1211,7 +1277,7 @@ "mode": "absolute", "steps": [ { - "color": "red", + "color": "text", "value": null } ] @@ -1221,99 +1287,79 @@ { "matcher": { "id": "byName", - "options": "delta" + "options": "Missed" }, "properties": [ { - "id": "custom.width", - "value": 70 - }, - { - "id": "unit", - "value": "locale" + "id": "color", + "value": { + "fixedColor": "red", + "mode": "fixed" + } }, - { - "id": "custom.displayMode", - "value": "color-text" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "status" - }, - "properties": [ { "id": "custom.width", - "value": 110 + "value": 70 } ] }, { "matcher": { "id": "byName", - "options": "validator_pubkey" + "options": "Proposed" }, "properties": [ { - "id": "links", - "value": [ - { - "targetBlank": true, - "title": "beaconcha.in", - "url": "https://beaconcha.in/validator/${__value.raw}" - } - ] - }, - { - "id": "displayName", - "value": "validator" + "id": "color", + "value": { + "fixedColor": "green", + "mode": "fixed" + } }, { - "id": "unit", - "value": "string" + "id": "custom.width", + "value": 80 } ] }, { "matcher": { "id": "byName", - "options": "nos_name" + "options": "All" }, "properties": [ { "id": "custom.width", - "value": 200 + "value": 70 } ] } ] }, "gridPos": { - "h": 11, - "w": 8, + "h": 7, + "w": 12, "x": 0, - "y": 23 + "y": 17 }, - "id": 28, + "id": 77, "options": { "footer": { "fields": "", "reducer": [ "sum" ], - "show": false + "show": true }, - "showHeader": false, + "showHeader": true, "sortBy": [ { - "desc": false, - "displayName": "delta" + "desc": true, + "displayName": "Missed" } ] }, - "pluginVersion": "8.4.3", + "pluginVersion": "8.4.6", "targets": [ { "datasource": { @@ -1325,231 +1371,194 @@ "format": "table", "formattedQuery": "SELECT $timeSeries as t, count() FROM $table WHERE $timeFilter GROUP BY t ORDER BY t", "intervalFactor": 1, - "query": "SELECT\n current.balance - previous.balance AS delta,\n current.nos_name,\n current.status,\n current.validator_pubkey\nFROM \n (\n SELECT balance, validator_pubkey, status, nos_id, nos_name \n FROM stats.validator_balances \n WHERE \n status != 'pending_queued' AND \n nos_name IS NOT NULL AND\n slot = ${slot_number_var}\n ) AS current\nLEFT JOIN\n (\n SELECT balance, validator_pubkey, nos_id, nos_name \n FROM stats.validator_balances \n WHERE\n status != 'pending_queued' AND \n nos_name IS NOT NULL AND\n slot = (${slot_number_var} - ${fetch_interval_var} * 6)\n ) AS previous\nON\n previous.nos_id = current.nos_id AND \n previous.validator_pubkey = current.validator_pubkey\nORDER BY delta ASC\nLIMIT 100", - "rawQuery": "SELECT\n current.balance - previous.balance AS delta,\n current.nos_name,\n current.status,\n current.validator_pubkey\nFROM \n (\n SELECT balance, validator_pubkey, status, nos_id, nos_name \n FROM stats.validator_balances \n WHERE \n status != 'pending_queued' AND \n nos_name IS NOT NULL AND\n slot = 2640927\n ) AS current\nLEFT JOIN\n (\n SELECT balance, validator_pubkey, nos_id, nos_name \n FROM stats.validator_balances \n WHERE\n status != 'pending_queued' AND \n nos_name IS NOT NULL AND\n slot = (2640927 - 32 * 6)\n ) AS previous\nON\n previous.nos_id = current.nos_id AND \n previous.validator_pubkey = current.validator_pubkey\nORDER BY delta ASC\nLIMIT 100", + "query": " SELECT\n nos_name as Operator,\n SUM(a) as All,\n SUM(p) as Proposed,\n SUM(m) as Missed\n FROM\n (\n SELECT\n nos_name,\n count(proposed) as a,\n IF(proposed = 0, count(proposed), 0) as m,\n IF(proposed = 1, count(proposed), 0) as p\n FROM stats.validator_proposes\n WHERE (slot_to_propose <= ${slot_number_var} AND slot_to_propose > (${slot_number_var} - ${fetch_interval_var} * ${epochs}))\n GROUP BY nos_name, proposed\n )\n GROUP by nos_name", + "rawQuery": "SELECT\n nos_name as Operator,\n SUM(a) as All,\n SUM(p) as Proposed,\n SUM(m) as Missed\n FROM\n (\n SELECT\n nos_name,\n count(proposed) as a,\n IF(proposed = 0, count(proposed), 0) as m,\n IF(proposed = 1, count(proposed), 0) as p\n FROM stats.validator_proposes\n WHERE (slot_to_propose <= 4707007 AND slot_to_propose > (4707007 - 32 * 1))\n GROUP BY nos_name, proposed\n )\n GROUP by nos_name", "refId": "A", "round": "0s", "skip_comments": true } ], - "title": "Validators with worst balance delta", + "title": "Propose duty (${epochs} epochs range)", "type": "table" }, { - "description": "Delta: current slot - 192 slot", + "datasource": { + "type": "vertamedia-clickhouse-datasource", + "uid": "PDEE91DDB90597936" + }, + "description": "", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" } }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null + "links": [], + "mappings": [] + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Proposed" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "green", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Missed" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "red", + "mode": "fixed" + } } ] } - }, - "overrides": [] + ] }, "gridPos": { - "h": 11, - "w": 16, - "x": 8, - "y": 23 + "h": 7, + "w": 6, + "x": 12, + "y": 17 }, - "id": 11, + "id": 88, "options": { + "displayLabels": [], "legend": { + "displayMode": "table", + "placement": "bottom", + "values": [ + "value", + "percent" + ] + }, + "pieType": "donut", + "reduceOptions": { "calcs": [ "lastNotNull" ], - "displayMode": "table", - "placement": "right" + "fields": "", + "values": false }, "tooltip": { "mode": "single", "sort": "none" } }, - "pluginVersion": "8.1.5", + "pluginVersion": "8.4.6", "targets": [ { "datasource": { - "type": "prometheus", - "uid": "PBFA97CFB590B2093" + "type": "vertamedia-clickhouse-datasource", + "uid": "PDEE91DDB90597936" }, - "exemplar": true, - "expr": "ethereum_validators_monitoring_validator_quantile_001_balances_delta", - "interval": "", - "legendFormat": "{{nos_name}}", - "refId": "A" + "dateTimeType": "DATETIME", + "extrapolate": true, + "format": "table", + "formattedQuery": "SELECT $timeSeries as t, count() FROM $table WHERE $timeFilter GROUP BY t ORDER BY t", + "intervalFactor": 1, + "query": " SELECT\n sum(proposed) as Proposed,\n sum(missed) as Missed\n FROM (\n SELECT\n nos_name,\n SUM(a) as all,\n SUM(p) as proposed,\n SUM(m) as missed\n FROM\n (\n SELECT\n nos_name,\n count(proposed) as a,\n IF(proposed = 0, count(proposed), 0) as m,\n IF(proposed = 1, count(proposed), 0) as p\n FROM stats.validator_proposes\n WHERE (slot_to_propose <= ${slot_number_var} AND slot_to_propose > (${slot_number_var} - ${fetch_interval_var} * ${epochs}))\n GROUP BY nos_name, proposed\n )\n GROUP by nos_name\n )", + "rawQuery": "SELECT\n sum(proposed) as Proposed,\n sum(missed) as Missed\n FROM (\n SELECT\n nos_name,\n SUM(a) as all,\n SUM(p) as proposed,\n SUM(m) as missed\n FROM\n (\n SELECT\n nos_name,\n count(proposed) as a,\n IF(proposed = 0, count(proposed), 0) as m,\n IF(proposed = 1, count(proposed), 0) as p\n FROM stats.validator_proposes\n WHERE (slot_to_propose <= 4730175 AND slot_to_propose > (4730175 - 32 * 3))\n GROUP BY nos_name, proposed\n )\n GROUP by nos_name\n )", + "refId": "A", + "round": "0s", + "skip_comments": true } ], - "title": "Worst validator balances delta [0.1% percentile]", - "type": "timeseries" + "title": "User proposals (${epochs} epochs range)", + "type": "piechart" }, { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 34 + "datasource": { + "type": "vertamedia-clickhouse-datasource", + "uid": "PDEE91DDB90597936" }, - "id": 69, - "panels": [], - "title": "Validator Sync Committee participation", - "type": "row" - }, - { - "description": "AVG", + "description": "", "fieldConfig": { "defaults": { "color": { - "mode": "thresholds" + "mode": "palette-classic" }, - "mappings": [], - "max": 100, - "min": 0, - "thresholds": { - "mode": "percentage", - "steps": [ - { - "color": "text", - "value": null - }, - { - "color": "red", - "value": 0 - }, - { - "color": "yellow", - "value": 60 - }, + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + } + }, + "links": [], + "mappings": [] + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "User" + }, + "properties": [ { - "color": "green", - "value": 90 + "id": "color", + "value": { + "fixedColor": "purple", + "mode": "fixed" + } } ] }, - "unit": "percent" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 35 - }, - "id": 70, - "options": { - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "showThresholdLabels": false, - "showThresholdMarkers": true, - "text": {} - }, - "pluginVersion": "8.4.3", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "PBFA97CFB590B2093" - }, - "exemplar": true, - "expr": "ethereum_validators_monitoring_user_sync_participation_avg_percent", - "format": "time_series", - "interval": "", - "legendFormat": "", - "refId": "A" - } - ], - "title": "User Sync Committee validators participation (last finalized epoch)", - "type": "gauge" - }, - { - "description": "AVG", - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [], - "max": 100, - "min": 0, - "thresholds": { - "mode": "percentage", - "steps": [ - { - "color": "text", - "value": null - }, - { - "color": "red", - "value": 0 - }, - { - "color": "yellow", - "value": 60 - }, + { + "matcher": { + "id": "byName", + "options": "Other" + }, + "properties": [ { - "color": "green", - "value": 90 + "id": "color", + "value": { + "fixedColor": "super-light-purple", + "mode": "fixed" + } } ] - }, - "unit": "percent" - }, - "overrides": [] + } + ] }, "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 35 + "h": 7, + "w": 6, + "x": 18, + "y": 17 }, - "id": 71, + "id": 87, "options": { - "orientation": "auto", + "displayLabels": [], + "legend": { + "displayMode": "table", + "placement": "bottom", + "values": [ + "value", + "percent" + ] + }, + "pieType": "donut", "reduceOptions": { "calcs": [ "lastNotNull" @@ -1557,34 +1566,39 @@ "fields": "", "values": false }, - "showThresholdLabels": false, - "showThresholdMarkers": true, - "text": {} + "tooltip": { + "mode": "single", + "sort": "none" + } }, - "pluginVersion": "8.4.3", + "pluginVersion": "8.4.6", "targets": [ { "datasource": { - "type": "prometheus", - "uid": "PBFA97CFB590B2093" + "type": "vertamedia-clickhouse-datasource", + "uid": "PDEE91DDB90597936" }, - "exemplar": true, - "expr": "ethereum_validators_monitoring_chain_sync_participation_avg_percent", - "format": "time_series", - "interval": "", - "legendFormat": "", - "refId": "A" + "dateTimeType": "DATETIME", + "extrapolate": true, + "format": "table", + "formattedQuery": "SELECT $timeSeries as t, count() FROM $table WHERE $timeFilter GROUP BY t ORDER BY t", + "intervalFactor": 1, + "query": " SELECT\n sum(all) as User,\n (32 * ${epochs} - User) as Other\n FROM (\n SELECT\n nos_name,\n SUM(a) as all,\n SUM(p) as proposed,\n SUM(m) as missed\n FROM\n (\n SELECT\n nos_name,\n count(proposed) as a,\n IF(proposed = 0, count(proposed), 0) as m,\n IF(proposed = 1, count(proposed), 0) as p\n FROM stats.validator_proposes\n WHERE (slot_to_propose <= ${slot_number_var} AND slot_to_propose > (${slot_number_var} - ${fetch_interval_var} * ${epochs}))\n GROUP BY nos_name, proposed\n )\n GROUP by nos_name\n )", + "rawQuery": "SELECT\n sum(all) as User,\n (32 * 3 - User) as Other\n FROM (\n SELECT\n nos_name,\n SUM(a) as all,\n SUM(p) as proposed,\n SUM(m) as missed\n FROM\n (\n SELECT\n nos_name,\n count(proposed) as a,\n IF(proposed = 0, count(proposed), 0) as m,\n IF(proposed = 1, count(proposed), 0) as p\n FROM stats.validator_proposes\n WHERE (slot_to_propose <= 4730175 AND slot_to_propose > (4730175 - 32 * 3))\n GROUP BY nos_name, proposed\n )\n GROUP by nos_name\n )", + "refId": "A", + "round": "0s", + "skip_comments": true } ], - "title": "Blockchain Sync Committee validators participation (last finalized epoch)", - "type": "gauge" + "title": "Proposals share (${epochs} epochs range)", + "type": "piechart" }, { "datasource": { "type": "vertamedia-clickhouse-datasource", "uid": "PDEE91DDB90597936" }, - "description": "User only", + "description": "", "fieldConfig": { "defaults": { "color": { @@ -1592,50 +1606,16 @@ }, "custom": { "align": "auto", - "displayMode": "auto", + "displayMode": "color-text", "filterable": false }, "links": [], - "mappings": [ - { - "options": { - "from": 3, - "result": { - "color": "red", - "index": 0 - }, - "to": 6 - }, - "type": "range" - }, - { - "options": { - "from": 1, - "result": { - "color": "yellow", - "index": 1 - }, - "to": 2 - }, - "type": "range" - }, - { - "options": { - "from": 0, - "result": { - "color": "green", - "index": 2 - }, - "to": 0 - }, - "type": "range" - } - ], + "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { - "color": "red", + "color": "text", "value": null } ] @@ -1645,87 +1625,111 @@ { "matcher": { "id": "byName", - "options": "count_fail" + "options": "nos_name" }, "properties": [ - { - "id": "custom.width", - "value": 70 - }, { "id": "unit", - "value": "none" - }, - { - "id": "custom.displayMode", - "value": "color-text" + "value": "string" } ] }, { "matcher": { "id": "byName", - "options": "validator_pubkey" + "options": "Bad" }, "properties": [ { - "id": "links", - "value": [ - { - "targetBlank": true, - "title": "beaconcha.in", - "url": "https://beaconcha.in/validator/${__value.raw}" - } - ] + "id": "color", + "value": { + "fixedColor": "red", + "mode": "fixed" + } }, { - "id": "displayName", - "value": "validator" + "id": "custom.width", + "value": 50 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Good" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "green", + "mode": "fixed" + } }, { - "id": "unit", - "value": "string" + "id": "custom.width", + "value": 50 } ] }, { "matcher": { "id": "byName", - "options": "nos_name" + "options": "Avg participation" }, "properties": [ + { + "id": "unit", + "value": "percent" + }, { "id": "custom.width", - "value": 200 + "value": 125 } ] - } - ] - }, - "gridPos": { - "h": 11, - "w": 7, - "x": 0, - "y": 43 + }, + { + "matcher": { + "id": "byName", + "options": "All" + }, + "properties": [ + { + "id": "custom.width", + "value": 50 + } + ] + } + ] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 24 }, - "id": 74, + "id": 80, "options": { "footer": { - "fields": "", + "fields": [ + "All", + "Good", + "Bad" + ], "reducer": [ "sum" ], - "show": false + "show": true }, - "showHeader": false, + "showHeader": true, "sortBy": [ { - "desc": false, - "displayName": "delta" + "desc": true, + "displayName": "Bad" } ] }, - "pluginVersion": "8.4.3", + "pluginVersion": "8.4.6", "targets": [ { "datasource": { @@ -1737,14 +1741,14 @@ "format": "table", "formattedQuery": "SELECT $timeSeries as t, count() FROM $table WHERE $timeFilter GROUP BY t ORDER BY t", "intervalFactor": 1, - "query": "\nSELECT\n validator_pubkey,\n count() as count_fail,\n nos_name\nFROM (\n SELECT\n validator_pubkey,\n nos_name\n FROM stats.validator_sync\n WHERE epoch_participation_percent < (${chain_sync_participation_var} - ${sync_participation_distance_var}) AND \n (last_slot_of_epoch <= ${slot_number_var} AND last_slot_of_epoch > (${slot_number_var} - ${fetch_interval_var} * 6))\n ORDER BY last_slot_of_epoch DESC, validator_pubkey\n)\nGROUP BY validator_pubkey, nos_name\nORDER BY count_fail DESC, validator_pubkey", - "rawQuery": "SELECT\n validator_pubkey,\n count() as count_fail,\n nos_name\nFROM (\n SELECT\n validator_pubkey,\n nos_name\n FROM stats.validator_sync\n WHERE epoch_participation_percent < (98.69 - 10) AND \n (last_slot_of_epoch <= 3468511 AND last_slot_of_epoch > (3468511 - 32 * 6))\n ORDER BY last_slot_of_epoch DESC, validator_pubkey\n)\nGROUP BY validator_pubkey, nos_name\nORDER BY count_fail DESC, validator_pubkey", + "query": " SELECT\n nos_name as Operator,\n SUM(a) as All,\n SUM(g) as Good,\n SUM(b) as Bad,\n AVG(ap) as \"Avg participation\"\n FROM\n (\n SELECT\n nos_name,\n IF(epoch_participation_percent >= 0, count(epoch_participation_percent), 0) as a,\n IF(epoch_participation_percent >= (epoch_chain_participation_percent_avg - ${sync_participation_distance_var}), count(epoch_participation_percent), 0) as g,\n IF(epoch_participation_percent < (epoch_chain_participation_percent_avg - ${sync_participation_distance_var}), count(epoch_participation_percent), 0) as b,\n IF(epoch_participation_percent >= 0, avg(epoch_participation_percent), 0) as ap\n FROM\n stats.validator_sync\n WHERE (last_slot_of_epoch <= ${slot_number_var} AND last_slot_of_epoch > (${slot_number_var} - ${fetch_interval_var} * ${epochs}))\n GROUP BY nos_name, epoch_participation_percent, epoch_chain_participation_percent_avg\n )\n GROUP by nos_name", + "rawQuery": "SELECT\n nos_name as Operator,\n SUM(a) as All,\n SUM(g) as Good,\n SUM(b) as Bad,\n AVG(ap) as \"Avg participation\"\n FROM\n (\n SELECT\n nos_name,\n IF(epoch_participation_percent >= 0, count(epoch_participation_percent), 0) as a,\n IF(epoch_participation_percent >= (epoch_chain_participation_percent_avg - 10), count(epoch_participation_percent), 0) as g,\n IF(epoch_participation_percent < (epoch_chain_participation_percent_avg - 10), count(epoch_participation_percent), 0) as b,\n IF(epoch_participation_percent >= 0, avg(epoch_participation_percent), 0) as ap\n FROM\n stats.validator_sync\n WHERE (last_slot_of_epoch <= 4707007 AND last_slot_of_epoch > (4707007 - 32 * 1))\n GROUP BY nos_name, epoch_participation_percent, epoch_chain_participation_percent_avg\n )\n GROUP by nos_name", "refId": "A", "round": "0s", "skip_comments": true } ], - "title": "Number of times the validator sync participation less chain average (last 6 finalized epochs)", + "title": "Sync committee duty (${epochs} epochs range)", "type": "table" }, { @@ -1752,143 +1756,86 @@ "type": "vertamedia-clickhouse-datasource", "uid": "PDEE91DDB90597936" }, - "description": "AVG", + "description": "", "fieldConfig": { "defaults": { "color": { - "mode": "thresholds" + "mode": "palette-classic" }, "custom": { - "align": "auto", - "displayMode": "auto" + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + } }, "links": [], - "mappings": [ - { - "options": { - "from": 0, - "result": { - "color": "red", - "index": 0 - }, - "to": 60 - }, - "type": "range" - }, - { - "options": { - "from": 60, - "result": { - "color": "yellow", - "index": 1 - }, - "to": 90 - }, - "type": "range" - }, - { - "options": { - "from": 90, - "result": { - "color": "green", - "index": 2 - }, - "to": 100 - }, - "type": "range" - } - ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "red", - "value": null - } - ] - } + "mappings": [] }, "overrides": [ { "matcher": { "id": "byName", - "options": "validator_pubkey" - }, - "properties": [ - { - "id": "links", - "value": [ - { - "targetBlank": true, - "title": "beaconcha.in", - "url": "https://beaconcha.in/validator/${__value.raw}" - } - ] - }, - { - "id": "unit", - "value": "string" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "nos_name" + "options": "Good" }, "properties": [ { - "id": "custom.width", - "value": 200 + "id": "color", + "value": { + "fixedColor": "green", + "mode": "fixed" + } } ] }, { "matcher": { "id": "byName", - "options": "epoch_participation_percent" + "options": "Bad" }, "properties": [ { - "id": "custom.displayMode", - "value": "color-text" - }, - { - "id": "custom.width", - "value": 70 - }, - { - "id": "unit", - "value": "percent" + "id": "color", + "value": { + "fixedColor": "red", + "mode": "fixed" + } } ] } ] }, "gridPos": { - "h": 11, - "w": 8, - "x": 7, - "y": 43 + "h": 7, + "w": 6, + "x": 12, + "y": 24 }, - "id": 72, + "id": 90, "options": { - "footer": { - "fields": "", - "reducer": [ - "sum" + "displayLabels": [], + "legend": { + "displayMode": "table", + "placement": "bottom", + "values": [ + "value", + "percent" + ] + }, + "pieType": "donut", + "reduceOptions": { + "calcs": [ + "lastNotNull" ], - "show": false + "fields": "", + "values": false }, - "showHeader": false, - "sortBy": [ - { - "desc": false, - "displayName": "delta" - } - ] + "tooltip": { + "mode": "single", + "sort": "none" + } }, - "pluginVersion": "8.4.3", + "pluginVersion": "8.4.6", "targets": [ { "datasource": { @@ -1900,122 +1847,128 @@ "format": "table", "formattedQuery": "SELECT $timeSeries as t, count() FROM $table WHERE $timeFilter GROUP BY t ORDER BY t", "intervalFactor": 1, - "query": "SELECT\n epoch_participation_percent,\n nos_name,\n validator_pubkey\nFROM\n stats.validator_sync\nWHERE last_slot_of_epoch = ${slot_number_var} AND epoch_participation_percent < (${chain_sync_participation_var} - ${sync_participation_distance_var})\nORDER BY epoch_participation_percent", - "rawQuery": "SELECT\n epoch_participation_percent,\n nos_name,\n validator_pubkey\nFROM\n stats.validator_sync\nWHERE last_slot_of_epoch = 3468511 AND epoch_participation_percent < (98.69 - 10)\nORDER BY epoch_participation_percent", + "query": " SELECT\n sum(good) as Good,\n sum(bad) as Bad\n FROM (\n SELECT\n nos_name,\n SUM(g) as good,\n SUM(b) as bad\n FROM\n (\n SELECT\n nos_name,\n IF(epoch_participation_percent >= 0, count(epoch_participation_percent), 0) as a,\n IF(epoch_participation_percent >= (epoch_chain_participation_percent_avg - ${sync_participation_distance_var}), count(epoch_participation_percent), 0) as g,\n IF(epoch_participation_percent < (epoch_chain_participation_percent_avg - ${sync_participation_distance_var}), count(epoch_participation_percent), 0) as b,\n IF(epoch_participation_percent >= 0, avg(epoch_participation_percent), 0) as ap\n FROM\n stats.validator_sync\n WHERE (last_slot_of_epoch <= ${slot_number_var} AND last_slot_of_epoch > (${slot_number_var} - ${fetch_interval_var} * ${epochs}))\n GROUP BY nos_name, epoch_participation_percent, epoch_chain_participation_percent_avg\n )\n GROUP by nos_name\n )", + "rawQuery": "SELECT\n sum(good) as Good,\n sum(bad) as Bad\n FROM (\n SELECT\n nos_name,\n SUM(g) as good,\n SUM(b) as bad\n FROM\n (\n SELECT\n nos_name,\n IF(epoch_participation_percent >= 0, count(epoch_participation_percent), 0) as a,\n IF(epoch_participation_percent >= (epoch_chain_participation_percent_avg - 10), count(epoch_participation_percent), 0) as g,\n IF(epoch_participation_percent < (epoch_chain_participation_percent_avg - 10), count(epoch_participation_percent), 0) as b,\n IF(epoch_participation_percent >= 0, avg(epoch_participation_percent), 0) as ap\n FROM\n stats.validator_sync\n WHERE (last_slot_of_epoch <= 4730175 AND last_slot_of_epoch > (4730175 - 32 * 3))\n GROUP BY nos_name, epoch_participation_percent, epoch_chain_participation_percent_avg\n )\n GROUP by nos_name\n )", "refId": "A", "round": "0s", "skip_comments": true } ], - "title": "Validators Sync Committee participation less chain average (last finalized epoch)", - "type": "table" + "title": "User sync participation (${epochs} epochs range)", + "type": "piechart" }, { - "description": "User only", + "datasource": { + "type": "vertamedia-clickhouse-datasource", + "uid": "PDEE91DDB90597936" + }, + "description": "", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" } }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ + "links": [], + "mappings": [] + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "User" + }, + "properties": [ { - "color": "semi-dark-green", - "value": null + "id": "color", + "value": { + "fixedColor": "purple", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Other" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "super-light-purple", + "mode": "fixed" + } } ] } - }, - "overrides": [] + ] }, "gridPos": { - "h": 11, - "w": 9, - "x": 15, - "y": 43 + "h": 7, + "w": 6, + "x": 18, + "y": 24 }, - "id": 73, + "id": 89, "options": { + "displayLabels": [], "legend": { + "displayMode": "table", + "placement": "bottom", + "values": [ + "value", + "percent" + ] + }, + "pieType": "donut", + "reduceOptions": { "calcs": [ "lastNotNull" ], - "displayMode": "table", - "placement": "right", - "sortBy": "Last *", - "sortDesc": true + "fields": "", + "values": false }, "tooltip": { "mode": "single", "sort": "none" } }, - "pluginVersion": "8.1.5", + "pluginVersion": "8.4.6", "targets": [ { "datasource": { - "type": "prometheus", - "uid": "PBFA97CFB590B2093" + "type": "vertamedia-clickhouse-datasource", + "uid": "PDEE91DDB90597936" }, - "exemplar": true, - "expr": "ethereum_validators_monitoring_validator_count_with_sync_participation_less_avg", - "interval": "", - "legendFormat": "{{nos_name}}", - "refId": "A" + "dateTimeType": "DATETIME", + "extrapolate": true, + "format": "table", + "formattedQuery": "SELECT $timeSeries as t, count() FROM $table WHERE $timeFilter GROUP BY t ORDER BY t", + "intervalFactor": 1, + "query": " SELECT\n SUM(all) as User,\n (512 - User) as Other\n FROM (\n SELECT\n nos_name,\n SUM(a) as all\n FROM\n (\n SELECT\n nos_name,\n count(epoch_participation_percent) as a\n FROM\n stats.validator_sync\n WHERE (last_slot_of_epoch <= ${slot_number_var} AND last_slot_of_epoch > (${slot_number_var} - ${fetch_interval_var}))\n GROUP BY nos_name, epoch_participation_percent, epoch_chain_participation_percent_avg\n )\n GROUP by nos_name\n )", + "rawQuery": "SELECT\n SUM(all) as User,\n (512 - User) as Other\n FROM (\n SELECT\n nos_name,\n SUM(a) as all\n FROM\n (\n SELECT\n nos_name,\n count(epoch_participation_percent) as a\n FROM\n stats.validator_sync\n WHERE (last_slot_of_epoch <= 4730175 AND last_slot_of_epoch > (4730175 - 32))\n GROUP BY nos_name, epoch_participation_percent, epoch_chain_participation_percent_avg\n )\n GROUP by nos_name\n )", + "refId": "A", + "round": "0s", + "skip_comments": true } ], - "title": "Number of validators with sync participation less average (last finalized epoch)", - "type": "timeseries" - }, - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 54 - }, - "id": 62, - "panels": [], - "title": "Validator Attestation Duty", - "type": "row" + "title": "Sync Committee share", + "type": "piechart" }, { "datasource": { "type": "vertamedia-clickhouse-datasource", "uid": "PDEE91DDB90597936" }, - "description": "User only", + "description": "", "fieldConfig": { "defaults": { "color": { @@ -2023,50 +1976,16 @@ }, "custom": { "align": "auto", - "displayMode": "auto", + "displayMode": "color-text", "filterable": false }, "links": [], - "mappings": [ - { - "options": { - "from": 4, - "result": { - "color": "red", - "index": 0 - }, - "to": 6 - }, - "type": "range" - }, - { - "options": { - "from": 1, - "result": { - "color": "yellow", - "index": 1 - }, - "to": 3 - }, - "type": "range" - }, - { - "options": { - "from": 0, - "result": { - "color": "green", - "index": 2 - }, - "to": 0 - }, - "type": "range" - } - ], + "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { - "color": "red", + "color": "text", "value": null } ] @@ -2076,87 +1995,91 @@ { "matcher": { "id": "byName", - "options": "count_fail" + "options": "nos_name" }, "properties": [ - { - "id": "custom.width", - "value": 70 - }, { "id": "unit", - "value": "none" - }, - { - "id": "custom.displayMode", - "value": "color-text" + "value": "string" } ] }, { "matcher": { "id": "byName", - "options": "validator_pubkey" + "options": "Missed" }, "properties": [ { - "id": "links", - "value": [ - { - "targetBlank": true, - "title": "beaconcha.in", - "url": "https://beaconcha.in/validator/${__value.raw}" - } - ] + "id": "color", + "value": { + "fixedColor": "red", + "mode": "fixed" + } }, { - "id": "displayName", - "value": "validator" + "id": "custom.width", + "value": 75 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Attested" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "green", + "mode": "fixed" + } }, { - "id": "unit", - "value": "string" + "id": "custom.width", + "value": 75 } ] }, { "matcher": { "id": "byName", - "options": "nos_name" + "options": "All" }, "properties": [ { "id": "custom.width", - "value": 200 + "value": 75 } ] } ] }, "gridPos": { - "h": 11, - "w": 7, + "h": 7, + "w": 12, "x": 0, - "y": 55 + "y": 31 }, - "id": 57, + "id": 81, "options": { "footer": { "fields": "", "reducer": [ "sum" ], - "show": false + "show": true }, - "showHeader": false, + "showHeader": true, "sortBy": [ { - "desc": false, - "displayName": "delta" + "desc": true, + "displayName": "missed" } ] }, - "pluginVersion": "8.4.3", + "pluginVersion": "8.4.6", "targets": [ { "datasource": { @@ -2168,14 +2091,14 @@ "format": "table", "formattedQuery": "SELECT $timeSeries as t, count() FROM $table WHERE $timeFilter GROUP BY t ORDER BY t", "intervalFactor": 1, - "query": "\nSELECT\n validator_pubkey,\n count() as count_fail,\n nos_name\nFROM (\n SELECT\n validator_pubkey,\n nos_name\n FROM stats.validator_attestations\n WHERE attested = 0 AND \n (slot_to_attestation <= ${slot_number_var} AND slot_to_attestation > (${slot_number_var} - ${fetch_interval_var} * 6))\n ORDER BY slot_to_attestation DESC, validator_pubkey\n)\nGROUP BY validator_pubkey, nos_name\nORDER BY count_fail DESC, validator_pubkey\nLIMIT 100", - "rawQuery": "SELECT\n validator_pubkey,\n count() as count_fail,\n nos_name\nFROM (\n SELECT\n validator_pubkey,\n nos_name\n FROM stats.validator_attestations\n WHERE attested = 0 AND \n (slot_to_attestation <= 2640927 AND slot_to_attestation > (2640927 - 32 * 6))\n ORDER BY slot_to_attestation DESC, validator_pubkey\n)\nGROUP BY validator_pubkey, nos_name\nORDER BY count_fail DESC, validator_pubkey\nLIMIT 100", + "query": " SELECT\n nos_name,\n SUM(a) as All,\n SUM(p) as Attested,\n SUM(m) as Missed\n FROM\n (\n SELECT\n nos_name,\n count(attested) as a,\n IF(attested = 0, count(attested), 0) as m,\n IF(attested = 1, count(attested), 0) as p\n FROM stats.validator_attestations\n WHERE (slot_to_attestation <= ${slot_number_var} AND slot_to_attestation > (${slot_number_var} - ${fetch_interval_var} * ${epochs}))\n GROUP BY nos_name, attested\n )\n GROUP by nos_name", + "rawQuery": "SELECT\n nos_name,\n SUM(a) as All,\n SUM(p) as Attested,\n SUM(m) as Missed\n FROM\n (\n SELECT\n nos_name,\n count(attested) as a,\n IF(attested = 0, count(attested), 0) as m,\n IF(attested = 1, count(attested), 0) as p\n FROM stats.validator_attestations\n WHERE (slot_to_attestation <= 4730175 AND slot_to_attestation > (4730175 - 32 * 3))\n GROUP BY nos_name, attested\n )\n GROUP by nos_name", "refId": "A", "round": "0s", "skip_comments": true } ], - "title": "Number of times the validator miss attestation (last 6 finalized epochs)", + "title": "Attestation duty (${epochs} epochs range)", "type": "table" }, { @@ -2183,89 +2106,86 @@ "type": "vertamedia-clickhouse-datasource", "uid": "PDEE91DDB90597936" }, - "description": "User only", + "description": "", "fieldConfig": { "defaults": { "color": { - "mode": "thresholds" + "mode": "palette-classic" }, "custom": { - "align": "auto", - "displayMode": "auto" + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + } }, "links": [], - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "red", - "value": null - } - ] - } + "mappings": [] }, "overrides": [ { "matcher": { "id": "byName", - "options": "validator_pubkey" + "options": "Attested" }, "properties": [ { - "id": "links", - "value": [ - { - "targetBlank": true, - "title": "beaconcha.in", - "url": "https://beaconcha.in/validator/${__value.raw}" - } - ] - }, - { - "id": "unit", - "value": "string" + "id": "color", + "value": { + "fixedColor": "green", + "mode": "fixed" + } } ] }, { "matcher": { "id": "byName", - "options": "nos_name" + "options": "Missed" }, "properties": [ { - "id": "custom.width", - "value": 200 + "id": "color", + "value": { + "fixedColor": "red", + "mode": "fixed" + } } ] } ] }, "gridPos": { - "h": 11, - "w": 8, - "x": 7, - "y": 55 + "h": 7, + "w": 6, + "x": 12, + "y": 31 }, - "id": 56, + "id": 91, "options": { - "footer": { - "fields": "", - "reducer": [ - "sum" + "displayLabels": [], + "legend": { + "displayMode": "table", + "placement": "bottom", + "values": [ + "value", + "percent" + ] + }, + "pieType": "donut", + "reduceOptions": { + "calcs": [ + "lastNotNull" ], - "show": false + "fields": "", + "values": false }, - "showHeader": false, - "sortBy": [ - { - "desc": false, - "displayName": "delta" - } - ] + "tooltip": { + "mode": "single", + "sort": "none" + } }, - "pluginVersion": "8.4.3", + "pluginVersion": "8.4.6", "targets": [ { "datasource": { @@ -2277,479 +2197,1607 @@ "format": "table", "formattedQuery": "SELECT $timeSeries as t, count() FROM $table WHERE $timeFilter GROUP BY t ORDER BY t", "intervalFactor": 1, - "query": "SELECT\n nos_name,\n validator_pubkey\nFROM stats.validator_attestations\nWHERE attested = 0 AND (slot_to_attestation <= ${slot_number_var} AND slot_to_attestation >= (${slot_number_var} - ${fetch_interval_var}))\nORDER BY slot_to_attestation DESC, validator_pubkey\nLIMIT 100", - "rawQuery": "SELECT\n nos_name,\n validator_pubkey\nFROM stats.validator_attestations\nWHERE attested = 0 AND (slot_to_attestation <= 2640927 AND slot_to_attestation >= (2640927 - 32))\nORDER BY slot_to_attestation DESC, validator_pubkey\nLIMIT 100", + "query": " SELECT\n sum(attested) as Attested,\n sum(missed) as Missed\n FROM (\n SELECT\n nos_name,\n SUM(p) as attested,\n SUM(m) as missed\n FROM\n (\n SELECT\n nos_name,\n IF(attested = 0, count(attested), 0) as m,\n IF(attested = 1, count(attested), 0) as p\n FROM stats.validator_attestations\n WHERE (slot_to_attestation <= ${slot_number_var} AND slot_to_attestation > (${slot_number_var} - ${fetch_interval_var} * ${epochs}))\n GROUP BY nos_name, attested\n )\n GROUP by nos_name\n )", + "rawQuery": "SELECT\n sum(attested) as Attested,\n sum(missed) as Missed\n FROM (\n SELECT\n nos_name,\n SUM(p) as attested,\n SUM(m) as missed\n FROM\n (\n SELECT\n nos_name,\n IF(attested = 0, count(attested), 0) as m,\n IF(attested = 1, count(attested), 0) as p\n FROM stats.validator_attestations\n WHERE (slot_to_attestation <= 4730175 AND slot_to_attestation > (4730175 - 32 * 3))\n GROUP BY nos_name, attested\n )\n GROUP by nos_name\n )", "refId": "A", "round": "0s", "skip_comments": true } ], - "title": "Validators with missed attestation (last finalized epoch)", - "type": "table" - }, - { - "description": "User only", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "semi-dark-green", - "value": null - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 11, - "w": 9, - "x": 15, - "y": 55 - }, - "id": 58, - "options": { - "legend": { - "calcs": [ - "lastNotNull" - ], - "displayMode": "table", - "placement": "right", - "sortBy": "Last *", - "sortDesc": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "pluginVersion": "8.1.5", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "PBFA97CFB590B2093" - }, - "exemplar": true, - "expr": "ethereum_validators_monitoring_validator_count_miss_attestation", - "interval": "", - "legendFormat": "{{nos_name}}", - "refId": "A" - } - ], - "title": "Number of validators with missed attestation (last finalized epoch)", - "type": "timeseries" + "title": "User attestations (${epochs} epochs range)", + "type": "piechart" }, { - "collapsed": false, + "collapsed": true, "gridPos": { "h": 1, "w": 24, "x": 0, - "y": 66 - }, - "id": 66, - "panels": [], - "title": "Validator Propose Duty", - "type": "row" - }, - { - "datasource": { - "type": "vertamedia-clickhouse-datasource", - "uid": "PDEE91DDB90597936" + "y": 38 }, - "description": "User only", - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "custom": { - "align": "auto", - "displayMode": "auto", - "filterable": false - }, - "links": [], - "mappings": [ - { - "options": { - "from": 4, - "result": { - "color": "red", - "index": 0 + "id": 23, + "panels": [ + { + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 15, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "smooth", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 1, + "pointSize": 3, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" }, - "to": 6 + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 2, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "red", + "value": null + } + ] }, - "type": "range" + "unit": "locale" }, - { - "options": { - "from": 1, - "result": { - "color": "yellow", - "index": 1 + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "delta" }, - "to": 3 - }, - "type": "range" + "properties": [ + { + "id": "unit", + "value": "ETH" + } + ] + } + ] + }, + "gridPos": { + "h": 5, + "w": 24, + "x": 0, + "y": 39 + }, + "id": 24, + "options": { + "legend": { + "calcs": [], + "displayMode": "hidden", + "placement": "bottom" }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "8.4.6", + "targets": [ { - "options": { - "from": 0, - "result": { - "color": "green", - "index": 2 - }, - "to": 0 + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" }, - "type": "range" + "exemplar": true, + "expr": "sum(ethereum_validators_monitoring_total_balance_24h_difference) / 10 ^ 9", + "hide": false, + "interval": "", + "legendFormat": "delta", + "refId": "A" } ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "red", - "value": null - } - ] - } + "title": "Total balance 24h delta", + "transformations": [], + "type": "timeseries" }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "count_fail" - }, - "properties": [ - { - "id": "custom.width", - "value": 70 + { + "description": "Delta: current slot - 192 slot", + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "super-light-blue", + "mode": "thresholds" }, - { - "id": "unit", - "value": "none" + "decimals": 0, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "red", + "value": null + }, + { + "color": "yellow", + "value": 50 + }, + { + "color": "green", + "value": 75 + } + ] }, - { - "id": "custom.displayMode", - "value": "color-text" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "validator_pubkey" + "unit": "locale" }, - "properties": [ + "overrides": [ { - "id": "links", - "value": [ + "matcher": { + "id": "byFrameRefID", + "options": "A" + }, + "properties": [ { - "targetBlank": true, - "title": "beaconcha.in", - "url": "https://beaconcha.in/validator/${__value.raw}" + "id": "unit", + "value": "GWei" } ] - }, - { - "id": "displayName", - "value": "validator" - }, - { - "id": "unit", - "value": "string" } ] }, - { - "matcher": { - "id": "byName", - "options": "nos_name" + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 44 + }, + "id": 21, + "options": { + "displayMode": "basic", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false }, - "properties": [ - { - "id": "custom.width", - "value": 200 - } - ] - } - ] - }, - "gridPos": { - "h": 11, - "w": 7, - "x": 0, - "y": 67 - }, - "id": 64, - "options": { - "footer": { - "fields": "", - "reducer": [ - "sum" + "showUnfilled": true, + "text": {} + }, + "pluginVersion": "8.4.6", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "exemplar": false, + "expr": "(sort_desc(ethereum_validators_monitoring_validator_balances_delta))", + "instant": true, + "interval": "", + "legendFormat": "{{nos_name}}", + "refId": "A" + } ], - "show": false + "title": "Average validator balances delta", + "transformations": [], + "type": "bargauge" + }, + { + "description": "Delta: current slot - 192 slot", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "smooth", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 1, + "pointSize": 3, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "semi-dark-green", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 16, + "x": 8, + "y": 44 + }, + "id": 10, + "options": { + "legend": { + "calcs": [ + "lastNotNull" + ], + "displayMode": "table", + "placement": "right", + "sortBy": "Last *", + "sortDesc": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "8.1.5", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "exemplar": true, + "expr": "sum by (nos_name) (ethereum_validators_monitoring_validator_count_with_negative_balances_delta)", + "interval": "", + "legendFormat": "{{nos_name}}", + "refId": "A" + } + ], + "thresholds": [ + { + "colorMode": "critical", + "op": "gt", + "value": 0, + "visible": true + } + ], + "title": "Number of validators with negative delta", + "type": "timeseries" }, - "showHeader": false, - "sortBy": [ - { - "desc": false, - "displayName": "delta" - } - ] - }, - "pluginVersion": "8.4.3", - "targets": [ { "datasource": { "type": "vertamedia-clickhouse-datasource", "uid": "PDEE91DDB90597936" }, - "dateTimeType": "DATETIME", - "extrapolate": true, - "format": "table", - "formattedQuery": "SELECT $timeSeries as t, count() FROM $table WHERE $timeFilter GROUP BY t ORDER BY t", - "intervalFactor": 1, - "query": "\nSELECT\n validator_pubkey,\n count() as count_fail,\n nos_name\nFROM (\n SELECT\n validator_pubkey,\n nos_name\n FROM stats.validator_proposes\n WHERE proposed = 0 AND \n (slot_to_propose <= ${slot_number_var} AND slot_to_propose > (${slot_number_var} - ${fetch_interval_var} * 6))\n ORDER BY slot_to_propose DESC, validator_pubkey\n)\nGROUP BY validator_pubkey, nos_name\nORDER BY count_fail DESC, validator_pubkey\nLIMIT 100", - "rawQuery": "SELECT\n validator_pubkey,\n count() as count_fail,\n nos_name\nFROM (\n SELECT\n validator_pubkey,\n nos_name\n FROM stats.validator_proposes\n WHERE proposed = 0 AND \n (slot_to_propose <= 2640927 AND slot_to_propose > (2640927 - 32 * 6))\n ORDER BY slot_to_propose DESC, validator_pubkey\n)\nGROUP BY validator_pubkey, nos_name\nORDER BY count_fail DESC, validator_pubkey\nLIMIT 100", - "refId": "A", - "round": "0s", - "skip_comments": true + "description": "Delta: current slot - 192 slot", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "align": "auto", + "displayMode": "auto" + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "red", + "value": null + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "GWei" + }, + "properties": [ + { + "id": "custom.width", + "value": 80 + }, + { + "id": "unit", + "value": "locale" + }, + { + "id": "custom.displayMode", + "value": "color-text" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Pubkey" + }, + "properties": [ + { + "id": "links", + "value": [ + { + "targetBlank": true, + "title": "beaconcha.in", + "url": "https://beaconcha.in/validator/${__value.raw}" + } + ] + }, + { + "id": "unit", + "value": "string" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Operator" + }, + "properties": [ + { + "id": "custom.width", + "value": 120 + } + ] + } + ] + }, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 51 + }, + "id": 28, + "options": { + "footer": { + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": true, + "sortBy": [ + { + "desc": false, + "displayName": "delta" + } + ] + }, + "pluginVersion": "8.4.6", + "targets": [ + { + "datasource": { + "type": "vertamedia-clickhouse-datasource", + "uid": "PDEE91DDB90597936" + }, + "dateTimeType": "DATETIME", + "extrapolate": true, + "format": "table", + "formattedQuery": "SELECT $timeSeries as t, count() FROM $table WHERE $timeFilter GROUP BY t ORDER BY t", + "intervalFactor": 1, + "query": "SELECT\n current.balance - previous.balance AS GWei,\n current.nos_name as Operator,\n current.validator_pubkey as Pubkey\nFROM \n (\n SELECT balance, validator_pubkey, status, nos_id, nos_name \n FROM stats.validator_balances \n WHERE \n status != 'pending_queued' AND \n nos_name IS NOT NULL AND\n slot = ${slot_number_var}\n ) AS current\nLEFT JOIN\n (\n SELECT balance, validator_pubkey, nos_id, nos_name \n FROM stats.validator_balances \n WHERE\n status != 'pending_queued' AND \n nos_name IS NOT NULL AND\n slot = (${slot_number_var} - ${fetch_interval_var} * 6)\n ) AS previous\nON\n previous.nos_id = current.nos_id AND \n previous.validator_pubkey = current.validator_pubkey\nORDER BY GWei ASC\nLIMIT 100", + "rawQuery": "SELECT\n current.balance - previous.balance AS GWei,\n current.nos_name as Operator,\n current.validator_pubkey as Pubkey\nFROM \n (\n SELECT balance, validator_pubkey, status, nos_id, nos_name \n FROM stats.validator_balances \n WHERE \n status != 'pending_queued' AND \n nos_name IS NOT NULL AND\n slot = 4707519\n ) AS current\nLEFT JOIN\n (\n SELECT balance, validator_pubkey, nos_id, nos_name \n FROM stats.validator_balances \n WHERE\n status != 'pending_queued' AND \n nos_name IS NOT NULL AND\n slot = (4707519 - 32 * 6)\n ) AS previous\nON\n previous.nos_id = current.nos_id AND \n previous.validator_pubkey = current.validator_pubkey\nORDER BY GWei ASC\nLIMIT 100", + "refId": "A", + "round": "0s", + "skip_comments": true + } + ], + "title": "Validators with worst balance delta", + "type": "table" + }, + { + "description": "Delta: current slot - 192 slot", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "smooth", + "lineWidth": 1, + "pointSize": 3, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byFrameRefID", + "options": "A" + }, + "properties": [ + { + "id": "unit", + "value": "GWei" + } + ] + } + ] + }, + "gridPos": { + "h": 7, + "w": 16, + "x": 8, + "y": 51 + }, + "id": 11, + "options": { + "legend": { + "calcs": [ + "lastNotNull" + ], + "displayMode": "table", + "placement": "right", + "sortBy": "Last *", + "sortDesc": false + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "8.1.5", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "exemplar": true, + "expr": "sum by (nos_name) (ethereum_validators_monitoring_validator_quantile_001_balances_delta)", + "interval": "", + "legendFormat": "{{nos_name}}", + "refId": "A" + } + ], + "title": "Worst validator balances delta [0.1% percentile]", + "type": "timeseries" } ], - "title": "Number of times the validator miss propose (last 6 finalized epochs)", - "type": "table" + "title": "💸 Balances", + "type": "row" }, { - "datasource": { - "type": "vertamedia-clickhouse-datasource", - "uid": "PDEE91DDB90597936" + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 39 }, - "description": "User only", - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "custom": { - "align": "auto", - "displayMode": "auto" + "id": 66, + "panels": [ + { + "datasource": { + "type": "vertamedia-clickhouse-datasource", + "uid": "PDEE91DDB90597936" }, - "links": [], - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "red", - "value": null + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "align": "auto", + "displayMode": "auto" + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "red" + } + ] } - ] - } - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "validator_pubkey" }, - "properties": [ + "overrides": [ { - "id": "links", - "value": [ + "matcher": { + "id": "byName", + "options": "validator_pubkey" + }, + "properties": [ + { + "id": "links", + "value": [ + { + "targetBlank": true, + "title": "beaconcha.in", + "url": "https://beaconcha.in/validator/${__value.raw}" + } + ] + }, { - "targetBlank": true, - "title": "beaconcha.in", - "url": "https://beaconcha.in/validator/${__value.raw}" + "id": "unit", + "value": "string" } ] }, { - "id": "unit", - "value": "string" + "matcher": { + "id": "byName", + "options": "nos_name" + }, + "properties": [ + { + "id": "custom.width", + "value": 120 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "slot_to_propose" + }, + "properties": [ + { + "id": "custom.width", + "value": 80 + }, + { + "id": "links", + "value": [ + { + "targetBlank": true, + "title": "beaconcha.in", + "url": "https://beaconcha.in/slot/${__value.raw}" + } + ] + } + ] } ] }, - { - "matcher": { - "id": "byName", - "options": "nos_name" + "gridPos": { + "h": 8, + "w": 8, + "x": 0, + "y": 40 + }, + "id": 63, + "options": { + "footer": { + "fields": "", + "reducer": [ + "sum" + ], + "show": false }, - "properties": [ + "showHeader": false, + "sortBy": [ { - "id": "custom.width", - "value": 200 + "desc": false, + "displayName": "delta" } ] - } - ] - }, + }, + "pluginVersion": "8.4.6", + "targets": [ + { + "datasource": { + "type": "vertamedia-clickhouse-datasource", + "uid": "PDEE91DDB90597936" + }, + "dateTimeType": "DATETIME", + "extrapolate": true, + "format": "table", + "formattedQuery": "SELECT $timeSeries as t, count() FROM $table WHERE $timeFilter GROUP BY t ORDER BY t", + "intervalFactor": 1, + "query": "SELECT\n slot_to_propose,\n nos_name,\n validator_pubkey\nFROM stats.validator_proposes\nWHERE proposed = 0 AND (slot_to_propose <= ${slot_number_var} AND slot_to_propose >= (${slot_number_var} - ${fetch_interval_var} * ${epochs}))\nORDER BY slot_to_propose DESC, validator_pubkey", + "rawQuery": "SELECT\n slot_to_propose,\n nos_name,\n validator_pubkey\nFROM stats.validator_proposes\nWHERE proposed = 0 AND (slot_to_propose <= 4707039 AND slot_to_propose >= (4707039 - 32 * 1))\nORDER BY slot_to_propose DESC, validator_pubkey", + "refId": "A", + "round": "0s", + "skip_comments": true + } + ], + "title": "Missed proposals (${epochs} epochs range)", + "type": "table" + }, + { + "description": "User only", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "smooth", + "lineWidth": 1, + "pointSize": 3, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "semi-dark-green" + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 16, + "x": 8, + "y": 40 + }, + "id": 67, + "options": { + "legend": { + "calcs": [ + "lastNotNull" + ], + "displayMode": "table", + "placement": "right", + "sortBy": "Last *", + "sortDesc": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "8.1.5", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "exemplar": true, + "expr": "sum by (nos_name) (ethereum_validators_monitoring_validator_count_miss_propose)", + "interval": "", + "legendFormat": "{{nos_name}}", + "refId": "A" + } + ], + "title": "Number of validators with missed proposals", + "type": "timeseries" + } + ], + "title": "📥 Proposals", + "type": "row" + }, + { + "collapsed": true, "gridPos": { - "h": 11, - "w": 8, - "x": 7, - "y": 67 + "h": 1, + "w": 24, + "x": 0, + "y": 40 }, - "id": 63, - "options": { - "footer": { - "fields": "", - "reducer": [ - "sum" + "id": 69, + "panels": [ + { + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "smooth", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 1, + "pointSize": 3, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "area" + } + }, + "decimals": 2, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "red" + }, + { + "color": "red", + "value": 0 + }, + { + "color": "super-light-yellow", + "value": 60 + }, + { + "color": "green", + "value": 90 + } + ] + }, + "unit": "percent" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "user" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "green", + "mode": "thresholds" + } + }, + { + "id": "custom.fillOpacity", + "value": 30 + }, + { + "id": "custom.lineWidth", + "value": 3 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "other" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "blue", + "mode": "fixed" + } + }, + { + "id": "custom.lineWidth", + "value": 3 + } + ] + } + ] + }, + "gridPos": { + "h": 6, + "w": 24, + "x": 0, + "y": 41 + }, + "id": 92, + "options": { + "legend": { + "calcs": [ + "lastNotNull" + ], + "displayMode": "table", + "placement": "right", + "sortBy": "Last *", + "sortDesc": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "8.1.5", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "exemplar": true, + "expr": "sum(ethereum_validators_monitoring_user_sync_participation_avg_percent)", + "interval": "", + "legendFormat": "user", + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "exemplar": true, + "expr": "sum(ethereum_validators_monitoring_chain_sync_participation_avg_percent)", + "hide": false, + "interval": "", + "legendFormat": "other", + "refId": "B" + } ], - "show": false + "title": "User vs Other", + "type": "timeseries" }, - "showHeader": false, - "sortBy": [ - { - "desc": false, - "displayName": "delta" - } - ] - }, - "pluginVersion": "8.4.3", - "targets": [ { "datasource": { "type": "vertamedia-clickhouse-datasource", "uid": "PDEE91DDB90597936" }, - "dateTimeType": "DATETIME", - "extrapolate": true, - "format": "table", - "formattedQuery": "SELECT $timeSeries as t, count() FROM $table WHERE $timeFilter GROUP BY t ORDER BY t", - "intervalFactor": 1, - "query": "SELECT\n nos_name,\n validator_pubkey,\n slot_to_propose\nFROM stats.validator_proposes\nWHERE proposed = 0 AND (slot_to_propose <= ${slot_number_var} AND slot_to_propose >= (${slot_number_var} - ${fetch_interval_var}))\nORDER BY slot_to_propose DESC, validator_pubkey\nLIMIT 100", - "rawQuery": "SELECT\n nos_name,\n validator_pubkey,\n slot_to_propose\nFROM stats.validator_proposes\nWHERE proposed = 0 AND (slot_to_propose <= 2640927 AND slot_to_propose >= (2640927 - 32))\nORDER BY slot_to_propose DESC, validator_pubkey\nLIMIT 100", - "refId": "A", - "round": "0s", - "skip_comments": true + "description": "AVG", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "align": "auto", + "displayMode": "auto" + }, + "links": [], + "mappings": [ + { + "options": { + "from": 0, + "result": { + "color": "red", + "index": 0 + }, + "to": 60 + }, + "type": "range" + }, + { + "options": { + "from": 60, + "result": { + "color": "yellow", + "index": 1 + }, + "to": 90 + }, + "type": "range" + }, + { + "options": { + "from": 90, + "result": { + "color": "green", + "index": 2 + }, + "to": 100 + }, + "type": "range" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "red" + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "validator_pubkey" + }, + "properties": [ + { + "id": "links", + "value": [ + { + "targetBlank": true, + "title": "beaconcha.in", + "url": "https://beaconcha.in/validator/${__value.raw}" + } + ] + }, + { + "id": "unit", + "value": "string" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "nos_name" + }, + "properties": [ + { + "id": "custom.width", + "value": 120 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "epoch_participation_percent" + }, + "properties": [ + { + "id": "custom.displayMode", + "value": "color-text" + }, + { + "id": "custom.width", + "value": 60 + }, + { + "id": "unit", + "value": "percent" + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 0, + "y": 47 + }, + "id": 72, + "options": { + "footer": { + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": false, + "sortBy": [ + { + "desc": false, + "displayName": "delta" + } + ] + }, + "pluginVersion": "8.4.6", + "targets": [ + { + "datasource": { + "type": "vertamedia-clickhouse-datasource", + "uid": "PDEE91DDB90597936" + }, + "dateTimeType": "DATETIME", + "extrapolate": true, + "format": "table", + "formattedQuery": "SELECT $timeSeries as t, count() FROM $table WHERE $timeFilter GROUP BY t ORDER BY t", + "intervalFactor": 1, + "query": "SELECT\n epoch_participation_percent,\n nos_name,\n validator_pubkey\nFROM\n stats.validator_sync\nWHERE last_slot_of_epoch = ${slot_number_var} AND epoch_participation_percent < (epoch_chain_participation_percent_avg - ${sync_participation_distance_var})\nORDER BY epoch_participation_percent", + "rawQuery": "SELECT\n epoch_participation_percent,\n nos_name,\n validator_pubkey\nFROM\n stats.validator_sync\nWHERE last_slot_of_epoch = 4702463 AND epoch_participation_percent < (epoch_chain_participation_percent_avg - 10)\nORDER BY epoch_participation_percent", + "refId": "A", + "round": "0s", + "skip_comments": true + } + ], + "title": "Bad Sync Committee participation", + "type": "table" + }, + { + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "smooth", + "lineWidth": 1, + "pointSize": 3, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "semi-dark-green" + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 16, + "x": 8, + "y": 47 + }, + "id": 73, + "options": { + "legend": { + "calcs": [ + "lastNotNull" + ], + "displayMode": "table", + "placement": "right", + "sortBy": "Last *", + "sortDesc": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "8.1.5", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "exemplar": true, + "expr": "sum by (nos_name) (ethereum_validators_monitoring_validator_count_with_sync_participation_less_avg)", + "interval": "", + "legendFormat": "{{nos_name}}", + "refId": "A" + } + ], + "title": "Number of validators with sync participation less average", + "type": "timeseries" } ], - "title": "Validators with missed proposes (last finalized epoch)", - "type": "table" + "title": "🔄 Sync Committee participation", + "type": "row" }, { - "description": "User only", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 41 + }, + "id": 62, + "panels": [ + { + "datasource": { + "type": "vertamedia-clickhouse-datasource", + "uid": "PDEE91DDB90597936" }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "align": "auto", + "displayMode": "auto", + "filterable": false + }, + "links": [], + "mappings": [ + { + "options": { + "from": 4, + "result": { + "color": "red", + "index": 0 + }, + "to": 6 + }, + "type": "range" + }, + { + "options": { + "from": 1, + "result": { + "color": "yellow", + "index": 1 + }, + "to": 3 + }, + "type": "range" + }, + { + "options": { + "from": 0, + "result": { + "color": "green", + "index": 2 + }, + "to": 0 + }, + "type": "range" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "red" + } + ] + } }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "count_fail" + }, + "properties": [ + { + "id": "custom.width", + "value": 60 + }, + { + "id": "unit", + "value": "none" + }, + { + "id": "custom.displayMode", + "value": "color-text" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "validator_pubkey" + }, + "properties": [ + { + "id": "links", + "value": [ + { + "targetBlank": true, + "title": "beaconcha.in", + "url": "https://prater.beaconcha.in/validator/${__value.raw}" + } + ] + }, + { + "id": "displayName", + "value": "validator" + }, + { + "id": "unit", + "value": "string" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "nos_name" + }, + "properties": [ + { + "id": "custom.width", + "value": 120 + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 0, + "y": 42 + }, + "id": 57, + "options": { + "footer": { + "fields": "", + "reducer": [ + "sum" + ], + "show": false }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" + "showHeader": false, + "sortBy": [ + { + "desc": false, + "displayName": "delta" + } + ] + }, + "pluginVersion": "8.4.6", + "targets": [ + { + "datasource": { + "type": "vertamedia-clickhouse-datasource", + "uid": "PDEE91DDB90597936" + }, + "dateTimeType": "DATETIME", + "extrapolate": true, + "format": "table", + "formattedQuery": "SELECT $timeSeries as t, count() FROM $table WHERE $timeFilter GROUP BY t ORDER BY t", + "intervalFactor": 1, + "query": "\nSELECT\n count() as count_fail,\n nos_name,\n validator_pubkey\nFROM (\n SELECT\n validator_pubkey,\n nos_name\n FROM stats.validator_attestations\n WHERE attested = 0 AND \n (slot_to_attestation <= ${slot_number_var} AND slot_to_attestation > (${slot_number_var} - ${fetch_interval_var} * ${epochs}))\n ORDER BY slot_to_attestation DESC, validator_pubkey\n)\nGROUP BY validator_pubkey, nos_name\nORDER BY count_fail DESC, validator_pubkey\nLIMIT 100", + "rawQuery": "SELECT\n count() as count_fail,\n nos_name,\n validator_pubkey\nFROM (\n SELECT\n validator_pubkey,\n nos_name\n FROM stats.validator_attestations\n WHERE attested = 0 AND \n (slot_to_attestation <= 4707039 AND slot_to_attestation > (4707039 - 32 * 1))\n ORDER BY slot_to_attestation DESC, validator_pubkey\n)\nGROUP BY validator_pubkey, nos_name\nORDER BY count_fail DESC, validator_pubkey\nLIMIT 100", + "refId": "A", + "round": "0s", + "skip_comments": true + } + ], + "title": "Number of missed attestations (${epochs} epochs range)", + "type": "table" + }, + { + "description": "User only", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "smooth", + "lineWidth": 1, + "pointSize": 3, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "semi-dark-green" + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 16, + "x": 8, + "y": 42 + }, + "id": 58, + "options": { + "legend": { + "calcs": [ + "lastNotNull" + ], + "displayMode": "table", + "placement": "right", + "sortBy": "Last *", + "sortDesc": true }, - "thresholdsStyle": { - "mode": "off" + "tooltip": { + "mode": "single", + "sort": "none" } }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "semi-dark-green", - "value": null - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 11, - "w": 9, - "x": 15, - "y": 67 - }, - "id": 67, - "options": { - "legend": { - "calcs": [ - "lastNotNull" + "pluginVersion": "8.1.5", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "exemplar": true, + "expr": "sum by (nos_name) (ethereum_validators_monitoring_validator_count_miss_attestation)", + "interval": "", + "legendFormat": "{{nos_name}}", + "refId": "A" + } ], - "displayMode": "table", - "placement": "right", - "sortBy": "Last *", - "sortDesc": true - }, - "tooltip": { - "mode": "single", - "sort": "none" + "title": "Number of validators with missed attestation", + "type": "timeseries" } + ], + "title": "📝 Attestations", + "type": "row" + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 42 }, - "pluginVersion": "8.1.5", - "targets": [ + "id": 50, + "panels": [ { "datasource": { - "type": "prometheus", - "uid": "PBFA97CFB590B2093" + "type": "vertamedia-clickhouse-datasource", + "uid": "PDEE91DDB90597936" }, - "exemplar": true, - "expr": "ethereum_validators_monitoring_validator_count_miss_propose", - "interval": "", - "legendFormat": "{{nos_name}}", - "refId": "A" + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "align": "auto", + "displayMode": "auto" + }, + "mappings": [], + "noValue": "-", + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "validator_pubkey" + }, + "properties": [ + { + "id": "displayName", + "value": "validator" + }, + { + "id": "unit", + "value": "string" + }, + { + "id": "links", + "value": [ + { + "title": "beaconcha.in", + "url": "https://prater.beaconcha.in/validator/${__value.raw}" + } + ] + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "nos_name" + }, + "properties": [ + { + "id": "custom.width", + "value": 180 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "nos_id" + }, + "properties": [ + { + "id": "custom.width", + "value": 80 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "status" + }, + "properties": [ + { + "id": "custom.width", + "value": 200 + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 43 + }, + "id": 51, + "options": { + "footer": { + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": true + }, + "pluginVersion": "8.4.6", + "targets": [ + { + "datasource": { + "type": "vertamedia-clickhouse-datasource", + "uid": "PDEE91DDB90597936" + }, + "dateTimeType": "DATETIME", + "extrapolate": true, + "format": "table", + "formattedQuery": "SELECT $timeSeries as t, count() FROM $table WHERE $timeFilter GROUP BY t ORDER BY t", + "intervalFactor": 1, + "query": "SELECT\n nos_name,\n validator_pubkey\nFROM stats.validator_balances\nWHERE (status == 'active_slashed' OR status == 'exited_slashed' OR validator_slashed == 1) AND nos_name != '' and slot = ${slot_number_var}", + "rawQuery": "SELECT\n nos_name,\n validator_pubkey\nFROM stats.validator_balances\nWHERE (status == 'active_slashed' OR status == 'exited_slashed' OR validator_slashed == 1) AND nos_name != '' and slot = 4701759", + "refId": "A", + "round": "0s", + "skip_comments": true + } + ], + "title": "Slashed validators (User)", + "type": "table" } ], - "title": "Number of validators with missed propose (last finalized epoch)", - "type": "timeseries" + "title": "🔪 Slashed validators", + "type": "row" }, { "collapsed": false, @@ -2757,11 +3805,11 @@ "h": 1, "w": 24, "x": 0, - "y": 78 + "y": 43 }, "id": 32, "panels": [], - "title": "Alerting only", + "title": "💔 Alerting only", "type": "row" }, { @@ -2820,7 +3868,7 @@ "h": 4, "w": 4, "x": 0, - "y": 79 + "y": 44 }, "id": 34, "options": { @@ -2841,13 +3889,23 @@ "uid": "PBFA97CFB590B2093" }, "exemplar": true, - "expr": "ethereum_validators_monitoring_data_actuality", + "expr": "sum(ethereum_validators_monitoring_data_actuality)", + "format": "time_series", + "instant": false, "interval": "", + "intervalFactor": 1, "legendFormat": "data_actuality", "refId": "A" } ], - "thresholds": [], + "thresholds": [ + { + "colorMode": "critical", + "op": "gt", + "value": 3600000, + "visible": true + } + ], "title": "Data actuality (historic)", "type": "timeseries" }, @@ -2906,7 +3964,7 @@ "h": 4, "w": 4, "x": 4, - "y": 79 + "y": 44 }, "id": 36, "options": { @@ -2927,7 +3985,7 @@ "uid": "PBFA97CFB590B2093" }, "exemplar": true, - "expr": "ethereum_validators_monitoring_validators{owner=\"user\",status=\"slashed\"}", + "expr": "sum(ethereum_validators_monitoring_validators{owner=\"user\",status=\"slashed\"})", "interval": "", "legendFormat": "Number of slashed validators", "refId": "A" @@ -2943,155 +4001,9 @@ ], "title": "Slashed validators (User) (historic)", "type": "timeseries" - }, - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 99 - }, - "id": 50, - "panels": [], - "title": "Slashed validators", - "type": "row" - }, - { - "datasource": { - "type": "vertamedia-clickhouse-datasource", - "uid": "PDEE91DDB90597936" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "custom": { - "align": "auto", - "displayMode": "auto" - }, - "mappings": [], - "noValue": "-", - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "validator_pubkey" - }, - "properties": [ - { - "id": "displayName", - "value": "validator" - }, - { - "id": "unit", - "value": "string" - }, - { - "id": "links", - "value": [ - { - "title": "beaconcha.in", - "url": "https://beaconcha.in/validator/${__value.raw}" - } - ] - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "nos_name" - }, - "properties": [ - { - "id": "custom.width", - "value": 180 - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "nos_id" - }, - "properties": [ - { - "id": "custom.width", - "value": 80 - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "status" - }, - "properties": [ - { - "id": "custom.width", - "value": 200 - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 100 - }, - "id": 51, - "options": { - "footer": { - "fields": "", - "reducer": [ - "sum" - ], - "show": false - }, - "showHeader": true - }, - "pluginVersion": "8.4.3", - "targets": [ - { - "datasource": { - "type": "vertamedia-clickhouse-datasource", - "uid": "PDEE91DDB90597936" - }, - "dateTimeType": "DATETIME", - "extrapolate": true, - "format": "table", - "formattedQuery": "SELECT $timeSeries as t, count() FROM $table WHERE $timeFilter GROUP BY t ORDER BY t", - "intervalFactor": 1, - "query": "SELECT\n nos_id,\n nos_name,\n status,\n validator_pubkey\nFROM stats.validator_balances\nWHERE (status == 'active_slashed' OR status == 'exited_slashed' OR validator_slashed == 1) AND nos_name != '' and slot = ${slot_number_var}\nLIMIT 100", - "rawQuery": "SELECT\n nos_id,\n nos_name,\n status,\n validator_pubkey\nFROM stats.validator_balances\nWHERE (status == 'active_slashed' OR status == 'exited_slashed' OR validator_slashed == 1) AND nos_name != '' and slot = 2431231\nLIMIT 100", - "refId": "A", - "round": "0s", - "skip_comments": true - } - ], - "title": "Slashed validators (User)", - "type": "table" } ], - "refresh": "10s", + "refresh": "1m", "schemaVersion": 35, "style": "dark", "tags": [], @@ -3100,10 +4012,10 @@ { "current": { "selected": false, - "text": "3621599", - "value": "3621599" + "text": "4730207", + "value": "4730207" }, - "definition": "query_result(slot_number)", + "definition": "query_result(ethereum_validators_monitoring_slot_number)", "description": "Last slot number", "hide": 2, "includeAll": false, @@ -3124,19 +4036,19 @@ { "current": { "selected": false, - "text": "93.1", - "value": "93.1" + "text": "32", + "value": "32" }, - "definition": "query_result(chain_sync_participation_avg_percent)", - "description": "Blockchain Sync participation average", + "definition": "query_result(ethereum_validators_monitoring_fetch_interval)", + "description": "App fetch interval", "hide": 2, "includeAll": false, - "label": "Chain sync participation average", + "label": "Fetch interval", "multi": false, - "name": "chain_sync_participation_var", + "name": "fetch_interval_var", "options": [], "query": { - "query": "query_result(ethereum_validators_monitoring_chain_sync_participation_avg_percent)", + "query": "query_result(ethereum_validators_monitoring_fetch_interval)", "refId": "StandardVariableQuery" }, "refresh": 2, @@ -3148,19 +4060,19 @@ { "current": { "selected": false, - "text": "32", - "value": "32" + "text": "10", + "value": "10" }, - "definition": "query_result(fetch_interval)", - "description": "App fetch interval", + "definition": "query_result(ethereum_validators_monitoring_sync_participation_distance_down_from_chain_avg)", + "description": "Sync participation distance down from Blockchain average", "hide": 2, "includeAll": false, - "label": "Fetch interval", + "label": "Sync participation distance down from chain avg", "multi": false, - "name": "fetch_interval_var", + "name": "sync_participation_distance_var", "options": [], "query": { - "query": "query_result(ethereum_validators_monitoring_fetch_interval)", + "query": "query_result(ethereum_validators_monitoring_sync_participation_distance_down_from_chain_avg)", "refId": "StandardVariableQuery" }, "refresh": 2, @@ -3172,23 +4084,23 @@ { "current": { "selected": false, - "text": "10", - "value": "10" + "text": "1", + "value": "1" }, - "definition": "query_result(sync_participation_distance_down_from_chain_avg)", - "description": "Sync participation distance down from Blockchain average", + "datasource": { + "type": "vertamedia-clickhouse-datasource", + "uid": "PDEE91DDB90597936" + }, + "definition": "\tWITH epoch_range AS ( SELECT ((${__to:date:seconds} - ${__from:date:seconds}) / 300)::int as val ) SELECT IF (val = 0, 1, val) from epoch_range", "hide": 2, "includeAll": false, - "label": "Sync participation distance down from chain avg", + "label": "Epoch range", "multi": false, - "name": "sync_participation_distance_var", + "name": "epochs", "options": [], - "query": { - "query": "query_result(ethereum_validators_monitoring_sync_participation_distance_down_from_chain_avg)", - "refId": "StandardVariableQuery" - }, + "query": "\tWITH epoch_range AS ( SELECT ((${__to:date:seconds} - ${__from:date:seconds}) / 300)::int as val ) SELECT IF (val = 0, 1, val) from epoch_range", "refresh": 2, - "regex": "/.* ([^\\ ]*) .*/", + "regex": "", "skipUrlSync": false, "sort": 0, "type": "query" @@ -3196,13 +4108,13 @@ ] }, "time": { - "from": "now-15m", + "from": "now-5m", "to": "now" }, "timepicker": {}, "timezone": "", "title": "Validators", "uid": "HRgPmpNnz", - "version": 13, + "version": 15, "weekStart": "" } diff --git a/docker/prometheus/alerts_rules.test b/docker/prometheus/alerts_rules.test index feb01955..8246cac2 100644 --- a/docker/prometheus/alerts_rules.test +++ b/docker/prometheus/alerts_rules.test @@ -51,7 +51,7 @@ tests: summary: "Operators have slashed validators" description: "Number of slashed validators per operator" field_name: "Operator 1" - field_value: "[2](http://localhost:8082/d/3wimU2H7h/nodeoperators/?var-nos_name_var=Operator+1&from=120000.000000&to=1020000.000000)" + field_value: "[1](http://localhost:8082/d/3wimU2H7h/nodeoperators/?var-nos_name_var=Operator+1&from=120000.000000&to=1020000.000000)" url: "https://localhost:8082/d/HRgPmpNnz/validators" - exp_labels: severity: critical @@ -62,7 +62,7 @@ tests: summary: "Operators have slashed validators" description: "Number of slashed validators per operator" field_name: "Operator 2" - field_value: "[2](http://localhost:8082/d/3wimU2H7h/nodeoperators/?var-nos_name_var=Operator+2&from=120000.000000&to=1020000.000000)" + field_value: "[1](http://localhost:8082/d/3wimU2H7h/nodeoperators/?var-nos_name_var=Operator+2&from=120000.000000&to=1020000.000000)" url: "https://localhost:8082/d/HRgPmpNnz/validators" - eval_time: 25m alertname: UserSlashedValidators @@ -76,7 +76,7 @@ tests: summary: "Operators have slashed validators" description: "Number of slashed validators per operator" field_name: "Operator 2" - field_value: "[3](http://localhost:8082/d/3wimU2H7h/nodeoperators/?var-nos_name_var=Operator+2&from=600000.000000&to=1500000.000000)" + field_value: "[1](http://localhost:8082/d/3wimU2H7h/nodeoperators/?var-nos_name_var=Operator+2&from=600000.000000&to=1500000.000000)" url: "https://localhost:8082/d/HRgPmpNnz/validators" - interval: 10s diff --git a/docker/prometheus/alerts_rules.yml b/docker/prometheus/alerts_rules.yml index d96e603f..12427f34 100644 --- a/docker/prometheus/alerts_rules.yml +++ b/docker/prometheus/alerts_rules.yml @@ -3,7 +3,7 @@ groups: rules: - alert: UserSlashedValidators - expr: ethereum_validators_monitoring_user_validators{status="slashed"} > 0 AND ON(nos_name) delta(ethereum_validators_monitoring_user_validators{status="slashed"}[1m]) > 0 + expr: delta(ethereum_validators_monitoring_user_validators{status="slashed"}[1m]) > 0 AND ON(nos_name) ethereum_validators_monitoring_user_validators{status="slashed"} > 0 labels: severity: critical annotations: @@ -11,11 +11,11 @@ groups: summary: "Operators have slashed validators" description: 'Number of slashed validators per operator' field_name: '{{ $labels.nos_name }}' - field_value: '[{{ $value }}](http://localhost:8082/d/3wimU2H7h/nodeoperators/?var-nos_name_var={{ urlquery $labels.nos_name }}&from={{ with query "(time() - 900) * 1000" }}{{ . | first | value | printf "%f" }}{{ end }}&to={{ with query "time() * 1000" }}{{ . | first | value | printf "%f" }}{{ end }})' + field_value: '[{{ $value | printf "%.0f" }}](http://localhost:8082/d/3wimU2H7h/nodeoperators/?var-nos_name_var={{ urlquery $labels.nos_name }}&from={{ with query "(time() - 900) * 1000" }}{{ . | first | value | printf "%f" }}{{ end }}&to={{ with query "time() * 1000" }}{{ . | first | value | printf "%f" }}{{ end }})' url: "https://localhost:8082/d/HRgPmpNnz/validators" - alert: DataActuality - expr: ethereum_validators_monitoring_data_actuality > 3600000 + expr: ethereum_validators_monitoring_data_actuality > 3600000 OR absent(ethereum_validators_monitoring_data_actuality) for: 30m labels: severity: critical diff --git a/src/common/alertmanager/alerts/BasicAlert.ts b/src/common/alertmanager/alerts/BasicAlert.ts index c218f8e8..089dcf47 100644 --- a/src/common/alertmanager/alerts/BasicAlert.ts +++ b/src/common/alertmanager/alerts/BasicAlert.ts @@ -32,7 +32,7 @@ export abstract class Alert { abstract alertRule(bySlot: bigint): Promise; - abstract sendRule(ruleResult: AlertRuleResult): boolean; + abstract sendRule(ruleResult?: AlertRuleResult): boolean; abstract alertBody(ruleResult: AlertRuleResult): AlertRequestBody; diff --git a/src/common/alertmanager/alerts/CriticalMissedProposes.ts b/src/common/alertmanager/alerts/CriticalMissedProposes.ts index 302d5c14..b7eb6dc6 100644 --- a/src/common/alertmanager/alerts/CriticalMissedProposes.ts +++ b/src/common/alertmanager/alerts/CriticalMissedProposes.ts @@ -12,7 +12,7 @@ export class CriticalMissedProposes extends Alert { async alertRule(bySlot: bigint): Promise { const result: AlertRuleResult = {}; const operators = await this.storage.getUserNodeOperatorsStats(bySlot); - const proposes = await this.storage.getUserNodeOperatorsProposesStats(bySlot); + const proposes = await this.storage.getUserNodeOperatorsProposesStats(bySlot); // ~12h range for (const operator of operators.filter((o) => o.active_ongoing > this.config.get('CRITICAL_ALERTS_MIN_VAL_COUNT'))) { const proposeStats = proposes.find((a) => a.nos_name == operator.nos_name); if (!proposeStats) continue; diff --git a/src/common/alertmanager/alerts/CriticalSlashing.ts b/src/common/alertmanager/alerts/CriticalSlashing.ts new file mode 100644 index 00000000..856ad6c1 --- /dev/null +++ b/src/common/alertmanager/alerts/CriticalSlashing.ts @@ -0,0 +1,44 @@ +import { Alert, AlertRequestBody, AlertRuleResult } from './BasicAlert'; +import { join } from 'lodash'; +import { ConfigService } from 'common/config'; +import { ClickhouseService } from 'storage'; + +export class CriticalSlashing extends Alert { + constructor(config: ConfigService, storage: ClickhouseService) { + super(CriticalSlashing.name, config, storage); + } + + async alertRule(bySlot: bigint): Promise { + const result: AlertRuleResult = {}; + const currOperators = await this.storage.getUserNodeOperatorsStats(bySlot); + const prevOperators = await this.storage.getUserNodeOperatorsStats(bySlot - 32n); // compare with previous epoch + for (const currOperator of currOperators.filter((o) => o.active_ongoing > this.config.get('CRITICAL_ALERTS_MIN_VAL_COUNT'))) { + const prevOperator = prevOperators.find((a) => a.nos_name == currOperator.nos_name); + // if count of slashed validators increased, we should alert about it + const prevSlashed = prevOperator ? prevOperator.slashed : 0; + if (currOperator.slashed > prevSlashed) { + result[currOperator.nos_name] = { ongoing: currOperator.active_ongoing, slashed: currOperator.slashed - prevSlashed }; + } + } + return result; + } + + sendRule(): boolean { + return true; + } + + alertBody(ruleResult: AlertRuleResult): AlertRequestBody { + return { + startsAt: new Date(this.sendTimestamp).toISOString(), + endsAt: new Date(new Date(this.sendTimestamp).setMinutes(new Date(this.sendTimestamp).getMinutes() + 1)).toISOString(), + labels: { alertname: this.alertname, severity: 'critical' }, + annotations: { + summary: `${Object.values(ruleResult).length} Node Operators with SLASHED validators`, + description: join( + Object.entries(ruleResult).map(([o, r]) => `${o}: ${r.slashed} of ${r.ongoing}`), + '\n', + ), + }, + }; + } +} diff --git a/src/common/alertmanager/critical-alerts.service.ts b/src/common/alertmanager/critical-alerts.service.ts index a1df4575..436de0fd 100644 --- a/src/common/alertmanager/critical-alerts.service.ts +++ b/src/common/alertmanager/critical-alerts.service.ts @@ -8,6 +8,7 @@ import { LOGGER_PROVIDER, LoggerService } from '@lido-nestjs/logger'; import { ConfigService } from 'common/config'; import { ClickhouseService } from 'storage'; import { PrometheusService } from 'common/prometheus'; +import { CriticalSlashing } from './alerts/CriticalSlashing'; interface SentAlerts { [alertname: string]: PreparedToSendAlert; @@ -33,6 +34,7 @@ export class CriticalAlertsService { new CriticalNegativeDelta(this.config, this.storage), new CriticalMissedProposes(this.config, this.storage), new CriticalMissedAttestations(this.config, this.storage), + new CriticalSlashing(this.config, this.storage), ]; } diff --git a/src/common/prometheus/prometheus.constants.ts b/src/common/prometheus/prometheus.constants.ts index 5f107d71..46771cba 100644 --- a/src/common/prometheus/prometheus.constants.ts +++ b/src/common/prometheus/prometheus.constants.ts @@ -29,8 +29,10 @@ export const METRIC_HIGH_REWARD_VALIDATOR_COUNT_WITH_SYNC_PARTICIPATION_LESS_AVG export const METRIC_VALIDATOR_COUNT_MISS_PROPOSE = `validator_count_miss_propose`; export const METRIC_HIGH_REWARD_VALIDATOR_COUNT_MISS_PROPOSE = `high_reward_validator_count_miss_propose`; export const METRIC_USER_SYNC_PARTICIPATION_AVG_PERCENT = `user_sync_participation_avg_percent`; +export const METRIC_OPERATOR_SYNC_PARTICIPATION_AVG_PERCENT = `operator_sync_participation_avg_percent`; export const METRIC_CHAIN_SYNC_PARTICIPATION_AVG_PERCENT = `chain_sync_participation_avg_percent`; export const METRIC_SLOT_NUMBER = `slot_number`; export const METRIC_TOTAL_BALANCE_24H_DIFFERENCE = `total_balance_24h_difference`; +export const METRIC_OPERATOR_BALANCE_24H_DIFFERENCE = `operator_balance_24h_difference`; export const METRIC_CONTRACT_KEYS_TOTAL = `contract_keys_total`; export const METRIC_STETH_BUFFERED_ETHER_TOTAL = `steth_buffered_ether_total`; diff --git a/src/common/prometheus/prometheus.service.ts b/src/common/prometheus/prometheus.service.ts index 6e4c06d4..7693259b 100644 --- a/src/common/prometheus/prometheus.service.ts +++ b/src/common/prometheus/prometheus.service.ts @@ -30,9 +30,11 @@ import { METRIC_CONTRACT_KEYS_TOTAL, METRIC_STETH_BUFFERED_ETHER_TOTAL, METRIC_BUILD_INFO, + METRIC_OPERATOR_SYNC_PARTICIPATION_AVG_PERCENT, + METRIC_OPERATOR_BALANCE_24H_DIFFERENCE, } from './prometheus.constants'; import { Metric, Options } from './interfaces'; -import { Inject, Injectable } from '@nestjs/common'; +import { Inject, Injectable, OnApplicationBootstrap } from '@nestjs/common'; import { ConfigService } from 'common/config'; import { join } from 'lodash'; import { LOGGER_PROVIDER, LoggerService } from '@lido-nestjs/logger'; @@ -74,13 +76,15 @@ export function requestLabels(apiUrl: string, subUrl: string) { } @Injectable() -export class PrometheusService { +export class PrometheusService implements OnApplicationBootstrap { private prefix = METRICS_PREFIX; public slotTime = 0n; // latest fetched slot time public getSlotTimeDiffWithNow = () => Date.now() - Number(this.slotTime) * 1000; - constructor(@Inject(LOGGER_PROVIDER) protected readonly logger: LoggerService, private config: ConfigService) { + constructor(@Inject(LOGGER_PROVIDER) protected readonly logger: LoggerService, private config: ConfigService) {} + + public async onApplicationBootstrap(): Promise { const getSlotTimeDiffWithNow = () => this.getSlotTimeDiffWithNow(); this.getOrCreateMetric('Gauge', { name: METRIC_DATA_ACTUALITY, @@ -252,9 +256,15 @@ export class PrometheusService { labelNames: [], }); + public operatorSyncParticipationAvgPercent = this.getOrCreateMetric('Gauge', { + name: METRIC_OPERATOR_SYNC_PARTICIPATION_AVG_PERCENT, + help: 'Operator sync committee validators participation avg percent', + labelNames: ['nos_name'], + }); + public chainSyncParticipationAvgPercent = this.getOrCreateMetric('Gauge', { name: METRIC_CHAIN_SYNC_PARTICIPATION_AVG_PERCENT, - help: 'All sync committee validators participation avg percent', + help: 'Other sync committee validators participation avg percent', labelNames: [], }); @@ -270,6 +280,12 @@ export class PrometheusService { labelNames: [], }); + public operatorBalance24hDifference = this.getOrCreateMetric('Gauge', { + name: METRIC_OPERATOR_BALANCE_24H_DIFFERENCE, + help: 'Operator balance difference (24 hours)', + labelNames: ['nos_name'], + }); + public contractKeysTotal = this.getOrCreateMetric('Gauge', { name: METRIC_CONTRACT_KEYS_TOTAL, help: 'Contract keys', diff --git a/src/inspector/inspector.service.ts b/src/inspector/inspector.service.ts index 6cf4adea..f85444f9 100644 --- a/src/inspector/inspector.service.ts +++ b/src/inspector/inspector.service.ts @@ -48,7 +48,7 @@ export class InspectorService implements OnModuleInit { possibleHighRewardValidators = await this.dataProcessor.getPossibleHighRewardValidatorIndexes(res.userIDs, headEpoch); } await this.statsProcessor.calculateUserStats(slotToWrite, possibleHighRewardValidators); - await this.statsProcessor.calculateOtherStats(res.otherCounts); + await this.statsProcessor.calculateOtherStats(res.otherValidatorsCounts, res.otherAvgSyncPercent); await this.statsProcessor.finalizeAppIterate(slotToWrite); await this.criticalAlertService.sendCriticalAlerts(slotToWrite); } diff --git a/src/inspector/processing/data-processing.service.ts b/src/inspector/processing/data-processing.service.ts index 89a7589d..d2c9cf28 100644 --- a/src/inspector/processing/data-processing.service.ts +++ b/src/inspector/processing/data-processing.service.ts @@ -18,7 +18,6 @@ import { bigintRange } from 'common/functions/range'; import { RegistryService } from 'common/validators-registry'; import { CheckAttestersDutyResult, - CheckSyncCommitteeParticipationResult, ClickhouseService, SlotAttestation, ValidatorIdentifications, @@ -29,7 +28,7 @@ import { RegistrySourceKeysIndexed } from 'common/validators-registry/registry-s interface FetchFinalizedEpochDataResult { attestations: CheckAttestersDutyResult; proposeDutiesResult: ProposerDutyInfo[]; - syncResult: CheckSyncCommitteeParticipationResult; + syncResult: SyncCommitteeValidator[]; } @Injectable() @@ -49,6 +48,8 @@ export class DataProcessingService implements OnModuleInit { public async onModuleInit(): Promise { this.latestSlotInDb = await this.storage.getMaxSlot(); this.firstSlotInDb = await this.storage.getMinSlot(); + this.prometheus.slotTime = await this.getSlotTime(this.latestSlotInDb); + this.prometheus.slotNumber.set(Number(this.latestSlotInDb)); } public async getSlotTime(slot: bigint): Promise { @@ -59,7 +60,7 @@ export class DataProcessingService implements OnModuleInit { slotToWrite: bigint, stateRoot: string, slotNumber: bigint, - ): Promise<{ userIDs: ValidatorIdentifications[]; otherCounts: ValidatorsStatusStats }> { + ): Promise<{ userIDs: ValidatorIdentifications[]; otherValidatorsCounts: ValidatorsStatusStats; otherAvgSyncPercent: number }> { return await this.prometheus.trackTask('process-write-finalized-data', async () => { try { if (slotToWrite <= this.latestSlotInDb) { @@ -70,22 +71,26 @@ export class DataProcessingService implements OnModuleInit { const epoch = slotToWrite / BigInt(this.config.get('FETCH_INTERVAL_SLOTS')); const keysIndexed = await this.registryService.getActualKeysIndexed(Number(slotTime)); const fetcherWriter = this.fetcherWriter(slotToWrite, epoch, stateRoot, slotNumber, slotTime, keysIndexed); - let otherCounts: ValidatorsStatusStats; + let otherValidatorsCounts: ValidatorsStatusStats; + let otherAvgSyncPercent: number; // todo: optimize it let userIDs = await this.storage.getUserValidatorIDs(this.latestSlotInDb); if (this.latestSlotInDb == 0n || userIDs?.length == 0) { // First iteration or new validators fetched. We should fetch general validators info firstly (id) const slotRes = await fetcherWriter.fetchSlotData(); - otherCounts = await fetcherWriter.writeSlotData(slotRes); + otherValidatorsCounts = await fetcherWriter.writeSlotData(slotRes); userIDs = await this.storage.getUserValidatorIDs(slotToWrite); const epochRes = await fetcherWriter.fetchEpochData(userIDs); - await fetcherWriter.writeEpochData(userIDs, epochRes); + otherAvgSyncPercent = await fetcherWriter.writeEpochData(userIDs, epochRes); } else { const [slotRes, epochRes] = await Promise.all([fetcherWriter.fetchSlotData(), fetcherWriter.fetchEpochData(userIDs)]); - [otherCounts] = await Promise.all([fetcherWriter.writeSlotData(slotRes), fetcherWriter.writeEpochData(userIDs, epochRes)]); + [otherValidatorsCounts, otherAvgSyncPercent] = await Promise.all([ + fetcherWriter.writeSlotData(slotRes), + fetcherWriter.writeEpochData(userIDs, epochRes), + ]); } this.latestSlotInDb = slotToWrite; - return { userIDs, otherCounts }; + return { userIDs, otherValidatorsCounts, otherAvgSyncPercent }; } catch (e) { this.logger.error('Error while fetching and writing new finalized slot or epoch info'); this.logger.error(e as Error); @@ -123,24 +128,15 @@ export class DataProcessingService implements OnModuleInit { return await this.clClient.getChunkedAttesterDuties(epoch, dependentRoot, valIndexes); } - protected async getSyncCommitteeIndexedValidators( - epoch: bigint, - stateRoot: string, - userIndexes: string[], - ): Promise { + protected async getSyncCommitteeIndexedValidators(epoch: bigint, stateRoot: string): Promise { const syncCommitteeInfo = await this.clClient.getSyncCommitteeInfo(stateRoot, epoch); - const userSyncCommitteeVals: SyncCommitteeValidator[] = []; - const allSyncCommitteeVals: SyncCommitteeValidator[] = []; - syncCommitteeInfo.validators.forEach((v, i) => { - const indexed: SyncCommitteeValidator = { + return syncCommitteeInfo.validators.map((v, i) => { + return { in_committee_index: i, validator_index: v, epoch_participation_percent: 0, }; - allSyncCommitteeVals.push(indexed); - if (userIndexes.includes(v)) userSyncCommitteeVals.push(indexed); }); - return [userSyncCommitteeVals, allSyncCommitteeVals]; } protected fetcherWriter = ( @@ -174,7 +170,7 @@ export class DataProcessingService implements OnModuleInit { const [attestations, proposeDutiesResult, syncResult] = await Promise.all([ this.checkAttesterDuties(epoch, attesterDutyDependentRoot, userIndexes), this.checkProposerDuties(epoch, proposerDutyDependentRoot, userIndexes), - this.checkSyncCommitteeDuties(epoch, stateRoot, userIndexes), + this.checkSyncCommitteeDuties(epoch, stateRoot), ]); return { attestations, proposeDutiesResult, syncResult }; }, @@ -183,10 +179,8 @@ export class DataProcessingService implements OnModuleInit { await this.storage.writeAttestations(epochRes.attestations, slotTime, keysIndexed); this.logger.log(`Writing ${epochRes.proposeDutiesResult.length} proposes result to DB for ${epoch} epoch`); await this.storage.writeProposes(epochRes.proposeDutiesResult, slotTime, keysIndexed); - this.logger.log( - `Writing ${epochRes.syncResult.user_validators.length} Sync Committee validators participation info to DB for ${epoch} epoch`, - ); - await this.storage.writeSyncs(epochRes.syncResult, slotTime, keysIndexed, userIDs, epoch); + this.logger.log(`Writing Sync Committee validators participation info to DB for ${epoch} epoch`); + return await this.storage.writeSyncs(epochRes.syncResult, slotTime, keysIndexed, userIDs, epoch); }, }; }; @@ -276,19 +270,12 @@ export class DataProcessingService implements OnModuleInit { /** * Check Sync committee duties: get duties info by our validators keys and do bitwise check **/ - protected async checkSyncCommitteeDuties( - epoch: bigint, - stateRoot: string, - userIndexes: string[], - ): Promise { + protected async checkSyncCommitteeDuties(epoch: bigint, stateRoot: string): Promise { return await this.prometheus.trackTask('check-sync-duties', async () => { this.logger.log(`Start getting sync committee participation info`); const SyncCommitteeBits = new BitVectorType({ length: 512 }); // sync participants count in committee - const [user, all] = await this.getSyncCommitteeIndexedValidators(epoch, stateRoot, userIndexes); + const indexedValidators = await this.getSyncCommitteeIndexedValidators(epoch, stateRoot); this.logger.log(`Processing sync committee participation info`); - if (user.length === 0) { - return { all_avg_participation: '', user_validators: [] }; - } const epochBlocks: ShortBeaconBlockInfo[] = []; const missedSlots: bigint[] = []; const startSlot = epoch * BigInt(this.config.get('FETCH_INTERVAL_SLOTS')); @@ -300,22 +287,14 @@ export class DataProcessingService implements OnModuleInit { const epochBlocksBits = epochBlocks.map((block) => Array.from(SyncCommitteeBits.deserialize(fromHexString(block.message.body.sync_aggregate.sync_committee_bits))), ); - for (const indexedValidator of all) { - indexedValidator.epoch_participation_percent = (() => { - let sync_count = 0; - for (const bits of epochBlocksBits) { - if (bits[indexedValidator.in_committee_index]) sync_count++; - } - return (sync_count / epochBlocksBits.length) * 100; - })(); + for (const indexedValidator of indexedValidators) { + let sync_count = 0; + for (const bits of epochBlocksBits) { + if (bits[indexedValidator.in_committee_index]) sync_count++; + } + indexedValidator.epoch_participation_percent = (sync_count / epochBlocksBits.length) * 100; } - const allAvgParticipation = (all.reduce((a, b) => a + b.epoch_participation_percent, 0) / all.length).toFixed(2); - const userValidators = all.filter((v) => user.map((l) => l.validator_index).includes(v.validator_index)); - - return { - all_avg_participation: allAvgParticipation, - user_validators: userValidators, - }; + return indexedValidators; }); } } diff --git a/src/inspector/processing/stats-processing.service.ts b/src/inspector/processing/stats-processing.service.ts index 6b68d0da..53dacaa7 100644 --- a/src/inspector/processing/stats-processing.service.ts +++ b/src/inspector/processing/stats-processing.service.ts @@ -1,6 +1,6 @@ import { ClickhouseService } from 'storage'; import { DataProcessingService } from './data-processing.service'; -import { Inject, Injectable, LoggerService, OnModuleInit } from '@nestjs/common'; +import { Inject, Injectable, LoggerService } from '@nestjs/common'; import { LOGGER_PROVIDER } from '@lido-nestjs/logger'; import { ConfigService } from 'common/config'; import { Owner, PrometheusService, PrometheusValStatus } from 'common/prometheus'; @@ -12,7 +12,7 @@ import { RegistryOperator } from '@lido-nestjs/registry'; const GWEI_WEI_RATIO = 1e9; @Injectable() -export class StatsProcessingService implements OnModuleInit { +export class StatsProcessingService { public constructor( @Inject(LOGGER_PROVIDER) protected readonly logger: LoggerService, @@ -23,11 +23,6 @@ export class StatsProcessingService implements OnModuleInit { protected readonly storage: ClickhouseService, ) {} - public async onModuleInit(): Promise { - this.prometheus.slotTime = await this.dataProcessor.getSlotTime(this.dataProcessor.latestSlotInDb); - this.prometheus.slotNumber.set(Number(this.dataProcessor.latestSlotInDb)); - } - /** * Calc stats by storage (validators info, att and prop duties) and push them to Prometheus */ @@ -64,9 +59,13 @@ export class StatsProcessingService implements OnModuleInit { }); // Validator Sync Committee participation - const syncParticipationAvgPercents = await this.storage.getSyncParticipationAvgPercents(slot); - this.prometheus.userSyncParticipationAvgPercent.set(syncParticipationAvgPercents.user ?? 0); - this.prometheus.chainSyncParticipationAvgPercent.set(syncParticipationAvgPercents.chain ?? 0); + const userSyncParticipationAvgPercent = await this.storage.getUserSyncParticipationAvgPercent(slot); + this.prometheus.userSyncParticipationAvgPercent.set(userSyncParticipationAvgPercent.avg_percent ?? 0); + + const operatorSyncParticipationAvgPercents = await this.storage.getOperatorSyncParticipationAvgPercents(slot); + operatorSyncParticipationAvgPercents.forEach((p) => { + this.prometheus.operatorSyncParticipationAvgPercent.set({ nos_name: p.nos_name }, p.avg_percent); + }); const syncParticipationLastEpoch = await this.storage.getValidatorsCountWithSyncParticipationLessChainAvgLastNEpoch(slot, 1); const syncParticipationLastNEpoch = await this.storage.getValidatorsCountWithSyncParticipationLessChainAvgLastNEpoch( @@ -154,6 +153,10 @@ export class StatsProcessingService implements OnModuleInit { if (totalBalance24hDifference != undefined) { this.prometheus.totalBalance24hDifference.set(totalBalance24hDifference); } + const operatorBalance24hDifference = await this.storage.getOperatorBalance24hDifference(slot); + operatorBalance24hDifference.forEach((d) => { + this.prometheus.operatorBalance24hDifference.set({ nos_name: d.nos_name }, d.diff); + }); if (this.registryService.source instanceof LidoSourceService) { this.prometheus.contractKeysTotal.set( @@ -179,11 +182,14 @@ export class StatsProcessingService implements OnModuleInit { /** * Calc stats by in-memory other validators data (ongoing, pending, slashed validators) */ - async calculateOtherStats(otherBalances: ValidatorsStatusStats): Promise { - this.logger.log(`Other ongoing validators [${otherBalances.active_ongoing}]`); - this.prometheus.validators.set({ owner: Owner.OTHER, status: PrometheusValStatus.Ongoing }, otherBalances.active_ongoing); - this.prometheus.validators.set({ owner: Owner.OTHER, status: PrometheusValStatus.Pending }, otherBalances.pending); - this.prometheus.validators.set({ owner: Owner.OTHER, status: PrometheusValStatus.Slashed }, otherBalances.slashed); + async calculateOtherStats(otherValidatorsCounts: ValidatorsStatusStats, otherAvgSyncPercent: number): Promise { + this.logger.log(`Other ongoing validators [${otherValidatorsCounts.active_ongoing}]`); + this.prometheus.validators.set({ owner: Owner.OTHER, status: PrometheusValStatus.Ongoing }, otherValidatorsCounts.active_ongoing); + this.prometheus.validators.set({ owner: Owner.OTHER, status: PrometheusValStatus.Pending }, otherValidatorsCounts.pending); + this.prometheus.validators.set({ owner: Owner.OTHER, status: PrometheusValStatus.Slashed }, otherValidatorsCounts.slashed); + + // Other Sync Committee participation + if (otherAvgSyncPercent != undefined) this.prometheus.chainSyncParticipationAvgPercent.set(otherAvgSyncPercent); } public async finalizeAppIterate(slot: bigint): Promise { diff --git a/src/storage/clickhouse/clickhouse.constants.ts b/src/storage/clickhouse/clickhouse.constants.ts index 3a16ba18..2ce23c3b 100644 --- a/src/storage/clickhouse/clickhouse.constants.ts +++ b/src/storage/clickhouse/clickhouse.constants.ts @@ -187,15 +187,24 @@ export const validatorsCountWithMissProposeQuery = (fetchInterval: number, slot: `; }; -export const syncParticipationAvgPercentsQuery = (slot: string | bigint | number): string => ` +export const userSyncParticipationAvgPercentQuery = (slot: string | bigint | number): string => ` SELECT - avg(epoch_participation_percent) as user, - max(epoch_chain_participation_percent_avg) as chain + avg(epoch_participation_percent) as avg_percent FROM stats.validator_sync WHERE last_slot_of_epoch = ${slot} `; +export const operatorsSyncParticipationAvgPercentsQuery = (slot: string | bigint | number): string => ` + SELECT + nos_name, + avg(epoch_participation_percent) as avg_percent + FROM + stats.validator_sync + WHERE last_slot_of_epoch = ${slot} + GROUP BY nos_name +`; + export const totalBalance24hDifferenceQuery = (slot: string): string => ` SELECT ( SELECT SUM(curr.balance) @@ -229,6 +238,31 @@ export const totalBalance24hDifferenceQuery = (slot: string): string => ` curr_total_balance - prev_total_balance as total_diff `; +export const operatorBalance24hDifferenceQuery = (slot: string): string => ` + SELECT + nos_name, + SUM(curr.balance - previous.balance) as diff + FROM + stats.validator_balances AS curr + INNER JOIN + ( + SELECT balance, validator_id, nos_id + FROM stats.validator_balances + WHERE + status != '${ValStatus.PendingQueued}' AND + nos_name IS NOT NULL AND + slot = ${slot} - 7200 + ) AS previous + ON + previous.nos_id = curr.nos_id AND + previous.validator_id = curr.validator_id + WHERE + curr.slot = ${slot} + AND curr.status != '${ValStatus.PendingQueued}' + AND curr.nos_id IS NOT NULL + GROUP BY curr.nos_name +`; + export const userNodeOperatorsStatsQuery = (slot: string): string => ` SELECT nos_name, diff --git a/src/storage/clickhouse/clickhouse.service.ts b/src/storage/clickhouse/clickhouse.service.ts index 5a28fa76..b3b0f0c9 100644 --- a/src/storage/clickhouse/clickhouse.service.ts +++ b/src/storage/clickhouse/clickhouse.service.ts @@ -9,7 +9,6 @@ import { userNodeOperatorsStatsQuery, userValidatorIDsQuery, userValidatorsSummaryStatsQuery, - syncParticipationAvgPercentsQuery, totalBalance24hDifferenceQuery, validatorBalancesDeltaQuery, validatorCountWithMissAttestationLastNEpochQuery, @@ -17,16 +16,18 @@ import { validatorsCountWithMissProposeQuery, validatorsCountWithNegativeDeltaQuery, validatorsCountWithSyncParticipationLessChainAvgLastNEpochQuery, + userSyncParticipationAvgPercentQuery, + operatorsSyncParticipationAvgPercentsQuery, + operatorBalance24hDifferenceQuery, } from './clickhouse.constants'; import { Inject, Injectable, LoggerService, OnModuleInit } from '@nestjs/common'; import { LOGGER_PROVIDER } from '@lido-nestjs/logger'; import { ConfigService } from 'common/config'; import { PrometheusService } from 'common/prometheus'; import { retrier } from 'common/functions/retrier'; -import { ProposerDutyInfo, StateValidatorResponse, ValStatus } from 'common/eth-providers'; +import { ProposerDutyInfo, StateValidatorResponse, SyncCommitteeValidator, ValStatus } from 'common/eth-providers'; import { CheckAttestersDutyResult, - CheckSyncCommitteeParticipationResult, NOsValidatorsStatusStats, NOsDelta, NOsValidatorsNegDeltaCount, @@ -37,6 +38,7 @@ import { NOsValidatorsSyncLessChainAvgCount, SyncCommitteeParticipationAvgPercents, ValidatorIdentifications, + NOsValidatorsSyncAvgPercent, } from './clickhouse.types'; import { RegistrySourceKeysIndexed } from 'common/validators-registry/registry-source.interface'; @@ -238,13 +240,14 @@ export class ClickhouseService implements OnModuleInit { } public async writeSyncs( - syncResult: CheckSyncCommitteeParticipationResult, + syncResult: SyncCommitteeValidator[], slotTime: bigint, keysIndexed: RegistrySourceKeysIndexed, userIDs: ValidatorIdentifications[], epoch: bigint, - ): Promise { + ): Promise { return await this.prometheus.trackTask('write-syncs', async () => { + const notUserPercents = []; const ws = this.db .insert( 'INSERT INTO stats.validator_sync ' + @@ -254,15 +257,21 @@ export class ClickhouseService implements OnModuleInit { .stream(); const last_slot_of_epoch = epoch * BigInt(this.config.get('FETCH_INTERVAL_SLOTS')) + BigInt(this.config.get('FETCH_INTERVAL_SLOTS')) - 1n; - for (const p of syncResult.user_validators) { + for (const p of syncResult) { const pubKey = userIDs.find((v) => v.validator_id === p.validator_index)?.validator_pubkey || ''; - await ws.writeRow( - `(${slotTime}, '${pubKey}', '${p.validator_index || ''}', ${last_slot_of_epoch}, ${p.epoch_participation_percent}, ` + - `${syncResult.all_avg_participation}, - ${keysIndexed.get(pubKey)?.operatorIndex ?? 'NULL'}, '${keysIndexed.get(pubKey)?.operatorName || 'NULL'}')`, - ); + if (pubKey) { + const other = syncResult.filter((s) => s.validator_index != p.validator_index); + const otherAvg = other.reduce((a, b) => a + b.epoch_participation_percent, 0) / other.length; + await ws.writeRow( + `(${slotTime}, '${pubKey}', '${p.validator_index || ''}', ${last_slot_of_epoch}, ${p.epoch_participation_percent}, ` + + `${otherAvg}, ${keysIndexed.get(pubKey)?.operatorIndex ?? 'NULL'}, '${keysIndexed.get(pubKey)?.operatorName || 'NULL'}')`, + ); + } else { + notUserPercents.push(p.epoch_participation_percent); + } } await this.retry(async () => await ws.exec()); + return notUserPercents.length ? notUserPercents.reduce((a, b) => a + b, 0) / notUserPercents.length : undefined; }); } @@ -296,6 +305,22 @@ export class ClickhouseService implements OnModuleInit { return ret; } + /** + * Send query to Clickhouse and receives information about User Sync Committee participants + */ + public async getUserSyncParticipationAvgPercent(slot: bigint): Promise { + const ret = await this.retry(async () => this.db.query(userSyncParticipationAvgPercentQuery(slot)).toPromise()); + return ret[0]; + } + + /** + * Send query to Clickhouse and receives information about Operator Sync Committee participants + */ + public async getOperatorSyncParticipationAvgPercents(slot: bigint): Promise { + const ret = await this.retry(async () => this.db.query(operatorsSyncParticipationAvgPercentsQuery(slot)).toPromise()); + return ret; + } + /** * Send query to Clickhouse and receives information about * how many User Node Operator validators have Sync Committee participation less when chain average last N epoch @@ -361,14 +386,6 @@ export class ClickhouseService implements OnModuleInit { return ret; } - /** - * Send query to Clickhouse and receives information about Sync Committee participants - */ - public async getSyncParticipationAvgPercents(slot: bigint): Promise { - const ret = await this.retry(async () => this.db.query(syncParticipationAvgPercentsQuery(slot)).toPromise()); - return ret[0]; - } - public async getTotalBalance24hDifference(slot: bigint): Promise { const ret = await this.retry(async () => this.db.query(totalBalance24hDifferenceQuery(slot.toString())).toPromise()); @@ -391,6 +408,11 @@ export class ClickhouseService implements OnModuleInit { return total_diff; } + public async getOperatorBalance24hDifference(slot: bigint): Promise<{ nos_name: string; diff: number }[]> { + const ret = await this.retry(async () => this.db.query(operatorBalance24hDifferenceQuery(slot.toString())).toPromise()); + return <{ nos_name: string; diff: number }[]>ret; + } + /** * Send query to Clickhouse and receives information about * how many User Node Operator validators have active, slashed, pending status diff --git a/src/storage/clickhouse/clickhouse.types.ts b/src/storage/clickhouse/clickhouse.types.ts index 12cd6b7e..c374ce12 100644 --- a/src/storage/clickhouse/clickhouse.types.ts +++ b/src/storage/clickhouse/clickhouse.types.ts @@ -1,4 +1,4 @@ -import { AttesterDutyInfo, SyncCommitteeValidator } from 'common/eth-providers'; +import { AttesterDutyInfo } from 'common/eth-providers'; export interface ValidatorsStatusStats { active_ongoing: number; @@ -16,6 +16,11 @@ export interface NOsValidatorsNegDeltaCount { neg_count: number; } +export interface NOsValidatorsSyncAvgPercent { + nos_name: string; + avg_percent: number; +} + export interface NOsValidatorsSyncLessChainAvgCount { nos_name: string; less_chain_avg_count: number; @@ -52,11 +57,6 @@ export interface SlotAttestation { committee_index: string; } -export interface CheckSyncCommitteeParticipationResult { - all_avg_participation: string; - user_validators: SyncCommitteeValidator[]; -} - export interface CheckAttestersDutyResult { attestersDutyInfo: AttesterDutyInfo[]; blocksAttestations: { [blockNum: string]: SlotAttestation[] }; @@ -64,6 +64,5 @@ export interface CheckAttestersDutyResult { } export interface SyncCommitteeParticipationAvgPercents { - user: number; - chain: number; + avg_percent: number; }