{{ template "head" . }}

{{ template "prom_right_table_head" }}
  <th colspan="2">Disks</th>
</tr>
{{ range printf "node_disk_io_time_ms{job='node',instance='%s'}" .Params.instance | query | sortByLabel "device" }}
  <th colspan="2">{{ .Labels.device }}</th>
  <tr>
    <td>Utilization</td>
    <td>{{ template "prom_query_drilldown" (args (printf "irate(node_disk_io_time_ms{job='node',instance='%s',device='%s'}[5m]) / 1000 * 100" .Labels.instance .Labels.device) "%" "printf.1f") }}</td>
  </tr>
  <tr>
    <td>Throughput</td>
    <td>{{ template "prom_query_drilldown" (args (printf "irate(node_disk_sectors_read{job='node',instance='%s',device='%s'}[5m]) * 512 + irate(node_disk_sectors_written{job='node',instance='%s',device='%s'}[5m]) * 512" .Labels.instance .Labels.device .Labels.instance .Labels.device) "B/s" "humanize") }}</td>
  </tr>
  <tr>
    <td>Avg Read Time</td>
    <td>{{ template "prom_query_drilldown" (args (printf "irate(node_disk_read_time_ms{job='node',instance='%s',device='%s'}[5m]) / 1000 / irate(node_disk_reads_completed{job='node',instance='%s',device='%s'}[5m])" .Labels.instance .Labels.device .Labels.instance .Labels.device) "s" "humanize") }}</td>
  </tr>
  <tr>
    <td>Avg Write Time</td>
    <td>{{ template "prom_query_drilldown" (args (printf "irate(node_disk_write_time_ms{job='node',instance='%s',device='%s'}[5m]) / 1000 / irate(node_disk_writes_completed{job='node',instance='%s',device='%s'}[5m])" .Labels.instance .Labels.device .Labels.instance .Labels.device) "s" "humanize") }}</td>
  </tr>
{{ end }}
  <th colspan="2">Filesystem Fullness</th>
</tr>
{{ define "roughlyNearZero" }}
{{ if gt .1 . }}~0{{ else }}{{ printf "%.1f" . }}{{ end }}
{{ end }}
{{ range printf "node_filesystem_size{job='node',instance='%s'}" .Params.instance | query | sortByLabel "mountpoint" }}
  <tr>
    <td>{{ .Labels.mountpoint }}</td>
    <td>{{ template "prom_query_drilldown" (args (printf "100 - node_filesystem_free{job='node',instance='%s',mountpoint='%s'} / node_filesystem_size{job='node'} * 100" .Labels.instance .Labels.mountpoint) "%" "roughlyNearZero") }}</td>
  </tr>
{{ end }}
<tr>
</tr>
{{ template "prom_right_table_tail" }}

{{ template "prom_content_head" . }}
  <h1>Node Disk - {{ reReplaceAll "(.*?://)([^:/]+?)(:\\d+)?/.*" "$2" .Params.instance }}</h1>

  <h3>Disk I/O Utilization</h3>
  <div id="diskioGraph"></div>
  <script>
  new PromConsole.Graph({
    node: document.querySelector("#diskioGraph"),
    expr: [
      "irate(node_disk_io_time_ms{job='node',instance='{{ .Params.instance }}',device!~'^(md\\\\d+$|dm-)'}[5m]) / 1000 * 100",
    ],
    min: 0,
    name: '[[ device ]]',
    yUnits: "%",
    yAxisFormatter: PromConsole.NumberFormatter.humanizeNoSmallPrefix,
    yHoverFormatter: PromConsole.NumberFormatter.humanizeNoSmallPrefix,
    yTitle: 'Disk I/O Utilization'
  })
  </script>
  <h3>Filesystem Usage</h3>
  <div id="fsGraph"></div>
  <script>
  new PromConsole.Graph({
    node: document.querySelector("#fsGraph"),
    expr: "100 - node_filesystem_free{job='node',instance='{{ .Params.instance }}'} / node_filesystem_size{job='node'} * 100",
    min: 0,
    max: 100,
    name: '[[ mountpoint ]]',
    yUnits: "%",
    yAxisFormatter: PromConsole.NumberFormatter.humanizeNoSmallPrefix,
    yHoverFormatter: PromConsole.NumberFormatter.humanizeNoSmallPrefix,
    yTitle: 'Filesystem Fullness'
  })
  </script>
{{ template "prom_content_tail" . }}

{{ template "tail" }}
