diff --git a/.gitignore b/.gitignore
index 1af9d35..d5304a7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,3 +6,4 @@ venv
 .classpath
 target
 .vscode
+vendor
diff --git a/dashboards/demo/README.md b/dashboards/demo/README.md
index e881cdb..94b2607 100644
--- a/dashboards/demo/README.md
+++ b/dashboards/demo/README.md
@@ -20,10 +20,10 @@ To use:
      
   3. Open your web browser to [http://localhost:3000](http://localhost:3000)
   
-  If you want to change the jsonnet dashboards, make your changes then run:
+  If you want to change the jsonnet dashboards, make your changes under `mixin/dashboards/` then run:
   
   ````
-  ../grafana/make-dashboards.sh
+  mixin/make-dashboards.sh
   ````
   
   Refresh the browser to see changes. 
diff --git a/dashboards/grafana/dashboards-jsonnet/cassandra-condensed.jsonnet b/dashboards/grafana/dashboards-jsonnet/cassandra-condensed.jsonnet
deleted file mode 100644
index 9397551..0000000
--- a/dashboards/grafana/dashboards-jsonnet/cassandra-condensed.jsonnet
+++ /dev/null
@@ -1,522 +0,0 @@
-local grafana = import 'grafonnet/grafana.libsonnet';
-
-local dashboard = grafana.dashboard;
-local row = grafana.row;
-local singlestat = grafana.singlestat;
-local graphpanel = grafana.graphPanel;
-local text = grafana.text;
-local prometheus = grafana.prometheus;
-local template = grafana.template;
-
-local prefix = std.extVar('prefix');
-
-local graphHeight = 300;
-local singlestatHeight = 100;
-local singlestatSpan = 1;
-local graphSpan = 4;
-
-dashboard.new(
-  'Cassandra Cluster Condensed',
-  description='Single pane of glass for most important Cassandra metrics',
-  schemaVersion=14,
-  refresh='30s',
-  time_from='now-30m',
-  editable=true,
-  tags=['os'],
-  style='dark'
-)
-.addTemplate(
-  template.datasource(
-    'PROMETHEUS_DS',
-    'prometheus',
-    'Prometheus',
-    hide='all',
-  )
-)
-
-.addTemplate(
-  template.custom(
-    'by',
-    'cluster,dc,rack,instance',
-    'cluster',
-    valuelabels={
-      "cluster": "Cluster",
-      "dc" : "Datacenter",
-      "rack" : "Rack",
-      "instance" : "Host"},
-    label='Group By',
-  )
-)
-.addTemplate(
-  template.interval(
-    'rate',
-    '1m,5m,10m,30m,1h,6h,12h,1d,7d,14d,30d',
-    '5m',
-    label='Rate',
-  )
-)
-.addTemplate(
-  template.new(
-    'cluster',
-    '$PROMETHEUS_DS',
-    'label_values(collectd_collectd_queue_length{}, cluster)',
-    label='Cluster',
-    refresh='time',
-    includeAll=true,
-    allValues=".*",
-  )
-)
-.addTemplate(
-  template.new(
-    'dc',
-    '$PROMETHEUS_DS',
-    'label_values(collectd_collectd_queue_length{cluster=~"$cluster"}, dc)',
-    label='DataCenter',
-    refresh='time',
-    includeAll=true,
-    allValues=".*",
-  )
-)
-.addTemplate(
-  template.new(
-    'rack',
-    '$PROMETHEUS_DS',
-    'label_values(collectd_collectd_queue_length{cluster=~"$cluster", dc=~"$dc"}, rack)',
-    label='Rack',
-    refresh='time',
-    includeAll=true,
-    allValues=".*",
-  )
-)
-.addTemplate(
-  template.new(
-    'keyspace',
-    '$PROMETHEUS_DS',
-    'label_values(' + prefix + '_table_read_latency_total{cluster=~"$cluster", dc=~"$dc"}, keyspace)',
-    label='Keyspace',
-    refresh='time',
-    includeAll=true,
-    allValues=".*",
-  )
-)
-.addTemplate(
-  template.new(
-    'table',
-    '$PROMETHEUS_DS',
-    'label_values(' + prefix + '_table_read_latency_total{cluster=~"$cluster", dc=~"$dc", keyspace=~"$keyspace"}, table)',
-    label='Table',
-    refresh='time',
-    includeAll=true,
-    allValues=".*",
-  )
-)
-.addTemplate(
-  template.new(
-    'host',
-    '$PROMETHEUS_DS',
-    'label_values(collectd_collectd_queue_length{cluster=~"$cluster", dc=~"$dc", rack=~"$rack"}, instance)',
-    label='Host',
-    refresh='time',
-    includeAll=true,
-    allValues=".*",
-  )
-)
-.addTemplate(
-  template.custom(
-    'latency',
-    '0.999,0.99,0.98,0.95,0.90,0.75,0.50',
-    '0.95',
-    valuelabels={
-      "0.999" : "P999",
-      "0.99"  : "P99",
-      "0.98"  : "P98",
-      "0.95"  : "P95",
-      "0.90"  : "P90",
-      "0.75"  : "P75",
-      "0.50"  : "P50"
-    },
-    label='Percentile'
-  )
-)
-.addRow(
-  row.new(
-    title='Cluster Overview',
-    height=singlestatHeight,
-  )
-  .addPanel(
-    singlestat.new(
-      'Nodes Up',
-      description="Nodes that are currently running in this time window",
-      format='none',
-      decimals=0,
-      datasource='$PROMETHEUS_DS',
-      colorValue=true,
-      colors=["#d44a3a", "#299c46", "#299c46"],
-      thresholds='0.1,1000',
-      span=singlestatSpan
-    )
-    .addTarget(
-      prometheus.target(
-        'count(' + prefix + '_compaction_completed_tasks{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$host"} >= 0) or vector(0)'
-      )
-    )
-  )
-  .addPanel(
-    singlestat.new(
-      'Nodes Down',
-      description="Nodes that are currently not running in this time window",
-      format='none',
-      decimals=0,
-      colorValue=true,
-      colors=[ "#299c46", "rgba(237, 129, 40, 0.89)", "#d44a3a"],
-      datasource='$PROMETHEUS_DS',
-      thresholds='1,2',
-      span=singlestatSpan
-    )
-    .addTarget(
-      prometheus.target(
-        'count(absent(sum(rate(' + prefix + '_compaction_completed_tasks{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$host"}[5m])))) OR vector(0)'
-      )
-    )
-  )
-  .addPanel(
-    singlestat.new(
-      'Compactions / $rate',
-      description="Rate of compactions during this window",
-      format='none',
-      decimals=0,
-      datasource='$PROMETHEUS_DS',
-      sparklineShow=true,
-      span=singlestatSpan
-    )
-    .addTarget(
-      prometheus.target(
-        'sum(rate(' + prefix + '_compaction_completed_tasks{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$host"}[$rate]))'
-      )
-    )
-  )
-  .addPanel(
-    singlestat.new(
-      'CQL Requests / $rate',
-      description="Rate of CQL requests during this window",
-      format='none',
-      datasource='$PROMETHEUS_DS',
-      sparklineShow=true,
-      decimals=0,
-      span=singlestatSpan
-    )
-    .addTarget(
-      prometheus.target(
-        'sum(irate(dse_client_request_latency_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$host"}[$rate]))'
-      )
-    )
-  )
-  .addPanel(
-    singlestat.new(
-      'Dropped Messages / $rate',
-      description="Rate of Dropped requests during this window",
-      format='none',
-      datasource='$PROMETHEUS_DS',
-      sparklineShow=true,
-      thresholds="30,300",
-      colorValue=true,
-      decimals=0,
-      span=singlestatSpan
-    )
-    .addTarget(
-      prometheus.target(
-          'sum(irate(' + prefix + '_table_dropped_mutations_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$host"}[$rate]))'
-      )
-    )
-  )
-  .addPanel(
-    text.new(
-      transparent=true,
-      mode="html",
-      content=' ',
-      span=2
-    )
-  )
-  .addPanel(
-    singlestat.new(
-      'CQL Clients',
-      description="Number of connected clients during this time window",
-      format='none',
-      datasource='$PROMETHEUS_DS',
-      sparklineShow=true,
-      thresholds="100,1000",
-      colorValue=true,
-      decimals=0,
-      span=singlestatSpan
-    )
-    .addTarget(
-      prometheus.target(
-          'sum(' + prefix + '_client_connected_native_clients{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$host"})'
-      )
-    )
-  )
-  .addPanel(
-    singlestat.new(
-      'Timeouts / $rate',
-      description="Client timeouts over the last $rate",
-      format='none',
-      datasource='$PROMETHEUS_DS',
-      thresholds='100,300',
-      colorValue=true,
-      sparklineShow=true,
-      span=singlestatSpan
-    )
-    .addTarget(
-      prometheus.target(
-        'sum(irate(' + prefix + '_client_request_timeouts_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$host"}[$rate]))',
-      )
-    )
-  )
-  .addPanel(
-    singlestat.new(
-      'Hints / $rate',
-      description="Hints stored over the last $rate",
-      format='none',
-      datasource='$PROMETHEUS_DS',
-      thresholds='1000,30000',
-      colorValue=true,
-      sparklineShow=true,
-      span=singlestatSpan
-    )
-    .addTarget(
-      prometheus.target(
-        'sum(irate(' + prefix + '_storage_hints_on_disk_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$host"}[$rate]))'
-      )
-    )
-  )
-  .addPanel(
-    singlestat.new(
-      'Data Size',
-      description="Data",
-      format='bytes',
-      datasource='$PROMETHEUS_DS',
-      sparklineShow=true,
-      span=singlestatSpan
-    )
-    .addTarget(
-      prometheus.target(
-          'sum(' + prefix + '_table_live_disk_space_used_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", keyspace=~"$keyspace", table=~"$table", instance=~"$host"})'
-      )
-    )
-  )
-  .addPanel(
-    singlestat.new(
-      'GC Time / $rate',
-      description="Data",
-      format='ms',
-      decimals=1,
-      datasource='$PROMETHEUS_DS',
-      sparklineShow=true,
-      span=singlestatSpan
-    )
-    .addTarget(
-      prometheus.target(
-          'sum(rate(' + prefix + '_jvm_gc_time{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$host"}[$rate]))'
-      )
-    )
-  )
-)
-.addRow(
-  row.new(
-    title='Condensed Metrics',
-    height=graphHeight
-  )
-  .addPanel(
-    graphpanel.new(
-      title="Requests Served / $by / $rate",
-      description="(no keyspace/table filters apply)",
-      datasource='$PROMETHEUS_DS',
-      span=graphSpan,
-      labelY2="Clients Connected",
-      legend_hideZero=true,
-      legend_hideEmpty=true
-    )
-    .addSeriesOverride({
-      "alias": "/.*Connected/",
-      "yaxis": 2
-    })
-    .addTarget(
-      prometheus.target(
-          expr='sum(irate(' + prefix + '_client_request_latency_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$host"}[$rate])) by ($by, request_type)',
-          legendFormat="{{$by}}:{{request_type}}"
-      )
-    )
-    .addTarget(
-      prometheus.target(
-          expr='sum(' + prefix + '_client_connected_native_clients{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$host"}) by ($by)',
-          legendFormat= "{{$by}}:Clients Connected"
-      )
-    )
-  )
-  .addPanel(
-    graphpanel.new(
-      title="Coordinator $latency Latency / $by",
-      description="(no keyspace/table filters apply)",
-      datasource='$PROMETHEUS_DS',
-      span=graphSpan,
-      format="µs",
-      min=0,
-      legend_hideZero=true,
-      legend_hideEmpty=true
-    )
-    .addTarget(
-      prometheus.target(
-          expr='histogram_quantile($latency, sum(rate(' + prefix + '_client_request_latency_bucket{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$host"}[$rate])) by (le, request_type, $by))',
-          legendFormat="$by:{{$by}} {{$latency}} {{request_type}}"
-      )
-    )
-  )
-  .addPanel(
-    graphpanel.new(
-      title="Memtable Space $keyspace.$table / $by",
-      datasource='$PROMETHEUS_DS',
-      span=graphSpan,
-      formatY1="bytes",
-      formatY2="short",
-      labelY2="Flush",
-      min=0,
-      legend_hideZero=true,
-      legend_hideEmpty=true
-    )
-    .addSeriesOverride({
-      "alias": "/.*Flushes/",
-      "bars": true,
-      "lines": false,
-      "zindex": -3,
-      "yaxis": 2,
-    })
-    .addTarget(
-      prometheus.target(
-        expr='sum(' + prefix + '_table_memtable_off_heap_size{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", keyspace=~"$keyspace", table=~"$table", instance=~"$host"}) by ($by)',
-        legendFormat="{{$by}} : Off Heap"
-      )
-    )
-    .addTarget(
-      prometheus.target(
-        expr='sum(' + prefix + '_table_memtable_on_heap_size{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", keyspace=~"$keyspace", table=~"$table", instance=~"$host"}) by ($by)',
-        legendFormat="{{$by}} : On Heap"
-      )
-    )
-    .addTarget(
-      prometheus.target(
-        expr='sum(idelta(' + prefix + '_table_memtable_switch_count_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", keyspace=~"$keyspace", table=~"$table", instance=~"$host"}[$rate])) by ($by)',
-        legendFormat="{{$by}} : Flushes"
-      )
-    )
-    .addTarget(
-      prometheus.target(
-        expr='sum(idelta(' + prefix + '_table_pending_flushes_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", keyspace=~"$keyspace", table=~"$table", instance=~"$host"}[$rate])) by ($by)',
-        legendFormat="{{$by}} : Pending Flushes"
-      )
-    )
-  )
-  .addPanel(
-    graphpanel.new(
-      title="Compactions $keyspace.$table / $by",
-      datasource='$PROMETHEUS_DS',
-      span=graphSpan,
-      format="bps",
-      formatY2="short",
-      labelY2="Count",
-      legend_hideZero=true,
-      legend_hideEmpty=true,
-      min=0
-    )
-    .addSeriesOverride({
-      "alias": "/.*Compactions/",
-      "bars": true,
-      "lines": false,
-      "zindex": -3,
-      "yaxis": 2,
-    })
-    .addTarget(
-      prometheus.target(
-          expr='sum(irate(' + prefix + '_table_compaction_bytes_written_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", keyspace=~"$keyspace", table=~"$table", instance=~"$host"}[$rate])) by ($by)',
-          legendFormat="{{by}} : Bytes Compacted"
-      )
-    )
-    .addTarget(
-      prometheus.target(
-          expr='sum(irate(' + prefix + '_table_pending_compactions{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", keyspace=~"$keyspace", table=~"$table", instance=~"$host"}[$rate])) by ($by)',
-          legendFormat="{{by}} : Pending Compactions"
-      )
-    )
-    .addTarget(
-      prometheus.target(
-          expr='sum(irate(' + prefix + '_compaction_completed_tasks{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$host"}[$rate])) by ($by)',
-          legendFormat="{{by}} : Completed Compactions"
-      )
-    )
-  )
-   .addPanel(
-    graphpanel.new(
-      title="Table $latency Latency / $by",
-      description="",
-      datasource='$PROMETHEUS_DS',
-      span=graphSpan,
-      format="µs",
-      min=0,
-      legend_hideZero=true,
-      legend_hideEmpty=true
-    )
-    .addTarget(
-      prometheus.target(
-          expr='histogram_quantile($latency, sum(irate(' + prefix + '_table_range_latency_bucket{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", keyspace=~"$keyspace", table=~"$table", instance=~"$host"}[$rate])) by (le, $by))',
-          legendFormat="$by:{{$by}} Local Range Scan"
-      )
-    )
-    .addTarget(
-      prometheus.target(
-          expr='histogram_quantile($latency, sum(irate(' + prefix + '_table_read_latency_bucket{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", keyspace=~"$keyspace", table=~"$table", instance=~"$host"}[$rate])) by (le, $by))',
-          legendFormat="$by:{{$by}} Local Read"
-      )
-    )
-    .addTarget(
-      prometheus.target(
-          expr='histogram_quantile($latency, sum(irate(' + prefix + '_table_write_latency_bucket{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", keyspace=~"$keyspace", table=~"$table", instance=~"$host"}[$rate])) by (le, $by))',
-          legendFormat="$by:{{$by}} Local Write"
-      )
-    )
-    .addTarget(
-      prometheus.target(
-          expr='histogram_quantile($latency, sum(irate(' + prefix + '_table_coordinator_read_latency_bucket{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", keyspace=~"$keyspace", table=~"$table"}[$rate])) by (le, $by))',
-          legendFormat="$by:{{$by}} Coordinator Read"
-      )
-    )
-    .addTarget(
-      prometheus.target(
-          expr='histogram_quantile($latency, sum(irate(' + prefix + '_table_coordinator_scan_latency_bucket{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", keyspace=~"$keyspace", table=~"$table", instance=~"$host"}[$rate])) by (le, $by))',
-          legendFormat="$by:{{$by}} Coordinator Range Scan"
-      )
-    )
-  )
-  .addPanel(
-    graphpanel.new(
-      title="Streaming / $by / $rate",
-      description="",
-      datasource='$PROMETHEUS_DS',
-      span=graphSpan,
-      format="Bps",
-      min=0,
-      legend_hideZero=true,
-      legend_hideEmpty=true
-    )
-    .addTarget(
-      prometheus.target(
-          expr='sum(irate(' + prefix + '_streaming_total_incoming_bytes_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$host"}[$rate])) by ($by)',
-          legendFormat="{{$by}}: Incoming Stream"
-      )
-    )
-    .addTarget(
-      prometheus.target(
-          expr='sum(irate(' + prefix + '_streaming_total_outgoing_bytes_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$host"}[$rate])) by ($by)',
-          legendFormat="{{$by}}: Outgoing Stream"
-      )
-    )
-  )
-)
diff --git a/dashboards/grafana/dashboards-jsonnet/overview.jsonnet b/dashboards/grafana/dashboards-jsonnet/overview.jsonnet
deleted file mode 100644
index 6b00a26..0000000
--- a/dashboards/grafana/dashboards-jsonnet/overview.jsonnet
+++ /dev/null
@@ -1,1110 +0,0 @@
-local grafana = (import 'grafonnet/grafana.libsonnet')
-              + (import 'grafonnet-polystat-panel/plugin.libsonnet');
-local dashboard = grafana.dashboard;
-local prometheus = grafana.prometheus;
-local template = grafana.template;
-local row = grafana.row;
-
-local graphPanel = grafana.graphPanel;
-local tablePanel = grafana.tablePanel;
-local singleStatPanel = grafana.singlestat;
-local textPanel = grafana.text;
-local polystatPanel = grafana.polystatPanel;
-
-local prefix = std.extVar('prefix');
-
-local fillLatencySeriesOverrides = {
-    'alias': 'p999',
-    'fillBelowTo': 'p98',
-    'lines': false
-};
-local removeMinLatencySeriesOverrides = {
-    'alias': 'p98',
-    'lines': false
-};
-
-local fillMinMaxSeriesOverrides = {
-    'alias': 'max',
-    'fillBelowTo': 'min',
-    'lines': false
-};
-local removeMinlineSeriesOverrides = {
-    'alias': 'min',
-    'lines': false
-};
-
-
-// used in the single stat panels where higher is better - cache hit rates for example
-local reversedColors =[
- '#d44a3a',
- 'rgba(237, 129, 40, 0.89)',
- '#299c46',
-];
-
-dashboard.new(
-  'Cassandra Overview',
-  schemaVersion=14,
-  refresh='30s',
-  time_from='now-30m',
-  editable=true,
-  tags=['Cassandra', 'Overview'],
-  style='dark'
-)
-.addTemplate(
-  grafana.template.datasource(
-    'PROMETHEUS_DS',
-    'prometheus',
-    'Prometheus',
-    hide='all',
-  )
-)
-.addTemplate(
-  template.new(
-    'cluster',
-    '$PROMETHEUS_DS',
-    'label_values(collectd_collectd_queue_length{}, cluster)',
-    label='Cluster',
-    refresh='time',
-  )
-)
-.addTemplate(
-  template.new(
-    'dc',
-    '$PROMETHEUS_DS',
-    'label_values(collectd_collectd_queue_length{cluster=~"$cluster"}, dc)',
-    label='DataCenter',
-    refresh='time',
-    includeAll=true,
-    allValues=".*",
-  )
-)
-.addTemplate(
-  template.new(
-    'rack',
-    '$PROMETHEUS_DS',
-    'label_values(collectd_collectd_queue_length{cluster=~"$cluster", dc=~"$dc"}, rack)',
-    label='Rack',
-    refresh='time',
-    includeAll=true,
-    allValues=".*",
-  )
-)
-.addTemplate(
-  template.new(
-    'node',
-    '$PROMETHEUS_DS',
-    'label_values(collectd_collectd_queue_length{cluster=~"$cluster", dc=~"$dc", rack=~"$rack"}, instance)',
-    label='Node',
-    refresh='time',
-    includeAll=true,
-    allValues=".*",
-  )
-)
-.addRow(
-  row.new(title='', height='50px')
-  .addPanel(textPanel.new(transparent=true))
-  .addPanel(
-    textPanel.new(
-      transparent=true,
-      mode="html",
-      content='
',
-      span=2
-    )
-  )
-  .addPanel(
-    singlestat.new(
-      'CQL Clients',
-      description="Number of connected clients during this time window",
-      format='none',
-      datasource='$PROMETHEUS_DS',
-      sparklineShow=true,
-      thresholds="100,1000",
-      colorValue=true,
-      decimals=0,
-      span=singlestatSpan
-    )
-    .addTarget(
-      prometheus.target(
-          'sum(' + prefix + '_client_connected_native_clients{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$host"})'
-      )
-    )
-  )
-  .addPanel(
-    singlestat.new(
-      'Timeouts / $rate',
-      description="Client timeouts over the last $rate",
-      format='none',
-      datasource='$PROMETHEUS_DS',
-      thresholds='100,300',
-      colorValue=true,
-      sparklineShow=true,
-      span=singlestatSpan
-    )
-    .addTarget(
-      prometheus.target(
-        'sum(irate(' + prefix + '_client_request_timeouts_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$host"}[$rate]))',
-      )
-    )
-  )
-  .addPanel(
-    singlestat.new(
-      'Hints / $rate',
-      description="Hints stored over the last $rate",
-      format='none',
-      datasource='$PROMETHEUS_DS',
-      thresholds='1000,30000',
-      colorValue=true,
-      sparklineShow=true,
-      span=singlestatSpan
-    )
-    .addTarget(
-      prometheus.target(
-        'sum(irate(' + prefix + '_storage_hints_on_disk_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$host"}[$rate]))'
-      )
-    )
-  )
-  .addPanel(
-    singlestat.new(
-      'Data Size',
-      description="Data",
-      format='bytes',
-      datasource='$PROMETHEUS_DS',
-      sparklineShow=true,
-      span=singlestatSpan
-    )
-    .addTarget(
-      prometheus.target(
-          'sum(' + prefix + '_table_live_disk_space_used_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", keyspace=~"$keyspace", table=~"$table", instance=~"$host"})'
-      )
-    )
-  )
-  .addPanel(
-    singlestat.new(
-      'GC Time / $rate',
-      description="Data",
-      format='ms',
-      decimals=1,
-      datasource='$PROMETHEUS_DS',
-      sparklineShow=true,
-      span=singlestatSpan
-    )
-    .addTarget(
-      prometheus.target(
-          'sum(rate(' + prefix + '_jvm_gc_time{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$host"}[$rate]))'
-      )
-    )
-  )
-)
-.addRow(
-  row.new(
-    title='Condensed Metrics',
-    height=graphHeight
-  )
-  .addPanel(
-    graphpanel.new(
-      title="Requests Served / $by / $rate",
-      description="(no keyspace/table filters apply)",
-      datasource='$PROMETHEUS_DS',
-      span=graphSpan,
-      labelY2="Clients Connected",
-      legend_hideZero=true,
-      legend_hideEmpty=true
-    )
-    .addSeriesOverride({
-      "alias": "/.*Connected/",
-      "yaxis": 2
-    })
-    .addTarget(
-      prometheus.target(
-          expr='sum(irate(' + prefix + '_client_request_latency_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$host"}[$rate])) by ($by, request_type)',
-          legendFormat="{{$by}}:{{request_type}}"
-      )
-    )
-    .addTarget(
-      prometheus.target(
-          expr='sum(' + prefix + '_client_connected_native_clients{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$host"}) by ($by)',
-          legendFormat= "{{$by}}:Clients Connected"
-      )
-    )
-  )
-  .addPanel(
-    graphpanel.new(
-      title="Coordinator $latency Latency / $by",
-      description="(no keyspace/table filters apply)",
-      datasource='$PROMETHEUS_DS',
-      span=graphSpan,
-      format="µs",
-      min=0,
-      legend_hideZero=true,
-      legend_hideEmpty=true
-    )
-    .addTarget(
-      prometheus.target(
-          expr='histogram_quantile($latency, sum(rate(' + prefix + '_client_request_latency_bucket{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$host"}[$rate])) by (le, request_type, $by))',
-          legendFormat="$by:{{$by}} {{$latency}} {{request_type}}"
-      )
-    )
-  )
-  .addPanel(
-    graphpanel.new(
-      title="Memtable Space $keyspace.$table / $by",
-      datasource='$PROMETHEUS_DS',
-      span=graphSpan,
-      formatY1="bytes",
-      formatY2="short",
-      labelY2="Flush",
-      min=0,
-      legend_hideZero=true,
-      legend_hideEmpty=true
-    )
-    .addSeriesOverride({
-      "alias": "/.*Flushes/",
-      "bars": true,
-      "lines": false,
-      "zindex": -3,
-      "yaxis": 2,
-    })
-    .addTarget(
-      prometheus.target(
-        expr='sum(' + prefix + '_table_memtable_off_heap_size{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", keyspace=~"$keyspace", table=~"$table", instance=~"$host"}) by ($by)',
-        legendFormat="{{$by}} : Off Heap"
-      )
-    )
-    .addTarget(
-      prometheus.target(
-        expr='sum(' + prefix + '_table_memtable_on_heap_size{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", keyspace=~"$keyspace", table=~"$table", instance=~"$host"}) by ($by)',
-        legendFormat="{{$by}} : On Heap"
-      )
-    )
-    .addTarget(
-      prometheus.target(
-        expr='sum(idelta(' + prefix + '_table_memtable_switch_count_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", keyspace=~"$keyspace", table=~"$table", instance=~"$host"}[$rate])) by ($by)',
-        legendFormat="{{$by}} : Flushes"
-      )
-    )
-    .addTarget(
-      prometheus.target(
-        expr='sum(idelta(' + prefix + '_table_pending_flushes_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", keyspace=~"$keyspace", table=~"$table", instance=~"$host"}[$rate])) by ($by)',
-        legendFormat="{{$by}} : Pending Flushes"
-      )
-    )
-  )
-  .addPanel(
-    graphpanel.new(
-      title="Compactions $keyspace.$table / $by",
-      datasource='$PROMETHEUS_DS',
-      span=graphSpan,
-      format="bps",
-      formatY2="short",
-      labelY2="Count",
-      legend_hideZero=true,
-      legend_hideEmpty=true,
-      min=0
-    )
-    .addSeriesOverride({
-      "alias": "/.*Compactions/",
-      "bars": true,
-      "lines": false,
-      "zindex": -3,
-      "yaxis": 2,
-    })
-    .addTarget(
-      prometheus.target(
-          expr='sum(irate(' + prefix + '_table_compaction_bytes_written_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", keyspace=~"$keyspace", table=~"$table", instance=~"$host"}[$rate])) by ($by)',
-          legendFormat="{{by}} : Bytes Compacted"
-      )
-    )
-    .addTarget(
-      prometheus.target(
-          expr='sum(irate(' + prefix + '_table_pending_compactions{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", keyspace=~"$keyspace", table=~"$table", instance=~"$host"}[$rate])) by ($by)',
-          legendFormat="{{by}} : Pending Compactions"
-      )
-    )
-    .addTarget(
-      prometheus.target(
-          expr='sum(irate(' + prefix + '_compaction_completed_tasks{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$host"}[$rate])) by ($by)',
-          legendFormat="{{by}} : Completed Compactions"
-      )
-    )
-  )
-   .addPanel(
-    graphpanel.new(
-      title="Table $latency Latency / $by",
-      description="",
-      datasource='$PROMETHEUS_DS',
-      span=graphSpan,
-      format="µs",
-      min=0,
-      legend_hideZero=true,
-      legend_hideEmpty=true
-    )
-    .addTarget(
-      prometheus.target(
-          expr='histogram_quantile($latency, sum(irate(' + prefix + '_table_range_latency_bucket{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", keyspace=~"$keyspace", table=~"$table", instance=~"$host"}[$rate])) by (le, $by))',
-          legendFormat="$by:{{$by}} Local Range Scan"
-      )
-    )
-    .addTarget(
-      prometheus.target(
-          expr='histogram_quantile($latency, sum(irate(' + prefix + '_table_read_latency_bucket{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", keyspace=~"$keyspace", table=~"$table", instance=~"$host"}[$rate])) by (le, $by))',
-          legendFormat="$by:{{$by}} Local Read"
-      )
-    )
-    .addTarget(
-      prometheus.target(
-          expr='histogram_quantile($latency, sum(irate(' + prefix + '_table_write_latency_bucket{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", keyspace=~"$keyspace", table=~"$table", instance=~"$host"}[$rate])) by (le, $by))',
-          legendFormat="$by:{{$by}} Local Write"
-      )
-    )
-    .addTarget(
-      prometheus.target(
-          expr='histogram_quantile($latency, sum(irate(' + prefix + '_table_coordinator_read_latency_bucket{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", keyspace=~"$keyspace", table=~"$table"}[$rate])) by (le, $by))',
-          legendFormat="$by:{{$by}} Coordinator Read"
-      )
-    )
-    .addTarget(
-      prometheus.target(
-          expr='histogram_quantile($latency, sum(irate(' + prefix + '_table_coordinator_scan_latency_bucket{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", keyspace=~"$keyspace", table=~"$table", instance=~"$host"}[$rate])) by (le, $by))',
-          legendFormat="$by:{{$by}} Coordinator Range Scan"
-      )
-    )
-  )
-  .addPanel(
-    graphpanel.new(
-      title="Streaming / $by / $rate",
-      description="",
-      datasource='$PROMETHEUS_DS',
-      span=graphSpan,
-      format="Bps",
-      min=0,
-      legend_hideZero=true,
-      legend_hideEmpty=true
-    )
-    .addTarget(
-      prometheus.target(
-          expr='sum(irate(' + prefix + '_streaming_total_incoming_bytes_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$host"}[$rate])) by ($by)',
-          legendFormat="{{$by}}: Incoming Stream"
-      )
-    )
-    .addTarget(
-      prometheus.target(
-          expr='sum(irate(' + prefix + '_streaming_total_outgoing_bytes_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$host"}[$rate])) by ($by)',
-          legendFormat="{{$by}}: Outgoing Stream"
-      )
-    )
-  )
-)
diff --git a/dashboards/grafana/dashboards-jsonnet/overview.jsonnet b/dashboards/grafana/dashboards-jsonnet/overview.jsonnet
deleted file mode 100644
index 6b00a26..0000000
--- a/dashboards/grafana/dashboards-jsonnet/overview.jsonnet
+++ /dev/null
@@ -1,1110 +0,0 @@
-local grafana = (import 'grafonnet/grafana.libsonnet')
-              + (import 'grafonnet-polystat-panel/plugin.libsonnet');
-local dashboard = grafana.dashboard;
-local prometheus = grafana.prometheus;
-local template = grafana.template;
-local row = grafana.row;
-
-local graphPanel = grafana.graphPanel;
-local tablePanel = grafana.tablePanel;
-local singleStatPanel = grafana.singlestat;
-local textPanel = grafana.text;
-local polystatPanel = grafana.polystatPanel;
-
-local prefix = std.extVar('prefix');
-
-local fillLatencySeriesOverrides = {
-    'alias': 'p999',
-    'fillBelowTo': 'p98',
-    'lines': false
-};
-local removeMinLatencySeriesOverrides = {
-    'alias': 'p98',
-    'lines': false
-};
-
-local fillMinMaxSeriesOverrides = {
-    'alias': 'max',
-    'fillBelowTo': 'min',
-    'lines': false
-};
-local removeMinlineSeriesOverrides = {
-    'alias': 'min',
-    'lines': false
-};
-
-
-// used in the single stat panels where higher is better - cache hit rates for example
-local reversedColors =[
- '#d44a3a',
- 'rgba(237, 129, 40, 0.89)',
- '#299c46',
-];
-
-dashboard.new(
-  'Cassandra Overview',
-  schemaVersion=14,
-  refresh='30s',
-  time_from='now-30m',
-  editable=true,
-  tags=['Cassandra', 'Overview'],
-  style='dark'
-)
-.addTemplate(
-  grafana.template.datasource(
-    'PROMETHEUS_DS',
-    'prometheus',
-    'Prometheus',
-    hide='all',
-  )
-)
-.addTemplate(
-  template.new(
-    'cluster',
-    '$PROMETHEUS_DS',
-    'label_values(collectd_collectd_queue_length{}, cluster)',
-    label='Cluster',
-    refresh='time',
-  )
-)
-.addTemplate(
-  template.new(
-    'dc',
-    '$PROMETHEUS_DS',
-    'label_values(collectd_collectd_queue_length{cluster=~"$cluster"}, dc)',
-    label='DataCenter',
-    refresh='time',
-    includeAll=true,
-    allValues=".*",
-  )
-)
-.addTemplate(
-  template.new(
-    'rack',
-    '$PROMETHEUS_DS',
-    'label_values(collectd_collectd_queue_length{cluster=~"$cluster", dc=~"$dc"}, rack)',
-    label='Rack',
-    refresh='time',
-    includeAll=true,
-    allValues=".*",
-  )
-)
-.addTemplate(
-  template.new(
-    'node',
-    '$PROMETHEUS_DS',
-    'label_values(collectd_collectd_queue_length{cluster=~"$cluster", dc=~"$dc", rack=~"$rack"}, instance)',
-    label='Node',
-    refresh='time',
-    includeAll=true,
-    allValues=".*",
-  )
-)
-.addRow(
-  row.new(title='', height='50px')
-  .addPanel(textPanel.new(transparent=true))
-  .addPanel(
-    textPanel.new(
-      transparent=true,
-      mode="html",
-      content=' ',
-    )
-  )
-  .addPanel(textPanel.new(transparent=true))
-)
-.addRow(
-  row.new(title='Request Throughputs (Coordinator Perspective)')
-  .addPanel(
-    graphPanel.new(
-      'Request Throughputs',
-      description='Total Requests Per Cluster, by Request Type',
-      format='rps',
-      datasource='$PROMETHEUS_DS',
-      transparent=true,
-      fill=0,
-      legend_show=true,
-      legend_values=true,
-      legend_current=true,
-      legend_alignAsTable=true,
-      legend_sort='current',
-      legend_sortDesc=true,
-      shared_tooltip=false,
-      min=0,
-    )
-    .addTarget(
-      prometheus.target(
-        expr='sum by (cluster, request_type) (rate(' + prefix + '_client_request_latency_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
-        legendFormat='{{request_type}}',
-      )
-    )
-  )
-  .addPanel(
-    graphPanel.new(
-      'Error throughputs',
-      description='Total Timeouts, Failures, Unavailable Rates for each cluster',
-      format='rps',
-      datasource='$PROMETHEUS_DS',
-      transparent=true,
-      fill=0,
-      legend_show=true,
-      legend_values=true,
-      legend_current=true,
-      legend_alignAsTable=true,
-      legend_sort='current',
-      legend_sortDesc=true,
-      shared_tooltip=false,
-      min=0,
-    )
-    .addTarget(
-      prometheus.target(
-        expr='sum by (cluster, request_type) (rate(' + prefix + '_client_request_failures_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
-        legendFormat='{{request_type}} failures',
-      )
-    )
-    .addTarget(
-      prometheus.target(
-        expr='sum by (cluster, request_type) (rate(' + prefix + '_client_request_timeouts_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
-        legendFormat='{{request_type}} timeouts',
-      )
-    )
-    .addTarget(
-      prometheus.target(
-        expr='sum by (cluster, request_type) (rate(' + prefix + '_client_request_unavailables_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
-        legendFormat='{{request_type}} unavailable errors',
-      )
-    )
-    .addTarget(
-      prometheus.target(
-        expr='sum by (cluster, request_type) (rate(' + prefix + '_client_request_unfinished_commit_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
-        legendFormat='{{request_type}} unfinished commit errors',
-      )
-    )
-    .addTarget(
-      prometheus.target(
-        expr='sum by (cluster, request_type) (rate(' + prefix + '_client_request_condition_not_met_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
-        legendFormat='{{request_type}} condition not met errors',
-      )
-    )
-    .addTarget(
-      prometheus.target(
-        expr='sum by (cluster, request_type) (rate(' + prefix + '_client_request_contention_histogram_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
-        legendFormat='{{request_type}} contention histogram errors',
-      )
-    )
-  )
-  .addPanel(
-    singleStatPanel.new(
-      'Read / Write Distribution',
-      description='Part of reads in the total of standard requests (Reads+Writes). CAS, Views, ... operations are ignored.',
-      format='percentunit',
-      datasource='$PROMETHEUS_DS',
-      transparent=true,
-      postfix=' Reads',
-      postfixFontSize='30%',
-      valueFontSize='30%',
-      valueName="current",
-      decimals=2,
-      thresholds='0.25,0.5,0.75',
-      timeFrom='',
-      colors=[
-        "#DEB6F2",
-        "#CA95E5",
-        "#8F3BB8"
-      ],
-      gaugeShow=true,
-      gaugeMinValue=0,
-      gaugeMaxValue=1,
-      gaugeThresholdLabels=true,
-      gaugeThresholdMarkers=false,
-      sparklineFillColor='rgba(31, 118, 189, 0.18)',
-      sparklineFull=false,
-      sparklineLineColor='#FFB357',
-      sparklineShow=false
-    )
-    .addTarget(
-      prometheus.target(
-        expr='sum by (cluster, request_type) (rate(' + prefix + '_client_request_latency_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node", request_type="read"}[1m:30s])) / ignoring (request_type) (sum by (cluster, request_type) (rate(' + prefix + '_client_request_latency_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node", request_type="read"}[1m:30s])) + ignoring (request_type) sum by (cluster, request_type) (rate(' + prefix + '_client_request_latency_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node", request_type="write"}[1m:30s])))',
-      )
-    )
-  )
-  .addPanel(
-    graphPanel.new(
-      'Read Latency (98 - 999th percentile)',
-      description='Read latency for coordinated reads',
-      format='µs',
-      datasource='$PROMETHEUS_DS',
-      transparent=true,
-      fill=0,
-      legend_show=true,
-      legend_values=true,
-      legend_current=true,
-      legend_alignAsTable=true,
-      legend_sort='current',
-      legend_sortDesc=true,
-      shared_tooltip=false,
-      min=0,
-    )
-    .addTarget(
-      prometheus.target(
-        expr='histogram_quantile(0.98, sum(rate(' + prefix + '_client_request_latency_bucket{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node", request_type="read"}[5m])) by (le, cluster))',
-        legendFormat='p98',
-      )
-    )
-    .addTarget(
-      prometheus.target(
-        expr='histogram_quantile(0.99, sum(rate(' + prefix + '_client_request_latency_bucket{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node", request_type="read"}[5m])) by (le, cluster))',
-        legendFormat='p99',
-      )
-    )
-    .addTarget(
-      prometheus.target(
-        expr='histogram_quantile(0.999, sum(rate(' + prefix + '_client_request_latency_bucket{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node", request_type="read"}[5m])) by (le, cluster))',
-        legendFormat='p999',
-      )
-    )
-    .addSeriesOverride(fillLatencySeriesOverrides)
-    .addSeriesOverride(removeMinLatencySeriesOverrides)
-  )
-  .addPanel(
-    graphPanel.new(
-      'Write Latency (98th - p999 Percentile)',
-      description='Write latency for coordinated writes',
-      format='µs',
-      datasource='$PROMETHEUS_DS',
-      transparent=true,
-      fill=0,
-      legend_show=true,
-      legend_values=true,
-      legend_current=true,
-      legend_alignAsTable=true,
-      legend_sort='current',
-      legend_sortDesc=true,
-      shared_tooltip=false,
-      min=0,
-    )
-    .addTarget(
-      prometheus.target(
-        expr='histogram_quantile(0.98, sum(rate(' + prefix + '_client_request_latency_bucket{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node", request_type="write"}[5m])) by (le, cluster))',
-        legendFormat='p98',
-      )
-    )
-    .addTarget(
-      prometheus.target(
-        expr='histogram_quantile(0.99, sum(rate(' + prefix + '_client_request_latency_bucket{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node", request_type="write"}[5m])) by (le, cluster))',
-        legendFormat='p99',
-      )
-    )
-    .addTarget(
-      prometheus.target(
-        expr='histogram_quantile(0.999, sum(rate(' + prefix + '_client_request_latency_bucket{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node", request_type="write"}[5m])) by (le, cluster))',
-        legendFormat='p999',
-      )
-    )
-    .addSeriesOverride(fillLatencySeriesOverrides)
-    .addSeriesOverride(removeMinLatencySeriesOverrides)
-  )
-  .addPanel(
-    graphPanel.new(
-      'Other Latencies',
-      description='Other p99 latencies for coordinated requests',
-      format='µs',
-      datasource='$PROMETHEUS_DS',
-      transparent=true,
-      fill=0,
-      legend_show=true,
-      legend_values=true,
-      legend_current=true,
-      legend_alignAsTable=true,
-      legend_sort='current',
-      legend_sortDesc=true,
-      shared_tooltip=false,
-      min=0,
-    )
-    .addTarget(
-      prometheus.target(
-        # In scope!~"Write|Read|.*-.*", we want to exclude charts above and all the per-consistency_level info like "Read-LOCAL_ONE"
-        expr='histogram_quantile(0.99, sum(rate(' + prefix + '_client_request_latency_bucket{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node", request_type!~"write|read|.*-.*"}[1m:30s])) by (le, request_type, cluster))',
-        legendFormat='p99 {{request_type}}'
-      )
-    )
-  )
-)
-.addRow(
-  row.new(title='Nodes Status',)
-  .addPanel(
-    polystatPanel.new(
-      'Nodes Status',
-      description='Nodes Status uses Internal/Gossip activity. Be mindful that if Native or Thrift protocol are disabled, the nodes won\'t be reachable, and still marked up',
-      datasource='$PROMETHEUS_DS',
-      transparent=true,
-      span=12,
-      global_unit_format='none',
-      global_operator_name='current',
-      global_thresholds=[
-        {
-          "value": 0,
-          "state": 2,
-          "color": "#d44a3a"
-        },
-        {
-          "value": 1,
-          "state": 0,
-          "color": "#299c46"
-        }
-      ],
-      range_maps=[
-        {
-          "from": "0",
-          "to": "0.9999",
-          "text": "DOWN"
-        },
-        {
-          "from": "1",
-          "to": "1",
-          "text": "UP"
-        }
-      ],
-      mapping_type=2,
-      value_enabled=true,
-    )
-    .addTarget(
-      prometheus.target(
-        'max by (cluster, dc, rack, instance) (changes(' + prefix + '_thread_pools_completed_tasks{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node", pool_name="gossip_stage"}[2m:30s])) > bool 0',
-        legendFormat='{{instance}}',
-        instant=true,
-      )
-    )
-  )
-  .addPanel(
-    singleStatPanel.new(
-      'Nodes Count',
-      description='Nodes up and down in the cluster',
-      format='short',
-      datasource='$PROMETHEUS_DS',
-      transparent=true,
-      decimals=0,
-      prefix='Total:',
-      postfix=' Nodes',
-      postfixFontSize='80%',
-      valueFontSize='80%',
-      span=4
-    )
-    .addTarget(
-      prometheus.target(
-        expr='count by (cluster) (max by (cluster, dc, rack, instance) (collectd_collectd_queue_length{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}))',
-        legendFormat='Total Number Of Nodes',
-      )
-    )
-  )
-  .addPanel(
-    graphPanel.new(
-      'Nodes Status History',
-      description='Nodes up and down in the cluster per protocol/activity',
-      format='short',
-      datasource='$PROMETHEUS_DS',
-      transparent=true,
-      decimals=0,
-      fill=0,
-      legend_show=true,
-      legend_values=true,
-      legend_current=true,
-      legend_alignAsTable=true,
-      legend_sort='current',
-      legend_sortDesc=false,
-      shared_tooltip=false,
-      min=0,
-      span=8
-    )
-    .addTarget(
-      prometheus.target(
-        expr='count by (cluster) (max by (cluster, dc, rack, instance) (collectd_collectd_queue_length{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}))',
-        legendFormat='Total Number Of Nodes',
-      )
-    )
-    .addTarget(
-      prometheus.target(
-        expr='sum by (cluster) (max by (cluster, datacenter, rack, instance) (changes(' + prefix + '_thread_pools_completed_tasks{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node", pool_name="native"}[2m:30s])) > bool 0)',
-        legendFormat='Nodes Coordinating Requests (Native protocol)',
-      )
-    )
-    .addTarget(
-      prometheus.target(
-        expr='sum by (cluster) (max by (cluster, datacenter, rack, instance) (changes(' + prefix + '_thread_pools_completed_tasks{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node", pool_name="gossip_stage"}[2m:30s])) > bool 0)',
-        legendFormat='Nodes With Internal Activity (Gossip protocol)',
-      )
-    )
-  )
-)
-.addRow(
-  row.new(title='Data Status')
-  .addPanel(
-    tablePanel.new(
-      'Disk Space Usage',
-      description='Disk space used ordered (fullest disks first)',
-      datasource='$PROMETHEUS_DS',
-      transform='timeseries_aggregations',
-      transparent=true,
-      styles=[
-        {
-          "alias": "Node --> Mounting Point",
-          "colorMode": null,
-          "colors": [
-            "rgba(245, 54, 54, 0.9)",
-            "rgba(237, 129, 40, 0.89)",
-            "rgba(50, 172, 45, 0.97)"
-          ],
-          "dateFormat": "YYYY-MM-DD HH:mm:ss",
-          "decimals": 2,
-          "mappingType": 1,
-          "pattern": "Metric",
-          "preserveFormat": true,
-          "sanitize": true,
-          "thresholds": [],
-          "type": "string",
-          "unit": "short"
-        },
-        {
-          "alias": "% Disk Space Used",
-          "colorMode": "row",
-          "colors": [
-            "rgba(50, 172, 45, 0.97)",
-            "rgba(237, 129, 40, 0.89)",
-            "rgba(245, 54, 54, 0.9)"
-          ],
-          "dateFormat": "YYYY-MM-DD HH:mm:ss",
-          "decimals": 2,
-          "link": false,
-          "mappingType": 1,
-          "pattern": "Current",
-          "thresholds": [
-            "0.5",
-            "0.75",
-          ],
-          "type": "number",
-          "unit": "percentunit"
-        }
-      ],
-      columns=[
-        {
-          "text": "Current",
-          "value": "current"
-        }
-      ],
-      sort={
-        "col": 1,
-        "desc": true
-      }
-    )
-    .addTarget(
-      prometheus.target(
-        expr='min by (instance, df) (1-(collectd_df_df_complex{df!~".*lxcfs.*", cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node", type="free"}
-        / ignoring (type) (collectd_df_df_complex{df!~".*lxcfs.*", cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node", type="used"}
-          + ignoring (type) collectd_df_df_complex{df!~".*lxcfs.*", cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node", type="reserved"}
-          + ignoring (type) collectd_df_df_complex{df!~".*lxcfs.*", cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node", type="free"}))
-        )',
-        legendFormat='{{cluster}}-{{instance}} --> {{df}}',
-        instant=true
-      )
-    )
-  )
-  .addPanel(
-    graphPanel.new(
-      'Cassandra cluster Data Size',
-      description='Total sizes of the data on distinct nodes',
-      format='bytes',
-      datasource='$PROMETHEUS_DS',
-      transparent=true,
-      fill=0,
-      legend_show=true,
-      legend_values=true,
-      legend_current=true,
-      legend_alignAsTable=true,
-      legend_sort='current',
-      legend_sortDesc=true,
-      shared_tooltip=false,
-    )
-    .addTarget(
-      prometheus.target(
-        expr='sum by (cluster) (' + prefix + '_table_live_disk_space_used_total{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
-        legendFormat='Live space - {{cluster}}',
-      )
-    )
-    .addTarget(
-      prometheus.target(
-        expr='sum by (cluster) (' + prefix + '_table_total_disk_space_used_total{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
-        legendFormat='Total space - {{cluster}}',
-      )
-    )
-  )
-  .addPanel(
-    graphPanel.new(
-      'SSTable Count',
-      description='SSTable Count Max and Average per table',
-      format='short',
-      datasource='$PROMETHEUS_DS',
-      transparent=true,
-      fill=0,
-      legend_show=true,
-      legend_values=true,
-      legend_current=true,
-      legend_alignAsTable=true,
-      legend_sort='current',
-      legend_sortDesc=true,
-      shared_tooltip=false,
-      min=0,
-    )
-    .addTarget(
-      prometheus.target(
-        expr='max by (cluster, keyspace, table) (' + prefix + '_table_live_ss_table_count{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
-        legendFormat='Table - {{keyspace}}.{{table}}',
-      )
-    )
-    .addTarget(
-      prometheus.target(
-        expr='max by (cluster) (' + prefix + '_table_live_ss_table_count{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
-        legendFormat='Max in cluster - {{cluster}}',
-      )
-    )
-  )
-  .addPanel(
-    graphPanel.new(
-      'Pending Compactions',
-      description='Maximum pending compactions on any node in the cluster',
-      format='short',
-      datasource='$PROMETHEUS_DS',
-      transparent=true,
-      fill=0,
-      legend_show=true,
-      legend_values=true,
-      legend_current=true,
-      legend_alignAsTable=true,
-      legend_sort='current',
-      legend_sortDesc=true,
-      shared_tooltip=false,
-      min=0,
-      bars=false,
-      lines=true,
-      stack=false,
-      decimals=0,
-    )
-    .addTarget(
-      prometheus.target(
-        expr='max by (cluster) (' + prefix + '_table_pending_compactions{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
-        legendFormat='max',
-      )
-    )
-    .addTarget(
-      prometheus.target(
-        expr='min by (cluster) (' + prefix + '_table_pending_compactions{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
-        legendFormat='min',
-      )
-    )
-    .addTarget(
-      prometheus.target(
-        expr='avg by (cluster) (' + prefix + '_table_pending_compactions{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
-        legendFormat='avg',
-      )
-    )
-    .addSeriesOverride(fillMinMaxSeriesOverrides)
-    .addSeriesOverride(removeMinlineSeriesOverrides)
-  )
-  .addPanel(
-    graphPanel.new(
-      'Pending Compactions per Table',
-      description='Maximum pending compactions per table',
-      format='short',
-      datasource='$PROMETHEUS_DS',
-      transparent=true,
-      fill=0,
-      legend_show=true,
-      legend_values=true,
-      legend_current=true,
-      legend_alignAsTable=true,
-      legend_sort='current',
-      legend_sortDesc=true,
-      shared_tooltip=false,
-      min=0,
-      bars=false,
-      lines=true,
-      stack=true,
-      decimals=0,
-    )
-    .addTarget(
-      prometheus.target(
-        expr='max by (cluster, keyspace, table) (' + prefix + '_table_pending_compactions{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
-        legendFormat='max for {{keyspace}}.{{table}}',
-      )
-    )
-  )
-)
-.addRow(
-  row.new(title='Cassandra Internals')
-  .addPanel(
-    graphPanel.new(
-      'Pending Tasks',
-      description='Cluster wide pending threads, by thread pool name',
-      format='short',
-      datasource='$PROMETHEUS_DS',
-      transparent=true,
-      fill=0,
-      legend_show=true,
-      legend_values=true,
-      legend_current=true,
-      legend_alignAsTable=true,
-      legend_sort='current',
-      legend_sortDesc=true,
-      shared_tooltip=false,
-      min=0,
-    )
-    .addTarget(
-      prometheus.target(
-        expr='sum by (cluster, pool_name) (' + prefix + '_thread_pools_pending_tasks{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
-        legendFormat='{{cluster}} - pending {{pool_name}}',
-      )
-    )
-  )
-  .addPanel(
-    graphPanel.new(
-      'Blocked Tasks',
-      description='Cluster wide blocked threads, by thread pool name',
-      format='short',
-      datasource='$PROMETHEUS_DS',
-      transparent=true,
-      fill=0,
-      legend_show=true,
-      legend_values=true,
-      legend_current=true,
-      legend_alignAsTable=true,
-      legend_sort='current',
-      legend_sortDesc=true,
-      shared_tooltip=false,
-      min=0,
-    )
-    .addTarget(
-      prometheus.target(
-        expr='sum by (cluster, pool_name) (rate(' + prefix + '_thread_pools_total_blocked_tasks_total{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
-        legendFormat='{{cluster}} - blocked {{pool_name}}',
-      )
-    )
-  )
- .addPanel(
-    graphPanel.new(
-      'Dropped Messages',
-      description='Dropped messages rate summed by message type and cluster',
-      format='short',
-      datasource='$PROMETHEUS_DS',
-      transparent=true,
-      fill=0,
-      legend_show=true,
-      legend_values=true,
-      legend_current=true,
-      legend_alignAsTable=true,
-      legend_sort='current',
-      legend_sortDesc=true,
-      shared_tooltip=false,
-      min=0,
-    )
-    .addTarget(
-      prometheus.target(
-        expr='sum by (cluster, message_type) (rate(' + prefix + '_dropped_message_dropped_total{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
-        legendFormat='{{cluster}} - dropped {{message_type}}',
-      )
-    )
-  )
-  .addPanel(
-     graphPanel.new(
-       'Active Tasks',
-       description='active threads summed per cluster',
-       format='short',
-       datasource='$PROMETHEUS_DS',
-       transparent=true,
-       fill=0,
-       legend_show=true,
-       legend_values=true,
-       legend_current=true,
-       legend_alignAsTable=true,
-       legend_sort='current',
-       legend_sortDesc=true,
-       shared_tooltip=false,
-       min=0,
-     )
-     .addTarget(
-       prometheus.target(
-         expr='sum by (cluster, pool_name) (' + prefix + '_thread_pools_active_tasks{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
-         legendFormat='{{cluster}} - active {{pool_name}}',
-       )
-     )
-   )
-  .addPanel(
-     graphPanel.new(
-       'Hinted Handoff',
-       description='Sum of hints being handed off per cluster.',
-       format='short',
-       datasource='$PROMETHEUS_DS',
-       transparent=true,
-       fill=0,
-       legend_show=true,
-       legend_values=true,
-       legend_current=true,
-       legend_alignAsTable=true,
-       legend_sort='current',
-       legend_sortDesc=true,
-       shared_tooltip=false,
-       min=0,
-     )
-     .addTarget(
-       prometheus.target(
-         expr='sum by (cluster) (' + prefix + '_storage_total_hints_in_progress_total{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
-         legendFormat='count',
-       )
-     )
-   )
-)
-.addRow(
-  row.new(title='Hardware / Operating System')
- .addPanel(
-    graphPanel.new(
-      'CPU Utilization',
-      description='Maximum CPU utilisation (max 100%)',
-      format='percentunit',
-      datasource='$PROMETHEUS_DS',
-      transparent=true,
-      fill=0,
-      legend_show=true,
-      legend_values=true,
-      legend_current=true,
-      legend_alignAsTable=true,
-      legend_sort='current',
-      legend_sortDesc=true,
-      shared_tooltip=false,
-      percentage=true,
-      decimals=1,
-      min=0,
-      max=1,
-    )
-    .addTarget(
-      prometheus.target(
-        expr='max by (cluster) (1 - (sum by (cluster, dc, rack, instance) (rate(collectd_cpu_total{type="idle", cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s])) / sum by (cluster, dc, rack, instance) (rate(collectd_cpu_total{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))))',
-        legendFormat='max',
-      )
-    )
-    .addTarget(
-      prometheus.target(
-        expr='min by (cluster) (1 - (sum by (cluster, dc, rack, instance) (rate(collectd_cpu_total{type="idle", cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s])) / sum by (cluster, dc, rack, instance) (rate(collectd_cpu_total{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))))',
-        legendFormat='min',
-      )
-    )
-    .addTarget(
-      prometheus.target(
-        expr='avg by (cluster) (1 - (sum by (cluster, dc, rack, instance) (rate(collectd_cpu_total{type="idle", cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s])) / sum by (cluster, dc, rack, instance) (rate(collectd_cpu_total{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))))',
-        legendFormat='avg',
-      )
-    )
-    .addSeriesOverride(fillMinMaxSeriesOverrides)
-    .addSeriesOverride(removeMinlineSeriesOverrides)
-  )
-  .addPanel(
-    graphPanel.new(
-      'Unix Load (1m rate)',
-      description='Max Unix load on a node for a cluster',
-      format='short',
-      datasource='$PROMETHEUS_DS',
-      transparent=true,
-      fill=0,
-      legend_show=true,
-      legend_values=true,
-      legend_current=true,
-      legend_alignAsTable=true,
-      legend_sort='current',
-      legend_sortDesc=true,
-      shared_tooltip=false,
-    )
-    .addTarget(
-      prometheus.target(
-        expr='max by (cluster) (collectd_load_shortterm{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
-        legendFormat='max',
-      )
-    )
-    .addTarget(
-      prometheus.target(
-        'min by (cluster) (collectd_load_shortterm{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
-        legendFormat='min',
-      )
-    )
-    .addTarget(
-      prometheus.target(
-        'avg by (cluster) (collectd_load_shortterm{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
-        legendFormat='avg',
-      )
-    )
-    .addSeriesOverride(fillMinMaxSeriesOverrides)
-    .addSeriesOverride(removeMinlineSeriesOverrides)
-  )
-  .addPanel(
-    graphPanel.new(
-      'Memory Utilisation',
-      description='Maximum Memory allocated per usage (worst node) - excludes caches, buffers, etc',
-      format='bytes',
-      datasource='$PROMETHEUS_DS',
-      transparent=true,
-      legend_show=true,
-      legend_values=true,
-      legend_current=true,
-      legend_alignAsTable=true,
-      legend_sort='current',
-      legend_sortDesc=true,
-      shared_tooltip=false,
-      fill=1,
-      linewidth=2,
-    )
-    .addTarget(
-      prometheus.target(
-        expr='min by (cluster) (sum by (cluster, dc, rack, instance) (collectd_memory{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}))',
-        legendFormat='min memory available',
-      )
-    )
-    .addTarget(
-      prometheus.target(
-        expr='max by (cluster, memory) (sum by (cluster, dc, rack, instance, memory) (collectd_memory{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}))',
-        legendFormat='max memory {{memory}}',
-      )
-    )
-  )
-  .addPanel(
-    graphPanel.new(
-      'Disk Read Thoughput',
-      description='Disk read throughput',
-      format='bps',
-      datasource='$PROMETHEUS_DS',
-      transparent=true,
-      fill=0,
-      legend_show=true,
-      legend_values=true,
-      legend_current=true,
-      legend_alignAsTable=true,
-      legend_sort='current',
-      legend_sortDesc=true,
-      shared_tooltip=false,
-    )
-    .addTarget(
-      prometheus.target(
-        expr='max by (cluster) (rate(collectd_processes_disk_octets_read_total{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
-        legendFormat='max',
-      )
-    )
-    .addTarget(
-      prometheus.target(
-        'min by (cluster) (rate(collectd_processes_disk_octets_read_total{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
-        legendFormat='min',
-      )
-    )
-    .addTarget(
-      prometheus.target(
-        'avg by (cluster) (rate(collectd_processes_disk_octets_read_total{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
-        legendFormat='avg',
-      )
-    )
-    .addSeriesOverride(fillMinMaxSeriesOverrides)
-    .addSeriesOverride(removeMinlineSeriesOverrides)
-  )
-  .addPanel(
-    graphPanel.new(
-      'Disk Write Thoughput',
-      description='Disk write throughput',
-      format='bps',
-      datasource='$PROMETHEUS_DS',
-      transparent=true,
-      fill=0,
-      legend_show=true,
-      legend_values=true,
-      legend_current=true,
-      legend_alignAsTable=true,
-      legend_sort='current',
-      legend_sortDesc=true,
-      shared_tooltip=false,
-    )
-    .addTarget(
-      prometheus.target(
-        expr='max by (cluster) (rate(collectd_processes_disk_octets_write_total{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
-        legendFormat='max',
-      )
-    )
-    .addTarget(
-      prometheus.target(
-        'min by (cluster) (rate(collectd_processes_disk_octets_write_total{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
-        legendFormat='min',
-      )
-    )
-    .addTarget(
-      prometheus.target(
-        'avg by (cluster) (rate(collectd_processes_disk_octets_write_total{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
-        legendFormat='avg',
-      )
-    )
-    .addSeriesOverride(fillMinMaxSeriesOverrides)
-    .addSeriesOverride(removeMinlineSeriesOverrides)
-  )
-  .addPanel(
-    graphPanel.new(
-      'Network I/O',
-      description='Network In and Out per cluster',
-      format='bytes',
-      datasource='$PROMETHEUS_DS',
-      transparent=true,
-      fill=1,
-      legend_show=true,
-      legend_values=true,
-      legend_current=true,
-      legend_alignAsTable=true,
-      legend_sort='current',
-      legend_sortDesc=true,
-      shared_tooltip=false,
-      bars=false,
-    )
-    .addTarget(
-      prometheus.target(
-        'sum by (cluster) (rate(collectd_interface_if_octets_rx_total{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
-        legendFormat='outgoing',
-      )
-    )
-    .addTarget(
-      prometheus.target(
-        'sum by (cluster) (rate(collectd_interface_if_octets_rx_total{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
-        legendFormat='incoming',
-      )
-    )
-    .addSeriesOverride({
-          "alias": "incoming",
-          "transform": "negative-Y"
-    })
-
-  )
-)
-.addRow(
-  row.new(title='JVM / Garbage Collection')
-  .addPanel(
-    graphPanel.new(
-      'Application Throughput (% time NOT doing GC)',
-      description='Percentage of the time the node is *not* doing a GC, thus Cassandra is not stopped for GC',
-      format='percentunit',
-      datasource='$PROMETHEUS_DS',
-      transparent=true,
-      fill=0,
-      legend_show=true,
-      legend_values=true,
-      legend_current=true,
-      legend_alignAsTable=true,
-      legend_sort='current',
-      legend_sortDesc=true,
-      shared_tooltip=false,
-      decimals=2,
-      min=0,
-      max=1,
-    )
-    .addTarget(
-      prometheus.target(
-        'max by (cluster) (1 - (sum by (cluster, dc, rack, instance) (rate(' + prefix + '_jvm_gc_time{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s])) / 1000))',
-        legendFormat='max',
-      )
-    )
-    .addTarget(
-      prometheus.target(
-        'min by (cluster) (1 - (sum by (cluster, dc, rack, instance) (rate(' + prefix + '_jvm_gc_time{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s])) / 1000))',
-        legendFormat='min',
-      )
-    )
-    .addTarget(
-      prometheus.target(
-        'avg by (cluster) (1 - (sum by (cluster, dc, rack, instance) (rate(' + prefix + '_jvm_gc_time{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s])) / 1000))',
-        legendFormat='avg',
-      )
-    )
-    .addSeriesOverride(fillMinMaxSeriesOverrides)
-    .addSeriesOverride(removeMinlineSeriesOverrides)
-  )
-  .addPanel(
-    graphPanel.new(
-      'Garbage Collection Time',
-      description='Garbage collection duration',
-      format='ms',
-      datasource='$PROMETHEUS_DS',
-      transparent=true,
-      fill=0,
-      legend_show=true,
-      legend_values=true,
-      legend_current=true,
-      legend_alignAsTable=true,
-      legend_sort='current',
-      legend_sortDesc=true,
-      shared_tooltip=false,
-    )
-    .addTarget(
-      prometheus.target(
-        'max by (cluster) (rate(' + prefix + '_jvm_gc_time{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
-        legendFormat='max',
-      )
-    )
-    .addTarget(
-      prometheus.target(
-        'min by (cluster) (rate(' + prefix + '_jvm_gc_time{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
-        legendFormat='min',
-      )
-    )
-    .addTarget(
-      prometheus.target(
-        'avg by (cluster) (rate(' + prefix + '_jvm_gc_time{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
-        legendFormat='avg',
-      )
-    )
-    .addSeriesOverride(fillMinMaxSeriesOverrides)
-    .addSeriesOverride(removeMinlineSeriesOverrides)
-  )
-  .addPanel(
-    graphPanel.new(
-      'JVM Heap Memory Utilisation',
-      description='Maximum JVM Heap Memory size (worst node) and minimum available heap size',
-      format='bytes',
-      datasource='$PROMETHEUS_DS',
-      transparent=true,
-      legend_show=true,
-      legend_values=true,
-      legend_current=true,
-      legend_alignAsTable=true,
-      legend_sort='current',
-      legend_sortDesc=true,
-      shared_tooltip=false,
-      fill=1,
-      linewidth=2,
-    )
-    .addTarget(
-      prometheus.target(
-        'max by (cluster)
-        (' + prefix + '_jvm_memory_used{memory_type="heap", cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
-        legendFormat='max',
-      )
-    )
-    .addTarget(
-      prometheus.target(
-        'min by (cluster)
-        (' + prefix + '_jvm_memory_used{memory_type="heap", cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
-        legendFormat='min',
-      )
-    )
-    .addTarget(
-      prometheus.target(
-        'avg by (cluster)
-        (' + prefix + '_jvm_memory_used{memory_type="heap", cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
-        legendFormat='avg',
-      )
-    )
-    .addTarget(
-      prometheus.target(
-        'min by ( cluster)
-        (' + prefix + '_jvm_memory_max{memory_type="heap", cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
-        legendFormat='Heap memory available',
-      )
-    )
-    .addSeriesOverride(fillMinMaxSeriesOverrides)
-    .addSeriesOverride(removeMinlineSeriesOverrides)
-  )
-)
diff --git a/dashboards/grafana/dashboards-jsonnet/system-metrics.jsonnet b/dashboards/grafana/dashboards-jsonnet/system-metrics.jsonnet
deleted file mode 100644
index e9482ae..0000000
--- a/dashboards/grafana/dashboards-jsonnet/system-metrics.jsonnet
+++ /dev/null
@@ -1,902 +0,0 @@
-local grafana = import 'grafonnet/grafana.libsonnet';
-
-local dashboard = grafana.dashboard;
-local row = grafana.row;
-local singlestat = grafana.singlestat;
-local graphpanel = grafana.graphPanel;
-local text = grafana.text;
-local prometheus = grafana.prometheus;
-local template = grafana.template;
-
-local prefix = std.extVar('prefix');
-
-local textstatHeight = 100;
-local graphHeight = 250;
-local singlestatHeight = 125;
-local singlestatSpan = 2;
-local graphSpan = 6;
-
-dashboard.new(
-  'System & Node Metrics',
-  description='Operating System Metrics and Apache Cassandra Node Information',
-  schemaVersion=14,
-  time_from='now-30m',
-  refresh='1m',
-  tags=['os'],
-  style='dark'
-)
-.addTemplate(
-  template.datasource(
-    'PROMETHEUS_DS',
-    'prometheus',
-    'Prometheus',
-    hide='all',
-  )
-)
-.addTemplate(
-  template.interval(
-    'rate',
-    '1m,5m,10m,30m,1h,6h,12h,1d,7d,14d,30d',
-    '5m',
-    label='Rate',
-  )
-)
-.addTemplate(
-  template.new(
-    'host',
-    '$PROMETHEUS_DS',
-    'label_values(collectd_collectd_queue_length{}, instance)',
-    label='Host',
-    refresh='time',
-  )
-)
-.addPanel(
-  text.new(
-      transparent=true,
-      mode="html",
-      content='
',
-    )
-  )
-  .addPanel(textPanel.new(transparent=true))
-)
-.addRow(
-  row.new(title='Request Throughputs (Coordinator Perspective)')
-  .addPanel(
-    graphPanel.new(
-      'Request Throughputs',
-      description='Total Requests Per Cluster, by Request Type',
-      format='rps',
-      datasource='$PROMETHEUS_DS',
-      transparent=true,
-      fill=0,
-      legend_show=true,
-      legend_values=true,
-      legend_current=true,
-      legend_alignAsTable=true,
-      legend_sort='current',
-      legend_sortDesc=true,
-      shared_tooltip=false,
-      min=0,
-    )
-    .addTarget(
-      prometheus.target(
-        expr='sum by (cluster, request_type) (rate(' + prefix + '_client_request_latency_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
-        legendFormat='{{request_type}}',
-      )
-    )
-  )
-  .addPanel(
-    graphPanel.new(
-      'Error throughputs',
-      description='Total Timeouts, Failures, Unavailable Rates for each cluster',
-      format='rps',
-      datasource='$PROMETHEUS_DS',
-      transparent=true,
-      fill=0,
-      legend_show=true,
-      legend_values=true,
-      legend_current=true,
-      legend_alignAsTable=true,
-      legend_sort='current',
-      legend_sortDesc=true,
-      shared_tooltip=false,
-      min=0,
-    )
-    .addTarget(
-      prometheus.target(
-        expr='sum by (cluster, request_type) (rate(' + prefix + '_client_request_failures_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
-        legendFormat='{{request_type}} failures',
-      )
-    )
-    .addTarget(
-      prometheus.target(
-        expr='sum by (cluster, request_type) (rate(' + prefix + '_client_request_timeouts_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
-        legendFormat='{{request_type}} timeouts',
-      )
-    )
-    .addTarget(
-      prometheus.target(
-        expr='sum by (cluster, request_type) (rate(' + prefix + '_client_request_unavailables_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
-        legendFormat='{{request_type}} unavailable errors',
-      )
-    )
-    .addTarget(
-      prometheus.target(
-        expr='sum by (cluster, request_type) (rate(' + prefix + '_client_request_unfinished_commit_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
-        legendFormat='{{request_type}} unfinished commit errors',
-      )
-    )
-    .addTarget(
-      prometheus.target(
-        expr='sum by (cluster, request_type) (rate(' + prefix + '_client_request_condition_not_met_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
-        legendFormat='{{request_type}} condition not met errors',
-      )
-    )
-    .addTarget(
-      prometheus.target(
-        expr='sum by (cluster, request_type) (rate(' + prefix + '_client_request_contention_histogram_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
-        legendFormat='{{request_type}} contention histogram errors',
-      )
-    )
-  )
-  .addPanel(
-    singleStatPanel.new(
-      'Read / Write Distribution',
-      description='Part of reads in the total of standard requests (Reads+Writes). CAS, Views, ... operations are ignored.',
-      format='percentunit',
-      datasource='$PROMETHEUS_DS',
-      transparent=true,
-      postfix=' Reads',
-      postfixFontSize='30%',
-      valueFontSize='30%',
-      valueName="current",
-      decimals=2,
-      thresholds='0.25,0.5,0.75',
-      timeFrom='',
-      colors=[
-        "#DEB6F2",
-        "#CA95E5",
-        "#8F3BB8"
-      ],
-      gaugeShow=true,
-      gaugeMinValue=0,
-      gaugeMaxValue=1,
-      gaugeThresholdLabels=true,
-      gaugeThresholdMarkers=false,
-      sparklineFillColor='rgba(31, 118, 189, 0.18)',
-      sparklineFull=false,
-      sparklineLineColor='#FFB357',
-      sparklineShow=false
-    )
-    .addTarget(
-      prometheus.target(
-        expr='sum by (cluster, request_type) (rate(' + prefix + '_client_request_latency_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node", request_type="read"}[1m:30s])) / ignoring (request_type) (sum by (cluster, request_type) (rate(' + prefix + '_client_request_latency_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node", request_type="read"}[1m:30s])) + ignoring (request_type) sum by (cluster, request_type) (rate(' + prefix + '_client_request_latency_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node", request_type="write"}[1m:30s])))',
-      )
-    )
-  )
-  .addPanel(
-    graphPanel.new(
-      'Read Latency (98 - 999th percentile)',
-      description='Read latency for coordinated reads',
-      format='µs',
-      datasource='$PROMETHEUS_DS',
-      transparent=true,
-      fill=0,
-      legend_show=true,
-      legend_values=true,
-      legend_current=true,
-      legend_alignAsTable=true,
-      legend_sort='current',
-      legend_sortDesc=true,
-      shared_tooltip=false,
-      min=0,
-    )
-    .addTarget(
-      prometheus.target(
-        expr='histogram_quantile(0.98, sum(rate(' + prefix + '_client_request_latency_bucket{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node", request_type="read"}[5m])) by (le, cluster))',
-        legendFormat='p98',
-      )
-    )
-    .addTarget(
-      prometheus.target(
-        expr='histogram_quantile(0.99, sum(rate(' + prefix + '_client_request_latency_bucket{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node", request_type="read"}[5m])) by (le, cluster))',
-        legendFormat='p99',
-      )
-    )
-    .addTarget(
-      prometheus.target(
-        expr='histogram_quantile(0.999, sum(rate(' + prefix + '_client_request_latency_bucket{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node", request_type="read"}[5m])) by (le, cluster))',
-        legendFormat='p999',
-      )
-    )
-    .addSeriesOverride(fillLatencySeriesOverrides)
-    .addSeriesOverride(removeMinLatencySeriesOverrides)
-  )
-  .addPanel(
-    graphPanel.new(
-      'Write Latency (98th - p999 Percentile)',
-      description='Write latency for coordinated writes',
-      format='µs',
-      datasource='$PROMETHEUS_DS',
-      transparent=true,
-      fill=0,
-      legend_show=true,
-      legend_values=true,
-      legend_current=true,
-      legend_alignAsTable=true,
-      legend_sort='current',
-      legend_sortDesc=true,
-      shared_tooltip=false,
-      min=0,
-    )
-    .addTarget(
-      prometheus.target(
-        expr='histogram_quantile(0.98, sum(rate(' + prefix + '_client_request_latency_bucket{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node", request_type="write"}[5m])) by (le, cluster))',
-        legendFormat='p98',
-      )
-    )
-    .addTarget(
-      prometheus.target(
-        expr='histogram_quantile(0.99, sum(rate(' + prefix + '_client_request_latency_bucket{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node", request_type="write"}[5m])) by (le, cluster))',
-        legendFormat='p99',
-      )
-    )
-    .addTarget(
-      prometheus.target(
-        expr='histogram_quantile(0.999, sum(rate(' + prefix + '_client_request_latency_bucket{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node", request_type="write"}[5m])) by (le, cluster))',
-        legendFormat='p999',
-      )
-    )
-    .addSeriesOverride(fillLatencySeriesOverrides)
-    .addSeriesOverride(removeMinLatencySeriesOverrides)
-  )
-  .addPanel(
-    graphPanel.new(
-      'Other Latencies',
-      description='Other p99 latencies for coordinated requests',
-      format='µs',
-      datasource='$PROMETHEUS_DS',
-      transparent=true,
-      fill=0,
-      legend_show=true,
-      legend_values=true,
-      legend_current=true,
-      legend_alignAsTable=true,
-      legend_sort='current',
-      legend_sortDesc=true,
-      shared_tooltip=false,
-      min=0,
-    )
-    .addTarget(
-      prometheus.target(
-        # In scope!~"Write|Read|.*-.*", we want to exclude charts above and all the per-consistency_level info like "Read-LOCAL_ONE"
-        expr='histogram_quantile(0.99, sum(rate(' + prefix + '_client_request_latency_bucket{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node", request_type!~"write|read|.*-.*"}[1m:30s])) by (le, request_type, cluster))',
-        legendFormat='p99 {{request_type}}'
-      )
-    )
-  )
-)
-.addRow(
-  row.new(title='Nodes Status',)
-  .addPanel(
-    polystatPanel.new(
-      'Nodes Status',
-      description='Nodes Status uses Internal/Gossip activity. Be mindful that if Native or Thrift protocol are disabled, the nodes won\'t be reachable, and still marked up',
-      datasource='$PROMETHEUS_DS',
-      transparent=true,
-      span=12,
-      global_unit_format='none',
-      global_operator_name='current',
-      global_thresholds=[
-        {
-          "value": 0,
-          "state": 2,
-          "color": "#d44a3a"
-        },
-        {
-          "value": 1,
-          "state": 0,
-          "color": "#299c46"
-        }
-      ],
-      range_maps=[
-        {
-          "from": "0",
-          "to": "0.9999",
-          "text": "DOWN"
-        },
-        {
-          "from": "1",
-          "to": "1",
-          "text": "UP"
-        }
-      ],
-      mapping_type=2,
-      value_enabled=true,
-    )
-    .addTarget(
-      prometheus.target(
-        'max by (cluster, dc, rack, instance) (changes(' + prefix + '_thread_pools_completed_tasks{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node", pool_name="gossip_stage"}[2m:30s])) > bool 0',
-        legendFormat='{{instance}}',
-        instant=true,
-      )
-    )
-  )
-  .addPanel(
-    singleStatPanel.new(
-      'Nodes Count',
-      description='Nodes up and down in the cluster',
-      format='short',
-      datasource='$PROMETHEUS_DS',
-      transparent=true,
-      decimals=0,
-      prefix='Total:',
-      postfix=' Nodes',
-      postfixFontSize='80%',
-      valueFontSize='80%',
-      span=4
-    )
-    .addTarget(
-      prometheus.target(
-        expr='count by (cluster) (max by (cluster, dc, rack, instance) (collectd_collectd_queue_length{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}))',
-        legendFormat='Total Number Of Nodes',
-      )
-    )
-  )
-  .addPanel(
-    graphPanel.new(
-      'Nodes Status History',
-      description='Nodes up and down in the cluster per protocol/activity',
-      format='short',
-      datasource='$PROMETHEUS_DS',
-      transparent=true,
-      decimals=0,
-      fill=0,
-      legend_show=true,
-      legend_values=true,
-      legend_current=true,
-      legend_alignAsTable=true,
-      legend_sort='current',
-      legend_sortDesc=false,
-      shared_tooltip=false,
-      min=0,
-      span=8
-    )
-    .addTarget(
-      prometheus.target(
-        expr='count by (cluster) (max by (cluster, dc, rack, instance) (collectd_collectd_queue_length{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}))',
-        legendFormat='Total Number Of Nodes',
-      )
-    )
-    .addTarget(
-      prometheus.target(
-        expr='sum by (cluster) (max by (cluster, datacenter, rack, instance) (changes(' + prefix + '_thread_pools_completed_tasks{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node", pool_name="native"}[2m:30s])) > bool 0)',
-        legendFormat='Nodes Coordinating Requests (Native protocol)',
-      )
-    )
-    .addTarget(
-      prometheus.target(
-        expr='sum by (cluster) (max by (cluster, datacenter, rack, instance) (changes(' + prefix + '_thread_pools_completed_tasks{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node", pool_name="gossip_stage"}[2m:30s])) > bool 0)',
-        legendFormat='Nodes With Internal Activity (Gossip protocol)',
-      )
-    )
-  )
-)
-.addRow(
-  row.new(title='Data Status')
-  .addPanel(
-    tablePanel.new(
-      'Disk Space Usage',
-      description='Disk space used ordered (fullest disks first)',
-      datasource='$PROMETHEUS_DS',
-      transform='timeseries_aggregations',
-      transparent=true,
-      styles=[
-        {
-          "alias": "Node --> Mounting Point",
-          "colorMode": null,
-          "colors": [
-            "rgba(245, 54, 54, 0.9)",
-            "rgba(237, 129, 40, 0.89)",
-            "rgba(50, 172, 45, 0.97)"
-          ],
-          "dateFormat": "YYYY-MM-DD HH:mm:ss",
-          "decimals": 2,
-          "mappingType": 1,
-          "pattern": "Metric",
-          "preserveFormat": true,
-          "sanitize": true,
-          "thresholds": [],
-          "type": "string",
-          "unit": "short"
-        },
-        {
-          "alias": "% Disk Space Used",
-          "colorMode": "row",
-          "colors": [
-            "rgba(50, 172, 45, 0.97)",
-            "rgba(237, 129, 40, 0.89)",
-            "rgba(245, 54, 54, 0.9)"
-          ],
-          "dateFormat": "YYYY-MM-DD HH:mm:ss",
-          "decimals": 2,
-          "link": false,
-          "mappingType": 1,
-          "pattern": "Current",
-          "thresholds": [
-            "0.5",
-            "0.75",
-          ],
-          "type": "number",
-          "unit": "percentunit"
-        }
-      ],
-      columns=[
-        {
-          "text": "Current",
-          "value": "current"
-        }
-      ],
-      sort={
-        "col": 1,
-        "desc": true
-      }
-    )
-    .addTarget(
-      prometheus.target(
-        expr='min by (instance, df) (1-(collectd_df_df_complex{df!~".*lxcfs.*", cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node", type="free"}
-        / ignoring (type) (collectd_df_df_complex{df!~".*lxcfs.*", cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node", type="used"}
-          + ignoring (type) collectd_df_df_complex{df!~".*lxcfs.*", cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node", type="reserved"}
-          + ignoring (type) collectd_df_df_complex{df!~".*lxcfs.*", cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node", type="free"}))
-        )',
-        legendFormat='{{cluster}}-{{instance}} --> {{df}}',
-        instant=true
-      )
-    )
-  )
-  .addPanel(
-    graphPanel.new(
-      'Cassandra cluster Data Size',
-      description='Total sizes of the data on distinct nodes',
-      format='bytes',
-      datasource='$PROMETHEUS_DS',
-      transparent=true,
-      fill=0,
-      legend_show=true,
-      legend_values=true,
-      legend_current=true,
-      legend_alignAsTable=true,
-      legend_sort='current',
-      legend_sortDesc=true,
-      shared_tooltip=false,
-    )
-    .addTarget(
-      prometheus.target(
-        expr='sum by (cluster) (' + prefix + '_table_live_disk_space_used_total{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
-        legendFormat='Live space - {{cluster}}',
-      )
-    )
-    .addTarget(
-      prometheus.target(
-        expr='sum by (cluster) (' + prefix + '_table_total_disk_space_used_total{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
-        legendFormat='Total space - {{cluster}}',
-      )
-    )
-  )
-  .addPanel(
-    graphPanel.new(
-      'SSTable Count',
-      description='SSTable Count Max and Average per table',
-      format='short',
-      datasource='$PROMETHEUS_DS',
-      transparent=true,
-      fill=0,
-      legend_show=true,
-      legend_values=true,
-      legend_current=true,
-      legend_alignAsTable=true,
-      legend_sort='current',
-      legend_sortDesc=true,
-      shared_tooltip=false,
-      min=0,
-    )
-    .addTarget(
-      prometheus.target(
-        expr='max by (cluster, keyspace, table) (' + prefix + '_table_live_ss_table_count{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
-        legendFormat='Table - {{keyspace}}.{{table}}',
-      )
-    )
-    .addTarget(
-      prometheus.target(
-        expr='max by (cluster) (' + prefix + '_table_live_ss_table_count{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
-        legendFormat='Max in cluster - {{cluster}}',
-      )
-    )
-  )
-  .addPanel(
-    graphPanel.new(
-      'Pending Compactions',
-      description='Maximum pending compactions on any node in the cluster',
-      format='short',
-      datasource='$PROMETHEUS_DS',
-      transparent=true,
-      fill=0,
-      legend_show=true,
-      legend_values=true,
-      legend_current=true,
-      legend_alignAsTable=true,
-      legend_sort='current',
-      legend_sortDesc=true,
-      shared_tooltip=false,
-      min=0,
-      bars=false,
-      lines=true,
-      stack=false,
-      decimals=0,
-    )
-    .addTarget(
-      prometheus.target(
-        expr='max by (cluster) (' + prefix + '_table_pending_compactions{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
-        legendFormat='max',
-      )
-    )
-    .addTarget(
-      prometheus.target(
-        expr='min by (cluster) (' + prefix + '_table_pending_compactions{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
-        legendFormat='min',
-      )
-    )
-    .addTarget(
-      prometheus.target(
-        expr='avg by (cluster) (' + prefix + '_table_pending_compactions{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
-        legendFormat='avg',
-      )
-    )
-    .addSeriesOverride(fillMinMaxSeriesOverrides)
-    .addSeriesOverride(removeMinlineSeriesOverrides)
-  )
-  .addPanel(
-    graphPanel.new(
-      'Pending Compactions per Table',
-      description='Maximum pending compactions per table',
-      format='short',
-      datasource='$PROMETHEUS_DS',
-      transparent=true,
-      fill=0,
-      legend_show=true,
-      legend_values=true,
-      legend_current=true,
-      legend_alignAsTable=true,
-      legend_sort='current',
-      legend_sortDesc=true,
-      shared_tooltip=false,
-      min=0,
-      bars=false,
-      lines=true,
-      stack=true,
-      decimals=0,
-    )
-    .addTarget(
-      prometheus.target(
-        expr='max by (cluster, keyspace, table) (' + prefix + '_table_pending_compactions{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
-        legendFormat='max for {{keyspace}}.{{table}}',
-      )
-    )
-  )
-)
-.addRow(
-  row.new(title='Cassandra Internals')
-  .addPanel(
-    graphPanel.new(
-      'Pending Tasks',
-      description='Cluster wide pending threads, by thread pool name',
-      format='short',
-      datasource='$PROMETHEUS_DS',
-      transparent=true,
-      fill=0,
-      legend_show=true,
-      legend_values=true,
-      legend_current=true,
-      legend_alignAsTable=true,
-      legend_sort='current',
-      legend_sortDesc=true,
-      shared_tooltip=false,
-      min=0,
-    )
-    .addTarget(
-      prometheus.target(
-        expr='sum by (cluster, pool_name) (' + prefix + '_thread_pools_pending_tasks{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
-        legendFormat='{{cluster}} - pending {{pool_name}}',
-      )
-    )
-  )
-  .addPanel(
-    graphPanel.new(
-      'Blocked Tasks',
-      description='Cluster wide blocked threads, by thread pool name',
-      format='short',
-      datasource='$PROMETHEUS_DS',
-      transparent=true,
-      fill=0,
-      legend_show=true,
-      legend_values=true,
-      legend_current=true,
-      legend_alignAsTable=true,
-      legend_sort='current',
-      legend_sortDesc=true,
-      shared_tooltip=false,
-      min=0,
-    )
-    .addTarget(
-      prometheus.target(
-        expr='sum by (cluster, pool_name) (rate(' + prefix + '_thread_pools_total_blocked_tasks_total{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
-        legendFormat='{{cluster}} - blocked {{pool_name}}',
-      )
-    )
-  )
- .addPanel(
-    graphPanel.new(
-      'Dropped Messages',
-      description='Dropped messages rate summed by message type and cluster',
-      format='short',
-      datasource='$PROMETHEUS_DS',
-      transparent=true,
-      fill=0,
-      legend_show=true,
-      legend_values=true,
-      legend_current=true,
-      legend_alignAsTable=true,
-      legend_sort='current',
-      legend_sortDesc=true,
-      shared_tooltip=false,
-      min=0,
-    )
-    .addTarget(
-      prometheus.target(
-        expr='sum by (cluster, message_type) (rate(' + prefix + '_dropped_message_dropped_total{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
-        legendFormat='{{cluster}} - dropped {{message_type}}',
-      )
-    )
-  )
-  .addPanel(
-     graphPanel.new(
-       'Active Tasks',
-       description='active threads summed per cluster',
-       format='short',
-       datasource='$PROMETHEUS_DS',
-       transparent=true,
-       fill=0,
-       legend_show=true,
-       legend_values=true,
-       legend_current=true,
-       legend_alignAsTable=true,
-       legend_sort='current',
-       legend_sortDesc=true,
-       shared_tooltip=false,
-       min=0,
-     )
-     .addTarget(
-       prometheus.target(
-         expr='sum by (cluster, pool_name) (' + prefix + '_thread_pools_active_tasks{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
-         legendFormat='{{cluster}} - active {{pool_name}}',
-       )
-     )
-   )
-  .addPanel(
-     graphPanel.new(
-       'Hinted Handoff',
-       description='Sum of hints being handed off per cluster.',
-       format='short',
-       datasource='$PROMETHEUS_DS',
-       transparent=true,
-       fill=0,
-       legend_show=true,
-       legend_values=true,
-       legend_current=true,
-       legend_alignAsTable=true,
-       legend_sort='current',
-       legend_sortDesc=true,
-       shared_tooltip=false,
-       min=0,
-     )
-     .addTarget(
-       prometheus.target(
-         expr='sum by (cluster) (' + prefix + '_storage_total_hints_in_progress_total{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
-         legendFormat='count',
-       )
-     )
-   )
-)
-.addRow(
-  row.new(title='Hardware / Operating System')
- .addPanel(
-    graphPanel.new(
-      'CPU Utilization',
-      description='Maximum CPU utilisation (max 100%)',
-      format='percentunit',
-      datasource='$PROMETHEUS_DS',
-      transparent=true,
-      fill=0,
-      legend_show=true,
-      legend_values=true,
-      legend_current=true,
-      legend_alignAsTable=true,
-      legend_sort='current',
-      legend_sortDesc=true,
-      shared_tooltip=false,
-      percentage=true,
-      decimals=1,
-      min=0,
-      max=1,
-    )
-    .addTarget(
-      prometheus.target(
-        expr='max by (cluster) (1 - (sum by (cluster, dc, rack, instance) (rate(collectd_cpu_total{type="idle", cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s])) / sum by (cluster, dc, rack, instance) (rate(collectd_cpu_total{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))))',
-        legendFormat='max',
-      )
-    )
-    .addTarget(
-      prometheus.target(
-        expr='min by (cluster) (1 - (sum by (cluster, dc, rack, instance) (rate(collectd_cpu_total{type="idle", cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s])) / sum by (cluster, dc, rack, instance) (rate(collectd_cpu_total{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))))',
-        legendFormat='min',
-      )
-    )
-    .addTarget(
-      prometheus.target(
-        expr='avg by (cluster) (1 - (sum by (cluster, dc, rack, instance) (rate(collectd_cpu_total{type="idle", cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s])) / sum by (cluster, dc, rack, instance) (rate(collectd_cpu_total{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))))',
-        legendFormat='avg',
-      )
-    )
-    .addSeriesOverride(fillMinMaxSeriesOverrides)
-    .addSeriesOverride(removeMinlineSeriesOverrides)
-  )
-  .addPanel(
-    graphPanel.new(
-      'Unix Load (1m rate)',
-      description='Max Unix load on a node for a cluster',
-      format='short',
-      datasource='$PROMETHEUS_DS',
-      transparent=true,
-      fill=0,
-      legend_show=true,
-      legend_values=true,
-      legend_current=true,
-      legend_alignAsTable=true,
-      legend_sort='current',
-      legend_sortDesc=true,
-      shared_tooltip=false,
-    )
-    .addTarget(
-      prometheus.target(
-        expr='max by (cluster) (collectd_load_shortterm{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
-        legendFormat='max',
-      )
-    )
-    .addTarget(
-      prometheus.target(
-        'min by (cluster) (collectd_load_shortterm{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
-        legendFormat='min',
-      )
-    )
-    .addTarget(
-      prometheus.target(
-        'avg by (cluster) (collectd_load_shortterm{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
-        legendFormat='avg',
-      )
-    )
-    .addSeriesOverride(fillMinMaxSeriesOverrides)
-    .addSeriesOverride(removeMinlineSeriesOverrides)
-  )
-  .addPanel(
-    graphPanel.new(
-      'Memory Utilisation',
-      description='Maximum Memory allocated per usage (worst node) - excludes caches, buffers, etc',
-      format='bytes',
-      datasource='$PROMETHEUS_DS',
-      transparent=true,
-      legend_show=true,
-      legend_values=true,
-      legend_current=true,
-      legend_alignAsTable=true,
-      legend_sort='current',
-      legend_sortDesc=true,
-      shared_tooltip=false,
-      fill=1,
-      linewidth=2,
-    )
-    .addTarget(
-      prometheus.target(
-        expr='min by (cluster) (sum by (cluster, dc, rack, instance) (collectd_memory{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}))',
-        legendFormat='min memory available',
-      )
-    )
-    .addTarget(
-      prometheus.target(
-        expr='max by (cluster, memory) (sum by (cluster, dc, rack, instance, memory) (collectd_memory{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}))',
-        legendFormat='max memory {{memory}}',
-      )
-    )
-  )
-  .addPanel(
-    graphPanel.new(
-      'Disk Read Thoughput',
-      description='Disk read throughput',
-      format='bps',
-      datasource='$PROMETHEUS_DS',
-      transparent=true,
-      fill=0,
-      legend_show=true,
-      legend_values=true,
-      legend_current=true,
-      legend_alignAsTable=true,
-      legend_sort='current',
-      legend_sortDesc=true,
-      shared_tooltip=false,
-    )
-    .addTarget(
-      prometheus.target(
-        expr='max by (cluster) (rate(collectd_processes_disk_octets_read_total{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
-        legendFormat='max',
-      )
-    )
-    .addTarget(
-      prometheus.target(
-        'min by (cluster) (rate(collectd_processes_disk_octets_read_total{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
-        legendFormat='min',
-      )
-    )
-    .addTarget(
-      prometheus.target(
-        'avg by (cluster) (rate(collectd_processes_disk_octets_read_total{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
-        legendFormat='avg',
-      )
-    )
-    .addSeriesOverride(fillMinMaxSeriesOverrides)
-    .addSeriesOverride(removeMinlineSeriesOverrides)
-  )
-  .addPanel(
-    graphPanel.new(
-      'Disk Write Thoughput',
-      description='Disk write throughput',
-      format='bps',
-      datasource='$PROMETHEUS_DS',
-      transparent=true,
-      fill=0,
-      legend_show=true,
-      legend_values=true,
-      legend_current=true,
-      legend_alignAsTable=true,
-      legend_sort='current',
-      legend_sortDesc=true,
-      shared_tooltip=false,
-    )
-    .addTarget(
-      prometheus.target(
-        expr='max by (cluster) (rate(collectd_processes_disk_octets_write_total{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
-        legendFormat='max',
-      )
-    )
-    .addTarget(
-      prometheus.target(
-        'min by (cluster) (rate(collectd_processes_disk_octets_write_total{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
-        legendFormat='min',
-      )
-    )
-    .addTarget(
-      prometheus.target(
-        'avg by (cluster) (rate(collectd_processes_disk_octets_write_total{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
-        legendFormat='avg',
-      )
-    )
-    .addSeriesOverride(fillMinMaxSeriesOverrides)
-    .addSeriesOverride(removeMinlineSeriesOverrides)
-  )
-  .addPanel(
-    graphPanel.new(
-      'Network I/O',
-      description='Network In and Out per cluster',
-      format='bytes',
-      datasource='$PROMETHEUS_DS',
-      transparent=true,
-      fill=1,
-      legend_show=true,
-      legend_values=true,
-      legend_current=true,
-      legend_alignAsTable=true,
-      legend_sort='current',
-      legend_sortDesc=true,
-      shared_tooltip=false,
-      bars=false,
-    )
-    .addTarget(
-      prometheus.target(
-        'sum by (cluster) (rate(collectd_interface_if_octets_rx_total{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
-        legendFormat='outgoing',
-      )
-    )
-    .addTarget(
-      prometheus.target(
-        'sum by (cluster) (rate(collectd_interface_if_octets_rx_total{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
-        legendFormat='incoming',
-      )
-    )
-    .addSeriesOverride({
-          "alias": "incoming",
-          "transform": "negative-Y"
-    })
-
-  )
-)
-.addRow(
-  row.new(title='JVM / Garbage Collection')
-  .addPanel(
-    graphPanel.new(
-      'Application Throughput (% time NOT doing GC)',
-      description='Percentage of the time the node is *not* doing a GC, thus Cassandra is not stopped for GC',
-      format='percentunit',
-      datasource='$PROMETHEUS_DS',
-      transparent=true,
-      fill=0,
-      legend_show=true,
-      legend_values=true,
-      legend_current=true,
-      legend_alignAsTable=true,
-      legend_sort='current',
-      legend_sortDesc=true,
-      shared_tooltip=false,
-      decimals=2,
-      min=0,
-      max=1,
-    )
-    .addTarget(
-      prometheus.target(
-        'max by (cluster) (1 - (sum by (cluster, dc, rack, instance) (rate(' + prefix + '_jvm_gc_time{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s])) / 1000))',
-        legendFormat='max',
-      )
-    )
-    .addTarget(
-      prometheus.target(
-        'min by (cluster) (1 - (sum by (cluster, dc, rack, instance) (rate(' + prefix + '_jvm_gc_time{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s])) / 1000))',
-        legendFormat='min',
-      )
-    )
-    .addTarget(
-      prometheus.target(
-        'avg by (cluster) (1 - (sum by (cluster, dc, rack, instance) (rate(' + prefix + '_jvm_gc_time{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s])) / 1000))',
-        legendFormat='avg',
-      )
-    )
-    .addSeriesOverride(fillMinMaxSeriesOverrides)
-    .addSeriesOverride(removeMinlineSeriesOverrides)
-  )
-  .addPanel(
-    graphPanel.new(
-      'Garbage Collection Time',
-      description='Garbage collection duration',
-      format='ms',
-      datasource='$PROMETHEUS_DS',
-      transparent=true,
-      fill=0,
-      legend_show=true,
-      legend_values=true,
-      legend_current=true,
-      legend_alignAsTable=true,
-      legend_sort='current',
-      legend_sortDesc=true,
-      shared_tooltip=false,
-    )
-    .addTarget(
-      prometheus.target(
-        'max by (cluster) (rate(' + prefix + '_jvm_gc_time{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
-        legendFormat='max',
-      )
-    )
-    .addTarget(
-      prometheus.target(
-        'min by (cluster) (rate(' + prefix + '_jvm_gc_time{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
-        legendFormat='min',
-      )
-    )
-    .addTarget(
-      prometheus.target(
-        'avg by (cluster) (rate(' + prefix + '_jvm_gc_time{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
-        legendFormat='avg',
-      )
-    )
-    .addSeriesOverride(fillMinMaxSeriesOverrides)
-    .addSeriesOverride(removeMinlineSeriesOverrides)
-  )
-  .addPanel(
-    graphPanel.new(
-      'JVM Heap Memory Utilisation',
-      description='Maximum JVM Heap Memory size (worst node) and minimum available heap size',
-      format='bytes',
-      datasource='$PROMETHEUS_DS',
-      transparent=true,
-      legend_show=true,
-      legend_values=true,
-      legend_current=true,
-      legend_alignAsTable=true,
-      legend_sort='current',
-      legend_sortDesc=true,
-      shared_tooltip=false,
-      fill=1,
-      linewidth=2,
-    )
-    .addTarget(
-      prometheus.target(
-        'max by (cluster)
-        (' + prefix + '_jvm_memory_used{memory_type="heap", cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
-        legendFormat='max',
-      )
-    )
-    .addTarget(
-      prometheus.target(
-        'min by (cluster)
-        (' + prefix + '_jvm_memory_used{memory_type="heap", cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
-        legendFormat='min',
-      )
-    )
-    .addTarget(
-      prometheus.target(
-        'avg by (cluster)
-        (' + prefix + '_jvm_memory_used{memory_type="heap", cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
-        legendFormat='avg',
-      )
-    )
-    .addTarget(
-      prometheus.target(
-        'min by ( cluster)
-        (' + prefix + '_jvm_memory_max{memory_type="heap", cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
-        legendFormat='Heap memory available',
-      )
-    )
-    .addSeriesOverride(fillMinMaxSeriesOverrides)
-    .addSeriesOverride(removeMinlineSeriesOverrides)
-  )
-)
diff --git a/dashboards/grafana/dashboards-jsonnet/system-metrics.jsonnet b/dashboards/grafana/dashboards-jsonnet/system-metrics.jsonnet
deleted file mode 100644
index e9482ae..0000000
--- a/dashboards/grafana/dashboards-jsonnet/system-metrics.jsonnet
+++ /dev/null
@@ -1,902 +0,0 @@
-local grafana = import 'grafonnet/grafana.libsonnet';
-
-local dashboard = grafana.dashboard;
-local row = grafana.row;
-local singlestat = grafana.singlestat;
-local graphpanel = grafana.graphPanel;
-local text = grafana.text;
-local prometheus = grafana.prometheus;
-local template = grafana.template;
-
-local prefix = std.extVar('prefix');
-
-local textstatHeight = 100;
-local graphHeight = 250;
-local singlestatHeight = 125;
-local singlestatSpan = 2;
-local graphSpan = 6;
-
-dashboard.new(
-  'System & Node Metrics',
-  description='Operating System Metrics and Apache Cassandra Node Information',
-  schemaVersion=14,
-  time_from='now-30m',
-  refresh='1m',
-  tags=['os'],
-  style='dark'
-)
-.addTemplate(
-  template.datasource(
-    'PROMETHEUS_DS',
-    'prometheus',
-    'Prometheus',
-    hide='all',
-  )
-)
-.addTemplate(
-  template.interval(
-    'rate',
-    '1m,5m,10m,30m,1h,6h,12h,1d,7d,14d,30d',
-    '5m',
-    label='Rate',
-  )
-)
-.addTemplate(
-  template.new(
-    'host',
-    '$PROMETHEUS_DS',
-    'label_values(collectd_collectd_queue_length{}, instance)',
-    label='Host',
-    refresh='time',
-  )
-)
-.addPanel(
-  text.new(
-      transparent=true,
-      mode="html",
-      content=' '
-  ),
-  {
-    "h": 3,
-    "w": 5,
-    "x": 9,
-    "y": -1
-  },
-)
-.addRow(
-  row.new(
-    title='Basic CPU / Mem / Disk Gauge',
-    height=singlestatHeight,
-  )
-  .addPanel(
-    singlestat.new(
-      'CPU Busy',
-      description="Busy state of all CPU cores together",
-      format='percent',
-      datasource='$PROMETHEUS_DS',
-      thresholds='85,95',
-      sparklineShow=true,
-      gaugeShow=true,
-      span=singlestatSpan
-    )
-    .addTarget(
-      prometheus.target(
-        "(1 - ((sum(irate(collectd_cpu_total{instance='$host', type='idle'}[$rate])) by (instance) / sum(irate(collectd_cpu_total{instance='$host'}[$rate])) by (instance)))) * 100",
-      )
-    )
-  )
-  .addPanel(
-    singlestat.new(
-      'Memory Used',
-      description="Percentage of memory used (ignoring page cache)",
-      format='percent',
-      datasource='$PROMETHEUS_DS',
-      thresholds='85,95',
-      sparklineShow=true,
-      gaugeShow=true,
-      span=singlestatSpan
-    )
-    .addTarget(
-      prometheus.target(
-          '100 * ((sum(collectd_memory{instance="$host", memory="free"}) + sum(collectd_memory{instance="$host", memory="cached"}) + sum(collectd_memory{instance="$host", memory="buffered"})) / sum(collectd_memory{instance="$host"}))',
-      )
-    )
-  )
-  .addPanel(
-    singlestat.new(
-      'Swap Used',
-      description="Percentage of swap in use",
-      format='percent',
-      datasource='$PROMETHEUS_DS',
-      thresholds='0,1',
-      sparklineShow=true,
-      gaugeShow=true,
-      span=singlestatSpan
-    )
-    .addTarget(
-      prometheus.target(
-          "(sum(collectd_swap{instance='$host',swap='used'}) / sum(collectd_swap{instance='$host'})) * 100"
-      )
-    )
-  )
-  .addPanel(
-    singlestat.new(
-      'Disk Used',
-      description="Percentage of root disk in use",
-      format='percent',
-      datasource='$PROMETHEUS_DS',
-      thresholds='50,85',
-      sparklineShow=true,
-      gaugeShow=true,
-      span=singlestatSpan
-    )
-    .addTarget(
-      prometheus.target(
-        '(sum(collectd_df_df_complex{instance="$host", df="root", type="used"}) / sum(collectd_df_df_complex{instance="$host", df="root"})) * 100'
-      )
-    )
-  )
-  .addPanel(
-    singlestat.new(
-      'CPU System Load (1m avg)',
-      description="Busy state of all CPU cores together (1 min average)",
-      format='percent',
-      datasource='$PROMETHEUS_DS',
-      thresholds='85,95',
-      sparklineShow=true,
-      gaugeShow=true,
-      span=singlestatSpan
-    )
-    .addTarget(
-      prometheus.target(
-        'avg(collectd_load_shortterm{instance="$host"}) / count(count(collectd_cpu_total{instance="$host"}) by (cpu)) * 100',
-      )
-    )
-  )
-  .addPanel(
-    singlestat.new(
-      'CPU System Load (5m avg)',
-      description="Busy state of all CPU cores together (5 min average)",
-      format='percent',
-      datasource='$PROMETHEUS_DS',
-      thresholds='85,95',
-      sparklineShow=true,
-      gaugeShow=true,
-      span=singlestatSpan
-    )
-    .addTarget(
-      prometheus.target(
-        'avg(collectd_load_midterm{instance="$host"}) / count(count(collectd_cpu_total{instance="$host"}) by (cpu)) * 100',
-      )
-    )
-  )
-)
-.addRow(
-  row.new(
-    title='Basic CPU / Mem / Disk Info',
-    height=textstatHeight
-  )
-  .addPanel(
-    singlestat.new(
-      'CPU Cores',
-      description="Total number of CPU cores",
-      format="short",
-      datasource='$PROMETHEUS_DS',
-      span=singlestatSpan
-    )
-    .addTarget(
-      prometheus.target(
-          'count(count(collectd_cpu_total{instance="$host"}) by (cpu))'
-      )
-    )
-  )
-  .addPanel(
-    singlestat.new(
-      'Total RAM',
-      description="Total amount of system memory",
-      format="bytes",
-      datasource='$PROMETHEUS_DS',
-      span=singlestatSpan
-    )
-    .addTarget(
-      prometheus.target(
-          'sum(collectd_memory{instance="$host"})'
-      )
-    )
-  )
-  .addPanel(
-    singlestat.new(
-      'Total Swap',
-      description="Total amount of swap space",
-      format="bytes",
-      datasource='$PROMETHEUS_DS',
-      span=singlestatSpan
-    )
-    .addTarget(
-      prometheus.target(
-          'sum(collectd_swap{instance="$host"})'
-      )
-    )
-  )
-  .addPanel(
-    singlestat.new(
-      'Total RootFS',
-      description="Total amount of disk space",
-      format='bytes',
-      datasource='$PROMETHEUS_DS',
-      span=singlestatSpan
-    )
-    .addTarget(
-      prometheus.target(
-          'sum(collectd_df_df_complex{df="root",instance="$host"})'
-      )
-    )
-  )
-  .addPanel(
-    singlestat.new(
-      'System Load (1m avg)',
-      description="System Load (1m avg)",
-      format="short",
-      datasource='$PROMETHEUS_DS',
-      span=singlestatSpan
-    )
-    .addTarget(
-      prometheus.target(
-          'collectd_load_shortterm{instance="$host"}'
-      )
-    )
-  )
-  .addPanel(
-    singlestat.new(
-      'System Uptime',
-      description="Uptime of the host",
-      format="s",
-      decimals=1,
-      datasource='$PROMETHEUS_DS',
-      span=singlestatSpan
-    )
-    .addTarget(
-      prometheus.target(
-          'collectd_uptime{instance="$host"}'
-      )
-    )
-  )
-)
-.addRow(
-  row.new(
-    title='Basic CPU / Mem Graph',
-    height=graphHeight
-  )
-  .addPanel(
-    graphpanel.new(
-      title="CPU Basic",
-      datasource='$PROMETHEUS_DS',
-      span=graphSpan,
-      percentage=true,
-      stack=true,
-      min=0,
-      max=100
-    )
-    .addTarget(
-      prometheus.target(
-          expr="sum(irate(collectd_cpu_total{instance='$host',type='system'}[$rate])) / sum(irate(collectd_cpu_total{instance='$host'}[$rate])) * 100",
-          legendFormat="Busy System"
-      )
-    )
-    .addTarget(
-      prometheus.target(
-          expr="sum(irate(collectd_cpu_total{instance='$host',type='user'}[$rate])) / sum(irate(collectd_cpu_total{instance='$host'}[$rate])) * 100",
-          legendFormat="Busy User"
-      )
-    )
-    .addTarget(
-      prometheus.target(
-          expr="sum(irate(collectd_cpu_total{instance='$host',type='wait'}[$rate])) / sum(irate(collectd_cpu_total{instance='$host'}[$rate])) * 100",
-          legendFormat="Busy IOWait"
-      )
-    )
-    .addTarget(
-      prometheus.target(
-          expr="sum(irate(collectd_cpu_total{instance='$host',type='softirq'}[$rate])) / sum(irate(collectd_cpu_total{instance='$host'}[$rate])) * 100",
-          legendFormat="Busy IRQ"
-      )
-    )
-    .addTarget(
-      prometheus.target(
-          expr="sum(irate(collectd_cpu_total{instance='$host',type!='idle',type!='system',type!='user',type!='wait',type!='softirq'}[$rate])) / sum(irate(collectd_cpu_total{instance='$host'}[$rate])) * 100",
-          legendFormat="Busy Other"
-      )
-    )
-    .addTarget(
-      prometheus.target(
-          expr="sum(irate(collectd_cpu_total{instance='$host',type='idle'}[$rate])) / sum(irate(collectd_cpu_total{instance='$host'}[$rate])) * 100",
-          legendFormat="Idle"
-      )
-    )
-  )
-   .addPanel(
-    graphpanel.new(
-      title="Basic memory usage",
-      datasource='$PROMETHEUS_DS',
-      span=graphSpan,
-      format="bytes",
-      min=0
-    )
-    .addTarget(
-      prometheus.target(
-          expr='sum(collectd_memory{instance="$host"})',
-          legendFormat="RAM Total"
-      )
-    )
-    .addTarget(
-      prometheus.target(
-          expr='sum(collectd_memory{instance="$host"}) - sum(collectd_memory{instance="$host", memory="free"}) - sum(collectd_memory{instance="$host", memory="cached"}) - sum(collectd_memory{instance="$host", memory="buffered"})',
-          legendFormat="RAM Used"
-      )
-    )
-    .addTarget(
-      prometheus.target(
-          expr='sum(collectd_memory{instance="$host", memory="cached"}) + sum(collectd_memory{instance="$host", memory="buffered"})',
-          legendFormat="RAM Cache + Buffer"
-      )
-    )
-    .addTarget(
-      prometheus.target(
-          expr='sum(collectd_memory{instance="$host", memory="free"})',
-          legendFormat="RAM Free"
-      )
-    )
-    .addTarget(
-      prometheus.target(
-          expr='sum(collectd_swap{instance="$host"}) - sum(collectd_swap{instance="$host", swap="free"})',
-          legendFormat="SWAP Used"
-      )
-    )
-  )
-)
-.addRow(
-  row.new(
-    title='Basic Network / Disk Graph',
-    height=graphHeight
-  )
-  .addPanel(
-    graphpanel.new(
-      title="Network Traffic / Second",
-      description="Basic network info per interface",
-      datasource='$PROMETHEUS_DS',
-      span=graphSpan,
-      format="bps",
-      labelY1="Receive (-) /  Send (+)",
-
-    )
-    .addSeriesOverride({
-          "alias": "/.*receive.*/",
-          "transform": "negative-Y"
-        })
-    .addTarget(
-      prometheus.target(
-          expr="irate(collectd_interface_if_octets_rx_total{instance='$host'}[$rate]) * 8",
-          legendFormat="{{interface}} receive"
-      )
-    )
-    .addTarget(
-      prometheus.target(
-          expr="irate(collectd_interface_if_octets_tx_total{instance='$host'}[$rate]) * 8",
-          legendFormat="{{interface}} send"
-      )
-    )
-  )
-  .addPanel(
-    graphpanel.new(
-      title="Network Packets / Second",
-      description="Basic network info per interface",
-      datasource='$PROMETHEUS_DS',
-      span=graphSpan,
-      format="pps",
-      labelY1="Receive (-) /  Send (+)",
-
-    )
-    .addSeriesOverride({
-          "alias": "/.*receive.*/",
-          "transform": "negative-Y"
-        })
-    .addTarget(
-      prometheus.target(
-          expr="irate(collectd_interface_if_packets_rx_total{instance='$host'}[$rate]) * 8",
-          legendFormat="{{interface}} receive"
-      )
-    )
-    .addTarget(
-      prometheus.target(
-          expr="irate(collectd_interface_if_packets_tx_total{instance='$host'}[$rate]) * 8",
-          legendFormat="{{interface}} send"
-      )
-    )
-  )
-  .addPanel(
-    graphpanel.new(
-      title="Disk Activity / Second",
-      description="Disk Activity / Second",
-      datasource='$PROMETHEUS_DS',
-      span=graphSpan,
-      format="Bps",
-      labelY1="Read (-) /  Write (+)",
-      legend_hideZero=true,
-      legend_hideEmpty=true
-    )
-    .addSeriesOverride({
-          "alias": "/.*Read.*/",
-          "transform": "negative-Y"
-        })
-    .addTarget(
-      prometheus.target(
-          expr='irate(collectd_disk_disk_octets_read_total{instance="$host", disk=~".*\\\\d+"}[$rate])',
-          legendFormat="{{disk}} - Read"
-      )
-    )
-    .addTarget(
-      prometheus.target(
-          expr='irate(collectd_disk_disk_octets_write_total{instance="$host", disk=~".*\\\\d+"}[$rate])',
-          legendFormat="{{disk}} - Write"
-      )
-    )
-  )
-  .addPanel(
-    graphpanel.new(
-      title="Disk IOPS",
-      description="Disk iops per disk",
-      datasource='$PROMETHEUS_DS',
-      span=graphSpan,
-      format="iops",
-      labelY1="Read (-) /  Write (+)",
-      legend_hideZero=true,
-      legend_hideEmpty=true
-    )
-    .addSeriesOverride({
-          "alias": "/.*Read.*/",
-          "transform": "negative-Y"
-        })
-    .addTarget(
-      prometheus.target(
-          expr='irate(collectd_disk_disk_ops_read_total{instance="$host", disk=~".*\\\\d+"}[$rate])',
-          legendFormat="{{disk}} - Read"
-      )
-    )
-    .addTarget(
-      prometheus.target(
-          expr='irate(collectd_disk_disk_ops_write_total{instance="$host", disk=~".*\\\\d+"}[$rate])',
-          legendFormat="{{disk}} - Write"
-      )
-    )
-  )
-  .addPanel(
-    graphpanel.new(
-      title="Disk Used",
-      description="Disk space used",
-      datasource='$PROMETHEUS_DS',
-      span=graphSpan,
-      format="decbytes",
-      legend_hideZero=true,
-      legend_hideEmpty=true
-    )
-    .addTarget(
-      prometheus.target(
-          expr='sum(collectd_df_df_complex{instance="$host", type="used"}) by (df)',
-          legendFormat="{{df}}"
-      )
-    )
-  )
-  .addPanel(
-    graphpanel.new(
-      title="Disk Queue Length",
-      description="The amount of requests pending in the disk queue",
-      datasource='$PROMETHEUS_DS',
-      span=graphSpan,
-      format="short",
-      legend_hideZero=true,
-      legend_hideEmpty=true
-    )
-    .addTarget(
-      prometheus.target(
-          expr='irate(collectd_disk_disk_io_time_weighted_io_time_total{instance="$host",disk=~".*[0-9]+"}[$rate]) / 1000',
-          legendFormat="{{disk}}"
-      )
-    )
-  )
-  .addPanel(
-    graphpanel.new(
-      title="Disk Latency",
-      description="Disk access times",
-      datasource='$PROMETHEUS_DS',
-      span=graphSpan,
-      format="ms",
-      labelY1="Read (-) /  Write (+)",
-      legend_hideZero=true,
-      legend_hideEmpty=true
-    )
-    .addSeriesOverride({
-          "alias": "/.*Read.*/",
-          "transform": "negative-Y"
-        })
-    .addTarget(
-      prometheus.target(
-          expr='irate(collectd_disk_disk_time_read_total{instance="$host",disk=~".*[0-9]+"}[$rate])',
-          legendFormat="{{disk}} - Read"
-      )
-    )
-    .addTarget(
-      prometheus.target(
-          expr='irate(collectd_disk_disk_time_write_total{instance="$host",disk=~".*[0-9]+"}[$rate])',
-          legendFormat="{{disk}} - Write"
-      )
-    )
-  )
-)
-.addRow(
-  row.new(
-    title='CPU Details',
-    height=graphHeight,
-    collapse=true
-  )
-  .addPanel(
-    graphpanel.new(
-      title="CPU User",
-      datasource='$PROMETHEUS_DS',
-      span=graphSpan,
-      format="percent",
-      min=0,
-      max=100
-    )
-    .addTarget(
-      prometheus.target(
-          expr='sum(rate(collectd_cpu_total{instance="$host", type="user"}[$rate])) by (cpu) / sum(rate(collectd_cpu_total{instance="$host"}[$rate])) by (cpu) * 100',
-          legendFormat="{{cpu}}"
-      )
-    )
-  )
-   .addPanel(
-    graphpanel.new(
-      title="CPU System",
-      datasource='$PROMETHEUS_DS',
-      span=graphSpan,
-      format="percent",
-      min=0,
-      max=100
-    )
-    .addTarget(
-      prometheus.target(
-          expr='sum(rate(collectd_cpu_total{instance="$host", type="system"}[$rate])) by (cpu) / sum(rate(collectd_cpu_total{instance="$host"}[$rate])) by (cpu) * 100',
-          legendFormat="{{cpu}}"
-      )
-    )
-  )
-   .addPanel(
-    graphpanel.new(
-      title="CPU IOWait",
-      datasource='$PROMETHEUS_DS',
-      span=graphSpan,
-      format="percent",
-      min=0,
-      max=100
-    )
-    .addTarget(
-      prometheus.target(
-          expr='sum(rate(collectd_cpu_total{instance="$host", type="wait"}[$rate])) by (cpu) / sum(rate(collectd_cpu_total{instance="$host"}[$rate])) by (cpu) * 100',
-          legendFormat="{{cpu}}"
-      )
-    )
-  )
-   .addPanel(
-    graphpanel.new(
-      title="CPU SoftIRQ",
-      datasource='$PROMETHEUS_DS',
-      span=graphSpan,
-      format="percent",
-      min=0,
-      max=100
-    )
-    .addTarget(
-      prometheus.target(
-          expr='sum(rate(collectd_cpu_total{instance="$host", type="softirq"}[$rate])) by (cpu) / sum(rate(collectd_cpu_total{instance="$host"}[$rate])) by (cpu) * 100',
-          legendFormat="{{cpu}}"
-      )
-    )
-  )
-   .addPanel(
-    graphpanel.new(
-      title="CPU Other",
-      datasource='$PROMETHEUS_DS',
-      span=graphSpan,
-      format="percent",
-      min=0,
-      max=100
-    )
-    .addTarget(
-      prometheus.target(
-          expr='sum(rate(collectd_cpu_total{instance="$host", type=~"(interrupt|nice|steal)"}[$rate])) by (cpu, type)  / ignoring(type) group_left sum(rate(collectd_cpu_total{instance="$host" }[$rate])) by (cpu) * 100',
-          legendFormat="{{cpu}} - {{type}}"
-      )
-    )
-  )
-)
-.addRow(
-  row.new(
-    title='Advanced Details',
-    height=graphHeight,
-    collapse=true
-  )
-  .addPanel(
-    graphpanel.new(
-      title="Context Switches / Second",
-      datasource='$PROMETHEUS_DS',
-      span=graphSpan,
-      format="short"
-    )
-    .addTarget(
-      prometheus.target(
-          expr='irate(collectd_contextswitch_total{instance="$host"}[$rate])',
-          legendFormat="Context Switches"
-      )
-    )
-  )
-   .addPanel(
-    graphpanel.new(
-      title="IRQ Activity",
-      datasource='$PROMETHEUS_DS',
-      span=graphSpan,
-      format="short",
-      legend_hideEmpty=true,
-      legend_hideZero=true
-    )
-    .addTarget(
-      prometheus.target(
-          expr='rate(collectd_irq_total{instance="$host", irq != "LOC"}[$rate])',
-          legendFormat="{{irq}}"
-      )
-    )
-  )
-   .addPanel(
-    graphpanel.new(
-      title="NUMA Activity",
-      datasource='$PROMETHEUS_DS',
-      span=graphSpan,
-      format="short",
-      legend_hideEmpty=true,
-      legend_hideZero=true
-    )
-    .addTarget(
-      prometheus.target(
-          expr='irate(collectd_numa_vmpage_action_total{instance="$host"}[$rate])',
-          legendFormat="{{numa}} - {{type}}"
-      )
-    )
-  )
-  .addPanel(
-    graphpanel.new(
-      title="TCP Connection Activity",
-      datasource='$PROMETHEUS_DS',
-      span=graphSpan,
-      format="short",
-      legend_hideEmpty=true,
-      legend_hideZero=true
-    )
-    .addTarget(
-      prometheus.target(
-          expr='collectd_tcpconns_tcp_connections{instance="$host"}',
-          legendFormat="{{tcpconns}} - {{type}}"
-      )
-    )
-  )
-  .addPanel(
-    graphpanel.new(
-      title="TCP Connection Activity",
-      datasource='$PROMETHEUS_DS',
-      span=graphSpan,
-      format="short",
-      legend_hideEmpty=true,
-      legend_hideZero=true
-    )
-    .addTarget(
-      prometheus.target(
-          expr='rate(collectd_protocols_protocol_counter_total{instance="$host"}[$rate])',
-          legendFormat="{{protocols}} - {{type}}"
-      )
-    )
-  )
-  .addPanel(
-    graphpanel.new(
-      title="Processor Speeds",
-      datasource='$PROMETHEUS_DS',
-      span=graphSpan,
-      format="hertz",
-      points=true,
-      lines=false,
-      pointradius=5,
-      legend_hideEmpty=true,
-      legend_hideZero=true
-    )
-    .addTarget(
-      prometheus.target(
-          expr='collectd_cpufreq{instance="$host"}',
-          legendFormat="{{cpufreq}}"
-      )
-    )
-  )
-  .addPanel(
-    graphpanel.new(
-      title="Page Cache Activity",
-      datasource='$PROMETHEUS_DS',
-      span=graphSpan,
-      format="short",
-      legend_hideEmpty=true,
-      legend_hideZero=true
-    )
-    .addTarget(
-      prometheus.target(
-          expr='rate(collectd_vmem_vmpage_faults_majflt_total{instance="$host"}[$rate])',
-          legendFormat="Major fault"
-      )
-    )
-    .addTarget(
-      prometheus.target(
-          expr='rate(collectd_vmem_vmpage_faults_minflt_total{instance="$host"}[$rate])',
-          legendFormat="Minor fault"
-      )
-    )
-    .addTarget(
-      prometheus.target(
-          expr='rate(collectd_vmem_vmpage_action_total{instance="$host"}[$rate])',
-          legendFormat="Action - {{vmem}}"
-      )
-    )
-    .addTarget(
-      prometheus.target(
-          expr='rate(collectd_vmem_vmpage_io_in_total{instance="$host"}[$rate])',
-          legendFormat="IO read page"
-      )
-    )
-    .addTarget(
-      prometheus.target(
-          expr='rate(collectd_vmem_vmpage_io_out_total{instance="$host"}[$rate])',
-          legendFormat="IO write page"
-      )
-    )
-  )
-  .addPanel(
-    graphpanel.new(
-      title="Page Cache Layout",
-      datasource='$PROMETHEUS_DS',
-      span=graphSpan,
-      format="short",
-      percentage=true,
-      stack=true,
-      min=0,
-      max=100,
-      legend_hideEmpty=true,
-      legend_hideZero=true
-    )
-    .addTarget(
-      prometheus.target(
-          expr='collectd_vmem_vmpage_number{instance="$host"}',
-          legendFormat="{{vmem}}"
-      )
-    )
-  )
-  .addPanel(
-    graphpanel.new(
-      title="Process Activity",
-      datasource='$PROMETHEUS_DS',
-      span=graphSpan,
-      format="short",
-      legend_hideEmpty=true,
-      legend_hideZero=true
-    )
-    .addTarget(
-      prometheus.target(
-          expr='collectd_processes_ps_count_threads{instance="$host"}',
-          legendFormat="Thread Count"
-      )
-    )
-    .addTarget(
-      prometheus.target(
-          expr='collectd_processes_ps_count_processes{instance="$host"}',
-          legendFormat="Process Count"
-      )
-    )
-    .addTarget(
-      prometheus.target(
-          expr='collectd_processes_ps_state{instance="$host"}',
-          legendFormat="Process State - {{processes}}"
-      )
-    )
-  )
-)
-.addRow(
-  row.new(
-    title='Basic Cassandra Overview',
-    height=singlestatHeight
-  )
-  .addPanel(
-    singlestat.new(
-      'SSTable Count',
-      description="Number of sstables on the node",
-      format='short',
-      datasource='$PROMETHEUS_DS',
-      sparklineShow=true,
-      gaugeShow=true,
-      span=singlestatSpan,
-      thresholds="100000,500000"
-    )
-    .addTarget(
-      prometheus.target(
-        "sum(" + prefix + "_table_live_ss_table_count{instance='$host'})"
-      )
-    )
-  )
-  .addPanel(
-    singlestat.new(
-      'Pending Compactions',
-      description="Number of pending compactions on the node",
-      format='short',
-      datasource='$PROMETHEUS_DS',
-      sparklineShow=true,
-      gaugeShow=true,
-      span=singlestatSpan,
-      thresholds="10,50"
-    )
-    .addTarget(
-      prometheus.target(
-        "sum(" + prefix + "_compaction_pending_tasks{instance='$host'})"
-      )
-    )
-  )
-  .addPanel(
-    singlestat.new(
-      'Connected Clients',
-      description="Number of client connections to the node",
-      format='percent',
-      datasource='$PROMETHEUS_DS',
-      sparklineShow=true,
-      gaugeShow=true,
-      span=singlestatSpan,
-      thresholds="100,1000"
-    )
-    .addTarget(
-      prometheus.target(
-        "sum(" + prefix + "_client_connected_native_clients{instance='$host'})"
-      )
-    )
-  )
-  .addPanel(
-    graphpanel.new(
-      title="GC Activity",
-      datasource='$PROMETHEUS_DS',
-      span=graphSpan,
-      format="bytes",
-      legend_hideEmpty=true,
-      legend_hideZero=true
-    )
-    .addTarget(
-      prometheus.target(
-          expr='sum(' + prefix + '_jvm_memory_max{instance="$host", memory_type="total"})',
-          legendFormat="JVM Heap Total"
-      )
-    )
-    .addSeriesOverride({
-          "alias": "/.*Total.*/",
-          "fill": 0
-    })
-    .addTarget(
-      prometheus.target(
-          expr='sum(' + prefix + '_jvm_memory_used{instance="$host", memory_type="non_heap"})',
-          legendFormat="JVM Non-Heap Used"
-      )
-    )
-    .addTarget(
-      prometheus.target(
-          expr='sum(' + prefix + '_jvm_memory_used{instance="$host", memory_type="heap"})',
-          legendFormat="JVM Heap Used"
-      )
-    )
-  )
-)
\ No newline at end of file
diff --git a/dashboards/grafana/make-dashboards.sh b/dashboards/grafana/make-dashboards.sh
deleted file mode 100755
index 7e80adf..0000000
--- a/dashboards/grafana/make-dashboards.sh
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/bash
-
-DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
-
-cd $DIR
-for file in dashboards-jsonnet/*; do
-  name=$(basename $file);
-  echo "Generating ${name%.jsonnet}.json"
-  docker run -v `pwd`:/here datastax/grafonnet-lib:v0.1.3 jsonnet --ext-str prefix=mcac /here/$file > `pwd`/generated-dashboards/${name%.jsonnet}.json;
-done
diff --git a/make_package.sh b/make_package.sh
index 2394077..3073c31 100755
--- a/make_package.sh
+++ b/make_package.sh
@@ -41,10 +41,7 @@ cd $PACKAGE_DIR
 tar zcvf $PROJECT_DIR_NAME.tar.gz $PROJECT_DIR_NAME
 zip $PROJECT_DIR_NAME.zip $(tar ztf $PROJECT_DIR_NAME.tar.gz)
 popd
-pushd .
-cd dashboards/grafana
-./make-dashboards.sh
-popd
+mixin/make-dashboards.sh
 
 DASHBOARD_DIR_NAME=datastax-mcac-dashboards-$VERSION
 mkdir -p $PACKAGE_DIR/$DASHBOARD_DIR_NAME/grafana
diff --git a/mixin/README.md b/mixin/README.md
new file mode 100644
index 0000000..b2db7fb
--- /dev/null
+++ b/mixin/README.md
@@ -0,0 +1,14 @@
+# MCAC Mixin
+
+The MCAC Mixin is a set of configurable, reusable, and extensible alerts and dashboards for Apache Cassandra. 
+
+## Requirements
+
+- [Jsonnet](https://github.com/google/go-jsonnet)
+- [jsonnet-bundler](https://github.com/jsonnet-bundler/jsonnet-bundler) (`jb`)
+
+## Install as library
+
+```shell
+jb install github.com/datastax/metric-collector-for-apache-cassandra/mixin@master
+```
diff --git a/mixin/config.libsonnet b/mixin/config.libsonnet
new file mode 100644
index 0000000..cd9503e
--- /dev/null
+++ b/mixin/config.libsonnet
@@ -0,0 +1,5 @@
+{
+  _config+:: {
+    metricPrefix: 'mcac',
+  },
+}
diff --git a/mixin/dashboards.jsonnet b/mixin/dashboards.jsonnet
new file mode 100644
index 0000000..0d31ce1
--- /dev/null
+++ b/mixin/dashboards.jsonnet
@@ -0,0 +1,6 @@
+local dashboards = (import './mixin.libsonnet').grafanaDashboards;
+
+{
+  [name]: dashboards[name]
+  for name in std.objectFields(dashboards)
+}
diff --git a/mixin/dashboards/cassandra-condensed.libsonnet b/mixin/dashboards/cassandra-condensed.libsonnet
new file mode 100644
index 0000000..452d699
--- /dev/null
+++ b/mixin/dashboards/cassandra-condensed.libsonnet
@@ -0,0 +1,529 @@
+local grafana = import 'github.com/grafana/grafonnet-lib/grafonnet/grafana.libsonnet';
+
+local dashboard = grafana.dashboard;
+local row = grafana.row;
+local singlestat = grafana.singlestat;
+local graphpanel = grafana.graphPanel;
+local text = grafana.text;
+local prometheus = grafana.prometheus;
+local template = grafana.template;
+
+local graphHeight = 300;
+local singlestatHeight = 100;
+local singlestatSpan = 1;
+local graphSpan = 4;
+
+{
+  _config+:: {
+    metricPrefix: error 'must provide metric prefix',
+  },
+  grafanaDashboards+:: {
+    'cassandra-condensed.json':
+      dashboard.new(
+        'Cassandra Cluster Condensed',
+        description='Single pane of glass for most important Cassandra metrics',
+        schemaVersion=14,
+        refresh='30s',
+        time_from='now-30m',
+        editable=true,
+        tags=['os'],
+        style='dark'
+      )
+      .addTemplate(
+        template.datasource(
+          'PROMETHEUS_DS',
+          'prometheus',
+          'Prometheus',
+          hide='all',
+        )
+      )
+
+      .addTemplate(
+        template.custom(
+          'by',
+          'cluster,dc,rack,instance',
+          'cluster',
+          valuelabels={
+            cluster: 'Cluster',
+            dc: 'Datacenter',
+            rack: 'Rack',
+            instance: 'Host',
+          },
+          label='Group By',
+        )
+      )
+      .addTemplate(
+        template.interval(
+          'rate',
+          '1m,5m,10m,30m,1h,6h,12h,1d,7d,14d,30d',
+          '5m',
+          label='Rate',
+        )
+      )
+      .addTemplate(
+        template.new(
+          'cluster',
+          '$PROMETHEUS_DS',
+          'label_values(collectd_collectd_queue_length{}, cluster)',
+          label='Cluster',
+          refresh='time',
+          includeAll=true,
+          allValues='.*',
+        )
+      )
+      .addTemplate(
+        template.new(
+          'dc',
+          '$PROMETHEUS_DS',
+          'label_values(collectd_collectd_queue_length{cluster=~"$cluster"}, dc)',
+          label='DataCenter',
+          refresh='time',
+          includeAll=true,
+          allValues='.*',
+        )
+      )
+      .addTemplate(
+        template.new(
+          'rack',
+          '$PROMETHEUS_DS',
+          'label_values(collectd_collectd_queue_length{cluster=~"$cluster", dc=~"$dc"}, rack)',
+          label='Rack',
+          refresh='time',
+          includeAll=true,
+          allValues='.*',
+        )
+      )
+      .addTemplate(
+        template.new(
+          'keyspace',
+          '$PROMETHEUS_DS',
+          'label_values(' + $._config.metricPrefix + '_table_read_latency_total{cluster=~"$cluster", dc=~"$dc"}, keyspace)',
+          label='Keyspace',
+          refresh='time',
+          includeAll=true,
+          allValues='.*',
+        )
+      )
+      .addTemplate(
+        template.new(
+          'table',
+          '$PROMETHEUS_DS',
+          'label_values(' + $._config.metricPrefix + '_table_read_latency_total{cluster=~"$cluster", dc=~"$dc", keyspace=~"$keyspace"}, table)',
+          label='Table',
+          refresh='time',
+          includeAll=true,
+          allValues='.*',
+        )
+      )
+      .addTemplate(
+        template.new(
+          'host',
+          '$PROMETHEUS_DS',
+          'label_values(collectd_collectd_queue_length{cluster=~"$cluster", dc=~"$dc", rack=~"$rack"}, instance)',
+          label='Host',
+          refresh='time',
+          includeAll=true,
+          allValues='.*',
+        )
+      )
+      .addTemplate(
+        template.custom(
+          'latency',
+          '0.999,0.99,0.98,0.95,0.90,0.75,0.50',
+          '0.95',
+          valuelabels={
+            '0.999': 'P999',
+            '0.99': 'P99',
+            '0.98': 'P98',
+            '0.95': 'P95',
+            '0.90': 'P90',
+            '0.75': 'P75',
+            '0.50': 'P50',
+          },
+          label='Percentile'
+        )
+      )
+      .addRow(
+        row.new(
+          title='Cluster Overview',
+          height=singlestatHeight,
+        )
+        .addPanel(
+          singlestat.new(
+            'Nodes Up',
+            description='Nodes that are currently running in this time window',
+            format='none',
+            decimals=0,
+            datasource='$PROMETHEUS_DS',
+            colorValue=true,
+            colors=['#d44a3a', '#299c46', '#299c46'],
+            thresholds='0.1,1000',
+            span=singlestatSpan
+          )
+          .addTarget(
+            prometheus.target(
+              'count(' + $._config.metricPrefix + '_compaction_completed_tasks{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$host"} >= 0) or vector(0)'
+            )
+          )
+        )
+        .addPanel(
+          singlestat.new(
+            'Nodes Down',
+            description='Nodes that are currently not running in this time window',
+            format='none',
+            decimals=0,
+            colorValue=true,
+            colors=['#299c46', 'rgba(237, 129, 40, 0.89)', '#d44a3a'],
+            datasource='$PROMETHEUS_DS',
+            thresholds='1,2',
+            span=singlestatSpan
+          )
+          .addTarget(
+            prometheus.target(
+              'count(absent(sum(rate(' + $._config.metricPrefix + '_compaction_completed_tasks{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$host"}[5m])))) OR vector(0)'
+            )
+          )
+        )
+        .addPanel(
+          singlestat.new(
+            'Compactions / $rate',
+            description='Rate of compactions during this window',
+            format='none',
+            decimals=0,
+            datasource='$PROMETHEUS_DS',
+            sparklineShow=true,
+            span=singlestatSpan
+          )
+          .addTarget(
+            prometheus.target(
+              'sum(rate(' + $._config.metricPrefix + '_compaction_completed_tasks{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$host"}[$rate]))'
+            )
+          )
+        )
+        .addPanel(
+          singlestat.new(
+            'CQL Requests / $rate',
+            description='Rate of CQL requests during this window',
+            format='none',
+            datasource='$PROMETHEUS_DS',
+            sparklineShow=true,
+            decimals=0,
+            span=singlestatSpan
+          )
+          .addTarget(
+            prometheus.target(
+              'sum(irate(dse_client_request_latency_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$host"}[$rate]))'
+            )
+          )
+        )
+        .addPanel(
+          singlestat.new(
+            'Dropped Messages / $rate',
+            description='Rate of Dropped requests during this window',
+            format='none',
+            datasource='$PROMETHEUS_DS',
+            sparklineShow=true,
+            thresholds='30,300',
+            colorValue=true,
+            decimals=0,
+            span=singlestatSpan
+          )
+          .addTarget(
+            prometheus.target(
+              'sum(irate(' + $._config.metricPrefix + '_table_dropped_mutations_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$host"}[$rate]))'
+            )
+          )
+        )
+        .addPanel(
+          text.new(
+            transparent=true,
+            mode='html',
+            content='
'
-  ),
-  {
-    "h": 3,
-    "w": 5,
-    "x": 9,
-    "y": -1
-  },
-)
-.addRow(
-  row.new(
-    title='Basic CPU / Mem / Disk Gauge',
-    height=singlestatHeight,
-  )
-  .addPanel(
-    singlestat.new(
-      'CPU Busy',
-      description="Busy state of all CPU cores together",
-      format='percent',
-      datasource='$PROMETHEUS_DS',
-      thresholds='85,95',
-      sparklineShow=true,
-      gaugeShow=true,
-      span=singlestatSpan
-    )
-    .addTarget(
-      prometheus.target(
-        "(1 - ((sum(irate(collectd_cpu_total{instance='$host', type='idle'}[$rate])) by (instance) / sum(irate(collectd_cpu_total{instance='$host'}[$rate])) by (instance)))) * 100",
-      )
-    )
-  )
-  .addPanel(
-    singlestat.new(
-      'Memory Used',
-      description="Percentage of memory used (ignoring page cache)",
-      format='percent',
-      datasource='$PROMETHEUS_DS',
-      thresholds='85,95',
-      sparklineShow=true,
-      gaugeShow=true,
-      span=singlestatSpan
-    )
-    .addTarget(
-      prometheus.target(
-          '100 * ((sum(collectd_memory{instance="$host", memory="free"}) + sum(collectd_memory{instance="$host", memory="cached"}) + sum(collectd_memory{instance="$host", memory="buffered"})) / sum(collectd_memory{instance="$host"}))',
-      )
-    )
-  )
-  .addPanel(
-    singlestat.new(
-      'Swap Used',
-      description="Percentage of swap in use",
-      format='percent',
-      datasource='$PROMETHEUS_DS',
-      thresholds='0,1',
-      sparklineShow=true,
-      gaugeShow=true,
-      span=singlestatSpan
-    )
-    .addTarget(
-      prometheus.target(
-          "(sum(collectd_swap{instance='$host',swap='used'}) / sum(collectd_swap{instance='$host'})) * 100"
-      )
-    )
-  )
-  .addPanel(
-    singlestat.new(
-      'Disk Used',
-      description="Percentage of root disk in use",
-      format='percent',
-      datasource='$PROMETHEUS_DS',
-      thresholds='50,85',
-      sparklineShow=true,
-      gaugeShow=true,
-      span=singlestatSpan
-    )
-    .addTarget(
-      prometheus.target(
-        '(sum(collectd_df_df_complex{instance="$host", df="root", type="used"}) / sum(collectd_df_df_complex{instance="$host", df="root"})) * 100'
-      )
-    )
-  )
-  .addPanel(
-    singlestat.new(
-      'CPU System Load (1m avg)',
-      description="Busy state of all CPU cores together (1 min average)",
-      format='percent',
-      datasource='$PROMETHEUS_DS',
-      thresholds='85,95',
-      sparklineShow=true,
-      gaugeShow=true,
-      span=singlestatSpan
-    )
-    .addTarget(
-      prometheus.target(
-        'avg(collectd_load_shortterm{instance="$host"}) / count(count(collectd_cpu_total{instance="$host"}) by (cpu)) * 100',
-      )
-    )
-  )
-  .addPanel(
-    singlestat.new(
-      'CPU System Load (5m avg)',
-      description="Busy state of all CPU cores together (5 min average)",
-      format='percent',
-      datasource='$PROMETHEUS_DS',
-      thresholds='85,95',
-      sparklineShow=true,
-      gaugeShow=true,
-      span=singlestatSpan
-    )
-    .addTarget(
-      prometheus.target(
-        'avg(collectd_load_midterm{instance="$host"}) / count(count(collectd_cpu_total{instance="$host"}) by (cpu)) * 100',
-      )
-    )
-  )
-)
-.addRow(
-  row.new(
-    title='Basic CPU / Mem / Disk Info',
-    height=textstatHeight
-  )
-  .addPanel(
-    singlestat.new(
-      'CPU Cores',
-      description="Total number of CPU cores",
-      format="short",
-      datasource='$PROMETHEUS_DS',
-      span=singlestatSpan
-    )
-    .addTarget(
-      prometheus.target(
-          'count(count(collectd_cpu_total{instance="$host"}) by (cpu))'
-      )
-    )
-  )
-  .addPanel(
-    singlestat.new(
-      'Total RAM',
-      description="Total amount of system memory",
-      format="bytes",
-      datasource='$PROMETHEUS_DS',
-      span=singlestatSpan
-    )
-    .addTarget(
-      prometheus.target(
-          'sum(collectd_memory{instance="$host"})'
-      )
-    )
-  )
-  .addPanel(
-    singlestat.new(
-      'Total Swap',
-      description="Total amount of swap space",
-      format="bytes",
-      datasource='$PROMETHEUS_DS',
-      span=singlestatSpan
-    )
-    .addTarget(
-      prometheus.target(
-          'sum(collectd_swap{instance="$host"})'
-      )
-    )
-  )
-  .addPanel(
-    singlestat.new(
-      'Total RootFS',
-      description="Total amount of disk space",
-      format='bytes',
-      datasource='$PROMETHEUS_DS',
-      span=singlestatSpan
-    )
-    .addTarget(
-      prometheus.target(
-          'sum(collectd_df_df_complex{df="root",instance="$host"})'
-      )
-    )
-  )
-  .addPanel(
-    singlestat.new(
-      'System Load (1m avg)',
-      description="System Load (1m avg)",
-      format="short",
-      datasource='$PROMETHEUS_DS',
-      span=singlestatSpan
-    )
-    .addTarget(
-      prometheus.target(
-          'collectd_load_shortterm{instance="$host"}'
-      )
-    )
-  )
-  .addPanel(
-    singlestat.new(
-      'System Uptime',
-      description="Uptime of the host",
-      format="s",
-      decimals=1,
-      datasource='$PROMETHEUS_DS',
-      span=singlestatSpan
-    )
-    .addTarget(
-      prometheus.target(
-          'collectd_uptime{instance="$host"}'
-      )
-    )
-  )
-)
-.addRow(
-  row.new(
-    title='Basic CPU / Mem Graph',
-    height=graphHeight
-  )
-  .addPanel(
-    graphpanel.new(
-      title="CPU Basic",
-      datasource='$PROMETHEUS_DS',
-      span=graphSpan,
-      percentage=true,
-      stack=true,
-      min=0,
-      max=100
-    )
-    .addTarget(
-      prometheus.target(
-          expr="sum(irate(collectd_cpu_total{instance='$host',type='system'}[$rate])) / sum(irate(collectd_cpu_total{instance='$host'}[$rate])) * 100",
-          legendFormat="Busy System"
-      )
-    )
-    .addTarget(
-      prometheus.target(
-          expr="sum(irate(collectd_cpu_total{instance='$host',type='user'}[$rate])) / sum(irate(collectd_cpu_total{instance='$host'}[$rate])) * 100",
-          legendFormat="Busy User"
-      )
-    )
-    .addTarget(
-      prometheus.target(
-          expr="sum(irate(collectd_cpu_total{instance='$host',type='wait'}[$rate])) / sum(irate(collectd_cpu_total{instance='$host'}[$rate])) * 100",
-          legendFormat="Busy IOWait"
-      )
-    )
-    .addTarget(
-      prometheus.target(
-          expr="sum(irate(collectd_cpu_total{instance='$host',type='softirq'}[$rate])) / sum(irate(collectd_cpu_total{instance='$host'}[$rate])) * 100",
-          legendFormat="Busy IRQ"
-      )
-    )
-    .addTarget(
-      prometheus.target(
-          expr="sum(irate(collectd_cpu_total{instance='$host',type!='idle',type!='system',type!='user',type!='wait',type!='softirq'}[$rate])) / sum(irate(collectd_cpu_total{instance='$host'}[$rate])) * 100",
-          legendFormat="Busy Other"
-      )
-    )
-    .addTarget(
-      prometheus.target(
-          expr="sum(irate(collectd_cpu_total{instance='$host',type='idle'}[$rate])) / sum(irate(collectd_cpu_total{instance='$host'}[$rate])) * 100",
-          legendFormat="Idle"
-      )
-    )
-  )
-   .addPanel(
-    graphpanel.new(
-      title="Basic memory usage",
-      datasource='$PROMETHEUS_DS',
-      span=graphSpan,
-      format="bytes",
-      min=0
-    )
-    .addTarget(
-      prometheus.target(
-          expr='sum(collectd_memory{instance="$host"})',
-          legendFormat="RAM Total"
-      )
-    )
-    .addTarget(
-      prometheus.target(
-          expr='sum(collectd_memory{instance="$host"}) - sum(collectd_memory{instance="$host", memory="free"}) - sum(collectd_memory{instance="$host", memory="cached"}) - sum(collectd_memory{instance="$host", memory="buffered"})',
-          legendFormat="RAM Used"
-      )
-    )
-    .addTarget(
-      prometheus.target(
-          expr='sum(collectd_memory{instance="$host", memory="cached"}) + sum(collectd_memory{instance="$host", memory="buffered"})',
-          legendFormat="RAM Cache + Buffer"
-      )
-    )
-    .addTarget(
-      prometheus.target(
-          expr='sum(collectd_memory{instance="$host", memory="free"})',
-          legendFormat="RAM Free"
-      )
-    )
-    .addTarget(
-      prometheus.target(
-          expr='sum(collectd_swap{instance="$host"}) - sum(collectd_swap{instance="$host", swap="free"})',
-          legendFormat="SWAP Used"
-      )
-    )
-  )
-)
-.addRow(
-  row.new(
-    title='Basic Network / Disk Graph',
-    height=graphHeight
-  )
-  .addPanel(
-    graphpanel.new(
-      title="Network Traffic / Second",
-      description="Basic network info per interface",
-      datasource='$PROMETHEUS_DS',
-      span=graphSpan,
-      format="bps",
-      labelY1="Receive (-) /  Send (+)",
-
-    )
-    .addSeriesOverride({
-          "alias": "/.*receive.*/",
-          "transform": "negative-Y"
-        })
-    .addTarget(
-      prometheus.target(
-          expr="irate(collectd_interface_if_octets_rx_total{instance='$host'}[$rate]) * 8",
-          legendFormat="{{interface}} receive"
-      )
-    )
-    .addTarget(
-      prometheus.target(
-          expr="irate(collectd_interface_if_octets_tx_total{instance='$host'}[$rate]) * 8",
-          legendFormat="{{interface}} send"
-      )
-    )
-  )
-  .addPanel(
-    graphpanel.new(
-      title="Network Packets / Second",
-      description="Basic network info per interface",
-      datasource='$PROMETHEUS_DS',
-      span=graphSpan,
-      format="pps",
-      labelY1="Receive (-) /  Send (+)",
-
-    )
-    .addSeriesOverride({
-          "alias": "/.*receive.*/",
-          "transform": "negative-Y"
-        })
-    .addTarget(
-      prometheus.target(
-          expr="irate(collectd_interface_if_packets_rx_total{instance='$host'}[$rate]) * 8",
-          legendFormat="{{interface}} receive"
-      )
-    )
-    .addTarget(
-      prometheus.target(
-          expr="irate(collectd_interface_if_packets_tx_total{instance='$host'}[$rate]) * 8",
-          legendFormat="{{interface}} send"
-      )
-    )
-  )
-  .addPanel(
-    graphpanel.new(
-      title="Disk Activity / Second",
-      description="Disk Activity / Second",
-      datasource='$PROMETHEUS_DS',
-      span=graphSpan,
-      format="Bps",
-      labelY1="Read (-) /  Write (+)",
-      legend_hideZero=true,
-      legend_hideEmpty=true
-    )
-    .addSeriesOverride({
-          "alias": "/.*Read.*/",
-          "transform": "negative-Y"
-        })
-    .addTarget(
-      prometheus.target(
-          expr='irate(collectd_disk_disk_octets_read_total{instance="$host", disk=~".*\\\\d+"}[$rate])',
-          legendFormat="{{disk}} - Read"
-      )
-    )
-    .addTarget(
-      prometheus.target(
-          expr='irate(collectd_disk_disk_octets_write_total{instance="$host", disk=~".*\\\\d+"}[$rate])',
-          legendFormat="{{disk}} - Write"
-      )
-    )
-  )
-  .addPanel(
-    graphpanel.new(
-      title="Disk IOPS",
-      description="Disk iops per disk",
-      datasource='$PROMETHEUS_DS',
-      span=graphSpan,
-      format="iops",
-      labelY1="Read (-) /  Write (+)",
-      legend_hideZero=true,
-      legend_hideEmpty=true
-    )
-    .addSeriesOverride({
-          "alias": "/.*Read.*/",
-          "transform": "negative-Y"
-        })
-    .addTarget(
-      prometheus.target(
-          expr='irate(collectd_disk_disk_ops_read_total{instance="$host", disk=~".*\\\\d+"}[$rate])',
-          legendFormat="{{disk}} - Read"
-      )
-    )
-    .addTarget(
-      prometheus.target(
-          expr='irate(collectd_disk_disk_ops_write_total{instance="$host", disk=~".*\\\\d+"}[$rate])',
-          legendFormat="{{disk}} - Write"
-      )
-    )
-  )
-  .addPanel(
-    graphpanel.new(
-      title="Disk Used",
-      description="Disk space used",
-      datasource='$PROMETHEUS_DS',
-      span=graphSpan,
-      format="decbytes",
-      legend_hideZero=true,
-      legend_hideEmpty=true
-    )
-    .addTarget(
-      prometheus.target(
-          expr='sum(collectd_df_df_complex{instance="$host", type="used"}) by (df)',
-          legendFormat="{{df}}"
-      )
-    )
-  )
-  .addPanel(
-    graphpanel.new(
-      title="Disk Queue Length",
-      description="The amount of requests pending in the disk queue",
-      datasource='$PROMETHEUS_DS',
-      span=graphSpan,
-      format="short",
-      legend_hideZero=true,
-      legend_hideEmpty=true
-    )
-    .addTarget(
-      prometheus.target(
-          expr='irate(collectd_disk_disk_io_time_weighted_io_time_total{instance="$host",disk=~".*[0-9]+"}[$rate]) / 1000',
-          legendFormat="{{disk}}"
-      )
-    )
-  )
-  .addPanel(
-    graphpanel.new(
-      title="Disk Latency",
-      description="Disk access times",
-      datasource='$PROMETHEUS_DS',
-      span=graphSpan,
-      format="ms",
-      labelY1="Read (-) /  Write (+)",
-      legend_hideZero=true,
-      legend_hideEmpty=true
-    )
-    .addSeriesOverride({
-          "alias": "/.*Read.*/",
-          "transform": "negative-Y"
-        })
-    .addTarget(
-      prometheus.target(
-          expr='irate(collectd_disk_disk_time_read_total{instance="$host",disk=~".*[0-9]+"}[$rate])',
-          legendFormat="{{disk}} - Read"
-      )
-    )
-    .addTarget(
-      prometheus.target(
-          expr='irate(collectd_disk_disk_time_write_total{instance="$host",disk=~".*[0-9]+"}[$rate])',
-          legendFormat="{{disk}} - Write"
-      )
-    )
-  )
-)
-.addRow(
-  row.new(
-    title='CPU Details',
-    height=graphHeight,
-    collapse=true
-  )
-  .addPanel(
-    graphpanel.new(
-      title="CPU User",
-      datasource='$PROMETHEUS_DS',
-      span=graphSpan,
-      format="percent",
-      min=0,
-      max=100
-    )
-    .addTarget(
-      prometheus.target(
-          expr='sum(rate(collectd_cpu_total{instance="$host", type="user"}[$rate])) by (cpu) / sum(rate(collectd_cpu_total{instance="$host"}[$rate])) by (cpu) * 100',
-          legendFormat="{{cpu}}"
-      )
-    )
-  )
-   .addPanel(
-    graphpanel.new(
-      title="CPU System",
-      datasource='$PROMETHEUS_DS',
-      span=graphSpan,
-      format="percent",
-      min=0,
-      max=100
-    )
-    .addTarget(
-      prometheus.target(
-          expr='sum(rate(collectd_cpu_total{instance="$host", type="system"}[$rate])) by (cpu) / sum(rate(collectd_cpu_total{instance="$host"}[$rate])) by (cpu) * 100',
-          legendFormat="{{cpu}}"
-      )
-    )
-  )
-   .addPanel(
-    graphpanel.new(
-      title="CPU IOWait",
-      datasource='$PROMETHEUS_DS',
-      span=graphSpan,
-      format="percent",
-      min=0,
-      max=100
-    )
-    .addTarget(
-      prometheus.target(
-          expr='sum(rate(collectd_cpu_total{instance="$host", type="wait"}[$rate])) by (cpu) / sum(rate(collectd_cpu_total{instance="$host"}[$rate])) by (cpu) * 100',
-          legendFormat="{{cpu}}"
-      )
-    )
-  )
-   .addPanel(
-    graphpanel.new(
-      title="CPU SoftIRQ",
-      datasource='$PROMETHEUS_DS',
-      span=graphSpan,
-      format="percent",
-      min=0,
-      max=100
-    )
-    .addTarget(
-      prometheus.target(
-          expr='sum(rate(collectd_cpu_total{instance="$host", type="softirq"}[$rate])) by (cpu) / sum(rate(collectd_cpu_total{instance="$host"}[$rate])) by (cpu) * 100',
-          legendFormat="{{cpu}}"
-      )
-    )
-  )
-   .addPanel(
-    graphpanel.new(
-      title="CPU Other",
-      datasource='$PROMETHEUS_DS',
-      span=graphSpan,
-      format="percent",
-      min=0,
-      max=100
-    )
-    .addTarget(
-      prometheus.target(
-          expr='sum(rate(collectd_cpu_total{instance="$host", type=~"(interrupt|nice|steal)"}[$rate])) by (cpu, type)  / ignoring(type) group_left sum(rate(collectd_cpu_total{instance="$host" }[$rate])) by (cpu) * 100',
-          legendFormat="{{cpu}} - {{type}}"
-      )
-    )
-  )
-)
-.addRow(
-  row.new(
-    title='Advanced Details',
-    height=graphHeight,
-    collapse=true
-  )
-  .addPanel(
-    graphpanel.new(
-      title="Context Switches / Second",
-      datasource='$PROMETHEUS_DS',
-      span=graphSpan,
-      format="short"
-    )
-    .addTarget(
-      prometheus.target(
-          expr='irate(collectd_contextswitch_total{instance="$host"}[$rate])',
-          legendFormat="Context Switches"
-      )
-    )
-  )
-   .addPanel(
-    graphpanel.new(
-      title="IRQ Activity",
-      datasource='$PROMETHEUS_DS',
-      span=graphSpan,
-      format="short",
-      legend_hideEmpty=true,
-      legend_hideZero=true
-    )
-    .addTarget(
-      prometheus.target(
-          expr='rate(collectd_irq_total{instance="$host", irq != "LOC"}[$rate])',
-          legendFormat="{{irq}}"
-      )
-    )
-  )
-   .addPanel(
-    graphpanel.new(
-      title="NUMA Activity",
-      datasource='$PROMETHEUS_DS',
-      span=graphSpan,
-      format="short",
-      legend_hideEmpty=true,
-      legend_hideZero=true
-    )
-    .addTarget(
-      prometheus.target(
-          expr='irate(collectd_numa_vmpage_action_total{instance="$host"}[$rate])',
-          legendFormat="{{numa}} - {{type}}"
-      )
-    )
-  )
-  .addPanel(
-    graphpanel.new(
-      title="TCP Connection Activity",
-      datasource='$PROMETHEUS_DS',
-      span=graphSpan,
-      format="short",
-      legend_hideEmpty=true,
-      legend_hideZero=true
-    )
-    .addTarget(
-      prometheus.target(
-          expr='collectd_tcpconns_tcp_connections{instance="$host"}',
-          legendFormat="{{tcpconns}} - {{type}}"
-      )
-    )
-  )
-  .addPanel(
-    graphpanel.new(
-      title="TCP Connection Activity",
-      datasource='$PROMETHEUS_DS',
-      span=graphSpan,
-      format="short",
-      legend_hideEmpty=true,
-      legend_hideZero=true
-    )
-    .addTarget(
-      prometheus.target(
-          expr='rate(collectd_protocols_protocol_counter_total{instance="$host"}[$rate])',
-          legendFormat="{{protocols}} - {{type}}"
-      )
-    )
-  )
-  .addPanel(
-    graphpanel.new(
-      title="Processor Speeds",
-      datasource='$PROMETHEUS_DS',
-      span=graphSpan,
-      format="hertz",
-      points=true,
-      lines=false,
-      pointradius=5,
-      legend_hideEmpty=true,
-      legend_hideZero=true
-    )
-    .addTarget(
-      prometheus.target(
-          expr='collectd_cpufreq{instance="$host"}',
-          legendFormat="{{cpufreq}}"
-      )
-    )
-  )
-  .addPanel(
-    graphpanel.new(
-      title="Page Cache Activity",
-      datasource='$PROMETHEUS_DS',
-      span=graphSpan,
-      format="short",
-      legend_hideEmpty=true,
-      legend_hideZero=true
-    )
-    .addTarget(
-      prometheus.target(
-          expr='rate(collectd_vmem_vmpage_faults_majflt_total{instance="$host"}[$rate])',
-          legendFormat="Major fault"
-      )
-    )
-    .addTarget(
-      prometheus.target(
-          expr='rate(collectd_vmem_vmpage_faults_minflt_total{instance="$host"}[$rate])',
-          legendFormat="Minor fault"
-      )
-    )
-    .addTarget(
-      prometheus.target(
-          expr='rate(collectd_vmem_vmpage_action_total{instance="$host"}[$rate])',
-          legendFormat="Action - {{vmem}}"
-      )
-    )
-    .addTarget(
-      prometheus.target(
-          expr='rate(collectd_vmem_vmpage_io_in_total{instance="$host"}[$rate])',
-          legendFormat="IO read page"
-      )
-    )
-    .addTarget(
-      prometheus.target(
-          expr='rate(collectd_vmem_vmpage_io_out_total{instance="$host"}[$rate])',
-          legendFormat="IO write page"
-      )
-    )
-  )
-  .addPanel(
-    graphpanel.new(
-      title="Page Cache Layout",
-      datasource='$PROMETHEUS_DS',
-      span=graphSpan,
-      format="short",
-      percentage=true,
-      stack=true,
-      min=0,
-      max=100,
-      legend_hideEmpty=true,
-      legend_hideZero=true
-    )
-    .addTarget(
-      prometheus.target(
-          expr='collectd_vmem_vmpage_number{instance="$host"}',
-          legendFormat="{{vmem}}"
-      )
-    )
-  )
-  .addPanel(
-    graphpanel.new(
-      title="Process Activity",
-      datasource='$PROMETHEUS_DS',
-      span=graphSpan,
-      format="short",
-      legend_hideEmpty=true,
-      legend_hideZero=true
-    )
-    .addTarget(
-      prometheus.target(
-          expr='collectd_processes_ps_count_threads{instance="$host"}',
-          legendFormat="Thread Count"
-      )
-    )
-    .addTarget(
-      prometheus.target(
-          expr='collectd_processes_ps_count_processes{instance="$host"}',
-          legendFormat="Process Count"
-      )
-    )
-    .addTarget(
-      prometheus.target(
-          expr='collectd_processes_ps_state{instance="$host"}',
-          legendFormat="Process State - {{processes}}"
-      )
-    )
-  )
-)
-.addRow(
-  row.new(
-    title='Basic Cassandra Overview',
-    height=singlestatHeight
-  )
-  .addPanel(
-    singlestat.new(
-      'SSTable Count',
-      description="Number of sstables on the node",
-      format='short',
-      datasource='$PROMETHEUS_DS',
-      sparklineShow=true,
-      gaugeShow=true,
-      span=singlestatSpan,
-      thresholds="100000,500000"
-    )
-    .addTarget(
-      prometheus.target(
-        "sum(" + prefix + "_table_live_ss_table_count{instance='$host'})"
-      )
-    )
-  )
-  .addPanel(
-    singlestat.new(
-      'Pending Compactions',
-      description="Number of pending compactions on the node",
-      format='short',
-      datasource='$PROMETHEUS_DS',
-      sparklineShow=true,
-      gaugeShow=true,
-      span=singlestatSpan,
-      thresholds="10,50"
-    )
-    .addTarget(
-      prometheus.target(
-        "sum(" + prefix + "_compaction_pending_tasks{instance='$host'})"
-      )
-    )
-  )
-  .addPanel(
-    singlestat.new(
-      'Connected Clients',
-      description="Number of client connections to the node",
-      format='percent',
-      datasource='$PROMETHEUS_DS',
-      sparklineShow=true,
-      gaugeShow=true,
-      span=singlestatSpan,
-      thresholds="100,1000"
-    )
-    .addTarget(
-      prometheus.target(
-        "sum(" + prefix + "_client_connected_native_clients{instance='$host'})"
-      )
-    )
-  )
-  .addPanel(
-    graphpanel.new(
-      title="GC Activity",
-      datasource='$PROMETHEUS_DS',
-      span=graphSpan,
-      format="bytes",
-      legend_hideEmpty=true,
-      legend_hideZero=true
-    )
-    .addTarget(
-      prometheus.target(
-          expr='sum(' + prefix + '_jvm_memory_max{instance="$host", memory_type="total"})',
-          legendFormat="JVM Heap Total"
-      )
-    )
-    .addSeriesOverride({
-          "alias": "/.*Total.*/",
-          "fill": 0
-    })
-    .addTarget(
-      prometheus.target(
-          expr='sum(' + prefix + '_jvm_memory_used{instance="$host", memory_type="non_heap"})',
-          legendFormat="JVM Non-Heap Used"
-      )
-    )
-    .addTarget(
-      prometheus.target(
-          expr='sum(' + prefix + '_jvm_memory_used{instance="$host", memory_type="heap"})',
-          legendFormat="JVM Heap Used"
-      )
-    )
-  )
-)
\ No newline at end of file
diff --git a/dashboards/grafana/make-dashboards.sh b/dashboards/grafana/make-dashboards.sh
deleted file mode 100755
index 7e80adf..0000000
--- a/dashboards/grafana/make-dashboards.sh
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/bash
-
-DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
-
-cd $DIR
-for file in dashboards-jsonnet/*; do
-  name=$(basename $file);
-  echo "Generating ${name%.jsonnet}.json"
-  docker run -v `pwd`:/here datastax/grafonnet-lib:v0.1.3 jsonnet --ext-str prefix=mcac /here/$file > `pwd`/generated-dashboards/${name%.jsonnet}.json;
-done
diff --git a/make_package.sh b/make_package.sh
index 2394077..3073c31 100755
--- a/make_package.sh
+++ b/make_package.sh
@@ -41,10 +41,7 @@ cd $PACKAGE_DIR
 tar zcvf $PROJECT_DIR_NAME.tar.gz $PROJECT_DIR_NAME
 zip $PROJECT_DIR_NAME.zip $(tar ztf $PROJECT_DIR_NAME.tar.gz)
 popd
-pushd .
-cd dashboards/grafana
-./make-dashboards.sh
-popd
+mixin/make-dashboards.sh
 
 DASHBOARD_DIR_NAME=datastax-mcac-dashboards-$VERSION
 mkdir -p $PACKAGE_DIR/$DASHBOARD_DIR_NAME/grafana
diff --git a/mixin/README.md b/mixin/README.md
new file mode 100644
index 0000000..b2db7fb
--- /dev/null
+++ b/mixin/README.md
@@ -0,0 +1,14 @@
+# MCAC Mixin
+
+The MCAC Mixin is a set of configurable, reusable, and extensible alerts and dashboards for Apache Cassandra. 
+
+## Requirements
+
+- [Jsonnet](https://github.com/google/go-jsonnet)
+- [jsonnet-bundler](https://github.com/jsonnet-bundler/jsonnet-bundler) (`jb`)
+
+## Install as library
+
+```shell
+jb install github.com/datastax/metric-collector-for-apache-cassandra/mixin@master
+```
diff --git a/mixin/config.libsonnet b/mixin/config.libsonnet
new file mode 100644
index 0000000..cd9503e
--- /dev/null
+++ b/mixin/config.libsonnet
@@ -0,0 +1,5 @@
+{
+  _config+:: {
+    metricPrefix: 'mcac',
+  },
+}
diff --git a/mixin/dashboards.jsonnet b/mixin/dashboards.jsonnet
new file mode 100644
index 0000000..0d31ce1
--- /dev/null
+++ b/mixin/dashboards.jsonnet
@@ -0,0 +1,6 @@
+local dashboards = (import './mixin.libsonnet').grafanaDashboards;
+
+{
+  [name]: dashboards[name]
+  for name in std.objectFields(dashboards)
+}
diff --git a/mixin/dashboards/cassandra-condensed.libsonnet b/mixin/dashboards/cassandra-condensed.libsonnet
new file mode 100644
index 0000000..452d699
--- /dev/null
+++ b/mixin/dashboards/cassandra-condensed.libsonnet
@@ -0,0 +1,529 @@
+local grafana = import 'github.com/grafana/grafonnet-lib/grafonnet/grafana.libsonnet';
+
+local dashboard = grafana.dashboard;
+local row = grafana.row;
+local singlestat = grafana.singlestat;
+local graphpanel = grafana.graphPanel;
+local text = grafana.text;
+local prometheus = grafana.prometheus;
+local template = grafana.template;
+
+local graphHeight = 300;
+local singlestatHeight = 100;
+local singlestatSpan = 1;
+local graphSpan = 4;
+
+{
+  _config+:: {
+    metricPrefix: error 'must provide metric prefix',
+  },
+  grafanaDashboards+:: {
+    'cassandra-condensed.json':
+      dashboard.new(
+        'Cassandra Cluster Condensed',
+        description='Single pane of glass for most important Cassandra metrics',
+        schemaVersion=14,
+        refresh='30s',
+        time_from='now-30m',
+        editable=true,
+        tags=['os'],
+        style='dark'
+      )
+      .addTemplate(
+        template.datasource(
+          'PROMETHEUS_DS',
+          'prometheus',
+          'Prometheus',
+          hide='all',
+        )
+      )
+
+      .addTemplate(
+        template.custom(
+          'by',
+          'cluster,dc,rack,instance',
+          'cluster',
+          valuelabels={
+            cluster: 'Cluster',
+            dc: 'Datacenter',
+            rack: 'Rack',
+            instance: 'Host',
+          },
+          label='Group By',
+        )
+      )
+      .addTemplate(
+        template.interval(
+          'rate',
+          '1m,5m,10m,30m,1h,6h,12h,1d,7d,14d,30d',
+          '5m',
+          label='Rate',
+        )
+      )
+      .addTemplate(
+        template.new(
+          'cluster',
+          '$PROMETHEUS_DS',
+          'label_values(collectd_collectd_queue_length{}, cluster)',
+          label='Cluster',
+          refresh='time',
+          includeAll=true,
+          allValues='.*',
+        )
+      )
+      .addTemplate(
+        template.new(
+          'dc',
+          '$PROMETHEUS_DS',
+          'label_values(collectd_collectd_queue_length{cluster=~"$cluster"}, dc)',
+          label='DataCenter',
+          refresh='time',
+          includeAll=true,
+          allValues='.*',
+        )
+      )
+      .addTemplate(
+        template.new(
+          'rack',
+          '$PROMETHEUS_DS',
+          'label_values(collectd_collectd_queue_length{cluster=~"$cluster", dc=~"$dc"}, rack)',
+          label='Rack',
+          refresh='time',
+          includeAll=true,
+          allValues='.*',
+        )
+      )
+      .addTemplate(
+        template.new(
+          'keyspace',
+          '$PROMETHEUS_DS',
+          'label_values(' + $._config.metricPrefix + '_table_read_latency_total{cluster=~"$cluster", dc=~"$dc"}, keyspace)',
+          label='Keyspace',
+          refresh='time',
+          includeAll=true,
+          allValues='.*',
+        )
+      )
+      .addTemplate(
+        template.new(
+          'table',
+          '$PROMETHEUS_DS',
+          'label_values(' + $._config.metricPrefix + '_table_read_latency_total{cluster=~"$cluster", dc=~"$dc", keyspace=~"$keyspace"}, table)',
+          label='Table',
+          refresh='time',
+          includeAll=true,
+          allValues='.*',
+        )
+      )
+      .addTemplate(
+        template.new(
+          'host',
+          '$PROMETHEUS_DS',
+          'label_values(collectd_collectd_queue_length{cluster=~"$cluster", dc=~"$dc", rack=~"$rack"}, instance)',
+          label='Host',
+          refresh='time',
+          includeAll=true,
+          allValues='.*',
+        )
+      )
+      .addTemplate(
+        template.custom(
+          'latency',
+          '0.999,0.99,0.98,0.95,0.90,0.75,0.50',
+          '0.95',
+          valuelabels={
+            '0.999': 'P999',
+            '0.99': 'P99',
+            '0.98': 'P98',
+            '0.95': 'P95',
+            '0.90': 'P90',
+            '0.75': 'P75',
+            '0.50': 'P50',
+          },
+          label='Percentile'
+        )
+      )
+      .addRow(
+        row.new(
+          title='Cluster Overview',
+          height=singlestatHeight,
+        )
+        .addPanel(
+          singlestat.new(
+            'Nodes Up',
+            description='Nodes that are currently running in this time window',
+            format='none',
+            decimals=0,
+            datasource='$PROMETHEUS_DS',
+            colorValue=true,
+            colors=['#d44a3a', '#299c46', '#299c46'],
+            thresholds='0.1,1000',
+            span=singlestatSpan
+          )
+          .addTarget(
+            prometheus.target(
+              'count(' + $._config.metricPrefix + '_compaction_completed_tasks{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$host"} >= 0) or vector(0)'
+            )
+          )
+        )
+        .addPanel(
+          singlestat.new(
+            'Nodes Down',
+            description='Nodes that are currently not running in this time window',
+            format='none',
+            decimals=0,
+            colorValue=true,
+            colors=['#299c46', 'rgba(237, 129, 40, 0.89)', '#d44a3a'],
+            datasource='$PROMETHEUS_DS',
+            thresholds='1,2',
+            span=singlestatSpan
+          )
+          .addTarget(
+            prometheus.target(
+              'count(absent(sum(rate(' + $._config.metricPrefix + '_compaction_completed_tasks{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$host"}[5m])))) OR vector(0)'
+            )
+          )
+        )
+        .addPanel(
+          singlestat.new(
+            'Compactions / $rate',
+            description='Rate of compactions during this window',
+            format='none',
+            decimals=0,
+            datasource='$PROMETHEUS_DS',
+            sparklineShow=true,
+            span=singlestatSpan
+          )
+          .addTarget(
+            prometheus.target(
+              'sum(rate(' + $._config.metricPrefix + '_compaction_completed_tasks{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$host"}[$rate]))'
+            )
+          )
+        )
+        .addPanel(
+          singlestat.new(
+            'CQL Requests / $rate',
+            description='Rate of CQL requests during this window',
+            format='none',
+            datasource='$PROMETHEUS_DS',
+            sparklineShow=true,
+            decimals=0,
+            span=singlestatSpan
+          )
+          .addTarget(
+            prometheus.target(
+              'sum(irate(dse_client_request_latency_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$host"}[$rate]))'
+            )
+          )
+        )
+        .addPanel(
+          singlestat.new(
+            'Dropped Messages / $rate',
+            description='Rate of Dropped requests during this window',
+            format='none',
+            datasource='$PROMETHEUS_DS',
+            sparklineShow=true,
+            thresholds='30,300',
+            colorValue=true,
+            decimals=0,
+            span=singlestatSpan
+          )
+          .addTarget(
+            prometheus.target(
+              'sum(irate(' + $._config.metricPrefix + '_table_dropped_mutations_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$host"}[$rate]))'
+            )
+          )
+        )
+        .addPanel(
+          text.new(
+            transparent=true,
+            mode='html',
+            content=' ',
+            span=2
+          )
+        )
+        .addPanel(
+          singlestat.new(
+            'CQL Clients',
+            description='Number of connected clients during this time window',
+            format='none',
+            datasource='$PROMETHEUS_DS',
+            sparklineShow=true,
+            thresholds='100,1000',
+            colorValue=true,
+            decimals=0,
+            span=singlestatSpan
+          )
+          .addTarget(
+            prometheus.target(
+              'sum(' + $._config.metricPrefix + '_client_connected_native_clients{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$host"})'
+            )
+          )
+        )
+        .addPanel(
+          singlestat.new(
+            'Timeouts / $rate',
+            description='Client timeouts over the last $rate',
+            format='none',
+            datasource='$PROMETHEUS_DS',
+            thresholds='100,300',
+            colorValue=true,
+            sparklineShow=true,
+            span=singlestatSpan
+          )
+          .addTarget(
+            prometheus.target(
+              'sum(irate(' + $._config.metricPrefix + '_client_request_timeouts_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$host"}[$rate]))',
+            )
+          )
+        )
+        .addPanel(
+          singlestat.new(
+            'Hints / $rate',
+            description='Hints stored over the last $rate',
+            format='none',
+            datasource='$PROMETHEUS_DS',
+            thresholds='1000,30000',
+            colorValue=true,
+            sparklineShow=true,
+            span=singlestatSpan
+          )
+          .addTarget(
+            prometheus.target(
+              'sum(irate(' + $._config.metricPrefix + '_storage_hints_on_disk_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$host"}[$rate]))'
+            )
+          )
+        )
+        .addPanel(
+          singlestat.new(
+            'Data Size',
+            description='Data',
+            format='bytes',
+            datasource='$PROMETHEUS_DS',
+            sparklineShow=true,
+            span=singlestatSpan
+          )
+          .addTarget(
+            prometheus.target(
+              'sum(' + $._config.metricPrefix + '_table_live_disk_space_used_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", keyspace=~"$keyspace", table=~"$table", instance=~"$host"})'
+            )
+          )
+        )
+        .addPanel(
+          singlestat.new(
+            'GC Time / $rate',
+            description='Data',
+            format='ms',
+            decimals=1,
+            datasource='$PROMETHEUS_DS',
+            sparklineShow=true,
+            span=singlestatSpan
+          )
+          .addTarget(
+            prometheus.target(
+              'sum(rate(' + $._config.metricPrefix + '_jvm_gc_time{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$host"}[$rate]))'
+            )
+          )
+        )
+      )
+      .addRow(
+        row.new(
+          title='Condensed Metrics',
+          height=graphHeight
+        )
+        .addPanel(
+          graphpanel.new(
+            title='Requests Served / $by / $rate',
+            description='(no keyspace/table filters apply)',
+            datasource='$PROMETHEUS_DS',
+            span=graphSpan,
+            labelY2='Clients Connected',
+            legend_hideZero=true,
+            legend_hideEmpty=true
+          )
+          .addSeriesOverride({
+            alias: '/.*Connected/',
+            yaxis: 2,
+          })
+          .addTarget(
+            prometheus.target(
+              expr='sum(irate(' + $._config.metricPrefix + '_client_request_latency_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$host"}[$rate])) by ($by, request_type)',
+              legendFormat='{{$by}}:{{request_type}}'
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum(' + $._config.metricPrefix + '_client_connected_native_clients{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$host"}) by ($by)',
+              legendFormat='{{$by}}:Clients Connected'
+            )
+          )
+        )
+        .addPanel(
+          graphpanel.new(
+            title='Coordinator $latency Latency / $by',
+            description='(no keyspace/table filters apply)',
+            datasource='$PROMETHEUS_DS',
+            span=graphSpan,
+            format='µs',
+            min=0,
+            legend_hideZero=true,
+            legend_hideEmpty=true
+          )
+          .addTarget(
+            prometheus.target(
+              expr='histogram_quantile($latency, sum(rate(' + $._config.metricPrefix + '_client_request_latency_bucket{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$host"}[$rate])) by (le, request_type, $by))',
+              legendFormat='$by:{{$by}} {{$latency}} {{request_type}}'
+            )
+          )
+        )
+        .addPanel(
+          graphpanel.new(
+            title='Memtable Space $keyspace.$table / $by',
+            datasource='$PROMETHEUS_DS',
+            span=graphSpan,
+            formatY1='bytes',
+            formatY2='short',
+            labelY2='Flush',
+            min=0,
+            legend_hideZero=true,
+            legend_hideEmpty=true
+          )
+          .addSeriesOverride({
+            alias: '/.*Flushes/',
+            bars: true,
+            lines: false,
+            zindex: -3,
+            yaxis: 2,
+          })
+          .addTarget(
+            prometheus.target(
+              expr='sum(' + $._config.metricPrefix + '_table_memtable_off_heap_size{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", keyspace=~"$keyspace", table=~"$table", instance=~"$host"}) by ($by)',
+              legendFormat='{{$by}} : Off Heap'
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum(' + $._config.metricPrefix + '_table_memtable_on_heap_size{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", keyspace=~"$keyspace", table=~"$table", instance=~"$host"}) by ($by)',
+              legendFormat='{{$by}} : On Heap'
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum(idelta(' + $._config.metricPrefix + '_table_memtable_switch_count_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", keyspace=~"$keyspace", table=~"$table", instance=~"$host"}[$rate])) by ($by)',
+              legendFormat='{{$by}} : Flushes'
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum(idelta(' + $._config.metricPrefix + '_table_pending_flushes_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", keyspace=~"$keyspace", table=~"$table", instance=~"$host"}[$rate])) by ($by)',
+              legendFormat='{{$by}} : Pending Flushes'
+            )
+          )
+        )
+        .addPanel(
+          graphpanel.new(
+            title='Compactions $keyspace.$table / $by',
+            datasource='$PROMETHEUS_DS',
+            span=graphSpan,
+            format='bps',
+            formatY2='short',
+            labelY2='Count',
+            legend_hideZero=true,
+            legend_hideEmpty=true,
+            min=0
+          )
+          .addSeriesOverride({
+            alias: '/.*Compactions/',
+            bars: true,
+            lines: false,
+            zindex: -3,
+            yaxis: 2,
+          })
+          .addTarget(
+            prometheus.target(
+              expr='sum(irate(' + $._config.metricPrefix + '_table_compaction_bytes_written_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", keyspace=~"$keyspace", table=~"$table", instance=~"$host"}[$rate])) by ($by)',
+              legendFormat='{{by}} : Bytes Compacted'
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum(irate(' + $._config.metricPrefix + '_table_pending_compactions{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", keyspace=~"$keyspace", table=~"$table", instance=~"$host"}[$rate])) by ($by)',
+              legendFormat='{{by}} : Pending Compactions'
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum(irate(' + $._config.metricPrefix + '_compaction_completed_tasks{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$host"}[$rate])) by ($by)',
+              legendFormat='{{by}} : Completed Compactions'
+            )
+          )
+        )
+        .addPanel(
+          graphpanel.new(
+            title='Table $latency Latency / $by',
+            description='',
+            datasource='$PROMETHEUS_DS',
+            span=graphSpan,
+            format='µs',
+            min=0,
+            legend_hideZero=true,
+            legend_hideEmpty=true
+          )
+          .addTarget(
+            prometheus.target(
+              expr='histogram_quantile($latency, sum(irate(' + $._config.metricPrefix + '_table_range_latency_bucket{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", keyspace=~"$keyspace", table=~"$table", instance=~"$host"}[$rate])) by (le, $by))',
+              legendFormat='$by:{{$by}} Local Range Scan'
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='histogram_quantile($latency, sum(irate(' + $._config.metricPrefix + '_table_read_latency_bucket{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", keyspace=~"$keyspace", table=~"$table", instance=~"$host"}[$rate])) by (le, $by))',
+              legendFormat='$by:{{$by}} Local Read'
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='histogram_quantile($latency, sum(irate(' + $._config.metricPrefix + '_table_write_latency_bucket{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", keyspace=~"$keyspace", table=~"$table", instance=~"$host"}[$rate])) by (le, $by))',
+              legendFormat='$by:{{$by}} Local Write'
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='histogram_quantile($latency, sum(irate(' + $._config.metricPrefix + '_table_coordinator_read_latency_bucket{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", keyspace=~"$keyspace", table=~"$table"}[$rate])) by (le, $by))',
+              legendFormat='$by:{{$by}} Coordinator Read'
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='histogram_quantile($latency, sum(irate(' + $._config.metricPrefix + '_table_coordinator_scan_latency_bucket{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", keyspace=~"$keyspace", table=~"$table", instance=~"$host"}[$rate])) by (le, $by))',
+              legendFormat='$by:{{$by}} Coordinator Range Scan'
+            )
+          )
+        )
+        .addPanel(
+          graphpanel.new(
+            title='Streaming / $by / $rate',
+            description='',
+            datasource='$PROMETHEUS_DS',
+            span=graphSpan,
+            format='Bps',
+            min=0,
+            legend_hideZero=true,
+            legend_hideEmpty=true
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum(irate(' + $._config.metricPrefix + '_streaming_total_incoming_bytes_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$host"}[$rate])) by ($by)',
+              legendFormat='{{$by}}: Incoming Stream'
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum(irate(' + $._config.metricPrefix + '_streaming_total_outgoing_bytes_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$host"}[$rate])) by ($by)',
+              legendFormat='{{$by}}: Outgoing Stream'
+            )
+          )
+        )
+      ),
+  },
+}
diff --git a/mixin/dashboards/dashboards.libsonnet b/mixin/dashboards/dashboards.libsonnet
new file mode 100644
index 0000000..aa49aca
--- /dev/null
+++ b/mixin/dashboards/dashboards.libsonnet
@@ -0,0 +1,3 @@
+(import './cassandra-condensed.libsonnet') +
+(import './overview.libsonnet') +
+(import './system-metrics.libsonnet')
diff --git a/mixin/dashboards/overview.libsonnet b/mixin/dashboards/overview.libsonnet
new file mode 100644
index 0000000..1c1effc
--- /dev/null
+++ b/mixin/dashboards/overview.libsonnet
@@ -0,0 +1,1108 @@
+local grafana = (import 'github.com/grafana/grafonnet-lib/grafonnet/grafana.libsonnet') +
+                (import 'github.com/thelastpickle/grafonnet-polystat-panel/plugin.libsonnet');
+local dashboard = grafana.dashboard;
+local prometheus = grafana.prometheus;
+local template = grafana.template;
+local row = grafana.row;
+
+local graphPanel = grafana.graphPanel;
+local tablePanel = grafana.tablePanel;
+local singleStatPanel = grafana.singlestat;
+local textPanel = grafana.text;
+local polystatPanel = grafana.polystatPanel;
+
+local fillLatencySeriesOverrides = {
+  alias: 'p999',
+  fillBelowTo: 'p98',
+  lines: false,
+};
+local removeMinLatencySeriesOverrides = {
+  alias: 'p98',
+  lines: false,
+};
+
+local fillMinMaxSeriesOverrides = {
+  alias: 'max',
+  fillBelowTo: 'min',
+  lines: false,
+};
+local removeMinlineSeriesOverrides = {
+  alias: 'min',
+  lines: false,
+};
+
+
+// used in the single stat panels where higher is better - cache hit rates for example
+local reversedColors = [
+  '#d44a3a',
+  'rgba(237, 129, 40, 0.89)',
+  '#299c46',
+];
+
+{
+  _config+:: {
+    metricPrefix: error 'must provide metric prefix',
+  },
+  grafanaDashboards+:: {
+    'overview.json':
+      dashboard.new(
+        'Cassandra Overview',
+        schemaVersion=14,
+        refresh='30s',
+        time_from='now-30m',
+        editable=true,
+        tags=['Cassandra', 'Overview'],
+        style='dark'
+      )
+      .addTemplate(
+        grafana.template.datasource(
+          'PROMETHEUS_DS',
+          'prometheus',
+          'Prometheus',
+          hide='all',
+        )
+      )
+      .addTemplate(
+        template.new(
+          'cluster',
+          '$PROMETHEUS_DS',
+          'label_values(collectd_collectd_queue_length{}, cluster)',
+          label='Cluster',
+          refresh='time',
+        )
+      )
+      .addTemplate(
+        template.new(
+          'dc',
+          '$PROMETHEUS_DS',
+          'label_values(collectd_collectd_queue_length{cluster=~"$cluster"}, dc)',
+          label='DataCenter',
+          refresh='time',
+          includeAll=true,
+          allValues='.*',
+        )
+      )
+      .addTemplate(
+        template.new(
+          'rack',
+          '$PROMETHEUS_DS',
+          'label_values(collectd_collectd_queue_length{cluster=~"$cluster", dc=~"$dc"}, rack)',
+          label='Rack',
+          refresh='time',
+          includeAll=true,
+          allValues='.*',
+        )
+      )
+      .addTemplate(
+        template.new(
+          'node',
+          '$PROMETHEUS_DS',
+          'label_values(collectd_collectd_queue_length{cluster=~"$cluster", dc=~"$dc", rack=~"$rack"}, instance)',
+          label='Node',
+          refresh='time',
+          includeAll=true,
+          allValues='.*',
+        )
+      )
+      .addRow(
+        row.new(title='', height='50px')
+        .addPanel(textPanel.new(transparent=true))
+        .addPanel(
+          textPanel.new(
+            transparent=true,
+            mode='html',
+            content='
',
+            span=2
+          )
+        )
+        .addPanel(
+          singlestat.new(
+            'CQL Clients',
+            description='Number of connected clients during this time window',
+            format='none',
+            datasource='$PROMETHEUS_DS',
+            sparklineShow=true,
+            thresholds='100,1000',
+            colorValue=true,
+            decimals=0,
+            span=singlestatSpan
+          )
+          .addTarget(
+            prometheus.target(
+              'sum(' + $._config.metricPrefix + '_client_connected_native_clients{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$host"})'
+            )
+          )
+        )
+        .addPanel(
+          singlestat.new(
+            'Timeouts / $rate',
+            description='Client timeouts over the last $rate',
+            format='none',
+            datasource='$PROMETHEUS_DS',
+            thresholds='100,300',
+            colorValue=true,
+            sparklineShow=true,
+            span=singlestatSpan
+          )
+          .addTarget(
+            prometheus.target(
+              'sum(irate(' + $._config.metricPrefix + '_client_request_timeouts_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$host"}[$rate]))',
+            )
+          )
+        )
+        .addPanel(
+          singlestat.new(
+            'Hints / $rate',
+            description='Hints stored over the last $rate',
+            format='none',
+            datasource='$PROMETHEUS_DS',
+            thresholds='1000,30000',
+            colorValue=true,
+            sparklineShow=true,
+            span=singlestatSpan
+          )
+          .addTarget(
+            prometheus.target(
+              'sum(irate(' + $._config.metricPrefix + '_storage_hints_on_disk_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$host"}[$rate]))'
+            )
+          )
+        )
+        .addPanel(
+          singlestat.new(
+            'Data Size',
+            description='Data',
+            format='bytes',
+            datasource='$PROMETHEUS_DS',
+            sparklineShow=true,
+            span=singlestatSpan
+          )
+          .addTarget(
+            prometheus.target(
+              'sum(' + $._config.metricPrefix + '_table_live_disk_space_used_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", keyspace=~"$keyspace", table=~"$table", instance=~"$host"})'
+            )
+          )
+        )
+        .addPanel(
+          singlestat.new(
+            'GC Time / $rate',
+            description='Data',
+            format='ms',
+            decimals=1,
+            datasource='$PROMETHEUS_DS',
+            sparklineShow=true,
+            span=singlestatSpan
+          )
+          .addTarget(
+            prometheus.target(
+              'sum(rate(' + $._config.metricPrefix + '_jvm_gc_time{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$host"}[$rate]))'
+            )
+          )
+        )
+      )
+      .addRow(
+        row.new(
+          title='Condensed Metrics',
+          height=graphHeight
+        )
+        .addPanel(
+          graphpanel.new(
+            title='Requests Served / $by / $rate',
+            description='(no keyspace/table filters apply)',
+            datasource='$PROMETHEUS_DS',
+            span=graphSpan,
+            labelY2='Clients Connected',
+            legend_hideZero=true,
+            legend_hideEmpty=true
+          )
+          .addSeriesOverride({
+            alias: '/.*Connected/',
+            yaxis: 2,
+          })
+          .addTarget(
+            prometheus.target(
+              expr='sum(irate(' + $._config.metricPrefix + '_client_request_latency_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$host"}[$rate])) by ($by, request_type)',
+              legendFormat='{{$by}}:{{request_type}}'
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum(' + $._config.metricPrefix + '_client_connected_native_clients{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$host"}) by ($by)',
+              legendFormat='{{$by}}:Clients Connected'
+            )
+          )
+        )
+        .addPanel(
+          graphpanel.new(
+            title='Coordinator $latency Latency / $by',
+            description='(no keyspace/table filters apply)',
+            datasource='$PROMETHEUS_DS',
+            span=graphSpan,
+            format='µs',
+            min=0,
+            legend_hideZero=true,
+            legend_hideEmpty=true
+          )
+          .addTarget(
+            prometheus.target(
+              expr='histogram_quantile($latency, sum(rate(' + $._config.metricPrefix + '_client_request_latency_bucket{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$host"}[$rate])) by (le, request_type, $by))',
+              legendFormat='$by:{{$by}} {{$latency}} {{request_type}}'
+            )
+          )
+        )
+        .addPanel(
+          graphpanel.new(
+            title='Memtable Space $keyspace.$table / $by',
+            datasource='$PROMETHEUS_DS',
+            span=graphSpan,
+            formatY1='bytes',
+            formatY2='short',
+            labelY2='Flush',
+            min=0,
+            legend_hideZero=true,
+            legend_hideEmpty=true
+          )
+          .addSeriesOverride({
+            alias: '/.*Flushes/',
+            bars: true,
+            lines: false,
+            zindex: -3,
+            yaxis: 2,
+          })
+          .addTarget(
+            prometheus.target(
+              expr='sum(' + $._config.metricPrefix + '_table_memtable_off_heap_size{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", keyspace=~"$keyspace", table=~"$table", instance=~"$host"}) by ($by)',
+              legendFormat='{{$by}} : Off Heap'
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum(' + $._config.metricPrefix + '_table_memtable_on_heap_size{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", keyspace=~"$keyspace", table=~"$table", instance=~"$host"}) by ($by)',
+              legendFormat='{{$by}} : On Heap'
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum(idelta(' + $._config.metricPrefix + '_table_memtable_switch_count_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", keyspace=~"$keyspace", table=~"$table", instance=~"$host"}[$rate])) by ($by)',
+              legendFormat='{{$by}} : Flushes'
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum(idelta(' + $._config.metricPrefix + '_table_pending_flushes_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", keyspace=~"$keyspace", table=~"$table", instance=~"$host"}[$rate])) by ($by)',
+              legendFormat='{{$by}} : Pending Flushes'
+            )
+          )
+        )
+        .addPanel(
+          graphpanel.new(
+            title='Compactions $keyspace.$table / $by',
+            datasource='$PROMETHEUS_DS',
+            span=graphSpan,
+            format='bps',
+            formatY2='short',
+            labelY2='Count',
+            legend_hideZero=true,
+            legend_hideEmpty=true,
+            min=0
+          )
+          .addSeriesOverride({
+            alias: '/.*Compactions/',
+            bars: true,
+            lines: false,
+            zindex: -3,
+            yaxis: 2,
+          })
+          .addTarget(
+            prometheus.target(
+              expr='sum(irate(' + $._config.metricPrefix + '_table_compaction_bytes_written_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", keyspace=~"$keyspace", table=~"$table", instance=~"$host"}[$rate])) by ($by)',
+              legendFormat='{{by}} : Bytes Compacted'
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum(irate(' + $._config.metricPrefix + '_table_pending_compactions{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", keyspace=~"$keyspace", table=~"$table", instance=~"$host"}[$rate])) by ($by)',
+              legendFormat='{{by}} : Pending Compactions'
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum(irate(' + $._config.metricPrefix + '_compaction_completed_tasks{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$host"}[$rate])) by ($by)',
+              legendFormat='{{by}} : Completed Compactions'
+            )
+          )
+        )
+        .addPanel(
+          graphpanel.new(
+            title='Table $latency Latency / $by',
+            description='',
+            datasource='$PROMETHEUS_DS',
+            span=graphSpan,
+            format='µs',
+            min=0,
+            legend_hideZero=true,
+            legend_hideEmpty=true
+          )
+          .addTarget(
+            prometheus.target(
+              expr='histogram_quantile($latency, sum(irate(' + $._config.metricPrefix + '_table_range_latency_bucket{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", keyspace=~"$keyspace", table=~"$table", instance=~"$host"}[$rate])) by (le, $by))',
+              legendFormat='$by:{{$by}} Local Range Scan'
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='histogram_quantile($latency, sum(irate(' + $._config.metricPrefix + '_table_read_latency_bucket{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", keyspace=~"$keyspace", table=~"$table", instance=~"$host"}[$rate])) by (le, $by))',
+              legendFormat='$by:{{$by}} Local Read'
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='histogram_quantile($latency, sum(irate(' + $._config.metricPrefix + '_table_write_latency_bucket{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", keyspace=~"$keyspace", table=~"$table", instance=~"$host"}[$rate])) by (le, $by))',
+              legendFormat='$by:{{$by}} Local Write'
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='histogram_quantile($latency, sum(irate(' + $._config.metricPrefix + '_table_coordinator_read_latency_bucket{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", keyspace=~"$keyspace", table=~"$table"}[$rate])) by (le, $by))',
+              legendFormat='$by:{{$by}} Coordinator Read'
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='histogram_quantile($latency, sum(irate(' + $._config.metricPrefix + '_table_coordinator_scan_latency_bucket{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", keyspace=~"$keyspace", table=~"$table", instance=~"$host"}[$rate])) by (le, $by))',
+              legendFormat='$by:{{$by}} Coordinator Range Scan'
+            )
+          )
+        )
+        .addPanel(
+          graphpanel.new(
+            title='Streaming / $by / $rate',
+            description='',
+            datasource='$PROMETHEUS_DS',
+            span=graphSpan,
+            format='Bps',
+            min=0,
+            legend_hideZero=true,
+            legend_hideEmpty=true
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum(irate(' + $._config.metricPrefix + '_streaming_total_incoming_bytes_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$host"}[$rate])) by ($by)',
+              legendFormat='{{$by}}: Incoming Stream'
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum(irate(' + $._config.metricPrefix + '_streaming_total_outgoing_bytes_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$host"}[$rate])) by ($by)',
+              legendFormat='{{$by}}: Outgoing Stream'
+            )
+          )
+        )
+      ),
+  },
+}
diff --git a/mixin/dashboards/dashboards.libsonnet b/mixin/dashboards/dashboards.libsonnet
new file mode 100644
index 0000000..aa49aca
--- /dev/null
+++ b/mixin/dashboards/dashboards.libsonnet
@@ -0,0 +1,3 @@
+(import './cassandra-condensed.libsonnet') +
+(import './overview.libsonnet') +
+(import './system-metrics.libsonnet')
diff --git a/mixin/dashboards/overview.libsonnet b/mixin/dashboards/overview.libsonnet
new file mode 100644
index 0000000..1c1effc
--- /dev/null
+++ b/mixin/dashboards/overview.libsonnet
@@ -0,0 +1,1108 @@
+local grafana = (import 'github.com/grafana/grafonnet-lib/grafonnet/grafana.libsonnet') +
+                (import 'github.com/thelastpickle/grafonnet-polystat-panel/plugin.libsonnet');
+local dashboard = grafana.dashboard;
+local prometheus = grafana.prometheus;
+local template = grafana.template;
+local row = grafana.row;
+
+local graphPanel = grafana.graphPanel;
+local tablePanel = grafana.tablePanel;
+local singleStatPanel = grafana.singlestat;
+local textPanel = grafana.text;
+local polystatPanel = grafana.polystatPanel;
+
+local fillLatencySeriesOverrides = {
+  alias: 'p999',
+  fillBelowTo: 'p98',
+  lines: false,
+};
+local removeMinLatencySeriesOverrides = {
+  alias: 'p98',
+  lines: false,
+};
+
+local fillMinMaxSeriesOverrides = {
+  alias: 'max',
+  fillBelowTo: 'min',
+  lines: false,
+};
+local removeMinlineSeriesOverrides = {
+  alias: 'min',
+  lines: false,
+};
+
+
+// used in the single stat panels where higher is better - cache hit rates for example
+local reversedColors = [
+  '#d44a3a',
+  'rgba(237, 129, 40, 0.89)',
+  '#299c46',
+];
+
+{
+  _config+:: {
+    metricPrefix: error 'must provide metric prefix',
+  },
+  grafanaDashboards+:: {
+    'overview.json':
+      dashboard.new(
+        'Cassandra Overview',
+        schemaVersion=14,
+        refresh='30s',
+        time_from='now-30m',
+        editable=true,
+        tags=['Cassandra', 'Overview'],
+        style='dark'
+      )
+      .addTemplate(
+        grafana.template.datasource(
+          'PROMETHEUS_DS',
+          'prometheus',
+          'Prometheus',
+          hide='all',
+        )
+      )
+      .addTemplate(
+        template.new(
+          'cluster',
+          '$PROMETHEUS_DS',
+          'label_values(collectd_collectd_queue_length{}, cluster)',
+          label='Cluster',
+          refresh='time',
+        )
+      )
+      .addTemplate(
+        template.new(
+          'dc',
+          '$PROMETHEUS_DS',
+          'label_values(collectd_collectd_queue_length{cluster=~"$cluster"}, dc)',
+          label='DataCenter',
+          refresh='time',
+          includeAll=true,
+          allValues='.*',
+        )
+      )
+      .addTemplate(
+        template.new(
+          'rack',
+          '$PROMETHEUS_DS',
+          'label_values(collectd_collectd_queue_length{cluster=~"$cluster", dc=~"$dc"}, rack)',
+          label='Rack',
+          refresh='time',
+          includeAll=true,
+          allValues='.*',
+        )
+      )
+      .addTemplate(
+        template.new(
+          'node',
+          '$PROMETHEUS_DS',
+          'label_values(collectd_collectd_queue_length{cluster=~"$cluster", dc=~"$dc", rack=~"$rack"}, instance)',
+          label='Node',
+          refresh='time',
+          includeAll=true,
+          allValues='.*',
+        )
+      )
+      .addRow(
+        row.new(title='', height='50px')
+        .addPanel(textPanel.new(transparent=true))
+        .addPanel(
+          textPanel.new(
+            transparent=true,
+            mode='html',
+            content=' ',
+          )
+        )
+        .addPanel(textPanel.new(transparent=true))
+      )
+      .addRow(
+        row.new(title='Request Throughputs (Coordinator Perspective)')
+        .addPanel(
+          graphPanel.new(
+            'Request Throughputs',
+            description='Total Requests Per Cluster, by Request Type',
+            format='rps',
+            datasource='$PROMETHEUS_DS',
+            transparent=true,
+            fill=0,
+            legend_show=true,
+            legend_values=true,
+            legend_current=true,
+            legend_alignAsTable=true,
+            legend_sort='current',
+            legend_sortDesc=true,
+            shared_tooltip=false,
+            min=0,
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum by (cluster, request_type) (rate(' + $._config.metricPrefix + '_client_request_latency_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
+              legendFormat='{{request_type}}',
+            )
+          )
+        )
+        .addPanel(
+          graphPanel.new(
+            'Error throughputs',
+            description='Total Timeouts, Failures, Unavailable Rates for each cluster',
+            format='rps',
+            datasource='$PROMETHEUS_DS',
+            transparent=true,
+            fill=0,
+            legend_show=true,
+            legend_values=true,
+            legend_current=true,
+            legend_alignAsTable=true,
+            legend_sort='current',
+            legend_sortDesc=true,
+            shared_tooltip=false,
+            min=0,
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum by (cluster, request_type) (rate(' + $._config.metricPrefix + '_client_request_failures_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
+              legendFormat='{{request_type}} failures',
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum by (cluster, request_type) (rate(' + $._config.metricPrefix + '_client_request_timeouts_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
+              legendFormat='{{request_type}} timeouts',
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum by (cluster, request_type) (rate(' + $._config.metricPrefix + '_client_request_unavailables_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
+              legendFormat='{{request_type}} unavailable errors',
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum by (cluster, request_type) (rate(' + $._config.metricPrefix + '_client_request_unfinished_commit_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
+              legendFormat='{{request_type}} unfinished commit errors',
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum by (cluster, request_type) (rate(' + $._config.metricPrefix + '_client_request_condition_not_met_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
+              legendFormat='{{request_type}} condition not met errors',
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum by (cluster, request_type) (rate(' + $._config.metricPrefix + '_client_request_contention_histogram_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
+              legendFormat='{{request_type}} contention histogram errors',
+            )
+          )
+        )
+        .addPanel(
+          singleStatPanel.new(
+            'Read / Write Distribution',
+            description='Part of reads in the total of standard requests (Reads+Writes). CAS, Views, ... operations are ignored.',
+            format='percentunit',
+            datasource='$PROMETHEUS_DS',
+            transparent=true,
+            postfix=' Reads',
+            postfixFontSize='30%',
+            valueFontSize='30%',
+            valueName='current',
+            decimals=2,
+            thresholds='0.25,0.5,0.75',
+            timeFrom='',
+            colors=[
+              '#DEB6F2',
+              '#CA95E5',
+              '#8F3BB8',
+            ],
+            gaugeShow=true,
+            gaugeMinValue=0,
+            gaugeMaxValue=1,
+            gaugeThresholdLabels=true,
+            gaugeThresholdMarkers=false,
+            sparklineFillColor='rgba(31, 118, 189, 0.18)',
+            sparklineFull=false,
+            sparklineLineColor='#FFB357',
+            sparklineShow=false
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum by (cluster, request_type) (rate(' + $._config.metricPrefix + '_client_request_latency_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node", request_type="read"}[1m:30s])) / ignoring (request_type) (sum by (cluster, request_type) (rate(' + $._config.metricPrefix + '_client_request_latency_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node", request_type="read"}[1m:30s])) + ignoring (request_type) sum by (cluster, request_type) (rate(' + $._config.metricPrefix + '_client_request_latency_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node", request_type="write"}[1m:30s])))',
+            )
+          )
+        )
+        .addPanel(
+          graphPanel.new(
+            'Read Latency (98 - 999th percentile)',
+            description='Read latency for coordinated reads',
+            format='µs',
+            datasource='$PROMETHEUS_DS',
+            transparent=true,
+            fill=0,
+            legend_show=true,
+            legend_values=true,
+            legend_current=true,
+            legend_alignAsTable=true,
+            legend_sort='current',
+            legend_sortDesc=true,
+            shared_tooltip=false,
+            min=0,
+          )
+          .addTarget(
+            prometheus.target(
+              expr='histogram_quantile(0.98, sum(rate(' + $._config.metricPrefix + '_client_request_latency_bucket{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node", request_type="read"}[5m])) by (le, cluster))',
+              legendFormat='p98',
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='histogram_quantile(0.99, sum(rate(' + $._config.metricPrefix + '_client_request_latency_bucket{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node", request_type="read"}[5m])) by (le, cluster))',
+              legendFormat='p99',
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='histogram_quantile(0.999, sum(rate(' + $._config.metricPrefix + '_client_request_latency_bucket{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node", request_type="read"}[5m])) by (le, cluster))',
+              legendFormat='p999',
+            )
+          )
+          .addSeriesOverride(fillLatencySeriesOverrides)
+          .addSeriesOverride(removeMinLatencySeriesOverrides)
+        )
+        .addPanel(
+          graphPanel.new(
+            'Write Latency (98th - p999 Percentile)',
+            description='Write latency for coordinated writes',
+            format='µs',
+            datasource='$PROMETHEUS_DS',
+            transparent=true,
+            fill=0,
+            legend_show=true,
+            legend_values=true,
+            legend_current=true,
+            legend_alignAsTable=true,
+            legend_sort='current',
+            legend_sortDesc=true,
+            shared_tooltip=false,
+            min=0,
+          )
+          .addTarget(
+            prometheus.target(
+              expr='histogram_quantile(0.98, sum(rate(' + $._config.metricPrefix + '_client_request_latency_bucket{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node", request_type="write"}[5m])) by (le, cluster))',
+              legendFormat='p98',
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='histogram_quantile(0.99, sum(rate(' + $._config.metricPrefix + '_client_request_latency_bucket{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node", request_type="write"}[5m])) by (le, cluster))',
+              legendFormat='p99',
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='histogram_quantile(0.999, sum(rate(' + $._config.metricPrefix + '_client_request_latency_bucket{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node", request_type="write"}[5m])) by (le, cluster))',
+              legendFormat='p999',
+            )
+          )
+          .addSeriesOverride(fillLatencySeriesOverrides)
+          .addSeriesOverride(removeMinLatencySeriesOverrides)
+        )
+        .addPanel(
+          graphPanel.new(
+            'Other Latencies',
+            description='Other p99 latencies for coordinated requests',
+            format='µs',
+            datasource='$PROMETHEUS_DS',
+            transparent=true,
+            fill=0,
+            legend_show=true,
+            legend_values=true,
+            legend_current=true,
+            legend_alignAsTable=true,
+            legend_sort='current',
+            legend_sortDesc=true,
+            shared_tooltip=false,
+            min=0,
+          )
+          .addTarget(
+            prometheus.target(
+              // In scope!~"Write|Read|.*-.*", we want to exclude charts above and all the per-consistency_level info like "Read-LOCAL_ONE"
+              expr='histogram_quantile(0.99, sum(rate(' + $._config.metricPrefix + '_client_request_latency_bucket{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node", request_type!~"write|read|.*-.*"}[1m:30s])) by (le, request_type, cluster))',
+              legendFormat='p99 {{request_type}}'
+            )
+          )
+        )
+      )
+      .addRow(
+        row.new(title='Nodes Status',)
+        .addPanel(
+          polystatPanel.new(
+            'Nodes Status',
+            description="Nodes Status uses Internal/Gossip activity. Be mindful that if Native or Thrift protocol are disabled, the nodes won't be reachable, and still marked up",
+            datasource='$PROMETHEUS_DS',
+            transparent=true,
+            span=12,
+            global_unit_format='none',
+            global_operator_name='current',
+            global_thresholds=[
+              {
+                value: 0,
+                state: 2,
+                color: '#d44a3a',
+              },
+              {
+                value: 1,
+                state: 0,
+                color: '#299c46',
+              },
+            ],
+            range_maps=[
+              {
+                from: '0',
+                to: '0.9999',
+                text: 'DOWN',
+              },
+              {
+                from: '1',
+                to: '1',
+                text: 'UP',
+              },
+            ],
+            mapping_type=2,
+            value_enabled=true,
+          )
+          .addTarget(
+            prometheus.target(
+              'max by (cluster, dc, rack, instance) (changes(' + $._config.metricPrefix + '_thread_pools_completed_tasks{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node", pool_name="gossip_stage"}[2m:30s])) > bool 0',
+              legendFormat='{{instance}}',
+              instant=true,
+            )
+          )
+        )
+        .addPanel(
+          singleStatPanel.new(
+            'Nodes Count',
+            description='Nodes up and down in the cluster',
+            format='short',
+            datasource='$PROMETHEUS_DS',
+            transparent=true,
+            decimals=0,
+            prefix='Total:',
+            postfix=' Nodes',
+            postfixFontSize='80%',
+            valueFontSize='80%',
+            span=4
+          )
+          .addTarget(
+            prometheus.target(
+              expr='count by (cluster) (max by (cluster, dc, rack, instance) (collectd_collectd_queue_length{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}))',
+              legendFormat='Total Number Of Nodes',
+            )
+          )
+        )
+        .addPanel(
+          graphPanel.new(
+            'Nodes Status History',
+            description='Nodes up and down in the cluster per protocol/activity',
+            format='short',
+            datasource='$PROMETHEUS_DS',
+            transparent=true,
+            decimals=0,
+            fill=0,
+            legend_show=true,
+            legend_values=true,
+            legend_current=true,
+            legend_alignAsTable=true,
+            legend_sort='current',
+            legend_sortDesc=false,
+            shared_tooltip=false,
+            min=0,
+            span=8
+          )
+          .addTarget(
+            prometheus.target(
+              expr='count by (cluster) (max by (cluster, dc, rack, instance) (collectd_collectd_queue_length{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}))',
+              legendFormat='Total Number Of Nodes',
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum by (cluster) (max by (cluster, datacenter, rack, instance) (changes(' + $._config.metricPrefix + '_thread_pools_completed_tasks{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node", pool_name="native"}[2m:30s])) > bool 0)',
+              legendFormat='Nodes Coordinating Requests (Native protocol)',
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum by (cluster) (max by (cluster, datacenter, rack, instance) (changes(' + $._config.metricPrefix + '_thread_pools_completed_tasks{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node", pool_name="gossip_stage"}[2m:30s])) > bool 0)',
+              legendFormat='Nodes With Internal Activity (Gossip protocol)',
+            )
+          )
+        )
+      )
+      .addRow(
+        row.new(title='Data Status')
+        .addPanel(
+          tablePanel.new(
+            'Disk Space Usage',
+            description='Disk space used ordered (fullest disks first)',
+            datasource='$PROMETHEUS_DS',
+            transform='timeseries_aggregations',
+            transparent=true,
+            styles=[
+              {
+                alias: 'Node --> Mounting Point',
+                colorMode: null,
+                colors: [
+                  'rgba(245, 54, 54, 0.9)',
+                  'rgba(237, 129, 40, 0.89)',
+                  'rgba(50, 172, 45, 0.97)',
+                ],
+                dateFormat: 'YYYY-MM-DD HH:mm:ss',
+                decimals: 2,
+                mappingType: 1,
+                pattern: 'Metric',
+                preserveFormat: true,
+                sanitize: true,
+                thresholds: [],
+                type: 'string',
+                unit: 'short',
+              },
+              {
+                alias: '% Disk Space Used',
+                colorMode: 'row',
+                colors: [
+                  'rgba(50, 172, 45, 0.97)',
+                  'rgba(237, 129, 40, 0.89)',
+                  'rgba(245, 54, 54, 0.9)',
+                ],
+                dateFormat: 'YYYY-MM-DD HH:mm:ss',
+                decimals: 2,
+                link: false,
+                mappingType: 1,
+                pattern: 'Current',
+                thresholds: [
+                  '0.5',
+                  '0.75',
+                ],
+                type: 'number',
+                unit: 'percentunit',
+              },
+            ],
+            columns=[
+              {
+                text: 'Current',
+                value: 'current',
+              },
+            ],
+            sort={
+              col: 1,
+              desc: true,
+            }
+          )
+          .addTarget(
+            prometheus.target(
+              expr='min by (instance, df) (1-(collectd_df_df_complex{df!~".*lxcfs.*", cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node", type="free"}\n        / ignoring (type) (collectd_df_df_complex{df!~".*lxcfs.*", cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node", type="used"}\n          + ignoring (type) collectd_df_df_complex{df!~".*lxcfs.*", cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node", type="reserved"}\n          + ignoring (type) collectd_df_df_complex{df!~".*lxcfs.*", cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node", type="free"}))\n        )',
+              legendFormat='{{cluster}}-{{instance}} --> {{df}}',
+              instant=true
+            )
+          )
+        )
+        .addPanel(
+          graphPanel.new(
+            'Cassandra cluster Data Size',
+            description='Total sizes of the data on distinct nodes',
+            format='bytes',
+            datasource='$PROMETHEUS_DS',
+            transparent=true,
+            fill=0,
+            legend_show=true,
+            legend_values=true,
+            legend_current=true,
+            legend_alignAsTable=true,
+            legend_sort='current',
+            legend_sortDesc=true,
+            shared_tooltip=false,
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum by (cluster) (' + $._config.metricPrefix + '_table_live_disk_space_used_total{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
+              legendFormat='Live space - {{cluster}}',
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum by (cluster) (' + $._config.metricPrefix + '_table_total_disk_space_used_total{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
+              legendFormat='Total space - {{cluster}}',
+            )
+          )
+        )
+        .addPanel(
+          graphPanel.new(
+            'SSTable Count',
+            description='SSTable Count Max and Average per table',
+            format='short',
+            datasource='$PROMETHEUS_DS',
+            transparent=true,
+            fill=0,
+            legend_show=true,
+            legend_values=true,
+            legend_current=true,
+            legend_alignAsTable=true,
+            legend_sort='current',
+            legend_sortDesc=true,
+            shared_tooltip=false,
+            min=0,
+          )
+          .addTarget(
+            prometheus.target(
+              expr='max by (cluster, keyspace, table) (' + $._config.metricPrefix + '_table_live_ss_table_count{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
+              legendFormat='Table - {{keyspace}}.{{table}}',
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='max by (cluster) (' + $._config.metricPrefix + '_table_live_ss_table_count{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
+              legendFormat='Max in cluster - {{cluster}}',
+            )
+          )
+        )
+        .addPanel(
+          graphPanel.new(
+            'Pending Compactions',
+            description='Maximum pending compactions on any node in the cluster',
+            format='short',
+            datasource='$PROMETHEUS_DS',
+            transparent=true,
+            fill=0,
+            legend_show=true,
+            legend_values=true,
+            legend_current=true,
+            legend_alignAsTable=true,
+            legend_sort='current',
+            legend_sortDesc=true,
+            shared_tooltip=false,
+            min=0,
+            bars=false,
+            lines=true,
+            stack=false,
+            decimals=0,
+          )
+          .addTarget(
+            prometheus.target(
+              expr='max by (cluster) (' + $._config.metricPrefix + '_table_pending_compactions{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
+              legendFormat='max',
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='min by (cluster) (' + $._config.metricPrefix + '_table_pending_compactions{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
+              legendFormat='min',
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='avg by (cluster) (' + $._config.metricPrefix + '_table_pending_compactions{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
+              legendFormat='avg',
+            )
+          )
+          .addSeriesOverride(fillMinMaxSeriesOverrides)
+          .addSeriesOverride(removeMinlineSeriesOverrides)
+        )
+        .addPanel(
+          graphPanel.new(
+            'Pending Compactions per Table',
+            description='Maximum pending compactions per table',
+            format='short',
+            datasource='$PROMETHEUS_DS',
+            transparent=true,
+            fill=0,
+            legend_show=true,
+            legend_values=true,
+            legend_current=true,
+            legend_alignAsTable=true,
+            legend_sort='current',
+            legend_sortDesc=true,
+            shared_tooltip=false,
+            min=0,
+            bars=false,
+            lines=true,
+            stack=true,
+            decimals=0,
+          )
+          .addTarget(
+            prometheus.target(
+              expr='max by (cluster, keyspace, table) (' + $._config.metricPrefix + '_table_pending_compactions{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
+              legendFormat='max for {{keyspace}}.{{table}}',
+            )
+          )
+        )
+      )
+      .addRow(
+        row.new(title='Cassandra Internals')
+        .addPanel(
+          graphPanel.new(
+            'Pending Tasks',
+            description='Cluster wide pending threads, by thread pool name',
+            format='short',
+            datasource='$PROMETHEUS_DS',
+            transparent=true,
+            fill=0,
+            legend_show=true,
+            legend_values=true,
+            legend_current=true,
+            legend_alignAsTable=true,
+            legend_sort='current',
+            legend_sortDesc=true,
+            shared_tooltip=false,
+            min=0,
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum by (cluster, pool_name) (' + $._config.metricPrefix + '_thread_pools_pending_tasks{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
+              legendFormat='{{cluster}} - pending {{pool_name}}',
+            )
+          )
+        )
+        .addPanel(
+          graphPanel.new(
+            'Blocked Tasks',
+            description='Cluster wide blocked threads, by thread pool name',
+            format='short',
+            datasource='$PROMETHEUS_DS',
+            transparent=true,
+            fill=0,
+            legend_show=true,
+            legend_values=true,
+            legend_current=true,
+            legend_alignAsTable=true,
+            legend_sort='current',
+            legend_sortDesc=true,
+            shared_tooltip=false,
+            min=0,
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum by (cluster, pool_name) (rate(' + $._config.metricPrefix + '_thread_pools_total_blocked_tasks_total{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
+              legendFormat='{{cluster}} - blocked {{pool_name}}',
+            )
+          )
+        )
+        .addPanel(
+          graphPanel.new(
+            'Dropped Messages',
+            description='Dropped messages rate summed by message type and cluster',
+            format='short',
+            datasource='$PROMETHEUS_DS',
+            transparent=true,
+            fill=0,
+            legend_show=true,
+            legend_values=true,
+            legend_current=true,
+            legend_alignAsTable=true,
+            legend_sort='current',
+            legend_sortDesc=true,
+            shared_tooltip=false,
+            min=0,
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum by (cluster, message_type) (rate(' + $._config.metricPrefix + '_dropped_message_dropped_total{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
+              legendFormat='{{cluster}} - dropped {{message_type}}',
+            )
+          )
+        )
+        .addPanel(
+          graphPanel.new(
+            'Active Tasks',
+            description='active threads summed per cluster',
+            format='short',
+            datasource='$PROMETHEUS_DS',
+            transparent=true,
+            fill=0,
+            legend_show=true,
+            legend_values=true,
+            legend_current=true,
+            legend_alignAsTable=true,
+            legend_sort='current',
+            legend_sortDesc=true,
+            shared_tooltip=false,
+            min=0,
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum by (cluster, pool_name) (' + $._config.metricPrefix + '_thread_pools_active_tasks{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
+              legendFormat='{{cluster}} - active {{pool_name}}',
+            )
+          )
+        )
+        .addPanel(
+          graphPanel.new(
+            'Hinted Handoff',
+            description='Sum of hints being handed off per cluster.',
+            format='short',
+            datasource='$PROMETHEUS_DS',
+            transparent=true,
+            fill=0,
+            legend_show=true,
+            legend_values=true,
+            legend_current=true,
+            legend_alignAsTable=true,
+            legend_sort='current',
+            legend_sortDesc=true,
+            shared_tooltip=false,
+            min=0,
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum by (cluster) (' + $._config.metricPrefix + '_storage_total_hints_in_progress_total{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
+              legendFormat='count',
+            )
+          )
+        )
+      )
+      .addRow(
+        row.new(title='Hardware / Operating System')
+        .addPanel(
+          graphPanel.new(
+            'CPU Utilization',
+            description='Maximum CPU utilisation (max 100%)',
+            format='percentunit',
+            datasource='$PROMETHEUS_DS',
+            transparent=true,
+            fill=0,
+            legend_show=true,
+            legend_values=true,
+            legend_current=true,
+            legend_alignAsTable=true,
+            legend_sort='current',
+            legend_sortDesc=true,
+            shared_tooltip=false,
+            percentage=true,
+            decimals=1,
+            min=0,
+            max=1,
+          )
+          .addTarget(
+            prometheus.target(
+              expr='max by (cluster) (1 - (sum by (cluster, dc, rack, instance) (rate(collectd_cpu_total{type="idle", cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s])) / sum by (cluster, dc, rack, instance) (rate(collectd_cpu_total{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))))',
+              legendFormat='max',
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='min by (cluster) (1 - (sum by (cluster, dc, rack, instance) (rate(collectd_cpu_total{type="idle", cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s])) / sum by (cluster, dc, rack, instance) (rate(collectd_cpu_total{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))))',
+              legendFormat='min',
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='avg by (cluster) (1 - (sum by (cluster, dc, rack, instance) (rate(collectd_cpu_total{type="idle", cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s])) / sum by (cluster, dc, rack, instance) (rate(collectd_cpu_total{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))))',
+              legendFormat='avg',
+            )
+          )
+          .addSeriesOverride(fillMinMaxSeriesOverrides)
+          .addSeriesOverride(removeMinlineSeriesOverrides)
+        )
+        .addPanel(
+          graphPanel.new(
+            'Unix Load (1m rate)',
+            description='Max Unix load on a node for a cluster',
+            format='short',
+            datasource='$PROMETHEUS_DS',
+            transparent=true,
+            fill=0,
+            legend_show=true,
+            legend_values=true,
+            legend_current=true,
+            legend_alignAsTable=true,
+            legend_sort='current',
+            legend_sortDesc=true,
+            shared_tooltip=false,
+          )
+          .addTarget(
+            prometheus.target(
+              expr='max by (cluster) (collectd_load_shortterm{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
+              legendFormat='max',
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              'min by (cluster) (collectd_load_shortterm{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
+              legendFormat='min',
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              'avg by (cluster) (collectd_load_shortterm{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
+              legendFormat='avg',
+            )
+          )
+          .addSeriesOverride(fillMinMaxSeriesOverrides)
+          .addSeriesOverride(removeMinlineSeriesOverrides)
+        )
+        .addPanel(
+          graphPanel.new(
+            'Memory Utilisation',
+            description='Maximum Memory allocated per usage (worst node) - excludes caches, buffers, etc',
+            format='bytes',
+            datasource='$PROMETHEUS_DS',
+            transparent=true,
+            legend_show=true,
+            legend_values=true,
+            legend_current=true,
+            legend_alignAsTable=true,
+            legend_sort='current',
+            legend_sortDesc=true,
+            shared_tooltip=false,
+            fill=1,
+            linewidth=2,
+          )
+          .addTarget(
+            prometheus.target(
+              expr='min by (cluster) (sum by (cluster, dc, rack, instance) (collectd_memory{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}))',
+              legendFormat='min memory available',
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='max by (cluster, memory) (sum by (cluster, dc, rack, instance, memory) (collectd_memory{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}))',
+              legendFormat='max memory {{memory}}',
+            )
+          )
+        )
+        .addPanel(
+          graphPanel.new(
+            'Disk Read Thoughput',
+            description='Disk read throughput',
+            format='bps',
+            datasource='$PROMETHEUS_DS',
+            transparent=true,
+            fill=0,
+            legend_show=true,
+            legend_values=true,
+            legend_current=true,
+            legend_alignAsTable=true,
+            legend_sort='current',
+            legend_sortDesc=true,
+            shared_tooltip=false,
+          )
+          .addTarget(
+            prometheus.target(
+              expr='max by (cluster) (rate(collectd_processes_disk_octets_read_total{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
+              legendFormat='max',
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              'min by (cluster) (rate(collectd_processes_disk_octets_read_total{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
+              legendFormat='min',
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              'avg by (cluster) (rate(collectd_processes_disk_octets_read_total{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
+              legendFormat='avg',
+            )
+          )
+          .addSeriesOverride(fillMinMaxSeriesOverrides)
+          .addSeriesOverride(removeMinlineSeriesOverrides)
+        )
+        .addPanel(
+          graphPanel.new(
+            'Disk Write Thoughput',
+            description='Disk write throughput',
+            format='bps',
+            datasource='$PROMETHEUS_DS',
+            transparent=true,
+            fill=0,
+            legend_show=true,
+            legend_values=true,
+            legend_current=true,
+            legend_alignAsTable=true,
+            legend_sort='current',
+            legend_sortDesc=true,
+            shared_tooltip=false,
+          )
+          .addTarget(
+            prometheus.target(
+              expr='max by (cluster) (rate(collectd_processes_disk_octets_write_total{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
+              legendFormat='max',
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              'min by (cluster) (rate(collectd_processes_disk_octets_write_total{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
+              legendFormat='min',
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              'avg by (cluster) (rate(collectd_processes_disk_octets_write_total{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
+              legendFormat='avg',
+            )
+          )
+          .addSeriesOverride(fillMinMaxSeriesOverrides)
+          .addSeriesOverride(removeMinlineSeriesOverrides)
+        )
+        .addPanel(
+          graphPanel.new(
+            'Network I/O',
+            description='Network In and Out per cluster',
+            format='bytes',
+            datasource='$PROMETHEUS_DS',
+            transparent=true,
+            fill=1,
+            legend_show=true,
+            legend_values=true,
+            legend_current=true,
+            legend_alignAsTable=true,
+            legend_sort='current',
+            legend_sortDesc=true,
+            shared_tooltip=false,
+            bars=false,
+          )
+          .addTarget(
+            prometheus.target(
+              'sum by (cluster) (rate(collectd_interface_if_octets_rx_total{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
+              legendFormat='outgoing',
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              'sum by (cluster) (rate(collectd_interface_if_octets_rx_total{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
+              legendFormat='incoming',
+            )
+          )
+          .addSeriesOverride({
+            alias: 'incoming',
+            transform: 'negative-Y',
+          })
+
+        )
+      )
+      .addRow(
+        row.new(title='JVM / Garbage Collection')
+        .addPanel(
+          graphPanel.new(
+            'Application Throughput (% time NOT doing GC)',
+            description='Percentage of the time the node is *not* doing a GC, thus Cassandra is not stopped for GC',
+            format='percentunit',
+            datasource='$PROMETHEUS_DS',
+            transparent=true,
+            fill=0,
+            legend_show=true,
+            legend_values=true,
+            legend_current=true,
+            legend_alignAsTable=true,
+            legend_sort='current',
+            legend_sortDesc=true,
+            shared_tooltip=false,
+            decimals=2,
+            min=0,
+            max=1,
+          )
+          .addTarget(
+            prometheus.target(
+              'max by (cluster) (1 - (sum by (cluster, dc, rack, instance) (rate(' + $._config.metricPrefix + '_jvm_gc_time{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s])) / 1000))',
+              legendFormat='max',
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              'min by (cluster) (1 - (sum by (cluster, dc, rack, instance) (rate(' + $._config.metricPrefix + '_jvm_gc_time{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s])) / 1000))',
+              legendFormat='min',
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              'avg by (cluster) (1 - (sum by (cluster, dc, rack, instance) (rate(' + $._config.metricPrefix + '_jvm_gc_time{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s])) / 1000))',
+              legendFormat='avg',
+            )
+          )
+          .addSeriesOverride(fillMinMaxSeriesOverrides)
+          .addSeriesOverride(removeMinlineSeriesOverrides)
+        )
+        .addPanel(
+          graphPanel.new(
+            'Garbage Collection Time',
+            description='Garbage collection duration',
+            format='ms',
+            datasource='$PROMETHEUS_DS',
+            transparent=true,
+            fill=0,
+            legend_show=true,
+            legend_values=true,
+            legend_current=true,
+            legend_alignAsTable=true,
+            legend_sort='current',
+            legend_sortDesc=true,
+            shared_tooltip=false,
+          )
+          .addTarget(
+            prometheus.target(
+              'max by (cluster) (rate(' + $._config.metricPrefix + '_jvm_gc_time{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
+              legendFormat='max',
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              'min by (cluster) (rate(' + $._config.metricPrefix + '_jvm_gc_time{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
+              legendFormat='min',
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              'avg by (cluster) (rate(' + $._config.metricPrefix + '_jvm_gc_time{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
+              legendFormat='avg',
+            )
+          )
+          .addSeriesOverride(fillMinMaxSeriesOverrides)
+          .addSeriesOverride(removeMinlineSeriesOverrides)
+        )
+        .addPanel(
+          graphPanel.new(
+            'JVM Heap Memory Utilisation',
+            description='Maximum JVM Heap Memory size (worst node) and minimum available heap size',
+            format='bytes',
+            datasource='$PROMETHEUS_DS',
+            transparent=true,
+            legend_show=true,
+            legend_values=true,
+            legend_current=true,
+            legend_alignAsTable=true,
+            legend_sort='current',
+            legend_sortDesc=true,
+            shared_tooltip=false,
+            fill=1,
+            linewidth=2,
+          )
+          .addTarget(
+            prometheus.target(
+              'max by (cluster)\n        (' + $._config.metricPrefix + '_jvm_memory_used{memory_type="heap", cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
+              legendFormat='max',
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              'min by (cluster)\n        (' + $._config.metricPrefix + '_jvm_memory_used{memory_type="heap", cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
+              legendFormat='min',
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              'avg by (cluster)\n        (' + $._config.metricPrefix + '_jvm_memory_used{memory_type="heap", cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
+              legendFormat='avg',
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              'min by ( cluster)\n        (' + $._config.metricPrefix + '_jvm_memory_max{memory_type="heap", cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
+              legendFormat='Heap memory available',
+            )
+          )
+          .addSeriesOverride(fillMinMaxSeriesOverrides)
+          .addSeriesOverride(removeMinlineSeriesOverrides)
+        )
+      ),
+  },
+}
diff --git a/mixin/dashboards/system-metrics.libsonnet b/mixin/dashboards/system-metrics.libsonnet
new file mode 100644
index 0000000..ed70c34
--- /dev/null
+++ b/mixin/dashboards/system-metrics.libsonnet
@@ -0,0 +1,908 @@
+local grafana = import 'github.com/grafana/grafonnet-lib/grafonnet/grafana.libsonnet';
+
+local dashboard = grafana.dashboard;
+local row = grafana.row;
+local singlestat = grafana.singlestat;
+local graphpanel = grafana.graphPanel;
+local text = grafana.text;
+local prometheus = grafana.prometheus;
+local template = grafana.template;
+
+local textstatHeight = 100;
+local graphHeight = 250;
+local singlestatHeight = 125;
+local singlestatSpan = 2;
+local graphSpan = 6;
+
+{
+  _config+:: {
+    metricPrefix: error 'must provide metric prefix',
+  },
+  grafanaDashboards+:: {
+    'system-metrics.json':
+      dashboard.new(
+        'System & Node Metrics',
+        description='Operating System Metrics and Apache Cassandra Node Information',
+        schemaVersion=14,
+        time_from='now-30m',
+        refresh='1m',
+        tags=['os'],
+        style='dark'
+      )
+      .addTemplate(
+        template.datasource(
+          'PROMETHEUS_DS',
+          'prometheus',
+          'Prometheus',
+          hide='all',
+        )
+      )
+      .addTemplate(
+        template.interval(
+          'rate',
+          '1m,5m,10m,30m,1h,6h,12h,1d,7d,14d,30d',
+          '5m',
+          label='Rate',
+        )
+      )
+      .addTemplate(
+        template.new(
+          'host',
+          '$PROMETHEUS_DS',
+          'label_values(collectd_collectd_queue_length{}, instance)',
+          label='Host',
+          refresh='time',
+        )
+      )
+      .addPanel(
+        text.new(
+          transparent=true,
+          mode='html',
+          content='
',
+          )
+        )
+        .addPanel(textPanel.new(transparent=true))
+      )
+      .addRow(
+        row.new(title='Request Throughputs (Coordinator Perspective)')
+        .addPanel(
+          graphPanel.new(
+            'Request Throughputs',
+            description='Total Requests Per Cluster, by Request Type',
+            format='rps',
+            datasource='$PROMETHEUS_DS',
+            transparent=true,
+            fill=0,
+            legend_show=true,
+            legend_values=true,
+            legend_current=true,
+            legend_alignAsTable=true,
+            legend_sort='current',
+            legend_sortDesc=true,
+            shared_tooltip=false,
+            min=0,
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum by (cluster, request_type) (rate(' + $._config.metricPrefix + '_client_request_latency_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
+              legendFormat='{{request_type}}',
+            )
+          )
+        )
+        .addPanel(
+          graphPanel.new(
+            'Error throughputs',
+            description='Total Timeouts, Failures, Unavailable Rates for each cluster',
+            format='rps',
+            datasource='$PROMETHEUS_DS',
+            transparent=true,
+            fill=0,
+            legend_show=true,
+            legend_values=true,
+            legend_current=true,
+            legend_alignAsTable=true,
+            legend_sort='current',
+            legend_sortDesc=true,
+            shared_tooltip=false,
+            min=0,
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum by (cluster, request_type) (rate(' + $._config.metricPrefix + '_client_request_failures_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
+              legendFormat='{{request_type}} failures',
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum by (cluster, request_type) (rate(' + $._config.metricPrefix + '_client_request_timeouts_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
+              legendFormat='{{request_type}} timeouts',
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum by (cluster, request_type) (rate(' + $._config.metricPrefix + '_client_request_unavailables_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
+              legendFormat='{{request_type}} unavailable errors',
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum by (cluster, request_type) (rate(' + $._config.metricPrefix + '_client_request_unfinished_commit_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
+              legendFormat='{{request_type}} unfinished commit errors',
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum by (cluster, request_type) (rate(' + $._config.metricPrefix + '_client_request_condition_not_met_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
+              legendFormat='{{request_type}} condition not met errors',
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum by (cluster, request_type) (rate(' + $._config.metricPrefix + '_client_request_contention_histogram_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
+              legendFormat='{{request_type}} contention histogram errors',
+            )
+          )
+        )
+        .addPanel(
+          singleStatPanel.new(
+            'Read / Write Distribution',
+            description='Part of reads in the total of standard requests (Reads+Writes). CAS, Views, ... operations are ignored.',
+            format='percentunit',
+            datasource='$PROMETHEUS_DS',
+            transparent=true,
+            postfix=' Reads',
+            postfixFontSize='30%',
+            valueFontSize='30%',
+            valueName='current',
+            decimals=2,
+            thresholds='0.25,0.5,0.75',
+            timeFrom='',
+            colors=[
+              '#DEB6F2',
+              '#CA95E5',
+              '#8F3BB8',
+            ],
+            gaugeShow=true,
+            gaugeMinValue=0,
+            gaugeMaxValue=1,
+            gaugeThresholdLabels=true,
+            gaugeThresholdMarkers=false,
+            sparklineFillColor='rgba(31, 118, 189, 0.18)',
+            sparklineFull=false,
+            sparklineLineColor='#FFB357',
+            sparklineShow=false
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum by (cluster, request_type) (rate(' + $._config.metricPrefix + '_client_request_latency_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node", request_type="read"}[1m:30s])) / ignoring (request_type) (sum by (cluster, request_type) (rate(' + $._config.metricPrefix + '_client_request_latency_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node", request_type="read"}[1m:30s])) + ignoring (request_type) sum by (cluster, request_type) (rate(' + $._config.metricPrefix + '_client_request_latency_total{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node", request_type="write"}[1m:30s])))',
+            )
+          )
+        )
+        .addPanel(
+          graphPanel.new(
+            'Read Latency (98 - 999th percentile)',
+            description='Read latency for coordinated reads',
+            format='µs',
+            datasource='$PROMETHEUS_DS',
+            transparent=true,
+            fill=0,
+            legend_show=true,
+            legend_values=true,
+            legend_current=true,
+            legend_alignAsTable=true,
+            legend_sort='current',
+            legend_sortDesc=true,
+            shared_tooltip=false,
+            min=0,
+          )
+          .addTarget(
+            prometheus.target(
+              expr='histogram_quantile(0.98, sum(rate(' + $._config.metricPrefix + '_client_request_latency_bucket{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node", request_type="read"}[5m])) by (le, cluster))',
+              legendFormat='p98',
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='histogram_quantile(0.99, sum(rate(' + $._config.metricPrefix + '_client_request_latency_bucket{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node", request_type="read"}[5m])) by (le, cluster))',
+              legendFormat='p99',
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='histogram_quantile(0.999, sum(rate(' + $._config.metricPrefix + '_client_request_latency_bucket{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node", request_type="read"}[5m])) by (le, cluster))',
+              legendFormat='p999',
+            )
+          )
+          .addSeriesOverride(fillLatencySeriesOverrides)
+          .addSeriesOverride(removeMinLatencySeriesOverrides)
+        )
+        .addPanel(
+          graphPanel.new(
+            'Write Latency (98th - p999 Percentile)',
+            description='Write latency for coordinated writes',
+            format='µs',
+            datasource='$PROMETHEUS_DS',
+            transparent=true,
+            fill=0,
+            legend_show=true,
+            legend_values=true,
+            legend_current=true,
+            legend_alignAsTable=true,
+            legend_sort='current',
+            legend_sortDesc=true,
+            shared_tooltip=false,
+            min=0,
+          )
+          .addTarget(
+            prometheus.target(
+              expr='histogram_quantile(0.98, sum(rate(' + $._config.metricPrefix + '_client_request_latency_bucket{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node", request_type="write"}[5m])) by (le, cluster))',
+              legendFormat='p98',
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='histogram_quantile(0.99, sum(rate(' + $._config.metricPrefix + '_client_request_latency_bucket{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node", request_type="write"}[5m])) by (le, cluster))',
+              legendFormat='p99',
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='histogram_quantile(0.999, sum(rate(' + $._config.metricPrefix + '_client_request_latency_bucket{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node", request_type="write"}[5m])) by (le, cluster))',
+              legendFormat='p999',
+            )
+          )
+          .addSeriesOverride(fillLatencySeriesOverrides)
+          .addSeriesOverride(removeMinLatencySeriesOverrides)
+        )
+        .addPanel(
+          graphPanel.new(
+            'Other Latencies',
+            description='Other p99 latencies for coordinated requests',
+            format='µs',
+            datasource='$PROMETHEUS_DS',
+            transparent=true,
+            fill=0,
+            legend_show=true,
+            legend_values=true,
+            legend_current=true,
+            legend_alignAsTable=true,
+            legend_sort='current',
+            legend_sortDesc=true,
+            shared_tooltip=false,
+            min=0,
+          )
+          .addTarget(
+            prometheus.target(
+              // In scope!~"Write|Read|.*-.*", we want to exclude charts above and all the per-consistency_level info like "Read-LOCAL_ONE"
+              expr='histogram_quantile(0.99, sum(rate(' + $._config.metricPrefix + '_client_request_latency_bucket{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node", request_type!~"write|read|.*-.*"}[1m:30s])) by (le, request_type, cluster))',
+              legendFormat='p99 {{request_type}}'
+            )
+          )
+        )
+      )
+      .addRow(
+        row.new(title='Nodes Status',)
+        .addPanel(
+          polystatPanel.new(
+            'Nodes Status',
+            description="Nodes Status uses Internal/Gossip activity. Be mindful that if Native or Thrift protocol are disabled, the nodes won't be reachable, and still marked up",
+            datasource='$PROMETHEUS_DS',
+            transparent=true,
+            span=12,
+            global_unit_format='none',
+            global_operator_name='current',
+            global_thresholds=[
+              {
+                value: 0,
+                state: 2,
+                color: '#d44a3a',
+              },
+              {
+                value: 1,
+                state: 0,
+                color: '#299c46',
+              },
+            ],
+            range_maps=[
+              {
+                from: '0',
+                to: '0.9999',
+                text: 'DOWN',
+              },
+              {
+                from: '1',
+                to: '1',
+                text: 'UP',
+              },
+            ],
+            mapping_type=2,
+            value_enabled=true,
+          )
+          .addTarget(
+            prometheus.target(
+              'max by (cluster, dc, rack, instance) (changes(' + $._config.metricPrefix + '_thread_pools_completed_tasks{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node", pool_name="gossip_stage"}[2m:30s])) > bool 0',
+              legendFormat='{{instance}}',
+              instant=true,
+            )
+          )
+        )
+        .addPanel(
+          singleStatPanel.new(
+            'Nodes Count',
+            description='Nodes up and down in the cluster',
+            format='short',
+            datasource='$PROMETHEUS_DS',
+            transparent=true,
+            decimals=0,
+            prefix='Total:',
+            postfix=' Nodes',
+            postfixFontSize='80%',
+            valueFontSize='80%',
+            span=4
+          )
+          .addTarget(
+            prometheus.target(
+              expr='count by (cluster) (max by (cluster, dc, rack, instance) (collectd_collectd_queue_length{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}))',
+              legendFormat='Total Number Of Nodes',
+            )
+          )
+        )
+        .addPanel(
+          graphPanel.new(
+            'Nodes Status History',
+            description='Nodes up and down in the cluster per protocol/activity',
+            format='short',
+            datasource='$PROMETHEUS_DS',
+            transparent=true,
+            decimals=0,
+            fill=0,
+            legend_show=true,
+            legend_values=true,
+            legend_current=true,
+            legend_alignAsTable=true,
+            legend_sort='current',
+            legend_sortDesc=false,
+            shared_tooltip=false,
+            min=0,
+            span=8
+          )
+          .addTarget(
+            prometheus.target(
+              expr='count by (cluster) (max by (cluster, dc, rack, instance) (collectd_collectd_queue_length{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}))',
+              legendFormat='Total Number Of Nodes',
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum by (cluster) (max by (cluster, datacenter, rack, instance) (changes(' + $._config.metricPrefix + '_thread_pools_completed_tasks{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node", pool_name="native"}[2m:30s])) > bool 0)',
+              legendFormat='Nodes Coordinating Requests (Native protocol)',
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum by (cluster) (max by (cluster, datacenter, rack, instance) (changes(' + $._config.metricPrefix + '_thread_pools_completed_tasks{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node", pool_name="gossip_stage"}[2m:30s])) > bool 0)',
+              legendFormat='Nodes With Internal Activity (Gossip protocol)',
+            )
+          )
+        )
+      )
+      .addRow(
+        row.new(title='Data Status')
+        .addPanel(
+          tablePanel.new(
+            'Disk Space Usage',
+            description='Disk space used ordered (fullest disks first)',
+            datasource='$PROMETHEUS_DS',
+            transform='timeseries_aggregations',
+            transparent=true,
+            styles=[
+              {
+                alias: 'Node --> Mounting Point',
+                colorMode: null,
+                colors: [
+                  'rgba(245, 54, 54, 0.9)',
+                  'rgba(237, 129, 40, 0.89)',
+                  'rgba(50, 172, 45, 0.97)',
+                ],
+                dateFormat: 'YYYY-MM-DD HH:mm:ss',
+                decimals: 2,
+                mappingType: 1,
+                pattern: 'Metric',
+                preserveFormat: true,
+                sanitize: true,
+                thresholds: [],
+                type: 'string',
+                unit: 'short',
+              },
+              {
+                alias: '% Disk Space Used',
+                colorMode: 'row',
+                colors: [
+                  'rgba(50, 172, 45, 0.97)',
+                  'rgba(237, 129, 40, 0.89)',
+                  'rgba(245, 54, 54, 0.9)',
+                ],
+                dateFormat: 'YYYY-MM-DD HH:mm:ss',
+                decimals: 2,
+                link: false,
+                mappingType: 1,
+                pattern: 'Current',
+                thresholds: [
+                  '0.5',
+                  '0.75',
+                ],
+                type: 'number',
+                unit: 'percentunit',
+              },
+            ],
+            columns=[
+              {
+                text: 'Current',
+                value: 'current',
+              },
+            ],
+            sort={
+              col: 1,
+              desc: true,
+            }
+          )
+          .addTarget(
+            prometheus.target(
+              expr='min by (instance, df) (1-(collectd_df_df_complex{df!~".*lxcfs.*", cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node", type="free"}\n        / ignoring (type) (collectd_df_df_complex{df!~".*lxcfs.*", cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node", type="used"}\n          + ignoring (type) collectd_df_df_complex{df!~".*lxcfs.*", cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node", type="reserved"}\n          + ignoring (type) collectd_df_df_complex{df!~".*lxcfs.*", cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node", type="free"}))\n        )',
+              legendFormat='{{cluster}}-{{instance}} --> {{df}}',
+              instant=true
+            )
+          )
+        )
+        .addPanel(
+          graphPanel.new(
+            'Cassandra cluster Data Size',
+            description='Total sizes of the data on distinct nodes',
+            format='bytes',
+            datasource='$PROMETHEUS_DS',
+            transparent=true,
+            fill=0,
+            legend_show=true,
+            legend_values=true,
+            legend_current=true,
+            legend_alignAsTable=true,
+            legend_sort='current',
+            legend_sortDesc=true,
+            shared_tooltip=false,
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum by (cluster) (' + $._config.metricPrefix + '_table_live_disk_space_used_total{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
+              legendFormat='Live space - {{cluster}}',
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum by (cluster) (' + $._config.metricPrefix + '_table_total_disk_space_used_total{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
+              legendFormat='Total space - {{cluster}}',
+            )
+          )
+        )
+        .addPanel(
+          graphPanel.new(
+            'SSTable Count',
+            description='SSTable Count Max and Average per table',
+            format='short',
+            datasource='$PROMETHEUS_DS',
+            transparent=true,
+            fill=0,
+            legend_show=true,
+            legend_values=true,
+            legend_current=true,
+            legend_alignAsTable=true,
+            legend_sort='current',
+            legend_sortDesc=true,
+            shared_tooltip=false,
+            min=0,
+          )
+          .addTarget(
+            prometheus.target(
+              expr='max by (cluster, keyspace, table) (' + $._config.metricPrefix + '_table_live_ss_table_count{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
+              legendFormat='Table - {{keyspace}}.{{table}}',
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='max by (cluster) (' + $._config.metricPrefix + '_table_live_ss_table_count{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
+              legendFormat='Max in cluster - {{cluster}}',
+            )
+          )
+        )
+        .addPanel(
+          graphPanel.new(
+            'Pending Compactions',
+            description='Maximum pending compactions on any node in the cluster',
+            format='short',
+            datasource='$PROMETHEUS_DS',
+            transparent=true,
+            fill=0,
+            legend_show=true,
+            legend_values=true,
+            legend_current=true,
+            legend_alignAsTable=true,
+            legend_sort='current',
+            legend_sortDesc=true,
+            shared_tooltip=false,
+            min=0,
+            bars=false,
+            lines=true,
+            stack=false,
+            decimals=0,
+          )
+          .addTarget(
+            prometheus.target(
+              expr='max by (cluster) (' + $._config.metricPrefix + '_table_pending_compactions{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
+              legendFormat='max',
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='min by (cluster) (' + $._config.metricPrefix + '_table_pending_compactions{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
+              legendFormat='min',
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='avg by (cluster) (' + $._config.metricPrefix + '_table_pending_compactions{cluster=~"$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
+              legendFormat='avg',
+            )
+          )
+          .addSeriesOverride(fillMinMaxSeriesOverrides)
+          .addSeriesOverride(removeMinlineSeriesOverrides)
+        )
+        .addPanel(
+          graphPanel.new(
+            'Pending Compactions per Table',
+            description='Maximum pending compactions per table',
+            format='short',
+            datasource='$PROMETHEUS_DS',
+            transparent=true,
+            fill=0,
+            legend_show=true,
+            legend_values=true,
+            legend_current=true,
+            legend_alignAsTable=true,
+            legend_sort='current',
+            legend_sortDesc=true,
+            shared_tooltip=false,
+            min=0,
+            bars=false,
+            lines=true,
+            stack=true,
+            decimals=0,
+          )
+          .addTarget(
+            prometheus.target(
+              expr='max by (cluster, keyspace, table) (' + $._config.metricPrefix + '_table_pending_compactions{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
+              legendFormat='max for {{keyspace}}.{{table}}',
+            )
+          )
+        )
+      )
+      .addRow(
+        row.new(title='Cassandra Internals')
+        .addPanel(
+          graphPanel.new(
+            'Pending Tasks',
+            description='Cluster wide pending threads, by thread pool name',
+            format='short',
+            datasource='$PROMETHEUS_DS',
+            transparent=true,
+            fill=0,
+            legend_show=true,
+            legend_values=true,
+            legend_current=true,
+            legend_alignAsTable=true,
+            legend_sort='current',
+            legend_sortDesc=true,
+            shared_tooltip=false,
+            min=0,
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum by (cluster, pool_name) (' + $._config.metricPrefix + '_thread_pools_pending_tasks{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
+              legendFormat='{{cluster}} - pending {{pool_name}}',
+            )
+          )
+        )
+        .addPanel(
+          graphPanel.new(
+            'Blocked Tasks',
+            description='Cluster wide blocked threads, by thread pool name',
+            format='short',
+            datasource='$PROMETHEUS_DS',
+            transparent=true,
+            fill=0,
+            legend_show=true,
+            legend_values=true,
+            legend_current=true,
+            legend_alignAsTable=true,
+            legend_sort='current',
+            legend_sortDesc=true,
+            shared_tooltip=false,
+            min=0,
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum by (cluster, pool_name) (rate(' + $._config.metricPrefix + '_thread_pools_total_blocked_tasks_total{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
+              legendFormat='{{cluster}} - blocked {{pool_name}}',
+            )
+          )
+        )
+        .addPanel(
+          graphPanel.new(
+            'Dropped Messages',
+            description='Dropped messages rate summed by message type and cluster',
+            format='short',
+            datasource='$PROMETHEUS_DS',
+            transparent=true,
+            fill=0,
+            legend_show=true,
+            legend_values=true,
+            legend_current=true,
+            legend_alignAsTable=true,
+            legend_sort='current',
+            legend_sortDesc=true,
+            shared_tooltip=false,
+            min=0,
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum by (cluster, message_type) (rate(' + $._config.metricPrefix + '_dropped_message_dropped_total{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
+              legendFormat='{{cluster}} - dropped {{message_type}}',
+            )
+          )
+        )
+        .addPanel(
+          graphPanel.new(
+            'Active Tasks',
+            description='active threads summed per cluster',
+            format='short',
+            datasource='$PROMETHEUS_DS',
+            transparent=true,
+            fill=0,
+            legend_show=true,
+            legend_values=true,
+            legend_current=true,
+            legend_alignAsTable=true,
+            legend_sort='current',
+            legend_sortDesc=true,
+            shared_tooltip=false,
+            min=0,
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum by (cluster, pool_name) (' + $._config.metricPrefix + '_thread_pools_active_tasks{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
+              legendFormat='{{cluster}} - active {{pool_name}}',
+            )
+          )
+        )
+        .addPanel(
+          graphPanel.new(
+            'Hinted Handoff',
+            description='Sum of hints being handed off per cluster.',
+            format='short',
+            datasource='$PROMETHEUS_DS',
+            transparent=true,
+            fill=0,
+            legend_show=true,
+            legend_values=true,
+            legend_current=true,
+            legend_alignAsTable=true,
+            legend_sort='current',
+            legend_sortDesc=true,
+            shared_tooltip=false,
+            min=0,
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum by (cluster) (' + $._config.metricPrefix + '_storage_total_hints_in_progress_total{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
+              legendFormat='count',
+            )
+          )
+        )
+      )
+      .addRow(
+        row.new(title='Hardware / Operating System')
+        .addPanel(
+          graphPanel.new(
+            'CPU Utilization',
+            description='Maximum CPU utilisation (max 100%)',
+            format='percentunit',
+            datasource='$PROMETHEUS_DS',
+            transparent=true,
+            fill=0,
+            legend_show=true,
+            legend_values=true,
+            legend_current=true,
+            legend_alignAsTable=true,
+            legend_sort='current',
+            legend_sortDesc=true,
+            shared_tooltip=false,
+            percentage=true,
+            decimals=1,
+            min=0,
+            max=1,
+          )
+          .addTarget(
+            prometheus.target(
+              expr='max by (cluster) (1 - (sum by (cluster, dc, rack, instance) (rate(collectd_cpu_total{type="idle", cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s])) / sum by (cluster, dc, rack, instance) (rate(collectd_cpu_total{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))))',
+              legendFormat='max',
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='min by (cluster) (1 - (sum by (cluster, dc, rack, instance) (rate(collectd_cpu_total{type="idle", cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s])) / sum by (cluster, dc, rack, instance) (rate(collectd_cpu_total{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))))',
+              legendFormat='min',
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='avg by (cluster) (1 - (sum by (cluster, dc, rack, instance) (rate(collectd_cpu_total{type="idle", cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s])) / sum by (cluster, dc, rack, instance) (rate(collectd_cpu_total{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))))',
+              legendFormat='avg',
+            )
+          )
+          .addSeriesOverride(fillMinMaxSeriesOverrides)
+          .addSeriesOverride(removeMinlineSeriesOverrides)
+        )
+        .addPanel(
+          graphPanel.new(
+            'Unix Load (1m rate)',
+            description='Max Unix load on a node for a cluster',
+            format='short',
+            datasource='$PROMETHEUS_DS',
+            transparent=true,
+            fill=0,
+            legend_show=true,
+            legend_values=true,
+            legend_current=true,
+            legend_alignAsTable=true,
+            legend_sort='current',
+            legend_sortDesc=true,
+            shared_tooltip=false,
+          )
+          .addTarget(
+            prometheus.target(
+              expr='max by (cluster) (collectd_load_shortterm{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
+              legendFormat='max',
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              'min by (cluster) (collectd_load_shortterm{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
+              legendFormat='min',
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              'avg by (cluster) (collectd_load_shortterm{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
+              legendFormat='avg',
+            )
+          )
+          .addSeriesOverride(fillMinMaxSeriesOverrides)
+          .addSeriesOverride(removeMinlineSeriesOverrides)
+        )
+        .addPanel(
+          graphPanel.new(
+            'Memory Utilisation',
+            description='Maximum Memory allocated per usage (worst node) - excludes caches, buffers, etc',
+            format='bytes',
+            datasource='$PROMETHEUS_DS',
+            transparent=true,
+            legend_show=true,
+            legend_values=true,
+            legend_current=true,
+            legend_alignAsTable=true,
+            legend_sort='current',
+            legend_sortDesc=true,
+            shared_tooltip=false,
+            fill=1,
+            linewidth=2,
+          )
+          .addTarget(
+            prometheus.target(
+              expr='min by (cluster) (sum by (cluster, dc, rack, instance) (collectd_memory{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}))',
+              legendFormat='min memory available',
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='max by (cluster, memory) (sum by (cluster, dc, rack, instance, memory) (collectd_memory{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}))',
+              legendFormat='max memory {{memory}}',
+            )
+          )
+        )
+        .addPanel(
+          graphPanel.new(
+            'Disk Read Thoughput',
+            description='Disk read throughput',
+            format='bps',
+            datasource='$PROMETHEUS_DS',
+            transparent=true,
+            fill=0,
+            legend_show=true,
+            legend_values=true,
+            legend_current=true,
+            legend_alignAsTable=true,
+            legend_sort='current',
+            legend_sortDesc=true,
+            shared_tooltip=false,
+          )
+          .addTarget(
+            prometheus.target(
+              expr='max by (cluster) (rate(collectd_processes_disk_octets_read_total{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
+              legendFormat='max',
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              'min by (cluster) (rate(collectd_processes_disk_octets_read_total{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
+              legendFormat='min',
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              'avg by (cluster) (rate(collectd_processes_disk_octets_read_total{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
+              legendFormat='avg',
+            )
+          )
+          .addSeriesOverride(fillMinMaxSeriesOverrides)
+          .addSeriesOverride(removeMinlineSeriesOverrides)
+        )
+        .addPanel(
+          graphPanel.new(
+            'Disk Write Thoughput',
+            description='Disk write throughput',
+            format='bps',
+            datasource='$PROMETHEUS_DS',
+            transparent=true,
+            fill=0,
+            legend_show=true,
+            legend_values=true,
+            legend_current=true,
+            legend_alignAsTable=true,
+            legend_sort='current',
+            legend_sortDesc=true,
+            shared_tooltip=false,
+          )
+          .addTarget(
+            prometheus.target(
+              expr='max by (cluster) (rate(collectd_processes_disk_octets_write_total{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
+              legendFormat='max',
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              'min by (cluster) (rate(collectd_processes_disk_octets_write_total{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
+              legendFormat='min',
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              'avg by (cluster) (rate(collectd_processes_disk_octets_write_total{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
+              legendFormat='avg',
+            )
+          )
+          .addSeriesOverride(fillMinMaxSeriesOverrides)
+          .addSeriesOverride(removeMinlineSeriesOverrides)
+        )
+        .addPanel(
+          graphPanel.new(
+            'Network I/O',
+            description='Network In and Out per cluster',
+            format='bytes',
+            datasource='$PROMETHEUS_DS',
+            transparent=true,
+            fill=1,
+            legend_show=true,
+            legend_values=true,
+            legend_current=true,
+            legend_alignAsTable=true,
+            legend_sort='current',
+            legend_sortDesc=true,
+            shared_tooltip=false,
+            bars=false,
+          )
+          .addTarget(
+            prometheus.target(
+              'sum by (cluster) (rate(collectd_interface_if_octets_rx_total{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
+              legendFormat='outgoing',
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              'sum by (cluster) (rate(collectd_interface_if_octets_rx_total{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
+              legendFormat='incoming',
+            )
+          )
+          .addSeriesOverride({
+            alias: 'incoming',
+            transform: 'negative-Y',
+          })
+
+        )
+      )
+      .addRow(
+        row.new(title='JVM / Garbage Collection')
+        .addPanel(
+          graphPanel.new(
+            'Application Throughput (% time NOT doing GC)',
+            description='Percentage of the time the node is *not* doing a GC, thus Cassandra is not stopped for GC',
+            format='percentunit',
+            datasource='$PROMETHEUS_DS',
+            transparent=true,
+            fill=0,
+            legend_show=true,
+            legend_values=true,
+            legend_current=true,
+            legend_alignAsTable=true,
+            legend_sort='current',
+            legend_sortDesc=true,
+            shared_tooltip=false,
+            decimals=2,
+            min=0,
+            max=1,
+          )
+          .addTarget(
+            prometheus.target(
+              'max by (cluster) (1 - (sum by (cluster, dc, rack, instance) (rate(' + $._config.metricPrefix + '_jvm_gc_time{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s])) / 1000))',
+              legendFormat='max',
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              'min by (cluster) (1 - (sum by (cluster, dc, rack, instance) (rate(' + $._config.metricPrefix + '_jvm_gc_time{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s])) / 1000))',
+              legendFormat='min',
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              'avg by (cluster) (1 - (sum by (cluster, dc, rack, instance) (rate(' + $._config.metricPrefix + '_jvm_gc_time{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s])) / 1000))',
+              legendFormat='avg',
+            )
+          )
+          .addSeriesOverride(fillMinMaxSeriesOverrides)
+          .addSeriesOverride(removeMinlineSeriesOverrides)
+        )
+        .addPanel(
+          graphPanel.new(
+            'Garbage Collection Time',
+            description='Garbage collection duration',
+            format='ms',
+            datasource='$PROMETHEUS_DS',
+            transparent=true,
+            fill=0,
+            legend_show=true,
+            legend_values=true,
+            legend_current=true,
+            legend_alignAsTable=true,
+            legend_sort='current',
+            legend_sortDesc=true,
+            shared_tooltip=false,
+          )
+          .addTarget(
+            prometheus.target(
+              'max by (cluster) (rate(' + $._config.metricPrefix + '_jvm_gc_time{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
+              legendFormat='max',
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              'min by (cluster) (rate(' + $._config.metricPrefix + '_jvm_gc_time{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
+              legendFormat='min',
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              'avg by (cluster) (rate(' + $._config.metricPrefix + '_jvm_gc_time{cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"}[1m:30s]))',
+              legendFormat='avg',
+            )
+          )
+          .addSeriesOverride(fillMinMaxSeriesOverrides)
+          .addSeriesOverride(removeMinlineSeriesOverrides)
+        )
+        .addPanel(
+          graphPanel.new(
+            'JVM Heap Memory Utilisation',
+            description='Maximum JVM Heap Memory size (worst node) and minimum available heap size',
+            format='bytes',
+            datasource='$PROMETHEUS_DS',
+            transparent=true,
+            legend_show=true,
+            legend_values=true,
+            legend_current=true,
+            legend_alignAsTable=true,
+            legend_sort='current',
+            legend_sortDesc=true,
+            shared_tooltip=false,
+            fill=1,
+            linewidth=2,
+          )
+          .addTarget(
+            prometheus.target(
+              'max by (cluster)\n        (' + $._config.metricPrefix + '_jvm_memory_used{memory_type="heap", cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
+              legendFormat='max',
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              'min by (cluster)\n        (' + $._config.metricPrefix + '_jvm_memory_used{memory_type="heap", cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
+              legendFormat='min',
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              'avg by (cluster)\n        (' + $._config.metricPrefix + '_jvm_memory_used{memory_type="heap", cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
+              legendFormat='avg',
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              'min by ( cluster)\n        (' + $._config.metricPrefix + '_jvm_memory_max{memory_type="heap", cluster="$cluster", dc=~"$dc", rack=~"$rack", instance=~"$node"})',
+              legendFormat='Heap memory available',
+            )
+          )
+          .addSeriesOverride(fillMinMaxSeriesOverrides)
+          .addSeriesOverride(removeMinlineSeriesOverrides)
+        )
+      ),
+  },
+}
diff --git a/mixin/dashboards/system-metrics.libsonnet b/mixin/dashboards/system-metrics.libsonnet
new file mode 100644
index 0000000..ed70c34
--- /dev/null
+++ b/mixin/dashboards/system-metrics.libsonnet
@@ -0,0 +1,908 @@
+local grafana = import 'github.com/grafana/grafonnet-lib/grafonnet/grafana.libsonnet';
+
+local dashboard = grafana.dashboard;
+local row = grafana.row;
+local singlestat = grafana.singlestat;
+local graphpanel = grafana.graphPanel;
+local text = grafana.text;
+local prometheus = grafana.prometheus;
+local template = grafana.template;
+
+local textstatHeight = 100;
+local graphHeight = 250;
+local singlestatHeight = 125;
+local singlestatSpan = 2;
+local graphSpan = 6;
+
+{
+  _config+:: {
+    metricPrefix: error 'must provide metric prefix',
+  },
+  grafanaDashboards+:: {
+    'system-metrics.json':
+      dashboard.new(
+        'System & Node Metrics',
+        description='Operating System Metrics and Apache Cassandra Node Information',
+        schemaVersion=14,
+        time_from='now-30m',
+        refresh='1m',
+        tags=['os'],
+        style='dark'
+      )
+      .addTemplate(
+        template.datasource(
+          'PROMETHEUS_DS',
+          'prometheus',
+          'Prometheus',
+          hide='all',
+        )
+      )
+      .addTemplate(
+        template.interval(
+          'rate',
+          '1m,5m,10m,30m,1h,6h,12h,1d,7d,14d,30d',
+          '5m',
+          label='Rate',
+        )
+      )
+      .addTemplate(
+        template.new(
+          'host',
+          '$PROMETHEUS_DS',
+          'label_values(collectd_collectd_queue_length{}, instance)',
+          label='Host',
+          refresh='time',
+        )
+      )
+      .addPanel(
+        text.new(
+          transparent=true,
+          mode='html',
+          content=' '
+        ),
+        {
+          h: 3,
+          w: 5,
+          x: 9,
+          y: -1,
+        },
+      )
+      .addRow(
+        row.new(
+          title='Basic CPU / Mem / Disk Gauge',
+          height=singlestatHeight,
+        )
+        .addPanel(
+          singlestat.new(
+            'CPU Busy',
+            description='Busy state of all CPU cores together',
+            format='percent',
+            datasource='$PROMETHEUS_DS',
+            thresholds='85,95',
+            sparklineShow=true,
+            gaugeShow=true,
+            span=singlestatSpan
+          )
+          .addTarget(
+            prometheus.target(
+              "(1 - ((sum(irate(collectd_cpu_total{instance='$host', type='idle'}[$rate])) by (instance) / sum(irate(collectd_cpu_total{instance='$host'}[$rate])) by (instance)))) * 100",
+            )
+          )
+        )
+        .addPanel(
+          singlestat.new(
+            'Memory Used',
+            description='Percentage of memory used (ignoring page cache)',
+            format='percent',
+            datasource='$PROMETHEUS_DS',
+            thresholds='85,95',
+            sparklineShow=true,
+            gaugeShow=true,
+            span=singlestatSpan
+          )
+          .addTarget(
+            prometheus.target(
+              '100 * ((sum(collectd_memory{instance="$host", memory="free"}) + sum(collectd_memory{instance="$host", memory="cached"}) + sum(collectd_memory{instance="$host", memory="buffered"})) / sum(collectd_memory{instance="$host"}))',
+            )
+          )
+        )
+        .addPanel(
+          singlestat.new(
+            'Swap Used',
+            description='Percentage of swap in use',
+            format='percent',
+            datasource='$PROMETHEUS_DS',
+            thresholds='0,1',
+            sparklineShow=true,
+            gaugeShow=true,
+            span=singlestatSpan
+          )
+          .addTarget(
+            prometheus.target(
+              "(sum(collectd_swap{instance='$host',swap='used'}) / sum(collectd_swap{instance='$host'})) * 100"
+            )
+          )
+        )
+        .addPanel(
+          singlestat.new(
+            'Disk Used',
+            description='Percentage of root disk in use',
+            format='percent',
+            datasource='$PROMETHEUS_DS',
+            thresholds='50,85',
+            sparklineShow=true,
+            gaugeShow=true,
+            span=singlestatSpan
+          )
+          .addTarget(
+            prometheus.target(
+              '(sum(collectd_df_df_complex{instance="$host", df="root", type="used"}) / sum(collectd_df_df_complex{instance="$host", df="root"})) * 100'
+            )
+          )
+        )
+        .addPanel(
+          singlestat.new(
+            'CPU System Load (1m avg)',
+            description='Busy state of all CPU cores together (1 min average)',
+            format='percent',
+            datasource='$PROMETHEUS_DS',
+            thresholds='85,95',
+            sparklineShow=true,
+            gaugeShow=true,
+            span=singlestatSpan
+          )
+          .addTarget(
+            prometheus.target(
+              'avg(collectd_load_shortterm{instance="$host"}) / count(count(collectd_cpu_total{instance="$host"}) by (cpu)) * 100',
+            )
+          )
+        )
+        .addPanel(
+          singlestat.new(
+            'CPU System Load (5m avg)',
+            description='Busy state of all CPU cores together (5 min average)',
+            format='percent',
+            datasource='$PROMETHEUS_DS',
+            thresholds='85,95',
+            sparklineShow=true,
+            gaugeShow=true,
+            span=singlestatSpan
+          )
+          .addTarget(
+            prometheus.target(
+              'avg(collectd_load_midterm{instance="$host"}) / count(count(collectd_cpu_total{instance="$host"}) by (cpu)) * 100',
+            )
+          )
+        )
+      )
+      .addRow(
+        row.new(
+          title='Basic CPU / Mem / Disk Info',
+          height=textstatHeight
+        )
+        .addPanel(
+          singlestat.new(
+            'CPU Cores',
+            description='Total number of CPU cores',
+            format='short',
+            datasource='$PROMETHEUS_DS',
+            span=singlestatSpan
+          )
+          .addTarget(
+            prometheus.target(
+              'count(count(collectd_cpu_total{instance="$host"}) by (cpu))'
+            )
+          )
+        )
+        .addPanel(
+          singlestat.new(
+            'Total RAM',
+            description='Total amount of system memory',
+            format='bytes',
+            datasource='$PROMETHEUS_DS',
+            span=singlestatSpan
+          )
+          .addTarget(
+            prometheus.target(
+              'sum(collectd_memory{instance="$host"})'
+            )
+          )
+        )
+        .addPanel(
+          singlestat.new(
+            'Total Swap',
+            description='Total amount of swap space',
+            format='bytes',
+            datasource='$PROMETHEUS_DS',
+            span=singlestatSpan
+          )
+          .addTarget(
+            prometheus.target(
+              'sum(collectd_swap{instance="$host"})'
+            )
+          )
+        )
+        .addPanel(
+          singlestat.new(
+            'Total RootFS',
+            description='Total amount of disk space',
+            format='bytes',
+            datasource='$PROMETHEUS_DS',
+            span=singlestatSpan
+          )
+          .addTarget(
+            prometheus.target(
+              'sum(collectd_df_df_complex{df="root",instance="$host"})'
+            )
+          )
+        )
+        .addPanel(
+          singlestat.new(
+            'System Load (1m avg)',
+            description='System Load (1m avg)',
+            format='short',
+            datasource='$PROMETHEUS_DS',
+            span=singlestatSpan
+          )
+          .addTarget(
+            prometheus.target(
+              'collectd_load_shortterm{instance="$host"}'
+            )
+          )
+        )
+        .addPanel(
+          singlestat.new(
+            'System Uptime',
+            description='Uptime of the host',
+            format='s',
+            decimals=1,
+            datasource='$PROMETHEUS_DS',
+            span=singlestatSpan
+          )
+          .addTarget(
+            prometheus.target(
+              'collectd_uptime{instance="$host"}'
+            )
+          )
+        )
+      )
+      .addRow(
+        row.new(
+          title='Basic CPU / Mem Graph',
+          height=graphHeight
+        )
+        .addPanel(
+          graphpanel.new(
+            title='CPU Basic',
+            datasource='$PROMETHEUS_DS',
+            span=graphSpan,
+            percentage=true,
+            stack=true,
+            min=0,
+            max=100
+          )
+          .addTarget(
+            prometheus.target(
+              expr="sum(irate(collectd_cpu_total{instance='$host',type='system'}[$rate])) / sum(irate(collectd_cpu_total{instance='$host'}[$rate])) * 100",
+              legendFormat='Busy System'
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr="sum(irate(collectd_cpu_total{instance='$host',type='user'}[$rate])) / sum(irate(collectd_cpu_total{instance='$host'}[$rate])) * 100",
+              legendFormat='Busy User'
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr="sum(irate(collectd_cpu_total{instance='$host',type='wait'}[$rate])) / sum(irate(collectd_cpu_total{instance='$host'}[$rate])) * 100",
+              legendFormat='Busy IOWait'
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr="sum(irate(collectd_cpu_total{instance='$host',type='softirq'}[$rate])) / sum(irate(collectd_cpu_total{instance='$host'}[$rate])) * 100",
+              legendFormat='Busy IRQ'
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr="sum(irate(collectd_cpu_total{instance='$host',type!='idle',type!='system',type!='user',type!='wait',type!='softirq'}[$rate])) / sum(irate(collectd_cpu_total{instance='$host'}[$rate])) * 100",
+              legendFormat='Busy Other'
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr="sum(irate(collectd_cpu_total{instance='$host',type='idle'}[$rate])) / sum(irate(collectd_cpu_total{instance='$host'}[$rate])) * 100",
+              legendFormat='Idle'
+            )
+          )
+        )
+        .addPanel(
+          graphpanel.new(
+            title='Basic memory usage',
+            datasource='$PROMETHEUS_DS',
+            span=graphSpan,
+            format='bytes',
+            min=0
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum(collectd_memory{instance="$host"})',
+              legendFormat='RAM Total'
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum(collectd_memory{instance="$host"}) - sum(collectd_memory{instance="$host", memory="free"}) - sum(collectd_memory{instance="$host", memory="cached"}) - sum(collectd_memory{instance="$host", memory="buffered"})',
+              legendFormat='RAM Used'
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum(collectd_memory{instance="$host", memory="cached"}) + sum(collectd_memory{instance="$host", memory="buffered"})',
+              legendFormat='RAM Cache + Buffer'
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum(collectd_memory{instance="$host", memory="free"})',
+              legendFormat='RAM Free'
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum(collectd_swap{instance="$host"}) - sum(collectd_swap{instance="$host", swap="free"})',
+              legendFormat='SWAP Used'
+            )
+          )
+        )
+      )
+      .addRow(
+        row.new(
+          title='Basic Network / Disk Graph',
+          height=graphHeight
+        )
+        .addPanel(
+          graphpanel.new(
+            title='Network Traffic / Second',
+            description='Basic network info per interface',
+            datasource='$PROMETHEUS_DS',
+            span=graphSpan,
+            format='bps',
+            labelY1='Receive (-) /  Send (+)',
+
+          )
+          .addSeriesOverride({
+            alias: '/.*receive.*/',
+            transform: 'negative-Y',
+          })
+          .addTarget(
+            prometheus.target(
+              expr="irate(collectd_interface_if_octets_rx_total{instance='$host'}[$rate]) * 8",
+              legendFormat='{{interface}} receive'
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr="irate(collectd_interface_if_octets_tx_total{instance='$host'}[$rate]) * 8",
+              legendFormat='{{interface}} send'
+            )
+          )
+        )
+        .addPanel(
+          graphpanel.new(
+            title='Network Packets / Second',
+            description='Basic network info per interface',
+            datasource='$PROMETHEUS_DS',
+            span=graphSpan,
+            format='pps',
+            labelY1='Receive (-) /  Send (+)',
+
+          )
+          .addSeriesOverride({
+            alias: '/.*receive.*/',
+            transform: 'negative-Y',
+          })
+          .addTarget(
+            prometheus.target(
+              expr="irate(collectd_interface_if_packets_rx_total{instance='$host'}[$rate]) * 8",
+              legendFormat='{{interface}} receive'
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr="irate(collectd_interface_if_packets_tx_total{instance='$host'}[$rate]) * 8",
+              legendFormat='{{interface}} send'
+            )
+          )
+        )
+        .addPanel(
+          graphpanel.new(
+            title='Disk Activity / Second',
+            description='Disk Activity / Second',
+            datasource='$PROMETHEUS_DS',
+            span=graphSpan,
+            format='Bps',
+            labelY1='Read (-) /  Write (+)',
+            legend_hideZero=true,
+            legend_hideEmpty=true
+          )
+          .addSeriesOverride({
+            alias: '/.*Read.*/',
+            transform: 'negative-Y',
+          })
+          .addTarget(
+            prometheus.target(
+              expr='irate(collectd_disk_disk_octets_read_total{instance="$host", disk=~".*\\\\d+"}[$rate])',
+              legendFormat='{{disk}} - Read'
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='irate(collectd_disk_disk_octets_write_total{instance="$host", disk=~".*\\\\d+"}[$rate])',
+              legendFormat='{{disk}} - Write'
+            )
+          )
+        )
+        .addPanel(
+          graphpanel.new(
+            title='Disk IOPS',
+            description='Disk iops per disk',
+            datasource='$PROMETHEUS_DS',
+            span=graphSpan,
+            format='iops',
+            labelY1='Read (-) /  Write (+)',
+            legend_hideZero=true,
+            legend_hideEmpty=true
+          )
+          .addSeriesOverride({
+            alias: '/.*Read.*/',
+            transform: 'negative-Y',
+          })
+          .addTarget(
+            prometheus.target(
+              expr='irate(collectd_disk_disk_ops_read_total{instance="$host", disk=~".*\\\\d+"}[$rate])',
+              legendFormat='{{disk}} - Read'
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='irate(collectd_disk_disk_ops_write_total{instance="$host", disk=~".*\\\\d+"}[$rate])',
+              legendFormat='{{disk}} - Write'
+            )
+          )
+        )
+        .addPanel(
+          graphpanel.new(
+            title='Disk Used',
+            description='Disk space used',
+            datasource='$PROMETHEUS_DS',
+            span=graphSpan,
+            format='decbytes',
+            legend_hideZero=true,
+            legend_hideEmpty=true
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum(collectd_df_df_complex{instance="$host", type="used"}) by (df)',
+              legendFormat='{{df}}'
+            )
+          )
+        )
+        .addPanel(
+          graphpanel.new(
+            title='Disk Queue Length',
+            description='The amount of requests pending in the disk queue',
+            datasource='$PROMETHEUS_DS',
+            span=graphSpan,
+            format='short',
+            legend_hideZero=true,
+            legend_hideEmpty=true
+          )
+          .addTarget(
+            prometheus.target(
+              expr='irate(collectd_disk_disk_io_time_weighted_io_time_total{instance="$host",disk=~".*[0-9]+"}[$rate]) / 1000',
+              legendFormat='{{disk}}'
+            )
+          )
+        )
+        .addPanel(
+          graphpanel.new(
+            title='Disk Latency',
+            description='Disk access times',
+            datasource='$PROMETHEUS_DS',
+            span=graphSpan,
+            format='ms',
+            labelY1='Read (-) /  Write (+)',
+            legend_hideZero=true,
+            legend_hideEmpty=true
+          )
+          .addSeriesOverride({
+            alias: '/.*Read.*/',
+            transform: 'negative-Y',
+          })
+          .addTarget(
+            prometheus.target(
+              expr='irate(collectd_disk_disk_time_read_total{instance="$host",disk=~".*[0-9]+"}[$rate])',
+              legendFormat='{{disk}} - Read'
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='irate(collectd_disk_disk_time_write_total{instance="$host",disk=~".*[0-9]+"}[$rate])',
+              legendFormat='{{disk}} - Write'
+            )
+          )
+        )
+      )
+      .addRow(
+        row.new(
+          title='CPU Details',
+          height=graphHeight,
+          collapse=true
+        )
+        .addPanel(
+          graphpanel.new(
+            title='CPU User',
+            datasource='$PROMETHEUS_DS',
+            span=graphSpan,
+            format='percent',
+            min=0,
+            max=100
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum(rate(collectd_cpu_total{instance="$host", type="user"}[$rate])) by (cpu) / sum(rate(collectd_cpu_total{instance="$host"}[$rate])) by (cpu) * 100',
+              legendFormat='{{cpu}}'
+            )
+          )
+        )
+        .addPanel(
+          graphpanel.new(
+            title='CPU System',
+            datasource='$PROMETHEUS_DS',
+            span=graphSpan,
+            format='percent',
+            min=0,
+            max=100
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum(rate(collectd_cpu_total{instance="$host", type="system"}[$rate])) by (cpu) / sum(rate(collectd_cpu_total{instance="$host"}[$rate])) by (cpu) * 100',
+              legendFormat='{{cpu}}'
+            )
+          )
+        )
+        .addPanel(
+          graphpanel.new(
+            title='CPU IOWait',
+            datasource='$PROMETHEUS_DS',
+            span=graphSpan,
+            format='percent',
+            min=0,
+            max=100
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum(rate(collectd_cpu_total{instance="$host", type="wait"}[$rate])) by (cpu) / sum(rate(collectd_cpu_total{instance="$host"}[$rate])) by (cpu) * 100',
+              legendFormat='{{cpu}}'
+            )
+          )
+        )
+        .addPanel(
+          graphpanel.new(
+            title='CPU SoftIRQ',
+            datasource='$PROMETHEUS_DS',
+            span=graphSpan,
+            format='percent',
+            min=0,
+            max=100
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum(rate(collectd_cpu_total{instance="$host", type="softirq"}[$rate])) by (cpu) / sum(rate(collectd_cpu_total{instance="$host"}[$rate])) by (cpu) * 100',
+              legendFormat='{{cpu}}'
+            )
+          )
+        )
+        .addPanel(
+          graphpanel.new(
+            title='CPU Other',
+            datasource='$PROMETHEUS_DS',
+            span=graphSpan,
+            format='percent',
+            min=0,
+            max=100
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum(rate(collectd_cpu_total{instance="$host", type=~"(interrupt|nice|steal)"}[$rate])) by (cpu, type)  / ignoring(type) group_left sum(rate(collectd_cpu_total{instance="$host" }[$rate])) by (cpu) * 100',
+              legendFormat='{{cpu}} - {{type}}'
+            )
+          )
+        )
+      )
+      .addRow(
+        row.new(
+          title='Advanced Details',
+          height=graphHeight,
+          collapse=true
+        )
+        .addPanel(
+          graphpanel.new(
+            title='Context Switches / Second',
+            datasource='$PROMETHEUS_DS',
+            span=graphSpan,
+            format='short'
+          )
+          .addTarget(
+            prometheus.target(
+              expr='irate(collectd_contextswitch_total{instance="$host"}[$rate])',
+              legendFormat='Context Switches'
+            )
+          )
+        )
+        .addPanel(
+          graphpanel.new(
+            title='IRQ Activity',
+            datasource='$PROMETHEUS_DS',
+            span=graphSpan,
+            format='short',
+            legend_hideEmpty=true,
+            legend_hideZero=true
+          )
+          .addTarget(
+            prometheus.target(
+              expr='rate(collectd_irq_total{instance="$host", irq != "LOC"}[$rate])',
+              legendFormat='{{irq}}'
+            )
+          )
+        )
+        .addPanel(
+          graphpanel.new(
+            title='NUMA Activity',
+            datasource='$PROMETHEUS_DS',
+            span=graphSpan,
+            format='short',
+            legend_hideEmpty=true,
+            legend_hideZero=true
+          )
+          .addTarget(
+            prometheus.target(
+              expr='irate(collectd_numa_vmpage_action_total{instance="$host"}[$rate])',
+              legendFormat='{{numa}} - {{type}}'
+            )
+          )
+        )
+        .addPanel(
+          graphpanel.new(
+            title='TCP Connection Activity',
+            datasource='$PROMETHEUS_DS',
+            span=graphSpan,
+            format='short',
+            legend_hideEmpty=true,
+            legend_hideZero=true
+          )
+          .addTarget(
+            prometheus.target(
+              expr='collectd_tcpconns_tcp_connections{instance="$host"}',
+              legendFormat='{{tcpconns}} - {{type}}'
+            )
+          )
+        )
+        .addPanel(
+          graphpanel.new(
+            title='TCP Connection Activity',
+            datasource='$PROMETHEUS_DS',
+            span=graphSpan,
+            format='short',
+            legend_hideEmpty=true,
+            legend_hideZero=true
+          )
+          .addTarget(
+            prometheus.target(
+              expr='rate(collectd_protocols_protocol_counter_total{instance="$host"}[$rate])',
+              legendFormat='{{protocols}} - {{type}}'
+            )
+          )
+        )
+        .addPanel(
+          graphpanel.new(
+            title='Processor Speeds',
+            datasource='$PROMETHEUS_DS',
+            span=graphSpan,
+            format='hertz',
+            points=true,
+            lines=false,
+            pointradius=5,
+            legend_hideEmpty=true,
+            legend_hideZero=true
+          )
+          .addTarget(
+            prometheus.target(
+              expr='collectd_cpufreq{instance="$host"}',
+              legendFormat='{{cpufreq}}'
+            )
+          )
+        )
+        .addPanel(
+          graphpanel.new(
+            title='Page Cache Activity',
+            datasource='$PROMETHEUS_DS',
+            span=graphSpan,
+            format='short',
+            legend_hideEmpty=true,
+            legend_hideZero=true
+          )
+          .addTarget(
+            prometheus.target(
+              expr='rate(collectd_vmem_vmpage_faults_majflt_total{instance="$host"}[$rate])',
+              legendFormat='Major fault'
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='rate(collectd_vmem_vmpage_faults_minflt_total{instance="$host"}[$rate])',
+              legendFormat='Minor fault'
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='rate(collectd_vmem_vmpage_action_total{instance="$host"}[$rate])',
+              legendFormat='Action - {{vmem}}'
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='rate(collectd_vmem_vmpage_io_in_total{instance="$host"}[$rate])',
+              legendFormat='IO read page'
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='rate(collectd_vmem_vmpage_io_out_total{instance="$host"}[$rate])',
+              legendFormat='IO write page'
+            )
+          )
+        )
+        .addPanel(
+          graphpanel.new(
+            title='Page Cache Layout',
+            datasource='$PROMETHEUS_DS',
+            span=graphSpan,
+            format='short',
+            percentage=true,
+            stack=true,
+            min=0,
+            max=100,
+            legend_hideEmpty=true,
+            legend_hideZero=true
+          )
+          .addTarget(
+            prometheus.target(
+              expr='collectd_vmem_vmpage_number{instance="$host"}',
+              legendFormat='{{vmem}}'
+            )
+          )
+        )
+        .addPanel(
+          graphpanel.new(
+            title='Process Activity',
+            datasource='$PROMETHEUS_DS',
+            span=graphSpan,
+            format='short',
+            legend_hideEmpty=true,
+            legend_hideZero=true
+          )
+          .addTarget(
+            prometheus.target(
+              expr='collectd_processes_ps_count_threads{instance="$host"}',
+              legendFormat='Thread Count'
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='collectd_processes_ps_count_processes{instance="$host"}',
+              legendFormat='Process Count'
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='collectd_processes_ps_state{instance="$host"}',
+              legendFormat='Process State - {{processes}}'
+            )
+          )
+        )
+      )
+      .addRow(
+        row.new(
+          title='Basic Cassandra Overview',
+          height=singlestatHeight
+        )
+        .addPanel(
+          singlestat.new(
+            'SSTable Count',
+            description='Number of sstables on the node',
+            format='short',
+            datasource='$PROMETHEUS_DS',
+            sparklineShow=true,
+            gaugeShow=true,
+            span=singlestatSpan,
+            thresholds='100000,500000'
+          )
+          .addTarget(
+            prometheus.target(
+              'sum(' + $._config.metricPrefix + "_table_live_ss_table_count{instance='$host'})"
+            )
+          )
+        )
+        .addPanel(
+          singlestat.new(
+            'Pending Compactions',
+            description='Number of pending compactions on the node',
+            format='short',
+            datasource='$PROMETHEUS_DS',
+            sparklineShow=true,
+            gaugeShow=true,
+            span=singlestatSpan,
+            thresholds='10,50'
+          )
+          .addTarget(
+            prometheus.target(
+              'sum(' + $._config.metricPrefix + "_compaction_pending_tasks{instance='$host'})"
+            )
+          )
+        )
+        .addPanel(
+          singlestat.new(
+            'Connected Clients',
+            description='Number of client connections to the node',
+            format='percent',
+            datasource='$PROMETHEUS_DS',
+            sparklineShow=true,
+            gaugeShow=true,
+            span=singlestatSpan,
+            thresholds='100,1000'
+          )
+          .addTarget(
+            prometheus.target(
+              'sum(' + $._config.metricPrefix + "_client_connected_native_clients{instance='$host'})"
+            )
+          )
+        )
+        .addPanel(
+          graphpanel.new(
+            title='GC Activity',
+            datasource='$PROMETHEUS_DS',
+            span=graphSpan,
+            format='bytes',
+            legend_hideEmpty=true,
+            legend_hideZero=true
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum(' + $._config.metricPrefix + '_jvm_memory_max{instance="$host", memory_type="total"})',
+              legendFormat='JVM Heap Total'
+            )
+          )
+          .addSeriesOverride({
+            alias: '/.*Total.*/',
+            fill: 0,
+          })
+          .addTarget(
+            prometheus.target(
+              expr='sum(' + $._config.metricPrefix + '_jvm_memory_used{instance="$host", memory_type="non_heap"})',
+              legendFormat='JVM Non-Heap Used'
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum(' + $._config.metricPrefix + '_jvm_memory_used{instance="$host", memory_type="heap"})',
+              legendFormat='JVM Heap Used'
+            )
+          )
+        )
+      ),
+  },
+}
diff --git a/mixin/jsonnetfile.json b/mixin/jsonnetfile.json
new file mode 100644
index 0000000..8e6cf3c
--- /dev/null
+++ b/mixin/jsonnetfile.json
@@ -0,0 +1,24 @@
+{
+  "version": 1,
+  "dependencies": [
+    {
+      "source": {
+        "git": {
+          "remote": "https://github.com/grafana/grafonnet-lib.git",
+          "subdir": "grafonnet"
+        }
+      },
+      "version": "master"
+    },
+    {
+      "source": {
+        "git": {
+          "remote": "https://github.com/thelastpickle/grafonnet-polystat-panel.git",
+          "subdir": ""
+        }
+      },
+      "version": "master"
+    }
+  ],
+  "legacyImports": false
+}
diff --git a/mixin/jsonnetfile.lock.json b/mixin/jsonnetfile.lock.json
new file mode 100644
index 0000000..79d7d41
--- /dev/null
+++ b/mixin/jsonnetfile.lock.json
@@ -0,0 +1,26 @@
+{
+  "version": 1,
+  "dependencies": [
+    {
+      "source": {
+        "git": {
+          "remote": "https://github.com/grafana/grafonnet-lib.git",
+          "subdir": "grafonnet"
+        }
+      },
+      "version": "6db00c292d3a1c71661fc875f90e0ec7caa538c2",
+      "sum": "gF8foHByYcB25jcUOBqP6jxk0OPifQMjPvKY0HaCk6w="
+    },
+    {
+      "source": {
+        "git": {
+          "remote": "https://github.com/thelastpickle/grafonnet-polystat-panel.git",
+          "subdir": ""
+        }
+      },
+      "version": "275a48de57afdac0d72219d82863d8ab8bd0e682",
+      "sum": "pXSXxNxi4WvBKYZ83GVYotQyL+toHaizqvjJ+8YYMoU="
+    }
+  ],
+  "legacyImports": false
+}
diff --git a/mixin/make-dashboards.sh b/mixin/make-dashboards.sh
new file mode 100755
index 0000000..1fef13e
--- /dev/null
+++ b/mixin/make-dashboards.sh
@@ -0,0 +1,11 @@
+#!/usr/bin/env bash
+set -euo pipefail
+
+ROOT_DIR="$(cd -P "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
+OUTPUT_DIR="${ROOT_DIR}/dashboards/grafana/generated-dashboards"
+
+rm -rf "${OUTPUT_DIR}"
+mkdir "${OUTPUT_DIR}"
+
+docker run -v "${ROOT_DIR}:${ROOT_DIR}" datastax/grafonnet-lib:v0.1.3 \
+  jsonnet --multi "${OUTPUT_DIR}" "${ROOT_DIR}/mixin/dashboards.jsonnet"
diff --git a/mixin/mixin.libsonnet b/mixin/mixin.libsonnet
new file mode 100644
index 0000000..b291077
--- /dev/null
+++ b/mixin/mixin.libsonnet
@@ -0,0 +1,2 @@
+(import './dashboards/dashboards.libsonnet') +
+(import './config.libsonnet')
'
+        ),
+        {
+          h: 3,
+          w: 5,
+          x: 9,
+          y: -1,
+        },
+      )
+      .addRow(
+        row.new(
+          title='Basic CPU / Mem / Disk Gauge',
+          height=singlestatHeight,
+        )
+        .addPanel(
+          singlestat.new(
+            'CPU Busy',
+            description='Busy state of all CPU cores together',
+            format='percent',
+            datasource='$PROMETHEUS_DS',
+            thresholds='85,95',
+            sparklineShow=true,
+            gaugeShow=true,
+            span=singlestatSpan
+          )
+          .addTarget(
+            prometheus.target(
+              "(1 - ((sum(irate(collectd_cpu_total{instance='$host', type='idle'}[$rate])) by (instance) / sum(irate(collectd_cpu_total{instance='$host'}[$rate])) by (instance)))) * 100",
+            )
+          )
+        )
+        .addPanel(
+          singlestat.new(
+            'Memory Used',
+            description='Percentage of memory used (ignoring page cache)',
+            format='percent',
+            datasource='$PROMETHEUS_DS',
+            thresholds='85,95',
+            sparklineShow=true,
+            gaugeShow=true,
+            span=singlestatSpan
+          )
+          .addTarget(
+            prometheus.target(
+              '100 * ((sum(collectd_memory{instance="$host", memory="free"}) + sum(collectd_memory{instance="$host", memory="cached"}) + sum(collectd_memory{instance="$host", memory="buffered"})) / sum(collectd_memory{instance="$host"}))',
+            )
+          )
+        )
+        .addPanel(
+          singlestat.new(
+            'Swap Used',
+            description='Percentage of swap in use',
+            format='percent',
+            datasource='$PROMETHEUS_DS',
+            thresholds='0,1',
+            sparklineShow=true,
+            gaugeShow=true,
+            span=singlestatSpan
+          )
+          .addTarget(
+            prometheus.target(
+              "(sum(collectd_swap{instance='$host',swap='used'}) / sum(collectd_swap{instance='$host'})) * 100"
+            )
+          )
+        )
+        .addPanel(
+          singlestat.new(
+            'Disk Used',
+            description='Percentage of root disk in use',
+            format='percent',
+            datasource='$PROMETHEUS_DS',
+            thresholds='50,85',
+            sparklineShow=true,
+            gaugeShow=true,
+            span=singlestatSpan
+          )
+          .addTarget(
+            prometheus.target(
+              '(sum(collectd_df_df_complex{instance="$host", df="root", type="used"}) / sum(collectd_df_df_complex{instance="$host", df="root"})) * 100'
+            )
+          )
+        )
+        .addPanel(
+          singlestat.new(
+            'CPU System Load (1m avg)',
+            description='Busy state of all CPU cores together (1 min average)',
+            format='percent',
+            datasource='$PROMETHEUS_DS',
+            thresholds='85,95',
+            sparklineShow=true,
+            gaugeShow=true,
+            span=singlestatSpan
+          )
+          .addTarget(
+            prometheus.target(
+              'avg(collectd_load_shortterm{instance="$host"}) / count(count(collectd_cpu_total{instance="$host"}) by (cpu)) * 100',
+            )
+          )
+        )
+        .addPanel(
+          singlestat.new(
+            'CPU System Load (5m avg)',
+            description='Busy state of all CPU cores together (5 min average)',
+            format='percent',
+            datasource='$PROMETHEUS_DS',
+            thresholds='85,95',
+            sparklineShow=true,
+            gaugeShow=true,
+            span=singlestatSpan
+          )
+          .addTarget(
+            prometheus.target(
+              'avg(collectd_load_midterm{instance="$host"}) / count(count(collectd_cpu_total{instance="$host"}) by (cpu)) * 100',
+            )
+          )
+        )
+      )
+      .addRow(
+        row.new(
+          title='Basic CPU / Mem / Disk Info',
+          height=textstatHeight
+        )
+        .addPanel(
+          singlestat.new(
+            'CPU Cores',
+            description='Total number of CPU cores',
+            format='short',
+            datasource='$PROMETHEUS_DS',
+            span=singlestatSpan
+          )
+          .addTarget(
+            prometheus.target(
+              'count(count(collectd_cpu_total{instance="$host"}) by (cpu))'
+            )
+          )
+        )
+        .addPanel(
+          singlestat.new(
+            'Total RAM',
+            description='Total amount of system memory',
+            format='bytes',
+            datasource='$PROMETHEUS_DS',
+            span=singlestatSpan
+          )
+          .addTarget(
+            prometheus.target(
+              'sum(collectd_memory{instance="$host"})'
+            )
+          )
+        )
+        .addPanel(
+          singlestat.new(
+            'Total Swap',
+            description='Total amount of swap space',
+            format='bytes',
+            datasource='$PROMETHEUS_DS',
+            span=singlestatSpan
+          )
+          .addTarget(
+            prometheus.target(
+              'sum(collectd_swap{instance="$host"})'
+            )
+          )
+        )
+        .addPanel(
+          singlestat.new(
+            'Total RootFS',
+            description='Total amount of disk space',
+            format='bytes',
+            datasource='$PROMETHEUS_DS',
+            span=singlestatSpan
+          )
+          .addTarget(
+            prometheus.target(
+              'sum(collectd_df_df_complex{df="root",instance="$host"})'
+            )
+          )
+        )
+        .addPanel(
+          singlestat.new(
+            'System Load (1m avg)',
+            description='System Load (1m avg)',
+            format='short',
+            datasource='$PROMETHEUS_DS',
+            span=singlestatSpan
+          )
+          .addTarget(
+            prometheus.target(
+              'collectd_load_shortterm{instance="$host"}'
+            )
+          )
+        )
+        .addPanel(
+          singlestat.new(
+            'System Uptime',
+            description='Uptime of the host',
+            format='s',
+            decimals=1,
+            datasource='$PROMETHEUS_DS',
+            span=singlestatSpan
+          )
+          .addTarget(
+            prometheus.target(
+              'collectd_uptime{instance="$host"}'
+            )
+          )
+        )
+      )
+      .addRow(
+        row.new(
+          title='Basic CPU / Mem Graph',
+          height=graphHeight
+        )
+        .addPanel(
+          graphpanel.new(
+            title='CPU Basic',
+            datasource='$PROMETHEUS_DS',
+            span=graphSpan,
+            percentage=true,
+            stack=true,
+            min=0,
+            max=100
+          )
+          .addTarget(
+            prometheus.target(
+              expr="sum(irate(collectd_cpu_total{instance='$host',type='system'}[$rate])) / sum(irate(collectd_cpu_total{instance='$host'}[$rate])) * 100",
+              legendFormat='Busy System'
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr="sum(irate(collectd_cpu_total{instance='$host',type='user'}[$rate])) / sum(irate(collectd_cpu_total{instance='$host'}[$rate])) * 100",
+              legendFormat='Busy User'
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr="sum(irate(collectd_cpu_total{instance='$host',type='wait'}[$rate])) / sum(irate(collectd_cpu_total{instance='$host'}[$rate])) * 100",
+              legendFormat='Busy IOWait'
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr="sum(irate(collectd_cpu_total{instance='$host',type='softirq'}[$rate])) / sum(irate(collectd_cpu_total{instance='$host'}[$rate])) * 100",
+              legendFormat='Busy IRQ'
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr="sum(irate(collectd_cpu_total{instance='$host',type!='idle',type!='system',type!='user',type!='wait',type!='softirq'}[$rate])) / sum(irate(collectd_cpu_total{instance='$host'}[$rate])) * 100",
+              legendFormat='Busy Other'
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr="sum(irate(collectd_cpu_total{instance='$host',type='idle'}[$rate])) / sum(irate(collectd_cpu_total{instance='$host'}[$rate])) * 100",
+              legendFormat='Idle'
+            )
+          )
+        )
+        .addPanel(
+          graphpanel.new(
+            title='Basic memory usage',
+            datasource='$PROMETHEUS_DS',
+            span=graphSpan,
+            format='bytes',
+            min=0
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum(collectd_memory{instance="$host"})',
+              legendFormat='RAM Total'
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum(collectd_memory{instance="$host"}) - sum(collectd_memory{instance="$host", memory="free"}) - sum(collectd_memory{instance="$host", memory="cached"}) - sum(collectd_memory{instance="$host", memory="buffered"})',
+              legendFormat='RAM Used'
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum(collectd_memory{instance="$host", memory="cached"}) + sum(collectd_memory{instance="$host", memory="buffered"})',
+              legendFormat='RAM Cache + Buffer'
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum(collectd_memory{instance="$host", memory="free"})',
+              legendFormat='RAM Free'
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum(collectd_swap{instance="$host"}) - sum(collectd_swap{instance="$host", swap="free"})',
+              legendFormat='SWAP Used'
+            )
+          )
+        )
+      )
+      .addRow(
+        row.new(
+          title='Basic Network / Disk Graph',
+          height=graphHeight
+        )
+        .addPanel(
+          graphpanel.new(
+            title='Network Traffic / Second',
+            description='Basic network info per interface',
+            datasource='$PROMETHEUS_DS',
+            span=graphSpan,
+            format='bps',
+            labelY1='Receive (-) /  Send (+)',
+
+          )
+          .addSeriesOverride({
+            alias: '/.*receive.*/',
+            transform: 'negative-Y',
+          })
+          .addTarget(
+            prometheus.target(
+              expr="irate(collectd_interface_if_octets_rx_total{instance='$host'}[$rate]) * 8",
+              legendFormat='{{interface}} receive'
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr="irate(collectd_interface_if_octets_tx_total{instance='$host'}[$rate]) * 8",
+              legendFormat='{{interface}} send'
+            )
+          )
+        )
+        .addPanel(
+          graphpanel.new(
+            title='Network Packets / Second',
+            description='Basic network info per interface',
+            datasource='$PROMETHEUS_DS',
+            span=graphSpan,
+            format='pps',
+            labelY1='Receive (-) /  Send (+)',
+
+          )
+          .addSeriesOverride({
+            alias: '/.*receive.*/',
+            transform: 'negative-Y',
+          })
+          .addTarget(
+            prometheus.target(
+              expr="irate(collectd_interface_if_packets_rx_total{instance='$host'}[$rate]) * 8",
+              legendFormat='{{interface}} receive'
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr="irate(collectd_interface_if_packets_tx_total{instance='$host'}[$rate]) * 8",
+              legendFormat='{{interface}} send'
+            )
+          )
+        )
+        .addPanel(
+          graphpanel.new(
+            title='Disk Activity / Second',
+            description='Disk Activity / Second',
+            datasource='$PROMETHEUS_DS',
+            span=graphSpan,
+            format='Bps',
+            labelY1='Read (-) /  Write (+)',
+            legend_hideZero=true,
+            legend_hideEmpty=true
+          )
+          .addSeriesOverride({
+            alias: '/.*Read.*/',
+            transform: 'negative-Y',
+          })
+          .addTarget(
+            prometheus.target(
+              expr='irate(collectd_disk_disk_octets_read_total{instance="$host", disk=~".*\\\\d+"}[$rate])',
+              legendFormat='{{disk}} - Read'
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='irate(collectd_disk_disk_octets_write_total{instance="$host", disk=~".*\\\\d+"}[$rate])',
+              legendFormat='{{disk}} - Write'
+            )
+          )
+        )
+        .addPanel(
+          graphpanel.new(
+            title='Disk IOPS',
+            description='Disk iops per disk',
+            datasource='$PROMETHEUS_DS',
+            span=graphSpan,
+            format='iops',
+            labelY1='Read (-) /  Write (+)',
+            legend_hideZero=true,
+            legend_hideEmpty=true
+          )
+          .addSeriesOverride({
+            alias: '/.*Read.*/',
+            transform: 'negative-Y',
+          })
+          .addTarget(
+            prometheus.target(
+              expr='irate(collectd_disk_disk_ops_read_total{instance="$host", disk=~".*\\\\d+"}[$rate])',
+              legendFormat='{{disk}} - Read'
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='irate(collectd_disk_disk_ops_write_total{instance="$host", disk=~".*\\\\d+"}[$rate])',
+              legendFormat='{{disk}} - Write'
+            )
+          )
+        )
+        .addPanel(
+          graphpanel.new(
+            title='Disk Used',
+            description='Disk space used',
+            datasource='$PROMETHEUS_DS',
+            span=graphSpan,
+            format='decbytes',
+            legend_hideZero=true,
+            legend_hideEmpty=true
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum(collectd_df_df_complex{instance="$host", type="used"}) by (df)',
+              legendFormat='{{df}}'
+            )
+          )
+        )
+        .addPanel(
+          graphpanel.new(
+            title='Disk Queue Length',
+            description='The amount of requests pending in the disk queue',
+            datasource='$PROMETHEUS_DS',
+            span=graphSpan,
+            format='short',
+            legend_hideZero=true,
+            legend_hideEmpty=true
+          )
+          .addTarget(
+            prometheus.target(
+              expr='irate(collectd_disk_disk_io_time_weighted_io_time_total{instance="$host",disk=~".*[0-9]+"}[$rate]) / 1000',
+              legendFormat='{{disk}}'
+            )
+          )
+        )
+        .addPanel(
+          graphpanel.new(
+            title='Disk Latency',
+            description='Disk access times',
+            datasource='$PROMETHEUS_DS',
+            span=graphSpan,
+            format='ms',
+            labelY1='Read (-) /  Write (+)',
+            legend_hideZero=true,
+            legend_hideEmpty=true
+          )
+          .addSeriesOverride({
+            alias: '/.*Read.*/',
+            transform: 'negative-Y',
+          })
+          .addTarget(
+            prometheus.target(
+              expr='irate(collectd_disk_disk_time_read_total{instance="$host",disk=~".*[0-9]+"}[$rate])',
+              legendFormat='{{disk}} - Read'
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='irate(collectd_disk_disk_time_write_total{instance="$host",disk=~".*[0-9]+"}[$rate])',
+              legendFormat='{{disk}} - Write'
+            )
+          )
+        )
+      )
+      .addRow(
+        row.new(
+          title='CPU Details',
+          height=graphHeight,
+          collapse=true
+        )
+        .addPanel(
+          graphpanel.new(
+            title='CPU User',
+            datasource='$PROMETHEUS_DS',
+            span=graphSpan,
+            format='percent',
+            min=0,
+            max=100
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum(rate(collectd_cpu_total{instance="$host", type="user"}[$rate])) by (cpu) / sum(rate(collectd_cpu_total{instance="$host"}[$rate])) by (cpu) * 100',
+              legendFormat='{{cpu}}'
+            )
+          )
+        )
+        .addPanel(
+          graphpanel.new(
+            title='CPU System',
+            datasource='$PROMETHEUS_DS',
+            span=graphSpan,
+            format='percent',
+            min=0,
+            max=100
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum(rate(collectd_cpu_total{instance="$host", type="system"}[$rate])) by (cpu) / sum(rate(collectd_cpu_total{instance="$host"}[$rate])) by (cpu) * 100',
+              legendFormat='{{cpu}}'
+            )
+          )
+        )
+        .addPanel(
+          graphpanel.new(
+            title='CPU IOWait',
+            datasource='$PROMETHEUS_DS',
+            span=graphSpan,
+            format='percent',
+            min=0,
+            max=100
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum(rate(collectd_cpu_total{instance="$host", type="wait"}[$rate])) by (cpu) / sum(rate(collectd_cpu_total{instance="$host"}[$rate])) by (cpu) * 100',
+              legendFormat='{{cpu}}'
+            )
+          )
+        )
+        .addPanel(
+          graphpanel.new(
+            title='CPU SoftIRQ',
+            datasource='$PROMETHEUS_DS',
+            span=graphSpan,
+            format='percent',
+            min=0,
+            max=100
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum(rate(collectd_cpu_total{instance="$host", type="softirq"}[$rate])) by (cpu) / sum(rate(collectd_cpu_total{instance="$host"}[$rate])) by (cpu) * 100',
+              legendFormat='{{cpu}}'
+            )
+          )
+        )
+        .addPanel(
+          graphpanel.new(
+            title='CPU Other',
+            datasource='$PROMETHEUS_DS',
+            span=graphSpan,
+            format='percent',
+            min=0,
+            max=100
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum(rate(collectd_cpu_total{instance="$host", type=~"(interrupt|nice|steal)"}[$rate])) by (cpu, type)  / ignoring(type) group_left sum(rate(collectd_cpu_total{instance="$host" }[$rate])) by (cpu) * 100',
+              legendFormat='{{cpu}} - {{type}}'
+            )
+          )
+        )
+      )
+      .addRow(
+        row.new(
+          title='Advanced Details',
+          height=graphHeight,
+          collapse=true
+        )
+        .addPanel(
+          graphpanel.new(
+            title='Context Switches / Second',
+            datasource='$PROMETHEUS_DS',
+            span=graphSpan,
+            format='short'
+          )
+          .addTarget(
+            prometheus.target(
+              expr='irate(collectd_contextswitch_total{instance="$host"}[$rate])',
+              legendFormat='Context Switches'
+            )
+          )
+        )
+        .addPanel(
+          graphpanel.new(
+            title='IRQ Activity',
+            datasource='$PROMETHEUS_DS',
+            span=graphSpan,
+            format='short',
+            legend_hideEmpty=true,
+            legend_hideZero=true
+          )
+          .addTarget(
+            prometheus.target(
+              expr='rate(collectd_irq_total{instance="$host", irq != "LOC"}[$rate])',
+              legendFormat='{{irq}}'
+            )
+          )
+        )
+        .addPanel(
+          graphpanel.new(
+            title='NUMA Activity',
+            datasource='$PROMETHEUS_DS',
+            span=graphSpan,
+            format='short',
+            legend_hideEmpty=true,
+            legend_hideZero=true
+          )
+          .addTarget(
+            prometheus.target(
+              expr='irate(collectd_numa_vmpage_action_total{instance="$host"}[$rate])',
+              legendFormat='{{numa}} - {{type}}'
+            )
+          )
+        )
+        .addPanel(
+          graphpanel.new(
+            title='TCP Connection Activity',
+            datasource='$PROMETHEUS_DS',
+            span=graphSpan,
+            format='short',
+            legend_hideEmpty=true,
+            legend_hideZero=true
+          )
+          .addTarget(
+            prometheus.target(
+              expr='collectd_tcpconns_tcp_connections{instance="$host"}',
+              legendFormat='{{tcpconns}} - {{type}}'
+            )
+          )
+        )
+        .addPanel(
+          graphpanel.new(
+            title='TCP Connection Activity',
+            datasource='$PROMETHEUS_DS',
+            span=graphSpan,
+            format='short',
+            legend_hideEmpty=true,
+            legend_hideZero=true
+          )
+          .addTarget(
+            prometheus.target(
+              expr='rate(collectd_protocols_protocol_counter_total{instance="$host"}[$rate])',
+              legendFormat='{{protocols}} - {{type}}'
+            )
+          )
+        )
+        .addPanel(
+          graphpanel.new(
+            title='Processor Speeds',
+            datasource='$PROMETHEUS_DS',
+            span=graphSpan,
+            format='hertz',
+            points=true,
+            lines=false,
+            pointradius=5,
+            legend_hideEmpty=true,
+            legend_hideZero=true
+          )
+          .addTarget(
+            prometheus.target(
+              expr='collectd_cpufreq{instance="$host"}',
+              legendFormat='{{cpufreq}}'
+            )
+          )
+        )
+        .addPanel(
+          graphpanel.new(
+            title='Page Cache Activity',
+            datasource='$PROMETHEUS_DS',
+            span=graphSpan,
+            format='short',
+            legend_hideEmpty=true,
+            legend_hideZero=true
+          )
+          .addTarget(
+            prometheus.target(
+              expr='rate(collectd_vmem_vmpage_faults_majflt_total{instance="$host"}[$rate])',
+              legendFormat='Major fault'
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='rate(collectd_vmem_vmpage_faults_minflt_total{instance="$host"}[$rate])',
+              legendFormat='Minor fault'
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='rate(collectd_vmem_vmpage_action_total{instance="$host"}[$rate])',
+              legendFormat='Action - {{vmem}}'
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='rate(collectd_vmem_vmpage_io_in_total{instance="$host"}[$rate])',
+              legendFormat='IO read page'
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='rate(collectd_vmem_vmpage_io_out_total{instance="$host"}[$rate])',
+              legendFormat='IO write page'
+            )
+          )
+        )
+        .addPanel(
+          graphpanel.new(
+            title='Page Cache Layout',
+            datasource='$PROMETHEUS_DS',
+            span=graphSpan,
+            format='short',
+            percentage=true,
+            stack=true,
+            min=0,
+            max=100,
+            legend_hideEmpty=true,
+            legend_hideZero=true
+          )
+          .addTarget(
+            prometheus.target(
+              expr='collectd_vmem_vmpage_number{instance="$host"}',
+              legendFormat='{{vmem}}'
+            )
+          )
+        )
+        .addPanel(
+          graphpanel.new(
+            title='Process Activity',
+            datasource='$PROMETHEUS_DS',
+            span=graphSpan,
+            format='short',
+            legend_hideEmpty=true,
+            legend_hideZero=true
+          )
+          .addTarget(
+            prometheus.target(
+              expr='collectd_processes_ps_count_threads{instance="$host"}',
+              legendFormat='Thread Count'
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='collectd_processes_ps_count_processes{instance="$host"}',
+              legendFormat='Process Count'
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='collectd_processes_ps_state{instance="$host"}',
+              legendFormat='Process State - {{processes}}'
+            )
+          )
+        )
+      )
+      .addRow(
+        row.new(
+          title='Basic Cassandra Overview',
+          height=singlestatHeight
+        )
+        .addPanel(
+          singlestat.new(
+            'SSTable Count',
+            description='Number of sstables on the node',
+            format='short',
+            datasource='$PROMETHEUS_DS',
+            sparklineShow=true,
+            gaugeShow=true,
+            span=singlestatSpan,
+            thresholds='100000,500000'
+          )
+          .addTarget(
+            prometheus.target(
+              'sum(' + $._config.metricPrefix + "_table_live_ss_table_count{instance='$host'})"
+            )
+          )
+        )
+        .addPanel(
+          singlestat.new(
+            'Pending Compactions',
+            description='Number of pending compactions on the node',
+            format='short',
+            datasource='$PROMETHEUS_DS',
+            sparklineShow=true,
+            gaugeShow=true,
+            span=singlestatSpan,
+            thresholds='10,50'
+          )
+          .addTarget(
+            prometheus.target(
+              'sum(' + $._config.metricPrefix + "_compaction_pending_tasks{instance='$host'})"
+            )
+          )
+        )
+        .addPanel(
+          singlestat.new(
+            'Connected Clients',
+            description='Number of client connections to the node',
+            format='percent',
+            datasource='$PROMETHEUS_DS',
+            sparklineShow=true,
+            gaugeShow=true,
+            span=singlestatSpan,
+            thresholds='100,1000'
+          )
+          .addTarget(
+            prometheus.target(
+              'sum(' + $._config.metricPrefix + "_client_connected_native_clients{instance='$host'})"
+            )
+          )
+        )
+        .addPanel(
+          graphpanel.new(
+            title='GC Activity',
+            datasource='$PROMETHEUS_DS',
+            span=graphSpan,
+            format='bytes',
+            legend_hideEmpty=true,
+            legend_hideZero=true
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum(' + $._config.metricPrefix + '_jvm_memory_max{instance="$host", memory_type="total"})',
+              legendFormat='JVM Heap Total'
+            )
+          )
+          .addSeriesOverride({
+            alias: '/.*Total.*/',
+            fill: 0,
+          })
+          .addTarget(
+            prometheus.target(
+              expr='sum(' + $._config.metricPrefix + '_jvm_memory_used{instance="$host", memory_type="non_heap"})',
+              legendFormat='JVM Non-Heap Used'
+            )
+          )
+          .addTarget(
+            prometheus.target(
+              expr='sum(' + $._config.metricPrefix + '_jvm_memory_used{instance="$host", memory_type="heap"})',
+              legendFormat='JVM Heap Used'
+            )
+          )
+        )
+      ),
+  },
+}
diff --git a/mixin/jsonnetfile.json b/mixin/jsonnetfile.json
new file mode 100644
index 0000000..8e6cf3c
--- /dev/null
+++ b/mixin/jsonnetfile.json
@@ -0,0 +1,24 @@
+{
+  "version": 1,
+  "dependencies": [
+    {
+      "source": {
+        "git": {
+          "remote": "https://github.com/grafana/grafonnet-lib.git",
+          "subdir": "grafonnet"
+        }
+      },
+      "version": "master"
+    },
+    {
+      "source": {
+        "git": {
+          "remote": "https://github.com/thelastpickle/grafonnet-polystat-panel.git",
+          "subdir": ""
+        }
+      },
+      "version": "master"
+    }
+  ],
+  "legacyImports": false
+}
diff --git a/mixin/jsonnetfile.lock.json b/mixin/jsonnetfile.lock.json
new file mode 100644
index 0000000..79d7d41
--- /dev/null
+++ b/mixin/jsonnetfile.lock.json
@@ -0,0 +1,26 @@
+{
+  "version": 1,
+  "dependencies": [
+    {
+      "source": {
+        "git": {
+          "remote": "https://github.com/grafana/grafonnet-lib.git",
+          "subdir": "grafonnet"
+        }
+      },
+      "version": "6db00c292d3a1c71661fc875f90e0ec7caa538c2",
+      "sum": "gF8foHByYcB25jcUOBqP6jxk0OPifQMjPvKY0HaCk6w="
+    },
+    {
+      "source": {
+        "git": {
+          "remote": "https://github.com/thelastpickle/grafonnet-polystat-panel.git",
+          "subdir": ""
+        }
+      },
+      "version": "275a48de57afdac0d72219d82863d8ab8bd0e682",
+      "sum": "pXSXxNxi4WvBKYZ83GVYotQyL+toHaizqvjJ+8YYMoU="
+    }
+  ],
+  "legacyImports": false
+}
diff --git a/mixin/make-dashboards.sh b/mixin/make-dashboards.sh
new file mode 100755
index 0000000..1fef13e
--- /dev/null
+++ b/mixin/make-dashboards.sh
@@ -0,0 +1,11 @@
+#!/usr/bin/env bash
+set -euo pipefail
+
+ROOT_DIR="$(cd -P "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
+OUTPUT_DIR="${ROOT_DIR}/dashboards/grafana/generated-dashboards"
+
+rm -rf "${OUTPUT_DIR}"
+mkdir "${OUTPUT_DIR}"
+
+docker run -v "${ROOT_DIR}:${ROOT_DIR}" datastax/grafonnet-lib:v0.1.3 \
+  jsonnet --multi "${OUTPUT_DIR}" "${ROOT_DIR}/mixin/dashboards.jsonnet"
diff --git a/mixin/mixin.libsonnet b/mixin/mixin.libsonnet
new file mode 100644
index 0000000..b291077
--- /dev/null
+++ b/mixin/mixin.libsonnet
@@ -0,0 +1,2 @@
+(import './dashboards/dashboards.libsonnet') +
+(import './config.libsonnet')