diff --git a/tor-daemon/grafana_dashboard.json b/tor-daemon/grafana_dashboard.json
--- a/tor-daemon/grafana_dashboard.json
+++ b/tor-daemon/grafana_dashboard.json
#
+ "name": "DS_INFLUXDB",
#
+ "type": "datasource",
#
+ "pluginId": "influxdb",
#
+ "pluginName": "InfluxDB"
#
+ "type": "datasource",
#
+ "name": "Time series",
#
+ "uid": "-- Grafana --"
#
+ "iconColor": "rgba(0, 211, 255, 1)",
#
+ "name": "Annotations & Alerts",
#
+ "fiscalYearStartMonth": 0,
#
+ "uid": "${DS_INFLUXDB}"
#
+ "mode": "palette-classic"
#
+ "axisCenteredZero": false,
#
+ "axisColorMode": "text",
#
+ "axisPlacement": "auto",
#
+ "gradientMode": "none",
#
+ "lineInterpolation": "linear",
#
+ "scaleDistribution": {
#
+ "showPoints": "auto",
#
+ "displayMode": "list",
#
+ "placement": "bottom",
#
+ "uid": "${DS_INFLUXDB}"
#
+ "query": "from(bucket: \"telegraf/autogen\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r._measurement == \"tor\" and r._field == \"dormant\")\n |> filter(fn: (r) => r.host == \"${host}\")\n |> aggregateWindow(every: v.windowPeriod, fn: max)",
#
+ "title": "Dormant Daemons",
#
+ "uid": "${DS_INFLUXDB}"
#
+ "mode": "palette-classic"
#
+ "axisCenteredZero": false,
#
+ "axisColorMode": "text",
#
+ "axisPlacement": "auto",
#
+ "gradientMode": "none",
#
+ "lineInterpolation": "linear",
#
+ "scaleDistribution": {
#
+ "showPoints": "auto",
#
+ "displayMode": "list",
#
+ "placement": "bottom",
#
+ "uid": "${DS_INFLUXDB}"
#
+ "query": "from(bucket: \"telegraf/autogen\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r._measurement == \"tor\")\n |> filter(fn: (r) => r.host == \"${host}\")\n |> filter(fn: (r) => r._field == \"stats_fetch_failures\")\n |> aggregateWindow(every: v.windowPeriod, fn: sum)",
#
+ "title": "Check Failures",
#
+ "uid": "${DS_INFLUXDB}"
#
+ "color": "dark-green",
#
+ "orientation": "auto",
#
+ "showThresholdLabels": false,
#
+ "showThresholdMarkers": true
#
+ "pluginVersion": "9.5.1",
#
+ "uid": "${DS_INFLUXDB}"
#
+ "query": "from(bucket: \"telegraf/autogen\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r._measurement == \"tor\")\n |> filter(fn: (r) => r._field == \"bytes_rx\")\n |> filter(fn: (r) => r.host == \"${host}\")\n |> last()\n |> map(fn: (r) => ({ \n host: r.host,\n _value: if r.network_liveness == \"up\" \n then\n 2\n else\n 0 \n \t ,\n _field: \"network_liveness\"\n }))",
#
+ "title": "Network Liveness ($host)",
#
+ "uid": "${DS_INFLUXDB}"
#
+ "text": "Unrecommended"
#
+ "text": "Recommended"
#
+ "text": "New in Series"
#
+ "color": "dark-green",
#
+ "orientation": "auto",
#
+ "showThresholdLabels": false,
#
+ "showThresholdMarkers": true,
#
+ "pluginVersion": "9.5.1",
#
+ "uid": "${DS_INFLUXDB}"
#
+ "query": "from(bucket: \"telegraf/autogen\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r._measurement == \"tor\")\n |> filter(fn: (r) => r._field == \"bytes_rx\")\n |> filter(fn: (r) => r.host == \"${host}\")\n |> last()\n |> map(fn: (r) => ({ \n host: r.host,\n _value: \n if r.version_status == \"recommended\"\n then\n // Good to go\n 4\n else if r.version_status == \"new\"\n then\n // Also Good\n 5\n else if r.version_status == \"new in series\"\n then\n 6\n\n else if r.version_status == \"old\"\n then\n // might be an issue in future\n 3\n else if r.version_status == \"unrecommended\"\n then\n // Uhoh\n 1\n else if r.version_status == \"obsolete\"\n then\n 2\n else\n // Unknown\n 7\n ,\n _field: \"version_status\"\n }))",
#
+ "title": "Software Version Status ($host)",
#
+ "uid": "${DS_INFLUXDB}"
#
+ "color": "dark-blue",
#
+ "color": "dark-green",
#
+ "orientation": "auto",
#
+ "showThresholdLabels": false,
#
+ "showThresholdMarkers": true
#
+ "pluginVersion": "9.5.1",
#
+ "uid": "${DS_INFLUXDB}"
#
+ "query": "from(bucket: \"telegraf/autogen\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r._measurement == \"tor\")\n |> filter(fn: (r) => r._field == \"accounting_bytes_read\")\n |> filter(fn: (r) => r.host == \"${host}\")\n |> last()\n|> map(fn: (r) => ({\n \t_value: if r.accounting_hibernating_state == \"awake\" then\n 2\n else if r.accounting_hibernating_state == \"soft\" then \n 4\n else if r.accounting_hibernating_state == \"hard\" then \n 6\n else \n \t0\n })) ",
#
+ "title": "Hibernation State ($host)",
#
+ "uid": "${DS_INFLUXDB}"
#
+ "colorMode": "value",
#
+ "justifyMode": "auto",
#
+ "orientation": "auto",
#
+ "pluginVersion": "9.5.1",
#
+ "uid": "${DS_INFLUXDB}"
#
+ "query": "from(bucket: \"telegraf/autogen\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r._measurement == \"tor\")\n |> filter(fn: (r) => r._field == \"bytes_tx\")\n |> filter(fn: (r) => r.host == \"${host}\")\n |> group()\n |> difference()\n |> filter(fn: (r) => r._value > 0)\n |> sum()\n |> map(fn: (r) => ({ r with\n \t_value: r._value\n }))",
#
+ "title": "Uploaded ($host)",
#
+ "uid": "${DS_INFLUXDB}"
#
+ "colorMode": "value",
#
+ "justifyMode": "auto",
#
+ "orientation": "auto",
#
+ "pluginVersion": "9.5.1",
#
+ "uid": "${DS_INFLUXDB}"
#
+ "query": "from(bucket: \"telegraf/autogen\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r._measurement == \"tor\")\n |> filter(fn: (r) => r._field == \"bytes_rx\")\n |> filter(fn: (r) => r.host == \"${host}\")\n |> group()\n |> difference()\n |> filter(fn: (r) => r._value > 0)\n |> sum()\n |> map(fn: (r) => ({ r with\n \t_value: r._value\n }))",
#
+ "title": "Downloaded ($host)",
#
+ "uid": "${DS_INFLUXDB}"
#
+ "colorMode": "value",
#
+ "justifyMode": "auto",
#
+ "orientation": "auto",
#
+ "pluginVersion": "9.5.1",
#
+ "uid": "${DS_INFLUXDB}"
#
+ "query": "from(bucket: \"telegraf/autogen\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r._measurement == \"tor\")\n |> filter(fn: (r) => r._field == \"uptime\")\n |> filter(fn: (r) => r.host == \"${host}\")\n |> group(columns: [\"host\", \"_field\"])\n |> sort(columns: [\"_time\"])\n |> last()\n |> map(fn: (r) => ({ r with \n _value: float(v: r._value) \n }))",
#
+ "title": "Current Uptime ($host)",
#
+ "uid": "${DS_INFLUXDB}"
#
+ "colorMode": "value",
#
+ "justifyMode": "auto",
#
+ "orientation": "auto",
#
+ "pluginVersion": "9.5.1",
#
+ "uid": "${DS_INFLUXDB}"
#
+ "query": "from(bucket: \"telegraf/autogen\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r._measurement == \"tor\")\n |> filter(fn: (r) => r._field == \"bytes_tx\")\n |> filter(fn: (r) => r.host == \"${host}\")\n |> group(columns: [\"host\", \"_field\"])\n |> sort(columns: [\"_time\"]) \n |> derivative(unit: 1s, nonNegative: true)\n |> max()\n |> map(fn: (r) => ({ r with \n _value: (r._value * 8.00) \n }))",
#
+ "title": "Max Observed Upload ($host)",
#
+ "uid": "${DS_INFLUXDB}"
#
+ "colorMode": "value",
#
+ "justifyMode": "auto",
#
+ "orientation": "auto",
#
+ "pluginVersion": "9.5.1",
#
+ "uid": "${DS_INFLUXDB}"
#
+ "query": "from(bucket: \"telegraf/autogen\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r._measurement == \"tor\")\n |> filter(fn: (r) => r._field == \"bytes_rx\")\n |> filter(fn: (r) => r.host == \"${host}\")\n |> group(columns: [\"host\", \"_field\"])\n |> sort(columns: [\"_time\"]) \n |> derivative(unit: 1s, nonNegative: true)\n |> max()\n |> map(fn: (r) => ({ r with \n _value: (r._value * 8.00) \n }))",
#
+ "title": "Max Observed Download ($host)",
#
+ "uid": "${DS_INFLUXDB}"
#
+ "colorMode": "value",
#
+ "justifyMode": "auto",
#
+ "orientation": "auto",
#
+ "pluginVersion": "9.5.1",
#
+ "uid": "${DS_INFLUXDB}"
#
+ "query": "from(bucket: \"telegraf/autogen\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r._measurement == \"tor\")\n |> filter(fn: (r) => r._field == \"uptime\")\n |> filter(fn: (r) => r.host == \"${host}\")\n |> group(columns: [\"host\", \"_field\"])\n |> sort(columns: [\"_time\"])\n |> max()\n |> map(fn: (r) => ({ r with \n _value: float(v: r._value) \n }))",
#
+ "title": "Max Observed Uptime ($host)",
#
+ "uid": "${DS_INFLUXDB}"
#
+ "mode": "palette-classic"
#
+ "axisCenteredZero": false,
#
+ "axisColorMode": "text",
#
+ "axisPlacement": "auto",
#
+ "gradientMode": "none",
#
+ "lineInterpolation": "linear",
#
+ "scaleDistribution": {
#
+ "showPoints": "auto",
#
+ "displayMode": "list",
#
+ "placement": "bottom",
#
+ "uid": "${DS_INFLUXDB}"
#
+ "query": "from(bucket: \"telegraf/autogen\")\n |> range(start: v.timeRangeStart)\n |> filter(fn: (r) => r._measurement == \"tor\")\n |> filter(fn: (r) => r.host == \"${host}\")\n |> filter(fn: (r) => r._field == \"guards_down\" or\n r._field == \"guards_never_connected\" or\n r._field == \"guards_total\" or\n r._field == \"guards_unlisted\" or\n r._field == \"guards_unusable\" or\n r._field == \"guards_up\")\n |>aggregateWindow(every: v.windowPeriod, fn: max)\n |>keep(columns: [\"_time\",\"host\", \"_field\", \"_value\"])\n ",
#
+ "title": "Guard Statuses ($host)",
#
+ "uid": "${DS_INFLUXDB}"
#
+ "mode": "palette-classic"
#
+ "axisCenteredZero": false,
#
+ "axisColorMode": "text",
#
+ "axisPlacement": "auto",
#
+ "gradientMode": "none",
#
+ "lineInterpolation": "linear",
#
+ "scaleDistribution": {
#
+ "showPoints": "auto",
#
+ "displayMode": "list",
#
+ "placement": "bottom",
#
+ "uid": "${DS_INFLUXDB}"
#
+ "query": "from(bucket: \"telegraf/autogen\")\n |> range(start: v.timeRangeStart)\n |> filter(fn: (r) => r._measurement == \"tor\")\n |> filter(fn: (r) => r.host == \"${host}\")\n |> filter(fn: (r) => r._field == \"uptime\")\n |> aggregateWindow(every: v.windowPeriod, fn: max)\n |> map(fn: (r) => ({ \n _time: r._time,\n host: r.host,\n _value: float(v: r._value)\n }))",
#
+ "title": "Daemon Uptime ($host)",
#
+ "title": "Resource Usage",
#
+ "uid": "${DS_INFLUXDB}"
#
+ "mode": "palette-classic"
#
+ "axisCenteredZero": false,
#
+ "axisColorMode": "text",
#
+ "axisPlacement": "auto",
#
+ "gradientMode": "none",
#
+ "lineInterpolation": "linear",
#
+ "scaleDistribution": {
#
+ "showPoints": "auto",
#
+ "displayMode": "list",
#
+ "placement": "bottom",
#
+ "uid": "${DS_INFLUXDB}"
#
+ "query": "from(bucket: \"telegraf/autogen\")\n |> range(start: v.timeRangeStart)\n |> filter(fn: (r) => r._measurement == \"cpu\")\n |> filter(fn: (r) => r.host == \"${host}\")\n |> filter(fn: (r) => r._field == \"usage_system\" or\n r._field == \"usage_user\" or\n r._field == \"usage_iowait\"\n )\n |> filter(fn: (r) => r.cpu == \"cpu-total\")\n |> aggregateWindow(every: v.windowPeriod, fn: mean)",
#
+ "title": "CPU Usage ($host)",
#
+ "uid": "${DS_INFLUXDB}"
#
+ "mode": "palette-classic"
#
+ "axisCenteredZero": false,
#
+ "axisColorMode": "text",
#
+ "axisPlacement": "auto",
#
+ "gradientMode": "none",
#
+ "lineInterpolation": "linear",
#
+ "scaleDistribution": {
#
+ "showPoints": "auto",
#
+ "displayMode": "list",
#
+ "placement": "bottom",
#
+ "uid": "${DS_INFLUXDB}"
#
+ "query": "from(bucket: \"telegraf/autogen\")\n |> range(start: v.timeRangeStart)\n |> filter(fn: (r) => r._measurement == \"mem\")\n |> filter(fn: (r) => r.host == \"${host}\")\n |> filter(fn: (r) => \n r._field == \"used_percent\"\n )\n\n |> aggregateWindow(every: v.windowPeriod, fn: mean)\n ",
#
+ "title": "CPU Usage ($host)",
#
+ "uid": "${DS_INFLUXDB}"
#
+ "mode": "palette-classic"
#
+ "axisCenteredZero": false,
#
+ "axisColorMode": "text",
#
+ "axisPlacement": "auto",
#
+ "gradientMode": "none",
#
+ "lineInterpolation": "linear",
#
+ "scaleDistribution": {
#
+ "showPoints": "auto",
#
+ "displayMode": "list",
#
+ "placement": "bottom",
#
+ "uid": "${DS_INFLUXDB}"
#
+ "query": "from(bucket: \"telegraf/autogen\")\n |> range(start: v.timeRangeStart)\n |> filter(fn: (r) => r._measurement == \"tor\")\n |> filter(fn: (r) => r._field == \"bytes_rx\" or r._field == \"bytes_tx\")\n |> filter(fn: (r) => r.host == \"${host}\")\n |> group(columns: [\"host\", \"_field\"])\n |> sort(columns: [\"_time\"])\n |> derivative(unit: 1s, nonNegative: true)\n |> aggregateWindow(every: v.windowPeriod, fn: mean)\n |> map(fn: (r) => ({ r with \n _time: r._time,\n _field: r._field,\n host: r.host,\n _value: r._value * 8.00\n })) \n",
#
+ "title": "Network Throughput ($host)",
#
+ "title": "Accounting",
#
+ "uid": "${DS_INFLUXDB}"
#
+ "colorMode": "value",
#
+ "justifyMode": "auto",
#
+ "orientation": "auto",
#
+ "pluginVersion": "9.5.1",
#
+ "uid": "${DS_INFLUXDB}"
#
+ "query": "from(bucket: \"telegraf/autogen\")\n |> range(start: v.timeRangeStart)\n |> filter(fn: (r) => r._measurement == \"tor\")\n |> filter(fn: (r) => r.host == \"${host}\")\n |> filter(fn: (r) => r._field == \"accounting_period_seconds_elapsed\")\n |> last()\n |> map(fn: (r) => ({\n \t_value: float(v: r._value)\n }))",
#
+ "title": "Time Elapsed in Accounting Period",
#
+ "uid": "${DS_INFLUXDB}"
#
+ "colorMode": "value",
#
+ "justifyMode": "auto",
#
+ "orientation": "auto",
#
+ "pluginVersion": "9.5.1",
#
+ "uid": "${DS_INFLUXDB}"
#
+ "query": "from(bucket: \"telegraf/autogen\")\n |> range(start: v.timeRangeStart)\n |> filter(fn: (r) => r._measurement == \"tor\")\n |> filter(fn: (r) => r.host == \"${host}\")\n |> filter(fn: (r) => r._field == \"accounting_period_seconds_remaining\")\n |> last()\n |> map(fn: (r) => ({\n \t_value: float(v: r._value)\n }))",
#
+ "title": "Time Remaining in Accounting Period",
#
+ "uid": "${DS_INFLUXDB}"
#
+ "mode": "palette-classic"
#
+ "axisCenteredZero": false,
#
+ "axisColorMode": "text",
#
+ "axisPlacement": "auto",
#
+ "gradientMode": "none",
#
+ "lineInterpolation": "linear",
#
+ "scaleDistribution": {
#
+ "showPoints": "auto",
#
+ "displayMode": "list",
#
+ "placement": "bottom",
#
+ "uid": "${DS_INFLUXDB}"
#
+ "query": "from(bucket: \"telegraf/autogen\")\n |> range(start: v.timeRangeStart)\n |> filter(fn: (r) => r._measurement == \"tor\")\n |> filter(fn: (r) => r._field == \"accounting_bytes_read\" or r._field == \"accounting_bytes_write\")\n |> filter(fn: (r) => r.host == \"${host}\")\n |> group(columns: [\"host\",\"_field\"])\n |> aggregateWindow(every: v.windowPeriod, fn: max)\n ",
#
+ "title": "Accounting Bytes Usage ($host)",
#
+ "uid": "${DS_INFLUXDB}"
#
+ "mode": "palette-classic"
#
+ "axisCenteredZero": false,
#
+ "axisColorMode": "text",
#
+ "axisPlacement": "auto",
#
+ "gradientMode": "none",
#
+ "lineInterpolation": "linear",
#
+ "scaleDistribution": {
#
+ "showPoints": "auto",
#
+ "displayMode": "list",
#
+ "placement": "bottom",
#
+ "uid": "${DS_INFLUXDB}"
#
+ "query": "from(bucket: \"telegraf/autogen\")\n |> range(start: v.timeRangeStart)\n |> filter(fn: (r) => r._measurement == \"tor\")\n |> filter(fn: (r) => r._field == \"accounting_bytes_remaining_read\" or r._field == \"accounting_bytes_remaining_write\")\n |> filter(fn: (r) => r.host == \"${host}\")\n |> group(columns: [\"host\",\"_field\"])\n |> aggregateWindow(every: v.windowPeriod, fn: max)\n ",
#
+ "title": "Accounting Bytes Remaining ($host)",
#
+ "uid": "${DS_INFLUXDB}"
#
+ "definition": "from(bucket: \"telegraf\")\n|> range(start: v.timeRangeStart)\n|> filter(fn: (r) => r._measurement == \"tor\")\n|> keyValues(keyColumns: [\"host\"])\n|> group()\n|> keep(columns: [\"_value\"])",
#
+ "query": "from(bucket: \"telegraf\")\n|> range(start: v.timeRangeStart)\n|> filter(fn: (r) => r._measurement == \"tor\")\n|> keyValues(keyColumns: [\"host\"])\n|> group()\n|> keep(columns: [\"_value\"])",
#
+ "skipUrlSync": false,
#
\ No newline at end of file