diff --git a/rocketpool-cli/service/service.go b/rocketpool-cli/service/service.go index 56e4a6ec5..e5b7f0eca 100644 --- a/rocketpool-cli/service/service.go +++ b/rocketpool-cli/service/service.go @@ -126,12 +126,12 @@ func printPatchNotes() { fmt.Println() } -// Install the Rocket Pool update tracker for the metrics dashboard +// Install the OS update tracker for the metrics dashboard func installUpdateTracker(yes, verbose bool) error { // Prompt for confirmation if prompt.Declined(yes, - "This will add the ability to display any available Operating System updates or new Rocket Pool versions on the metrics dashboard. "+ + "This will add the ability to display any available Operating System updates on the metrics dashboard. "+ "Are you sure you want to install the update tracker?") { fmt.Println("Cancelled.") return nil diff --git a/rocketpool/node/collectors/version-update-collector.go b/rocketpool/node/collectors/version-update-collector.go new file mode 100644 index 000000000..29e2a397c --- /dev/null +++ b/rocketpool/node/collectors/version-update-collector.go @@ -0,0 +1,170 @@ +package collectors + +import ( + "context" + "encoding/json" + "fmt" + "net/http" + "strings" + "sync" + "time" + + semver "github.com/blang/semver/v4" + "github.com/prometheus/client_golang/prometheus" + + "github.com/rocket-pool/smartnode/shared" +) + +const ( + githubLatestReleaseURL = "https://api.github.com/repos/rocket-pool/smartnode/releases/latest" + versionCheckInterval = time.Hour + versionCheckTimeout = 15 * time.Second +) + +// VersionUpdateCollector exposes whether a newer Smart Node release is available. +type VersionUpdateCollector struct { + versionUpdate *prometheus.Desc + versionUpdateInfo *prometheus.Desc + current string + latestURL string + client *http.Client + logf func(string, ...interface{}) + + mu sync.Mutex + updateAvailable float64 + latestVersion string + lastChecked time.Time +} + +type githubReleaseResponse struct { + TagName string `json:"tag_name"` +} + +// NewVersionUpdateCollector creates a collector backed by an hourly GitHub release check. +func NewVersionUpdateCollector(logf func(string, ...interface{})) *VersionUpdateCollector { + return &VersionUpdateCollector{ + versionUpdate: prometheus.NewDesc(prometheus.BuildFQName(namespace, "", "version_update"), + "New Rocket Pool version available", + nil, nil, + ), + versionUpdateInfo: prometheus.NewDesc(prometheus.BuildFQName(namespace, "", "version_update_info"), + "The latest available Rocket Pool version", + []string{"version"}, nil, + ), + current: shared.RocketPoolVersion(), + latestURL: githubLatestReleaseURL, + client: &http.Client{ + Timeout: versionCheckTimeout, + }, + logf: logf, + } +} + +// Describe writes metric descriptions to the Prometheus channel. +func (collector *VersionUpdateCollector) Describe(channel chan<- *prometheus.Desc) { + channel <- collector.versionUpdate + channel <- collector.versionUpdateInfo +} + +// Collect emits the latest cached version update status. +func (collector *VersionUpdateCollector) Collect(channel chan<- prometheus.Metric) { + collector.checkIfDue(context.Background()) + + collector.mu.Lock() + updateAvailable := collector.updateAvailable + latestVersion := collector.latestVersion + collector.mu.Unlock() + + channel <- prometheus.MustNewConstMetric( + collector.versionUpdate, prometheus.GaugeValue, updateAvailable) + if latestVersion != "" { + channel <- prometheus.MustNewConstMetric( + collector.versionUpdateInfo, prometheus.GaugeValue, 1, latestVersion) + } +} + +func (collector *VersionUpdateCollector) checkIfDue(ctx context.Context) { + collector.mu.Lock() + defer collector.mu.Unlock() + + if time.Since(collector.lastChecked) < versionCheckInterval { + return + } + collector.lastChecked = time.Now() + + updateAvailable, latestVersion, err := collector.checkForUpdate(ctx) + if err != nil { + if collector.logf != nil { + collector.logf("Error checking latest Rocket Pool release: %v", err) + } + return + } + + if updateAvailable { + collector.updateAvailable = 1 + } else { + collector.updateAvailable = 0 + } + collector.latestVersion = latestVersion +} + +func (collector *VersionUpdateCollector) checkForUpdate(ctx context.Context) (bool, string, error) { + latest, err := collector.getLatestVersion(ctx) + if err != nil { + return false, "", err + } + + updateAvailable, err := isNewerVersion(collector.current, latest) + if err != nil { + return false, "", err + } + + return updateAvailable, latest, nil +} + +func (collector *VersionUpdateCollector) getLatestVersion(ctx context.Context) (string, error) { + req, err := http.NewRequestWithContext(ctx, http.MethodGet, collector.latestURL, nil) + if err != nil { + return "", fmt.Errorf("error creating GitHub release request: %w", err) + } + req.Header.Set("Accept", "application/vnd.github+json") + req.Header.Set("User-Agent", "rocketpool-smartnode") + + resp, err := collector.client.Do(req) + if err != nil { + return "", fmt.Errorf("error fetching latest GitHub release: %w", err) + } + defer func() { + if err := resp.Body.Close(); err != nil { + collector.logf("Error closing GitHub release response body: %v", err) + } + }() + + if resp.StatusCode != http.StatusOK { + return "", fmt.Errorf("GitHub release request returned status %s", resp.Status) + } + + var release githubReleaseResponse + if err := json.NewDecoder(resp.Body).Decode(&release); err != nil { + return "", fmt.Errorf("error decoding latest GitHub release: %w", err) + } + if strings.TrimSpace(release.TagName) == "" { + return "", fmt.Errorf("latest GitHub release did not include a tag_name") + } + + return release.TagName, nil +} + +func isNewerVersion(currentVersion string, latestVersion string) (bool, error) { + current, err := semver.ParseTolerant(strings.TrimSpace(currentVersion)) + if err != nil { + return false, fmt.Errorf("error parsing current version %q: %w", currentVersion, err) + } + + latest, err := semver.ParseTolerant(strings.TrimSpace(latestVersion)) + if err != nil { + return false, fmt.Errorf("error parsing latest version %q: %w", latestVersion, err) + } + + return latest.Compare(current) > 0, nil +} diff --git a/rocketpool/node/collectors/version-update-collector_test.go b/rocketpool/node/collectors/version-update-collector_test.go new file mode 100644 index 000000000..2c9e5b0d5 --- /dev/null +++ b/rocketpool/node/collectors/version-update-collector_test.go @@ -0,0 +1,78 @@ +package collectors + +import ( + "context" + "net/http" + "net/http/httptest" + "testing" +) + +func TestIsNewerVersion(t *testing.T) { + tests := []struct { + name string + current string + latest string + want bool + }{ + { + name: "latest version is newer", + current: "1.20.2", + latest: "v1.20.3", + want: true, + }, + { + name: "same version is not newer", + current: "1.20.2", + latest: "v1.20.2", + want: false, + }, + { + name: "older latest version is not newer", + current: "1.20.2", + latest: "v1.20.1", + want: false, + }, + { + name: "dev version is newer than latest", + current: "v1.20.3-dev", + latest: "v1.20.2", + want: false, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := isNewerVersion(tt.current, tt.latest) + if err != nil { + t.Fatalf("isNewerVersion returned error: %v", err) + } + if got != tt.want { + t.Fatalf("isNewerVersion(%q, %q) = %t, want %t", tt.current, tt.latest, got, tt.want) + } + }) + } +} + +func TestCheckIfDueCachesLatestVersion(t *testing.T) { + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + _, err := w.Write([]byte(`{"tag_name":"v1.20.3"}`)) + if err != nil { + t.Fatalf("error writing response: %v", err) + } + })) + defer server.Close() + + collector := NewVersionUpdateCollector(nil) + collector.current = "1.20.2" + collector.latestURL = server.URL + collector.client = server.Client() + + collector.checkIfDue(context.Background()) + + if collector.updateAvailable != 1 { + t.Fatalf("updateAvailable = %f, want 1", collector.updateAvailable) + } + if collector.latestVersion != "v1.20.3" { + t.Fatalf("latestVersion = %q, want %q", collector.latestVersion, "v1.20.3") + } +} diff --git a/rocketpool/node/metrics-exporter.go b/rocketpool/node/metrics-exporter.go index c2e650c33..35371b742 100644 --- a/rocketpool/node/metrics-exporter.go +++ b/rocketpool/node/metrics-exporter.go @@ -71,6 +71,7 @@ func runMetricsServer(ctx context.Context, c *cli.Command, logger log.ColorLogge beaconCollector := collectors.NewBeaconCollector(rp, bc, ec, nodeAccount.Address, stateLocker) smoothingPoolCollector := collectors.NewSmoothingPoolCollector(rp, ec, stateLocker) governanceCollector := collectors.NewGovernanceCollector(rp) + versionUpdateCollector := collectors.NewVersionUpdateCollector(logger.Printlnf) // Set up Prometheus registry := prometheus.NewRegistry() @@ -84,6 +85,7 @@ func runMetricsServer(ctx context.Context, c *cli.Command, logger log.ColorLogge registry.MustRegister(beaconCollector) registry.MustRegister(smoothingPoolCollector) registry.MustRegister(governanceCollector) + registry.MustRegister(versionUpdateCollector) // Set up snapshot checking if enabled if cfg.Smartnode.GetRocketSignerRegistryAddress() != "" { diff --git a/shared/services/rocketpool/assets/install/dashboards/Rocket Pool Dashboard v1.4.1.json b/shared/services/rocketpool/assets/install/dashboards/Rocket Pool Dashboard v1.4.1.json new file mode 100644 index 000000000..6117004df --- /dev/null +++ b/shared/services/rocketpool/assets/install/dashboards/Rocket Pool Dashboard v1.4.1.json @@ -0,0 +1,5437 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "description": "This is the standard dashboard for Rocket Pool node operators.", + "editable": true, + "fiscalYearStartMonth": 0, + "gnetId": 18391, + "graphTooltip": 0, + "links": [], + "liveNow": false, + "panels": [ + { + "gridPos": { + "h": 1, + "w": 12, + "x": 0, + "y": 0 + }, + "id": 163, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "", + "mode": "markdown" + }, + "pluginVersion": "9.5.18", + "title": "Hardware Stats", + "transparent": true, + "type": "text" + }, + { + "gridPos": { + "h": 1, + "w": 9, + "x": 13, + "y": 0 + }, + "id": 165, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "", + "mode": "markdown" + }, + "pluginVersion": "9.5.18", + "title": "Validator Stats", + "transparent": true, + "type": "text" + }, + { + "description": "A count of how long your Beacon Node has been running. If you don't restart it, this is about the same as your total system uptime.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "rgb(212, 212, 212)", + "value": null + } + ] + }, + "unit": "dtdhms" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 2, + "x": 0, + "y": 1 + }, + "id": 40, + "links": [], + "maxDataPoints": 100, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "auto" + }, + "pluginVersion": "9.5.18", + "targets": [ + { + "exemplar": true, + "expr": "time() - process_start_time_seconds{job=\"eth2\"}", + "interval": "", + "legendFormat": "", + "refId": "A" + } + ], + "title": "Beacon Node Uptime", + "type": "stat" + }, + { + "description": "The temperature of your CPU (you can set this to Tctl or Tdie, whichever you prefer to monitor).\n\nTo get the correct chip and sensor ID, you'll want to run `sensors` from the `lm-sensors` package. See the documentation at https://docs.rocketpool.net/guides/node/grafana.html for more information.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "#EAB839", + "value": 50 + }, + { + "color": "red", + "value": 65 + } + ] + }, + "unit": "celsius" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 3, + "x": 2, + "y": 1 + }, + "id": 82, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "auto" + }, + "pluginVersion": "9.5.18", + "targets": [ + { + "editorMode": "code", + "exemplar": true, + "expr": "node_hwmon_temp_celsius{job=\"node\", chip=\"\", sensor=\"\"}", + "interval": "", + "legendFormat": "", + "range": true, + "refId": "A" + } + ], + "title": "CPU Temp", + "type": "stat" + }, + { + "description": "This will turn red when your system needs to be rebooted because of security updates.\n\nSetting this up is Operating System specific, so it doesn't come ready out of the box; see the documentation at https://docs.rocketpool.net/guides/node/grafana.html for more information.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [ + { + "options": { + "0": { + "color": "transparent", + "index": 1, + "text": "No" + }, + "1": { + "color": "red", + "index": 0, + "text": "Reboot Required" + } + }, + "type": "value" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 2, + "x": 5, + "y": 1 + }, + "id": 224, + "options": { + "colorMode": "background", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "auto" + }, + "pluginVersion": "9.5.18", + "targets": [ + { + "exemplar": true, + "expr": "os_reboot_required{job=\"node\"}", + "interval": "", + "legendFormat": "", + "refId": "A" + } + ], + "title": "Reboot Needed?", + "type": "stat" + }, + { + "description": "Tracks any updates that are available for your OS or for Rocket Pool but haven't been applied yet. When one of these numbers is higher than 0, it means you should update your system or Rocket Pool accordingly.\n\nSetting this up is Operating System specific, so it doesn't come ready out of the box; see the documentation at https://docs.rocketpool.net/guides/node/grafana.html for more information.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "transparent", + "value": null + }, + { + "color": "red", + "value": 1 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 3, + "x": 7, + "y": 1 + }, + "id": 94, + "options": { + "colorMode": "background", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "auto" + }, + "pluginVersion": "9.5.18", + "targets": [ + { + "exemplar": true, + "expr": "max(os_upgrades_pending{job=\"node\"})", + "interval": "", + "legendFormat": "OS", + "refId": "A" + }, + { + "exemplar": true, + "expr": "rocketpool_version_update_info{job=\"rocketpool\"}", + "format": "time_series", + "hide": false, + "interval": "", + "legendFormat": "SN", + "range": true, + "refId": "B" + } + ], + "title": "Available Updates", + "transformations": [ + { + "id": "labelsToFields", + "options": { + "keepLabels": [ + "version" + ], + "valueLabel": "version" + } + } + ], + "type": "stat" + }, + { + "description": "How much of your total swap space you're currently using. If you have swap space enabled, you want this to be as low as possible - otherwise, your system is running out of free RAM.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 2, + "mappings": [], + "max": 1, + "min": 0, + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "#EAB839", + "value": 20 + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "percentunit" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 2, + "x": 10, + "y": 1 + }, + "id": 92, + "options": { + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true, + "text": {} + }, + "pluginVersion": "9.5.18", + "targets": [ + { + "exemplar": true, + "expr": "((node_memory_SwapTotal_bytes{job=\"node\"} - node_memory_SwapFree_bytes{job=\"node\"}) / node_memory_SwapTotal_bytes{job=\"node\"})", + "interval": "", + "legendFormat": "", + "refId": "A" + } + ], + "title": "Swap Space Usage", + "type": "gauge" + }, + { + "description": "Tracks the activity of all of your validators on the Beacon Chain. This is a cumulative count; it starts at 0 when your node first starts up, and then continuously increments as it goes.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 2, + "x": 13, + "y": 1 + }, + "id": 13, + "links": [], + "maxDataPoints": 100, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "auto" + }, + "pluginVersion": "9.5.18", + "targets": [ + { + "editorMode": "code", + "exemplar": true, + "expr": "sum(vc_signed_attestations_total{job=\"validator\", status=\"success\"}) OR # Lighthouse\nsum(vc_published_attestations_total{job=\"validator\"}) OR # Lodestar\nsum(beacon_attestations_sent_total{job=\"validator\"}) OR # Nimbus\nsum(validator_successful_attestations{job=\"validator\"}) OR # Prysm\nvalidator_duties_performed_total{job=\"validator\", type=\"attestation\", result=\"success\"} OR # Teku\non() vector(0)", + "hide": false, + "interval": "", + "legendFormat": "Attestations", + "range": true, + "refId": "B" + }, + { + "editorMode": "code", + "exemplar": true, + "expr": "sum(vc_signed_beacon_blocks_total{job=\"validator\", status=\"success\"}) OR # Lighthouse\nsum(vc_block_published_total{job=\"validator\"}) OR # Lodestar\nsum(beacon_blocks_sent_total{job=\"validator\"}) OR # Nimbus\nsum(validator_successful_proposals{job=\"validator\"}) OR # Prysm\nvalidator_duties_performed_total{job=\"validator\", type=\"block\", result=\"success\"} OR # Teku\non() vector(0)", + "interval": "", + "legendFormat": "Proposals", + "range": true, + "refId": "A" + } + ], + "title": "Validator Activity", + "type": "stat" + }, + { + "description": "This tells you when your next attestation duty will arrive. Use it to find an optimal time to take your clients down for maintenance so you're back up and running before it hits.\n\n- NOTE: **Lodestar** and **Teku** do not provide this information.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [ + { + "options": { + "0": { + "color": "text", + "index": 0, + "text": "Unavailable" + } + }, + "type": "value" + }, + { + "options": { + "match": "null", + "result": { + "color": "text", + "index": 1, + "text": "Unavailable" + } + }, + "type": "special" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 2, + "x": 15, + "y": 1 + }, + "id": 154, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "auto" + }, + "pluginVersion": "9.5.18", + "targets": [ + { + "editorMode": "code", + "exemplar": true, + "expr": "((min(vc_attestation_duty_slot{job=\"validator\"}) - scalar(beacon_head_slot{job=\"eth2\"})) * 12) OR # Lighthouse\nmax(next_action_wait{job=\"eth2\"} OR # Nimbus\n(min((validator_next_attestation_slot{job=\"validator\"} - scalar(beacon_slot{job=\"eth2\"})) > 0 - 1) * 12) OR # Prysm\non() vector(0))", + "interval": "", + "legendFormat": "", + "range": true, + "refId": "A" + } + ], + "title": "Next Attestation", + "type": "stat" + }, + { + "description": "Tracks the activity of all of your validators on the Beacon Chain.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "stepAfter", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 1, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 5, + "x": 17, + "y": 1 + }, + "id": 30, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "8.1.1", + "targets": [ + { + "editorMode": "code", + "exemplar": true, + "expr": "(sum(rate(vc_signed_beacon_blocks_total{job=\"validator\", status=\"success\"}[$__rate_interval])) OR # Lighthouse\nsum(rate(vc_block_published_total{job=\"validator\"}[$__rate_interval])) OR # Lodestar\nsum(rate(beacon_blocks_sent_total{job=\"validator\"}[$__rate_interval])) OR # Nimbus\nsum(rate(validator_successful_proposals{job=\"validator\"}[$__rate_interval])) OR # Prysm\nrate(validator_duties_performed{job=\"validator\", type=\"block\", result=\"success\"}[$__rate_interval]) OR # Teku\non() vector(0)) * 45", + "hide": false, + "interval": "", + "legendFormat": "Proposal", + "range": true, + "refId": "A" + }, + { + "editorMode": "code", + "exemplar": true, + "expr": "(sum(rate(vc_signed_attestations_total{job=\"validator\", status=\"success\"}[$__rate_interval])) OR # Lighthouse\nsum(rate(vc_published_attestations_total{job=\"validator\"}[$__rate_interval])) OR # Lodestar\nsum(rate(beacon_attestations_sent_total{job=\"validator\"}[$__rate_interval])) OR # Nimbus\nsum(rate(validator_successful_attestations{job=\"validator\"}[$__rate_interval])) OR # Prysm\nrate(validator_duties_performed{job=\"validator\", type=\"attestation\", result=\"success\"}[$__rate_interval]) OR # Teku\non() vector(0)) * 45", + "hide": false, + "interval": "", + "legendFormat": "Attestation", + "range": true, + "refId": "B" + } + ], + "title": "Validator Activity", + "type": "timeseries" + }, + { + "description": "The CPU usage of your Execution Client and Beacon Node + Validator Client pair, as well as your system total (with respect to all cores on your CPU).", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "max": 100, + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "semi-dark-blue", + "value": null + } + ] + }, + "unit": "percent" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "EC" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "dark-yellow", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "System Total" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "dark-green", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 4, + "w": 6, + "x": 0, + "y": 5 + }, + "id": 8, + "links": [], + "maxDataPoints": 100, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "vertical", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "auto" + }, + "pluginVersion": "9.5.18", + "targets": [ + { + "editorMode": "code", + "expr": "(system_cpu_procload{job=\"geth\"} / scalar(count without(cpu, mode) (node_cpu_seconds_total{mode=\"idle\"}))) OR # Geth\nirate(process_cpu_seconds_total{job=\"eth1\"}[$__rate_interval]) * 100 / scalar(count without(cpu, mode) (node_cpu_seconds_total{mode=\"idle\"})) OR # Besu, Nethermind\nirate(reth_process_cpu_seconds_total{job=\"eth1\"}[$__rate_interval]) * 100 / scalar(count without(cpu, mode) (node_cpu_seconds_total{mode=\"idle\"})) # Reth", + "hide": false, + "legendFormat": "EC", + "range": true, + "refId": "C" + }, + { + "editorMode": "code", + "exemplar": true, + "expr": "(sum(avg (irate(process_cpu_seconds_total{job=\"eth2\"}[$__rate_interval]))) + (sum(avg (irate(process_cpu_seconds_total{job=\"validator\"}[$__rate_interval]))) or vector(0))) * 100 / (count (node_cpu_seconds_total{job=\"node\", mode=\"idle\"}))", + "interval": "", + "legendFormat": "BN+VC", + "range": true, + "refId": "A" + }, + { + "editorMode": "code", + "expr": "(1 - avg (irate(node_cpu_seconds_total{job=\"node\", mode=\"idle\"}[$__rate_interval]))) * 100", + "hide": false, + "legendFormat": "System Total", + "range": true, + "refId": "B" + } + ], + "title": "CPU Usage", + "type": "stat" + }, + { + "description": "The amount of RAM that your Execution Client, Beacon Node and Validator Client combo, and your whole system are using.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "blue", + "value": null + } + ] + }, + "unit": "bytes" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "EC" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "dark-yellow", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "System Total" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "dark-green", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 4, + "w": 6, + "x": 6, + "y": 5 + }, + "id": 260, + "links": [], + "maxDataPoints": 100, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "vertical", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "auto" + }, + "pluginVersion": "9.5.18", + "targets": [ + { + "editorMode": "code", + "exemplar": true, + "expr": "system_memory_used{job=\"geth\"} OR # Geth\nprocess_resident_memory_bytes{job=\"eth1\"} OR # Besu\nprocess_working_set_bytes{job=\"eth1\"} OR # Nethermind\nreth_process_resident_memory_bytes{job=\"eth1\"} # Reth", + "interval": "", + "legendFormat": "EC", + "range": true, + "refId": "A" + }, + { + "editorMode": "code", + "expr": "sum(process_resident_memory_bytes{job=\"eth2\"}) + (sum(process_resident_memory_bytes{job=\"validator\"}) or vector(0))", + "hide": false, + "legendFormat": "BN+VC", + "range": true, + "refId": "B" + }, + { + "editorMode": "code", + "expr": "node_memory_MemTotal_bytes{job=\"node\"} - node_memory_MemAvailable_bytes{job=\"node\"}", + "hide": false, + "legendFormat": "System Total", + "range": true, + "refId": "C" + } + ], + "title": "RAM Usage", + "type": "stat" + }, + { + "description": "The number of block proposals you have coming up in the next few minutes. If you were planning on taking your node down for maintenance, you should wait until after the proposals because they're worth a lot of ETH!", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "transparent", + "value": null + }, + { + "color": "orange", + "value": 1 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 2, + "x": 13, + "y": 5 + }, + "id": 231, + "options": { + "colorMode": "background", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "9.5.18", + "targets": [ + { + "exemplar": true, + "expr": "rocketpool_beacon_upcoming_proposals", + "interval": "", + "legendFormat": "", + "refId": "A" + } + ], + "title": "Upcoming Proposals", + "type": "stat" + }, + { + "description": "The number of [sync committees](https://github.com/ethereum/annotated-spec/blob/master/altair/sync-protocol.md#introduction) that you're about to be a part of, and that you're currently a part of.\n\nIf you were planning on doing maintenance to your node, **you should wait until the sync committee is over**. Not only are they worth an **extremely** large amount of ETH, but if you miss attestations during a sync committee, you **lose an extremely large amount of ETH** instead!\n\nYou should be online as long as possible while you are in a sync committee.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "transparent", + "value": null + }, + { + "color": "orange", + "value": 1 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 2, + "x": 15, + "y": 5 + }, + "id": 229, + "options": { + "colorMode": "background", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "9.5.18", + "targets": [ + { + "exemplar": true, + "expr": "rocketpool_beacon_upcoming_sync_committee", + "interval": "", + "legendFormat": "Upcoming", + "refId": "A" + }, + { + "exemplar": true, + "expr": "rocketpool_beacon_active_sync_committee", + "hide": false, + "interval": "", + "legendFormat": "Active", + "refId": "B" + } + ], + "title": "Sync Committees", + "type": "stat" + }, + { + "description": "This chart shows the overall performance of your total attestations on the Beacon Chain, broken down by the individual attestation components - correct head, correct source, and correct target. If any of these are below 100%, you lost some rewards for submitting a late, partially incorrect, or fully incorrect attestation. For a detailed explanation of each component, take a look at Ben Edgington's explainer: https://eth2book.info/bellatrix/annotated-spec/\n\nThis is updated once per epoch, once your Beacon Node can see how well your node did during the previous epoch.\n\nNOTE: **Lighthouse** and **Teku** currently do not provide source correctness information, only head and target.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "hue", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "max": 1.05, + "min": -0.05, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "percentunit" + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 5, + "x": 17, + "y": 7 + }, + "id": 26, + "interval": "", + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "9.3.6", + "targets": [ + { + "editorMode": "code", + "expr": "(irate(validator_monitor_prev_epoch_on_chain_target_attester_hit{job=\"eth2\", validator=\"total\"}[$__rate_interval]) / (irate(validator_monitor_prev_epoch_on_chain_target_attester_hit{job=\"eth2\", validator=\"total\"}[$__rate_interval]) + irate(validator_monitor_prev_epoch_on_chain_target_attester_miss{job=\"eth2\", validator=\"total\"}[$__rate_interval]))) OR # Lighthouse\n(irate(validator_monitor_prev_epoch_on_chain_target_attester_hit_total{job=\"eth2\"}[$__rate_interval]) / (irate(validator_monitor_prev_epoch_on_chain_target_attester_hit_total{job=\"eth2\"}[$__rate_interval]) + irate(validator_monitor_prev_epoch_on_chain_target_attester_miss_total{job=\"eth2\"}[$__rate_interval]))) OR # Nimbus and Lodestar\n(sum(validator_correctly_voted_target{job=\"validator\"}) / count(validator_correctly_voted_target{job=\"validator\"})) OR # Prysm\n(validator_performance_correct_target_count{job=\"eth2\"} / validator_performance_expected_attestations{job=\"eth2\"}) # Teku", + "hide": false, + "legendFormat": "Target", + "range": true, + "refId": "B" + }, + { + "editorMode": "code", + "expr": "irate(validator_monitor_prev_epoch_on_chain_source_attester_hit_total{job=\"eth2\"}[$__rate_interval]) / (irate(validator_monitor_prev_epoch_on_chain_source_attester_hit_total{job=\"eth2\"}[$__rate_interval]) + irate(validator_monitor_prev_epoch_on_chain_source_attester_miss_total{job=\"eth2\"}[$__rate_interval])) OR # Nimbus and Lodestar\n(sum(validator_correctly_voted_source{job=\"validator\"}) / count(validator_correctly_voted_source{job=\"validator\"})) # Prysm", + "hide": false, + "legendFormat": "Source", + "range": true, + "refId": "A" + }, + { + "editorMode": "code", + "expr": "irate(validator_monitor_prev_epoch_on_chain_head_attester_hit{job=\"eth2\", validator=\"total\"}[$__rate_interval]) / (irate(validator_monitor_prev_epoch_on_chain_head_attester_hit{job=\"eth2\", validator=\"total\"}[$__rate_interval]) + irate(validator_monitor_prev_epoch_on_chain_head_attester_miss{job=\"eth2\", validator=\"total\"}[$__rate_interval])) OR # Lighthouse\nirate(validator_monitor_prev_epoch_on_chain_head_attester_hit_total{job=\"eth2\"}[$__rate_interval]) / (irate(validator_monitor_prev_epoch_on_chain_head_attester_hit_total{job=\"eth2\"}[$__rate_interval]) + irate(validator_monitor_prev_epoch_on_chain_head_attester_miss_total{job=\"eth2\"}[$__rate_interval])) OR # Nimbus and Lodestar\n(sum(validator_correctly_voted_head{job=\"validator\"}) / count(validator_correctly_voted_head{job=\"validator\"})) OR # Prysm\n(validator_performance_correct_head_block_count{job=\"eth2\"} / validator_performance_expected_attestations{job=\"eth2\"}) # Teku", + "hide": false, + "legendFormat": "Head", + "range": true, + "refId": "E" + } + ], + "title": "Attestation Accuracy", + "transformations": [], + "type": "timeseries" + }, + { + "description": "Tracks the amount of CPU consumption for the Execution Client, the Beacon Node, and the total system. 100% means all of your CPU core are being used at their full capacity. The orange line indicates how much CPU a single core can provide in your system.\n\n**Note:** The EC's usage is stacked *on top of* the BN+VC, so it shows the aggregated amount of EC + BN + VC.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 60, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "short" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Single Core Cap" + }, + "properties": [ + { + "id": "custom.fillOpacity", + "value": 0 + }, + { + "id": "custom.lineWidth", + "value": 2 + }, + { + "id": "color", + "value": { + "fixedColor": "dark-orange", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "BN+VC" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#3274D9", + "mode": "fixed" + } + }, + { + "id": "custom.stacking", + "value": { + "group": "Clients", + "mode": "normal" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "EC (Stacked)" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "dark-yellow", + "mode": "fixed" + } + }, + { + "id": "custom.stacking", + "value": { + "group": "Clients", + "mode": "normal" + } + } + ] + } + ] + }, + "gridPos": { + "h": 6, + "w": 6, + "x": 0, + "y": 9 + }, + "id": 56, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "8.1.1", + "targets": [ + { + "editorMode": "code", + "exemplar": true, + "expr": "(1 - avg by (instance) (irate(node_cpu_seconds_total{job=\"node\", mode=\"idle\"}[$__rate_interval]))) * 100", + "hide": false, + "interval": "", + "legendFormat": "Total", + "range": true, + "refId": "B" + }, + { + "editorMode": "code", + "exemplar": true, + "expr": "(sum(avg (irate(process_cpu_seconds_total{job=\"eth2\"}[$__rate_interval]))) + (sum(avg (irate(process_cpu_seconds_total{job=\"validator\"}[$__rate_interval]))) or vector(0))) * 100 / (count (node_cpu_seconds_total{job=\"node\", mode=\"idle\"}))", + "instant": false, + "interval": "", + "legendFormat": "BN+VC", + "refId": "A" + }, + { + "editorMode": "code", + "expr": "(system_cpu_procload{job=\"geth\"} / scalar(count without(cpu, mode) (node_cpu_seconds_total{mode=\"idle\"}))) OR # Geth\nirate(process_cpu_seconds_total{job=\"eth1\"}[$__rate_interval]) * 100 / scalar(count without(cpu, mode) (node_cpu_seconds_total{mode=\"idle\"})) OR # Besu, Nethermind\nirate(reth_process_cpu_seconds_total{job=\"eth1\"}[$__rate_interval]) * 100 / scalar(count without(cpu, mode) (node_cpu_seconds_total{mode=\"idle\"})) # Reth", + "hide": false, + "legendFormat": "EC (Stacked)", + "range": true, + "refId": "D" + }, + { + "editorMode": "code", + "exemplar": true, + "expr": "100 / (count (node_cpu_seconds_total{job=\"node\", mode=\"idle\"}))", + "format": "time_series", + "hide": false, + "instant": false, + "interval": "", + "legendFormat": "Single Core Cap", + "refId": "C" + } + ], + "title": "CPU Usage", + "type": "timeseries" + }, + { + "description": "Tracks the total amount of RAM usage by the eth2 client and the entire system, versus how much is available.\n\n**Note:** The EC's usage is stacked *on top of* the BN+VC, so it shows the aggregated amount of EC + BN + VC.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "bits" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Total Used" + }, + "properties": [ + { + "id": "custom.fillOpacity", + "value": 60 + }, + { + "id": "custom.lineWidth", + "value": 2 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "BN+VC" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#3274D9", + "mode": "fixed" + } + }, + { + "id": "custom.fillOpacity", + "value": 60 + }, + { + "id": "custom.lineWidth", + "value": 2 + }, + { + "id": "custom.stacking", + "value": { + "group": "Clients", + "mode": "normal" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "EC (Stacked)" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "dark-yellow", + "mode": "fixed" + } + }, + { + "id": "custom.lineWidth", + "value": 2 + }, + { + "id": "custom.fillOpacity", + "value": 60 + }, + { + "id": "custom.stacking", + "value": { + "group": "Clients", + "mode": "normal" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "RAM Limit" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "dark-orange", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 6, + "w": 6, + "x": 6, + "y": 9 + }, + "id": 60, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "8.1.1", + "targets": [ + { + "editorMode": "code", + "exemplar": true, + "expr": "node_memory_MemTotal_bytes{job=\"node\"} - node_memory_MemAvailable_bytes{job=\"node\"}", + "interval": "", + "legendFormat": "Total Used", + "range": true, + "refId": "A" + }, + { + "editorMode": "code", + "exemplar": true, + "expr": "sum(process_resident_memory_bytes{job=\"eth2\"}) + (sum(process_resident_memory_bytes{job=\"validator\"}) or vector(0))", + "hide": false, + "interval": "", + "legendFormat": "BN+VC", + "range": true, + "refId": "C" + }, + { + "editorMode": "code", + "expr": "system_memory_used{job=\"geth\"} OR # Geth\nprocess_resident_memory_bytes{job=\"eth1\"} OR # Besu\nprocess_working_set_bytes{job=\"eth1\"} OR # Nethermind\nreth_process_resident_memory_bytes{job=\"eth1\"} # Reth", + "hide": false, + "legendFormat": "EC (Stacked)", + "range": true, + "refId": "D" + }, + { + "editorMode": "code", + "exemplar": true, + "expr": "node_memory_MemTotal_bytes{job=\"node\"}", + "hide": false, + "interval": "", + "legendFormat": "RAM Limit", + "range": true, + "refId": "B" + } + ], + "title": "RAM Usage", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "description": "How many validators you currently have running on your node.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "blue", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 4, + "x": 13, + "y": 9 + }, + "id": 265, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "9.5.18", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "editorMode": "code", + "exemplar": true, + "expr": "rocketpool_node_active_minipool_count", + "interval": "", + "legendFormat": "Minipools", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "editorMode": "code", + "exemplar": true, + "expr": "rocketpool_node_megapool_active_validator_count", + "hide": false, + "interval": "", + "legendFormat": "Megapool", + "range": true, + "refId": "B" + } + ], + "title": "Your Validators", + "type": "stat" + }, + { + "gridPos": { + "h": 1, + "w": 9, + "x": 13, + "y": 13 + }, + "id": 234, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "", + "mode": "markdown" + }, + "pluginVersion": "9.5.18", + "title": "Connectivity", + "transparent": true, + "type": "text" + }, + { + "description": "How many peers your EC is currently connected to.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "max": 49, + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "red", + "value": null + }, + { + "color": "#EAB839", + "value": 12 + }, + { + "color": "green", + "value": 20 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 2, + "x": 13, + "y": 14 + }, + "id": 237, + "links": [], + "maxDataPoints": 100, + "options": { + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true, + "text": {} + }, + "pluginVersion": "9.5.18", + "targets": [ + { + "editorMode": "code", + "exemplar": true, + "expr": "p2p_peers{job=\"geth\"} OR # Geth\nethereum_peer_count{job=\"eth1\"} OR # Nethermind, Besu\nreth_network_connected_peers{job=\"eth1\"} # Reth", + "interval": "", + "legendFormat": "", + "range": true, + "refId": "A" + } + ], + "title": "EC Peers", + "type": "gauge" + }, + { + "description": "How many peers your Beacon Node is currently connected to on the Beacon Chain.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "max": 160, + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "red", + "value": null + }, + { + "color": "#EAB839", + "value": 20 + }, + { + "color": "green", + "value": 40 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 2, + "x": 15, + "y": 14 + }, + "id": 12, + "links": [], + "maxDataPoints": 100, + "options": { + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true, + "text": {} + }, + "pluginVersion": "9.5.18", + "targets": [ + { + "editorMode": "code", + "exemplar": true, + "expr": "sum(sync_peers_per_status{job=\"eth2\", sync_status=~\"Synced|Advanced\"}) OR # Lighthouse\nlodestar_peers_sync_count{job=\"eth2\"} OR # Lodestar\nnbc_peers{job=\"eth2\"} OR # Nimbus\np2p_peer_count{job=\"eth2\", state=\"Connected\"} OR # Prysm\nsum(beacon_peer_count{job=\"eth2\"}) # Teku", + "interval": "", + "legendFormat": "", + "range": true, + "refId": "A" + } + ], + "title": "BN Peers", + "type": "gauge" + }, + { + "description": "How many peers Execution Client and Beacon Node are currently connected to for blockchain traffic.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 5, + "x": 17, + "y": 14 + }, + "id": 51, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "8.1.1", + "targets": [ + { + "editorMode": "code", + "exemplar": true, + "expr": "sum(sync_peers_per_status{job=\"eth2\", sync_status=~\"Synced|Advanced\"}) OR # Lighthouse\nlodestar_peers_sync_count{job=\"eth2\"} OR # Lodestar\nnbc_peers{job=\"eth2\"} OR # Nimbus\np2p_peer_count{job=\"eth2\", state=\"Connected\"} OR # Prysm\nsum(beacon_peer_count{job=\"eth2\"}) # Teku", + "interval": "", + "legendFormat": "BN", + "range": true, + "refId": "B" + }, + { + "editorMode": "code", + "expr": "p2p_peers{job=\"geth\"} OR # Geth\nethereum_peer_count{job=\"eth1\"} OR # Nethermind, Besu\nreth_network_connected_peers{job=\"eth1\"} # Reth", + "hide": false, + "legendFormat": "EC", + "range": true, + "refId": "A" + } + ], + "title": "Peers", + "type": "timeseries" + }, + { + "description": "This tracks how long it takes between one of your processes trying to read from / write to your SSD, and when that operation is actually performed. Think of this like \"how long SSD reads and writes have to wait in a queue before completing\". The longer this time, the longer it takes for your node to perform its Beacon Chain duties.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 70, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 6, + "x": 0, + "y": 15 + }, + "id": 76, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "8.1.1", + "targets": [ + { + "exemplar": true, + "expr": "irate(node_pressure_io_waiting_seconds_total{job=\"node\"}[$__rate_interval])", + "interval": "", + "legendFormat": "", + "refId": "A" + } + ], + "title": "I/O Wait Time", + "type": "timeseries" + }, + { + "description": "The disk space used by your primary (Operating System) hard drive. Change the `device` option in this query to be your machine's hard drive.\n\nSee the documentation at https://docs.rocketpool.net/guides/node/grafana.html for more information.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "max": 1, + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "#EAB839", + "value": 0.75 + }, + { + "color": "red", + "value": 0.9 + } + ] + }, + "unit": "percentunit" + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 4, + "x": 6, + "y": 15 + }, + "id": 88, + "options": { + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true, + "text": {} + }, + "pluginVersion": "9.5.18", + "targets": [ + { + "editorMode": "code", + "exemplar": true, + "expr": "(node_filesystem_size_bytes{job=\"node\", mountpoint=\"/\"} - node_filesystem_avail_bytes{job=\"node\", mountpoint=\"/\"}) / node_filesystem_size_bytes{job=\"node\", mountpoint=\"/\"}", + "interval": "", + "legendFormat": "OS", + "range": true, + "refId": "A" + }, + { + "editorMode": "code", + "exemplar": true, + "expr": "(node_filesystem_size_bytes{job=\"node\", device=\"\"} - node_filesystem_avail_bytes{job=\"node\", device=\"\"}) / node_filesystem_size_bytes{job=\"node\", device=\"\"}", + "hide": false, + "interval": "", + "legendFormat": "Disk 2", + "range": true, + "refId": "B" + } + ], + "title": "Disk Space Used", + "type": "gauge" + }, + { + "description": "The temperature of your SSD.\n\nTo get the correct chip and sensor ID, you'll want to run `sensors` from the `lm-sensors` package. See the documentation at https://docs.rocketpool.net/guides/node/grafana.html for more information.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "#EAB839", + "value": 50 + }, + { + "color": "red", + "value": 65 + } + ] + }, + "unit": "celsius" + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 2, + "x": 10, + "y": 15 + }, + "id": 263, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "auto" + }, + "pluginVersion": "9.5.18", + "targets": [ + { + "editorMode": "code", + "exemplar": true, + "expr": "node_hwmon_temp_celsius{job=\"node\", chip=\"\", sensor=\"\"}", + "format": "time_series", + "interval": "", + "legendFormat": "OS", + "range": true, + "refId": "A" + }, + { + "editorMode": "code", + "exemplar": true, + "expr": "node_hwmon_temp_celsius{job=\"node\", chip=\"\", sensor=\"\"}", + "hide": false, + "interval": "", + "legendFormat": "Disk 2", + "range": true, + "refId": "B" + } + ], + "title": "Disk Temp", + "type": "stat" + }, + { + "description": "", + "gridPos": { + "h": 1, + "w": 9, + "x": 13, + "y": 19 + }, + "id": 258, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "", + "mode": "markdown" + }, + "pluginVersion": "9.5.18", + "transparent": true, + "type": "text" + }, + { + "description": "The average read/write latency of your SSD. The lower it is, the faster your machine can process and respond to Beacon Chain activities like attesting. Change the `device` setting in the queries to be the SSD you want to track (typically the one with your chain data on it).\n\nSee the documentation at https://docs.rocketpool.net/guides/node/grafana.html for more information.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 70, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 6, + "x": 0, + "y": 20 + }, + "id": 70, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "8.1.1", + "targets": [ + { + "editorMode": "code", + "exemplar": true, + "expr": "irate(node_disk_write_time_seconds_total{job=\"node\", device=\"\"}[$__rate_interval]) / irate(node_disk_writes_completed_total{job=\"node\", device=\"\"}[$__rate_interval])", + "hide": false, + "interval": "", + "legendFormat": "OS Write", + "range": true, + "refId": "A" + }, + { + "editorMode": "code", + "exemplar": true, + "expr": "irate(node_disk_read_time_seconds_total{job=\"node\", device=\"\"}[$__rate_interval]) / irate(node_disk_reads_completed_total{job=\"node\", device=\"\"}[$__rate_interval])", + "interval": "", + "legendFormat": "OS Read", + "range": true, + "refId": "B" + }, + { + "editorMode": "code", + "exemplar": true, + "expr": "irate(node_disk_write_time_seconds_total{job=\"node\", device=\"\"}[$__rate_interval]) / irate(node_disk_writes_completed_total{job=\"node\", device=\"\"}[$__rate_interval])", + "hide": false, + "interval": "", + "legendFormat": "Disk 2 Write", + "range": true, + "refId": "C" + }, + { + "editorMode": "code", + "exemplar": true, + "expr": "irate(node_disk_read_time_seconds_total{job=\"node\", device=\"\"}[$__rate_interval]) / irate(node_disk_reads_completed_total{job=\"node\", device=\"\"}[$__rate_interval])", + "hide": false, + "interval": "", + "legendFormat": "Disk 2 Read", + "range": true, + "refId": "D" + } + ], + "title": "SSD Latency", + "type": "timeseries" + }, + { + "description": "A chart showing the network I/O used by your main network adapter over time. To make it work, change the `device` setting in the queries to match the name of the network adapter you want to track (you can use `ifconfig` to get a list of network adapters and find the right one). \n\nSee the documentation at https://docs.rocketpool.net/guides/node/grafana.html for more information.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 70, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "bits" + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 4, + "x": 6, + "y": 20 + }, + "id": 80, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "8.1.1", + "targets": [ + { + "editorMode": "code", + "exemplar": true, + "expr": "irate(node_network_transmit_bytes_total{job=\"node\", device=\"\"}[$__rate_interval])", + "hide": false, + "interval": "", + "legendFormat": "Tx", + "range": true, + "refId": "B" + }, + { + "editorMode": "code", + "exemplar": true, + "expr": "irate(node_network_receive_bytes_total{job=\"node\", device=\"\"}[$__rate_interval])", + "interval": "", + "legendFormat": "Rx", + "range": true, + "refId": "A" + } + ], + "title": "Network Usage", + "type": "timeseries" + }, + { + "description": "The total network I/O that has gone through your main network adapter. To make it work, change the `device` setting in the queries to match the name of the network adapter you want to track (you can use `ifconfig` to get a list of network adapters and find the right one). \n\nSee the documentation at https://docs.rocketpool.net/guides/node/grafana.html for more information.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 2, + "x": 10, + "y": 20 + }, + "id": 74, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "auto" + }, + "pluginVersion": "9.5.18", + "targets": [ + { + "editorMode": "code", + "exemplar": true, + "expr": "node_network_transmit_bytes_total{job=\"node\", device=\"\"}", + "hide": false, + "interval": "", + "legendFormat": "Tx", + "range": true, + "refId": "B" + }, + { + "editorMode": "code", + "exemplar": true, + "expr": "node_network_receive_bytes_total{job=\"node\", device=\"\"}", + "interval": "", + "legendFormat": "Rx", + "range": true, + "refId": "A" + } + ], + "title": "Total Net I/O", + "type": "stat" + }, + { + "gridPos": { + "h": 1, + "w": 9, + "x": 13, + "y": 20 + }, + "id": 212, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "", + "mode": "markdown" + }, + "pluginVersion": "9.5.18", + "title": "Beacon Chain Rewards (Updates Every 5 Minutes)", + "transparent": true, + "type": "text" + }, + { + "description": "The total ETH balance of all of your Rocket Pool validators on the Beacon Chain. This includes both ETH belonging to you and ETH belonging to the pool stakers you used to make your minipools.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 2, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "blue", + "value": null + } + ] + }, + "unit": "ETH" + }, + "overrides": [] + }, + "gridPos": { + "h": 3, + "w": 3, + "x": 13, + "y": 21 + }, + "id": 72, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "auto" + }, + "pluginVersion": "9.5.18", + "targets": [ + { + "exemplar": true, + "expr": "rocketpool_node_beacon_balance{job=\"rocketpool\"}", + "interval": "", + "legendFormat": "", + "refId": "A" + } + ], + "title": "Beacon Balance", + "type": "stat" + }, + { + "description": "This is how much ETH is currently available for distribution in all of your minipool contracts (on the execution layer). Note that if any of them have a refund, this shows the total balance **minus** that refund amount - in other words, it shows whatever's left over after your refund.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 2, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "blue", + "value": null + } + ] + }, + "unit": "ETH" + }, + "overrides": [] + }, + "gridPos": { + "h": 3, + "w": 3, + "x": 16, + "y": 21 + }, + "id": 210, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "auto" + }, + "pluginVersion": "9.5.18", + "targets": [ + { + "editorMode": "code", + "exemplar": true, + "expr": "rocketpool_node_minipool_balance{job=\"rocketpool\"}", + "interval": "", + "legendFormat": "", + "range": true, + "refId": "A" + } + ], + "title": "Minipool Balance (EL)", + "type": "stat" + }, + { + "description": "A collection of other ETH rewards you can claim (or have claimed).\n\n- **Unclaimed ETH (SP)**: ETH you've earned from the Smoothing Pool that you haven't claimed yet.\n- **Claimed ETH (SP)**: ETH from the Smoothing Pool you've already claimed in the past.\n- **Total Refund**: ETH that belongs to you from special operations like bond reduction or solo staker migration. When you claim this, it goes directly to you - it isn't split with the pool stakers.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 2, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "transparent", + "value": null + }, + { + "color": "green", + "value": 0.00001 + } + ] + }, + "unit": "ETH" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Claimed ETH (SP)" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "transparent", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 9, + "w": 3, + "x": 19, + "y": 21 + }, + "id": 256, + "options": { + "colorMode": "background", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "value_and_name" + }, + "pluginVersion": "9.5.18", + "targets": [ + { + "editorMode": "code", + "expr": "rocketpool_node_unclaimed_eth_rewards{job=\"rocketpool\"}", + "hide": false, + "legendFormat": "Unclaimed ETH (SP)", + "range": true, + "refId": "B" + }, + { + "editorMode": "code", + "exemplar": true, + "expr": "rocketpool_node_claimed_eth_rewards{job=\"rocketpool\"}", + "interval": "", + "legendFormat": "Claimed ETH (SP)", + "range": true, + "refId": "A" + }, + { + "editorMode": "code", + "expr": "rocketpool_node_refund_balance{job=\"rocketpool\"}", + "hide": false, + "legendFormat": "Total Refund", + "range": true, + "refId": "C" + } + ], + "title": "Other ETH Rewards", + "type": "stat" + }, + { + "description": "This is how much ETH you will receive if you exit all of your validators on the Beacon Chain; it's your share of the total balance for each Rocket Pool minipool.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 4, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "ETH" + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 3, + "x": 13, + "y": 24 + }, + "id": 204, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "auto" + }, + "pluginVersion": "9.5.18", + "targets": [ + { + "editorMode": "code", + "exemplar": true, + "expr": "rocketpool_node_beacon_share{job=\"rocketpool\"}", + "interval": "", + "legendFormat": "", + "range": true, + "refId": "A" + } + ], + "title": "Your Beacon Chain Share", + "type": "stat" + }, + { + "description": "The total amount of ETH that belongs to you across the EL balances of all of your minipool contracts (minus any refunds you may have waiting).", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 4, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "ETH" + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 3, + "x": 16, + "y": 24 + }, + "id": 152, + "links": [], + "maxDataPoints": 100, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "9.5.18", + "targets": [ + { + "editorMode": "code", + "exemplar": true, + "expr": "rocketpool_node_minipool_share{job=\"rocketpool\"}", + "hide": false, + "interval": "", + "legendFormat": "annualized daily return", + "range": true, + "refId": "B" + } + ], + "title": "Your Minipool (EL) Share", + "type": "stat" + }, + { + "description": "", + "gridPos": { + "h": 1, + "w": 12, + "x": 0, + "y": 26 + }, + "id": 158, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "", + "mode": "markdown" + }, + "pluginVersion": "9.5.18", + "title": "Rocket Pool Network Stats (Updates Every 5 Minutes)", + "transparent": true, + "type": "text" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "description": "The total amount of ETH locked on the Rocket Pool network, including staked RPL (but not including Beacon Chain rewards).", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 2, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "blue", + "value": null + } + ] + }, + "unit": "locale" + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 3, + "x": 0, + "y": 27 + }, + "id": 156, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "auto" + }, + "pluginVersion": "9.5.18", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "editorMode": "code", + "exemplar": true, + "expr": "rocketpool_demand_deposit_pool_balance{job=\"rocketpool\"} + (rocketpool_node_megapool_standard_queue_size{job=\"rocketpool\"} + rocketpool_node_megapool_express_queue_size{job=\"rocketpool\"}) * 28 + rocketpool_supply_active_minipools{job=\"rocketpool\"} * 32 + rocketpool_rpl_total_value_staked{job=\"rocketpool\"} * rocketpool_rpl_rpl_price{job=\"rocketpool\"}", + "interval": "", + "legendFormat": "", + "range": true, + "refId": "A" + } + ], + "title": "Total ETH Locked", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "description": "The total amount of RPL staked across all megapools in the Rocket Pool network.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 2, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "orange", + "value": null + } + ] + }, + "unit": "locale" + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 3, + "x": 3, + "y": 27 + }, + "id": 214, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "auto" + }, + "pluginVersion": "9.5.18", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "editorMode": "code", + "exemplar": true, + "expr": "rocketpool_rpl_total_network_megapool_staked_rpl{job=\"rocketpool\"}", + "interval": "", + "legendFormat": "", + "range": true, + "refId": "A" + } + ], + "title": "Network Megapool RPL", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "description": "The total legacy RPL stake across all node operators on the Rocket Pool network.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 2, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "orange", + "value": null + } + ] + }, + "unit": "locale" + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 3, + "x": 6, + "y": 27 + }, + "id": 182, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "auto" + }, + "pluginVersion": "9.5.18", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "editorMode": "code", + "exemplar": true, + "expr": "rocketpool_rpl_total_network_legacy_staked_rpl{job=\"rocketpool\"}", + "interval": "", + "legendFormat": "", + "range": true, + "refId": "A" + } + ], + "title": "Network Legacy RPL", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "description": "The current balance of the Smoothing Pool. This is what will get distributed to each node operator opted into the Smoothing Pool at the end of each rewards interval.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 4, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "ETH" + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 3, + "x": 9, + "y": 27 + }, + "id": 250, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "auto" + }, + "pluginVersion": "9.5.18", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "editorMode": "code", + "exemplar": true, + "expr": "rocketpool_smoothing_pool_eth_balance", + "interval": "", + "legendFormat": "", + "range": true, + "refId": "A" + } + ], + "title": "Smoothing Pool Balance", + "type": "stat" + }, + { + "gridPos": { + "h": 1, + "w": 9, + "x": 13, + "y": 30 + }, + "id": 270, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "", + "mode": "markdown" + }, + "pluginVersion": "9.5.18", + "title": "Megapool Details (Updates every 5 minutes)", + "transparent": true, + "type": "text" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "description": "This is how much ETH the NO has bonded on the megapool", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 2, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "blue", + "value": null + } + ] + }, + "unit": "ETH" + }, + "overrides": [] + }, + "gridPos": { + "h": 3, + "w": 3, + "x": 13, + "y": 31 + }, + "id": 272, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "auto" + }, + "pluginVersion": "9.5.18", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "editorMode": "code", + "exemplar": true, + "expr": "rocketpool_node_megapool_node_bond{job=\"rocketpool\"}", + "interval": "", + "legendFormat": "", + "range": true, + "refId": "A" + } + ], + "title": "Bonded ETH", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "description": "This is how much ETH is currently available on the megapool contract", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 2, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "blue", + "value": null + } + ] + }, + "unit": "ETH" + }, + "overrides": [] + }, + "gridPos": { + "h": 3, + "w": 3, + "x": 16, + "y": 31 + }, + "id": 271, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "auto" + }, + "pluginVersion": "9.5.18", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "editorMode": "code", + "exemplar": true, + "expr": "rocketpool_node_megapool_eth_balance{job=\"rocketpool\"}", + "interval": "", + "legendFormat": "", + "range": true, + "refId": "A" + } + ], + "title": "Megapool Balance (EL)", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 2, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "transparent", + "value": null + } + ] + }, + "unit": "ETH" + }, + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 3, + "x": 19, + "y": 31 + }, + "id": 274, + "options": { + "colorMode": "background", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "value_and_name" + }, + "pluginVersion": "9.5.18", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "editorMode": "code", + "expr": "rocketpool_node_megapool_pending_rewards", + "hide": false, + "legendFormat": "{{type}}", + "range": true, + "refId": "B" + } + ], + "title": "Rewards Split", + "type": "stat" + }, + { + "description": "The amount of ETH that 1 rETH is worth.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 6, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "purple", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 3, + "x": 0, + "y": 32 + }, + "id": 178, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "auto" + }, + "pluginVersion": "9.5.18", + "targets": [ + { + "exemplar": true, + "expr": "rocketpool_performance_eth_reth_exchange_rate{job=\"rocketpool\"}", + "interval": "", + "legendFormat": "", + "refId": "A" + } + ], + "title": "rETH Price (ETH / rETH)", + "type": "stat" + }, + { + "description": "The amount of ETH that 1 RPL is worth, as reported by the Oracle DAO. This updates somewhat infrequently, so it's expected if it falls out of sync with other price watchers.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 6, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "orange", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 3, + "x": 3, + "y": 32 + }, + "id": 180, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "auto" + }, + "pluginVersion": "9.5.18", + "targets": [ + { + "exemplar": true, + "expr": "rocketpool_rpl_rpl_price{job=\"rocketpool\"}", + "interval": "", + "legendFormat": "", + "refId": "A" + } + ], + "title": "RPL Price (ETH / RPL)", + "type": "stat" + }, + { + "description": "The amount of ETH currently in the staking pool, waiting to be used by node operators to create new minipools.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "max": 18000, + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 18000 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 3, + "x": 6, + "y": 32 + }, + "id": 160, + "options": { + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true, + "text": {} + }, + "pluginVersion": "9.5.18", + "targets": [ + { + "exemplar": true, + "expr": "rocketpool_demand_deposit_pool_balance{job=\"rocketpool\"}", + "interval": "", + "legendFormat": "", + "refId": "A" + } + ], + "title": "Staking Pool Balance", + "type": "gauge" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "description": "How many validators are currently waiting to have ETH assigned from the deposit pool", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "blue", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 3, + "x": 9, + "y": 32 + }, + "id": 266, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "9.5.18", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "editorMode": "code", + "exemplar": true, + "expr": "rocketpool_node_megapool_standard_queue_size", + "interval": "", + "legendFormat": "Standard Queue", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "editorMode": "code", + "exemplar": true, + "expr": "rocketpool_node_megapool_express_queue_size", + "hide": false, + "interval": "", + "legendFormat": "Express Queue", + "range": true, + "refId": "B" + } + ], + "title": "Validators In Queue", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "description": "This is how much ETH the Rocket Pool protocol has provided for the megapool validators", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 2, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "blue", + "value": null + } + ] + }, + "unit": "ETH" + }, + "overrides": [] + }, + "gridPos": { + "h": 3, + "w": 3, + "x": 13, + "y": 34 + }, + "id": 273, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "auto" + }, + "pluginVersion": "9.5.18", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "editorMode": "code", + "exemplar": true, + "expr": "rocketpool_node_megapool_user_capital", + "interval": "", + "legendFormat": "", + "range": true, + "refId": "A" + } + ], + "title": "Borrowed ETH", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "description": "This is how much ETH the node has in debt. ", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 2, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "text", + "value": null + }, + { + "color": "red", + "value": 0.01 + } + ] + }, + "unit": "ETH" + }, + "overrides": [] + }, + "gridPos": { + "h": 3, + "w": 3, + "x": 16, + "y": 34 + }, + "id": 275, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "auto" + }, + "pluginVersion": "9.5.18", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "editorMode": "code", + "exemplar": true, + "expr": "rocketpool_node_node_debt", + "interval": "", + "legendFormat": "", + "range": true, + "refId": "A" + } + ], + "title": "Node Debt", + "type": "stat" + }, + { + "description": "The total number of nodes that have registered on the Rocket Pool network.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 3, + "w": 2, + "x": 0, + "y": 36 + }, + "id": 172, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "value" + }, + "pluginVersion": "9.5.18", + "targets": [ + { + "exemplar": true, + "expr": "rocketpool_supply_node_count{job=\"rocketpool\"}", + "interval": "", + "legendFormat": "", + "refId": "A" + } + ], + "title": "Node Count", + "type": "stat" + }, + { + "description": "A breakdown of the counts of each minipool on the Rocket Pool network by status:\n\n- **Initialized**: waiting for a deposit still\n- **Prelaunch:** deposits are done, waiting to be staked by the node operator's `rocketpool_node` container \n- **Staking:** deposited, validator created, and active (or pending) on the Beacon Chain\n- **Dissolved:** staking failed, funds returned to the node operator and staking pool\n- **Withdrawable:** exited from the Beacon Chain, waiting for rewards to be withdrawn to the minipool\n- **Finalized:** exited, withdrawn from, and essentially closed (inactive)", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + } + }, + "mappings": [] + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "staking" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "green", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "initialized" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "blue", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "finalized" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "purple", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "dissolved" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "red", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "prelaunch" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "yellow", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "withdrawable" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "dark-orange", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 6, + "w": 4, + "x": 2, + "y": 36 + }, + "id": 176, + "options": { + "legend": { + "displayMode": "table", + "placement": "right", + "showLegend": true, + "values": [ + "value" + ] + }, + "pieType": "donut", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "exemplar": true, + "expr": "rocketpool_supply_minipool_count{job=\"rocketpool\"}", + "format": "time_series", + "instant": true, + "interval": "", + "legendFormat": "{{status}}", + "refId": "A" + } + ], + "title": "Minipools by Status", + "type": "piechart" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "description": "A breakdown of the counts of each megapool validator on the Rocket Pool network by status:", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + } + }, + "mappings": [] + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "staking" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "green", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "initialized" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "blue", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "finalized" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "purple", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "dissolved" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "red", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "prelaunch" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "yellow", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "withdrawable" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "dark-orange", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 6, + "w": 4, + "x": 6, + "y": 36 + }, + "id": 268, + "options": { + "legend": { + "displayMode": "table", + "placement": "right", + "showLegend": true, + "values": [ + "value" + ] + }, + "pieType": "donut", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "editorMode": "code", + "exemplar": true, + "expr": "rocketpool_supply_megapool_count{job=\"rocketpool\"}", + "format": "time_series", + "instant": true, + "interval": "", + "legendFormat": "{{status}}", + "refId": "A" + } + ], + "title": "Megapool Validators by Status", + "type": "piechart" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "description": "The total number of Rocket Pool megapool (validators) that are active (not exited and withdrawn from the Beacon Chain).", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 3, + "w": 2, + "x": 10, + "y": 36 + }, + "id": 267, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "center", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "auto" + }, + "pluginVersion": "9.5.18", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "editorMode": "code", + "exemplar": true, + "expr": "rocketpool_supply_megapool_contract_count", + "interval": "", + "legendFormat": "", + "range": true, + "refId": "A" + } + ], + "title": "Megapool Contracts", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "description": "This is the total balance in ETH your megapool validators currently have.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 4, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "ETH" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 3, + "x": 13, + "y": 37 + }, + "id": 276, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "auto" + }, + "pluginVersion": "9.5.18", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "editorMode": "code", + "exemplar": true, + "expr": "rocketpool_node_megapool_beacon_balance{job=\"rocketpool\"}", + "interval": "", + "legendFormat": "", + "range": true, + "refId": "A" + } + ], + "title": "Beacon Balance", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "description": "This is the total balance in ETH that belongs to you from the beacon balance", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 4, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "ETH" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 3, + "x": 16, + "y": 37 + }, + "id": 277, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "auto" + }, + "pluginVersion": "9.5.18", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "editorMode": "code", + "exemplar": true, + "expr": "rocketpool_node_megapool_node_share_of_beacon_balance", + "interval": "", + "legendFormat": "", + "range": true, + "refId": "A" + } + ], + "title": "Your Share of the Beacon Balance", + "type": "stat" + }, + { + "description": "The total number of Rocket Pool minipools (validators) that are active (not exited and withdrawn from the Beacon Chain).", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 3, + "w": 2, + "x": 0, + "y": 39 + }, + "id": 174, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "center", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "auto" + }, + "pluginVersion": "9.5.18", + "targets": [ + { + "exemplar": true, + "expr": "rocketpool_supply_active_minipools{job=\"rocketpool\"}", + "interval": "", + "legendFormat": "", + "refId": "A" + } + ], + "title": "Active Minipools", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "description": "The total number of Rocket Pool megapool (validators) that are active (not exited and withdrawn from the Beacon Chain).", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 3, + "w": 2, + "x": 10, + "y": 39 + }, + "id": 269, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "center", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "auto" + }, + "pluginVersion": "9.5.18", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "editorMode": "code", + "exemplar": true, + "expr": "rocketpool_supply_megapool_active_count", + "interval": "", + "legendFormat": "", + "range": true, + "refId": "A" + } + ], + "title": "Active Megapool Validators", + "type": "stat" + }, + { + "gridPos": { + "h": 1, + "w": 9, + "x": 13, + "y": 41 + }, + "id": 186, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "", + "mode": "markdown" + }, + "pluginVersion": "9.5.18", + "title": "RPL Rewards (Updates Every 5 Minutes)", + "transparent": true, + "type": "text" + }, + { + "description": "", + "gridPos": { + "h": 1, + "w": 12, + "x": 0, + "y": 42 + }, + "id": 238, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "", + "mode": "markdown" + }, + "pluginVersion": "9.5.18", + "title": "Governance (Updates Every 6 Hours)", + "transparent": true, + "type": "text" + }, + { + "description": "The time of the next RPL rewards checkpoint. If you have an effective RPL stake greater than zero, you should receive rewards here (unless it's your first checkpoint, in which case you'll need to wait a bit longer).", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "text", + "value": null + } + ] + }, + "unit": "dateTimeAsLocalNoDateIfToday" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 5, + "x": 13, + "y": 42 + }, + "id": 218, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "auto" + }, + "pluginVersion": "9.5.18", + "targets": [ + { + "exemplar": true, + "expr": "rocketpool_rpl_checkpoint_time{job=\"rocketpool\"}", + "interval": "", + "legendFormat": "", + "refId": "A" + } + ], + "title": "Next RPL Rewards Checkpoint", + "type": "stat" + }, + { + "description": "This tracks how long you have until the next RPL rewards checkpoint.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "text", + "value": null + } + ] + }, + "unit": "dateTimeFromNow" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 4, + "x": 18, + "y": 42 + }, + "id": 216, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "auto" + }, + "pluginVersion": "9.5.18", + "targets": [ + { + "exemplar": true, + "expr": "rocketpool_rpl_checkpoint_time{job=\"rocketpool\"}", + "interval": "", + "legendFormat": "", + "refId": "A" + } + ], + "title": "Next RPL Rewards Checkpoint", + "type": "stat" + }, + { + "description": "The number of active proposals you or your delegate have voted on.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "transparent", + "value": null + }, + { + "color": "red", + "value": 1 + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Voted" + }, + "properties": [ + { + "id": "thresholds", + "value": { + "mode": "absolute", + "steps": [ + { + "color": "transparent", + "value": null + }, + { + "color": "green", + "value": 1 + } + ] + } + } + ] + } + ] + }, + "gridPos": { + "h": 4, + "w": 3, + "x": 0, + "y": 43 + }, + "id": 235, + "options": { + "colorMode": "background", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "9.5.18", + "targets": [ + { + "editorMode": "code", + "exemplar": true, + "expr": "rocketpool_snapshot_votes_active", + "interval": "", + "legendFormat": "Voted", + "range": true, + "refId": "A" + }, + { + "editorMode": "code", + "exemplar": true, + "expr": "rocketpool_snapshot_proposals_active - rocketpool_snapshot_votes_active", + "hide": false, + "interval": "", + "legendFormat": "Missing votes", + "range": true, + "refId": "B" + } + ], + "title": "Active Proposals", + "type": "stat" + }, + { + "description": "Shows the number of closed votes you or your delegate has voted or missed.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "transparent", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 3, + "x": 3, + "y": 43 + }, + "id": 236, + "options": { + "colorMode": "background", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "9.5.18", + "targets": [ + { + "editorMode": "code", + "exemplar": true, + "expr": "rocketpool_snapshot_votes_closed", + "interval": "", + "legendFormat": "Voted", + "range": true, + "refId": "A" + }, + { + "editorMode": "code", + "exemplar": true, + "expr": "rocketpool_snapshot_proposals_closed - rocketpool_snapshot_votes_closed", + "hide": false, + "interval": "", + "legendFormat": "Missed votes", + "range": true, + "refId": "B" + } + ], + "title": "Closed Proposals", + "type": "stat" + }, + { + "description": "The node voting power on Snapshot.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "transparent", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 3, + "x": 6, + "y": 43 + }, + "id": 240, + "options": { + "colorMode": "background", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "9.5.18", + "targets": [ + { + "editorMode": "code", + "exemplar": true, + "expr": "rocketpool_snapshot_node_vp ", + "interval": "", + "legendFormat": "", + "range": true, + "refId": "A" + } + ], + "title": "Node Voting Power", + "type": "stat" + }, + { + "description": "The voting power of the delegate you have chosen.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "transparent", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 3, + "x": 9, + "y": 43 + }, + "id": 242, + "options": { + "colorMode": "background", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "9.5.18", + "targets": [ + { + "editorMode": "code", + "exemplar": true, + "expr": "rocketpool_snapshot_delegate_vp ", + "interval": "", + "legendFormat": "", + "range": true, + "refId": "A" + } + ], + "title": "Delegate Voting Power", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "description": "This shows various levels of RPL stake you have:\n\n- **Total**: the total amount of RPL you have staked.\n- **Effective**: the amount of your staked RPL that is being put to use, accounting for the 10% borrowed minimum and 150% bonded maximum limits.\n- **Rewardable**: the effective amount of RPL that is eligible for earning RPL rewards at the end of each rewards period. This is based on the status of your validators on the Beacon Chain; validators that haven't been activated yet or validators that have been exited are not eligible for rewards.\n\n**Note**: this takes any *pending bond reductions* you may have into account.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 2, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "orange", + "value": null + } + ] + }, + "unit": "RPL" + }, + "overrides": [] + }, + "gridPos": { + "h": 13, + "w": 3, + "x": 13, + "y": 46 + }, + "id": 190, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "auto" + }, + "pluginVersion": "9.5.18", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "editorMode": "code", + "exemplar": true, + "expr": "rocketpool_node_total_staked_rpl + rocketpool_node_megapool_staked_rpl", + "interval": "", + "legendFormat": "Total", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "editorMode": "code", + "expr": "rocketpool_node_total_staked_rpl", + "hide": false, + "legendFormat": "Legacy RPL", + "range": true, + "refId": "B" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "editorMode": "code", + "expr": "rocketpool_node_megapool_staked_rpl", + "hide": false, + "legendFormat": "Megapool RPL", + "range": true, + "refId": "C" + } + ], + "title": "RPL Staked", + "type": "stat" + }, + { + "description": "Your total staked RPL collateral levels. This shows your collateral relative to the amount of ETH you have *borrowed* from the staking pool to complete your validators, and the amount of ETH you have *bonded* with your own funds.\n\nIf you fall below 10% of the *borrowed* ETH, you won't be able to claim your rewards at the next checkpoint until you get back to 10%.\n\nIf you go over 150% of the *bonded* ETH, you'll only be rewarded for the first 150% of your stake.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 2, + "mappings": [], + "max": 1.5, + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "red", + "value": null + }, + { + "color": "green", + "value": 0.1 + }, + { + "color": "red", + "value": 1.5 + } + ] + }, + "unit": "percentunit" + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 16, + "y": 46 + }, + "id": 196, + "options": { + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true, + "text": {} + }, + "pluginVersion": "9.5.18", + "targets": [ + { + "editorMode": "code", + "exemplar": true, + "expr": "rocketpool_node_borrowed_collateral_ratio{job=\"rocketpool\"}", + "interval": "", + "legendFormat": "Borrowed", + "range": true, + "refId": "A" + }, + { + "editorMode": "code", + "expr": "rocketpool_node_bonded_collateral_ratio{job=\"rocketpool\"}", + "hide": false, + "legendFormat": "Bonded", + "range": true, + "refId": "B" + } + ], + "title": "RPL Collateral", + "type": "gauge" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "description": "The number of onchain proposals by state (pending, phase 1 or phase 2).", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "transparent", + "value": null + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Pending" + }, + "properties": [ + { + "id": "thresholds", + "value": { + "mode": "absolute", + "steps": [ + { + "color": "transparent", + "value": null + } + ] + } + } + ] + } + ] + }, + "gridPos": { + "h": 4, + "w": 6, + "x": 0, + "y": 47 + }, + "id": 264, + "options": { + "colorMode": "background", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "9.5.18", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "editorMode": "code", + "exemplar": true, + "expr": "rocketpool_governance_onchain_pending", + "interval": "", + "legendFormat": "Pending", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "editorMode": "code", + "exemplar": true, + "expr": "rocketpool_governance_onchain_phase1", + "hide": false, + "interval": "", + "legendFormat": "Phase 1", + "range": true, + "refId": "B" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "editorMode": "code", + "exemplar": true, + "expr": "rocketpool_governance_onchain_phase2", + "hide": false, + "interval": "", + "legendFormat": "Phase 2", + "range": true, + "refId": "C" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "editorMode": "code", + "exemplar": true, + "expr": "rocketpool_governance_onchain_closed", + "hide": false, + "interval": "", + "legendFormat": "Closed", + "range": true, + "refId": "D" + } + ], + "title": "Onchain Proposals", + "type": "stat" + }, + { + "description": "The balances of your node wallet (only tracks Rocket Pool tokens). Keep an eye on how much ETH you have; if it falls too low, your node won't be able to pay for gas during automatic RPL reward claims or other transactions.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "align": "center", + "cellOptions": { + "type": "auto" + }, + "filterable": false, + "inspect": false + }, + "decimals": 6, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 12, + "x": 0, + "y": 51 + }, + "id": 200, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": true, + "sortBy": [] + }, + "pluginVersion": "9.5.18", + "targets": [ + { + "exemplar": false, + "expr": "rocketpool_node_balance{job=\"rocketpool\"}", + "format": "table", + "instant": true, + "interval": "", + "legendFormat": "{{Token}}", + "refId": "A" + } + ], + "title": "Node Wallet Balances", + "transformations": [ + { + "id": "organize", + "options": { + "excludeByName": { + "Time": true, + "__name__": true, + "instance": true, + "job": true + }, + "indexByName": {}, + "renameByName": { + "Value #A": "Value", + "job": "" + } + } + } + ], + "type": "table" + }, + { + "description": "The approximate amount of RPL you'll receive at the next checkpoint, based on your current rewardable stake and how much RPL is staked on the entire network.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 2, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "orange", + "value": null + } + ] + }, + "unit": "RPL" + }, + "overrides": [] + }, + "gridPos": { + "h": 3, + "w": 4, + "x": 16, + "y": 53 + }, + "id": 198, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "auto" + }, + "pluginVersion": "9.5.18", + "targets": [ + { + "exemplar": true, + "expr": "rocketpool_node_expected_rpl_rewards{job=\"rocketpool\"}", + "interval": "", + "legendFormat": "", + "refId": "A" + } + ], + "title": "Approx. Rewards from Next Checkpoint", + "type": "stat" + }, + { + "description": "The amount of RPL you've claimed over the life of your node, and the amount you still have yet to claim.", + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "transparent", + "mode": "fixed" + }, + "decimals": 2, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "transparent", + "value": null + } + ] + }, + "unit": "RPL" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Unclaimed" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "blue", + "mode": "thresholds" + } + }, + { + "id": "thresholds", + "value": { + "mode": "absolute", + "steps": [ + { + "color": "transparent", + "value": null + }, + { + "color": "green", + "value": 0.00001 + } + ] + } + } + ] + } + ] + }, + "gridPos": { + "h": 6, + "w": 2, + "x": 20, + "y": 53 + }, + "id": 192, + "options": { + "colorMode": "background", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "auto" + }, + "pluginVersion": "9.5.18", + "targets": [ + { + "editorMode": "code", + "exemplar": true, + "expr": "rocketpool_node_unclaimed_rewards{job=\"rocketpool\"}", + "interval": "", + "legendFormat": "Unclaimed", + "range": true, + "refId": "A" + }, + { + "editorMode": "code", + "expr": "rocketpool_node_cumulative_rpl_rewards{job=\"rocketpool\"}", + "hide": false, + "legendFormat": "Claimed", + "range": true, + "refId": "B" + } + ], + "title": "RPL Rewards", + "type": "stat" + }, + { + "description": "The approximate APR for your RPL stake, based on the rewards you will receive at the next checkpoint.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 2, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "orange", + "value": null + } + ] + }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { + "h": 3, + "w": 4, + "x": 16, + "y": 56 + }, + "id": 194, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "auto" + }, + "pluginVersion": "9.5.18", + "targets": [ + { + "exemplar": true, + "expr": "rocketpool_node_rpl_apr{job=\"rocketpool\"}", + "interval": "", + "legendFormat": "", + "refId": "A" + } + ], + "title": "Your RPL APR for the Next Checkpoint", + "type": "stat" + }, + { + "description": "", + "gridPos": { + "h": 1, + "w": 9, + "x": 13, + "y": 59 + }, + "id": 261, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "", + "mode": "markdown" + }, + "pluginVersion": "9.5.18", + "transparent": true, + "type": "text" + } + ], + "refresh": "30s", + "revision": 1, + "schemaVersion": 38, + "style": "dark", + "tags": [], + "templating": { + "list": [] + }, + "time": { + "from": "now-30m", + "to": "now" + }, + "timepicker": { + "refresh_intervals": [ + "5s", + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ] + }, + "timezone": "", + "title": "Rocket Pool Dashboard v1.4.1 - Provisioned", + "uid": "e6741a77-5548-4807-b3f4-416c603d8d22", + "version": 5, + "weekStart": "" + } \ No newline at end of file diff --git a/shared/services/rocketpool/assets/rp-update-tracker/apt/apt-prometheus-metrics b/shared/services/rocketpool/assets/rp-update-tracker/apt/apt-prometheus-metrics index c2a9d1388..aed4011ae 100644 --- a/shared/services/rocketpool/assets/rp-update-tracker/apt/apt-prometheus-metrics +++ b/shared/services/rocketpool/assets/rp-update-tracker/apt/apt-prometheus-metrics @@ -1,9 +1,7 @@ APT::Update::Post-Invoke-Success { "/usr/share/apt-metrics.sh | sponge /var/lib/node_exporter/textfile_collector/apt.prom || true"; - "/usr/share/rp-version-check.sh | sponge /var/lib/node_exporter/textfile_collector/rp.prom || true"; }; DPkg::Post-Invoke { "/usr/share/apt-metrics.sh | sponge /var/lib/node_exporter/textfile_collector/apt.prom || true"; - "/usr/share/rp-version-check.sh | sponge /var/lib/node_exporter/textfile_collector/rp.prom || true"; }; \ No newline at end of file diff --git a/shared/services/rocketpool/assets/rp-update-tracker/dnf/rp-dnf-check.sh b/shared/services/rocketpool/assets/rp-update-tracker/dnf/rp-dnf-check.sh index baed0fc93..e522be3a8 100644 --- a/shared/services/rocketpool/assets/rp-update-tracker/dnf/rp-dnf-check.sh +++ b/shared/services/rocketpool/assets/rp-update-tracker/dnf/rp-dnf-check.sh @@ -1,4 +1,3 @@ #!/bin/sh -/usr/share/dnf-metrics.sh | sponge /var/lib/node_exporter/textfile_collector/dnf.prom || true -/usr/share/rp-version-check.sh | sponge /var/lib/node_exporter/textfile_collector/rp.prom || true \ No newline at end of file +/usr/share/dnf-metrics.sh | sponge /var/lib/node_exporter/textfile_collector/dnf.prom || true \ No newline at end of file diff --git a/shared/services/rocketpool/assets/rp-update-tracker/dnf/rp-update-tracker.service b/shared/services/rocketpool/assets/rp-update-tracker/dnf/rp-update-tracker.service index 402ecb24f..cc611799c 100644 --- a/shared/services/rocketpool/assets/rp-update-tracker/dnf/rp-update-tracker.service +++ b/shared/services/rocketpool/assets/rp-update-tracker/dnf/rp-update-tracker.service @@ -1,5 +1,5 @@ [Unit] -Description=Checks for system and Rocket Pool updates periodically +Description=Checks for system updates periodically Wants=rp-update-tracker.timer [Service] diff --git a/shared/services/rocketpool/assets/rp-update-tracker/rp-version-check.sh b/shared/services/rocketpool/assets/rp-update-tracker/rp-version-check.sh deleted file mode 100644 index aaca1f0f7..000000000 --- a/shared/services/rocketpool/assets/rp-update-tracker/rp-version-check.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/sh -echo "# HELP rocketpool_version_update New Rocket Pool version available" -echo "# TYPE rocketpool_version_update gauge" - -if [ "$(docker ps -aq -f status=running -f name=rocketpool_node)" ]; then - LATEST_VERSION=$(curl --silent "https://api.github.com/repos/rocket-pool/smartnode/releases/latest" | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/') - CURRENT_VERSION=$(docker exec rocketpool_node /go/bin/rocketpool --version | sed -E 's/rocketpool version (.*)/v\1/') - - if [ "$LATEST_VERSION" = "$CURRENT_VERSION" ]; then - echo "rocketpool_version_update 0" - else - echo "rocketpool_version_update 1" - fi - -else - echo "rocketpool_version_update 0" -fi diff --git a/shared/services/rocketpool/assets/rp-update-tracker/yum/rp-update-tracker.service b/shared/services/rocketpool/assets/rp-update-tracker/yum/rp-update-tracker.service index 93fe59d2b..a1271c157 100644 --- a/shared/services/rocketpool/assets/rp-update-tracker/yum/rp-update-tracker.service +++ b/shared/services/rocketpool/assets/rp-update-tracker/yum/rp-update-tracker.service @@ -1,5 +1,5 @@ [Unit] -Description=Checks for system and Rocket Pool updates periodically +Description=Checks for system updates periodically Wants=rp-update-tracker.timer [Service] diff --git a/shared/services/rocketpool/assets/rp-update-tracker/yum/rp-yum-check.sh b/shared/services/rocketpool/assets/rp-update-tracker/yum/rp-yum-check.sh index edadeb068..428273a0b 100644 --- a/shared/services/rocketpool/assets/rp-update-tracker/yum/rp-yum-check.sh +++ b/shared/services/rocketpool/assets/rp-update-tracker/yum/rp-yum-check.sh @@ -1,4 +1,3 @@ #!/bin/sh -/usr/share/yum-metrics.sh | sponge /var/lib/node_exporter/textfile_collector/yum.prom || true -/usr/share/rp-version-check.sh | sponge /var/lib/node_exporter/textfile_collector/rp.prom || true \ No newline at end of file +/usr/share/yum-metrics.sh | sponge /var/lib/node_exporter/textfile_collector/yum.prom || true \ No newline at end of file diff --git a/shared/services/rocketpool/assets/scripts/install-update-tracker.sh b/shared/services/rocketpool/assets/scripts/install-update-tracker.sh index ae1fb15da..9e5c04331 100755 --- a/shared/services/rocketpool/assets/scripts/install-update-tracker.sh +++ b/shared/services/rocketpool/assets/scripts/install-update-tracker.sh @@ -1,8 +1,7 @@ #!/bin/sh -# This script sets up the OS update and Rocket Pool update collector, along with -# integration with Prometheus's node-exporter and auto-running during apt or dnf -# executions. +# This script sets up the OS update collector, along with integration with +# Prometheus's node-exporter and auto-running during apt or dnf executions. # The path that the node exporter will be configured to look for textfiles in @@ -116,11 +115,10 @@ case "$INSTALLER" in # Install the update tracker files progress 2 "Installing update tracker..." { sudo mkdir -p "$TEXTFILE_COLLECTOR_PATH" || fail "Could not create textfile collector path."; } >&2 + { sudo rm -f "$TEXTFILE_COLLECTOR_PATH/rp.prom" || fail "Could not remove old Rocket Pool update metric."; } >&2 { sudo mv "$PACKAGE_FILES_PATH/apt/apt-metrics.sh" "$UPDATE_SCRIPT_PATH" || fail "Could not move apt update collector."; } >&2 - { sudo mv "$PACKAGE_FILES_PATH/rp-version-check.sh" "$UPDATE_SCRIPT_PATH" || fail "Could not move Rocket Pool update collector."; } >&2 { sudo mv "$PACKAGE_FILES_PATH/apt/apt-prometheus-metrics" "/etc/apt/apt.conf.d/60prometheus-metrics" || fail "Could not move apt trigger."; } >&2 { sudo chmod +x "$UPDATE_SCRIPT_PATH/apt-metrics.sh" || fail "Could not set permissions on apt update collector."; } >&2 - { sudo chmod +x "$UPDATE_SCRIPT_PATH/rp-version-check.sh" || fail "Could not set permissions on Rocket Pool update collector."; } >&2 ;; @@ -142,13 +140,12 @@ case "$INSTALLER" in # Install the update tracker files progress 2 "Installing update tracker..." { sudo mkdir -p "$TEXTFILE_COLLECTOR_PATH" || fail "Could not create textfile collector path."; } >&2 + { sudo rm -f "$TEXTFILE_COLLECTOR_PATH/rp.prom" || fail "Could not remove old Rocket Pool update metric."; } >&2 { sudo mv "$PACKAGE_FILES_PATH/dnf/dnf-metrics.sh" "$UPDATE_SCRIPT_PATH" || fail "Could not move dnf update collector."; } >&2 - { sudo mv "$PACKAGE_FILES_PATH/rp-version-check.sh" "$UPDATE_SCRIPT_PATH" || fail "Could not move Rocket Pool update collector."; } >&2 { sudo mv "$PACKAGE_FILES_PATH/dnf/rp-dnf-check.sh" "$UPDATE_SCRIPT_PATH" || fail "Could not move update tracker script."; } >&2 { sudo mv "$PACKAGE_FILES_PATH/dnf/rp-update-tracker.service" "/etc/systemd/system" || fail "Could not move update tracker service."; } >&2 { sudo mv "$PACKAGE_FILES_PATH/dnf/rp-update-tracker.timer" "/etc/systemd/system" || fail "Could not move update tracker timer."; } >&2 { sudo chmod +x "$UPDATE_SCRIPT_PATH/dnf-metrics.sh" || fail "Could not set permissions on dnf update collector."; } >&2 - { sudo chmod +x "$UPDATE_SCRIPT_PATH/rp-version-check.sh" || fail "Could not set permissions on Rocket Pool update collector."; } >&2 { sudo chmod +x "$UPDATE_SCRIPT_PATH/rp-dnf-check.sh" || fail "Could not set permissions on Rocket Pool update tracker script."; } >&2 # Install the update checking service @@ -157,7 +154,7 @@ case "$INSTALLER" in echo -e "${COLOR_YELLOW}Your system has SELinux enabled, so Rocket Pool can't automatically start the update tracker service." echo "Please run the following commands manually:" echo "" - echo -e '\tsudo restorecon /usr/share/rp-dnf-check.sh /usr/share/rp-version-check.sh /etc/systemd/system/rp-update-tracker.service /etc/systemd/system/rp-update-tracker.timer' + echo -e '\tsudo restorecon /usr/share/rp-dnf-check.sh /etc/systemd/system/rp-update-tracker.service /etc/systemd/system/rp-update-tracker.timer' echo -e '\tsudo systemctl enable rp-update-tracker' echo -e '\tsudo systemctl start rp-update-tracker' echo -e "${COLOR_RESET}" @@ -187,13 +184,12 @@ case "$INSTALLER" in # Install the update tracker files progress 2 "Installing update tracker..." { sudo mkdir -p "$TEXTFILE_COLLECTOR_PATH" || fail "Could not create textfile collector path."; } >&2 + { sudo rm -f "$TEXTFILE_COLLECTOR_PATH/rp.prom" || fail "Could not remove old Rocket Pool update metric."; } >&2 { sudo mv "$PACKAGE_FILES_PATH/yum/yum-metrics.sh" "$UPDATE_SCRIPT_PATH" || fail "Could not move yum update collector."; } >&2 - { sudo mv "$PACKAGE_FILES_PATH/rp-version-check.sh" "$UPDATE_SCRIPT_PATH" || fail "Could not move Rocket Pool update collector."; } >&2 { sudo mv "$PACKAGE_FILES_PATH/yum/rp-yum-check.sh" "$UPDATE_SCRIPT_PATH" || fail "Could not move update tracker script."; } >&2 { sudo mv "$PACKAGE_FILES_PATH/yum/rp-update-tracker.service" "/etc/systemd/system" || fail "Could not move update tracker service."; } >&2 { sudo mv "$PACKAGE_FILES_PATH/yum/rp-update-tracker.timer" "/etc/systemd/system" || fail "Could not move update tracker timer."; } >&2 { sudo chmod +x "$UPDATE_SCRIPT_PATH/yum-metrics.sh" || fail "Could not set permissions on dnf update collector."; } >&2 - { sudo chmod +x "$UPDATE_SCRIPT_PATH/rp-version-check.sh" || fail "Could not set permissions on Rocket Pool update collector."; } >&2 { sudo chmod +x "$UPDATE_SCRIPT_PATH/rp-yum-check.sh" || fail "Could not set permissions on Rocket Pool update tracker script."; } >&2 # Install the update checking service @@ -202,7 +198,7 @@ case "$INSTALLER" in echo -e "${COLOR_YELLOW}Your system has SELinux enabled, so Rocket Pool can't automatically start the update tracker service." echo "Please run the following commands manually:" echo "" - echo -e '\tsudo restorecon /usr/share/rp-yum-check.sh /usr/share/rp-version-check.sh /etc/systemd/system/rp-update-tracker.service /etc/systemd/system/rp-update-tracker.timer' + echo -e '\tsudo restorecon /usr/share/rp-yum-check.sh /etc/systemd/system/rp-update-tracker.service /etc/systemd/system/rp-update-tracker.timer' echo -e '\tsudo systemctl enable rp-update-tracker' echo -e '\tsudo systemctl start rp-update-tracker' echo -e "${COLOR_RESET}"