From 55405874ee50826b65dc2a5664e2b8bf9d7f668b Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Thu, 10 Aug 2023 10:45:51 +0200 Subject: [PATCH] feat: add beacon-metrics-gazer + beacon-metrics-gazer grafana dashboard (#114) Changelog picked up from commits here: feat: add beacon-metrics-gazer --------- Co-authored-by: Gyanendra Mishra --- main.star | 6 + .../beacon_metrics_gazer_launcher.star | 69 ++++ src/grafana/grafana_launcher.star | 2 +- src/static_files/static_files.star | 6 +- .../config.yaml.tmpl | 3 + .../dashboards/beacon-metrics-dashboard.json | 365 ++++++++++++++++++ .../{dashboard.json => default.json} | 0 .../prometheus-config/prometheus.yml.tmpl | 4 + 8 files changed, 453 insertions(+), 2 deletions(-) create mode 100644 src/beacon_metrics_gazer/beacon_metrics_gazer_launcher.star create mode 100644 static_files/beacon-metrics-gazer-config/config.yaml.tmpl create mode 100644 static_files/grafana-config/dashboards/beacon-metrics-dashboard.json rename static_files/grafana-config/dashboards/{dashboard.json => default.json} (100%) diff --git a/main.star b/main.star index 521087e06..56c6f3655 100644 --- a/main.star +++ b/main.star @@ -7,6 +7,7 @@ eth_network_module = import_module("github.com/kurtosis-tech/eth-network-package transaction_spammer = import_module("github.com/kurtosis-tech/eth2-package/src/transaction_spammer/transaction_spammer.star") cl_forkmon = import_module("github.com/kurtosis-tech/eth2-package/src/cl_forkmon/cl_forkmon_launcher.star") el_forkmon = import_module("github.com/kurtosis-tech/eth2-package/src/el_forkmon/el_forkmon_launcher.star") +beacon_metrics_gazer = import_module("github.com/kurtosis-tech/eth2-package/src/beacon_metrics_gazer/beacon_metrics_gazer_launcher.star") prometheus = import_module("github.com/kurtosis-tech/eth2-package/src/prometheus/prometheus_launcher.star") grafana =import_module("github.com/kurtosis-tech/eth2-package/src/grafana/grafana_launcher.star") testnet_verifier = import_module("github.com/kurtosis-tech/eth2-package/src/testnet_verifier/testnet_verifier.star") @@ -87,6 +88,11 @@ def run(plan, args): el_forkmon.launch_el_forkmon(plan, el_forkmon_config_template, all_el_client_contexts) plan.print("Succesfully launched execution layer forkmon") + plan.print("Launching beacon metrics gazer") + beacon_metrics_gazer_config_template = read_file(static_files.BEACON_METRICS_GAZER_CONFIG_TEMPLATE_FILEPATH) + beacon_metrics_gazer.launch_beacon_metrics_gazer(plan, beacon_metrics_gazer_config_template, all_cl_client_contexts,network_params) + plan.print("Succesfully launched beacon metrics gazer") + plan.print("Launching prometheus...") prometheus_private_url = prometheus.launch_prometheus( plan, diff --git a/src/beacon_metrics_gazer/beacon_metrics_gazer_launcher.star b/src/beacon_metrics_gazer/beacon_metrics_gazer_launcher.star new file mode 100644 index 000000000..3919be251 --- /dev/null +++ b/src/beacon_metrics_gazer/beacon_metrics_gazer_launcher.star @@ -0,0 +1,69 @@ +shared_utils = import_module("github.com/kurtosis-tech/eth2-package/src/shared_utils/shared_utils.star") + + +SERVICE_NAME = "beacon-metrics-gazer" +IMAGE_NAME = "dapplion/beacon-metrics-gazer:latest" + +HTTP_PORT_ID = "http" +HTTP_PORT_NUMBER = 8080 + +BEACON_METRICS_GAZER_CONFIG_FILENAME = "beacon-metrics-gazer-ranges.yaml" + +BEACON_METRICS_GAZER_CONFIG_MOUNT_DIRPATH_ON_SERVICE = "/config" + +USED_PORTS = { + HTTP_PORT_ID:shared_utils.new_port_spec(HTTP_PORT_NUMBER, shared_utils.TCP_PROTOCOL, shared_utils.HTTP_APPLICATION_PROTOCOL) +} + + +def launch_beacon_metrics_gazer( + plan, + config_template, + cl_client_contexts, + network_params + ): + + data = [] + for index, client in enumerate(cl_client_contexts): + start_index = index*network_params.num_validator_keys_per_node + end_index = ((index+1)*network_params.num_validator_keys_per_node)-1 + service_name = client.beacon_service_name + data.append({"ClientName": service_name, "Range": "{0}-{1}".format(start_index, end_index)}) + + template_data = {"Data": data} + + template_and_data_by_rel_dest_filepath = {} + template_and_data_by_rel_dest_filepath[BEACON_METRICS_GAZER_CONFIG_FILENAME] = shared_utils.new_template_and_data(config_template, template_data) + + config_files_artifact_name = plan.render_templates(template_and_data_by_rel_dest_filepath, "beacon-metrics-gazer-config") + + config = get_config( + config_files_artifact_name, + cl_client_contexts[0].ip_addr, + cl_client_contexts[0].http_port_num) + + plan.add_service(SERVICE_NAME, config) + + +def get_config( + config_files_artifact_name, + ip_addr, + http_port_num): + config_file_path = shared_utils.path_join(BEACON_METRICS_GAZER_CONFIG_MOUNT_DIRPATH_ON_SERVICE, BEACON_METRICS_GAZER_CONFIG_FILENAME) + return ServiceConfig( + image = IMAGE_NAME, + ports = USED_PORTS, + files = { + BEACON_METRICS_GAZER_CONFIG_MOUNT_DIRPATH_ON_SERVICE: config_files_artifact_name, + }, + cmd = [ + "http://{0}:{1}".format(ip_addr, http_port_num), + "--ranges-file", + "/config/{0}".format(BEACON_METRICS_GAZER_CONFIG_FILENAME), + "--port", + "{0}".format(HTTP_PORT_NUMBER), + "--address", + "0.0.0.0", + "-v" + ] + ) diff --git a/src/grafana/grafana_launcher.star b/src/grafana/grafana_launcher.star index 2d9eb15e7..b2470018e 100644 --- a/src/grafana/grafana_launcher.star +++ b/src/grafana/grafana_launcher.star @@ -17,7 +17,7 @@ CONFIG_DIRPATH_ENV_VAR = "GF_PATHS_PROVISIONING" GRAFANA_CONFIG_DIRPATH_ON_SERVICE = "/config" GRAFANA_DASHBOARDS_DIRPATH_ON_SERVICE = "/dashboards" -GRAFANA_DASHBOARDS_FILEPATH_ON_SERVICE = GRAFANA_DASHBOARDS_DIRPATH_ON_SERVICE + "/dashboard.json" +GRAFANA_DASHBOARDS_FILEPATH_ON_SERVICE = GRAFANA_DASHBOARDS_DIRPATH_ON_SERVICE USED_PORTS = { diff --git a/src/static_files/static_files.star b/src/static_files/static_files.star index e9acadc45..27f2cdd09 100644 --- a/src/static_files/static_files.star +++ b/src/static_files/static_files.star @@ -13,6 +13,10 @@ EL_FORKMON_CONFIG_TEMPLATE_FILEPATH = STATIC_FILES_DIRPATH + \ PROMETHEUS_CONFIG_TEMPLATE_FILEPATH = STATIC_FILES_DIRPATH + \ "/prometheus-config/prometheus.yml.tmpl" +# Beacon Metrics Gazer config +BEACON_METRICS_GAZER_CONFIG_TEMPLATE_FILEPATH = STATIC_FILES_DIRPATH + \ + "/beacon-metrics-gazer-config/config.yaml.tmpl" + # Grafana config GRAFANA_CONFIG_DIRPATH = "/grafana-config" GRAFANA_DATASOURCE_CONFIG_TEMPLATE_FILEPATH = STATIC_FILES_DIRPATH + \ @@ -20,4 +24,4 @@ GRAFANA_DATASOURCE_CONFIG_TEMPLATE_FILEPATH = STATIC_FILES_DIRPATH + \ GRAFANA_DASHBOARD_PROVIDERS_CONFIG_TEMPLATE_FILEPATH = STATIC_FILES_DIRPATH + \ GRAFANA_CONFIG_DIRPATH + "/templates/dashboard-providers.yml.tmpl" GRAFANA_DASHBOARDS_CONFIG_DIRPATH = STATIC_FILES_DIRPATH + \ - GRAFANA_CONFIG_DIRPATH + "/dashboards/dashboard.json" + GRAFANA_CONFIG_DIRPATH + "/dashboards" diff --git a/static_files/beacon-metrics-gazer-config/config.yaml.tmpl b/static_files/beacon-metrics-gazer-config/config.yaml.tmpl new file mode 100644 index 000000000..367bbc3c8 --- /dev/null +++ b/static_files/beacon-metrics-gazer-config/config.yaml.tmpl @@ -0,0 +1,3 @@ +{{ range $data := .Data }} +{{ $data.Range }}: {{ $data.ClientName }} +{{ end }} \ No newline at end of file diff --git a/static_files/grafana-config/dashboards/beacon-metrics-dashboard.json b/static_files/grafana-config/dashboards/beacon-metrics-dashboard.json new file mode 100644 index 000000000..537159034 --- /dev/null +++ b/static_files/grafana-config/dashboards/beacon-metrics-dashboard.json @@ -0,0 +1,365 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "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": "", + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": 3, + "links": [], + "liveNow": false, + "panels": [ + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "fieldConfig": { + "defaults": { + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "scaleDistribution": { + "type": "linear" + } + } + }, + "overrides": [] + }, + "gridPos": { + "h": 18, + "w": 12, + "x": 0, + "y": 0 + }, + "id": 6, + "options": { + "calculate": false, + "cellGap": 1, + "color": { + "exponent": 0.5, + "fill": "dark-orange", + "max": 1, + "min": 0, + "mode": "scheme", + "reverse": true, + "scale": "exponential", + "scheme": "RdYlGn", + "steps": 20 + }, + "exemplars": { + "color": "rgba(255,0,255,0.7)" + }, + "filterValues": { + "le": 1e-9 + }, + "legend": { + "show": true + }, + "rowsFrame": { + "layout": "auto" + }, + "tooltip": { + "show": true, + "yHistogram": false + }, + "yAxis": { + "axisPlacement": "left", + "reverse": true + } + }, + "pluginVersion": "9.2.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "UhcO3vy7z" + }, + "editorMode": "code", + "expr": "beacon_network_target_participation", + "legendFormat": "{{range}}", + "range": true, + "refId": "A" + } + ], + "title": "Target Participations Rates", + "type": "heatmap" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "fieldConfig": { + "defaults": { + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "scaleDistribution": { + "type": "linear" + } + } + }, + "overrides": [] + }, + "gridPos": { + "h": 18, + "w": 12, + "x": 12, + "y": 0 + }, + "id": 5, + "options": { + "calculate": false, + "cellGap": 1, + "color": { + "exponent": 0.5, + "fill": "dark-orange", + "max": 1, + "min": 0, + "mode": "scheme", + "reverse": true, + "scale": "exponential", + "scheme": "RdYlGn", + "steps": 20 + }, + "exemplars": { + "color": "rgba(255,0,255,0.7)" + }, + "filterValues": { + "le": 1e-9 + }, + "legend": { + "show": true + }, + "rowsFrame": { + "layout": "auto" + }, + "tooltip": { + "show": true, + "yHistogram": false + }, + "yAxis": { + "axisPlacement": "left", + "reverse": true + } + }, + "pluginVersion": "9.2.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "UhcO3vy7z" + }, + "editorMode": "code", + "expr": "beacon_network_source_participation", + "legendFormat": "{{range}}", + "range": true, + "refId": "A" + } + ], + "title": "Source Participations Rates", + "type": "heatmap" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "fieldConfig": { + "defaults": { + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "scaleDistribution": { + "type": "linear" + } + } + }, + "overrides": [] + }, + "gridPos": { + "h": 15, + "w": 12, + "x": 0, + "y": 18 + }, + "id": 3, + "options": { + "calculate": false, + "cellGap": 1, + "color": { + "exponent": 0.5, + "fill": "dark-orange", + "max": 1, + "min": 0, + "mode": "scheme", + "reverse": true, + "scale": "exponential", + "scheme": "RdYlGn", + "steps": 20 + }, + "exemplars": { + "color": "yellow" + }, + "filterValues": { + "le": 1e-9 + }, + "legend": { + "show": true + }, + "rowsFrame": { + "layout": "auto" + }, + "tooltip": { + "show": true, + "yHistogram": false + }, + "yAxis": { + "axisPlacement": "left", + "reverse": true + } + }, + "pluginVersion": "9.2.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "UhcO3vy7z" + }, + "editorMode": "code", + "expr": "beacon_network_head_participation", + "legendFormat": "{{range}}", + "range": true, + "refId": "A" + } + ], + "title": "Head Participations Rates", + "type": "heatmap" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "fieldConfig": { + "defaults": { + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "scaleDistribution": { + "type": "linear" + } + } + }, + "overrides": [] + }, + "gridPos": { + "h": 15, + "w": 12, + "x": 12, + "y": 18 + }, + "id": 4, + "options": { + "calculate": false, + "cellGap": 1, + "color": { + "exponent": 0.5, + "fill": "dark-orange", + "mode": "scheme", + "reverse": true, + "scale": "exponential", + "scheme": "RdYlGn", + "steps": 20 + }, + "exemplars": { + "color": "rgba(255,0,255,0.7)" + }, + "filterValues": { + "le": 1e-9 + }, + "legend": { + "show": true + }, + "rowsFrame": { + "layout": "auto" + }, + "tooltip": { + "show": true, + "yHistogram": false + }, + "yAxis": { + "axisPlacement": "left", + "reverse": true + } + }, + "pluginVersion": "9.2.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "UhcO3vy7z" + }, + "editorMode": "code", + "expr": "beacon_network_inactivity_scores", + "legendFormat": "{{range}}", + "range": true, + "refId": "A" + } + ], + "title": "Inactivity Scores", + "type": "heatmap" + } + ], + "refresh": "", + "revision": 1, + "schemaVersion": 37, + "style": "dark", + "tags": [], + "templating": { + "list": [] + }, + "time": { + "from": "now-6h", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "Validator Participation Rates Dashboardssss", + "uid": "participation_rates_dashboards", + "version": 1, + "weekStart": "" +} diff --git a/static_files/grafana-config/dashboards/dashboard.json b/static_files/grafana-config/dashboards/default.json similarity index 100% rename from static_files/grafana-config/dashboards/dashboard.json rename to static_files/grafana-config/dashboards/default.json diff --git a/static_files/prometheus-config/prometheus.yml.tmpl b/static_files/prometheus-config/prometheus.yml.tmpl index 3e63f5a5c..ff4058fc8 100644 --- a/static_files/prometheus-config/prometheus.yml.tmpl +++ b/static_files/prometheus-config/prometheus.yml.tmpl @@ -10,3 +10,7 @@ scrape_configs: static_configs: - targets: ['{{ $clNode.url }}'] {{ end }} + - job_name: 'beacon-metrics-gazer' + metrics_path: '/metrics' + static_configs: + - targets: ['beacon-metrics-gazer:8080']