[
  {
    "path": ".forgejo/scripts/deploy-documentation.sh",
    "content": "#!/usr/bin/env bash\n\necho \"$SSH_PRIVATE_KEY\" > .ssh_private_key\ncleanup() {\n    rm .ssh_private_key\n}\ntrap cleanup EXIT\nchmod 600 .ssh_private_key\n\nset -x\n\nrsync -Pavz --delete -e \"ssh -i .ssh_private_key -o StrictHostKeyChecking=no\" \\\n    _site/ \"concourse-deploy-robot@${TARGET}:/persist/srv/http/barrucadu.dev/docs/nixfiles/\"\n"
  },
  {
    "path": ".forgejo/workflows/deploy-documentation.yml",
    "content": "on:\n  push:\n    branches: [\"master\"]\n\njobs:\n  deploy_documentation:\n    runs-on: nix\n    steps:\n      - name: Install tools\n        run: |\n          nix-env -iA nixpkgs.nodejs_24 nixpkgs.rsync\n      - uses: https://code.forgejo.org/actions/checkout@v4\n      - name: Build\n        run: |\n          nix --extra-experimental-features \"nix-command flakes\" run .\\#documentation\n      - name: Deploy carcosa\n        run: bash -e .forgejo/scripts/deploy-documentation.sh\n        env:\n          SSH_PRIVATE_KEY: ${{ secrets.CARCOSA_SSH_PRIVATE_KEY }}\n          TARGET: carcosa.barrucadu.co.uk\n      - name: Deploy yuggoth\n        run: bash -e .forgejo/scripts/deploy-documentation.sh\n        env:\n          SSH_PRIVATE_KEY: ${{ secrets.YUGGOTH_SSH_PRIVATE_KEY }}\n          TARGET: yuggoth.barrucadu.co.uk\n"
  },
  {
    "path": ".github/dependabot.yml",
    "content": "version: 2\nupdates:\n  - package-ecosystem: github-actions\n    directory: /\n    schedule:\n      interval: daily\n"
  },
  {
    "path": ".github/workflows/ci.yaml",
    "content": "name: Run tests\n\non: pull_request\n\njobs:\n  lint:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v6\n      - uses: cachix/install-nix-action@v31\n        with:\n          nix_path: nixpkgs=channel:nixos-unstable\n      - name: Lint\n        run: |\n          set -ex\n          nix flake check\n          nix run .#fmt\n          nix run .#lint\n          git diff --exit-code\n\n  test:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v6\n      - uses: cachix/install-nix-action@v31\n        with:\n          nix_path: nixpkgs=channel:nixos-unstable\n      - name: Check documentation site builds\n        run: nix run .#documentation\n"
  },
  {
    "path": ".github/workflows/github-pages.yml",
    "content": "on:\n  push:\n    branches: [\"master\"]\n  workflow_dispatch:\n\npermissions:\n  contents: read\n  pages: write\n  id-token: write\n\nconcurrency:\n  group: \"pages\"\n  cancel-in-progress: false\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Setup Pages\n        uses: actions/configure-pages@v6\n      - name: Create placeholder site\n        run: |\n          mkdir _site\n          cat <<EOF > _site/index.html\n            <!DOCTYPE html>\n            <html>\n              <head>\n                <meta charset=\"utf-8\">\n                <title>Redirecting to https://nixfiles.docs.barrucadu.dev/</title>\n                <meta http-equiv=\"refresh\" content=\"0; url=https://nixfiles.docs.barrucadu.dev/\">\n                <link rel=\"canonical\" href=\"https://nixfiles.docs.barrucadu.dev/\">\n              </head>\n              <body>\n                <p>This website has moved to <a href=\"https://nixfiles.docs.barrucadu.dev/\">\"https://nixfiles.docs.barrucadu.dev/</a></p>\n              </body>\n            </html>\n          EOF\n      - name: Upload artifact\n        uses: actions/upload-pages-artifact@v5\n\n  # Deployment job\n  deploy:\n    environment:\n      name: github-pages\n      url: ${{ steps.deployment.outputs.page_url }}\n    runs-on: ubuntu-latest\n    needs: build\n    steps:\n      - name: Deploy to GitHub Pages\n        id: deployment\n        uses: actions/deploy-pages@v5\n"
  },
  {
    "path": ".gitignore",
    "content": "/_site\n"
  },
  {
    "path": ".sops.yaml",
    "content": "keys:\n  - &barrucadu 'age1sdnp5uxhdtujc78penv2gntnenzcfju7est4hslz6eqgfk26u9nskkk634'\n\ncreation_rules:\n  - path_regex: hosts/carcosa/secrets(/[^/]+)?\\.yaml$\n    key_groups:\n      - age:\n          - *barrucadu\n          - 'age1ty4vs59695vuavnvgdftguyq2aau29nv75y4tqrr6ag8z26vfc5sc5rc4n'\n\n  - path_regex: hosts/nyarlathotep/secrets(/[^/]+)?\\.yaml$\n    key_groups:\n      - age:\n          - *barrucadu\n          - 'age1700sgwfejx38fh66k6sajxe507w9x6ptcxfh4dmyffflml75w4fqmteyfy'\n\n  - path_regex: hosts/yuggoth/secrets(/[^/]+)?\\.yaml$\n    key_groups:\n      - age:\n          - *barrucadu\n          - 'age1xj0vderjss6wvyuu5uw5gag6lhxzfh6qwfrewgpff5ttpfa03azsxc8600'\n"
  },
  {
    "path": "README.markdown",
    "content": "nixfiles\n========\n\nMy [NixOS][] configuration and assorted other crap, powered by [flakes][].\nClone to `/etc/nixos`.\n\nCI checks ensure that code is formatted and passes linting.  Run those locally\nwith:\n\n```bash\nnix flake check\nnix run .#fmt\nnix run .#lint\n```\n\nSee [the documentation](https://nixfiles.docs.barrucadu.dev).\n\n[NixOS]: https://nixos.org\n[flakes]: https://wiki.nixos.org/wiki/Flakes\n\n\nOverview\n--------\n\nThis is an opinionated config making assumptions which work for me but might not\nfor you:\n\n- These are primarily single-user hosts, with me being that user.  While\n  security and availability are important, convenience takes priority.\n- Observability is good but there's no central graphing or alerting stack, every\n  host has to run their own.\n- Databases should not be shared, each service has its own containerised\n  instance.  This means a single host may run several instances of the same\n  database software, but that's an acceptable overhead.\n- Persistent docker volumes should be backed by bind-mounts to the filesystem.\n- For ZFS systems, [wiping `/` on boot][] is good actually.\n\nEverything in `shared/default.nix` is **enabled on every host by default**.\nNotable decisions are:\n\n- Every user gets a `~/tmp` directory with files cleaned out after 7 days.\n- Automatic upgrades (including reboots if needed), automatic deletions of\n  generations older than 30 days, and automatic garbage collection are all\n  enabled.\n- Locale, timezone, and keyboard layout all set to UK / GB values (yes, even on\n  servers).\n- Firewall and fail2ban are enabled, but pings are explicitly allowed.\n- SSH accepts pubkey auth only: no passwords.\n- Syncthing is enabled.\n\nFor monitoring and alerting specifically:\n\n- Prometheus, Grafana, and Alertmanager are all enabled by default (Alertmanager\n  needs AWS credentials provided to actually send alerts).\n- The Node Exporter is enabled, along with a dashboard.\n- cAdvisor is enabled, along with a dashboard.\n\nIf using ZFS there are a few more things configured:\n\n- All pools are scrubbed monthly.\n- The auto-trim and auto-snapshot jobs are enabled (for pools which have those\n  configured).\n- There's a Prometheus alert for pools in a state other than \"online\".\n\nEverything else in `shared/` is available to every host, but disabled by\ndefault.\n\n[wiping `/` on boot]: https://grahamc.com/blog/erase-your-darlings\n\n\nTools\n-----\n\n### Backups\n\nBackups are managed by `shared/restic-backups` and uploaded to [Backblaze B2][]\nwith [restic][].\n\nList all the snapshots with:\n\n```bash\nnix run .#backups                                # all snapshots\nnix run .#backups -- snapshots --host <hostname> # for a specific host\nnix run .#backups -- snapshots --tag <tag>       # for a specific tag\n```\n\nRestore a snapshot to `<restore-dir>` with:\n\n```bash\nnix run .#backups restore <snapshot> [<restore-dir>]\n```\n\nIf unspecified, the snapshot is restored to `/tmp/restic-restore-<snapshot>`.\n\n[Backblaze B2]: https://www.backblaze.com/\n[restic]: https://restic.net/\n\n### Secrets\n\nSecrets are managed with [sops-nix][].  Create / edit secrets with:\n\n```bash\nnix run .#secrets                   # secrets.yaml for current host\nnix run .#secrets <hostname>        # secrets.yaml for <hostname>\nnix run .#secrets <hostname> <name> # <name>.yaml for <hostname>\n```\n\n[sops-nix]: https://github.com/Mic92/sops-nix\n"
  },
  {
    "path": "docs/.gitignore",
    "content": "book\n\n# generated by the build script\nsrc/README.md\nsrc/hosts.md\nsrc/host-templates.md\nsrc/modules.md\nsrc/options.md\nsrc/packages.md\n"
  },
  {
    "path": "docs/book.toml",
    "content": "[book]\ntitle = \"nixfiles\"\nauthors = [\"Michael Walker (barrucadu)\"]\ndescription = \"My NixOS configuration and assorted other crap, powered by flakes.\"\nlanguage = \"en\"\n\n[build]\ncreate-missing = false\n\n[output.html]\ngit-repository-url = \"https://github.com/barrucadu/nixfiles\"\ncname = \"nixfiles.docs.barrucadu.dev\"\n"
  },
  {
    "path": "docs/src/SUMMARY.md",
    "content": "# Summary\n\n[README](./README.md)\n\n# Reference\n\n- [Hosts](./hosts.md)\n- [Host Templates](./host-templates.md)\n- [Modules](./modules.md)\n- [Options](./options.md)\n\n# Alert Runbooks\n\n- [DiskSpaceLow](./runbooks/alerts/diskspacelow.md)\n- [ZPoolStatusDegraded](./runbooks/alerts/zpoolstatusdegraded.md)\n\n# \"How to\" Runbooks\n\n- [Set up a new host](./runbooks/set-up-a-new-host.md)\n- [Move a configuration to a new machine](./runbooks/move-a-configuration-to-a-new-machine.md)\n- [Upgrade to a new version of elasticsearch](./runbooks/upgrade-to-a-new-version-of-elasticsearch.md)\n- [Upgrade to a new version of postgres](./runbooks/upgrade-to-a-new-version-of-postgres.md)\n"
  },
  {
    "path": "docs/src/runbooks/alerts/diskspacelow.md",
    "content": "DiskSpaceLow\n============\n\nThis alert fires when a partition has under 10% free space remaining.\n\nThe alert will say which partitions are affected, `df -h` also has the\ninformation:\n\n```\n$ df -h\nFilesystem                Size  Used Avail Use% Mounted on\ndevtmpfs                  1.6G     0  1.6G   0% /dev\ntmpfs                      16G  112K   16G   1% /dev/shm\ntmpfs                     7.8G  9.8M  7.8G   1% /run\ntmpfs                      16G  1.1M   16G   1% /run/wrappers\nlocal/volatile/root       1.7T  1.8G  1.7T   1% /\nlocal/persistent/nix      1.7T  5.1G  1.7T   1% /nix\nlocal/persistent/persist  1.7T  2.0G  1.7T   1% /persist\nlocal/persistent/var-log  1.7T  540M  1.7T   1% /var/log\nefivarfs                  128K   40K   84K  33% /sys/firmware/efi/efivars\nlocal/persistent/home     1.7T   32G  1.7T   2% /home\n/dev/nvme0n1p2            487M   56M  431M  12% /boot\ndata/nas                   33T   22T   11T  68% /mnt/nas\ntmpfs                     3.2G   12K  3.2G   1% /run/user/1000\n```\n\nNote all ZFS datasets in the same pool (`local/*` and `data/*` in the example\nabove) share the underlying storage.\n\nDebugging steps:\n\n- See the `node_filesystem_avail_bytes` metric for how quickly disk space is\n  being consumed\n- Use `ncdu -x` to work out where the space is going\n- Buy more storage if need be\n"
  },
  {
    "path": "docs/src/runbooks/alerts/zpoolstatusdegraded.md",
    "content": "ZPoolStatusDegraded\n===================\n\nThis alert fires when an HDD fails.\n\nThe `zpool status -x` command will say which drive has failed; what,\nspecifically, the problem is; and link to a runbook:\n\n```\n$ zpool status -x\n  pool: data\n state: DEGRADED\nstatus: One or more devices could not be used because the label is missing or\n        invalid.  Sufficient replicas exist for the pool to continue\n        functioning in a degraded state.\naction: Replace the device using 'zpool replace'.\n   see: https://openzfs.github.io/openzfs-docs/msg/ZFS-8000-4J\n  scan: scrub in progress since Thu Feb  1 00:00:01 2024\n        19.3T / 20.6T scanned at 308M/s, 17.8T / 20.6T issued at 284M/s\n        0B repaired, 86.49% done, 02:51:42 to go\nconfig:\n\n        NAME                                         STATE     READ WRITE CKSUM\n        data                                         DEGRADED     0     0     0\n          mirror-0                                   DEGRADED     0     0     0\n            11478606759844821041                     UNAVAIL      0     0     0  was /dev/disk/by-id/ata-ST10000VN0004-1ZD101_ZA206882-part2\n            ata-ST10000VN0004-1ZD101_ZA27G6C6-part2  ONLINE       0     0     0\n          mirror-1                                   ONLINE       0     0     0\n            ata-ST10000VN0004-1ZD101_ZA22461Y        ONLINE       0     0     0\n            ata-ST10000VN0004-1ZD101_ZA27BW6R        ONLINE       0     0     0\n          mirror-2                                   ONLINE       0     0     0\n            ata-ST10000VN0008-2PJ103_ZLW0398A        ONLINE       0     0     0\n            ata-ST10000VN0008-2PJ103_ZLW032KE        ONLINE       0     0     0\n\nerrors: No known data errors\n```\n\nFollow the provided runbook.  In most cases the solution will be to:\n\n1. Buy a new HDD (of at least the same size as the failed one)\n1. Physically replace the failed HDD with the new one\n1. Run `zpool replace <pool> <old-device> <new-device>`\n1. Wait for the new device to resilver\n"
  },
  {
    "path": "docs/src/runbooks/move-a-configuration-to-a-new-machine.md",
    "content": "Move a configuration to a new machine\n=====================================\n\nFollow the [set up a new host](./set-up-a-new-host.md) instructions up to\n**step 5** (cloning the nixfiles repo to `/etc/nixos`).\n\nThen:\n\n1. Merge the generated machine configuration into the nixfiles configuration\n1. Copy the sops master key to `.config/sops/age/keys.txt`\n1. **If using secrets:** Re-encrypt the secrets\n1. **If there is a backup:** Restore the latest backup\n1. Remove the sops master key\n1. **If wiping / on boot:** Copy any files which need to be preserved to the appropriate place in `/persist`\n1. **Optional:** Update DNS records\n1. **Optional:** Generate SSH key\n1. Build the new system configuration with `sudo nixos-rebuild switch --flake '.#<hostname>'`\n1. Reboot\n1. Commit, push, & merge\n1. **Optional:** Configure Syncthing\n\n\nIf using secrets: Re-encrypt the secrets\n----------------------------------------\n\nAfter first boot, generate an age public key from the host SSH key:\n\n```bash\nnix-shell -p ssh-to-age --run 'ssh-keyscan localhost | ssh-to-age'\n```\n\nReplace the old key in `.sops.yaml` with the new key:\n\n```yaml\ncreation_rules:\n  ...\n  - path_regex: hosts/<hostname>/secrets(/[^/]+)?\\.yaml$\n    key_groups:\n      - age:\n          - *barrucadu\n          - '<old-key>' # delete\n          - '<new-key>' # insert\n```\n\nUpdate the host's encryption key:\n\n```bash\nnix shell \"nixpkgs#sops\" -c sops updatekeys hosts/<hostname>/secrets.yaml\n```\n\n\nIf there is a backup: Restore the latest backup\n-----------------------------------------------\n\nDownload the latest backup to `/tmp/backup-restore`:\n\n```bash\nnix run .#backups restore <hostname>\n```\n\nThen move files to restore to the appropriate locations.\n\n\nOptional: Update DNS records\n----------------------------\n\nIf there are any DNS records referring to the old machine which are now\nincorrect (e.g. due to an IP address change), make the needed changes to [the\nops repo][] and apply the change via [Concourse][].\n\n[the ops repo]: https://github.com/barrucadu/ops\n[Concourse]: https://cd.barrucadu.dev/\n\n\nOptional: Generate SSH key\n--------------------------\n\nGenerate an ed25519 SSH key:\n\n```bash\nssh-keygen -t ed25519\n```\n\n**If the host should be able to interact with GitHub:** add the public key to\nthe GitHub user configuration *as an SSH key*.\n\n**If the host should be able to push commits to GitHub:** add\nthe public key to the GitHub user configuration *as a signing key*, and also add\nit to [the allowed_signers\nfile](https://github.com/barrucadu/dotfiles/blob/master/dot_config/git/allowed_signers.tmpl).\n\n**If the host should be able to connect to other machines:** add the public key\nto `shared/default.nix`.\n\nRemove the old SSH key for this host from anywhere it's used.\n\n\nOptional: Configure Syncthing\n-----------------------------\n\nUse the Syncthing Web UI (`localhost:8384`) to get the machine's ID.  Replace\nthe old machine's ID and folder sharing permissions with the new machine, for\nany other machines which synchronised files with it.\n"
  },
  {
    "path": "docs/src/runbooks/set-up-a-new-host.md",
    "content": "Set up a new host\n=================\n\n> [!NOTE]\n> See also [the NixOS installation instructions](https://nixos.org/manual/nixos/stable/index.html#ch-installation).\n\nInstall NixOS\n-------------\n\nBoot into the ISO and install NixOS with `tools/provision-machine.sh`:\n\n```bash\nsudo -i\nnix-env -f '<nixpkgs>' -iA git\ncurl https://raw.githubusercontent.com/barrucadu/nixfiles/master/tools/provision-machine.sh > provision-machine.sh\nbash provision-machine.sh gpt /dev/sda\n```\n\nThen:\n\n1. Rename `/mnt/persist/etc/nixos/hosts/new` after the new hostname\n2. Add the host to `/mnt/persist/etc/nixos/flake.nix`\n3. Add the new files to git\n4. Run `nixos-install --flake /mnt/persist/etc/nixos#hostname`\n5. Reboot\n\n\nFirst boot\n----------\n\nGenerate an age public key from the host SSH key:\n\n```bash\nnix-shell -p ssh-to-age --run 'ssh-keyscan localhost | ssh-to-age'\n```\n\nAdd a new section with this key to `/persist/etc/nixos/.sops.yaml`:\n\n```yaml\ncreation_rules:\n  ...\n  - path_regex: hosts/<hostname>/secrets(/[^/]+)?\\.yaml$\n    key_groups:\n      - age:\n          - *barrucadu\n          - '<key>'\n```\n\nAdd a `users/barrucadu` secret with the hashed user password:\n\n```bash\nnix run .#secrets\n```\n\nCopy the host SSH keys to `/etc/persist`:\n\n```bash\nsudo mkdir /persist/etc/ssh\nsudo cp /etc/ssh/ssh_host_rsa_key /persist/etc/ssh/ssh_host_rsa_key\nsudo cp /etc/ssh/ssh_host_ed25519_key /persist/etc/ssh/ssh_host_ed25519_key\n```\n\nEnable `nixfiles.eraseYourDarlings`:\n\n```nix\nnixfiles.eraseYourDarlings.enable = true;\nnixfiles.eraseYourDarlings.barrucaduPasswordFile = config.sops.secrets.\"users/barrucadu\".path;\nsops.secrets.\"users/barrucadu\".neededForUsers = true;\n```\n\nMake the `/persist` volume available in early boot:\n\n```nix\nfileSystems.\"/persist\" =\n  {\n    device = \"local/persistent/persist\";\n    fsType = \"zfs\";\n    neededForBoot = true;\n  };\n```\n\nThen:\n\n1. Rebuild the system: `sudo nixos-rebuild boot --flake /persist/etc/nixos`\n2. Reboot\n\n\nOptional: Add DNS records\n-------------------------\n\nAdd `A` / `AAAA` records to [the ops repo][] and apply the change via\n[Concourse][].\n\n[the ops repo]: https://github.com/barrucadu/ops\n[Concourse]: https://cd.barrucadu.dev/\n\n\nOptional: Configure alerting\n----------------------------\n\nAll hosts have [Alertmanager][] installed and enabled.  To actually publish\nalerts, create a secret for the environment file with credentials for the\n`host-notifications` SNS topic:\n\n```text\nAWS_ACCESS_KEY=\"...\"\nAWS_SECRET_ACCESS_KEY=\"...\"\n```\n\nThen configure the environment file:\n\n```nix\nservices.prometheus.alertmanager.environmentFile = config.sops.secrets.\"services/alertmanager/env\".path;\nsops.secrets.\"services/alertmanager/env\" = { };\n```\n\n[Alertmanager]: https://prometheus.io/docs/alerting/latest/alertmanager/\n\n\nOptional: Configure backups\n---------------------------\n\nAll hosts which run any sort of service with data I care about should take\nautomatic backups.\n\nFirstly, add the backup credentials to the secrets:\n\n```bash\nnix run .#secrets\n```\n\nThen enable backups in the host configuration:\n\n```nix\nnixfiles.restic-backups.enable = true;\nnixfiles.restic-backups.environmentFile = config.sops.secrets.\"nixfiles/restic-backups/env\".path;\nsops.secrets.\"nixfiles/restic-backups/env\" = { };\n```\n\nMost services define their own backup scripts.  For any other needs, write a\ncustom backup job:\n\n```nix\nnixfiles.restic-backups.backups.<name> = { ... };\n```\n\n\nOptional: Generate SSH key\n--------------------------\n\nGenerate an ed25519 SSH key:\n\n```bash\nssh-keygen -t ed25519\n```\n\n**If the host should be able to interact with GitHub:** add the public key to\nthe GitHub user configuration *as an SSH key*.\n\n**If the host should be able to push commits to GitHub:** add\nthe public key to the GitHub user configuration *as a signing key*, and also add\nit to [the allowed_signers\nfile](https://github.com/barrucadu/dotfiles/blob/master/dot_config/git/allowed_signers.tmpl).\n\n**If the host should be able to connect to other machines:** add the public key\nto `shared/default.nix`.\n\n\nOptional: Configure Syncthing\n-----------------------------\n\nUse the Syncthing Web UI (`localhost:8384`) to get the machine's ID.  Add this\nID to any other machines which it should synchronise files with, through their\nweb UIs.\n\nThen configure any shared folders.\n\n"
  },
  {
    "path": "docs/src/runbooks/upgrade-to-a-new-version-of-elasticsearch.md",
    "content": "Upgrade to a new version of elasticsearch\n====================================\n\n\nChange the default elasticsearch version for a module\n-----------------------------------------------------\n\n1. Individually upgrade all hosts to the new version, following the processes below.\n2. Change the default value of the `elasticsearchTag` option for the module.\n3. Remove the per-host `elasticsearchTag` options.\n\n\nUpgrade to a new minor version\n------------------------------\n\nThis is generally safe.  Just change the `elasticsearchTag` and rebuild the NixOS\nconfiguration.\n\n\nUpgrade to a new major version\n------------------------------\n\nIn brief: take a backup, upgrade to the latest minor release of the current\nmajor version, fix any application warnings, and then upgrade to the initial\nrelease of the new major version.\n\nShell variables:\n\n- `$VOLUME_DIR` - the directory on the host that the container's `/usr/share/elasticsearch/data` is bind-mounted to\n\n1. Upgrade to the latest minor release of the current major version.\n\n    1. Change the `elasticsearchTag` option in the host's NixOS configuration to the latest minor release of the current major version.\n\n    2. Rebuild the NixOS configuration and check that the database and all of its dependent services come back up:\n\n        ```bash\n        sudo nixos-rebuild switch\n        ```\n\n2. Exercise the application, performing both reads and writes: check the elasticsearch log for deprecation warnings, and fix any issues in the application.\n\n3. Stop the database.\n\n4. Take a backup:\n\n    ```bash\n    sudo cp -a \"$VOLUME_DIR\" \"${VOLUME_DIR}.bak\"\n    ```\n\n5. Change the `elasticsearchTag` option in the host's NixOS configuration to the initial release of the new major version.\n\n6. Rebuild the NixOS configuration and check that the database and all of its dependent services come back up:\n\n    ```bash\n    sudo nixos-rebuild switch\n    ```\n\n### Rollback\n\nThe old database files are still present at `${VOLUME_DIR}.bak`, so:\n\n1. Stop all the relevant services, including the database container.\n\n2. Restore the backup:\n\n    ```bash\n    sudo mv \"$VOLUME_DIR\" \"${VOLUME_DIR}.aborted\"\n    sudo mv \"${VOLUME_DIR}.bak\" \"$VOLUME_DIR\"\n    ```\n\n3. If the `elasticsearchTag` has been updated in the NixOS configuration:\n\n    1. Revert it to its previous version.\n    2. Rebuild the NixOS configuration.\n\n4. Restart all the relevant services.\n"
  },
  {
    "path": "docs/src/runbooks/upgrade-to-a-new-version-of-postgres.md",
    "content": "Upgrade to a new version of postgres\n====================================\n\n\nChange the default postgres version for a module\n------------------------------------------------\n\n1. Individually upgrade all hosts to the new version, following the processes below.\n2. Change the default value of the `postgresTag` option for the module.\n3. Remove the per-host `postgresTag` options.\n\n\nUpgrade to a new minor version\n------------------------------\n\nThis is generally safe.  Just change the `postgresTag` and rebuild the NixOS\nconfiguration.\n\n\nUpgrade to a new major version\n------------------------------\n\nIn brief: take a backup, shut down the database, bring up the new one, and\nrestore the backup.  This does have some downtime, but is relatively risk free.\n\nShell variables:\n\n- `$CONTAINER` - the database container name\n- `$POSTGRES_DB` - the database name\n- `$POSTGRES_USER` - the database user\n- `$POSTGRES_PASSWORD` - the database password\n- `$VOLUME_DIR` - the directory on the host that the container's `/var/lib/postgresql/data` is bind-mounted to\n- `$TAG` - the new container tag to use\n\nReplace `podman` with `docker` in the following commands if you're using that.\n\n1. Stop all services which write to the database.\n\n2. Dump the database:\n\n    ```bash\n    sudo podman exec -i \"$CONTAINER\" pg_dump -U \"$POSTGRES_USER\" --no-owner -Fc \"$POSTGRES_DB\" > \"${CONTAINER}.dump\"\n    ```\n\n3. Stop the database container:\n\n    ```bash\n    sudo systemctl stop \"podman-$CONTAINER\"\n    ```\n\n4. Back up the database volume:\n\n    ```bash\n    sudo mv \"$VOLUME_DIR\" \"${VOLUME_DIR}.bak\"\n    ```\n\n5. Create the new volume:\n\n    ```bash\n    sudo mkdir \"$VOLUME_DIR\"\n    ```\n\n6. Bring up a new database container with the dump bind-mounted into it:\n\n    ```bash\n    sudo podman run --rm --name=\"$CONTAINER\" -v \"$(pwd):/backup\" -v \"${VOLUME_DIR}:/var/lib/postgresql/data\" -e \"POSTGRES_DB=${POSTGRES_DB}\" -e \"POSTGRES_USER=${POSTGRES_USER}\" -e \"POSTGRES_PASSWORD=${POSTGRES_PASSWORD}\" --shm-size=1g \"postgres:${TAG}\"\n    ```\n\n7. In another shell, restore the dump:\n\n    ```bash\n    sudo podman exec \"$CONTAINER\" pg_restore -U \"$POSTGRES_USER\" -d \"$POSTGRES_DB\" -Fc -j4 --clean \"/backup/${CONTAINER}.dump\"\n    ```\n\n8. Ctrl-c the database container after the dump has restored successfully.\n\n9. Change the `postgresTag` option in the host's NixOS configuration.\n\n10. Rebuild the NixOS configuration and check that the database and all of its dependent services come back up:\n\n    ```bash\n    sudo nixos-rebuild switch\n    ```\n\n### Rollback\n\nThe old database files are still present at `${VOLUME_DIR}.bak`, so:\n\n1. Stop all the relevant services, including the database container.\n\n2. Restore the backup:\n\n    ```bash\n    sudo mv \"$VOLUME_DIR\" \"${VOLUME_DIR}.aborted\"\n    sudo mv \"${VOLUME_DIR}.bak\" \"$VOLUME_DIR\"\n    ```\n\n3. If the `postgresTag` has been updated in the NixOS configuration:\n\n    1. Revert it to its previous version.\n    2. Rebuild the NixOS configuration.\n\n4. Restart all the relevant services.\n"
  },
  {
    "path": "flake.nix",
    "content": "{\n  inputs = {\n    nixpkgs.url = \"github:NixOS/nixpkgs/nixos-25.11-small\";\n    sops-nix = {\n      url = \"github:Mic92/sops-nix\";\n      inputs.nixpkgs.follows = \"nixpkgs\";\n    };\n    # my packages\n    bookdb = {\n      url = \"github:barrucadu/bookdb\";\n      inputs.nixpkgs.follows = \"nixpkgs\";\n      inputs.gitignore.follows = \"gitignore\";\n      inputs.rust-overlay.follows = \"rust-overlay\";\n    };\n    bookmarks = {\n      url = \"github:barrucadu/bookmarks\";\n      inputs.nixpkgs.follows = \"nixpkgs\";\n      inputs.gitignore.follows = \"gitignore\";\n      inputs.rust-overlay.follows = \"rust-overlay\";\n    };\n    prometheus-awair-exporter = {\n      url = \"github:barrucadu/prometheus-awair-exporter\";\n      inputs.nixpkgs.follows = \"nixpkgs\";\n      inputs.gitignore.follows = \"gitignore\";\n    };\n    resolved = {\n      url = \"github:barrucadu/resolved\";\n      inputs.nixpkgs.follows = \"nixpkgs\";\n      inputs.gitignore.follows = \"gitignore\";\n      inputs.rust-overlay.follows = \"rust-overlay\";\n    };\n    # dependencies\n    gitignore = {\n      url = \"github:hercules-ci/gitignore.nix\";\n      inputs.nixpkgs.follows = \"nixpkgs\";\n    };\n    rust-overlay = {\n      url = \"github:oxalica/rust-overlay\";\n      inputs.nixpkgs.follows = \"nixpkgs\";\n    };\n  };\n\n  outputs = { self, nixpkgs, sops-nix, ... }@flakeInputs:\n    let\n      system = \"x86_64-linux\";\n      pkgs = import nixpkgs {\n        inherit system;\n      };\n    in\n    {\n      formatter.${system} = pkgs.nixpkgs-fmt;\n\n      nixosConfigurations =\n        let\n          mkNixosConfiguration = name: extraModules: nixpkgs.lib.nixosSystem {\n            inherit system;\n            specialArgs = { inherit flakeInputs; };\n            modules = [\n              {\n                networking.hostName = name;\n                nixpkgs.overlays = [ (_: _: { nixfiles = self.packages.${system}; }) ];\n                sops.defaultSopsFile = ./hosts + \"/${name}\" + /secrets.yaml;\n              }\n              ./shared\n              (./hosts + \"/${name}\" + /configuration.nix)\n              (./hosts + \"/${name}\" + /hardware.nix)\n              sops-nix.nixosModules.sops\n            ] ++ extraModules;\n          };\n        in\n        {\n          carcosa = mkNixosConfiguration \"carcosa\" [ \"${nixpkgs}/nixos/modules/profiles/qemu-guest.nix\" ];\n          nyarlathotep = mkNixosConfiguration \"nyarlathotep\" [ \"${nixpkgs}/nixos/modules/installer/scan/not-detected.nix\" ];\n          yuggoth = mkNixosConfiguration \"yuggoth\" [ \"${nixpkgs}/nixos/modules/profiles/qemu-guest.nix\" ];\n        };\n\n      packages.${system} =\n        {\n          bookdb = flakeInputs.bookdb.packages.${system}.default;\n          bookmarks = flakeInputs.bookmarks.packages.${system}.default;\n          prometheus-awair-exporter = flakeInputs.prometheus-awair-exporter.packages.${system}.default;\n          resolved = flakeInputs.resolved.packages.${system}.default;\n        };\n\n      apps.${system} =\n        let\n          mkApp = name: script: {\n            type = \"app\";\n            program = toString (pkgs.writeShellScript \"${name}.sh\" script);\n          };\n        in\n        {\n          backups = mkApp \"backups\" ''\n            PATH=${with pkgs; lib.makeBinPath [ restic sops nettools ]}\n\n            ${pkgs.lib.fileContents ./scripts/backups.sh}\n          '';\n\n          fmt = mkApp \"fmt\" ''\n            PATH=${with pkgs; lib.makeBinPath [ nix git python3Packages.black ]}\n\n            ${pkgs.lib.fileContents ./scripts/fmt.sh}\n          '';\n\n          lint = mkApp \"lint\" ''\n            # TODO: add nix-linter back when the package is no longer broken\n            PATH=${with pkgs; lib.makeBinPath [ findutils shellcheck git gnugrep python3Packages.flake8 ]}\n\n            ${pkgs.lib.fileContents ./scripts/lint.sh}\n          '';\n\n          secrets = mkApp \"secrets\" ''\n            PATH=${with pkgs; lib.makeBinPath [ sops nettools vim ]}\n            export EDITOR=vim\n\n            ${pkgs.lib.fileContents ./scripts/secrets.sh}\n          '';\n\n          documentation =\n            let\n              eval = pkgs.lib.evalModules {\n                modules = [\n                  { config._module.args = { inherit pkgs; }; }\n                  ./shared/options.nix\n                  # modules\n                  ./shared/acme/options.nix\n                  ./shared/bookdb/options.nix\n                  ./shared/bookmarks/options.nix\n                  ./shared/erase-your-darlings/options.nix\n                  ./shared/finder/options.nix\n                  ./shared/forgejo/options.nix\n                  ./shared/foundryvtt/options.nix\n                  ./shared/minecraft/options.nix\n                  ./shared/oci-containers/options.nix\n                  ./shared/pleroma/options.nix\n                  ./shared/resolved/options.nix\n                  ./shared/restic-backups/options.nix\n                  ./shared/torrents/options.nix\n                  # host templates\n                  ./shared/host-templates/website-mirror/options.nix\n                ];\n              };\n              optionsDoc = pkgs.nixosOptionsDoc {\n                options = eval.options;\n              };\n            in\n            mkApp \"documentation\" ''\n              PATH=${with pkgs; lib.makeBinPath [ coreutils gnused mdbook python3 ]}\n              export NIXOS_OPTIONS_JSON=\"${optionsDoc.optionsJSON}/share/doc/nixos/options.json\"\n\n              ${pkgs.lib.fileContents ./scripts/documentation.sh}\n            '';\n        };\n    };\n}\n"
  },
  {
    "path": "hosts/carcosa/caddy/lainon-life/404.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>LAINON.LIFE IS DEAD</title>\n    <meta charset=\"UTF-8\">\n    <meta name=\"theme-color\" content=\"#1e1a1c\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\">\n    <style type=\"text/css\">\n      body {\n          background: url(\"/background.gif\") center center / cover no-repeat fixed;\n          color: white;\n          font-family: monospace;\n          font-size: 32px;\n          padding: 1em;\n          text-align: center;\n      }\n\n      h1 {\n          color: #46C0AB;\n          text-shadow: 0 0 5px #46C0AB;\n          font-weight: normal;\n          margin: 0;\n          padding: 0;\n      }\n\n      h2 {\n          color: #F0546A;\n          text-shadow: 0 0 5px #F0546A;\n          font-weight: normal;\n          margin: 0;\n          padding: 0;\n      }\n    </style>\n  </head>\n  <body>\n    <h1>LAINON.LIFE IS DEAD</h1>\n    <h2>Never trust a hard drive</h2>\n    <audio autoplay loop>\n      <source src=\"/duvet.ogg\" type=\"audio/ogg\" />\n      <source src=\"/duvet.mp3\" type=\"audio/mpeg\" />\n    </audio>\n  </body>\n</html>\n"
  },
  {
    "path": "hosts/carcosa/caddy/www-lookwhattheshoggothdraggedin-com.caddyfile",
    "content": "# Removed\nerror /files/privacy/analytics.png 410\nerror /glossary.html 410\nerror /privacy.html 410\n\n# Redirected\nredir /arden-vul-6-months-in-censored/session-screenshot.png /post/arden-vul-6-months-in-censored/session-screenshot.png permanent\nredir /arden-vul-6-months-in/house-rules.pdf /post/arden-vul-6-months-in/house-rules.pdf permanent\nredir /arden-vul-6-months-in/miro-full.jpg /post/arden-vul-6-months-in/miro-full.jpg permanent\nredir /arden-vul-6-months-in/miro-level3.jpg /post/arden-vul-6-months-in/miro-level3.jpg permanent\nredir /arden-vul-6-months-in/session-screenshot.png /post/arden-vul-6-months-in/session-screenshot.png permanent\nredir /files/dice-rolls-in-call-of-cthulhu/all.png /post/dice-rolls-in-call-of-cthulhu/all.png permanent\nredir /files/dice-rolls-in-call-of-cthulhu/all.thumb.png /post/dice-rolls-in-call-of-cthulhu/all.thumb.png permanent\nredir /files/dice-rolls-in-call-of-cthulhu/basic.png /post/dice-rolls-in-call-of-cthulhu/basic.png permanent\nredir /files/dice-rolls-in-call-of-cthulhu/bonus.png /post/dice-rolls-in-call-of-cthulhu/bonus.png permanent\nredir /files/dice-rolls-in-call-of-cthulhu/difficulties.png /post/dice-rolls-in-call-of-cthulhu/difficulties.png permanent\nredir /files/dice-rolls-in-call-of-cthulhu/opposed-bonus.png /post/dice-rolls-in-call-of-cthulhu/opposed-bonus.png permanent\nredir /files/dice-rolls-in-call-of-cthulhu/opposed-penalty.png /post/dice-rolls-in-call-of-cthulhu/opposed-penalty.png permanent\nredir /files/dice-rolls-in-call-of-cthulhu/opposed.png /post/dice-rolls-in-call-of-cthulhu/opposed.png permanent\nredir /files/dice-rolls-in-call-of-cthulhu/penalty.png /post/dice-rolls-in-call-of-cthulhu/penalty.png permanent\nredir /files/dice-rolls-in-call-of-cthulhu/pushed.png /post/dice-rolls-in-call-of-cthulhu/pushed.png permanent\nredir /files/dice-rolls-in-traveller/basic.png /post/dice-rolls-in-traveller/basic.png permanent\nredir /files/dice-rolls-in-traveller/boon-bane.png /post/dice-rolls-in-traveller/boon-bane.png permanent\nredir /files/dice-rolls-in-traveller/difficulties.png /post/dice-rolls-in-traveller/difficulties.png permanent\nredir /files/dice-rolls-in-traveller/normalised-difficulties-trimmed.png /post/dice-rolls-in-traveller/normalised-difficulties-trimmed.png permanent\nredir /files/dice-rolls-in-traveller/normalised-difficulties.png /post/dice-rolls-in-traveller/normalised-difficulties.png permanent\nredir /files/dice-rolls-in-traveller/opposed-heat-chain-dm.png /post/dice-rolls-in-traveller/opposed-heat-chain-dm.png permanent\nredir /files/dice-rolls-in-traveller/opposed-heat.png /post/dice-rolls-in-traveller/opposed-heat.png permanent\nredir /files/dice-rolls-in-traveller/task-chain-dms.png /post/dice-rolls-in-traveller/task-chain-dms.png permanent\nredir /files/dice-rolls-in-traveller/task-chain-heat-unbound.png /post/dice-rolls-in-traveller/task-chain-heat-unbound.png permanent\nredir /files/dice-rolls-in-traveller/task-chain-heat.png /post/dice-rolls-in-traveller/task-chain-heat.png permanent\nredir /files/dice-rolls-in-traveller/try-again.png /post/dice-rolls-in-traveller/try-again.png permanent\nredir /files/first-impressions-troika/beef-steaks.jpg /post/first-impressions-troika/beef-steaks.jpg permanent\nredir /files/first-impressions-troika/book-interior.jpg /post/first-impressions-troika/book-interior.jpg permanent\nredir /files/first-impressions-troika/damage-table.jpg /post/first-impressions-troika/damage-table.jpg permanent\nredir /files/how-to-learn-a-new-system/pulp-cthulhu.pdf /post/how-to-learn-a-new-system/pulp-cthulhu.pdf permanent\nredir /files/how-to-learn-a-new-system/traveller.pdf /post/how-to-learn-a-new-system/traveller.pdf permanent\nredir /files/knock-issue-1/art.jpg /post/knock-issue-1/art.jpg permanent\nredir /files/knock-issue-1/leaving-kansas.jpg /post/knock-issue-1/leaving-kansas.jpg permanent\nredir /files/knock-issue-1/spine.jpg /post/knock-issue-1/spine.jpg permanent\nredir /files/troika-the-manse-of-mazirian/manse.png /post/troika-the-manse-of-mazirian/manse.png permanent\nredir /ironsworn/flowchart.png /post/ironsworn/flowchart.png permanent\nredir /ironsworn/move.png /post/ironsworn/move.png permanent\nredir /ironsworn/progress.png /post/ironsworn/progress.png permanent\nredir /ironsworn/sabine-4.1.png /post/ironsworn/sabine-4.1.png permanent\nredir /ironsworn/sabine-4.2.png /post/ironsworn/sabine-4.2.png permanent\nredir /ironsworn/sabine-4.3.png /post/ironsworn/sabine-4.3.png permanent\nredir /ironsworn/sabine-4.4.png /post/ironsworn/sabine-4.4.png permanent\nredir /ironsworn/sabine-4.5.png /post/ironsworn/sabine-4.5.png permanent\nredir /ironsworn/sabine.png /post/ironsworn/sabine.png permanent\nredir /izirions-enchiridion/book.jpg /post/izirions-enchiridion/book.jpg permanent\nredir /izirions-enchiridion/boots-of-cartography.jpg /post/izirions-enchiridion/boots-of-cartography.jpg permanent\nredir /izirions-enchiridion/danger-level.jpg /post/izirions-enchiridion/danger-level.jpg permanent\nredir /izirions-enchiridion/dice-rolls.jpg /post/izirions-enchiridion/dice-rolls.jpg permanent\nredir /traveller-cheatsheets/basics-no-houserules.pdf /post/traveller-cheatsheets/basics-no-houserules.pdf permanent\nredir /traveller-cheatsheets/basics.pdf /post/traveller-cheatsheets/basics.pdf permanent\nredir /traveller-cheatsheets/piracy.pdf /post/traveller-cheatsheets/piracy.pdf permanent\nredir /traveller-cheatsheets/spacecraft.pdf /post/traveller-cheatsheets/spacecraft.pdf permanent\nredir /traveller-cheatsheets/uwp.pdf /post/traveller-cheatsheets/uwp.pdf permanent\n"
  },
  {
    "path": "hosts/carcosa/configuration.nix",
    "content": "# This is a VPS (hosted by Hetzner Cloud).\n#\n# It serves [barrucadu.co.uk][] and other services on it.  Websites are served\n# with Caddy, with certs from Let's Encrypt.\n#\n# It's set up in \"erase your darlings\" style, so most of the filesystem is wiped\n# on boot and restored from the configuration, to ensure there's no accidentally\n# unmanaged configuration or state hanging around.  However, it doesn't reboot\n# automatically, because I also use this server for a persistent IRC connection.\n#\n# **Alerting:** enabled (standard only)\n#\n# **Backups:** enabled (standard + extras)\n#\n# **Public hostname:** `carcosa.barrucadu.co.uk`\n#\n# **Role:** server\n#\n# [barrucadu.co.uk]: https://www.barrucadu.co.uk/\n{ config, lib, pkgs, ... }:\n\nwith lib;\nlet\n  httpdir = \"${toString config.nixfiles.eraseYourDarlings.persistDir}/srv/http\";\nin\n{\n  ###############################################################################\n  ## General\n  ###############################################################################\n\n  networking.hostId = \"f62895cc\";\n  boot.supportedFilesystems = { zfs = true; };\n\n  # Bootloader\n  boot.loader.grub.enable = true;\n  boot.loader.grub.device = \"/dev/sda\";\n\n  # Networking\n  networking.firewall.allowedTCPPorts = [ 80 443 ];\n\n  networking.interfaces.enp1s0 = {\n    ipv6.addresses = [{ address = \"2a01:4f8:c0c:bfc1::\"; prefixLength = 64; }];\n  };\n  networking.defaultGateway6 = { address = \"fe80::1\"; interface = \"enp1s0\"; };\n\n  nixfiles.firewall.ipBlocklistFile = config.sops.secrets.\"nixfiles/firewall/ip_blocklist\".path;\n  sops.secrets.\"nixfiles/firewall/ip_blocklist\" = { };\n\n  # No automatic reboots (for irssi)\n  system.autoUpgrade.allowReboot = mkForce false;\n\n  # Wipe / on boot\n  nixfiles.eraseYourDarlings.enable = true;\n  nixfiles.eraseYourDarlings.machineId = \"64b1b10f3bef4616a7faf5edf1ef3ca5\";\n  nixfiles.eraseYourDarlings.barrucaduPasswordFile = config.sops.secrets.\"users/barrucadu\".path;\n  sops.secrets.\"users/barrucadu\".neededForUsers = true;\n\n  # Monitoring\n  services.prometheus.alertmanager.environmentFile = config.sops.secrets.\"services/alertmanager/env\".path;\n  sops.secrets.\"services/alertmanager/env\" = { };\n\n\n  ###############################################################################\n  ## Backups\n  ###############################################################################\n\n  nixfiles.restic-backups.enable = true;\n  nixfiles.restic-backups.environmentFile = config.sops.secrets.\"nixfiles/restic-backups/env\".path;\n  nixfiles.restic-backups.checkRepositoryAt = \"Wed, 12:00\";\n  nixfiles.restic-backups.backups.github = {\n    # TODO: this will break when I have >100 github repos\n    # TODO: use a backup-specific SSH key?\n    prepareCommand = ''\n      ${pkgs.coreutils}/bin/mkdir repositories\n      cd repositories\n\n      ${pkgs.curl}/bin/curl -u \"barrucadu:''${GITHUB_TOKEN}\" 'https://api.github.com/user/repos?type=owner&per_page=100' 2>/dev/null | \\\n        ${pkgs.jq}/bin/jq -r '.[].ssh_url' | \\\n        while read url; do\n          env GIT_SSH_COMMAND=\"${pkgs.openssh}/bin/ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i /home/barrucadu/.ssh/id_ed25519\" \\\n            ${pkgs.git}/bin/git clone --bare \"$url\"\n        done\n    '';\n    paths = [\n      \"repositories\"\n    ];\n  };\n  nixfiles.restic-backups.backups.syncthing = {\n    paths = [\n      \"/home/barrucadu/s\"\n    ];\n  };\n  sops.secrets.\"nixfiles/restic-backups/env\" = { };\n\n\n  ###############################################################################\n  ## Website Mirror\n  ###############################################################################\n\n  nixfiles.hostTemplates.websiteMirror = {\n    enable = true;\n    acmeEnvironmentFile = config.sops.secrets.\"services/acme/env\".path;\n  };\n  sops.secrets.\"services/acme/env\" = { };\n\n\n  ###############################################################################\n  ## Services\n  ###############################################################################\n\n  # WWW - there are more websites, see website-mirror\n  services.caddy.enable = true;\n  services.caddy.extraConfig = ''\n    (common_config) {\n      encode gzip\n\n      header Permissions-Policy \"interest-cohort=()\"\n      header Referrer-Policy \"strict-origin-when-cross-origin\"\n      header Strict-Transport-Security \"max-age=31536000; includeSubDomains\"\n      header X-Content-Type-Options \"nosniff\"\n      header X-Frame-Options \"SAMEORIGIN\"\n\n      header -Server\n    }\n  '';\n\n  services.caddy.virtualHosts.\"foundry.barrucadu.co.uk\".extraConfig = ''\n    import common_config\n    reverse_proxy http://localhost:${toString config.nixfiles.foundryvtt.port}\n  '';\n\n  services.caddy.virtualHosts.\"misc.barrucadu.co.uk\".extraConfig = ''\n    import common_config\n    basicauth /_site/* {\n      import ${config.sops.secrets.\"services/caddy/fragments/misc_site\".path}\n    }\n\n    @subdirectory path_regexp ^/(7day|14day|28day|forever)/[a-z0-9]\n\n    root * ${httpdir}/barrucadu.co.uk/misc\n    file_server @subdirectory browse\n    file_server\n  '';\n  sops.secrets.\"services/caddy/fragments/misc_site\".owner = config.users.users.caddy.name;\n\n  services.caddy.virtualHosts.\"carcosa.barrucadu.co.uk\".extraConfig = ''\n    import common_config\n    redir https://www.barrucadu.co.uk\n  '';\n\n  services.caddy.virtualHosts.\"grafana.carcosa.barrucadu.co.uk\".extraConfig = ''\n    import common_config\n    reverse_proxy http://localhost:${toString config.services.grafana.settings.server.http_port}\n  '';\n\n  services.caddy.virtualHosts.\"prometheus.carcosa.barrucadu.co.uk\".extraConfig = ''\n    import common_config\n    reverse_proxy http://localhost:${toString config.services.prometheus.port}\n  '';\n\n  services.caddy.virtualHosts.\"git.barrucadu.dev\".extraConfig = ''\n    import common_config\n    reverse_proxy http://127.0.0.1:${toString config.nixfiles.forgejo.port}\n  '';\n\n  services.caddy.virtualHosts.\"registry.barrucadu.dev\".extraConfig = ''\n    import common_config\n    basicauth /v2/* {\n      import ${config.sops.secrets.\"services/caddy/fragments/registry\".path}\n    }\n    header /v2/* Docker-Distribution-Api-Version \"registry/2.0\"\n    reverse_proxy /v2/* http://127.0.0.1:${toString config.services.dockerRegistry.port}\n  '';\n  sops.secrets.\"services/caddy/fragments/registry\".owner = config.users.users.caddy.name;\n\n  services.caddy.virtualHosts.\"lainon.life\".extraConfig = ''\n    import common_config\n\n    root * ${./caddy/lainon-life}\n    file_server\n\n    handle_errors {\n      @404 {\n        expression {http.error.status_code} == 404\n      }\n      rewrite @404 /404.html\n      file_server\n    }\n  '';\n\n  services.caddy.virtualHosts.\"social.lainon.life\".extraConfig = ''\n    import common_config\n    reverse_proxy http://127.0.0.1:${toString config.nixfiles.pleroma.port}\n  '';\n\n  services.caddy.virtualHosts.\"www.lainon.life\".extraConfig = ''\n    import common_config\n    redir https://lainon.life{uri}\n  '';\n\n  services.caddy.virtualHosts.\"lookwhattheshoggothdraggedin.com\".extraConfig = ''\n    import common_config\n    redir https://www.lookwhattheshoggothdraggedin.com{uri}\n  '';\n\n  services.caddy.virtualHosts.\"www.lookwhattheshoggothdraggedin.com\".extraConfig = ''\n    import common_config\n\n    header Content-Security-Policy \"default-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' 'unsafe-inline' data:\"\n\n    header /files/*         Cache-Control \"public, immutable, max-age=604800\"\n    header /fonts/*         Cache-Control \"public, immutable, max-age=31536000\"\n    header /logo.png        Cache-Control \"public, immutable, max-age=604800\"\n    header /*.css           Cache-Control \"public, immutable, max-age=31536000\"\n    header /twitter-cards/* Cache-Control \"public, immutable, max-age=604800\"\n\n    root * ${httpdir}/lookwhattheshoggothdraggedin.com/www\n    file_server\n\n    handle_errors {\n      @404 {\n        expression {http.error.status_code} == 404\n      }\n      @410 {\n        expression {http.error.status_code} == 410\n      }\n      rewrite @404 /404.html\n      rewrite @410 /404.html\n      file_server\n    }\n\n    ${fileContents ./caddy/www-lookwhattheshoggothdraggedin-com.caddyfile}\n  '';\n\n  services.caddy.virtualHosts.\"uzbl.org\".extraConfig = ''\n    import common_config\n    redir https://www.uzbl.org{uri}\n  '';\n\n  services.caddy.virtualHosts.\"www.uzbl.org\".extraConfig = ''\n    import common_config\n\n    rewrite /archives.php    /index.php\n    rewrite /faq.php         /index.php\n    rewrite /readme.php      /index.php\n    rewrite /keybindings.php /index.php\n    rewrite /get.php         /index.php\n    rewrite /community.php   /index.php\n    rewrite /contribute.php  /index.php\n    rewrite /commits.php     /index.php\n    rewrite /news.php        /index.php\n    rewrite /doesitwork/     /index.php\n    rewrite /fosdem2010/     /index.php\n\n    redir /doesitwork /doesitwork/\n    redir /fosdem2020 /fosdem2020/\n\n    root * ${httpdir}/uzbl.org/www\n\n    php_fastcgi unix//run/phpfpm/caddy.sock\n    php_fastcgi /atom.xml unix//run/phpfpm/caddy.sock {\n      split .xml\n    }\n\n    file_server\n  '';\n\n  services.phpfpm.pools.caddy = {\n    user = \"caddy\";\n    group = \"caddy\";\n    settings = {\n      \"listen\" = \"/run/phpfpm/caddy.sock\";\n      \"listen.owner\" = \"caddy\";\n      \"listen.group\" = \"caddy\";\n      \"pm\" = \"dynamic\";\n      \"pm.max_children\" = \"5\";\n      \"pm.start_servers\" = \"2\";\n      \"pm.min_spare_servers\" = \"1\";\n      \"pm.max_spare_servers\" = \"3\";\n      \"security.limit_extensions\" = \".php .xml\";\n    };\n  };\n\n  systemd.tmpfiles.rules = [\n    \"d ${httpdir}/barrucadu.co.uk/misc/_site 0755 barrucadu users  1d\"\n    \"d ${httpdir}/barrucadu.co.uk/misc/7day  0755 barrucadu users  7d\"\n    \"d ${httpdir}/barrucadu.co.uk/misc/14day 0755 barrucadu users 14d\"\n    \"d ${httpdir}/barrucadu.co.uk/misc/28day 0755 barrucadu users 28d\"\n  ];\n\n  # Docker registry\n  services.dockerRegistry.enable = true;\n\n  # Forgejo\n  nixfiles.forgejo.enable = true;\n  nixfiles.forgejo.domain = \"git.barrucadu.dev\";\n  nixfiles.forgejo.adminUserPasswordPath = config.sops.secrets.\"nixfiles/forgejo/admin_password\".path;\n  nixfiles.forgejo.runnerTokenPath = config.sops.secrets.\"nixfiles/forgejo/runner_token\".path;\n  sops.secrets.\"nixfiles/forgejo/admin_password\" = { owner = \"forgejo\"; };\n  sops.secrets.\"nixfiles/forgejo/runner_token\" = { };\n\n  # minecraft\n  nixfiles.minecraft.enable = true;\n  nixfiles.minecraft.servers.tea = {\n    autoStart = false;\n    port = 25565;\n    jar = \"fabric-server-launch.jar\";\n  };\n\n  # Foundry VTT\n  nixfiles.foundryvtt.enable = true;\n\n  # social.lainon.life\n  nixfiles.pleroma.enable = true;\n  nixfiles.pleroma.domain = \"social.lainon.life\";\n  nixfiles.pleroma.faviconPath = ./pleroma-favicon.png;\n  nixfiles.pleroma.secretsFile = config.sops.secrets.\"nixfiles/pleroma/exc\".path;\n  nixfiles.pleroma.allowRegistration = true;\n  sops.secrets.\"nixfiles/pleroma/exc\".owner = config.users.users.pleroma.name;\n\n\n  ###############################################################################\n  ## Remote Builds\n  ###############################################################################\n\n  users.users.nix-remote-builder = {\n    uid = 983;\n    home = \"/var/lib/nix-remote-builder\";\n    createHome = true;\n    isSystemUser = true;\n    shell = pkgs.bashInteractive;\n    group = \"nogroup\";\n    openssh.authorizedKeys.keys =\n      [ \"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHFzMpx7QNSAb5tCbkzMRIG62PvBZysflwwCKchFDHtY nix@yuggoth\" ];\n  };\n  nix.settings.trusted-users = [ config.users.users.nix-remote-builder.name ];\n\n\n  ###############################################################################\n  ## Miscellaneous\n  ###############################################################################\n\n  # Metrics\n  services.grafana.settings = {\n    server.root_url = \"https://grafana.carcosa.barrucadu.co.uk\";\n    security.admin_password = \"$__file{${config.sops.secrets.\"services/grafana/admin_password\".path}}\";\n    security.secret_key = \"$__file{${config.sops.secrets.\"services/grafana/secret_key\".path}}\";\n  };\n  sops.secrets.\"services/grafana/admin_password\".owner = config.users.users.grafana.name;\n  sops.secrets.\"services/grafana/secret_key\".owner = config.users.users.grafana.name;\n\n  services.prometheus.webExternalUrl = \"https://prometheus.carcosa.barrucadu.co.uk\";\n\n  # Extra packages\n  users.users.barrucadu.packages = with pkgs; [\n    irssi\n    perl\n  ];\n}\n"
  },
  {
    "path": "hosts/carcosa/hardware.nix",
    "content": "{ ... }:\n\n{\n  boot.initrd.availableKernelModules = [ \"ahci\" \"xhci_pci\" \"virtio_pci\" \"sd_mod\" \"sr_mod\" ];\n  boot.initrd.kernelModules = [ ];\n  boot.kernelModules = [ ];\n  boot.extraModulePackages = [ ];\n\n  fileSystems.\"/\" =\n    {\n      device = \"local/volatile/root\";\n      fsType = \"zfs\";\n    };\n\n  fileSystems.\"/home\" =\n    {\n      device = \"local/persistent/home\";\n      fsType = \"zfs\";\n    };\n\n  fileSystems.\"/nix\" =\n    {\n      device = \"local/persistent/nix\";\n      fsType = \"zfs\";\n    };\n\n  fileSystems.\"/persist\" =\n    {\n      device = \"local/persistent/persist\";\n      fsType = \"zfs\";\n      neededForBoot = true;\n    };\n\n  fileSystems.\"/var/log\" =\n    {\n      device = \"local/persistent/var-log\";\n      fsType = \"zfs\";\n    };\n\n  fileSystems.\"/var/lib/containers\" =\n    {\n      device = \"/dev/disk/by-uuid/bbc94c9d-9e32-435b-9fe7-1290acb96a40\";\n      fsType = \"ext4\";\n    };\n\n  fileSystems.\"/boot\" =\n    {\n      device = \"/dev/disk/by-uuid/C83B-AA71\";\n      fsType = \"vfat\";\n    };\n\n  swapDevices = [ ];\n\n}\n"
  },
  {
    "path": "hosts/carcosa/secrets.yaml",
    "content": "users:\n    barrucadu: ENC[AES256_GCM,data:5mAoxmMEn4zOhwDHS4cal7b0fPZb7SshS3QmfrBgLKQMJfExiRdnWvwnqTvLY/ObRTYqeWrcik+GVyeFF4gkMm8FxcR7U5ExIXBbtg5uDQgcvQYNlWEfJWEjVYrfKCoIxCAhUDf+2oNr,iv:YEpqdGz/DNdjxNmIrVgahEoH7BNYnqBEHV6L7UrV2aI=,tag:4teSWBW+SJ06KCoTMwjN6g==,type:str]\nnixfiles:\n    forgejo:\n        admin_password: ENC[AES256_GCM,data:4hgVpxFod0m+sizMAxWApHMCJLCra867Y9MHtBXW3+Z4,iv:dUcyD2xP4L38ldiHYMTCEuE7AUXJcVEgxszdhFC1prU=,tag:3ZNooGvOU2P4r0LbgYybTg==,type:str]\n        runner_token: ENC[AES256_GCM,data:PL4c2RFaVGITrfBNO/rtf5rtCdFRyd7P2xf9eR/fRq4bzyDXpS0jE7r4jDQxZ6Q=,iv:qf6muCqZLWfyJCLcyevBFMSueyPDhYnVWYO5y5tOPZE=,tag:Fuo5PXS4SRqAm3oVoto74Q==,type:str]\n    firewall:\n        ip_blocklist: ENC[AES256_GCM,data:WgDvhHX/CTbbBRVJVr5v4nLQP5sxI8A5KomrSoXble7eUlAZeXqnhw4UT/EugIKaudZzVWovHe30G1U9W86X1/dgAj1S8hD0mA0TH6Qul3RfmQdqnZIdJXfDBLH1mF4OXaox6A==,iv:PVKlgOErmZGAC2tf5mW7d3S7vvMRclrpr+aDd/xJ1WI=,tag:EeXzbX9BELSCeBcxifbHPQ==,type:str]\n    pleroma:\n        exc: ENC[AES256_GCM,data:ZyA/hBlQs8S56oy7J1f9u36nYBFwWH4Ehq5VbjYDAxcThgP5x09qqt0G8URuLSbBZYuWOOrCjSF1gkt9oLKBPYw2bKxf0yg69GL8xkBtZuJU9NNLXcVswG8HZFWG6Rwa6F65GIHQWdZLwkA8ef5RcYD77FFV3YG4qCIxyH5efyVd0xTO7ukuapGC23mRPd1auUNHlTt0/mac8a+wjBmG175j2MFnzDj7e4Z2ynqgSVrkM/DKm4/xiED5J1vNpPQAkNWouzELo70x7XsLk8/WIVXtsLI24OEo+BE+9/pf9T+RObftUDMnSejhLFadKTqa7QHh6RJgV1lkJL+ZvDm5XY962BzJrMw/3N+h30qD+QCmkuyLqIbTAP7nFeJ7iumU1Bgv6ojLPtrxLX4TE/lP9Mv9JG1/w+4oMAeSv5t/uFw4pI4P07c5cGRwE9VHIT57roJ6beKRD/3p7FJxeEFOu5/O9EoxHTCjXWXMrdEM6bYfMMQZYBM7p8Ve0bE=,iv:4njRxb8LiKdW5YgQEP2Esvh8/yKHpiCxTiL/n6b+c5M=,tag:lPqLddPhY0r0rnuxtwvwIg==,type:str]\n    restic-backups:\n        env: ENC[AES256_GCM,data:Uls7HrNxFyoMZf3u4zNSk/F3XIYE1mQotcCvnNggvbOqA9RVK9FQpIfqJms8WtKZl6ol15rHW+au73QldJ9TE2Km7EJmCSa87AmRQ1Azt0lrJtn+v9l9rFqnu82WSD2awv8geB82OPQ0/w2x9W4qHPXw3teYx9p9Kiz/C1NVw0Z9TlsChKHsVpR6FVdyB8FY8zZG0Z1iuzDHMr6q9QsI8pMn5DkCruYhcg8R6GR73naWQb0nHxx3oFfNR3KtPHQn8diJZsv0+Hh2IWbHyPRlJOs+WYJtVc7LbqjB1jPrTozqteijclVSHAoB1RTQ7gVe9TiYdQIhOJswo89xH4l7U/D9wYH7tGRlrrKz8F8iUQR02G7gADftmwI9kekhCjGDgSudYrRJ//UCJKTn6bSsEpW0Eg9knozFCUOhc5RREmX7JyKA,iv:BqaFmxO+HRZzQchypReabxer0XwHW9KSsA1lfhWmdIM=,tag:3rJjQm+kLRMscygvkLHTcw==,type:str]\nservices:\n    acme:\n        env: ENC[AES256_GCM,data:+kgHlD5tlcZbNiqeLnF0Ow82UqmgiGmSAoBZ3o6zqdKTfDIVSTS/0ChYopbngi1/HW5Imx6uikfXnLUx7YMgXkcxOdEWzopVMGBf3NWIlBqmBhvxVhpoYI8E+rIN+f4Sf5OKNq1NUluZ5XKzg7qWRW66dWEaKzjgD81v8RUp94C0dKY=,iv:nZAQBmXO7VRe/RW5Vn8ha0B3kx/6aEBUTSUacuyFS1o=,tag:csCiEGlGc0jPy/AHPm8z9g==,type:str]\n    alertmanager:\n        env: ENC[AES256_GCM,data:0XJmdUlSzYnfKrovd/MpjXpSmazltAc8mgalp8U1nv30ek7OIZJS2ehih26UiwMf9pa/yx4lfoWQlU4Zx4eF7kep/rcr74sznFGRAYxvfVs1DTaWOuvSUqs1ZQOk8xTv5MAxBgP/,iv:F5aHKGSAJO762dXdwhWSCMhanLE/Z/Kbt2rqy+BFSLk=,tag:+/cZRlSzpGjgNQmr8f7dlQ==,type:str]\n    caddy:\n        fragments:\n            misc_site: ENC[AES256_GCM,data:y8VPYPzlrdFdODmbtZ8o7aMKm+hZLpc0kkuXatth29RfsN1XO1sfgIj4bPmDpUUf5yQQLsKK4F/cULnhMU0TOhOMKHzTduh59b6pxmJgbufETX1Hghnq+zLx,iv:QgbGVm3Vj1PtU6/W31xDUoxtPSgS8ot8IBqOxfeaJQk=,tag:kLfPVxrLdxtXwfIHC2y8Rg==,type:str]\n            registry: ENC[AES256_GCM,data:TMXUTbMzpP8QHW4aAyW2auGQYFhV3cHjfne0AnQ+CFI41A/3SuelQumQR17HOr9Z/Hs5LQQ9QssqQlhwOEMCIuTu2x81AUuEdineJc1T/xq1nhCrWA8olVI=,iv:dov05Z5jkB44lEQI0DPieDjT9thfHJE1vTiIYZbA79M=,tag:fIBo46vac8Ciu/dO1Bl18A==,type:str]\n    grafana:\n        admin_password: ENC[AES256_GCM,data:nGzl+HjDKz/ushife6YLCXtzTpIlHrbqPFWxsV3QxhG5FwXj5+vPNo8Pyg==,iv:j+ZS5PXFqV7t/mGK5lRQv0pG7+sh2BHy3N7MQ0YgWTY=,tag:F9r2iiMxG4xnFIz0vnP88w==,type:str]\n        secret_key: ENC[AES256_GCM,data:KeWJ9AVXCYjFgaFWbV7rqGRKOLT+lqzLP/p3Dajnemk=,iv:rfcm8PordRN0bCQmIQ7flZ/ShaCG1X30wUtHDjLD79Q=,tag:C+Ze2RmQ9yfR5/6K6oMqlA==,type:str]\nsops:\n    age:\n        - recipient: age1sdnp5uxhdtujc78penv2gntnenzcfju7est4hslz6eqgfk26u9nskkk634\n          enc: |\n            -----BEGIN AGE ENCRYPTED FILE-----\n            YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB3M1Fvdlo4RjdKcCtQZ20v\n            ODA3aklyaHNQdWtiQVRZejFJL3A1QjFvY0cwCnhuVlUvRzdZQzhaQlFsVDg1MWhN\n            akhMT0RQV20wbkhCOTk1eVR3TThhYUkKLS0tIE5ncVZ4ZXh3Y3hWWHdwTHpPQVd5\n            cTJ6cWF3WUxKdG95R1I2QmNxUlMxblEKZWY5u1NCQfLW4NipX9f5txgZnopWIykD\n            kFfbaTn0cv9lKSJJKcY3t5WPASc1/Hd52ANzpa4qUBMoirLAmrfkOw==\n            -----END AGE ENCRYPTED FILE-----\n        - recipient: age1ty4vs59695vuavnvgdftguyq2aau29nv75y4tqrr6ag8z26vfc5sc5rc4n\n          enc: |\n            -----BEGIN AGE ENCRYPTED FILE-----\n            YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB6OS9iYVJkdXlvR29UU20y\n            ZFpqK0Rmd1g5bE8zOEtsTHlNOFRjS3p1TFVJClBBREw0V0xNd2ZwVENheUVXR1FR\n            a1ovNlZFQys2a1pNOWRaR0xrZzFpazQKLS0tIHF1cUlkQ0JOeHM1ekZ5NWV3V2NE\n            dTQwclBRU3JmQ2hBOFVlaVIxZHN4cVEKvVR1bSH4yo2Td8YGNI2hmflT0M3hcYu8\n            qyYoWd5MFP9VBYKxrF8W2naQSY6Ax4IiVuNbKDDLFooTC93V+oxNDA==\n            -----END AGE ENCRYPTED FILE-----\n    lastmodified: \"2026-05-06T20:08:42Z\"\n    mac: ENC[AES256_GCM,data:XGh1OnFfCcIJI8omyFwj/oQEPxFKlDuQBwQCBJBOK5LBxt6hVmYrg6va4qvMwORpkwSc9aPnPLWP3j+xGK7jM52UL025ZJavQWQIYL+9PH+Bi1MHwW+XjXna0gkStG9ZGe0zng7sFl9A4BvAg0pDwo45t6DxlS0+S4YE6lW+zLA=,iv:Jpd/a+jXG5mljq6CU7auWeJ78Q9NMc7L3TNpYQYPSkk=,tag:wWoLzAFKavZw1d4BkVk3Hg==,type:str]\n    unencrypted_suffix: _unencrypted\n    version: 3.12.1\n"
  },
  {
    "path": "hosts/nyarlathotep/configuration.nix",
    "content": "# This is my home server.\n#\n# It runs writable instances of the bookdb and bookmarks services, which have\n# any updates copied across to carcosa hourly; it acts as a NAS; and it runs a\n# few utility services.\n#\n# Like carcosa, this host is set up in \"erase your darlings\" style but, unlike\n# carcosa, it automatically reboots to install updates: so that takes effect\n# significantly more frequently.\n#\n# **Alerting:** enabled (standard only)\n#\n# **Backups:** enabled (standard + extras)\n#\n# **Public hostname:** n/a\n#\n# **Role:** server\n{ config, pkgs, lib, ... }:\n\n# Bring names from 'lib' into scope.\nwith lib;\nlet\n  sharesPublic = [ \"anime\" \"misc\" \"music\" \"movies\" \"tv\" \"torrents\" ];\n  sharesPrivate = [ \"private\" ];\n\n  prometheusAwairExporterPort = 9517;\n\n  httpdir = \"${toString config.nixfiles.eraseYourDarlings.persistDir}/srv/http\";\nin\n{\n  ###############################################################################\n  ## General\n  ###############################################################################\n\n  networking.hostId = \"4a592971\"; # ZFS needs one of these\n  boot.supportedFilesystems = { zfs = true; };\n\n  # Bootloader\n  boot.loader.systemd-boot.enable = true;\n\n  # Enable memtest\n  boot.loader.systemd-boot.memtest86.enable = true;\n\n  # Firewall\n  networking.firewall.allowedTCPPorts = [\n    80\n    8888\n    32400 # Plex\n  ];\n\n  # Wipe / on boot\n  nixfiles.eraseYourDarlings.enable = true;\n  nixfiles.eraseYourDarlings.machineId = \"0f7ae3bda2a9428ab77a0adddc4c8cff\";\n  nixfiles.eraseYourDarlings.barrucaduPasswordFile = config.sops.secrets.\"users/barrucadu\".path;\n  sops.secrets.\"users/barrucadu\".neededForUsers = true;\n\n  # Set up a bridge network so that VMs can connect to the LAN\n  #\n  # `enp8s0` is the physical ethernet interface, but I am slaving that to the\n  # `br0` bridge - so it's the bridge's MAC address that gets presented to the\n  # physical network.\n  #\n  # To avoid having to reconfigure static IP assignments in my router if I\n  # switch between bridged and non-bridged networking, set up the MAC addresses\n  # such that:\n  #\n  # - `br0` has the MAC address of the physical ethernet card\n  # - `enp8s0` has a new random MAC address (https://serverfault.com/a/631119)\n  #\n  # So if I delete this block, the MAC address the router sees is unchanged, and\n  # so the static IP assignment is unaffected.\n  networking.useDHCP = false;\n  networking.interfaces.br0 = {\n    useDHCP = true;\n    macAddress = \"a0:36:bc:bb:65:8d\";\n  };\n  networking.interfaces.enp8s0 = {\n    macAddress = \"92:0b:e6:21:86:99\";\n    useDHCP = true;\n  };\n  networking.bridges.br0.interfaces = [ \"enp8s0\" ];\n\n  virtualisation.libvirtd.enable = true;\n  virtualisation.libvirtd.allowedBridges = [ \"br0\" ];\n\n  ###############################################################################\n  ## Backups\n  ###############################################################################\n\n  nixfiles.restic-backups.enable = true;\n  nixfiles.restic-backups.environmentFile = config.sops.secrets.\"nixfiles/restic-backups/env\".path;\n  nixfiles.restic-backups.backups.torrents = {\n    prepareCommand = ''\n      ${pkgs.python3}/bin/python3 ${./jobs/restic-prepare--hardlink-torrent-files.py} > hardlink-torrent-files.sh\n    '';\n    paths = [\n      \"hardlink-torrent-files.sh\"\n      \"/mnt/nas/torrents/watch\"\n    ];\n  };\n  nixfiles.restic-backups.backups.youtube = {\n    prepareCommand = ''\n      ${pkgs.python3}/bin/python3 ${./jobs/restic-prepare--fetch-youtube.py} > fetch-youtube.sh\n    '';\n    paths = [\n      \"fetch-youtube.sh\"\n    ];\n  };\n  sops.secrets.\"nixfiles/restic-backups/env\" = { };\n\n\n  ###############################################################################\n  ## DNS\n  ###############################################################################\n\n  nixfiles.resolved.enable = true;\n  nixfiles.resolved.address = \"10.0.0.3:53\";\n  nixfiles.resolved.cacheSize = 1000000;\n  nixfiles.resolved.hostsDirs = [ \"/etc/dns/hosts\" ];\n  nixfiles.resolved.zonesDirs = [ \"/etc/dns/zones\" ];\n\n  environment.etc.\"dns/hosts/stevenblack\".source =\n    let commit = \"14b698abcd97446bae349292aacc9ecb4feb2db5\";\n    in builtins.fetchurl {\n      url = \"https://raw.githubusercontent.com/StevenBlack/hosts/${commit}/hosts\";\n      sha256 = \"1hwyn1w1c7brzigp7fqpsgh107pzvsrahilq6n90jw7yzvi704gl\";\n    };\n\n  environment.etc.\"dns/zones/10.in-addr.arpa\".text = ''\n    $ORIGIN 10.in-addr.arpa.\n\n    @ IN SOA . . 3 3600 3600 3600 3600\n\n    1.0.0    IN PTR router.lan.\n    3.0.0    IN PTR nyarlathotep.lan.\n\n    117.20.0 IN PTR living-room.awair.lan.\n    130.20.0 IN PTR guest-bedroom.awair.lan.\n    187.20.0 IN PTR bedroom.awair.lan.\n    194.20.0 IN PTR office.awair.lan.\n  '';\n\n  environment.etc.\"dns/zones/lan\".text = ''\n    $ORIGIN lan.\n\n    @ 300 IN SOA @ @ 6 300 300 300 300\n\n    router              300 IN A     10.0.0.1\n\n    nyarlathotep        300 IN A     10.0.0.3\n    *.nyarlathotep      300 IN CNAME nyarlathotep\n\n    help                300 IN CNAME nyarlathotep\n    *.help              300 IN CNAME help\n\n    nas                 300 IN CNAME nyarlathotep\n\n    bedroom.awair       300 IN A     10.0.20.187\n    guest-bedroom.awair 300 IN A     10.0.20.130\n    living-room.awair   300 IN A     10.0.20.117\n    office.awair        300 IN A     10.0.20.194\n  '';\n\n\n  ###############################################################################\n  ## Network storage\n  ###############################################################################\n\n\n  # Samba\n  services.samba.enable = true;\n  services.samba.openFirewall = true;\n  services.samba.settings =\n    let\n      mkPublic = n: nameValuePair n { path = \"/mnt/nas/${n}\"; writable = \"yes\"; };\n      mkPrivate = n: nameValuePair n { path = \"/mnt/nas/${n}\"; writable = \"yes\"; \"valid users\" = [\"barrucadu\"]; };\n    in listToAttrs (map mkPublic sharesPublic ++ map mkPrivate sharesPrivate);\n\n  # Guest user for Samba\n  users.users.notbarrucadu = {\n    uid = 1001;\n    description = \"Guest user\";\n    isNormalUser = true;\n    group = \"users\";\n    hashedPasswordFile = config.sops.secrets.\"users/notbarrucadu\".path;\n    shell = \"/run/current-system/sw/bin/nologin\";\n  };\n  sops.secrets.\"users/notbarrucadu\".neededForUsers = true;\n\n\n  ###############################################################################\n  ## Reverse proxy\n  ###############################################################################\n\n  services.caddy.enable = true;\n  services.caddy.extraConfig = ''\n    (vlan_matchers) {\n      @vlan1 remote_ip 10.0.0.0/24\n      @not_vlan1 not remote_ip 10.0.0.0/24\n\n      @vlan10 remote_ip 10.0.10.0/24\n      @not_vlan10 not remote_ip 10.0.10.0/24\n\n      @vlan20 remote_ip 10.0.20.0/24\n      @not_vlan20 not remote_ip 10.0.20.0/24\n    }\n\n    (restrict_vlan) {\n      import vlan_matchers\n      redir @vlan20 http://help.lan 307\n    }\n  '';\n\n  services.caddy.virtualHosts.\"nyarlathotep.lan:80\".extraConfig = ''\n    import restrict_vlan\n    encode gzip\n    file_server {\n      root ${httpdir}/nyarlathotep.lan\n    }\n  '';\n\n  services.caddy.virtualHosts.\"alertmanager.nyarlathotep.lan:80\".extraConfig = ''\n    import restrict_vlan\n    encode gzip\n    reverse_proxy http://localhost:${toString config.services.prometheus.alertmanager.port}\n  '';\n\n  services.caddy.virtualHosts.\"bookdb.nyarlathotep.lan:80\".extraConfig = ''\n    import restrict_vlan\n    encode gzip\n    reverse_proxy http://localhost:${toString config.nixfiles.bookdb.port}\n  '';\n\n  services.caddy.virtualHosts.\"bookmarks.nyarlathotep.lan:80\".extraConfig = ''\n    import restrict_vlan\n    encode gzip\n    reverse_proxy http://localhost:${toString config.nixfiles.bookmarks.port}\n  '';\n\n  services.caddy.virtualHosts.\"flood.nyarlathotep.lan:80\".extraConfig = ''\n    import restrict_vlan\n    encode gzip\n    reverse_proxy http://localhost:${toString config.nixfiles.torrents.rpcPort}\n  '';\n\n  services.caddy.virtualHosts.\"finder.nyarlathotep.lan:80\".extraConfig = ''\n    import restrict_vlan\n    encode gzip\n    reverse_proxy http://localhost:${toString config.nixfiles.finder.port}\n  '';\n\n  services.caddy.virtualHosts.\"grafana.nyarlathotep.lan:80\".extraConfig = ''\n    import restrict_vlan\n    encode gzip\n    reverse_proxy http://localhost:${toString config.services.grafana.settings.server.http_port}\n  '';\n\n  services.caddy.virtualHosts.\"rpg-tools.nyarlathotep.lan:80\".extraConfig = ''\n    import restrict_vlan\n    encode gzip\n    file_server {\n      root ${httpdir}/rpg-tools.nyarlathotep.lan\n    }\n  '';\n\n  # don't restrict vlan as the port is open unrestricted anyway\n  services.caddy.virtualHosts.\"plex.nyarlathotep.lan:80\".extraConfig = ''\n    encode gzip\n    reverse_proxy http://localhost:32400\n  '';\n\n  services.caddy.virtualHosts.\"prometheus.nyarlathotep.lan:80\".extraConfig = ''\n    import restrict_vlan\n    encode gzip\n    reverse_proxy http://localhost:${toString config.services.prometheus.port}\n  '';\n\n  services.caddy.virtualHosts.\"help.lan:80\".extraConfig = ''\n    import vlan_matchers\n    redir @vlan1 http://vlan1.help.lan 302\n    redir @vlan10 http://vlan10.help.lan 302\n    redir @vlan20 http://vlan20.help.lan 302\n  '';\n\n  services.caddy.virtualHosts.\"vlan1.help.lan:80\".extraConfig = ''\n    import vlan_matchers\n    encode gzip\n    redir @not_vlan1 http://help.lan 302\n    file_server {\n      root ${httpdir}/vlan1.help.lan\n    }\n  '';\n\n  services.caddy.virtualHosts.\"vlan10.help.lan:80\".extraConfig = ''\n    import vlan_matchers\n    encode gzip\n    redir @not_vlan10 http://help.lan 302\n    file_server {\n      root ${httpdir}/vlan10.help.lan\n    }\n  '';\n\n  services.caddy.virtualHosts.\"vlan20.help.lan:80\".extraConfig = ''\n    import vlan_matchers\n    encode gzip\n    redir @not_vlan20 http://help.lan 302\n    file_server {\n      root ${httpdir}/vlan20.help.lan\n    }\n  '';\n\n  services.caddy.virtualHosts.\"*:80\".extraConfig = ''\n    respond * 421\n  '';\n\n\n  ###############################################################################\n  ## bookdb - https://github.com/barrucadu/bookdb\n  ###############################################################################\n\n  nixfiles.bookdb.enable = true;\n\n\n  ###############################################################################\n  ## bookmarks - https://github.com/barrucadu/bookmarks\n  ###############################################################################\n\n  nixfiles.bookmarks.enable = true;\n\n\n  ###############################################################################\n  ## finder\n  ###############################################################################\n\n  nixfiles.finder.enable = true;\n  nixfiles.finder.image = \"localhost:${toString config.services.dockerRegistry.port}/finder:latest\";\n  nixfiles.finder.mangaDir = \"/mnt/nas/private\";\n\n\n  ###############################################################################\n  ## torrents\n  ###############################################################################\n\n  nixfiles.torrents.enable = true;\n  nixfiles.torrents.downloadDir = \"/mnt/nas/torrents/files\";\n  nixfiles.torrents.watchDir = \"/mnt/nas/torrents/watch\";\n  nixfiles.torrents.user = \"barrucadu\";\n  nixfiles.torrents.group = \"users\";\n\n\n  ###############################################################################\n  ## Network Media\n  ###############################################################################\n\n  services.plex.enable = true;\n  services.plex.dataDir = \"/persist/var/lib/plex\";\n\n\n  ###############################################################################\n  # Monitoring & Dashboards\n  ###############################################################################\n\n  services.prometheus.alertmanager.environmentFile = config.sops.secrets.\"services/alertmanager/env\".path;\n  sops.secrets.\"services/alertmanager/env\" = { };\n\n  services.grafana = {\n    settings.server.root_url = \"http://grafana.nyarlathotep.lan\";\n    provision = {\n      datasources.settings.datasources = [\n        {\n          name = \"victoriametrics\";\n          url = \"http://${config.services.victoriametrics.listenAddress}\";\n          type = \"prometheus\";\n        }\n      ];\n      dashboards.settings.providers =\n        let\n          dashboard = folder: name: path: { inherit name folder; options.path = path; };\n        in\n        [\n          (dashboard \"My Dashboards\" \"finance.json\" ./dashboards/finance.json)\n          (dashboard \"My Dashboards\" \"smart-home.json\" ./dashboards/smart-home.json)\n        ];\n    };\n  };\n\n  services.prometheus.webExternalUrl = \"http://prometheus.nyarlathotep.lan\";\n  services.prometheus.scrapeConfigs = [\n    {\n      job_name = \"awair\";\n      static_configs = [{ targets = [ \"localhost:${toString prometheusAwairExporterPort}\" ]; }];\n    }\n  ];\n\n  systemd.services.prometheus-awair-exporter =\n    {\n      description = \"barrucadu/prometheus-awair-exporter metrics exporter\";\n      wantedBy = [ \"multi-user.target\" ];\n      after = [ \"network-online.target\" ];\n      wants = [ \"network-online.target\" ];\n      serviceConfig = {\n        ExecStart = concatStringsSep \" \" [\n          \"${pkgs.nixfiles.prometheus-awair-exporter}/bin/prometheus-awair-exporter\"\n          \"--address 127.0.0.1:${toString prometheusAwairExporterPort}\"\n          \"--sensor bedroom:10.0.20.187\"\n          \"--sensor guest-bedroom:10.0.20.130\"\n          \"--sensor living-room:10.0.20.117\"\n          \"--sensor office:10.0.20.194\"\n        ];\n        DynamicUser = \"true\";\n        Restart = \"on-failure\";\n      };\n    };\n\n\n  ###############################################################################\n  ## Docker registry (currently just used on this machine)\n  ###############################################################################\n\n  services.dockerRegistry.enable = true;\n  virtualisation.containers.registries.insecure = [ \"localhost:${toString config.services.dockerRegistry.port}\" ];\n\n\n  ###############################################################################\n  # Automatic music tagging\n  ###############################################################################\n\n  systemd.services.tag-podcasts = {\n    enable = true;\n    description = \"Automatically tag new podcast files\";\n    wantedBy = [ \"multi-user.target\" ];\n    path = with pkgs; [ ffmpeg inotify-tools id3v2 ];\n    unitConfig.RequiresMountsFor = \"/mnt/nas\";\n    serviceConfig = {\n      WorkingDirectory = \"/mnt/nas/music/Podcasts/\";\n      ExecStart = pkgs.writeShellScript \"tag-podcasts.sh\" (fileContents ./jobs/tag-podcasts.sh);\n      User = \"barrucadu\";\n      Group = \"users\";\n      Restart = \"always\";\n    };\n  };\n\n  systemd.paths.flac-and-tag-album = {\n    enable = true;\n    description = \"Automatically flac and tag new albums\";\n    wantedBy = [ \"multi-user.target\" ];\n    unitConfig.RequiresMountsFor = \"/mnt/nas\";\n    pathConfig.PathExistsGlob = \"/mnt/nas/music/to_convert/in/*\";\n  };\n  systemd.services.flac-and-tag-album = {\n    path = with pkgs; [ flac ];\n    serviceConfig = {\n      WorkingDirectory = \"/mnt/nas/music/to_convert/in/\";\n      ExecStart = pkgs.writeShellScript \"flac-and-tag-album.sh\" (fileContents ./jobs/flac-and-tag-album.sh);\n      User = \"barrucadu\";\n      Group = \"users\";\n    };\n  };\n\n\n  ###############################################################################\n  # Finance dashboard & FX rate fetching\n  ###############################################################################\n\n  systemd.services.hledger-fetch-fx-rates = {\n    description = \"Download GBP exchange rates for commodities\";\n    startAt = \"*-*-* 21:00:00\";\n    path = with pkgs; [ hledger ];\n    serviceConfig = {\n      ExecStart =\n        let python = pkgs.python3.withPackages (ps: [ ps.requests ]);\n        in \"${python}/bin/python3 ${pkgs.writeText \"hledger-fetch-fx-rates.py\" (fileContents ./jobs/hledger-fetch-fx-rates.py)}\";\n      User = \"barrucadu\";\n      Group = \"users\";\n    };\n    environment = {\n      PRICE_FILE = \"/home/barrucadu/s/ledger/prices\";\n    };\n  };\n\n  systemd.services.hledger-export-to-victoriametrics = {\n    description = \"Export personal finance data to VictoriaMetrics\";\n    startAt = \"daily\";\n    path = with pkgs; [ hledger ];\n    serviceConfig = {\n      ExecStart =\n        let python = pkgs.python3.withPackages (ps: [ ps.requests ]);\n        in \"${python}/bin/python3 ${pkgs.writeText \"hledger-export-to-victoriametrics.py\" (fileContents ./jobs/hledger-export-to-victoriametrics.py)}\";\n      User = \"barrucadu\";\n      Group = \"users\";\n    };\n    environment = {\n      LEDGER_FILE = \"/home/barrucadu/s/ledger/combined.journal\";\n      VICTORIAMETRICS_URI = \"http://${config.services.victoriametrics.listenAddress}\";\n    };\n  };\n  # also reload data after boot\n  systemd.timers.hledger-export-to-victoriametrics.timerConfig.OnBootSec = \"5m\";\n\n  services.victoriametrics = {\n    enable = true;\n    listenAddress = \"127.0.0.1:8428\";\n    retentionPeriod = \"10y\";\n  };\n\n\n  ###############################################################################\n  # Remote Sync\n  ###############################################################################\n\n  nixfiles.bookdb.remoteSync.send.enable = true;\n  nixfiles.bookdb.remoteSync.send.sshKeyFile = config.sops.secrets.\"users/bookdb_remote_sync/ssh_private_key\".path;\n  nixfiles.bookdb.remoteSync.send.targets = [\n    \"carcosa.barrucadu.co.uk\"\n    \"yuggoth.barrucadu.co.uk\"\n  ];\n\n  sops.secrets.\"users/bookdb_remote_sync/ssh_private_key\" = {\n    owner = config.users.users.bookdb-remote-sync-send.name;\n    key = \"users/remote_sync/ssh_private_key\";\n  };\n\n  nixfiles.bookmarks.remoteSync.send.enable = true;\n  nixfiles.bookmarks.remoteSync.send.sshKeyFile = config.sops.secrets.\"users/bookmarks_remote_sync/ssh_private_key\".path;\n  nixfiles.bookmarks.remoteSync.send.targets = [\n    \"carcosa.barrucadu.co.uk\"\n    \"yuggoth.barrucadu.co.uk\"\n  ];\n\n  sops.secrets.\"users/bookmarks_remote_sync/ssh_private_key\" = {\n    owner = config.users.users.bookmarks-remote-sync-send.name;\n    key = \"users/remote_sync/ssh_private_key\";\n  };\n\n  ###############################################################################\n  # RSS-to-Mastodon\n  ###############################################################################\n\n  users.users.rss-to-mastodon = {\n    uid = 991;\n    home = \"/persist/var/lib/rss-to-mastodon\";\n    createHome = true;\n    isSystemUser = true;\n    group = \"nogroup\";\n  };\n\n  systemd.services.rss-to-mastodon-kjp-hacksrus = {\n    description = \"Publish King James Programming to hacksrus.xyz\";\n    startAt = \"hourly\";\n    serviceConfig = {\n      ExecStart =\n        let python = pkgs.python3.withPackages (ps: [ ps.beautifulsoup4 ps.docopt ps.feedparser ps.requests ]);\n        in concatStringsSep \" \" [\n          \"${python}/bin/python3\"\n          (pkgs.writeText \"rss-to-mastodon.py\" (fileContents ./jobs/rss-to-mastodon.py))\n          \"--use-summary\"\n          \"-d https://hacksrus.xyz/\"\n          \"-f https://kingjamesprogramming.tumblr.com/rss\"\n          \"-l /persist/var/lib/rss-to-mastodon/kjp-hacksrus.txt\"\n        ];\n      User = \"rss-to-mastodon\";\n      EnvironmentFile = config.sops.secrets.\"users/rss_to_mastodon/kjp_hacksrus_env\".path;\n    };\n  };\n\n  sops.secrets.\"users/rss_to_mastodon/kjp_hacksrus_env\" = { };\n}\n"
  },
  {
    "path": "hosts/nyarlathotep/dashboards/finance.json",
    "content": "{\n  \"annotations\": {\n    \"list\": [\n      {\n        \"$$hashKey\": \"object:321\",\n        \"builtIn\": 1,\n        \"datasource\": {\n          \"type\": \"datasource\",\n          \"uid\": \"grafana\"\n        },\n        \"enable\": true,\n        \"hide\": true,\n        \"iconColor\": \"rgba(0, 211, 255, 1)\",\n        \"name\": \"Annotations & Alerts\",\n        \"target\": {\n          \"limit\": 100,\n          \"matchAny\": false,\n          \"tags\": [],\n          \"type\": \"dashboard\"\n        },\n        \"type\": \"dashboard\"\n      }\n    ]\n  },\n  \"editable\": true,\n  \"fiscalYearStartMonth\": 0,\n  \"graphTooltip\": 0,\n  \"id\": 4,\n  \"links\": [],\n  \"panels\": [\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"decimals\": 1,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"red\",\n                \"value\": 0\n              },\n              {\n                \"color\": \"green\",\n                \"value\": 0\n              }\n            ]\n          },\n          \"unit\": \"currencyGBP\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 4,\n        \"x\": 0,\n        \"y\": 0\n      },\n      \"id\": 101,\n      \"options\": {\n        \"colorMode\": \"background\",\n        \"graphMode\": \"none\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"auto\",\n        \"percentChangeColorMode\": \"standard\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showPercentChange\": false,\n        \"textMode\": \"auto\",\n        \"wideLayout\": true\n      },\n      \"pluginVersion\": \"12.3.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"sum(hledger_balance{account=\\\"assets\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\\r\\n+ on(target_currency)\\r\\nsum(hledger_balance{account=\\\"liabilities\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Net Worth\",\n      \"transparent\": true,\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"decimals\": 1,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"red\",\n                \"value\": 0\n              },\n              {\n                \"color\": \"green\",\n                \"value\": 0\n              }\n            ]\n          },\n          \"unit\": \"currencyGBP\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 4,\n        \"x\": 4,\n        \"y\": 0\n      },\n      \"id\": 61,\n      \"options\": {\n        \"colorMode\": \"background\",\n        \"graphMode\": \"none\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"auto\",\n        \"percentChangeColorMode\": \"standard\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showPercentChange\": false,\n        \"textMode\": \"auto\",\n        \"wideLayout\": true\n      },\n      \"pluginVersion\": \"12.3.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"(\\r\\n    sum(hledger_balance{account=\\\"assets\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\\r\\n    - on(target_currency)\\r\\n    sum(hledger_balance{account=\\\"assets:property\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\\r\\n)\\r\\n+ on(target_currency)\\r\\n(\\r\\n    sum(hledger_balance{account=\\\"liabilities\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\\r\\n    - on(target_currency)\\r\\n    sum(hledger_balance{account=\\\"liabilities:mortgage\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\\r\\n)\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Net Worth (ex. property)\",\n      \"transparent\": true,\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"decimals\": 1,\n          \"mappings\": [],\n          \"max\": 1,\n          \"min\": 0,\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"red\",\n                \"value\": 0\n              },\n              {\n                \"color\": \"yellow\",\n                \"value\": 0.33\n              },\n              {\n                \"color\": \"green\",\n                \"value\": 0.5\n              }\n            ]\n          },\n          \"unit\": \"percentunit\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 4,\n        \"x\": 8,\n        \"y\": 0\n      },\n      \"id\": 62,\n      \"options\": {\n        \"colorMode\": \"background\",\n        \"graphMode\": \"none\",\n        \"justifyMode\": \"center\",\n        \"orientation\": \"auto\",\n        \"percentChangeColorMode\": \"standard\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"mean\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showPercentChange\": false,\n        \"text\": {},\n        \"textMode\": \"value\",\n        \"wideLayout\": true\n      },\n      \"pluginVersion\": \"12.3.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"# saved income\\r\\n(\\r\\n    sum(hledger_monthly_decrease{account=\\\"income\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\\r\\n    - on(target_currency)\\r\\n    sum(hledger_monthly_increase{account=\\\"expenses\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\\r\\n    # ignore pension contributions (assumes pensions only go up - include 'decrease' as well to handle January roll-over)\\r\\n    - on(target_currency)\\r\\n    (\\r\\n        sum(hledger_monthly_increase{account=\\\"assets:pension\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency) -\\r\\n        sum(hledger_monthly_decrease{account=\\\"assets:pension\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\\r\\n    )\\r\\n)\\r\\n\\r\\n/ on(target_currency)\\r\\n\\r\\n# net income\\r\\n(\\r\\n    sum(hledger_monthly_decrease{account=\\\"income\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\\r\\n    - on(target_currency)\\r\\n    sum(hledger_monthly_increase{account=\\\"expenses:gross\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\\r\\n    # as above\\r\\n    - on(target_currency)\\r\\n    (\\r\\n        sum(hledger_monthly_increase{account=\\\"assets:pension\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency) -\\r\\n        sum(hledger_monthly_decrease{account=\\\"assets:pension\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\\r\\n    )\\r\\n)\",\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Savings Rate\",\n      \"transparent\": true,\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"decimals\": 1,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"red\",\n                \"value\": 0\n              },\n              {\n                \"color\": \"yellow\",\n                \"value\": 60\n              },\n              {\n                \"color\": \"green\",\n                \"value\": 90\n              }\n            ]\n          },\n          \"unit\": \"d\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 4,\n        \"x\": 12,\n        \"y\": 0\n      },\n      \"id\": 63,\n      \"options\": {\n        \"colorMode\": \"background\",\n        \"graphMode\": \"none\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"auto\",\n        \"percentChangeColorMode\": \"standard\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showPercentChange\": false,\n        \"textMode\": \"auto\",\n        \"wideLayout\": true\n      },\n      \"pluginVersion\": \"12.3.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"# total available cash and emergency fund\\r\\n(\\r\\n    sum(hledger_balance{account=\\\"assets:cash\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by (target_currency)\\r\\n    + on (target_currency)\\r\\n    sum(hledger_balance{account=\\\"assets:investments:nsi:premium_bonds:emergency\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by (target_currency)\\r\\n)\\r\\n\\r\\n/ on (target_currency)\\r\\n\\r\\n# average daily expense\\r\\n(\\r\\n    (\\r\\n        sum(hledger_balance{account=\\\"expenses\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by (target_currency)\\r\\n        - on(target_currency)\\r\\n        sum(hledger_balance{account=\\\"expenses\\\"} offset ${agg_window}d * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by (target_currency)\\r\\n        - on(target_currency)\\r\\n        sum(hledger_balance{account=\\\"expenses:gross\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by (target_currency)\\r\\n        + on(target_currency)\\r\\n        sum(hledger_balance{account=\\\"expenses:gross\\\"} offset ${agg_window}d * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by (target_currency)\\r\\n    ) / $agg_window\\r\\n)\",\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Short Runway\",\n      \"transparent\": true,\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"decimals\": 1,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"red\",\n                \"value\": 0\n              },\n              {\n                \"color\": \"yellow\",\n                \"value\": 60\n              },\n              {\n                \"color\": \"green\",\n                \"value\": 90\n              }\n            ]\n          },\n          \"unit\": \"d\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 4,\n        \"x\": 16,\n        \"y\": 0\n      },\n      \"id\": 85,\n      \"options\": {\n        \"colorMode\": \"background\",\n        \"graphMode\": \"none\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"auto\",\n        \"percentChangeColorMode\": \"standard\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showPercentChange\": false,\n        \"textMode\": \"auto\",\n        \"wideLayout\": true\n      },\n      \"pluginVersion\": \"12.3.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"(\\r\\n    sum(hledger_balance{account=\\\"assets\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by (target_currency)\\r\\n    - on(target_currency)\\r\\n    sum(hledger_balance{account=\\\"assets:pension\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by (target_currency)\\r\\n    - on(target_currency)\\r\\n    sum(hledger_balance{account=\\\"assets:property\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by (target_currency)\\r\\n)\\r\\n/ on (target_currency)\\r\\n\\r\\n# average daily expense\\r\\n(\\r\\n    (\\r\\n        sum(hledger_balance{account=\\\"expenses\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by (target_currency)\\r\\n        - on(target_currency)\\r\\n        sum(hledger_balance{account=\\\"expenses\\\"} offset ${agg_window}d * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by (target_currency)\\r\\n        - on(target_currency)\\r\\n        sum(hledger_balance{account=\\\"expenses:gross\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by (target_currency)\\r\\n        + on(target_currency)\\r\\n        sum(hledger_balance{account=\\\"expenses:gross\\\"} offset ${agg_window}d * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by (target_currency)\\r\\n    ) / $agg_window\\r\\n)\",\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Long Runway\",\n      \"transparent\": true,\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"red\",\n                \"value\": 0\n              },\n              {\n                \"color\": \"#EAB839\",\n                \"value\": 0.5\n              },\n              {\n                \"color\": \"green\",\n                \"value\": 0.75\n              }\n            ]\n          },\n          \"unit\": \"percentunit\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 4,\n        \"x\": 20,\n        \"y\": 0\n      },\n      \"id\": 72,\n      \"options\": {\n        \"colorMode\": \"background\",\n        \"graphMode\": \"none\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"auto\",\n        \"percentChangeColorMode\": \"standard\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showPercentChange\": false,\n        \"text\": {},\n        \"textMode\": \"auto\",\n        \"wideLayout\": true\n      },\n      \"pluginVersion\": \"12.3.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"# all assets (sans pension)\\r\\n(\\r\\n    sum(hledger_balance{account=\\\"assets\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by (target_currency)\\r\\n    - on(target_currency)\\r\\n    sum(hledger_balance{account=\\\"assets:pension\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by (target_currency)\\r\\n    - on(target_currency)\\r\\n    sum(hledger_balance{account=\\\"assets:property\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by (target_currency)\\r\\n)\\r\\n\\r\\n/ on(target_currency)\\r\\n\\r\\n# FIRE number\\r\\n(\\r\\n    (\\r\\n        sum(hledger_balance{account=\\\"expenses\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by (target_currency)\\r\\n        - on(target_currency)\\r\\n        sum(hledger_balance{account=\\\"expenses\\\"} offset ${agg_window}d * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by (target_currency)\\r\\n        - on(target_currency)\\r\\n        sum(hledger_balance{account=\\\"expenses:gross\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by (target_currency)\\r\\n        + on(target_currency)\\r\\n        sum(hledger_balance{account=\\\"expenses:gross\\\"} offset ${agg_window}d * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by (target_currency)\\r\\n    ) / $agg_window * 365 * $fire_annual_factor\\r\\n)\",\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"FIRE Progress\",\n      \"transparent\": true,\n      \"type\": \"stat\"\n    },\n    {\n      \"collapsed\": false,\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 3\n      },\n      \"id\": 109,\n      \"panels\": [],\n      \"title\": \"Overview\",\n      \"type\": \"row\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [\n            {\n              \"options\": {\n                \"match\": \"null\",\n                \"result\": {\n                  \"text\": \"N/A\"\n                }\n              },\n              \"type\": \"special\"\n            }\n          ],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"#299c46\",\n                \"value\": 0\n              },\n              {\n                \"color\": \"rgba(237, 129, 40, 0.89)\",\n                \"value\": 10\n              },\n              {\n                \"color\": \"#d44a3a\",\n                \"value\": 25\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 2,\n        \"w\": 4,\n        \"x\": 0,\n        \"y\": 4\n      },\n      \"id\": 21,\n      \"maxDataPoints\": 100,\n      \"options\": {\n        \"colorMode\": \"none\",\n        \"graphMode\": \"none\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"percentChangeColorMode\": \"standard\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showPercentChange\": false,\n        \"text\": {},\n        \"textMode\": \"auto\",\n        \"wideLayout\": true\n      },\n      \"pluginVersion\": \"12.3.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"sum(hledger_transactions_total) without(status)\",\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Total Transactions\",\n      \"transparent\": true,\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisBorderShow\": false,\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"barWidthFactor\": 0.6,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 15,\n            \"gradientMode\": \"opacity\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"insertNulls\": false,\n            \"lineInterpolation\": \"stepAfter\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"showValues\": false,\n            \"spanNulls\": true,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"normal\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"fieldMinMax\": false,\n          \"mappings\": [],\n          \"max\": 500000,\n          \"min\": 0,\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": 0\n              }\n            ]\n          },\n          \"unit\": \"currencyGBP\"\n        },\n        \"overrides\": [\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Cash\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"green\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Funds\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"yellow\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Premium Bonds\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"blue\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Receivable\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"orange\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Target: AAW\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"rgb(117, 12, 24)\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Target: FIRE\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"light-red\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Target: PAW\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"dark-red\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byRegexp\",\n              \"options\": \"/Target.*/\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.fillOpacity\",\n                \"value\": 0\n              },\n              {\n                \"id\": \"custom.stacking\",\n                \"value\": {\n                  \"group\": false,\n                  \"mode\": \"none\"\n                }\n              },\n              {\n                \"id\": \"custom.lineStyle\",\n                \"value\": {\n                  \"dash\": [\n                    10,\n                    10\n                  ],\n                  \"fill\": \"dash\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Property\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"purple\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"__systemRef\": \"hideSeriesFrom\",\n            \"matcher\": {\n              \"id\": \"byNames\",\n              \"options\": {\n                \"mode\": \"exclude\",\n                \"names\": [\n                  \"Receivable\",\n                  \"Premium Bonds\",\n                  \"Funds\",\n                  \"Cash\",\n                  \"Target: AAW\",\n                  \"Target: PAW\",\n                  \"Target: FIRE\"\n                ],\n                \"prefix\": \"All except:\",\n                \"readOnly\": true\n              }\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.hideFrom\",\n                \"value\": {\n                  \"legend\": false,\n                  \"tooltip\": true,\n                  \"viz\": true\n                }\n              }\n            ]\n          }\n        ]\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 13,\n        \"x\": 4,\n        \"y\": 4\n      },\n      \"id\": 68,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [\n            \"mean\",\n            \"lastNotNull\"\n          ],\n          \"displayMode\": \"table\",\n          \"placement\": \"right\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"hideZeros\": false,\n          \"mode\": \"multi\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"12.3.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"sum(hledger_balance{account=\\\"assets:property\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"Property\",\n          \"range\": true,\n          \"refId\": \"AssetsProperty\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"sum(hledger_balance{account=\\\"assets:receivable\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\",\n          \"groupBy\": [\n            {\n              \"params\": [\n                \"$__interval\"\n              ],\n              \"type\": \"time\"\n            },\n            {\n              \"params\": [\n                \"null\"\n              ],\n              \"type\": \"fill\"\n            }\n          ],\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"Receivable\",\n          \"orderByTime\": \"ASC\",\n          \"policy\": \"default\",\n          \"refId\": \"AssetsReceivable\",\n          \"resultFormat\": \"time_series\",\n          \"select\": [\n            [\n              {\n                \"params\": [\n                  \"value\"\n                ],\n                \"type\": \"field\"\n              },\n              {\n                \"params\": [],\n                \"type\": \"mean\"\n              }\n            ]\n          ],\n          \"tags\": []\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"sum(hledger_balance{account=\\\"assets:investments:nsi:premium_bonds\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"Premium Bonds\",\n          \"refId\": \"AssetsPremiumBonds\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"sum(hledger_balance{account=\\\"assets:investments\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\\r\\n- on(target_currency)\\r\\nsum(hledger_balance{account=\\\"assets:investments:nsi:premium_bonds\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"Funds\",\n          \"refId\": \"AssetsFunds\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"sum(hledger_balance{account=\\\"assets:cash\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"Cash\",\n          \"refId\": \"AssetsCash\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"(\\r\\n    # average daily income\\r\\n    (\\r\\n        sum(hledger_balance{account=\\\"income\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by (target_currency)\\r\\n        - on(target_currency)\\r\\n        sum(hledger_balance{account=\\\"income\\\"} offset ${agg_window}d * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by (target_currency)\\r\\n        - on(target_currency)\\r\\n        sum(hledger_balance{account=\\\"income:gift\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by (target_currency)\\r\\n        + on(target_currency)\\r\\n        sum(hledger_balance{account=\\\"income:gift\\\"} offset ${agg_window}d * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by (target_currency)\\r\\n    ) / $agg_window * -1\\r\\n\\r\\n    # age/10 years worth\\r\\n    * 365 * ignoring(unit) quantified_self_age{unit=\\\"years\\\"} / 10\\r\\n) / 2\\r\\n\\r\\n# ignore gifted income\\r\\n- on(target_currency)\\r\\nsum(hledger_balance{account=\\\"income:gift\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by (target_currency)\\r\\n\\r\\n# add (subtract) liabilities, other than student loan & mortgage\\r\\n- on(target_currency)\\r\\nsum(hledger_balance{account=\\\"liabilities\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by (target_currency)\\r\\n+ on(target_currency)\\r\\nsum(hledger_balance{account=\\\"liabilities:loan:slc\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by (target_currency)\\r\\n+ on(target_currency)\\r\\nsum(hledger_balance{account=\\\"liabilities:mortgage\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by (target_currency)\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"Target: AAW\",\n          \"range\": true,\n          \"refId\": \"TargetAAW\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"(\\r\\n    # average daily income\\r\\n    (\\r\\n        sum(hledger_balance{account=\\\"income\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by (target_currency)\\r\\n        - on(target_currency)\\r\\n        sum(hledger_balance{account=\\\"income\\\"} offset ${agg_window}d * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by (target_currency)\\r\\n        - on(target_currency)\\r\\n        sum(hledger_balance{account=\\\"income:gift\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by (target_currency)\\r\\n        + on(target_currency)\\r\\n        sum(hledger_balance{account=\\\"income:gift\\\"} offset ${agg_window}d * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by (target_currency)\\r\\n    ) / $agg_window * -1\\r\\n\\r\\n    # age/10 years worth\\r\\n    * 365 * ignoring(unit) quantified_self_age{unit=\\\"years\\\"} / 10\\r\\n) * 2\\r\\n\\r\\n# ignore gifted income\\r\\n- on(target_currency)\\r\\nsum(hledger_balance{account=\\\"income:gift\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by (target_currency)\\r\\n\\r\\n# add (subtract) liabilities, other than student loan & mortgage\\r\\n- on(target_currency)\\r\\nsum(hledger_balance{account=\\\"liabilities\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by (target_currency)\\r\\n+ on(target_currency)\\r\\nsum(hledger_balance{account=\\\"liabilities:loan:slc\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by (target_currency)\\r\\n+ on(target_currency)\\r\\nsum(hledger_balance{account=\\\"liabilities:mortgage\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by (target_currency)\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"Target: PAW\",\n          \"range\": true,\n          \"refId\": \"TargetPAW\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"# average daily expense\\r\\n(\\r\\n    sum(hledger_balance{account=\\\"expenses\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by (target_currency)\\r\\n    - on(target_currency)\\r\\n    sum(hledger_balance{account=\\\"expenses\\\"} offset ${agg_window}d * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by (target_currency)\\r\\n    - on(target_currency)\\r\\n    sum(hledger_balance{account=\\\"expenses:gross\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by (target_currency)\\r\\n    + on(target_currency)\\r\\n    sum(hledger_balance{account=\\\"expenses:gross\\\"} offset ${agg_window}d * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by (target_currency)\\r\\n) / $agg_window\\r\\n\\r\\n# $fire_annual_factor years worth\\r\\n* 365 * $fire_annual_factor\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"Target: FIRE\",\n          \"refId\": \"TargetFIRE\"\n        }\n      ],\n      \"title\": \"Assets (Stacked)\",\n      \"transparent\": true,\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            }\n          },\n          \"decimals\": 2,\n          \"mappings\": [],\n          \"unit\": \"currencyGBP\"\n        },\n        \"overrides\": [\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Cash\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"green\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Funds\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"yellow\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Premium Bonds\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"blue\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Receivable\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"orange\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Property\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"purple\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"__systemRef\": \"hideSeriesFrom\",\n            \"matcher\": {\n              \"id\": \"byNames\",\n              \"options\": {\n                \"mode\": \"exclude\",\n                \"names\": [\n                  \"Cash\",\n                  \"Funds\",\n                  \"Premium Bonds\",\n                  \"Receivable\"\n                ],\n                \"prefix\": \"All except:\",\n                \"readOnly\": true\n              }\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.hideFrom\",\n                \"value\": {\n                  \"legend\": false,\n                  \"tooltip\": true,\n                  \"viz\": true\n                }\n              }\n            ]\n          }\n        ]\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 3,\n        \"x\": 17,\n        \"y\": 4\n      },\n      \"id\": 69,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true,\n          \"values\": [\n            \"value\"\n          ]\n        },\n        \"pieType\": \"donut\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"sort\": \"desc\",\n        \"tooltip\": {\n          \"hideZeros\": false,\n          \"mode\": \"multi\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"12.3.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"sum(hledger_balance{account=\\\"assets:cash\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\",\n          \"interval\": \"\",\n          \"legendFormat\": \"Cash\",\n          \"refId\": \"Cash\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"sum(hledger_balance{account=\\\"assets:investments\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\\r\\n- on(target_currency)\\r\\nsum(hledger_balance{account=\\\"assets:investments:nsi:premium_bonds\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"Funds\",\n          \"refId\": \"Funds\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"sum(hledger_balance{account=\\\"assets:investments:nsi:premium_bonds\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"Premium Bonds\",\n          \"refId\": \"PremiumBonds\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"sum(hledger_balance{account=\\\"assets:receivable\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"Receivable\",\n          \"refId\": \"Receivable\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"sum(hledger_balance{account=\\\"assets:property\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"Property\",\n          \"range\": true,\n          \"refId\": \"Property\"\n        }\n      ],\n      \"title\": \"Current Allocation\",\n      \"transparent\": true,\n      \"type\": \"piechart\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"red\",\n                \"value\": 0\n              }\n            ]\n          },\n          \"unit\": \"currencyGBP\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 4,\n        \"x\": 20,\n        \"y\": 4\n      },\n      \"id\": 87,\n      \"options\": {\n        \"colorMode\": \"none\",\n        \"graphMode\": \"none\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"percentChangeColorMode\": \"standard\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showPercentChange\": false,\n        \"text\": {},\n        \"textMode\": \"auto\",\n        \"wideLayout\": true\n      },\n      \"pluginVersion\": \"12.3.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"(\\r\\n    sum(hledger_balance{account=\\\"assets\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by (target_currency)\\r\\n    - on(target_currency)\\r\\n    sum(hledger_balance{account=\\\"assets:pension\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by (target_currency)\\r\\n    - on(target_currency)\\r\\n    sum(hledger_balance{account=\\\"assets:property\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by (target_currency)\\r\\n) * 0.04\",\n          \"interval\": \"\",\n          \"legendFormat\": \"4.0%\",\n          \"range\": true,\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"(\\r\\n    sum(hledger_balance{account=\\\"assets\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by (target_currency)\\r\\n    - on(target_currency)\\r\\n    sum(hledger_balance{account=\\\"assets:pension\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by (target_currency)\\r\\n    - on(target_currency)\\r\\n    sum(hledger_balance{account=\\\"assets:property\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by (target_currency)\\r\\n) * 0.035\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"3.5%\",\n          \"range\": true,\n          \"refId\": \"B\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"(\\r\\n    sum(hledger_balance{account=\\\"assets\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by (target_currency)\\r\\n    - on(target_currency)\\r\\n    sum(hledger_balance{account=\\\"assets:pension\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by (target_currency)\\r\\n    - on(target_currency)\\r\\n    sum(hledger_balance{account=\\\"assets:property\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by (target_currency)\\r\\n) * 0.03\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"3.0%\",\n          \"range\": true,\n          \"refId\": \"C\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"(\\r\\n    sum(hledger_balance{account=\\\"assets\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by (target_currency)\\r\\n    - on(target_currency)\\r\\n    sum(hledger_balance{account=\\\"assets:pension\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by (target_currency)\\r\\n    - on(target_currency)\\r\\n    sum(hledger_balance{account=\\\"assets:property\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by (target_currency)\\r\\n) * 0.025\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"2.5%\",\n          \"range\": true,\n          \"refId\": \"D\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"(\\r\\n    sum(hledger_balance{account=\\\"expenses\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by (target_currency)\\r\\n    - on(target_currency)\\r\\n    sum(hledger_balance{account=\\\"expenses\\\"} offset ${agg_window}d * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by (target_currency)\\r\\n    - on(target_currency)\\r\\n    sum(hledger_balance{account=\\\"expenses:gross\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by (target_currency)\\r\\n    + on(target_currency)\\r\\n    sum(hledger_balance{account=\\\"expenses:gross\\\"} offset ${agg_window}d * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by (target_currency)\\r\\n) / $agg_window * 365\",\n          \"hide\": false,\n          \"legendFormat\": \"Target\",\n          \"range\": true,\n          \"refId\": \"E\"\n        }\n      ],\n      \"title\": \"Safe Withdrawal Rate\",\n      \"transparent\": true,\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [\n            {\n              \"options\": {\n                \"match\": \"null\",\n                \"result\": {\n                  \"text\": \"N/A\"\n                }\n              },\n              \"type\": \"special\"\n            }\n          ],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"#299c46\",\n                \"value\": 0\n              },\n              {\n                \"color\": \"rgba(237, 129, 40, 0.89)\",\n                \"value\": 10\n              },\n              {\n                \"color\": \"#d44a3a\",\n                \"value\": 25\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 2,\n        \"x\": 0,\n        \"y\": 6\n      },\n      \"id\": 17,\n      \"maxDataPoints\": 100,\n      \"options\": {\n        \"colorMode\": \"none\",\n        \"graphMode\": \"none\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"percentChangeColorMode\": \"standard\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showPercentChange\": false,\n        \"text\": {},\n        \"textMode\": \"auto\",\n        \"wideLayout\": true\n      },\n      \"pluginVersion\": \"12.3.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"hledger_transactions_total{status=\\\"cleared\\\"}\",\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Cleared\",\n      \"transparent\": true,\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [\n            {\n              \"options\": {\n                \"match\": \"null\",\n                \"result\": {\n                  \"text\": \"N/A\"\n                }\n              },\n              \"type\": \"special\"\n            }\n          ],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"#299c46\",\n                \"value\": 0\n              },\n              {\n                \"color\": \"rgba(237, 129, 40, 0.89)\",\n                \"value\": 10\n              },\n              {\n                \"color\": \"#d44a3a\",\n                \"value\": 25\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 2,\n        \"x\": 2,\n        \"y\": 6\n      },\n      \"id\": 18,\n      \"maxDataPoints\": 100,\n      \"options\": {\n        \"colorMode\": \"value\",\n        \"graphMode\": \"none\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"percentChangeColorMode\": \"standard\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showPercentChange\": false,\n        \"text\": {},\n        \"textMode\": \"auto\",\n        \"wideLayout\": true\n      },\n      \"pluginVersion\": \"12.3.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"hledger_transactions_total{status=\\\"pending\\\"}\",\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Uncleared\",\n      \"transparent\": true,\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [\n            {\n              \"options\": {\n                \"match\": \"null\",\n                \"result\": {\n                  \"text\": \"N/A\"\n                }\n              },\n              \"type\": \"special\"\n            }\n          ],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"#299c46\",\n                \"value\": 0\n              },\n              {\n                \"color\": \"rgba(237, 129, 40, 0.89)\",\n                \"value\": 10\n              },\n              {\n                \"color\": \"#d44a3a\",\n                \"value\": 25\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 2,\n        \"x\": 0,\n        \"y\": 9\n      },\n      \"id\": 19,\n      \"maxDataPoints\": 100,\n      \"options\": {\n        \"colorMode\": \"none\",\n        \"graphMode\": \"none\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"percentChangeColorMode\": \"standard\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showPercentChange\": false,\n        \"text\": {},\n        \"textMode\": \"auto\",\n        \"wideLayout\": true\n      },\n      \"pluginVersion\": \"12.3.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"hledger_transactions_total{status=\\\"bookkeeping\\\"}\",\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Bookkeeping\",\n      \"transparent\": true,\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [\n            {\n              \"options\": {\n                \"match\": \"null\",\n                \"result\": {\n                  \"text\": \"N/A\"\n                }\n              },\n              \"type\": \"special\"\n            }\n          ],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"#299c46\",\n                \"value\": 0\n              },\n              {\n                \"color\": \"rgba(237, 129, 40, 0.89)\",\n                \"value\": 10\n              },\n              {\n                \"color\": \"#d44a3a\",\n                \"value\": 25\n              }\n            ]\n          },\n          \"unit\": \"percentunit\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 2,\n        \"x\": 2,\n        \"y\": 9\n      },\n      \"id\": 20,\n      \"maxDataPoints\": 100,\n      \"options\": {\n        \"colorMode\": \"none\",\n        \"graphMode\": \"none\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"percentChangeColorMode\": \"standard\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showPercentChange\": false,\n        \"text\": {},\n        \"textMode\": \"auto\",\n        \"wideLayout\": true\n      },\n      \"pluginVersion\": \"12.3.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"hledger_transactions_total{status=\\\"bookkeeping\\\"}\\r\\n/ ignoring(status)\\r\\nsum(hledger_transactions_total) without(status)\",\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Bookkeeping\",\n      \"transparent\": true,\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisBorderShow\": false,\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"barWidthFactor\": 0.6,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 15,\n            \"gradientMode\": \"opacity\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"insertNulls\": false,\n            \"lineInterpolation\": \"stepAfter\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"showValues\": false,\n            \"spanNulls\": true,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"links\": [],\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": 0\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"currencyGBP\"\n        },\n        \"overrides\": [\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Delta\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"blue\",\n                  \"mode\": \"fixed\"\n                }\n              },\n              {\n                \"id\": \"custom.fillOpacity\",\n                \"value\": 0\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Total Assets\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"green\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Total Liabilities\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"red\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          }\n        ]\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 12\n      },\n      \"id\": 23,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [\n            \"mean\",\n            \"lastNotNull\"\n          ],\n          \"displayMode\": \"table\",\n          \"placement\": \"right\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"hideZeros\": false,\n          \"mode\": \"multi\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"12.3.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"sum(hledger_balance{account=\\\"assets\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"Total Assets\",\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"sum(hledger_balance{account=\\\"liabilities\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"Total Liabilities\",\n          \"refId\": \"B\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"sum(hledger_balance{account=\\\"assets\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\\r\\n+ on(target_currency)\\r\\nsum(hledger_balance{account=\\\"liabilities\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"Delta\",\n          \"refId\": \"C\"\n        }\n      ],\n      \"title\": \"Net Worth\",\n      \"transparent\": true,\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisBorderShow\": false,\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"barWidthFactor\": 0.6,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 15,\n            \"gradientMode\": \"opacity\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"insertNulls\": false,\n            \"lineInterpolation\": \"stepAfter\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"showValues\": false,\n            \"spanNulls\": true,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"links\": [],\n          \"mappings\": [],\n          \"min\": 0,\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": 0\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"currencyGBP\"\n        },\n        \"overrides\": [\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Expenses\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"red\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Savings Rate\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"unit\",\n                \"value\": \"percentunit\"\n              },\n              {\n                \"id\": \"custom.drawStyle\",\n                \"value\": \"line\"\n              },\n              {\n                \"id\": \"custom.fillOpacity\",\n                \"value\": 0\n              },\n              {\n                \"id\": \"custom.lineInterpolation\",\n                \"value\": \"stepAfter\"\n              },\n              {\n                \"id\": \"custom.axisSoftMin\",\n                \"value\": -1\n              },\n              {\n                \"id\": \"custom.axisSoftMax\",\n                \"value\": 1\n              },\n              {\n                \"id\": \"custom.lineWidth\",\n                \"value\": 2\n              }\n            ]\n          }\n        ]\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 12\n      },\n      \"id\": 58,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [\n            \"mean\",\n            \"lastNotNull\"\n          ],\n          \"displayMode\": \"table\",\n          \"placement\": \"right\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"hideZeros\": false,\n          \"mode\": \"multi\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"12.3.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"sum(hledger_monthly_decrease{account=\\\"income\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\\r\\n- on(target_currency)\\r\\nsum(hledger_monthly_increase{account=\\\"expenses:gross\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\\r\\n\\r\\n# ignore pension contributions (assumes pensions only go up - include 'decrease' as well to handle January roll-over)\\r\\n- on(target_currency)\\r\\n(\\r\\n    sum(hledger_monthly_increase{account=\\\"assets:pension\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency) -\\r\\n    sum(hledger_monthly_decrease{account=\\\"assets:pension\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\\r\\n)\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"Income (net)\",\n          \"range\": true,\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"sum(hledger_monthly_increase{account=\\\"expenses\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\\r\\n- on(target_currency)\\r\\nsum(hledger_monthly_increase{account=\\\"expenses:gross\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"Expenses\",\n          \"range\": true,\n          \"refId\": \"B\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"# saved income\\r\\n(\\r\\n    sum(hledger_monthly_decrease{account=\\\"income\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\\r\\n    - on(target_currency)\\r\\n    sum(hledger_monthly_increase{account=\\\"expenses\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\\r\\n    # ignore pension contributions (assumes pensions only go up - include 'decrease' as well to handle January roll-over)\\r\\n    - on(target_currency)\\r\\n    (\\r\\n        sum(hledger_monthly_increase{account=\\\"assets:pension\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency) -\\r\\n        sum(hledger_monthly_decrease{account=\\\"assets:pension\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\\r\\n    )\\r\\n)\\r\\n\\r\\n/ on(target_currency)\\r\\n\\r\\n# net income\\r\\n(\\r\\n    sum(hledger_monthly_decrease{account=\\\"income\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\\r\\n    - on(target_currency)\\r\\n    sum(hledger_monthly_increase{account=\\\"expenses:gross\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\\r\\n    # as above\\r\\n    - on(target_currency)\\r\\n    (\\r\\n        sum(hledger_monthly_increase{account=\\\"assets:pension\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency) -\\r\\n        sum(hledger_monthly_decrease{account=\\\"assets:pension\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\\r\\n    )\\r\\n)\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"Savings Rate\",\n          \"range\": true,\n          \"refId\": \"D\"\n        }\n      ],\n      \"title\": \"Cash Flow\",\n      \"transparent\": true,\n      \"type\": \"timeseries\"\n    },\n    {\n      \"collapsed\": false,\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 20\n      },\n      \"id\": 106,\n      \"panels\": [],\n      \"title\": \"Liabilities\",\n      \"type\": \"row\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisBorderShow\": false,\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"barWidthFactor\": 0.6,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 15,\n            \"gradientMode\": \"opacity\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"insertNulls\": false,\n            \"lineInterpolation\": \"stepAfter\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"showValues\": false,\n            \"spanNulls\": true,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"links\": [],\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": 0\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"currencyGBP\"\n        },\n        \"overrides\": [\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Delta\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"blue\",\n                  \"mode\": \"fixed\"\n                }\n              },\n              {\n                \"id\": \"custom.fillOpacity\",\n                \"value\": 0\n              },\n              {\n                \"id\": \"custom.gradientMode\",\n                \"value\": \"opacity\"\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Liability\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"red\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Put Aside\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"green\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          }\n        ]\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 8,\n        \"x\": 0,\n        \"y\": 21\n      },\n      \"id\": 24,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [\n            \"mean\",\n            \"lastNotNull\"\n          ],\n          \"displayMode\": \"table\",\n          \"placement\": \"right\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"hideZeros\": false,\n          \"mode\": \"multi\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"12.3.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"sum(hledger_balance{account=\\\"assets:cash:nationwide:flexdirect:pending:amex\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\",\n          \"interval\": \"\",\n          \"legendFormat\": \"Put Aside\",\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"sum(hledger_balance{account=\\\"liabilities:creditcard:amex\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"Liability\",\n          \"refId\": \"B\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"sum(hledger_balance{account=\\\"assets:cash:nationwide:flexdirect:pending:amex\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\\r\\n+ on(target_currency)\\r\\nsum(hledger_balance{account=\\\"liabilities:creditcard:amex\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"Delta\",\n          \"refId\": \"C\"\n        }\n      ],\n      \"title\": \"Credit Card\",\n      \"transparent\": true,\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisBorderShow\": false,\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"barWidthFactor\": 0.6,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 15,\n            \"gradientMode\": \"opacity\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"insertNulls\": false,\n            \"lineInterpolation\": \"stepAfter\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"showValues\": false,\n            \"spanNulls\": true,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"links\": [],\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": 0\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"currencyGBP\"\n        },\n        \"overrides\": [\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Delta\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"blue\",\n                  \"mode\": \"fixed\"\n                }\n              },\n              {\n                \"id\": \"custom.fillOpacity\",\n                \"value\": 0\n              },\n              {\n                \"id\": \"custom.gradientMode\",\n                \"value\": \"opacity\"\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Liability\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"red\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Put Aside\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"green\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          }\n        ]\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 8,\n        \"x\": 8,\n        \"y\": 21\n      },\n      \"id\": 107,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [\n            \"mean\",\n            \"lastNotNull\"\n          ],\n          \"displayMode\": \"table\",\n          \"placement\": \"right\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"hideZeros\": false,\n          \"mode\": \"multi\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"12.3.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"sum(sum(hledger_balance{account=~\\\"assets:.*:dad\\\"}) by (currency) * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\",\n          \"interval\": \"\",\n          \"legendFormat\": \"Put Aside\",\n          \"range\": true,\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"sum(hledger_balance{account=\\\"liabilities:owed:dad\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"Liability\",\n          \"range\": true,\n          \"refId\": \"B\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"sum(sum(hledger_balance{account=~\\\"assets:.*:dad\\\"}) by (currency) * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\\r\\n+ on(target_currency)\\r\\nsum(hledger_balance{account=\\\"liabilities:owed:dad\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"Delta\",\n          \"range\": true,\n          \"refId\": \"C\"\n        }\n      ],\n      \"title\": \"Dad\",\n      \"transparent\": true,\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisBorderShow\": false,\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"barWidthFactor\": 0.6,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 15,\n            \"gradientMode\": \"opacity\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"insertNulls\": false,\n            \"lineInterpolation\": \"stepAfter\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"showValues\": false,\n            \"spanNulls\": true,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"links\": [],\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": 0\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"currencyGBP\"\n        },\n        \"overrides\": [\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Delta\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"blue\",\n                  \"mode\": \"fixed\"\n                }\n              },\n              {\n                \"id\": \"custom.fillOpacity\",\n                \"value\": 0\n              },\n              {\n                \"id\": \"custom.gradientMode\",\n                \"value\": \"opacity\"\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Liability\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"red\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Put Aside\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"green\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          }\n        ]\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 8,\n        \"x\": 16,\n        \"y\": 21\n      },\n      \"id\": 108,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [\n            \"mean\",\n            \"lastNotNull\"\n          ],\n          \"displayMode\": \"table\",\n          \"placement\": \"right\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"hideZeros\": false,\n          \"mode\": \"multi\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"12.3.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"sum(sum(hledger_balance{account=~\\\"liabilities:mortgage:.*\\\"}) by (currency) * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"Liability\",\n          \"range\": true,\n          \"refId\": \"B\"\n        }\n      ],\n      \"title\": \"Mortgage\",\n      \"transparent\": true,\n      \"type\": \"timeseries\"\n    },\n    {\n      \"collapsed\": false,\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 29\n      },\n      \"id\": 89,\n      \"panels\": [],\n      \"title\": \"Budget\",\n      \"type\": \"row\"\n    },\n    {\n      \"fieldConfig\": {\n        \"defaults\": {},\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 30\n      },\n      \"id\": 90,\n      \"options\": {\n        \"code\": {\n          \"language\": \"plaintext\",\n          \"showLineNumbers\": false,\n          \"showMiniMap\": false\n        },\n        \"content\": \"\",\n        \"mode\": \"markdown\"\n      },\n      \"pluginVersion\": \"12.3.1\",\n      \"title\": \"MONTHLY - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\",\n      \"transparent\": true,\n      \"type\": \"text\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"description\": \"~£170\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [],\n          \"max\": 750,\n          \"min\": 0,\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"red\",\n                \"value\": 0\n              },\n              {\n                \"color\": \"yellow\",\n                \"value\": 375\n              },\n              {\n                \"color\": \"green\",\n                \"value\": 563\n              }\n            ]\n          },\n          \"unit\": \"currencyGBP\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 2,\n        \"w\": 4,\n        \"x\": 0,\n        \"y\": 31\n      },\n      \"id\": 34,\n      \"options\": {\n        \"displayMode\": \"lcd\",\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": false\n        },\n        \"maxVizHeight\": 300,\n        \"minVizHeight\": 16,\n        \"minVizWidth\": 8,\n        \"namePlacement\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showUnfilled\": true,\n        \"sizing\": \"auto\",\n        \"valueMode\": \"color\"\n      },\n      \"pluginVersion\": \"12.3.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"sum(sum(hledger_balance{account=~\\\"assets:.*:saved:house:counciltax\\\"}) by (currency) * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\",\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Council Tax\",\n      \"transparent\": true,\n      \"type\": \"bargauge\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"description\": \"~£25\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [],\n          \"max\": 100,\n          \"min\": 0,\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"red\",\n                \"value\": 0\n              },\n              {\n                \"color\": \"yellow\",\n                \"value\": 50\n              },\n              {\n                \"color\": \"green\",\n                \"value\": 75\n              }\n            ]\n          },\n          \"unit\": \"currencyGBP\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 2,\n        \"w\": 4,\n        \"x\": 4,\n        \"y\": 31\n      },\n      \"id\": 76,\n      \"options\": {\n        \"displayMode\": \"lcd\",\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": false\n        },\n        \"maxVizHeight\": 300,\n        \"minVizHeight\": 16,\n        \"minVizWidth\": 8,\n        \"namePlacement\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showUnfilled\": true,\n        \"sizing\": \"auto\",\n        \"valueMode\": \"color\"\n      },\n      \"pluginVersion\": \"12.3.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"sum(hledger_balance{account=\\\"assets:investments:fidelity:management\\\"} * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\",\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Fidelity Fees\",\n      \"transparent\": true,\n      \"type\": \"bargauge\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"description\": \"~£100\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [],\n          \"max\": 500,\n          \"min\": 0,\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"red\",\n                \"value\": 0\n              },\n              {\n                \"color\": \"yellow\",\n                \"value\": 250\n              },\n              {\n                \"color\": \"green\",\n                \"value\": 375\n              }\n            ]\n          },\n          \"unit\": \"currencyGBP\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 2,\n        \"w\": 4,\n        \"x\": 8,\n        \"y\": 31\n      },\n      \"id\": 32,\n      \"options\": {\n        \"displayMode\": \"lcd\",\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": false\n        },\n        \"maxVizHeight\": 300,\n        \"minVizHeight\": 16,\n        \"minVizWidth\": 8,\n        \"namePlacement\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showUnfilled\": true,\n        \"sizing\": \"auto\",\n        \"valueMode\": \"color\"\n      },\n      \"pluginVersion\": \"12.3.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"sum(sum(hledger_balance{account=~\\\"assets:.*:saved:household\\\"}) by (currency) * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\",\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Household\",\n      \"transparent\": true,\n      \"type\": \"bargauge\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"description\": \"~£75\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [],\n          \"max\": 500,\n          \"min\": 0,\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"red\",\n                \"value\": 0\n              },\n              {\n                \"color\": \"yellow\",\n                \"value\": 250\n              },\n              {\n                \"color\": \"green\",\n                \"value\": 375\n              }\n            ]\n          },\n          \"unit\": \"currencyGBP\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 2,\n        \"w\": 4,\n        \"x\": 12,\n        \"y\": 31\n      },\n      \"id\": 100,\n      \"options\": {\n        \"displayMode\": \"lcd\",\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": false\n        },\n        \"maxVizHeight\": 300,\n        \"minVizHeight\": 16,\n        \"minVizWidth\": 8,\n        \"namePlacement\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showUnfilled\": true,\n        \"sizing\": \"auto\",\n        \"valueMode\": \"color\"\n      },\n      \"pluginVersion\": \"12.3.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"sum(sum(hledger_balance{account=~\\\"assets:.*:saved:huel\\\"}) by (currency) * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\",\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Huel\",\n      \"transparent\": true,\n      \"type\": \"bargauge\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"description\": \"~£20\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [],\n          \"max\": 100,\n          \"min\": 0,\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"red\",\n                \"value\": 0\n              },\n              {\n                \"color\": \"yellow\",\n                \"value\": 50\n              },\n              {\n                \"color\": \"green\",\n                \"value\": 75\n              }\n            ]\n          },\n          \"unit\": \"currencyGBP\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 2,\n        \"w\": 4,\n        \"x\": 16,\n        \"y\": 31\n      },\n      \"id\": 37,\n      \"options\": {\n        \"displayMode\": \"lcd\",\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": false\n        },\n        \"maxVizHeight\": 300,\n        \"minVizHeight\": 16,\n        \"minVizWidth\": 8,\n        \"namePlacement\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showUnfilled\": true,\n        \"sizing\": \"auto\",\n        \"valueMode\": \"color\"\n      },\n      \"pluginVersion\": \"12.3.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"sum(sum(hledger_balance{account=~\\\"assets:.*:saved:patreon\\\"}) by (currency) * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\",\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Patreon\",\n      \"transparent\": true,\n      \"type\": \"bargauge\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"description\": \"~£20\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [],\n          \"max\": 100,\n          \"min\": 0,\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"red\",\n                \"value\": 0\n              },\n              {\n                \"color\": \"yellow\",\n                \"value\": 50\n              },\n              {\n                \"color\": \"green\",\n                \"value\": 75\n              }\n            ]\n          },\n          \"unit\": \"currencyGBP\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 2,\n        \"w\": 4,\n        \"x\": 20,\n        \"y\": 31\n      },\n      \"id\": 33,\n      \"options\": {\n        \"displayMode\": \"lcd\",\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": false\n        },\n        \"maxVizHeight\": 300,\n        \"minVizHeight\": 16,\n        \"minVizWidth\": 8,\n        \"namePlacement\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showUnfilled\": true,\n        \"sizing\": \"auto\",\n        \"valueMode\": \"color\"\n      },\n      \"pluginVersion\": \"12.3.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"sum(sum(hledger_balance{account=~\\\"assets:.*:saved:phone\\\"}) by (currency) * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\",\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Phone\",\n      \"transparent\": true,\n      \"type\": \"bargauge\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"description\": \"~£500\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [],\n          \"max\": 2500,\n          \"min\": 0,\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"red\",\n                \"value\": 0\n              },\n              {\n                \"color\": \"yellow\",\n                \"value\": 1250\n              },\n              {\n                \"color\": \"green\",\n                \"value\": 1875\n              }\n            ]\n          },\n          \"unit\": \"currencyGBP\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 2,\n        \"w\": 4,\n        \"x\": 0,\n        \"y\": 33\n      },\n      \"id\": 35,\n      \"options\": {\n        \"displayMode\": \"lcd\",\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": false\n        },\n        \"maxVizHeight\": 300,\n        \"minVizHeight\": 16,\n        \"minVizWidth\": 8,\n        \"namePlacement\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showUnfilled\": true,\n        \"sizing\": \"auto\",\n        \"valueMode\": \"color\"\n      },\n      \"pluginVersion\": \"12.3.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"sum(sum(hledger_balance{account=~\\\"assets:.*:saved:travel\\\"}) by (currency) * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\",\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Travel\",\n      \"transparent\": true,\n      \"type\": \"bargauge\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"description\": \"~£20\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [],\n          \"max\": 100,\n          \"min\": 0,\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"red\",\n                \"value\": 0\n              },\n              {\n                \"color\": \"yellow\",\n                \"value\": 50\n              },\n              {\n                \"color\": \"green\",\n                \"value\": 75\n              }\n            ]\n          },\n          \"unit\": \"currencyGBP\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 2,\n        \"w\": 4,\n        \"x\": 4,\n        \"y\": 33\n      },\n      \"id\": 110,\n      \"options\": {\n        \"displayMode\": \"lcd\",\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": false\n        },\n        \"maxVizHeight\": 300,\n        \"minVizHeight\": 16,\n        \"minVizWidth\": 8,\n        \"namePlacement\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showUnfilled\": true,\n        \"sizing\": \"auto\",\n        \"valueMode\": \"color\"\n      },\n      \"pluginVersion\": \"12.3.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"sum(sum(hledger_balance{account=~\\\"assets:.*:saved:twitch\\\"}) by (currency) * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\",\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Twitch\",\n      \"transparent\": true,\n      \"type\": \"bargauge\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"description\": \"~£200\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [],\n          \"max\": 1000,\n          \"min\": 0,\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"red\",\n                \"value\": 0\n              },\n              {\n                \"color\": \"yellow\",\n                \"value\": 500\n              },\n              {\n                \"color\": \"green\",\n                \"value\": 750\n              }\n            ]\n          },\n          \"unit\": \"currencyGBP\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 2,\n        \"w\": 4,\n        \"x\": 8,\n        \"y\": 33\n      },\n      \"id\": 36,\n      \"options\": {\n        \"displayMode\": \"lcd\",\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": false\n        },\n        \"maxVizHeight\": 300,\n        \"minVizHeight\": 16,\n        \"minVizWidth\": 8,\n        \"namePlacement\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showUnfilled\": true,\n        \"sizing\": \"auto\",\n        \"valueMode\": \"color\"\n      },\n      \"pluginVersion\": \"12.3.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"sum(sum(hledger_balance{account=~\\\"assets:.*:saved:house:utilities\\\"}) by (currency) * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\",\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Utilities\",\n      \"transparent\": true,\n      \"type\": \"bargauge\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"description\": \"~£75\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [],\n          \"max\": 500,\n          \"min\": 0,\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"red\",\n                \"value\": 0\n              },\n              {\n                \"color\": \"yellow\",\n                \"value\": 250\n              },\n              {\n                \"color\": \"green\",\n                \"value\": 375\n              }\n            ]\n          },\n          \"unit\": \"currencyGBP\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 2,\n        \"w\": 4,\n        \"x\": 12,\n        \"y\": 33\n      },\n      \"id\": 40,\n      \"options\": {\n        \"displayMode\": \"lcd\",\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": false\n        },\n        \"maxVizHeight\": 300,\n        \"minVizHeight\": 16,\n        \"minVizWidth\": 8,\n        \"namePlacement\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showUnfilled\": true,\n        \"sizing\": \"auto\",\n        \"valueMode\": \"color\"\n      },\n      \"pluginVersion\": \"12.3.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"sum(sum(hledger_balance{account=~\\\"assets:.*:saved:web\\\"}) by (currency) * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\",\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Web\",\n      \"transparent\": true,\n      \"type\": \"bargauge\"\n    },\n    {\n      \"fieldConfig\": {\n        \"defaults\": {},\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 35\n      },\n      \"id\": 88,\n      \"options\": {\n        \"code\": {\n          \"language\": \"plaintext\",\n          \"showLineNumbers\": false,\n          \"showMiniMap\": false\n        },\n        \"content\": \"\",\n        \"mode\": \"markdown\"\n      },\n      \"pluginVersion\": \"12.3.1\",\n      \"title\": \"ANNUALLY - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\",\n      \"transparent\": true,\n      \"type\": \"text\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"description\": \"~£100 (due November)\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [],\n          \"max\": 100,\n          \"min\": 0,\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"red\",\n                \"value\": 0\n              },\n              {\n                \"color\": \"yellow\",\n                \"value\": 50\n              },\n              {\n                \"color\": \"green\",\n                \"value\": 75\n              }\n            ]\n          },\n          \"unit\": \"currencyGBP\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 2,\n        \"w\": 4,\n        \"x\": 0,\n        \"y\": 36\n      },\n      \"id\": 92,\n      \"options\": {\n        \"displayMode\": \"lcd\",\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": false\n        },\n        \"maxVizHeight\": 300,\n        \"minVizHeight\": 16,\n        \"minVizWidth\": 8,\n        \"namePlacement\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showUnfilled\": true,\n        \"sizing\": \"auto\",\n        \"valueMode\": \"color\"\n      },\n      \"pluginVersion\": \"12.3.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"sum(sum(hledger_balance{account=~\\\"assets:.*:saved:british_museum\\\"}) by (currency) * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\",\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"British Museum\",\n      \"transparent\": true,\n      \"type\": \"bargauge\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"description\": \"~£500 (due April)\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [],\n          \"max\": 500,\n          \"min\": 0,\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"red\",\n                \"value\": 0\n              },\n              {\n                \"color\": \"yellow\",\n                \"value\": 250\n              },\n              {\n                \"color\": \"green\",\n                \"value\": 375\n              }\n            ]\n          },\n          \"unit\": \"currencyGBP\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 2,\n        \"w\": 4,\n        \"x\": 4,\n        \"y\": 36\n      },\n      \"id\": 102,\n      \"options\": {\n        \"displayMode\": \"lcd\",\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": false\n        },\n        \"maxVizHeight\": 300,\n        \"minVizHeight\": 16,\n        \"minVizWidth\": 8,\n        \"namePlacement\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showUnfilled\": true,\n        \"sizing\": \"auto\",\n        \"valueMode\": \"color\"\n      },\n      \"pluginVersion\": \"12.3.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"sum(sum(hledger_balance{account=~\\\"assets:.*:saved:house:insurance\\\"}) by (currency) * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\",\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Home Insurance\",\n      \"transparent\": true,\n      \"type\": \"bargauge\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"description\": \"~50 USD (due April)\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [],\n          \"max\": 50,\n          \"min\": 0,\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"red\",\n                \"value\": 0\n              },\n              {\n                \"color\": \"yellow\",\n                \"value\": 25\n              },\n              {\n                \"color\": \"green\",\n                \"value\": 37.5\n              }\n            ]\n          },\n          \"unit\": \"currencyGBP\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 2,\n        \"w\": 4,\n        \"x\": 8,\n        \"y\": 36\n      },\n      \"id\": 93,\n      \"options\": {\n        \"displayMode\": \"lcd\",\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": false\n        },\n        \"maxVizHeight\": 300,\n        \"minVizHeight\": 16,\n        \"minVizWidth\": 8,\n        \"namePlacement\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showUnfilled\": true,\n        \"sizing\": \"auto\",\n        \"valueMode\": \"color\"\n      },\n      \"pluginVersion\": \"12.3.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"sum(sum(hledger_balance{account=~\\\"assets:.*:saved:obsidian\\\"}) by (currency) * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\",\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Obsidian\",\n      \"transparent\": true,\n      \"type\": \"bargauge\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"description\": \"~50 EUR (due July)\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [],\n          \"max\": 50,\n          \"min\": 0,\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"red\",\n                \"value\": 0\n              },\n              {\n                \"color\": \"yellow\",\n                \"value\": 25\n              },\n              {\n                \"color\": \"green\",\n                \"value\": 37.5\n              }\n            ]\n          },\n          \"unit\": \"currencyGBP\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 2,\n        \"w\": 4,\n        \"x\": 12,\n        \"y\": 36\n      },\n      \"id\": 38,\n      \"options\": {\n        \"displayMode\": \"lcd\",\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": false\n        },\n        \"maxVizHeight\": 300,\n        \"minVizHeight\": 16,\n        \"minVizWidth\": 8,\n        \"namePlacement\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showUnfilled\": true,\n        \"sizing\": \"auto\",\n        \"valueMode\": \"color\"\n      },\n      \"pluginVersion\": \"12.3.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"sum(sum(hledger_balance{account=~\\\"assets:.*:saved:protonmail\\\"}) by (currency) * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\",\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Protonmail\",\n      \"transparent\": true,\n      \"type\": \"bargauge\"\n    },\n    {\n      \"fieldConfig\": {\n        \"defaults\": {},\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 38\n      },\n      \"id\": 91,\n      \"options\": {\n        \"code\": {\n          \"language\": \"plaintext\",\n          \"showLineNumbers\": false,\n          \"showMiniMap\": false\n        },\n        \"content\": \"\",\n        \"mode\": \"markdown\"\n      },\n      \"pluginVersion\": \"12.3.1\",\n      \"title\": \"SINKING - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\",\n      \"transparent\": true,\n      \"type\": \"text\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [],\n          \"max\": 300,\n          \"min\": 0,\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"red\",\n                \"value\": 0\n              },\n              {\n                \"color\": \"yellow\",\n                \"value\": 150\n              },\n              {\n                \"color\": \"green\",\n                \"value\": 225\n              }\n            ]\n          },\n          \"unit\": \"currencyGBP\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 2,\n        \"w\": 4,\n        \"x\": 0,\n        \"y\": 39\n      },\n      \"id\": 98,\n      \"options\": {\n        \"displayMode\": \"lcd\",\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": false\n        },\n        \"maxVizHeight\": 300,\n        \"minVizHeight\": 16,\n        \"minVizWidth\": 8,\n        \"namePlacement\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showUnfilled\": true,\n        \"sizing\": \"auto\",\n        \"valueMode\": \"color\"\n      },\n      \"pluginVersion\": \"12.3.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"sum(sum(hledger_balance{account=~\\\"assets:.*:saved:clothes\\\"}) by (currency) * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\",\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Clothes\",\n      \"transparent\": true,\n      \"type\": \"bargauge\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [],\n          \"max\": 5000,\n          \"min\": 0,\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"red\",\n                \"value\": 0\n              },\n              {\n                \"color\": \"yellow\",\n                \"value\": 2500\n              },\n              {\n                \"color\": \"green\",\n                \"value\": 3750\n              }\n            ]\n          },\n          \"unit\": \"currencyGBP\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 2,\n        \"w\": 4,\n        \"x\": 4,\n        \"y\": 39\n      },\n      \"id\": 97,\n      \"options\": {\n        \"displayMode\": \"lcd\",\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": false\n        },\n        \"maxVizHeight\": 300,\n        \"minVizHeight\": 16,\n        \"minVizWidth\": 8,\n        \"namePlacement\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showUnfilled\": true,\n        \"sizing\": \"auto\",\n        \"valueMode\": \"color\"\n      },\n      \"pluginVersion\": \"12.3.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"sum(sum(hledger_balance{account=~\\\"assets:investments:nsi:premium_bonds:emergency\\\"}) by (currency) * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\",\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Emergency\",\n      \"transparent\": true,\n      \"type\": \"bargauge\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [],\n          \"max\": 250,\n          \"min\": 0,\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"red\",\n                \"value\": 0\n              },\n              {\n                \"color\": \"yellow\",\n                \"value\": 125\n              },\n              {\n                \"color\": \"green\",\n                \"value\": 187.5\n              }\n            ]\n          },\n          \"unit\": \"currencyGBP\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 2,\n        \"w\": 4,\n        \"x\": 8,\n        \"y\": 39\n      },\n      \"id\": 78,\n      \"options\": {\n        \"displayMode\": \"lcd\",\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": false\n        },\n        \"maxVizHeight\": 300,\n        \"minVizHeight\": 16,\n        \"minVizWidth\": 8,\n        \"namePlacement\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showUnfilled\": true,\n        \"sizing\": \"auto\",\n        \"valueMode\": \"color\"\n      },\n      \"pluginVersion\": \"12.3.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"sum(sum(hledger_balance{account=~\\\"assets:.*:saved:gift\\\"}) by (currency) * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\",\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Gift\",\n      \"transparent\": true,\n      \"type\": \"bargauge\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"description\": \"Excluding money allocated towards specific goals.\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [],\n          \"max\": 250,\n          \"min\": 0,\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"red\",\n                \"value\": 0\n              },\n              {\n                \"color\": \"yellow\",\n                \"value\": 125\n              },\n              {\n                \"color\": \"green\",\n                \"value\": 187.5\n              }\n            ]\n          },\n          \"unit\": \"currencyGBP\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 2,\n        \"w\": 4,\n        \"x\": 12,\n        \"y\": 39\n      },\n      \"id\": 105,\n      \"options\": {\n        \"displayMode\": \"lcd\",\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": false\n        },\n        \"maxVizHeight\": 300,\n        \"minVizHeight\": 16,\n        \"minVizWidth\": 8,\n        \"namePlacement\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showUnfilled\": true,\n        \"sizing\": \"auto\",\n        \"valueMode\": \"color\"\n      },\n      \"pluginVersion\": \"12.3.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"sum(sum(hledger_balance{account=~\\\"assets:.*:saved:goals\\\"}) by (currency) * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\",\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Goals\",\n      \"transparent\": true,\n      \"type\": \"bargauge\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [],\n          \"max\": 2000,\n          \"min\": 0,\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"red\",\n                \"value\": 0\n              },\n              {\n                \"color\": \"yellow\",\n                \"value\": 1000\n              },\n              {\n                \"color\": \"green\",\n                \"value\": 1500\n              }\n            ]\n          },\n          \"unit\": \"currencyGBP\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 2,\n        \"w\": 4,\n        \"x\": 16,\n        \"y\": 39\n      },\n      \"id\": 31,\n      \"options\": {\n        \"displayMode\": \"lcd\",\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": false\n        },\n        \"maxVizHeight\": 300,\n        \"minVizHeight\": 16,\n        \"minVizWidth\": 8,\n        \"namePlacement\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showUnfilled\": true,\n        \"sizing\": \"auto\",\n        \"valueMode\": \"color\"\n      },\n      \"pluginVersion\": \"12.3.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"sum(sum(hledger_balance{account=~\\\"assets:.*:saved:health\\\"}) by (currency) * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\",\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Health\",\n      \"transparent\": true,\n      \"type\": \"bargauge\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [],\n          \"max\": 5000,\n          \"min\": 0,\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"red\",\n                \"value\": 0\n              },\n              {\n                \"color\": \"yellow\",\n                \"value\": 2500\n              },\n              {\n                \"color\": \"green\",\n                \"value\": 3750\n              }\n            ]\n          },\n          \"unit\": \"currencyGBP\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 2,\n        \"w\": 4,\n        \"x\": 20,\n        \"y\": 39\n      },\n      \"id\": 95,\n      \"options\": {\n        \"displayMode\": \"lcd\",\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": false\n        },\n        \"maxVizHeight\": 300,\n        \"minVizHeight\": 16,\n        \"minVizWidth\": 8,\n        \"namePlacement\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showUnfilled\": true,\n        \"sizing\": \"auto\",\n        \"valueMode\": \"color\"\n      },\n      \"pluginVersion\": \"12.3.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"sum(sum(hledger_balance{account=~\\\"assets:.*:saved:holiday\\\"}) by (currency) * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\",\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Holiday\",\n      \"transparent\": true,\n      \"type\": \"bargauge\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [],\n          \"max\": 5000,\n          \"min\": 0,\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"red\",\n                \"value\": 0\n              },\n              {\n                \"color\": \"yellow\",\n                \"value\": 2500\n              },\n              {\n                \"color\": \"green\",\n                \"value\": 3750\n              }\n            ]\n          },\n          \"unit\": \"currencyGBP\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 2,\n        \"w\": 4,\n        \"x\": 0,\n        \"y\": 41\n      },\n      \"id\": 103,\n      \"options\": {\n        \"displayMode\": \"lcd\",\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": false\n        },\n        \"maxVizHeight\": 300,\n        \"minVizHeight\": 16,\n        \"minVizWidth\": 8,\n        \"namePlacement\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showUnfilled\": true,\n        \"sizing\": \"auto\",\n        \"valueMode\": \"color\"\n      },\n      \"pluginVersion\": \"12.3.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"sum(sum(hledger_balance{account=~\\\"assets:.*:saved:house:maintenance\\\"}) by (currency) * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\",\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Home Maintenance\",\n      \"transparent\": true,\n      \"type\": \"bargauge\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [],\n          \"max\": 8000,\n          \"min\": 0,\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"red\",\n                \"value\": 0\n              },\n              {\n                \"color\": \"yellow\",\n                \"value\": 4000\n              },\n              {\n                \"color\": \"green\",\n                \"value\": 6000\n              }\n            ]\n          },\n          \"unit\": \"currencyGBP\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 2,\n        \"w\": 4,\n        \"x\": 4,\n        \"y\": 41\n      },\n      \"id\": 96,\n      \"options\": {\n        \"displayMode\": \"lcd\",\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": false\n        },\n        \"maxVizHeight\": 300,\n        \"minVizHeight\": 16,\n        \"minVizWidth\": 8,\n        \"namePlacement\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showUnfilled\": true,\n        \"sizing\": \"auto\",\n        \"valueMode\": \"color\"\n      },\n      \"pluginVersion\": \"12.3.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"sum(sum(hledger_balance{account=~\\\"assets:.*:saved:invest\\\"}) by (currency) * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\",\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Invest\",\n      \"transparent\": true,\n      \"type\": \"bargauge\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [],\n          \"max\": 500,\n          \"min\": 0,\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"red\",\n                \"value\": 0\n              },\n              {\n                \"color\": \"yellow\",\n                \"value\": 250\n              },\n              {\n                \"color\": \"green\",\n                \"value\": 375\n              }\n            ]\n          },\n          \"unit\": \"currencyGBP\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 2,\n        \"w\": 4,\n        \"x\": 8,\n        \"y\": 41\n      },\n      \"id\": 99,\n      \"options\": {\n        \"displayMode\": \"lcd\",\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": false\n        },\n        \"maxVizHeight\": 300,\n        \"minVizHeight\": 16,\n        \"minVizWidth\": 8,\n        \"namePlacement\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showUnfilled\": true,\n        \"sizing\": \"auto\",\n        \"valueMode\": \"color\"\n      },\n      \"pluginVersion\": \"12.3.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"sum(sum(hledger_balance{account=~\\\"assets:.*:saved:repairs\\\"}) by (currency) * on(currency) hledger_fx_rate{target_currency=\\\"$currency\\\"}) by(target_currency)\",\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Repairs\",\n      \"transparent\": true,\n      \"type\": \"bargauge\"\n    },\n    {\n      \"collapsed\": true,\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 43\n      },\n      \"id\": 49,\n      \"panels\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisBorderShow\": false,\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"barWidthFactor\": 0.6,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 15,\n                \"gradientMode\": \"opacity\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"insertNulls\": false,\n                \"lineInterpolation\": \"stepAfter\",\n                \"lineStyle\": {\n                  \"fill\": \"solid\"\n                },\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"showValues\": false,\n                \"spanNulls\": true,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\",\n                    \"value\": 0\n                  }\n                ]\n              },\n              \"unit\": \"currencyGBP\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Value\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"blue\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 8,\n            \"x\": 0,\n            \"y\": 44\n          },\n          \"id\": 81,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"hideZeros\": false,\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"12.3.1\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": true,\n              \"expr\": \"hledger_fx_rate{currency=\\\"EUR\\\",target_currency=\\\"$currency\\\"}\",\n              \"interval\": \"\",\n              \"legendFormat\": \"Value of 1 {{currency}} in {{target_currency}}\",\n              \"refId\": \"A\"\n            }\n          ],\n          \"title\": \"EUR\",\n          \"transparent\": true,\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisBorderShow\": false,\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"barWidthFactor\": 0.6,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 15,\n                \"gradientMode\": \"opacity\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"insertNulls\": false,\n                \"lineInterpolation\": \"stepAfter\",\n                \"lineStyle\": {\n                  \"fill\": \"solid\"\n                },\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"showValues\": false,\n                \"spanNulls\": true,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\",\n                    \"value\": 0\n                  }\n                ]\n              },\n              \"unit\": \"currencyGBP\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Value\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"blue\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 8,\n            \"x\": 8,\n            \"y\": 44\n          },\n          \"id\": 111,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"hideZeros\": false,\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"12.3.1\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"editorMode\": \"code\",\n              \"exemplar\": true,\n              \"expr\": \"hledger_fx_rate{currency=\\\"GBP\\\",target_currency=\\\"$currency\\\"}\",\n              \"interval\": \"\",\n              \"legendFormat\": \"Value of 1 {{currency}} in {{target_currency}}\",\n              \"range\": true,\n              \"refId\": \"A\"\n            }\n          ],\n          \"title\": \"GBP\",\n          \"transparent\": true,\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisBorderShow\": false,\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"barWidthFactor\": 0.6,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 15,\n                \"gradientMode\": \"opacity\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"insertNulls\": false,\n                \"lineInterpolation\": \"stepAfter\",\n                \"lineStyle\": {\n                  \"fill\": \"solid\"\n                },\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"showValues\": false,\n                \"spanNulls\": true,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\",\n                    \"value\": 0\n                  }\n                ]\n              },\n              \"unit\": \"currencyGBP\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Value\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"blue\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 8,\n            \"x\": 16,\n            \"y\": 44\n          },\n          \"id\": 83,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"hideZeros\": false,\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"12.3.1\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": true,\n              \"expr\": \"hledger_fx_rate{currency=\\\"JPY\\\",target_currency=\\\"$currency\\\"}\",\n              \"interval\": \"\",\n              \"legendFormat\": \"Value of 1 {{currency}} in {{target_currency}}\",\n              \"refId\": \"A\"\n            }\n          ],\n          \"title\": \"JPY\",\n          \"transparent\": true,\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisBorderShow\": false,\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"barWidthFactor\": 0.6,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 15,\n                \"gradientMode\": \"opacity\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"insertNulls\": false,\n                \"lineInterpolation\": \"stepAfter\",\n                \"lineStyle\": {\n                  \"fill\": \"solid\"\n                },\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"showValues\": false,\n                \"spanNulls\": true,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\",\n                    \"value\": 0\n                  }\n                ]\n              },\n              \"unit\": \"currencyGBP\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Value\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"blue\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 8,\n            \"x\": 0,\n            \"y\": 52\n          },\n          \"id\": 112,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"hideZeros\": false,\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"12.3.1\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"editorMode\": \"code\",\n              \"exemplar\": true,\n              \"expr\": \"hledger_fx_rate{currency=\\\"SEK\\\",target_currency=\\\"$currency\\\"}\",\n              \"interval\": \"\",\n              \"legendFormat\": \"Value of 1 {{currency}} in {{target_currency}}\",\n              \"range\": true,\n              \"refId\": \"A\"\n            }\n          ],\n          \"title\": \"SEK\",\n          \"transparent\": true,\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisBorderShow\": false,\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"barWidthFactor\": 0.6,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 15,\n                \"gradientMode\": \"opacity\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"insertNulls\": false,\n                \"lineInterpolation\": \"stepAfter\",\n                \"lineStyle\": {\n                  \"fill\": \"solid\"\n                },\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"showValues\": false,\n                \"spanNulls\": true,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\",\n                    \"value\": 0\n                  }\n                ]\n              },\n              \"unit\": \"currencyGBP\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Value\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"blue\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 8,\n            \"x\": 8,\n            \"y\": 52\n          },\n          \"id\": 82,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"hideZeros\": false,\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"12.3.1\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": true,\n              \"expr\": \"hledger_fx_rate{currency=\\\"USD\\\",target_currency=\\\"$currency\\\"}\",\n              \"interval\": \"\",\n              \"legendFormat\": \"Value of 1 {{currency}} in {{target_currency}}\",\n              \"refId\": \"A\"\n            }\n          ],\n          \"title\": \"USD\",\n          \"transparent\": true,\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"Vanguard LifeStrategy 100% (Acc)\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisBorderShow\": false,\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"barWidthFactor\": 0.6,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 15,\n                \"gradientMode\": \"opacity\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"insertNulls\": false,\n                \"lineInterpolation\": \"stepAfter\",\n                \"lineStyle\": {\n                  \"fill\": \"solid\"\n                },\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"showValues\": false,\n                \"spanNulls\": true,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\",\n                    \"value\": 0\n                  }\n                ]\n              },\n              \"unit\": \"currencyGBP\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Value\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"purple\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 8,\n            \"w\": 8,\n            \"x\": 16,\n            \"y\": 52\n          },\n          \"id\": 86,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"hideZeros\": false,\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"12.3.1\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"exemplar\": true,\n              \"expr\": \"hledger_fx_rate{currency=\\\"VANEA\\\",target_currency=\\\"$currency\\\"}\",\n              \"interval\": \"\",\n              \"legendFormat\": \"Value of 1 {{currency}} in {{target_currency}}\",\n              \"refId\": \"A\"\n            }\n          ],\n          \"title\": \"VANEA\",\n          \"transparent\": true,\n          \"type\": \"timeseries\"\n        }\n      ],\n      \"title\": \"Market Prices\",\n      \"type\": \"row\"\n    }\n  ],\n  \"preload\": false,\n  \"refresh\": \"\",\n  \"schemaVersion\": 42,\n  \"tags\": [],\n  \"templating\": {\n    \"list\": [\n      {\n        \"hide\": 2,\n        \"name\": \"fire_annual_factor\",\n        \"query\": \"25\",\n        \"skipUrlSync\": true,\n        \"type\": \"constant\"\n      },\n      {\n        \"current\": {\n          \"text\": \"victoriametrics\",\n          \"value\": \"PABDA7AB1AD2A1489\"\n        },\n        \"includeAll\": false,\n        \"name\": \"datasource\",\n        \"options\": [],\n        \"query\": \"prometheus\",\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"type\": \"datasource\"\n      },\n      {\n        \"current\": {\n          \"text\": \"GBP\",\n          \"value\": \"GBP\"\n        },\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"${datasource}\"\n        },\n        \"definition\": \"label_values(hledger_fx_rate,currency)\",\n        \"includeAll\": false,\n        \"name\": \"currency\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"label_values(hledger_fx_rate,currency)\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"sort\": 1,\n        \"type\": \"query\"\n      },\n      {\n        \"current\": {\n          \"text\": \"365\",\n          \"value\": \"365\"\n        },\n        \"label\": \"aggregation window (days)\",\n        \"name\": \"agg_window\",\n        \"options\": [\n          {\n            \"selected\": true,\n            \"text\": \"365\",\n            \"value\": \"365\"\n          }\n        ],\n        \"query\": \"365\",\n        \"type\": \"textbox\"\n      }\n    ]\n  },\n  \"time\": {\n    \"from\": \"now-1y\",\n    \"to\": \"now\"\n  },\n  \"timepicker\": {},\n  \"timezone\": \"\",\n  \"title\": \"Personal Finances\",\n  \"uid\": \"H-xV7PFMz\",\n  \"version\": 1\n}"
  },
  {
    "path": "hosts/nyarlathotep/dashboards/smart-home.json",
    "content": "{\n  \"annotations\": {\n    \"list\": [\n      {\n        \"builtIn\": 1,\n        \"datasource\": {\n          \"type\": \"datasource\",\n          \"uid\": \"grafana\"\n        },\n        \"enable\": true,\n        \"hide\": true,\n        \"iconColor\": \"rgba(0, 211, 255, 1)\",\n        \"name\": \"Annotations & Alerts\",\n        \"target\": {\n          \"limit\": 100,\n          \"matchAny\": false,\n          \"tags\": [],\n          \"type\": \"dashboard\"\n        },\n        \"type\": \"dashboard\"\n      }\n    ]\n  },\n  \"editable\": true,\n  \"fiscalYearStartMonth\": 0,\n  \"graphTooltip\": 0,\n  \"id\": 5,\n  \"links\": [],\n  \"panels\": [\n    {\n      \"collapsed\": false,\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 0\n      },\n      \"id\": 42,\n      \"panels\": [],\n      \"title\": \"Air Quality\",\n      \"type\": \"row\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"P1809F7CD0C75ACF3\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"mappings\": [],\n          \"max\": 100,\n          \"min\": 0,\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"red\",\n                \"value\": 0\n              },\n              {\n                \"color\": \"yellow\",\n                \"value\": 60\n              },\n              {\n                \"color\": \"green\",\n                \"value\": 90\n              }\n            ]\n          },\n          \"unit\": \"percent\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 5,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 1\n      },\n      \"id\": 49,\n      \"options\": {\n        \"colorMode\": \"background\",\n        \"graphMode\": \"area\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"auto\",\n        \"percentChangeColorMode\": \"standard\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showPercentChange\": false,\n        \"textMode\": \"value_and_name\",\n        \"wideLayout\": true\n      },\n      \"pluginVersion\": \"12.3.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"P1809F7CD0C75ACF3\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"awair_score\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{sensor}}\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Overall Quality\",\n      \"transparent\": true,\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"P1809F7CD0C75ACF3\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisBorderShow\": false,\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"barWidthFactor\": 0.6,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"insertNulls\": false,\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"showValues\": false,\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"line+area\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"transparent\",\n                \"value\": 0\n              },\n              {\n                \"color\": \"orange\",\n                \"value\": 27\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 41\n              }\n            ]\n          },\n          \"unit\": \"celsius\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 12,\n        \"w\": 8,\n        \"x\": 0,\n        \"y\": 6\n      },\n      \"id\": 50,\n      \"links\": [\n        {\n          \"targetBlank\": true,\n          \"title\": \"Wikipedia\",\n          \"url\": \"https://en.wikipedia.org/wiki/Heat_index\"\n        }\n      ],\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [\n            \"mean\",\n            \"lastNotNull\"\n          ],\n          \"displayMode\": \"table\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"hideZeros\": false,\n          \"mode\": \"multi\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"12.3.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"P1809F7CD0C75ACF3\"\n          },\n          \"expr\": \"-8.78469475556\\r\\n+ 1.61139411 * awair_temp\\r\\n+ 2.33854883889 * awair_humid\\r\\n+ -0.14611605 * awair_temp * awair_humid\\r\\n+ -0.012308094 * awair_temp * awair_temp\\r\\n+ -0.0164248277778 * awair_humid * awair_humid\\r\\n+ 0.002211732 * awair_temp * awair_temp * awair_humid\\r\\n+ 0.00072546 * awair_temp * awair_humid * awair_humid\\r\\n+ -0.000003582 * awair_temp * awair_temp * awair_humid * awair_humid\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{sensor}}\",\n          \"queryType\": \"randomWalk\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Heat Index\",\n      \"transparent\": true,\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"P1809F7CD0C75ACF3\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisBorderShow\": false,\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"barWidthFactor\": 0.6,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"insertNulls\": false,\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"showValues\": false,\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"line+area\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"red\",\n                \"value\": 0\n              },\n              {\n                \"color\": \"orange\",\n                \"value\": 11\n              },\n              {\n                \"color\": \"transparent\",\n                \"value\": 18\n              },\n              {\n                \"color\": \"orange\",\n                \"value\": 25\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 32\n              }\n            ]\n          },\n          \"unit\": \"celsius\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 12,\n        \"w\": 8,\n        \"x\": 8,\n        \"y\": 6\n      },\n      \"id\": 44,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [\n            \"mean\",\n            \"lastNotNull\"\n          ],\n          \"displayMode\": \"table\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"hideZeros\": false,\n          \"mode\": \"multi\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"12.3.1\",\n      \"targets\": [\n        {\n          \"expr\": \"awair_temp\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{sensor}}\",\n          \"queryType\": \"randomWalk\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Temperature\",\n      \"transparent\": true,\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"P1809F7CD0C75ACF3\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisBorderShow\": false,\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"barWidthFactor\": 0.6,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"insertNulls\": false,\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"showValues\": false,\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"line+area\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"red\",\n                \"value\": 0\n              },\n              {\n                \"color\": \"orange\",\n                \"value\": 20\n              },\n              {\n                \"color\": \"transparent\",\n                \"value\": 40\n              },\n              {\n                \"color\": \"orange\",\n                \"value\": 50\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 65\n              }\n            ]\n          },\n          \"unit\": \"percent\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 12,\n        \"w\": 8,\n        \"x\": 16,\n        \"y\": 6\n      },\n      \"id\": 46,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [\n            \"mean\",\n            \"lastNotNull\"\n          ],\n          \"displayMode\": \"table\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"hideZeros\": false,\n          \"mode\": \"multi\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"12.3.1\",\n      \"targets\": [\n        {\n          \"expr\": \"awair_humid\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{sensor}}\",\n          \"queryType\": \"randomWalk\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Relative Humidity\",\n      \"transparent\": true,\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"P1809F7CD0C75ACF3\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisBorderShow\": false,\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"barWidthFactor\": 0.6,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"insertNulls\": false,\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"showValues\": false,\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"line+area\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"transparent\",\n                \"value\": 0\n              },\n              {\n                \"color\": \"orange\",\n                \"value\": 600\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 1500\n              }\n            ]\n          },\n          \"unit\": \"ppm\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 12,\n        \"w\": 8,\n        \"x\": 0,\n        \"y\": 18\n      },\n      \"id\": 45,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [\n            \"mean\",\n            \"lastNotNull\"\n          ],\n          \"displayMode\": \"table\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"hideZeros\": false,\n          \"mode\": \"multi\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"12.3.1\",\n      \"targets\": [\n        {\n          \"expr\": \"awair_co2\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{sensor}}\",\n          \"queryType\": \"randomWalk\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Carbon Dioxide\",\n      \"transparent\": true,\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"P1809F7CD0C75ACF3\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisBorderShow\": false,\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"barWidthFactor\": 0.6,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"insertNulls\": false,\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"showValues\": false,\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"line+area\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"transparent\",\n                \"value\": 0\n              },\n              {\n                \"color\": \"orange\",\n                \"value\": 333\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 3333\n              }\n            ]\n          },\n          \"unit\": \"conppb\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 12,\n        \"w\": 8,\n        \"x\": 8,\n        \"y\": 18\n      },\n      \"id\": 47,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [\n            \"mean\",\n            \"lastNotNull\"\n          ],\n          \"displayMode\": \"table\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"hideZeros\": false,\n          \"mode\": \"multi\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"12.3.1\",\n      \"targets\": [\n        {\n          \"expr\": \"awair_voc\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{sensor}}\",\n          \"queryType\": \"randomWalk\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Volatile Organic Compounds\",\n      \"transparent\": true,\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"P1809F7CD0C75ACF3\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisBorderShow\": false,\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"barWidthFactor\": 0.6,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"insertNulls\": false,\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"showValues\": false,\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"line+area\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"transparent\",\n                \"value\": 0\n              },\n              {\n                \"color\": \"orange\",\n                \"value\": 15\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 55\n              }\n            ]\n          },\n          \"unit\": \"conμgm3\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 12,\n        \"w\": 8,\n        \"x\": 16,\n        \"y\": 18\n      },\n      \"id\": 48,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [\n            \"mean\",\n            \"lastNotNull\"\n          ],\n          \"displayMode\": \"table\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"hideZeros\": false,\n          \"mode\": \"multi\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"12.3.1\",\n      \"targets\": [\n        {\n          \"expr\": \"awair_pm25\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{sensor}}\",\n          \"queryType\": \"randomWalk\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Particulate Matter\",\n      \"transparent\": true,\n      \"type\": \"timeseries\"\n    }\n  ],\n  \"preload\": false,\n  \"refresh\": \"30s\",\n  \"schemaVersion\": 42,\n  \"tags\": [],\n  \"templating\": {\n    \"list\": []\n  },\n  \"time\": {\n    \"from\": \"now-24h\",\n    \"to\": \"now\"\n  },\n  \"timepicker\": {},\n  \"timezone\": \"\",\n  \"title\": \"Smart Home\",\n  \"uid\": \"Zo9UQLKAp\",\n  \"version\": 1\n}"
  },
  {
    "path": "hosts/nyarlathotep/hardware.nix",
    "content": "{ ... }:\n\n{\n  boot.initrd.availableKernelModules = [ \"nvme\" \"xhci_pci\" \"ahci\" \"usb_storage\" \"usbhid\" \"sd_mod\" ];\n  boot.kernelModules = [ \"kvm-amd\" ];\n  boot.extraModulePackages = [ ];\n\n  fileSystems.\"/\" =\n    {\n      device = \"local/volatile/root\";\n      fsType = \"zfs\";\n    };\n\n  fileSystems.\"/boot\" =\n    {\n      device = \"/dev/disk/by-uuid/E145-2264\";\n      fsType = \"vfat\";\n    };\n\n  fileSystems.\"/home\" =\n    {\n      device = \"local/persistent/home\";\n      fsType = \"zfs\";\n    };\n\n  fileSystems.\"/mnt/nas\" =\n    {\n      device = \"data/nas\";\n      fsType = \"zfs\";\n    };\n\n  fileSystems.\"/nix\" =\n    {\n      device = \"local/persistent/nix\";\n      fsType = \"zfs\";\n    };\n\n  fileSystems.\"/persist\" =\n    {\n      device = \"local/persistent/persist\";\n      fsType = \"zfs\";\n      neededForBoot = true;\n    };\n\n  fileSystems.\"/var/log\" =\n    {\n      device = \"local/persistent/var-log\";\n      fsType = \"zfs\";\n    };\n\n  swapDevices = [ ];\n}\n"
  },
  {
    "path": "hosts/nyarlathotep/jobs/flac-and-tag-album.sh",
    "content": "#!/usr/bin/env bash\n\nset -e\n\nfor artist in *; do\n  if [[ -d $artist ]]; then\n    pushd \"$artist\"\n    for album in *; do\n      if [[ -d $album ]]; then\n        echo \"===== $artist - $album\" >&2\n        pushd \"$album\"\n        if [[ ! -e \"$artist - $album.log\" ]]; then\n          echo \"(missing log file)\" >&2\n        fi\n        if [[ ! -e \"cover.jpg\" ]] && [[ ! -e \"cover.png\" ]] && [[ ! -e \"cover.gif\" ]]; then\n          echo \"(missing cover file)\" >&2\n        fi\n        flac -- *.wav\n        rm -- *.wav\n        for flacfile in *.flac; do\n          n=\"$(echo \"$flacfile\" | sed 's:\\..*::')\"\n          track=\"$(echo \"$flacfile\" | sed 's:^[0-9]*\\. \\(.*\\)\\.flac:\\1:')\"\n          metaflac --set-tag=\"tracknumber=$n\" \"$flacfile\"\n          metaflac --set-tag=\"title=$track\"   \"$flacfile\"\n          metaflac --set-tag=\"artist=$artist\" \"$flacfile\"\n          metaflac --set-tag=\"album=$album\"   \"$flacfile\"\n        done\n        popd\n        echo\n        mv \"$album\" \"../../out/$artist - $album\"\n      fi\n    done\n    popd\n    rmdir \"$artist\"\n  fi\ndone\n"
  },
  {
    "path": "hosts/nyarlathotep/jobs/hledger-export-to-victoriametrics.py",
    "content": "#!/usr/bin/env python3\n\nimport calendar\nimport csv\nimport datetime\nimport io\nimport os\nimport subprocess\nimport sys\n\nfrom decimal import Decimal\n\n\nDRY_RUN = \"--dry-run\" in sys.argv\n\nif not DRY_RUN:\n    import requests\n\n    VICTORIAMETRICS_URI = os.environ[\"VICTORIAMETRICS_URI\"]\n\nYEAR_OFFSET = int(os.getenv(\"YEAR_OFFSET\", \"0\"))\n\nDOB = datetime.datetime(1991 - YEAR_OFFSET, 9, 9)\n\n\ndef hledger_command(args):\n    \"\"\"Run a hledger command, throw an error if it fails, and return the\n    stdout.\n    \"\"\"\n\n    real_args = [\"hledger\"]\n    real_args.extend(args)\n\n    proc = subprocess.run(real_args, check=True, capture_output=True)\n    return proc.stdout.decode(\"utf-8\")\n\n\ndef offset_date(date, years):\n    \"\"\"Subtract `365*years` days from `YYYY-MM-DD` and return a string.\n\n    This is useful for forecasting as VictoriaMetrics only allows data up to 2\n    days in the future, so instead a forecast can be shunted back so it fits\n    into the past.\n    \"\"\"\n\n    date = datetime.datetime.strptime(date, \"%Y-%m-%d\")\n    delta = datetime.timedelta(days=365 * years)\n    return (date - delta).strftime(\"%Y-%m-%d\")\n\n\ndef offset_price_date(line, years):\n    \"\"\"Apply a year offset to the date.\"\"\"\n\n    p, date, cur, val = line.split()\n    date = offset_date(date, years)\n    return f\"{p} {date} {cur} {val}\"\n\n\ndef offset_posting_date(posting, years):\n    \"\"\"Apply a year offset to the date.\"\"\"\n\n    posting[\"date\"] = offset_date(posting[\"date\"], years)\n    return posting\n\n\ndef date_to_timestamp(date):\n    \"\"\"Turn `YYYY-MM-DD` into a UNIX timestamp at millisecond resolution,\n    at midnight UTC.\n    \"\"\"\n\n    parsed = datetime.datetime.strptime(date, \"%Y-%m-%d\")\n    return calendar.timegm(parsed.timetuple()) * 1000\n\n\ndef running_totals(deltas_by_timestamp):\n    \"\"\"Turn `timestamp => key => delta` to `timestamp => key => total` by\n    summing deltas in order.\n    \"\"\"\n\n    current = {}\n    out = {}\n    for timestamp in sorted(deltas_by_timestamp.keys()):\n        for k, delta in deltas_by_timestamp[timestamp].items():\n            current[k] = current.get(k, 0) + delta\n        out[timestamp] = {k: v for k, v in current.items()}\n    return out\n\n\ndef pivot(samples_by_timestamp):\n    \"\"\"Turn `timestamp => key => value` to `key => [timestamp, value]`\"\"\"\n\n    pivoted = {}\n    for timestamp, kvs in samples_by_timestamp.items():\n        for k, v in kvs.items():\n            samples = pivoted.get(k, [])\n            samples.append([timestamp, v])\n            pivoted[k] = samples\n    return pivoted\n\n\ndef convert_samples(samples):\n    \"\"\"Turn `[timestamp, float or int or decimal]` to `[timestamp, float or int]`\"\"\"\n\n    return [\n        [timestamp, value if isinstance(value, int) else float(value)]\n        for timestamp, value in samples\n    ]\n\n\ndef preprocess_group_credits_debits(postings):\n    \"\"\"Group postings by date and work out the total debit / credit for\n    each account.  This is then used to simplify other metrics.\n\n    Accounts are projected forwards and backwards in time.\n\n    Postings are applied to an account and all of its superaccounts.\n    \"\"\"\n\n    key = lambda account, currency: ((\"account\", account), (\"currency\", currency))\n    all_keys = set()\n\n    # credits_debits_by_date :: date => key => {credit, debit}\n    credits_debits_by_date = {}\n    for posting in postings:\n        currency = posting[\"commodity\"]\n        credit = Decimal(posting[\"credit\"] or \"0\")\n        debit = Decimal(posting[\"debit\"] or \"0\")\n\n        if currency == \"£\":\n            currency = \"GBP\"\n\n        credits_debits = credits_debits_by_date.get(posting[\"date\"], {})\n        account = None\n        for segment in posting[\"account\"].split(\":\"):\n            if account is None:\n                account = segment\n            else:\n                account = f\"{account}:{segment}\"\n\n            k = key(account, currency)\n            all_keys.add(k)\n\n            old = credits_debits.get(k, {\"credit\": 0, \"debit\": 0})\n            credits_debits[k] = {\n                \"credit\": old[\"credit\"] + credit,\n                \"debit\": old[\"debit\"] + debit,\n            }\n        credits_debits_by_date[posting[\"date\"]] = credits_debits\n\n    # Project accounts through all time\n    for timestamp in credits_debits_by_date.keys():\n        credits_debits = credits_debits_by_date[timestamp]\n        for k in all_keys:\n            credits_debits[k] = credits_debits.get(k, {\"credit\": 0, \"debit\": 0})\n        credits_debits_by_date[timestamp] = credits_debits\n\n    return credits_debits_by_date\n\n\ndef metric_hledger_fx_rate(gbp_fx_rates, credits_debits):\n    \"\"\"`hledger_fx_rate{currency=\"xxx\", target_currency=\"xxx\"}`\n\n    - Every currency has an exchange rate of 1 with itself.\n\n    - Every currency has an exchange rate from GBP to itself at\n    1/rate.\n\n    - Every pair of currencies have exchange rates converting both\n    ways (via GBP).\n\n    Exchange rates are projected forwards if there are credits /\n    debits in a gap.\n    \"\"\"\n\n    key = lambda currency, target_currency: (\n        (\"currency\", currency),\n        (\"target_currency\", target_currency),\n    )\n\n    all_timestamps = {date_to_timestamp(date): True for date in credits_debits.keys()}\n\n    # gbp_fx_rates_by_timestamp :: timestamp => currency => gbp_exchange_rate\n    gbp_fx_rates_by_timestamp = {}\n    for price in gbp_fx_rates:\n        _, date, from_currency, gbp_exchange_rate = price.split()\n        timestamp = date_to_timestamp(date)\n        all_timestamps[timestamp] = True\n        gbp_exchange_rate = Decimal(gbp_exchange_rate[1:].replace(\",\", \"\"))\n\n        new_rates = gbp_fx_rates_by_timestamp.get(timestamp, {})\n        new_rates[from_currency] = gbp_exchange_rate\n        gbp_fx_rates_by_timestamp[timestamp] = new_rates\n\n    # fx_rates_by_timestamp :: timestamp => key => exchange_rate\n    fx_rates_by_timestamp = {}\n    gbp_fx_rates = {}\n    for timestamp in sorted(all_timestamps.keys()):\n        gbp_fx_rates = gbp_fx_rates_by_timestamp.get(timestamp, gbp_fx_rates)\n        fx_rates = {key(\"GBP\", \"GBP\"): 1}\n        for currency, fx in gbp_fx_rates.items():\n            fx_rates[key(currency, currency)] = 1\n            fx_rates[key(currency, \"GBP\")] = fx\n            fx_rates[key(\"GBP\", currency)] = 1 / fx\n        for currency, from_fx in gbp_fx_rates.items():\n            for target_currency, to_fx in gbp_fx_rates.items():\n                fx_rates[key(currency, target_currency)] = from_fx / to_fx\n        fx_rates_by_timestamp[timestamp] = fx_rates\n\n    return pivot(fx_rates_by_timestamp)\n\n\ndef metric_hledger_balance(credits_debits):\n    \"\"\"`hledger_balance{account=\"xxx\", currency=\"xxx\"}`\n\n    Accounts are propagated forward in time: if an account is seen at\n    time T, then its balance will also be reported at time T+1, T+2,\n    etc.\n    \"\"\"\n\n    # deltas_by_timestamp :: timestamp => key => delta\n    deltas_by_timestamp = {}\n    for date, kcds in credits_debits.items():\n        timestamp = date_to_timestamp(date)\n        deltas_by_timestamp[timestamp] = {\n            key: cd[\"debit\"] - cd[\"credit\"] for key, cd in kcds.items()\n        }\n\n    return pivot(running_totals(deltas_by_timestamp))\n\n\ndef metric_hledger_monthly_credits_debits(credits_debits, field):\n    \"\"\"`hledger_monthly_xxx{account=\"xxx\", currency=\"xxx\"}`\n\n    Like `hledger_balance` but only sums the credits or debits (these\n    are two separate metrics).  These are also grouped by calendar\n    month, with all the transactions taking effect at midnight (UTC)\n    on the 1st.\n\n    This drops the last calendar month, so only complete months are\n    present.\n    \"\"\"\n\n    # deltas_by_timestamp :: timestamp => key => delta\n    deltas_by_timestamp = {}\n    for date, kcds in credits_debits.items():\n        parsed = datetime.datetime.strptime(date, \"%Y-%m-%d\")\n        timestamp = calendar.timegm(parsed.replace(day=1).timetuple()) * 1000\n\n        deltas = deltas_by_timestamp.get(timestamp, {})\n        for key, cd in kcds.items():\n            deltas[key] = deltas.get(key, 0) + cd[field]\n        deltas_by_timestamp[timestamp] = deltas\n\n    del deltas_by_timestamp[max(deltas_by_timestamp.keys())]\n\n    return pivot(deltas_by_timestamp)\n\n\ndef metric_hledger_age_of_money(credits_debits):\n    \"\"\"`hledger_age_of_money{account=\"xxx\", currency=\"xxx\"}`\n\n    Gives the age (in days) of the oldest unit of money in that\n    account.  Age is calculated by taking the net change of every day,\n    if it's positive putting it in a new bucket, and if it's negative\n    taking it from the oldest bucket.  The age is then the age of the\n    oldest nonempty bucket.\n    \"\"\"\n\n    # deltas_by_timestamp :: timestamp => key => delta\n    deltas_by_timestamp = {}\n    for date, kcds in credits_debits.items():\n        timestamp = date_to_timestamp(date)\n        deltas_by_timestamp[timestamp] = {\n            key: cd[\"debit\"] - cd[\"credit\"] for key, cd in kcds.items()\n        }\n\n    # ages_by_timestamp :: timestamp => key => days\n    ages_by_timestamp = {}\n    buckets_by_key = {}\n    ages = {}\n    for timestamp in sorted(deltas_by_timestamp.keys()):\n        for key, delta in deltas_by_timestamp[timestamp].items():\n            ages[key] = ages.get(key, 0)\n            buckets = buckets_by_key.get(key, [])\n            if delta > 0:\n                if len(buckets) == 0:\n                    buckets = [(timestamp, delta)]\n                else:\n                    _, latest_value = buckets[-1]\n                    buckets.append((timestamp, latest_value + delta))\n            elif delta < 0:\n                buckets = [\n                    (timestamp, value + delta)\n                    for timestamp, value in buckets\n                    if value > -delta\n                ]\n            buckets_by_key[key] = buckets\n        for key in list(ages.keys()):\n            buckets = buckets_by_key[key]\n            if len(buckets) == 0:\n                ages[key] = 0\n            else:\n                first_timestamp, _ = buckets[0]\n                ages[key] = int((timestamp - first_timestamp) / 86400000)\n        ages_by_timestamp[timestamp] = {k: v for k, v in ages.items()}\n\n    return pivot(ages_by_timestamp)\n\n\ndef metric_hledger_transactions_total(postings):\n    \"\"\"`hledger_transactions_total{status=\"(pending|bookkeeping|cleared)\"}`\"\"\"\n\n    TRANSACTION_STATUS_NAMES = {\"\": \"pending\", \"!\": \"bookkeeping\", \"*\": \"cleared\"}\n\n    key = lambda status: ((\"status\", TRANSACTION_STATUS_NAMES[status]),)\n\n    # txnids_by_timestamp :: timestamp => key => set(txn_id)\n    txnids_by_timestamp = {}\n    for posting in postings:\n        timestamp = date_to_timestamp(posting[\"date\"])\n        status = posting[\"status\"]\n\n        txnids_by_status = txnids_by_timestamp.get(timestamp, {})\n        txnids = txnids_by_status.get(key(status), set())\n        txnids.add(posting[\"txnidx\"])\n        txnids_by_status[key(status)] = txnids\n        txnids_by_timestamp[timestamp] = txnids_by_status\n\n    # counts_by_timestamp :: timestamp => key => int\n    counts_by_timestamp = {\n        ts: {k: len(ids) for k, ids in vs.items()}\n        for ts, vs in txnids_by_timestamp.items()\n    }\n\n    return pivot(running_totals(counts_by_timestamp))\n\n\ndef metric_quantified_self_age(credits_debits):\n    \"\"\"`quantified_self_age{unit=\"{days|years}\"}`\"\"\"\n\n    # ages_by_timestamp :: timestamp => key => int\n    ages_by_timestamp = {}\n    for datestr in sorted(credits_debits.keys()):\n        date = datetime.datetime.strptime(datestr, \"%Y-%m-%d\")\n        timestamp = calendar.timegm(date.timetuple()) * 1000\n\n        days = (date - DOB).days\n        years = date.year - DOB.year\n        if (date.month, date.day) < (DOB.month, DOB.day):\n            years -= 1\n\n        ages_by_timestamp[timestamp] = {\n            ((\"unit\", \"days\"),): days,\n            ((\"unit\", \"years\"),): years,\n        }\n\n    return pivot(ages_by_timestamp)\n\n\nraw_prices = [\n    offset_price_date(line, YEAR_OFFSET)\n    for line in hledger_command([\"prices\"]).splitlines()\n]\nraw_postings = [\n    offset_posting_date(row, YEAR_OFFSET)\n    for row in csv.DictReader(io.StringIO(hledger_command([\"print\", \"-O\", \"csv\"])))\n]\ncredits_debits = preprocess_group_credits_debits(raw_postings)\n\nmetrics = {\n    \"hledger_fx_rate\": metric_hledger_fx_rate(raw_prices, credits_debits),\n    \"hledger_balance\": metric_hledger_balance(credits_debits),\n    \"hledger_monthly_increase\": metric_hledger_monthly_credits_debits(\n        credits_debits, \"debit\"\n    ),\n    \"hledger_monthly_decrease\": metric_hledger_monthly_credits_debits(\n        credits_debits, \"credit\"\n    ),\n    \"hledger_age_of_money\": metric_hledger_age_of_money(credits_debits),\n    \"hledger_transactions_total\": metric_hledger_transactions_total(raw_postings),\n    \"quantified_self_age\": metric_quantified_self_age(credits_debits),\n}\n\nfor name, values in metrics.items():\n    if not DRY_RUN:\n        requests.post(\n            f\"{VICTORIAMETRICS_URI}/api/v1/admin/tsdb/delete_series?match[]={name}\"\n        ).raise_for_status()\n\n    for labels_tuples, samples in values.items():\n        print(f\"Uploading {name} {labels_tuples} ({len(samples)} samples)\")\n\n        labels = dict(labels_tuples)\n        labels[\"__name__\"] = name\n        samples = convert_samples(samples)\n        json = {\n            \"metric\": labels,\n            \"values\": [v for _, v in samples],\n            \"timestamps\": [t for t, _ in samples],\n        }\n\n        if DRY_RUN:\n            print(json)\n        else:\n            requests.post(\n                f\"{VICTORIAMETRICS_URI}/api/v1/import\", json=json\n            ).raise_for_status()\n\nif not DRY_RUN:\n    requests.get(\n        f\"{VICTORIAMETRICS_URI}/internal/resetRollupResultCache\"\n    ).raise_for_status()\n"
  },
  {
    "path": "hosts/nyarlathotep/jobs/hledger-fetch-fx-rates.py",
    "content": "#!/usr/bin/env python3\n\nfrom html.parser import HTMLParser\n\nimport os\nimport requests\nimport sys\nimport time\n\nDRY_RUN = \"--dry-run\" in sys.argv\n\n\ndef get_financial_times(url):\n    class PriceFinder(HTMLParser):\n        def __init__(self):\n            HTMLParser.__init__(self)\n            self.found = None\n            self.isnext = False\n\n        def handle_data(self, data):\n            if self.found is not None:\n                return\n\n            if data == \"Price (GBP)\":\n                self.isnext = True\n            elif self.isnext:\n                self.found = data\n                self.isnext = False\n\n    r = requests.get(url)\n    r.raise_for_status()\n    finder = PriceFinder()\n    finder.feed(r.text)\n    if finder.found is None:\n        raise Exception(\"could not find price\")\n    else:\n        return finder.found\n\n\ndef get_financial_times_currency(symbol):\n    return get_financial_times(\n        f\"https://markets.ft.com/data/currencies/tearsheet/summary?s={symbol}GBP\"\n    )\n\n\ndef get_financial_times_fund(isin):\n    return get_financial_times(\n        f\"https://markets.ft.com/data/funds/tearsheet/summary?s={isin}:GBP\"\n    )\n\n\nDATE = time.strftime(\"%Y-%m-%d\")\n\nCOMMODITIES = [\n    (\"CAD\", get_financial_times_currency),\n    (\"EUR\", get_financial_times_currency),\n    (\"JPY\", get_financial_times_currency),\n    (\"SEK\", get_financial_times_currency),\n    (\"USD\", get_financial_times_currency),\n    (\"VANEA\", \"GB00B41XG308\", get_financial_times_fund),\n]\n\nwith sys.stdout if DRY_RUN else open(os.environ[\"PRICE_FILE\"], \"a\") as f:\n    print(\"\", file=f)\n\n    for commodity in COMMODITIES:\n        symbol = commodity[0]\n        try:\n            rate = commodity[-1](commodity[-2])\n            print(f\"P {DATE} {symbol} £{rate}\", file=f)\n        except Exception as e:\n            print(f\"; '{symbol}': {e}\", file=f)\n"
  },
  {
    "path": "hosts/nyarlathotep/jobs/restic-prepare--fetch-youtube.py",
    "content": "#!/usr/bin/env python3\n\n\"\"\"Youtube \"backup\" script - generates a script to download videos.\"\"\"\n\nimport os\nimport shlex\n\nSOURCE_DIR = \"/mnt/nas/misc/youtube\"\nVIDEO_URL = \"https://www.youtube.com/watch?v=\"\n\nprint(\"#!/bin/sh\")\nprint(\"\")\n\nfor dirpath, dirnames, filenames in os.walk(SOURCE_DIR, topdown=True):\n    for dirname in dirnames:\n        print(f\"mkdir {shlex.quote(os.path.join(dirpath, dirname))}\")\n    for filename in filenames:\n        # filenames are of the form \"title [id].ext\"\n        name_pattern = filename.split(\"[\")[-2] + \"[%(id)s].%(ext)s\"\n        url = VIDEO_URL + filename.split(\"[\")[-1].split(\"]\")[0]\n        print(\n            f\"yt-dlp -P {shlex.quote(dirpath)} -o {shlex.quote(name_pattern)} {shlex.quote(url)}\",\n        )\n"
  },
  {
    "path": "hosts/nyarlathotep/jobs/restic-prepare--hardlink-torrent-files.py",
    "content": "#!/usr/bin/env python3\n\n\"\"\"Torrent \"backup\" script - generates a script to create the directory\nhierarchy and hardlink files.\n\"\"\"\n\nimport os\nimport shlex\nimport sys\n\n# Directories to link\nMEDIA_DIRS = [\"/mnt/nas/anime\", \"/mnt/nas/movies\", \"/mnt/nas/tv\"]\n\n# Where torrent files are downloaded to\nTORRENT_FILES_DIR = \"/mnt/nas/torrents/files\"\n\n# Where .torrent files are stored\nTORRENT_WATCH_DIR = \"/mnt/nas/torrents/watch\"\n\n# Only list unlinked files, don't generate a linking script\nCHECK_ONLY = \"--check\" in sys.argv\n\n\ndef print_cmd(cmd):\n    \"\"\"Print a command, if not in checking mode.\"\"\"\n\n    if not CHECK_ONLY:\n        print(cmd)\n\n\ndef file_ref(fpath):\n    \"\"\"Return a unique reference to the file, consistent across hardlinks.\"\"\"\n\n    info = os.stat(fpath)\n    return (info.st_dev, info.st_ino)\n\n\ndef find_inodes(base):\n    \"\"\"Return the set of inodes under the given base directory.\"\"\"\n\n    inodes = dict()\n    for root, _, files in os.walk(base):\n        for fname in files:\n            fpath = os.path.join(root, fname)\n            inodes[file_ref(fpath)] = fpath\n    return inodes\n\n\ndef traverse(base, inodes):\n    \"\"\"Print out `mkdir` and `ln` commands to rebuild the directory / file\n    hierarchy under `base`, linking files to `inodes`.\n    \"\"\"\n\n    for root, _, files in os.walk(base):\n        print_cmd(f\"mkdir {shlex.quote(root)}\")\n        for fname in files:\n            fpath = os.path.join(root, fname)\n            ref = file_ref(fpath)\n            if ref in inodes:\n                source_file = inodes[ref]\n                print_cmd(f\"ln {shlex.quote(source_file)} {shlex.quote(fpath)}\")\n            elif os.path.splitext(fpath)[-1] == \".torrent\":\n                source_file = os.path.join(TORRENT_WATCH_DIR, fname)\n                print_cmd(f\"cp {shlex.quote(source_file)} {shlex.quote(fpath)}\")\n            else:\n                print(f\"Unknown path {fpath}\", file=sys.stderr)\n\n\ninodes = find_inodes(TORRENT_FILES_DIR)\nfor media_dir in MEDIA_DIRS:\n    traverse(media_dir, inodes)\n"
  },
  {
    "path": "hosts/nyarlathotep/jobs/rss-to-mastodon.py",
    "content": "#!/usr/bin/env python3\n\n\"\"\"RSS-to-Mastodon (or Pleroma)\n\nRequires the API_KEY environment variable to be set.\n\nUsage:\n  rss-to-mastodon [--dry-run] [--use-summary] -d <domain> -f <feed-url> -l <history-file> [-e <entries>] [-v <visibility>]\n\nOptions:\n  --dry-run          just print what would be published\n  --use-summary      use the (de-HTMLised) sumamry field, rather than the title\n  -d <domain>        api domain\n  -f <feed-url>      rss feed URL\n  -l <history-file>  file to log feed item IDs to (to prevent double-posting)\n  -e <entries>       maximum number of entries to post [default: 1]\n  -v <visibility>    visibility of entries [default: public]\n\"\"\"\n\nimport bs4\nimport docopt\nimport feedparser\nimport html.parser\nimport http.client\nimport os\nimport pathlib\nimport requests\nimport sys\nimport time\n\nargs = docopt.docopt(__doc__)\ndry_run = args[\"--dry-run\"]\nuse_summary = args[\"--use-summary\"]\napi_domain = args[\"-d\"]\nfeed_url = args[\"-f\"]\nhistory_file = pathlib.Path(args[\"-l\"])\nentries = int(args[\"-e\"])\nvisibility = args[\"-v\"]\n\nif not dry_run:\n    api_token = os.getenv(\"API_KEY\")\n    if api_token is None:\n        print(\"missing API key\", file=sys.stderr)\n        sys.exit(1)\n\nattempts = 0\nfeed = None\nwhile attempts < 5:\n    # tumblr seems to often just drop connections with the default feedparser\n    # user agent, so let's pretend to be curl\n    try:\n        feed = feedparser.parse(feed_url, agent=\"curl/7.54.1\")\n        break\n    except http.client.RemoteDisconnected:\n        print(f\"failed to download feed - attempt {attempts}\", file=sys.stderr)\n        attempts += 1\n        time.sleep(2)\n\nif feed is None:\n    print(\"could not download feed\", file=sys.stderr)\n    sys.exit(1)\n\n# will crash if the file doesn't exist - but that's probably a good failsafe to\n# prevent the same post being spammed if the log file gets accidentally deleted\nhistory = history_file.read_text().split()\nitems = [entry for entry in feed[\"items\"][:entries] if entry[\"id\"] not in history]\n\n# if there are multiple items, post the older ones first\nfor item in reversed(items):\n    title = html.parser.unescape(item[\"title\"])\n\n    if use_summary:\n        title = bs4.BeautifulSoup(item[\"summary\"], \"html.parser\").get_text().strip()\n\n    print(item[\"id\"])\n    print(title)\n    print()\n\n    if dry_run:\n        continue\n\n    requests.post(\n        f\"{api_domain}/api/v1/statuses\",\n        headers={\n            \"Authorization\": f\"Bearer {api_token}\",\n            \"Idempotency-Key\": item[\"id\"],\n        },\n        json={\n            \"status\": title,\n            \"visibility\": visibility,\n        },\n    ).raise_for_status()\n\n    # yes, this is inefficient - but the file will have a few hundred entries in\n    # it at most\n    history.append(item[\"id\"])\n    history_file.write_text(\"\\n\".join(history))\n"
  },
  {
    "path": "hosts/nyarlathotep/jobs/tag-podcasts.sh",
    "content": "#!/usr/bin/env bash\n\nset -e\n\nsleep 60\n\nfor m4afile in */in/*.m4a; do\n  if [[ ! -f \"$m4afile\" ]]; then\n    break\n  fi\n\n  bitrate=$(ffprobe -v quiet -of flat=s=_ -show_entries format=bit_rate \"${m4afile}\" | sed 's/[^0-9]*//g')\n  destination=\"$(echo \"$m4afile\" | sed 's:m4a$:mp3:')\"\n  echo \"m4a: ${m4afile} -> ${destination}\" >&2\n  ffmpeg -y -i \"$m4afile\" -codec:a libmp3lame -b:a \"$bitrate\" -q:a 2 \"$destination\"\n  rm \"$m4afile\"\ndone\n\nfor mp3file in */in/*.mp3; do\n  if [[ ! -f \"$mp3file\" ]]; then\n    break\n  fi\n\n  dir=\"$(echo \"$mp3file\" | sed 's:/in/.*::')\"\n  f=\"$(basename \"$mp3file\")\"\n\n  artist=\"$(echo \"$dir\" | sed 's: - .*::')\"\n  album=\"$(echo \"$dir\" | sed 's:.* - ::')\"\n\n  if [[ -z \"$album\" ]]; then\n    album=\"$artist\"\n  fi\n\n  n=\"$(echo \"$f\" | sed 's:\\..*::')\"\n  track=\"$(echo \"$f\" | sed 's:^[0-9]*\\. \\(.*\\)\\.mp3:\\1:')\"\n  destination=\"$(echo \"$mp3file\" | sed 's:/in/:/:')\"\n\n  echo \"===== $mp3file\" >&2\n  echo \"$artist\" >&2\n  echo \"$album\" >&2\n  echo \"$n\" >&2\n  echo \"$track\" >&2\n  echo \"$destination\" >&2\n  echo >&2\n\n  id3v2 -D \"$mp3file\"\n  id3v2 -2 --song   \"$track\"  \"$mp3file\"\n  id3v2 -2 --track  \"$n\"      \"$mp3file\"\n  id3v2 -2 --artist \"$artist\" \"$mp3file\"\n  id3v2 -2 --album  \"$album\"  \"$mp3file\"\n  mv \"$mp3file\" \"$destination\"\ndone\n\n# this can't be done as a systemd path unit because it doesn't seem to\n# support multiple *s in a pattern\ninotifywait --recursive --timeout 3600 --include '/mnt/nas/music/Podcasts/.*/in/.*\\.mp3' \"$(pwd)\" &>/dev/null\n\n# this script is run in a loop by systemd.\n"
  },
  {
    "path": "hosts/nyarlathotep/secrets.yaml",
    "content": "users:\n    barrucadu: ENC[AES256_GCM,data:H6q5mf0vurd5FRCPftLGXvGzDep5iYlSw4gJMVCWhB8+35A8wYyE8i5qW+pNEE+TtxrXpYa9MzjWpAUdsmoyHi1Ncficb8USvIWAeLgQljAG0mrV9Yj1TjmDH81UsXKqzpJw2duXymnQ,iv:ls1DMfK4Y0RZgEDPRhQC/jJPUOKRLRljV/yuIfAqnB4=,tag:x2FzpOuDDndWF7WMJqb4eQ==,type:str]\n    notbarrucadu: ENC[AES256_GCM,data:Q7++CIUemGmLY2mCYQoF4ImyK9HNqbd0NTNY0PohQfQhuXZE6vvxRUypXppKUxpaLct4mvc+f9+uAY5MJB8a2D3YH51tqbEDQaJqxWn1Qw90Wxubvr/EdpzgKJW9BAZLIGxCTOM=,iv:QmoC1J+1FNiLzGrBJiWa83VuRZJx5CKflZTmhHFt6ZM=,tag:qGMfbc13j65/yDlzAvy3QQ==,type:str]\n    rss_to_mastodon:\n        kjp_hacksrus_env: ENC[AES256_GCM,data:+H7js3WDrDuuQQjuAs3mG87xHyhWXUOoH47OlhUhM96h6pyVP5pV34+gwDvO4cgCWmbeDg==,iv:ptGUl/MdXgxrrem0kMKeQcpUsHgPbBamaJehDjVwVAo=,tag:z4MXvOFHU1e/LTkjcBec0A==,type:str]\n    remote_sync:\n        ssh_private_key: ENC[AES256_GCM,data:lOfo8ALZTCq7GVEZ+2KCDch+mOkOrSm5oqJKUNP+JVqfxA3r2GV8071ESFme8oTmsLIl/u5W9UxK6GMobM5M4ynZUTr1H3/yLRMNrbymTqIrKeGejaIy4hZRbF4Pv4NgtRTbnBfP7HHHnhykARuROmmtLQVITrAi4j9BJ7smyzOd8rdeyOsHBioOd784DLUGXQaGAmEvBRGuZ/pq3hEV0kQof5I94V82A7zWjZpD4yO76e+LYCA0Eu2FxM88P5jkiTPWLxFciY0z++2QvPguuYeXeAFkDc7yR2hiWFWT+rtfZSGsBL+Czse9PZbatugHn59ZPEzvUlv+FTnx5Vc1o9fQYGWCJGerZY2Sg6AtPglEdrmeTtEeELGVmnK/i5etlRaOER4fGSIIoIQ/xAor/GK0laoMQtU/MDLcuvw8BtD91/yTwFYbrghe8BEbnO36OUFQFh4OIWo8pHnkfbPZtJF+fRjXiO5yEdZpx29pMrqkhWqvEeujGurLZvTcQLX2iJ0utmQ3zv2/d8c+mzNHPNxUvHAEkp3kUjyktq0aylyjTdw=,iv:rxxAph3k6JEFJaq1LbWfIj6ah1E9r6locEBDghf/7gE=,tag:oEp4/ILyn5YfEDgC7eMhiw==,type:str]\nnixfiles:\n    restic-backups:\n        env: ENC[AES256_GCM,data:K+JPrEyTiwClQ7z7p8IIv3CQZ2I2FMWKM7fZp2bGdahrezv5WihM1layoMXaZKK3sX4Mh1egaRUaDIW89+tvQFEN8zvekBOd7m2upmxVjsayCOLdV1wPSD/YZBPt15pZnNI8iIciaQWGSVZHvFn+V3H49PvXzQV4r0N1NQYiBPinCBVpcw6P9309CAPMVFmA0tCwPNUHp1JOJcDolhdmCIgPfTpDCeoZ8/1Ln9J+T4W5kZ6vrMXtRmTvD6ItAnRNsUx+07mAvTP2kosVAIgT1h8nC5Nt3rv3dCdOVaK6ILahSwCY0fnDq9mQU0ALADF8jGbi0xIfidQDdZp/7OaAbjhUiwTBkSoFu5KAfUk=,iv:MS5LRsfpKg5alaxpBuXiI0JWA5zFfLsMUPFoYLtzqoo=,tag:EItXOV+GgqbXRyYFmkuweg==,type:str]\nservices:\n    alertmanager:\n        env: ENC[AES256_GCM,data:O3XHFKP9NRSfRuLOg0cF+g2knAYyAMoc1s+fJ3/eikOxGyqPlKehlJhjh+lfW5Em7VUjwLVZLjsR0Hq+zvx9oHFGiBX8wxWhYMajMjzE9yfyAghmiIX5LL1T9Wgz+TBS4IJw0uEU,iv:/LyaBKRMHcAn8wQTwj6ZQBR17pnNdIanHi4CWLSfENs=,tag:FVjC/MEci9B4hWA5Ev3+Yw==,type:str]\nsops:\n    kms: []\n    gcp_kms: []\n    azure_kv: []\n    hc_vault: []\n    age:\n        - recipient: age1sdnp5uxhdtujc78penv2gntnenzcfju7est4hslz6eqgfk26u9nskkk634\n          enc: |\n            -----BEGIN AGE ENCRYPTED FILE-----\n            YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAzbWpwbzYvQnJaR3B4L0Zk\n            WlJna2xXTzZ3TXAyVktXRTNGV2EvR3V6S25nCi9ITmROQ3owcGlIZlNDVTZDU3h6\n            Y0xHK2hzY3ZQYlBrenRVU1Y4Z1U5R0EKLS0tIFRKOXlXUDhzZXBHclMySjYwN0tT\n            SFkyTXBscUZjYVhEVENWZkU5d283KzQKXd6VX+ZetGZuKIBZd88zk6IRLLeydXbD\n            +jF2ojL15sO2EIB4c576Y9xdRgC6GFNHXbUM2j5ghoII05bvr0C31g==\n            -----END AGE ENCRYPTED FILE-----\n        - recipient: age1700sgwfejx38fh66k6sajxe507w9x6ptcxfh4dmyffflml75w4fqmteyfy\n          enc: |\n            -----BEGIN AGE ENCRYPTED FILE-----\n            YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBDMlY0RlJRMjR2U0M2R3R0\n            Nnh2ZzhRamUxdjEyZEFmQ1g4akNLbG1JUWdFClZ4ZlJzKzJub1VtOUN3eE5SaWhI\n            NjRoVEx0VkxWd2ZiNnNWSlhEaXVyNUUKLS0tIGtKakJUOSs4c3R2WVRLcWZkdklk\n            UFVZQkpPSUY1YWZlRlFCbDNBcHhzVmcKzBqO5fMoaNerJw3ovWXCPLQM0cDfte03\n            ZiXMnrIUfIf2AntjjnZKc84jsnubTyD2fQLGNVkAetmQ3PTb3OKXqQ==\n            -----END AGE ENCRYPTED FILE-----\n    lastmodified: \"2024-09-02T19:42:11Z\"\n    mac: ENC[AES256_GCM,data:Fvlv7VdlVJotJtwoRUTbif2Hu/ly9P7sHB3S39Q5h4JJuX19jO32VySS5dg0NKzm9VbjaD42E+5wGty128JQNs4vcS+znlgP1H5ZJdLd0tKTYtGjIdV8CoJAWRdLqcyJwNrGbnEaPkyk5jaIf7m2zTHOIhBrH0nT80QEaqpL0aQ=,iv:Ly3hnnpActejElcp1ubHa9wuMrrFEgHzof07Om9pr5g=,tag:EZm3A4pGldvT+spk45LWxA==,type:str]\n    pgp: []\n    unencrypted_suffix: _unencrypted\n    version: 3.8.1\n"
  },
  {
    "path": "hosts/yuggoth/configuration.nix",
    "content": "# This is a VPS (hosted by Hetzner Cloud).\n#\n# It serves a redundant deployment of a few of my websites.\n#\n# **Alerting:** disabled\n#\n# **Backups:** disabled\n#\n# **Public hostname:** `yuggoth.barrucadu.co.uk`\n#\n# **Role:** server\n{ config, lib, pkgs, ... }:\n\nwith lib;\n{\n  ###############################################################################\n  ## General\n  ###############################################################################\n\n  networking.hostId = \"62f520b4\";\n  boot.supportedFilesystems = { zfs = true; };\n\n  boot.loader.grub.enable = true;\n  boot.loader.grub.device = \"/dev/sda\";\n\n  networking.interfaces.enp1s0 = {\n    ipv6.addresses = [{ address = \"2a01:4ff:f0:3a38::\"; prefixLength = 64; }];\n  };\n  networking.defaultGateway6 = { address = \"fe80::1\"; interface = \"enp1s0\"; };\n\n  nixfiles.eraseYourDarlings.enable = true;\n  nixfiles.eraseYourDarlings.machineId = \"ee9cfe217f0f4d45bab5e897e782ca91\";\n  nixfiles.eraseYourDarlings.barrucaduPasswordFile = config.sops.secrets.\"users/barrucadu\".path;\n  sops.secrets.\"users/barrucadu\".neededForUsers = true;\n\n  ###############################################################################\n  ## Website Mirror\n  ###############################################################################\n\n  nixfiles.hostTemplates.websiteMirror = {\n    enable = true;\n    acmeEnvironmentFile = config.sops.secrets.\"services/acme/env\".path;\n  };\n  sops.secrets.\"services/acme/env\" = { };\n\n  ###############################################################################\n  ## Remote Builds\n  ###############################################################################\n\n  nix.distributedBuilds = true;\n  nix.buildMachines = [{\n    hostName = \"carcosa.barrucadu.co.uk\";\n    system = \"x86_64-linux\";\n    sshUser = \"nix-remote-builder\";\n    sshKey = config.sops.secrets.\"nix/build_machines/carcosa/ssh_key\".path;\n    publicHostKey = \"c3NoLWVkMjU1MTkgQUFBQUMzTnphQzFsWkRJMU5URTVBQUFBSUlTa0x0bk11bUs3N1RYUHBSa0VCeGI1NEtZVHZMZzhHUmFOeGl6c2NoMSsgcm9vdEBjYXJjb3NhCg==\";\n    protocol = \"ssh-ng\";\n    maxJobs = 8;\n  }];\n  sops.secrets.\"nix/build_machines/carcosa/ssh_key\" = { };\n}\n"
  },
  {
    "path": "hosts/yuggoth/hardware.nix",
    "content": "{ ... }:\n\n{\n  boot.initrd.availableKernelModules = [ \"ahci\" \"xhci_pci\" \"virtio_pci\" \"virtio_scsi\" \"sd_mod\" \"sr_mod\" ];\n  boot.initrd.kernelModules = [ ];\n  boot.kernelModules = [ ];\n  boot.extraModulePackages = [ ];\n\n  fileSystems.\"/\" =\n    {\n      device = \"local/volatile/root\";\n      fsType = \"zfs\";\n    };\n\n  fileSystems.\"/boot\" =\n    {\n      device = \"/dev/disk/by-uuid/A5EB-2AC0\";\n      fsType = \"vfat\";\n      options = [ \"fmask=0022\" \"dmask=0022\" ];\n    };\n\n  fileSystems.\"/home\" =\n    {\n      device = \"local/persistent/home\";\n      fsType = \"zfs\";\n    };\n\n  fileSystems.\"/nix\" =\n    {\n      device = \"local/persistent/nix\";\n      fsType = \"zfs\";\n    };\n\n  fileSystems.\"/persist\" =\n    {\n      device = \"local/persistent/persist\";\n      fsType = \"zfs\";\n      neededForBoot = true;\n    };\n\n  fileSystems.\"/var/log\" =\n    {\n      device = \"local/persistent/var-log\";\n      fsType = \"zfs\";\n    };\n\n  swapDevices = [ ];\n}\n"
  },
  {
    "path": "hosts/yuggoth/secrets.yaml",
    "content": "nix:\n    build_machines:\n        carcosa:\n            ssh_key: ENC[AES256_GCM,data:iHdR8yErpDSh9GHQ1nS1u6jkxDxDoQnjpElKlE51W4zP/0Aswvok9cgIhMEvr6fEhQlHYJm+naLmLg+r96EPgTHOOiR+Hz722EDor/BhQoAUn+ebWm6HshoL2xZNjg60gFR6Ac7m7s9kgA+LIxKcPW6U53EVBo9yeVRvHxBUrMfzyjmbB0kP3tiomwNgcsVjrg4SDss3AoYlfsq5TkYr4m6XRXYuM5tQxpFelSSGKDCYMKhS0UKP5diQz2GVvlbYkF7wOMHTnb4hn67p5AbesNiPHatIvUmm6upi+BIQYxcB4T0r9NzFmvqKkFiiFXZJ/IWuMiVP0uklccfkWarHa07S0JZlBMwGPgn7Nt2NesNWYsNqdiDit7Wbv/zCkOUo+BP3EWAZTLne4VjLfDzPXVFz2+z/ukPIpK0QYk9bwfR1VJAa6ahhRwJ6elNApaZhoFRbh4FCWjGQbpnHWt658q3d4GPe+gWapJuG4RtYGYPSxmpq3BXw+FsVyF2CJD6IAPpP4+xpVLoXRkpQyojOO8P4uZK0g5UYL/ap,iv:pUzTPINBp+AdZTy8Dk4t6+wODlJZZ1V/AJD51oVNIi4=,tag:hmtRHuX0H29lGTzwfqsz1g==,type:str]\nusers:\n    barrucadu: ENC[AES256_GCM,data:AydpgRw6tSPNsj0YJgNKDIwcCF2bo+vwJhrRJhbeJAY39yJHlP9xTarGGNBAczrKBwKKMN2EAA27hRyX+tDc/ne9mtOx4P5JS86mN9wkLKpaHbIamJNGfatDlu3uBvStNIKSC/CrnsFZ,iv:fW5+OJ2O8R9VB6YmKUP3jmKOHDEtZ4fBsVUmqbrkPjw=,tag:N04QCMG9/WV10Sd1lgGzhA==,type:str]\nservices:\n    acme:\n        env: ENC[AES256_GCM,data:1noClb0Z/zpobJtHpiGrc7yw3mLW3eUXijD29U5s6e+zVwAneTRp0Ijm3QqvRqfczzglYnAArBPXn7Xodt5ZXEwTWv1X49g65yevv7c+8S2Ka5D5gJfGqlJ6hzjuTOGdViLN+FRt4+5GWo62jvP6sGSlb6fj0COs+1GCHboOdbM5VGM=,iv:5yy5NcaKF3w9NS7DhuzzxJxjWsVxMIy9M9OQPv1KlDY=,tag:Ja4LlAJZXpiv0VkBilVffg==,type:str]\nsops:\n    kms: []\n    gcp_kms: []\n    azure_kv: []\n    hc_vault: []\n    age:\n        - recipient: age1sdnp5uxhdtujc78penv2gntnenzcfju7est4hslz6eqgfk26u9nskkk634\n          enc: |\n            -----BEGIN AGE ENCRYPTED FILE-----\n            YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBsaTNzNVdaYnY5cVdVSjZs\n            bkF6LzhIQnVQWFI5STV4VjdKMVF5ZDdyMXpVCms5bXI2c3U3aDdsRUovdUJFQitF\n            cnZyNEE4cDlBWGYrUEgweGYzdnhIcHMKLS0tIHFlWUZTeGxySERJYlR3a1B0NnA5\n            a0cwbGFQb2xqdXRxS214ckw4cjNwL2cKsxnsN8q1zPMBWO60Ndr0ozsaPzeGlPhm\n            pilwuo1I/xXqEfHBumwC089C5FT+XVmuychY3iox/zYvycdg3wGYIg==\n            -----END AGE ENCRYPTED FILE-----\n        - recipient: age1xj0vderjss6wvyuu5uw5gag6lhxzfh6qwfrewgpff5ttpfa03azsxc8600\n          enc: |\n            -----BEGIN AGE ENCRYPTED FILE-----\n            YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBjQ3dpYUdPdGk5OFNRc3U4\n            a05tNFFPVTRqaEFxQjJtSTV4TlB1Nm1USkVRCk9PdHNXczEzbGw0RGxsRTZ6YUVp\n            MmFSaGw5eGp0cFRPTjNTWWR6Y2wxd0UKLS0tIGJ4SjFaZU90eGNHNFl0VjB4Z3Fu\n            NVBIU1I2MDRqVGt3eGRzbjdDb0d5Yk0KGPo6sIu5pp6s1r/IhyNjfNgDwxl3SWM3\n            TMmIsx3iHsy+xgxUuGQXCsUkCy4YBzEjRVVtycCRfd5IAXryGhHEuQ==\n            -----END AGE ENCRYPTED FILE-----\n    lastmodified: \"2025-05-29T00:55:40Z\"\n    mac: ENC[AES256_GCM,data:6hQ80aWt4ll4ZW6sY7WDo7s6bUmhHDKr9gchYYb+BIn37hiMyyad4nKeKZkAUeSPi5KvXLv+dF/fwjsgS4to1BHfwrPkFIOp4f9m02736EOQ8zvW0vSnF/fV5ql1eOId3as6SttO03It2Gd2r6clpWbexykRygbRvziXyICAXtk=,iv:pxj6Tb4tkpMO/p1GlPE+/v03Dk3xzUThCFmjenvZBtc=,tag:c75AJK1z9dteVczhMTYYhg==,type:str]\n    pgp: []\n    unencrypted_suffix: _unencrypted\n    version: 3.9.4\n"
  },
  {
    "path": "scripts/backups.sh",
    "content": "set -Ee\n\nexport RESTIC_REPOSITORY=\"b2:barrucadu-backups-a19c48:nixfiles/restic\"\n\nCOMMAND=$1\nTARGET=$(hostname)\n\nif [[ -z \"$COMMAND\" ]]; then\n  COMMAND=snapshots\nelse\n  shift\nfi\n\nif [[ ! -f \"hosts/${TARGET}/secrets.yaml\" ]]; then\n  echo \"unknown host '${TARGET}'\"\n  exit 1\nfi\n\nsops_env=$(sops -d --extract '[\"nixfiles\"][\"restic-backups\"][\"env\"]' \"hosts/${TARGET}/secrets.yaml\")\n# shellcheck disable=SC2163\n# shellcheck disable=SC2086\nexport $sops_env\n\ncase \"$COMMAND\" in\n  check | snapshots)\n    restic \"$COMMAND\" \"$@\"\n    ;;\n\n  restore)\n    SNAPSHOT=$1\n    shift\n\n    if [[ -z \"$SNAPSHOT\" ]]; then\n      echo \"usage: 'restore <snapshot> [<restore-dir>]'\"\n      exit 1\n    fi\n\n    RESTORE_DIR=$1\n    if [[ -z \"$RESTORE_DIR\" ]]; then\n      RESTORE_DIR=\"/tmp/restic-restore-${SNAPSHOT}\"\n    else\n      shift\n    fi\n\n    restic restore \"$SNAPSHOT\" --target \"$RESTORE_DIR\" \"$@\"\n    ;;\n\n  *)\n    echo \"unknown command '$COMMAND'\"\n    exit 1\n    ;;\nesac\n"
  },
  {
    "path": "scripts/documentation.sh",
    "content": "set -e\n\nsed 's#See \\[the documentation\\].*##' < README.markdown > docs/src/README.md\n\npython3 - <<'EOF' > docs/src/hosts.md\nimport os\n\nprint(\"# Hosts\")\nprint(\"\")\n\nhosts = sorted([name for name in os.listdir(\"hosts\")])\nfor host in hosts:\n    source_file = f\"hosts/{host}/configuration.nix\"\n\n    if not os.path.isfile(source_file):\n        continue\n\n    print(f\"## {host}\")\n\n    has_doc = False\n    with open(source_file, \"r\") as f:\n        for line in f:\n            if line.startswith(\"#\"):\n                has_doc = True\n                print(line[1:].strip())\n            else:\n                break\n    if not has_doc:\n        print(\"This host has no description.\")\n    print(f\"\\n**Declared in:** [{source_file}](https://github.com/barrucadu/nixfiles/blob/master/{source_file})\")\n    print(\"\")\nEOF\n\npython3 - <<'EOF' > docs/src/host-templates.md\nimport os\n\nprint(\"# Host Templates\")\nprint(\"\")\n\ntemplates = sorted([name for name in os.listdir(\"shared/host-templates\") if name not in [\".\", \"..\"]])\nfor template in templates:\n    source_file = f\"shared/host-templates/{template}/default.nix\"\n\n    if not os.path.isfile(source_file):\n        continue\n\n    print(f\"## {template}\")\n\n    has_doc = False\n    with open(source_file, \"r\") as f:\n        for line in f:\n            if line.startswith(\"#\"):\n                has_doc = True\n                print(line[1:].strip())\n            else:\n                break\n    if not has_doc:\n        print(\"This template has no description.\")\n    print(f\"\\n**Declared in:** [{source_file}](https://github.com/barrucadu/nixfiles/blob/master/{source_file})\")\n    print(\"\")\nEOF\n\npython3 - <<'EOF' > docs/src/modules.md\nimport json\nimport os\n\nprint(\"# Modules\")\nprint(\"\")\n\nwith open(os.getenv(\"NIXOS_OPTIONS_JSON\"), \"r\") as f:\n    options = json.load(f)\n    del options[\"_module.args\"]\n\nmodules = {}\nfor key, defn in options.items():\n    module_name = defn[\"declarations\"][0].split(\"/shared/\")[1].replace(\"/options.nix\", \"\")\n    if module_name.startswith(\"host-templates/\"):\n        continue\n    if module_name == \"options.nix\":\n        # this is the top-level `shared` file\n        module_name = \"\"\n    modules.setdefault(module_name, []).append(key)\n\nfor module in sorted(modules.keys()):\n    module_name = \"&lt;shared&gt;\" if module == \"\" else module\n    source_file = f\"shared/{module}/default.nix\".replace(\"//\", \"/\")\n\n    print(f\"## {module_name}\")\n\n    has_doc = False\n    with open(source_file, \"r\") as f:\n        for line in f:\n            if line.startswith(\"#\"):\n                has_doc = True\n                print(line[1:].strip())\n            else:\n                break\n    if not has_doc:\n        print(\"This module has no description.\")\n\n    print(\"\\n**Options:**\\n\")\n    for option in modules[module]:\n        anchor = \"\".join(c for c in option if c.isalpha() or c in \"-_\").lower()\n        print(f\"- [`{option}`](./options.md#{anchor})\")\n    print(f\"\\n**Declared in:** [{source_file}](https://github.com/barrucadu/nixfiles/blob/master/{source_file})\")\n    print(\"\")\nEOF\n\npython3 - <<'EOF' > docs/src/options.md\nimport json\nimport os\n\nprint(\"# Options\")\nprint(\"\")\n\nwith open(os.getenv(\"NIXOS_OPTIONS_JSON\"), \"r\") as f:\n    options = json.load(f)\n    del options[\"_module.args\"]\n\nfor option in sorted(options.keys()):\n    defn = options[option]\n    option_name = option.replace(\"*\", \"\\\\*\").replace(\"<\", \"&lt;\").replace(\">\", \"&gt;\")\n    source_file = \"shared/\" + defn[\"declarations\"][0].split(\"/shared/\")[1]\n\n    print(f\"## {option_name}\")\n    if isinstance(defn[\"description\"], str):\n        print(f\"\\n{defn['description']}\")\n    else:\n        print(f\"\\n{defn['description']['text']}\")\n    print(f\"\\n**Type:** `{defn['type']}`\")\n    if \"default\" in defn:\n        print(f\"\\n**Default:** `{defn['default']['text']}`\")\n    if \"example\" in defn:\n        print(f\"\\n**Example:** `{defn['example']['text']}`\")\n    print(f\"\\n**Declared in:** [{source_file}](https://github.com/barrucadu/nixfiles/blob/master/{source_file})\")\n    print(\"\")\nEOF\n\nmdbook build docs\nmv docs/book _site\n"
  },
  {
    "path": "scripts/fmt.sh",
    "content": "nix fmt\n\nblack .\n"
  },
  {
    "path": "scripts/lint.sh",
    "content": "set -ex\n\n# TODO: add this back when the package is no longer broken\n# nix-linter -r .\n\n# SC2001: use pattern expansion over sed\nfind . -name '*.sh' -print0 | xargs -0 -n1 shellcheck -s bash -e SC2001\n\n# E501: line length (if black is happy, I'm happy)\n# E731: assign lambda to a variable\nfind . -name '*.py' -print0 | xargs -0 -n1 flake8 --ignore=E501,E731\n\nfind . -name options.nix -print0 | while IFS= read -r -d '' filename; do\n    if ! grep -q \"$filename\" flake.nix; then\n        exit 1\n    fi\ndone\n\nif git grep 'options.nixfiles' | grep -vE 'options.nix'; then\n    exit 1\nfi\n\nif git grep 'OnCalendar' | grep -vE 'scripts/lint.sh'; then\n    exit 1\nfi\n\nif git grep 'users.extraUsers' | grep -vE 'scripts/lint.sh'; then\n    exit 1\nfi\n\nif git grep 'virtualisation.oci-containers' | grep -vE 'scripts/lint.sh|shared/oci-containers/'; then\n    exit 1\nfi\n"
  },
  {
    "path": "scripts/secrets.sh",
    "content": "if [[ -z \"$1\" ]]; then\n  SECRETS_FILE=\"hosts/$(hostname)/secrets.yaml\"\nelif [[ -z \"$2\" ]]; then\n  SECRETS_FILE=\"hosts/${1}/secrets.yaml\"\nelse\n  SECRETS_FILE=\"hosts/${1}/secrets/${2}.yaml\"\nfi\n\nsops \"$SECRETS_FILE\"\n"
  },
  {
    "path": "shared/acme/default.nix",
    "content": "# Manage ACME (LetsEncrypt) certificates via Route53 DNS challenge.\n#\n# **Erase your darlings:** stores certificates in `persistDir`.\n{ config, lib, pkgs, ... }:\n\nwith lib;\nlet\n  baseDir =\n    if config.nixfiles.eraseYourDarlings.enable\n    then toString config.nixfiles.eraseYourDarlings.persistDir\n    else \"\";\n\n  certDir = \"${baseDir}/var/lib/acme\";\n\n  copyCertsFor = domain: ''\n    mkdir -p ${certDir} || true\n    rm -r ${certDir}/${domain} || true\n    cp -a /var/lib/acme/${domain} ${certDir}/${domain}\n  '';\n\n  mkCert = domain: cfg: nameValuePair domain {\n    inherit domain;\n    inherit (cfg) extraDomainNames;\n    group = config.services.caddy.group;\n    postRun = if config.nixfiles.eraseYourDarlings.enable then copyCertsFor domain else \"\";\n  };\n\n  cfg = config.nixfiles.acme;\nin\n{\n  imports = [\n    ./options.nix\n  ];\n\n  config = mkIf cfg.enable {\n    security.acme = {\n      acceptTerms = true;\n\n      defaults = {\n        email = \"mike@barrucadu.co.uk\";\n        dnsProvider = \"route53\";\n        dnsPropagationCheck = true;\n        environmentFile = cfg.environmentFile;\n        reloadServices = [ \"caddy\" ];\n      };\n\n      certs = mapAttrs' mkCert cfg.domains;\n    };\n\n    users.users.acme.uid = 986;\n    users.groups.acme.gid = 989;\n  };\n}\n"
  },
  {
    "path": "shared/acme/options.nix",
    "content": "{ lib, ... }:\n\nwith lib;\n\n{\n  options.nixfiles.acme = {\n    enable = mkOption {\n      type = types.bool;\n      default = false;\n      description = ''\n        Enable the ACME DNS-01 service.\n      '';\n    };\n\n    environmentFile = mkOption {\n      type = types.path;\n      description = ''\n        Environment file with AWS Route53 credentials for the ACME DNS-01 challenge.\n      '';\n    };\n\n    domains = mkOption {\n      type = types.attrsOf (types.submodule {\n        options = {\n          extraDomainNames = mkOption {\n            type = types.listOf types.str;\n            default = [ ];\n            description = ''\n              Extra domain names under this certificate.\n            '';\n          };\n        };\n      });\n      description = ''\n        Attrset of domain / certificate definitions.\n      '';\n    };\n  };\n}\n"
  },
  {
    "path": "shared/bookdb/default.nix",
    "content": "# [bookdb][] is a webapp to keep track of all my books, with a public instance\n# on [bookdb.barrucadu.co.uk][].\n#\n# bookdb uses a containerised elasticsearch database, it also stores uploaded\n# book cover images.\n#\n# **Backups:** the elasticsearch database and uploaded files.\n#\n# **Erase your darlings:** overrides the `dataDir`.\n#\n# [bookdb]: https://github.com/barrucadu/bookdb\n# [bookdb.barrucadu.co.uk]: https://bookdb.barrucadu.co.uk/\n{ config, lib, pkgs, ... }:\n\nwith lib;\nlet\n  cfg = config.nixfiles.bookdb;\n  backend = config.nixfiles.oci-containers.backend;\nin\n{\n  imports = [\n    ./erase-your-darlings.nix\n    ./options.nix\n    ./remote-sync-receive.nix\n    ./remote-sync-send.nix\n  ];\n\n  config = mkIf cfg.enable {\n    systemd.services.bookdb = {\n      description = \"barrucadu/bookdb webapp\";\n      wantedBy = [ \"multi-user.target\" ];\n      after = [ \"network-online.target\" \"${backend}-bookdb-db.service\" ];\n      wants = [ \"network-online.target\" ];\n      requires = [ \"${backend}-bookdb-db.service\" ];\n      path = [ pkgs.imagemagick ];\n      serviceConfig = {\n        ExecStart = \"${pkgs.nixfiles.bookdb}/bin/bookdb ${optionalString (!cfg.readOnly) \"--allow-writes\"} ${./uuids.yaml}\";\n        Restart = \"always\";\n        User = config.users.users.bookdb.name;\n      };\n      environment = {\n        BOOKDB_ADDRESS = \"127.0.0.1:${toString cfg.port}\";\n        BOOKDB_UPLOADS_DIR = \"${cfg.dataDir}/covers\";\n        ES_HOST = \"http://127.0.0.1:${toString cfg.elasticsearchPort}\";\n        RUST_LOG = cfg.logLevel;\n        RUST_LOG_FORMAT = cfg.logFormat;\n      };\n    };\n\n    nixfiles.oci-containers.pods.bookdb.containers.db = {\n      image = \"mirror.gcr.io/elasticsearch:${cfg.elasticsearchTag}\";\n      environment = {\n        \"http.host\" = \"0.0.0.0\";\n        \"discovery.type\" = \"single-node\";\n        \"xpack.security.enabled\" = \"false\";\n        \"ES_JAVA_OPTS\" = \"-Xms256M -Xmx256M\";\n      };\n      ports = [{ host = cfg.elasticsearchPort; inner = 9200; }];\n      volumes = [{ name = \"esdata\"; inner = \"/usr/share/elasticsearch/data\"; }];\n    };\n\n    users.users.bookdb = {\n      uid = 998;\n      description = \"bookdb service user\";\n      home = cfg.dataDir;\n      createHome = true;\n      isSystemUser = true;\n      group = \"nogroup\";\n    };\n\n    nixfiles.restic-backups.backups.bookdb = {\n      prepareCommand = ''\n        env ES_HOST=${config.systemd.services.bookdb.environment.ES_HOST} ${pkgs.nixfiles.bookdb}/bin/bookdb_ctl export-index > elasticsearch-dump.json\n      '';\n      paths = [\n        cfg.dataDir\n        \"elasticsearch-dump.json\"\n      ];\n    };\n  };\n}\n"
  },
  {
    "path": "shared/bookdb/erase-your-darlings.nix",
    "content": "{ config, lib, ... }:\n\nwith lib;\nlet\n  cfg = config.nixfiles.bookdb;\n  eyd = config.nixfiles.eraseYourDarlings;\nin\n{\n  config = mkIf (cfg.enable && eyd.enable) {\n    nixfiles.bookdb.dataDir = \"${toString eyd.persistDir}/srv/bookdb\";\n  };\n}\n"
  },
  {
    "path": "shared/bookdb/options.nix",
    "content": "{ lib, ... }:\n\nwith lib;\n\n{\n  options.nixfiles.bookdb = {\n    enable = mkOption {\n      type = types.bool;\n      default = false;\n      description = ''\n        Enable the [bookdb](https://github.com/barrucadu/bookdb) service.\n      '';\n    };\n\n    port = mkOption {\n      type = types.int;\n      default = 46667;\n      description = ''\n        Port (on 127.0.0.1) to expose bookdb on.\n      '';\n    };\n\n    elasticsearchPort = mkOption {\n      type = types.int;\n      default = 47164;\n      description = ''\n        Port (on 127.0.0.1) to expose the elasticsearch container on.\n      '';\n    };\n\n    elasticsearchTag = mkOption {\n      type = types.str;\n      default = \"9.0.1\";\n      description = ''\n        Tag to use of the `elasticsearch` container image.\n      '';\n    };\n\n    readOnly = mkOption {\n      type = types.bool;\n      default = false;\n      description = ''\n        Launch the service in \"read-only\" mode.  Enable this if exposing it to a\n        public network.\n      '';\n    };\n\n    dataDir = mkOption {\n      type = types.str;\n      default = \"/srv/bookdb\";\n      description = ''\n        Directory to store uploaded files to.\n\n        If the `erase-your-darlings` module is enabled, this is overridden to be\n        on the persistent volume.\n      '';\n    };\n\n    logLevel = mkOption {\n      type = types.str;\n      default = \"info\";\n      description = ''\n        Verbosity of the log messages.\n      '';\n    };\n\n    logFormat = mkOption {\n      type = types.str;\n      default = \"json,no-time\";\n      description = ''\n        Format of the log messages.\n      '';\n    };\n\n    remoteSync = {\n      receive = {\n        enable = mkOption {\n          type = types.bool;\n          default = false;\n          description = ''\n            Enable receiving push-based remote sync from other hosts.\n          '';\n        };\n        authorizedKeys = mkOption {\n          type = types.listOf types.str;\n          default = [ ];\n          description = ''\n            SSH public keys to allow pushes from.\n          '';\n        };\n      };\n\n      send = {\n        enable = mkOption {\n          type = types.bool;\n          default = false;\n          description = ''\n            Enable periodically pushing local state to other hosts.\n          '';\n        };\n        sshKeyFile = mkOption {\n          type = types.str;\n          description = ''\n            Path to SSH private key.\n          '';\n        };\n        targets = mkOption {\n          type = types.listOf types.str;\n          default = [ ];\n          description = ''\n            Hosts to push to.\n          '';\n        };\n      };\n    };\n  };\n}\n"
  },
  {
    "path": "shared/bookdb/remote-sync-receive.nix",
    "content": "# See remote-sync-send.nix\n{ config, lib, pkgs, ... }:\n\nwith lib;\nlet\n  cfg = config.nixfiles.bookdb.remoteSync.receive;\nin\n{\n  config = mkIf cfg.enable {\n    users.users.bookdb-remote-sync-receive = {\n      uid = 985;\n      home = \"/var/lib/bookdb-remote-sync-receive\";\n      createHome = true;\n      isSystemUser = true;\n      openssh.authorizedKeys.keys = cfg.authorizedKeys;\n      shell = pkgs.bashInteractive;\n      group = \"nogroup\";\n      packages =\n        let\n          receive-covers = ''\n            if [[ ! -d ~/bookdb-covers ]]; then\n              echo \"bookdb-covers does not exist\"\n              exit 1\n            fi\n\n            /run/wrappers/bin/sudo ${pkgs.rsync}/bin/rsync -a --delete ~/bookdb-covers/ ${config.systemd.services.bookdb.environment.BOOKDB_UPLOADS_DIR} || exit 1\n            /run/wrappers/bin/sudo ${pkgs.coreutils}/bin/chown -R ${config.users.users.bookdb.name}.nogroup ${config.systemd.services.bookdb.environment.BOOKDB_UPLOADS_DIR} || exit 1\n          '';\n          receive-elasticsearch = ''\n            env ES_HOST=${config.systemd.services.bookdb.environment.ES_HOST} \\\n                ${pkgs.nixfiles.bookdb}/bin/bookdb_ctl import-index --drop-existing\n          '';\n        in\n        [\n          (pkgs.writeShellScriptBin \"receive-covers\" receive-covers)\n          (pkgs.writeShellScriptBin \"receive-elasticsearch\" receive-elasticsearch)\n        ];\n    };\n\n    security.sudo.extraRules = [\n      {\n        users = [ config.users.users.bookdb-remote-sync-receive.name ];\n        commands = [\n          { command = \"${pkgs.rsync}/bin/rsync -a --delete ${config.users.users.bookdb-remote-sync-receive.home}/bookdb-covers/ ${config.systemd.services.bookdb.environment.BOOKDB_UPLOADS_DIR}\"; options = [ \"NOPASSWD\" ]; }\n          { command = \"${pkgs.coreutils}/bin/chown -R ${config.users.users.bookdb.name}.nogroup ${config.systemd.services.bookdb.environment.BOOKDB_UPLOADS_DIR}\"; options = [ \"NOPASSWD\" ]; }\n        ];\n      }\n    ];\n  };\n}\n"
  },
  {
    "path": "shared/bookdb/remote-sync-send.nix",
    "content": "# See remote-sync-receive.nix\n{ config, lib, pkgs, ... }:\n\nwith lib;\nlet\n  cfg = config.nixfiles.bookdb.remoteSync.send;\n\n  toService = target: {\n    name = \"bookdb-sync-${target}\";\n    value = {\n      description = \"Upload bookdb data to ${target}\";\n      startAt = \"*:15\";\n      path = with pkgs; [ openssh rsync ];\n      serviceConfig = {\n        ExecStart = pkgs.writeShellScript \"bookdb-sync\" ''\n          set -ex\n\n          cd $RUNTIME_DIRECTORY\n\n          /run/wrappers/bin/sudo ${pkgs.coreutils}/bin/cp --preserve=timestamps -r ${config.systemd.services.bookdb.environment.BOOKDB_UPLOADS_DIR}/ bookdb-covers\n          trap \"/run/wrappers/bin/sudo ${pkgs.coreutils}/bin/rm -rf bookdb-covers\" EXIT\n          rsync -az\\\n                -e \"ssh -i $SSH_KEY_FILE -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no\" \\\n                bookdb-covers/ \\\n                bookdb-remote-sync-receive@${target}:~/bookdb-covers/\n          ssh -i \"$SSH_KEY_FILE\" \\\n              -o UserKnownHostsFile=/dev/null \\\n              -o StrictHostKeyChecking=no \\\n              bookdb-remote-sync-receive@${target} \\\n              receive-covers\n\n          env \"ES_HOST=$ES_HOST\" \\\n              ${pkgs.nixfiles.bookdb}/bin/bookdb_ctl export-index | \\\n          ssh -i \"$SSH_KEY_FILE\" \\\n              -o UserKnownHostsFile=/dev/null \\\n              -o StrictHostKeyChecking=no \\\n              bookdb-remote-sync-receive@${target} \\\n              receive-elasticsearch\n        '';\n        User = config.users.users.bookdb-remote-sync-send.name;\n        RuntimeDirectory = \"bookdb-sync-${target}\";\n      };\n      environment = {\n        ES_HOST = config.systemd.services.bookdb.environment.ES_HOST;\n        SSH_KEY_FILE = cfg.sshKeyFile;\n      };\n    };\n  };\nin\n{\n  config = mkIf cfg.enable {\n    users.users.bookdb-remote-sync-send = {\n      uid = 985;\n      isSystemUser = true;\n      shell = pkgs.bashInteractive;\n      group = \"nogroup\";\n    };\n\n    systemd.services = listToAttrs (map toService cfg.targets);\n\n    security.sudo.extraRules = [\n      {\n        users = [ config.users.users.bookdb-remote-sync-send.name ];\n        commands = [\n          { command = \"${pkgs.coreutils}/bin/cp --preserve=timestamps -r ${config.systemd.services.bookdb.environment.BOOKDB_UPLOADS_DIR}/ bookdb-covers\"; options = [ \"NOPASSWD\" ]; }\n          { command = \"${pkgs.coreutils}/bin/rm -rf bookdb-covers\"; options = [ \"NOPASSWD\" ]; }\n        ];\n      }\n    ];\n  };\n}\n"
  },
  {
    "path": "shared/bookdb/uuids.yaml",
    "content": "# shared between nyarlathotep & carcosa\nlocations:\n- name: House\n  slug: be60be7b-a10f-42e1-8769-d43f12cad02d\n- name: Packed\n  slug: edd8cfea-820d-4b08-bbb7-b50687279ff5\n- name: Missing\n  slug: 6a233e5e-3b64-4169-ac67-cf46113afd97\n\ncategories:\n- name: Light Novels + Manga\n  slug: a3bbb1c6-5ff8-4ddf-81f4-820593a2a5ff\n\n- name: Nonfiction\n  slug: 58c63aea-72b6-4988-96a0-aca572661303\n  children:\n  - name: Computer Science + Software Engineering\n    slug: afc7135b-bf67-4284-bcc1-2bbd3386aea3\n  - name: Kitchen, Food, + Recipe\n    slug: b5451ba6-a3ef-4c27-99fc-a07d8cd54161\n  - name: History\n    slug: 6e7ffdc5-9571-43b3-800b-6e9fc0e0bb92\n    children:\n    - name: Ancient Near East\n      slug: e859b37c-454b-40a3-afef-f7678f487377\n    - name: Greece + Rome\n      slug: 22987d70-6910-44e5-a7db-8979c0030400\n    - name: Modern\n      slug: b3b648d8-e64e-446e-8553-9de38070d78f\n    - name: Miscellaneous\n      slug: e3553aae-c91e-4c77-a26d-d1a63d755e69\n  - name: Economics + Finance\n    slug: 8a8b44cd-65c1-49ed-a126-2b05acc82539\n  - name: Politics + Philosophy\n    slug: ac4706f3-54c3-4e6d-a72d-85321d9dcd72\n  - name: Miscellaneous\n    slug: fb2dd601-883a-4254-a294-fcf0a0f98d2f\n\n- name: Prose Fiction + Graphic Novels\n  slug: 590ac55d-0644-4a71-b902-587faa5b03d9\n\n- name: Religion, Mythology, + Folklore\n  slug: a7d83bc9-0352-4fb5-a9dc-68428562a17f\n\n- name: RPG\n  slug: cf921942-f65a-40e3-8e98-2f565bb8d033\n  children:\n  - name: ALIEN\n    slug: e5a2fe09-f4b6-447a-9d83-8e2a89a9c605\n  - name: Call of Cthulhu\n    slug: 08bc011e-1a42-4d23-961a-803d786d7e58\n  - name: Delta Green\n    slug: 3aa3b315-a93a-42af-b221-c36ddfb556d0\n  - name: \"D&D + OSR\"\n    slug: 99569e4e-d52c-4e3b-8c2b-8e69e2ff29b7\n  - name: The One Ring\n    slug: 833cfe57-0092-4acb-9bb2-5211f5c89016\n  - name: Traveller\n    slug: d8d4ee9d-e5d8-4d4d-8a78-65ebc23fc451\n  - name: Solo\n    slug: 461dd073-f203-4401-bc09-45c01d98b20b\n  - name: Miscellaneous\n    slug: 70196ec9-dd61-4241-afc9-dd6be7be30a6\n\n- name: Verse\n  slug: 217f8eaa-b54a-466c-83f8-3f569f46732e\n\n- name: To Donate\n  slug: 957d6a70-5dfc-46e2-8e3c-2f193878b2a5\n"
  },
  {
    "path": "shared/bookmarks/default.nix",
    "content": "# [bookmarks][] is a webapp to keep track of all my bookmarks, with a public\n# instance on [bookmarks.barrucadu.co.uk][].\n#\n# bookmarks uses a containerised elasticsearch database.\n#\n# **Backups:** the elasticsearch database.\n#\n# [bookmarks]: https://github.com/barrucadu/bookmarks\n# [bookmarks.barrucadu.co.uk]: https://bookmarks.barrucadu.co.uk/\n{ config, lib, pkgs, ... }:\n\nwith lib;\nlet\n  cfg = config.nixfiles.bookmarks;\n  backend = config.nixfiles.oci-containers.backend;\nin\n{\n  imports = [\n    ./options.nix\n    ./remote-sync-receive.nix\n    ./remote-sync-send.nix\n  ];\n\n  config = mkIf cfg.enable {\n    systemd.services.bookmarks = {\n      description = \"barrucadu/bookmarks webapp\";\n      wantedBy = [ \"multi-user.target\" ];\n      after = [ \"network-online.target\" \"${backend}-bookmarks-db.service\" ];\n      wants = [ \"network-online.target\" ];\n      requires = [ \"${backend}-bookmarks-db.service\" ];\n      serviceConfig = {\n        ExecStart = \"${pkgs.nixfiles.bookmarks}/bin/bookmarks ${optionalString (!cfg.readOnly) \"--allow-writes\"}\";\n        DynamicUser = \"true\";\n        Restart = \"always\";\n      };\n      environment = {\n        BOOKMARKS_ADDRESS = \"127.0.0.1:${toString cfg.port}\";\n        ES_HOST = \"http://127.0.0.1:${toString cfg.elasticsearchPort}\";\n        RUST_LOG = cfg.logLevel;\n        RUST_LOG_FORMAT = cfg.logFormat;\n      };\n    };\n\n    nixfiles.oci-containers.pods.bookmarks.containers.db = {\n      image = \"mirror.gcr.io/elasticsearch:${cfg.elasticsearchTag}\";\n      environment = {\n        \"http.host\" = \"0.0.0.0\";\n        \"discovery.type\" = \"single-node\";\n        \"xpack.security.enabled\" = \"false\";\n        \"ES_JAVA_OPTS\" = \"-Xms512M -Xmx512M\";\n      };\n      ports = [{ host = cfg.elasticsearchPort; inner = 9200; }];\n      volumes = [{ name = \"esdata\"; inner = \"/usr/share/elasticsearch/data\"; }];\n    };\n\n    nixfiles.restic-backups.backups.bookmarks = {\n      prepareCommand = ''\n        env ES_HOST=${config.systemd.services.bookmarks.environment.ES_HOST} ${pkgs.nixfiles.bookmarks}/bin/bookmarks_ctl export-index > elasticsearch-dump.json\n      '';\n      paths = [\n        \"elasticsearch-dump.json\"\n      ];\n    };\n  };\n}\n"
  },
  {
    "path": "shared/bookmarks/options.nix",
    "content": "{ lib, ... }:\n\nwith lib;\n\n{\n  options.nixfiles.bookmarks = {\n    enable = mkOption {\n      type = types.bool;\n      default = false;\n      description = ''\n        Enable the [bookmarks](https://github.com/barrucadu/bookmarks) service.\n      '';\n    };\n\n    port = mkOption {\n      type = types.int;\n      default = 48372;\n      description = ''\n        Port (on 127.0.0.1) to expose bookmarks on.\n      '';\n    };\n\n    elasticsearchPort = mkOption {\n      type = types.int;\n      default = 43389;\n      description = ''\n        Port (on 127.0.0.1) to expose the elasticsearch container on.\n      '';\n    };\n\n    elasticsearchTag = mkOption {\n      type = types.str;\n      default = \"9.0.1\";\n      description = ''\n        Tag to use of the `elasticsearch` container image.\n      '';\n    };\n\n    readOnly = mkOption {\n      type = types.bool;\n      default = false;\n      description = ''\n        Launch the service in \"read-only\" mode.  Enable this if exposing it to a\n        public network.\n      '';\n    };\n\n    logLevel = mkOption {\n      type = types.str;\n      default = \"info\";\n      description = ''\n        Verbosity of the log messages.\n      '';\n    };\n\n    logFormat = mkOption {\n      type = types.str;\n      default = \"json,no-time\";\n      description = ''\n        Format of the log messages.\n      '';\n    };\n\n    remoteSync = {\n      receive = {\n        enable = mkOption {\n          type = types.bool;\n          default = false;\n          description = ''\n            Enable receiving push-based remote sync from other hosts.\n          '';\n        };\n        authorizedKeys = mkOption {\n          type = types.listOf types.str;\n          default = [ ];\n          description = ''\n            SSH public keys to allow pushes from.\n          '';\n        };\n      };\n\n      send = {\n        enable = mkOption {\n          type = types.bool;\n          default = false;\n          description = ''\n            Enable periodically pushing local state to other hosts.\n          '';\n        };\n        sshKeyFile = mkOption {\n          type = types.str;\n          description = ''\n            Path to SSH private key.\n          '';\n        };\n        targets = mkOption {\n          type = types.listOf types.str;\n          default = [ ];\n          description = ''\n            Hosts to push to.\n          '';\n        };\n      };\n    };\n  };\n}\n"
  },
  {
    "path": "shared/bookmarks/remote-sync-receive.nix",
    "content": "# see remote-sync-send.nix\n{ config, lib, pkgs, ... }:\n\nwith lib;\nlet\n  cfg = config.nixfiles.bookmarks.remoteSync.receive;\nin\n{\n  config = mkIf cfg.enable {\n    users.users.bookmarks-remote-sync-receive = {\n      uid = 984;\n      home = \"/var/lib/bookmarks-remote-sync-receive\";\n      createHome = true;\n      isSystemUser = true;\n      openssh.authorizedKeys.keys = cfg.authorizedKeys;\n      shell = pkgs.bashInteractive;\n      group = \"nogroup\";\n      packages =\n        let\n          receive-elasticsearch = ''\n            env ES_HOST=${config.systemd.services.bookmarks.environment.ES_HOST} \\\n                ${pkgs.nixfiles.bookmarks}/bin/bookmarks_ctl import-index --drop-existing\n          '';\n        in\n        [\n          (pkgs.writeShellScriptBin \"receive-elasticsearch\" receive-elasticsearch)\n        ];\n    };\n  };\n}\n"
  },
  {
    "path": "shared/bookmarks/remote-sync-send.nix",
    "content": "# see remote-sync-receive.nix\n{ config, lib, pkgs, ... }:\n\nwith lib;\nlet\n  cfg = config.nixfiles.bookmarks.remoteSync.send;\n\n  toService = target: {\n    name = \"bookmarks-sync-${target}\";\n    value = {\n      description = \"Upload bookmarks data to ${target}\";\n      startAt = \"*:15\";\n      path = with pkgs; [ openssh ];\n      serviceConfig = {\n        ExecStart = pkgs.writeShellScript \"bookmarks-sync\" ''\n          set -ex\n\n          env \"ES_HOST=$ES_HOST\" \\\n              ${pkgs.nixfiles.bookmarks}/bin/bookmarks_ctl export-index | \\\n          ssh -i \"$SSH_KEY_FILE\" \\\n              -o UserKnownHostsFile=/dev/null \\\n              -o StrictHostKeyChecking=no \\\n              bookmarks-remote-sync-receive@${target} \\\n              receive-elasticsearch\n        '';\n        User = config.users.users.bookmarks-remote-sync-send.name;\n      };\n      environment = {\n        ES_HOST = config.systemd.services.bookmarks.environment.ES_HOST;\n        SSH_KEY_FILE = cfg.sshKeyFile;\n      };\n    };\n  };\nin\n{\n  config = mkIf cfg.enable {\n    users.users.bookmarks-remote-sync-send = {\n      uid = 984;\n      isSystemUser = true;\n      shell = pkgs.bashInteractive;\n      group = \"nogroup\";\n    };\n\n    systemd.services = listToAttrs (map toService cfg.targets);\n  };\n}\n"
  },
  {
    "path": "shared/dashboards/node-stats-detailed.json",
    "content": "{\n  \"annotations\": {\n    \"list\": [\n      {\n        \"$$hashKey\": \"object:1058\",\n        \"builtIn\": 1,\n        \"datasource\": {\n          \"type\": \"datasource\",\n          \"uid\": \"grafana\"\n        },\n        \"enable\": true,\n        \"hide\": true,\n        \"iconColor\": \"rgba(0, 211, 255, 1)\",\n        \"name\": \"Annotations & Alerts\",\n        \"target\": {\n          \"limit\": 100,\n          \"matchAny\": false,\n          \"tags\": [],\n          \"type\": \"dashboard\"\n        },\n        \"type\": \"dashboard\"\n      }\n    ]\n  },\n  \"editable\": true,\n  \"fiscalYearStartMonth\": 0,\n  \"gnetId\": 1860,\n  \"graphTooltip\": 1,\n  \"links\": [\n    {\n      \"icon\": \"external link\",\n      \"tags\": [],\n      \"targetBlank\": true,\n      \"title\": \"GitHub\",\n      \"type\": \"link\",\n      \"url\": \"https://github.com/rfmoz/grafana-dashboards\"\n    },\n    {\n      \"icon\": \"external link\",\n      \"tags\": [],\n      \"targetBlank\": true,\n      \"title\": \"Grafana\",\n      \"type\": \"link\",\n      \"url\": \"https://grafana.com/grafana/dashboards/1860\"\n    }\n  ],\n  \"liveNow\": false,\n  \"panels\": [\n    {\n      \"collapsed\": false,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"000000001\"\n      },\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 0\n      },\n      \"id\": 261,\n      \"panels\": [],\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"000000001\"\n          },\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Quick CPU / Mem / Disk\",\n      \"type\": \"row\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"description\": \"Resource pressure via PSI\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"decimals\": 1,\n          \"links\": [],\n          \"mappings\": [],\n          \"max\": 1,\n          \"min\": 0,\n          \"thresholds\": {\n            \"mode\": \"percentage\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"dark-yellow\",\n                \"value\": 70\n              },\n              {\n                \"color\": \"dark-red\",\n                \"value\": 90\n              }\n            ]\n          },\n          \"unit\": \"percentunit\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 4,\n        \"w\": 3,\n        \"x\": 0,\n        \"y\": 1\n      },\n      \"id\": 323,\n      \"options\": {\n        \"displayMode\": \"basic\",\n        \"maxVizHeight\": 300,\n        \"minVizHeight\": 10,\n        \"minVizWidth\": 0,\n        \"namePlacement\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showUnfilled\": true,\n        \"sizing\": \"auto\",\n        \"text\": {},\n        \"valueMode\": \"color\"\n      },\n      \"pluginVersion\": \"10.4.12\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": false,\n          \"expr\": \"irate(node_pressure_cpu_waiting_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n          \"format\": \"time_series\",\n          \"instant\": true,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"CPU\",\n          \"range\": false,\n          \"refId\": \"CPU some\",\n          \"step\": 240\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": false,\n          \"expr\": \"irate(node_pressure_memory_waiting_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"instant\": true,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"Mem\",\n          \"range\": false,\n          \"refId\": \"Memory some\",\n          \"step\": 240\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": false,\n          \"expr\": \"irate(node_pressure_io_waiting_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"instant\": true,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"I/O\",\n          \"range\": false,\n          \"refId\": \"I/O some\",\n          \"step\": 240\n        }\n      ],\n      \"title\": \"Pressure\",\n      \"type\": \"bargauge\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"description\": \"Busy state of all CPU cores together\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"decimals\": 1,\n          \"mappings\": [\n            {\n              \"options\": {\n                \"match\": \"null\",\n                \"result\": {\n                  \"text\": \"N/A\"\n                }\n              },\n              \"type\": \"special\"\n            }\n          ],\n          \"max\": 100,\n          \"min\": 0,\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"rgba(50, 172, 45, 0.97)\",\n                \"value\": null\n              },\n              {\n                \"color\": \"rgba(237, 129, 40, 0.89)\",\n                \"value\": 85\n              },\n              {\n                \"color\": \"rgba(245, 54, 54, 0.9)\",\n                \"value\": 95\n              }\n            ]\n          },\n          \"unit\": \"percent\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 4,\n        \"w\": 3,\n        \"x\": 3,\n        \"y\": 1\n      },\n      \"id\": 20,\n      \"options\": {\n        \"minVizHeight\": 75,\n        \"minVizWidth\": 75,\n        \"orientation\": \"auto\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showThresholdLabels\": false,\n        \"showThresholdMarkers\": true,\n        \"sizing\": \"auto\"\n      },\n      \"pluginVersion\": \"10.4.12\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": false,\n          \"expr\": \"100 * (1 - avg(rate(node_cpu_seconds_total{mode=\\\"idle\\\", instance=\\\"$node\\\"}[$__rate_interval])))\",\n          \"hide\": false,\n          \"instant\": true,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"\",\n          \"range\": false,\n          \"refId\": \"A\",\n          \"step\": 240\n        }\n      ],\n      \"title\": \"CPU Busy\",\n      \"type\": \"gauge\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"description\": \"System load  over all CPU cores together\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"decimals\": 1,\n          \"mappings\": [\n            {\n              \"options\": {\n                \"match\": \"null\",\n                \"result\": {\n                  \"text\": \"N/A\"\n                }\n              },\n              \"type\": \"special\"\n            }\n          ],\n          \"max\": 100,\n          \"min\": 0,\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"rgba(50, 172, 45, 0.97)\",\n                \"value\": null\n              },\n              {\n                \"color\": \"rgba(237, 129, 40, 0.89)\",\n                \"value\": 85\n              },\n              {\n                \"color\": \"rgba(245, 54, 54, 0.9)\",\n                \"value\": 95\n              }\n            ]\n          },\n          \"unit\": \"percent\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 4,\n        \"w\": 3,\n        \"x\": 6,\n        \"y\": 1\n      },\n      \"id\": 155,\n      \"options\": {\n        \"minVizHeight\": 75,\n        \"minVizWidth\": 75,\n        \"orientation\": \"auto\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showThresholdLabels\": false,\n        \"showThresholdMarkers\": true,\n        \"sizing\": \"auto\"\n      },\n      \"pluginVersion\": \"10.4.12\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": false,\n          \"expr\": \"scalar(node_load1{instance=\\\"$node\\\",job=\\\"$job\\\"}) * 100 / count(count(node_cpu_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\"}) by (cpu))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"instant\": true,\n          \"intervalFactor\": 1,\n          \"range\": false,\n          \"refId\": \"A\",\n          \"step\": 240\n        }\n      ],\n      \"title\": \"Sys Load\",\n      \"type\": \"gauge\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"description\": \"Non available RAM memory\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"decimals\": 1,\n          \"mappings\": [],\n          \"max\": 100,\n          \"min\": 0,\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"rgba(50, 172, 45, 0.97)\",\n                \"value\": null\n              },\n              {\n                \"color\": \"rgba(237, 129, 40, 0.89)\",\n                \"value\": 80\n              },\n              {\n                \"color\": \"rgba(245, 54, 54, 0.9)\",\n                \"value\": 90\n              }\n            ]\n          },\n          \"unit\": \"percent\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 4,\n        \"w\": 3,\n        \"x\": 9,\n        \"y\": 1\n      },\n      \"hideTimeOverride\": false,\n      \"id\": 16,\n      \"options\": {\n        \"minVizHeight\": 75,\n        \"minVizWidth\": 75,\n        \"orientation\": \"auto\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showThresholdLabels\": false,\n        \"showThresholdMarkers\": true,\n        \"sizing\": \"auto\"\n      },\n      \"pluginVersion\": \"10.4.12\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": false,\n          \"expr\": \"((node_memory_MemTotal_bytes{instance=\\\"$node\\\", job=\\\"$job\\\"} - node_memory_MemFree_bytes{instance=\\\"$node\\\", job=\\\"$job\\\"}) / node_memory_MemTotal_bytes{instance=\\\"$node\\\", job=\\\"$job\\\"}) * 100\",\n          \"format\": \"time_series\",\n          \"hide\": true,\n          \"instant\": true,\n          \"intervalFactor\": 1,\n          \"range\": false,\n          \"refId\": \"A\",\n          \"step\": 240\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": false,\n          \"expr\": \"(1 - (node_memory_MemAvailable_bytes{instance=\\\"$node\\\", job=\\\"$job\\\"} / node_memory_MemTotal_bytes{instance=\\\"$node\\\", job=\\\"$job\\\"})) * 100\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"instant\": true,\n          \"intervalFactor\": 1,\n          \"range\": false,\n          \"refId\": \"B\",\n          \"step\": 240\n        }\n      ],\n      \"title\": \"RAM Used\",\n      \"type\": \"gauge\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"description\": \"Used Swap\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"decimals\": 1,\n          \"mappings\": [\n            {\n              \"options\": {\n                \"match\": \"null\",\n                \"result\": {\n                  \"text\": \"N/A\"\n                }\n              },\n              \"type\": \"special\"\n            }\n          ],\n          \"max\": 100,\n          \"min\": 0,\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"rgba(50, 172, 45, 0.97)\",\n                \"value\": null\n              },\n              {\n                \"color\": \"rgba(237, 129, 40, 0.89)\",\n                \"value\": 10\n              },\n              {\n                \"color\": \"rgba(245, 54, 54, 0.9)\",\n                \"value\": 25\n              }\n            ]\n          },\n          \"unit\": \"percent\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 4,\n        \"w\": 3,\n        \"x\": 12,\n        \"y\": 1\n      },\n      \"id\": 21,\n      \"options\": {\n        \"minVizHeight\": 75,\n        \"minVizWidth\": 75,\n        \"orientation\": \"auto\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showThresholdLabels\": false,\n        \"showThresholdMarkers\": true,\n        \"sizing\": \"auto\"\n      },\n      \"pluginVersion\": \"10.4.12\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": false,\n          \"expr\": \"((node_memory_SwapTotal_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"} - node_memory_SwapFree_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}) / (node_memory_SwapTotal_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"})) * 100\",\n          \"instant\": true,\n          \"intervalFactor\": 1,\n          \"range\": false,\n          \"refId\": \"A\",\n          \"step\": 240\n        }\n      ],\n      \"title\": \"SWAP Used\",\n      \"type\": \"gauge\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"description\": \"Used Root FS\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"decimals\": 1,\n          \"mappings\": [\n            {\n              \"options\": {\n                \"match\": \"null\",\n                \"result\": {\n                  \"text\": \"N/A\"\n                }\n              },\n              \"type\": \"special\"\n            }\n          ],\n          \"max\": 100,\n          \"min\": 0,\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"rgba(50, 172, 45, 0.97)\",\n                \"value\": null\n              },\n              {\n                \"color\": \"rgba(237, 129, 40, 0.89)\",\n                \"value\": 80\n              },\n              {\n                \"color\": \"rgba(245, 54, 54, 0.9)\",\n                \"value\": 90\n              }\n            ]\n          },\n          \"unit\": \"percent\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 4,\n        \"w\": 3,\n        \"x\": 15,\n        \"y\": 1\n      },\n      \"id\": 154,\n      \"options\": {\n        \"minVizHeight\": 75,\n        \"minVizWidth\": 75,\n        \"orientation\": \"auto\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showThresholdLabels\": false,\n        \"showThresholdMarkers\": true,\n        \"sizing\": \"auto\"\n      },\n      \"pluginVersion\": \"10.4.12\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": false,\n          \"expr\": \"100 - ((node_filesystem_avail_bytes{instance=\\\"$node\\\",job=\\\"$job\\\",mountpoint=\\\"/\\\",fstype!=\\\"rootfs\\\"} * 100) / node_filesystem_size_bytes{instance=\\\"$node\\\",job=\\\"$job\\\",mountpoint=\\\"/\\\",fstype!=\\\"rootfs\\\"})\",\n          \"format\": \"time_series\",\n          \"instant\": true,\n          \"intervalFactor\": 1,\n          \"range\": false,\n          \"refId\": \"A\",\n          \"step\": 240\n        }\n      ],\n      \"title\": \"Root FS Used\",\n      \"type\": \"gauge\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"description\": \"Total number of CPU cores\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [\n            {\n              \"options\": {\n                \"match\": \"null\",\n                \"result\": {\n                  \"text\": \"N/A\"\n                }\n              },\n              \"type\": \"special\"\n            }\n          ],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"short\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 2,\n        \"w\": 2,\n        \"x\": 18,\n        \"y\": 1\n      },\n      \"id\": 14,\n      \"maxDataPoints\": 100,\n      \"options\": {\n        \"colorMode\": \"none\",\n        \"graphMode\": \"none\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showPercentChange\": false,\n        \"textMode\": \"auto\",\n        \"wideLayout\": true\n      },\n      \"pluginVersion\": \"10.4.12\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": false,\n          \"expr\": \"count(count(node_cpu_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\"}) by (cpu))\",\n          \"instant\": true,\n          \"legendFormat\": \"__auto\",\n          \"range\": false,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"CPU Cores\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"description\": \"System uptime\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"decimals\": 1,\n          \"mappings\": [\n            {\n              \"options\": {\n                \"match\": \"null\",\n                \"result\": {\n                  \"text\": \"N/A\"\n                }\n              },\n              \"type\": \"special\"\n            }\n          ],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"s\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 2,\n        \"w\": 4,\n        \"x\": 20,\n        \"y\": 1\n      },\n      \"hideTimeOverride\": true,\n      \"id\": 15,\n      \"maxDataPoints\": 100,\n      \"options\": {\n        \"colorMode\": \"none\",\n        \"graphMode\": \"none\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showPercentChange\": false,\n        \"textMode\": \"auto\",\n        \"wideLayout\": true\n      },\n      \"pluginVersion\": \"10.4.12\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": false,\n          \"expr\": \"node_time_seconds{instance=\\\"$node\\\",job=\\\"$job\\\"} - node_boot_time_seconds{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n          \"instant\": true,\n          \"intervalFactor\": 1,\n          \"range\": false,\n          \"refId\": \"A\",\n          \"step\": 240\n        }\n      ],\n      \"title\": \"Uptime\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"description\": \"Total RootFS\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"decimals\": 0,\n          \"mappings\": [\n            {\n              \"options\": {\n                \"match\": \"null\",\n                \"result\": {\n                  \"text\": \"N/A\"\n                }\n              },\n              \"type\": \"special\"\n            }\n          ],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"rgba(50, 172, 45, 0.97)\",\n                \"value\": null\n              },\n              {\n                \"color\": \"rgba(237, 129, 40, 0.89)\",\n                \"value\": 70\n              },\n              {\n                \"color\": \"rgba(245, 54, 54, 0.9)\",\n                \"value\": 90\n              }\n            ]\n          },\n          \"unit\": \"bytes\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 2,\n        \"w\": 2,\n        \"x\": 18,\n        \"y\": 3\n      },\n      \"id\": 23,\n      \"maxDataPoints\": 100,\n      \"options\": {\n        \"colorMode\": \"none\",\n        \"graphMode\": \"none\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showPercentChange\": false,\n        \"textMode\": \"auto\",\n        \"wideLayout\": true\n      },\n      \"pluginVersion\": \"10.4.12\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": false,\n          \"expr\": \"node_filesystem_size_bytes{instance=\\\"$node\\\",job=\\\"$job\\\",mountpoint=\\\"/\\\",fstype!=\\\"rootfs\\\"}\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"instant\": true,\n          \"intervalFactor\": 1,\n          \"range\": false,\n          \"refId\": \"A\",\n          \"step\": 240\n        }\n      ],\n      \"title\": \"RootFS Total\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"description\": \"Total RAM\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"decimals\": 0,\n          \"mappings\": [\n            {\n              \"options\": {\n                \"match\": \"null\",\n                \"result\": {\n                  \"text\": \"N/A\"\n                }\n              },\n              \"type\": \"special\"\n            }\n          ],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"bytes\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 2,\n        \"w\": 2,\n        \"x\": 20,\n        \"y\": 3\n      },\n      \"id\": 75,\n      \"maxDataPoints\": 100,\n      \"options\": {\n        \"colorMode\": \"none\",\n        \"graphMode\": \"none\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showPercentChange\": false,\n        \"textMode\": \"auto\",\n        \"wideLayout\": true\n      },\n      \"pluginVersion\": \"10.4.12\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": false,\n          \"expr\": \"node_memory_MemTotal_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n          \"instant\": true,\n          \"intervalFactor\": 1,\n          \"range\": false,\n          \"refId\": \"A\",\n          \"step\": 240\n        }\n      ],\n      \"title\": \"RAM Total\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"description\": \"Total SWAP\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"decimals\": 0,\n          \"mappings\": [\n            {\n              \"options\": {\n                \"match\": \"null\",\n                \"result\": {\n                  \"text\": \"N/A\"\n                }\n              },\n              \"type\": \"special\"\n            }\n          ],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"bytes\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 2,\n        \"w\": 2,\n        \"x\": 22,\n        \"y\": 3\n      },\n      \"id\": 18,\n      \"maxDataPoints\": 100,\n      \"options\": {\n        \"colorMode\": \"none\",\n        \"graphMode\": \"none\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"horizontal\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showPercentChange\": false,\n        \"textMode\": \"auto\",\n        \"wideLayout\": true\n      },\n      \"pluginVersion\": \"10.4.12\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": false,\n          \"expr\": \"node_memory_SwapTotal_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n          \"instant\": true,\n          \"intervalFactor\": 1,\n          \"range\": false,\n          \"refId\": \"A\",\n          \"step\": 240\n        }\n      ],\n      \"title\": \"SWAP Total\",\n      \"type\": \"stat\"\n    },\n    {\n      \"collapsed\": false,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"000000001\"\n      },\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 5\n      },\n      \"id\": 263,\n      \"panels\": [],\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"000000001\"\n          },\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Basic CPU / Mem / Net / Disk\",\n      \"type\": \"row\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"description\": \"Basic CPU info\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisBorderShow\": false,\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 40,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"insertNulls\": false,\n            \"lineInterpolation\": \"smooth\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"percent\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"links\": [],\n          \"mappings\": [],\n          \"min\": 0,\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"percentunit\"\n        },\n        \"overrides\": [\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Busy Iowait\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"#890F02\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Idle\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"#052B51\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Busy Iowait\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"#890F02\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Idle\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"#7EB26D\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Busy System\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"#EAB839\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Busy User\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"#0A437C\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Busy Other\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"#6D1F62\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          }\n        ]\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 6\n      },\n      \"id\": 77,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true,\n          \"width\": 250\n        },\n        \"tooltip\": {\n          \"mode\": \"multi\",\n          \"sort\": \"desc\"\n        }\n      },\n      \"pluginVersion\": \"9.2.0\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": false,\n          \"expr\": \"sum(irate(node_cpu_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\", mode=\\\"system\\\"}[$__rate_interval])) / scalar(count(count(node_cpu_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\"}) by (cpu)))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"instant\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"Busy System\",\n          \"range\": true,\n          \"refId\": \"A\",\n          \"step\": 240\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"sum(irate(node_cpu_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\", mode=\\\"user\\\"}[$__rate_interval])) / scalar(count(count(node_cpu_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\"}) by (cpu)))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"Busy User\",\n          \"range\": true,\n          \"refId\": \"B\",\n          \"step\": 240\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"sum(irate(node_cpu_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\", mode=\\\"iowait\\\"}[$__rate_interval])) / scalar(count(count(node_cpu_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\"}) by (cpu)))\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"Busy Iowait\",\n          \"range\": true,\n          \"refId\": \"C\",\n          \"step\": 240\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"sum(irate(node_cpu_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\", mode=~\\\".*irq\\\"}[$__rate_interval])) / scalar(count(count(node_cpu_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\"}) by (cpu)))\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"Busy IRQs\",\n          \"range\": true,\n          \"refId\": \"D\",\n          \"step\": 240\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"sum(irate(node_cpu_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\",  mode!='idle',mode!='user',mode!='system',mode!='iowait',mode!='irq',mode!='softirq'}[$__rate_interval])) / scalar(count(count(node_cpu_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\"}) by (cpu)))\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"Busy Other\",\n          \"range\": true,\n          \"refId\": \"E\",\n          \"step\": 240\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"sum(irate(node_cpu_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\", mode=\\\"idle\\\"}[$__rate_interval])) / scalar(count(count(node_cpu_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\"}) by (cpu)))\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"Idle\",\n          \"range\": true,\n          \"refId\": \"F\",\n          \"step\": 240\n        }\n      ],\n      \"title\": \"CPU Basic\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"description\": \"Basic memory usage\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisBorderShow\": false,\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 40,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"insertNulls\": false,\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"normal\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"links\": [],\n          \"mappings\": [],\n          \"min\": 0,\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"bytes\"\n        },\n        \"overrides\": [\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Apps\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"#629E51\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Buffers\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"#614D93\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Cache\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"#6D1F62\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Cached\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"#511749\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Committed\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"#508642\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Free\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"#0A437C\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Hardware Corrupted - Amount of RAM that the kernel identified as corrupted / not working\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"#CFFAFF\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Inactive\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"#584477\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"PageTables\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"#0A50A1\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Page_Tables\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"#0A50A1\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"RAM_Free\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"#E0F9D7\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"SWAP Used\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"#BF1B00\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Slab\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"#806EB7\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Slab_Cache\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"#E0752D\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Swap\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"#BF1B00\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Swap Used\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"#BF1B00\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Swap_Cache\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"#C15C17\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Swap_Free\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"#2F575E\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Unused\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"#EAB839\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"RAM Total\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"#E0F9D7\",\n                  \"mode\": \"fixed\"\n                }\n              },\n              {\n                \"id\": \"custom.fillOpacity\",\n                \"value\": 0\n              },\n              {\n                \"id\": \"custom.stacking\",\n                \"value\": {\n                  \"group\": false,\n                  \"mode\": \"normal\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"RAM Cache + Buffer\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"#052B51\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"RAM Free\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"#7EB26D\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Available\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"#DEDAF7\",\n                  \"mode\": \"fixed\"\n                }\n              },\n              {\n                \"id\": \"custom.fillOpacity\",\n                \"value\": 0\n              },\n              {\n                \"id\": \"custom.stacking\",\n                \"value\": {\n                  \"group\": false,\n                  \"mode\": \"normal\"\n                }\n              }\n            ]\n          }\n        ]\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 6\n      },\n      \"id\": 78,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true,\n          \"width\": 350\n        },\n        \"tooltip\": {\n          \"mode\": \"multi\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"9.2.0\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"expr\": \"node_memory_MemTotal_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"RAM Total\",\n          \"refId\": \"A\",\n          \"step\": 240\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"expr\": \"node_memory_MemTotal_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"} - node_memory_MemFree_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"} - (node_memory_Cached_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"} + node_memory_Buffers_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"} + node_memory_SReclaimable_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"})\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"RAM Used\",\n          \"refId\": \"B\",\n          \"step\": 240\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"expr\": \"node_memory_Cached_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"} + node_memory_Buffers_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"} + node_memory_SReclaimable_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"RAM Cache + Buffer\",\n          \"refId\": \"C\",\n          \"step\": 240\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"expr\": \"node_memory_MemFree_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"RAM Free\",\n          \"refId\": \"D\",\n          \"step\": 240\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"expr\": \"(node_memory_SwapTotal_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"} - node_memory_SwapFree_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"})\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"SWAP Used\",\n          \"refId\": \"E\",\n          \"step\": 240\n        }\n      ],\n      \"title\": \"Memory Basic\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"description\": \"Basic network info per interface\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisBorderShow\": false,\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 40,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"insertNulls\": false,\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"links\": [],\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"bps\"\n        },\n        \"overrides\": [\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Recv_bytes_eth2\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"#7EB26D\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Recv_bytes_lo\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"#0A50A1\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Recv_drop_eth2\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"#6ED0E0\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Recv_drop_lo\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"#E0F9D7\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Recv_errs_eth2\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"#BF1B00\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Recv_errs_lo\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"#CCA300\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Trans_bytes_eth2\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"#7EB26D\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Trans_bytes_lo\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"#0A50A1\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Trans_drop_eth2\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"#6ED0E0\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Trans_drop_lo\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"#E0F9D7\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Trans_errs_eth2\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"#BF1B00\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Trans_errs_lo\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"#CCA300\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"recv_bytes_lo\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"#0A50A1\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"recv_drop_eth0\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"#99440A\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"recv_drop_lo\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"#967302\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"recv_errs_eth0\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"#BF1B00\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"recv_errs_lo\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"#890F02\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"trans_bytes_eth0\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"#7EB26D\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"trans_bytes_lo\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"#0A50A1\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"trans_drop_eth0\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"#99440A\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"trans_drop_lo\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"#967302\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"trans_errs_eth0\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"#BF1B00\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"trans_errs_lo\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"#890F02\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byRegexp\",\n              \"options\": \"/.*trans.*/\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.transform\",\n                \"value\": \"negative-Y\"\n              }\n            ]\n          }\n        ]\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 13\n      },\n      \"id\": 74,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"multi\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"9.2.0\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"expr\": \"irate(node_network_receive_bytes_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])*8\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"recv {{device}}\",\n          \"refId\": \"A\",\n          \"step\": 240\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"expr\": \"irate(node_network_transmit_bytes_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])*8\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"trans {{device}} \",\n          \"refId\": \"B\",\n          \"step\": 240\n        }\n      ],\n      \"title\": \"Network Traffic Basic\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${datasource}\"\n      },\n      \"description\": \"Disk space used of all filesystems mounted\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisBorderShow\": false,\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 40,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"insertNulls\": false,\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"links\": [],\n          \"mappings\": [],\n          \"max\": 100,\n          \"min\": 0,\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"percent\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 13\n      },\n      \"id\": 152,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"multi\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"9.2.0\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"expr\": \"100 - ((node_filesystem_avail_bytes{instance=\\\"$node\\\",job=\\\"$job\\\",device!~'rootfs'} * 100) / node_filesystem_size_bytes{instance=\\\"$node\\\",job=\\\"$job\\\",device!~'rootfs'})\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{mountpoint}}\",\n          \"refId\": \"A\",\n          \"step\": 240\n        }\n      ],\n      \"title\": \"Disk Space Used Basic\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"collapsed\": true,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"000000001\"\n      },\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 20\n      },\n      \"id\": 265,\n      \"panels\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"percentage\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 70,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"smooth\",\n                \"lineWidth\": 2,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"percent\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"percentunit\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Idle - Waiting for something to happen\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#052B51\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Iowait - Waiting for I/O to complete\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#EAB839\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Irq - Servicing interrupts\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#BF1B00\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Nice - Niced processes executing in user mode\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#C15C17\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Softirq - Servicing softirqs\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#E24D42\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Steal - Time spent in other operating systems when running in a virtualized environment\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#FCE2DE\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"System - Processes executing in kernel mode\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#508642\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"User - Normal processes executing in user mode\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#5195CE\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 12,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 21\n          },\n          \"id\": 3,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true,\n              \"width\": 250\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"desc\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"editorMode\": \"code\",\n              \"expr\": \"sum(irate(node_cpu_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\", mode=\\\"system\\\"}[$__rate_interval])) / scalar(count(count(node_cpu_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\"}) by (cpu)))\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"System - Processes executing in kernel mode\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"editorMode\": \"code\",\n              \"expr\": \"sum(irate(node_cpu_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\", mode=\\\"user\\\"}[$__rate_interval])) / scalar(count(count(node_cpu_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\"}) by (cpu)))\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"User - Normal processes executing in user mode\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"editorMode\": \"code\",\n              \"expr\": \"sum(irate(node_cpu_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\", mode=\\\"nice\\\"}[$__rate_interval])) / scalar(count(count(node_cpu_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\"}) by (cpu)))\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Nice - Niced processes executing in user mode\",\n              \"range\": true,\n              \"refId\": \"C\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"editorMode\": \"code\",\n              \"expr\": \"sum by(instance) (irate(node_cpu_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\", mode=\\\"iowait\\\"}[$__rate_interval])) / scalar(count(count(node_cpu_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\"}) by (cpu)))\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Iowait - Waiting for I/O to complete\",\n              \"range\": true,\n              \"refId\": \"E\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"editorMode\": \"code\",\n              \"expr\": \"sum(irate(node_cpu_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\", mode=\\\"irq\\\"}[$__rate_interval])) / scalar(count(count(node_cpu_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\"}) by (cpu)))\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Irq - Servicing interrupts\",\n              \"range\": true,\n              \"refId\": \"F\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"editorMode\": \"code\",\n              \"expr\": \"sum(irate(node_cpu_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\", mode=\\\"softirq\\\"}[$__rate_interval])) / scalar(count(count(node_cpu_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\"}) by (cpu)))\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Softirq - Servicing softirqs\",\n              \"range\": true,\n              \"refId\": \"G\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"editorMode\": \"code\",\n              \"expr\": \"sum(irate(node_cpu_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\", mode=\\\"steal\\\"}[$__rate_interval])) / scalar(count(count(node_cpu_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\"}) by (cpu)))\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Steal - Time spent in other operating systems when running in a virtualized environment\",\n              \"range\": true,\n              \"refId\": \"H\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"editorMode\": \"code\",\n              \"expr\": \"sum(irate(node_cpu_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\", mode=\\\"idle\\\"}[$__rate_interval])) / scalar(count(count(node_cpu_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\"}) by (cpu)))\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Idle - Waiting for something to happen\",\n              \"range\": true,\n              \"refId\": \"J\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"CPU\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"bytes\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 40,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"normal\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"bytes\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Apps\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#629E51\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Buffers\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#614D93\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Cache\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#6D1F62\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Cached\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#511749\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Committed\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#508642\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Free\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#0A437C\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Hardware Corrupted - Amount of RAM that the kernel identified as corrupted / not working\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#CFFAFF\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Inactive\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#584477\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"PageTables\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#0A50A1\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Page_Tables\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#0A50A1\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"RAM_Free\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#E0F9D7\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Slab\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#806EB7\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Slab_Cache\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#E0752D\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Swap\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#BF1B00\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Swap - Swap memory usage\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#BF1B00\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Swap_Cache\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#C15C17\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Swap_Free\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#2F575E\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Unused\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#EAB839\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Unused - Free memory unassigned\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#052B51\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*Hardware Corrupted - *./\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"custom.stacking\",\n                    \"value\": {\n                      \"group\": false,\n                      \"mode\": \"normal\"\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 12,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 21\n          },\n          \"id\": 24,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true,\n              \"width\": 350\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_memory_MemTotal_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"} - node_memory_MemFree_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"} - node_memory_Buffers_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"} - node_memory_Cached_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"} - node_memory_Slab_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"} - node_memory_PageTables_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"} - node_memory_SwapCached_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Apps - Memory used by user-space applications\",\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_memory_PageTables_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"PageTables - Memory used to map between virtual and physical memory addresses\",\n              \"refId\": \"B\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_memory_SwapCached_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"SwapCache - Memory that keeps track of pages that have been fetched from swap but not yet been modified\",\n              \"refId\": \"C\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_memory_Slab_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Slab - Memory used by the kernel to cache data structures for its own use (caches like inode, dentry, etc)\",\n              \"refId\": \"D\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_memory_Cached_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Cache - Parked file data (file content) cache\",\n              \"refId\": \"E\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_memory_Buffers_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Buffers - Block device (e.g. harddisk) cache\",\n              \"refId\": \"F\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_memory_MemFree_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Unused - Free memory unassigned\",\n              \"refId\": \"G\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"(node_memory_SwapTotal_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"} - node_memory_SwapFree_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"})\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Swap - Swap space used\",\n              \"refId\": \"H\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_memory_HardwareCorrupted_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Hardware Corrupted - Amount of RAM that the kernel identified as corrupted / not working\",\n              \"refId\": \"I\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Memory Stack\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"bits out (-) / in (+)\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 40,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"bps\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"receive_packets_eth0\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#7EB26D\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"receive_packets_lo\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#E24D42\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"transmit_packets_eth0\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#7EB26D\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"transmit_packets_lo\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#E24D42\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*Trans.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"custom.transform\",\n                    \"value\": \"negative-Y\"\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 12,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 33\n          },\n          \"id\": 84,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_network_receive_bytes_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])*8\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{device}} - Receive\",\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_network_transmit_bytes_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])*8\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{device}} - Transmit\",\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Network Traffic\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"bytes\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 40,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"bytes\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 12,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 33\n          },\n          \"id\": 156,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_filesystem_size_bytes{instance=\\\"$node\\\",job=\\\"$job\\\",device!~'rootfs'} - node_filesystem_avail_bytes{instance=\\\"$node\\\",job=\\\"$job\\\",device!~'rootfs'}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{mountpoint}}\",\n              \"refId\": \"A\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Disk Space Used\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"IO read (-) / write (+)\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"iops\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*Read.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"custom.transform\",\n                    \"value\": \"negative-Y\"\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sda_.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#7EB26D\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdb_.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#EAB839\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdc_.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#6ED0E0\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdd_.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#EF843C\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sde_.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#E24D42\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sda1.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#584477\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sda2_.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#BA43A9\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sda3_.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#F4D598\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdb1.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#0A50A1\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdb2.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#BF1B00\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdb2.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#BF1B00\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdb3.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#E0752D\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdc1.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#962D82\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdc2.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#614D93\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdc3.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#9AC48A\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdd1.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#65C5DB\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdd2.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#F9934E\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdd3.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#EA6460\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sde1.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#E0F9D7\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdd2.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#FCEACA\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sde3.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#F9E2D2\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 12,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 45\n          },\n          \"id\": 229,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"single\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_disk_reads_completed_total{instance=\\\"$node\\\",job=\\\"$job\\\",device=~\\\"$diskdevices\\\"}[$__rate_interval])\",\n              \"intervalFactor\": 4,\n              \"legendFormat\": \"{{device}} - Reads completed\",\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_disk_writes_completed_total{instance=\\\"$node\\\",job=\\\"$job\\\",device=~\\\"$diskdevices\\\"}[$__rate_interval])\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{device}} - Writes completed\",\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Disk IOps\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"bytes read (-) / write (+)\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 40,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"Bps\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"io time\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#890F02\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*read*./\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"custom.transform\",\n                    \"value\": \"negative-Y\"\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sda.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#7EB26D\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdb.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#EAB839\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdc.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#6ED0E0\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdd.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#EF843C\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sde.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#E24D42\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byType\",\n                  \"options\": \"time\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"custom.axisPlacement\",\n                    \"value\": \"hidden\"\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 12,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 45\n          },\n          \"id\": 42,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_disk_read_bytes_total{instance=\\\"$node\\\",job=\\\"$job\\\",device=~\\\"$diskdevices\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{device}} - Successfully read bytes\",\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_disk_written_bytes_total{instance=\\\"$node\\\",job=\\\"$job\\\",device=~\\\"$diskdevices\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{device}} - Successfully written bytes\",\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"I/O Usage Read / Write\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"%util\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 40,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"percentunit\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"io time\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#890F02\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byType\",\n                  \"options\": \"time\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"custom.axisPlacement\",\n                    \"value\": \"hidden\"\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 12,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 57\n          },\n          \"id\": 127,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_disk_io_time_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\",device=~\\\"$diskdevices\\\"} [$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{device}}\",\n              \"refId\": \"A\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"I/O Utilization\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"percentage\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"bars\",\n                \"fillOpacity\": 70,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"smooth\",\n                \"lineWidth\": 2,\n                \"pointSize\": 3,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"mappings\": [],\n              \"max\": 1,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"percentunit\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/^Guest - /\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#5195ce\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/^GuestNice - /\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#c15c17\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 12,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 57\n          },\n          \"id\": 319,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"desc\"\n            }\n          },\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"editorMode\": \"code\",\n              \"expr\": \"sum by(instance) (irate(node_cpu_guest_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\", mode=\\\"user\\\"}[1m])) / on(instance) group_left sum by (instance)((irate(node_cpu_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[1m])))\",\n              \"hide\": false,\n              \"legendFormat\": \"Guest - Time spent running a virtual CPU for a guest operating system\",\n              \"range\": true,\n              \"refId\": \"A\"\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"editorMode\": \"code\",\n              \"expr\": \"sum by(instance) (irate(node_cpu_guest_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\", mode=\\\"nice\\\"}[1m])) / on(instance) group_left sum by (instance)((irate(node_cpu_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[1m])))\",\n              \"hide\": false,\n              \"legendFormat\": \"GuestNice - Time spent running a niced guest  (virtual CPU for guest operating system)\",\n              \"range\": true,\n              \"refId\": \"B\"\n            }\n          ],\n          \"title\": \"CPU spent seconds in guests (VMs)\",\n          \"type\": \"timeseries\"\n        }\n      ],\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"000000001\"\n          },\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"CPU / Memory / Net / Disk\",\n      \"type\": \"row\"\n    },\n    {\n      \"collapsed\": true,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"000000001\"\n      },\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 21\n      },\n      \"id\": 266,\n      \"panels\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"bytes\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"normal\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"bytes\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Apps\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#629E51\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Buffers\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#614D93\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Cache\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#6D1F62\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Cached\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#511749\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Committed\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#508642\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Free\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#0A437C\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Hardware Corrupted - Amount of RAM that the kernel identified as corrupted / not working\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#CFFAFF\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Inactive\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#584477\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"PageTables\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#0A50A1\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Page_Tables\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#0A50A1\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"RAM_Free\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#E0F9D7\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Slab\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#806EB7\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Slab_Cache\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#E0752D\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Swap\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#BF1B00\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Swap_Cache\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#C15C17\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Swap_Free\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#2F575E\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Unused\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#EAB839\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 54\n          },\n          \"id\": 136,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true,\n              \"width\": 350\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_memory_Inactive_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Inactive - Memory which has been less recently used.  It is more eligible to be reclaimed for other purposes\",\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_memory_Active_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Active - Memory that has been used more recently and usually not reclaimed unless absolutely necessary\",\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Memory Active / Inactive\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"bytes\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"bytes\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Apps\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#629E51\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Buffers\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#614D93\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Cache\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#6D1F62\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Cached\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#511749\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Committed\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#508642\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Free\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#0A437C\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Hardware Corrupted - Amount of RAM that the kernel identified as corrupted / not working\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#CFFAFF\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Inactive\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#584477\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"PageTables\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#0A50A1\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Page_Tables\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#0A50A1\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"RAM_Free\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#E0F9D7\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Slab\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#806EB7\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Slab_Cache\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#E0752D\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Swap\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#BF1B00\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Swap_Cache\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#C15C17\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Swap_Free\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#2F575E\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Unused\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#EAB839\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*CommitLimit - *./\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#BF1B00\",\n                      \"mode\": \"fixed\"\n                    }\n                  },\n                  {\n                    \"id\": \"custom.fillOpacity\",\n                    \"value\": 0\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 54\n          },\n          \"id\": 135,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true,\n              \"width\": 350\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_memory_Committed_AS_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Committed_AS - Amount of memory presently allocated on the system\",\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_memory_CommitLimit_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"CommitLimit - Amount of  memory currently available to be allocated on the system\",\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Memory Committed\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"bytes\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"normal\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"bytes\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Apps\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#629E51\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Buffers\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#614D93\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Cache\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#6D1F62\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Cached\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#511749\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Committed\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#508642\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Free\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#0A437C\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Hardware Corrupted - Amount of RAM that the kernel identified as corrupted / not working\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#CFFAFF\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Inactive\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#584477\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"PageTables\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#0A50A1\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Page_Tables\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#0A50A1\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"RAM_Free\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#E0F9D7\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Slab\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#806EB7\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Slab_Cache\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#E0752D\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Swap\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#BF1B00\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Swap_Cache\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#C15C17\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Swap_Free\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#2F575E\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Unused\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#EAB839\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 64\n          },\n          \"id\": 191,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true,\n              \"width\": 350\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_memory_Inactive_file_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Inactive_file - File-backed memory on inactive LRU list\",\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_memory_Inactive_anon_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Inactive_anon - Anonymous and swap cache on inactive LRU list, including tmpfs (shmem)\",\n              \"refId\": \"B\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_memory_Active_file_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Active_file - File-backed memory on active LRU list\",\n              \"refId\": \"C\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_memory_Active_anon_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Active_anon - Anonymous and swap cache on active least-recently-used (LRU) list, including tmpfs\",\n              \"refId\": \"D\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Memory Active / Inactive Detail\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"bytes\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"bytes\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Active\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#99440A\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Buffers\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#58140C\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Cache\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#6D1F62\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Cached\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#511749\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Committed\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#508642\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Dirty\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#6ED0E0\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Free\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#B7DBAB\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Inactive\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#EA6460\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Mapped\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#052B51\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"PageTables\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#0A50A1\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Page_Tables\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#0A50A1\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Slab_Cache\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#EAB839\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Swap\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#BF1B00\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Swap_Cache\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#C15C17\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Total\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#511749\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Total RAM\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#052B51\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Total RAM + Swap\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#052B51\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Total Swap\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#614D93\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"VmallocUsed\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#EA6460\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 64\n          },\n          \"id\": 130,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_memory_Writeback_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Writeback - Memory which is actively being written back to disk\",\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_memory_WritebackTmp_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"WritebackTmp - Memory used by FUSE for temporary writeback buffers\",\n              \"refId\": \"B\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_memory_Dirty_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Dirty - Memory which is waiting to get written back to the disk\",\n              \"refId\": \"C\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Memory Writeback and Dirty\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"bytes\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"bytes\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Apps\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#629E51\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Buffers\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#614D93\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Cache\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#6D1F62\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Cached\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#511749\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Committed\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#508642\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Free\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#0A437C\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Hardware Corrupted - Amount of RAM that the kernel identified as corrupted / not working\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#CFFAFF\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Inactive\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#584477\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"PageTables\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#0A50A1\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Page_Tables\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#0A50A1\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"RAM_Free\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#E0F9D7\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Slab\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#806EB7\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Slab_Cache\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#E0752D\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Swap\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#BF1B00\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Swap_Cache\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#C15C17\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Swap_Free\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#2F575E\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Unused\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#EAB839\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"ShmemHugePages - Memory used by shared memory (shmem) and tmpfs allocated  with huge pages\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"custom.fillOpacity\",\n                    \"value\": 0\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"ShmemHugePages - Memory used by shared memory (shmem) and tmpfs allocated  with huge pages\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"custom.fillOpacity\",\n                    \"value\": 0\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 74\n          },\n          \"id\": 138,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true,\n              \"width\": 350\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_memory_Mapped_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Mapped - Used memory in mapped pages files which have been mapped, such as libraries\",\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_memory_Shmem_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Shmem - Used shared memory (shared between several processes, thus including RAM disks)\",\n              \"refId\": \"B\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_memory_ShmemHugePages_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"ShmemHugePages - Memory used by shared memory (shmem) and tmpfs allocated  with huge pages\",\n              \"refId\": \"C\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_memory_ShmemPmdMapped_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"ShmemPmdMapped - Amount of shared (shmem/tmpfs) memory backed by huge pages\",\n              \"refId\": \"D\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Memory Shared and Mapped\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"bytes\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"normal\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"bytes\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Active\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#99440A\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Buffers\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#58140C\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Cache\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#6D1F62\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Cached\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#511749\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Committed\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#508642\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Dirty\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#6ED0E0\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Free\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#B7DBAB\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Inactive\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#EA6460\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Mapped\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#052B51\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"PageTables\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#0A50A1\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Page_Tables\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#0A50A1\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Slab_Cache\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#EAB839\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Swap\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#BF1B00\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Swap_Cache\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#C15C17\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Total\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#511749\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Total RAM\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#052B51\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Total RAM + Swap\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#052B51\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Total Swap\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#614D93\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"VmallocUsed\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#EA6460\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 74\n          },\n          \"id\": 131,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_memory_SUnreclaim_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"SUnreclaim - Part of Slab, that cannot be reclaimed on memory pressure\",\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_memory_SReclaimable_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"SReclaimable - Part of Slab, that might be reclaimed, such as caches\",\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Memory Slab\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"bytes\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"bytes\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Active\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#99440A\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Buffers\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#58140C\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Cache\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#6D1F62\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Cached\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#511749\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Committed\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#508642\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Dirty\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#6ED0E0\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Free\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#B7DBAB\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Inactive\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#EA6460\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Mapped\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#052B51\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"PageTables\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#0A50A1\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Page_Tables\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#0A50A1\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Slab_Cache\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#EAB839\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Swap\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#BF1B00\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Swap_Cache\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#C15C17\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Total\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#511749\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Total RAM\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#052B51\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Total RAM + Swap\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#052B51\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"VmallocUsed\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#EA6460\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 84\n          },\n          \"id\": 70,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_memory_VmallocChunk_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"VmallocChunk - Largest contiguous block of vmalloc area which is free\",\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_memory_VmallocTotal_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"VmallocTotal - Total size of vmalloc memory area\",\n              \"refId\": \"B\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_memory_VmallocUsed_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"VmallocUsed - Amount of vmalloc area which is used\",\n              \"refId\": \"C\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Memory Vmalloc\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"bytes\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"bytes\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Apps\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#629E51\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Buffers\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#614D93\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Cache\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#6D1F62\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Cached\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#511749\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Committed\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#508642\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Free\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#0A437C\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Hardware Corrupted - Amount of RAM that the kernel identified as corrupted / not working\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#CFFAFF\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Inactive\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#584477\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"PageTables\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#0A50A1\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Page_Tables\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#0A50A1\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"RAM_Free\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#E0F9D7\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Slab\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#806EB7\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Slab_Cache\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#E0752D\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Swap\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#BF1B00\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Swap_Cache\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#C15C17\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Swap_Free\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#2F575E\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Unused\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#EAB839\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 84\n          },\n          \"id\": 159,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true,\n              \"width\": 350\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_memory_Bounce_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Bounce - Memory used for block device bounce buffers\",\n              \"refId\": \"A\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Memory Bounce\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"bytes\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"bytes\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Active\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#99440A\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Buffers\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#58140C\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Cache\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#6D1F62\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Cached\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#511749\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Committed\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#508642\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Dirty\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#6ED0E0\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Free\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#B7DBAB\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Inactive\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#EA6460\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Mapped\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#052B51\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"PageTables\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#0A50A1\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Page_Tables\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#0A50A1\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Slab_Cache\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#EAB839\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Swap\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#BF1B00\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Swap_Cache\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#C15C17\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Total\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#511749\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Total RAM\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#052B51\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Total RAM + Swap\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#052B51\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"VmallocUsed\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#EA6460\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*Inactive *./\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"custom.transform\",\n                    \"value\": \"negative-Y\"\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 94\n          },\n          \"id\": 129,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_memory_AnonHugePages_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"AnonHugePages - Memory in anonymous huge pages\",\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_memory_AnonPages_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"AnonPages - Memory in user pages not backed by files\",\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Memory Anonymous\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"bytes\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"bytes\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Apps\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#629E51\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Buffers\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#614D93\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Cache\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#6D1F62\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Cached\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#511749\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Committed\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#508642\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Free\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#0A437C\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Hardware Corrupted - Amount of RAM that the kernel identified as corrupted / not working\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#CFFAFF\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Inactive\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#584477\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"PageTables\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#0A50A1\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Page_Tables\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#0A50A1\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"RAM_Free\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#E0F9D7\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Slab\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#806EB7\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Slab_Cache\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#E0752D\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Swap\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#BF1B00\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Swap_Cache\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#C15C17\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Swap_Free\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#2F575E\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Unused\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#EAB839\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 94\n          },\n          \"id\": 160,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true,\n              \"width\": 350\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_memory_KernelStack_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"KernelStack - Kernel memory stack. This is not reclaimable\",\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_memory_Percpu_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"PerCPU - Per CPU memory allocated dynamically by loadable modules\",\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Memory Kernel / CPU\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"pages\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Active\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#99440A\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Buffers\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#58140C\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Cache\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#6D1F62\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Cached\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#511749\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Committed\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#508642\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Dirty\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#6ED0E0\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Free\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#B7DBAB\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Inactive\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#EA6460\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Mapped\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#052B51\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"PageTables\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#0A50A1\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Page_Tables\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#0A50A1\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Slab_Cache\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#EAB839\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Swap\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#BF1B00\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Swap_Cache\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#C15C17\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Total\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#511749\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Total RAM\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#806EB7\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Total RAM + Swap\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#806EB7\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"VmallocUsed\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#EA6460\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 104\n          },\n          \"id\": 140,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_memory_HugePages_Free{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"HugePages_Free - Huge pages in the pool that are not yet allocated\",\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_memory_HugePages_Rsvd{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"HugePages_Rsvd - Huge pages for which a commitment to allocate from the pool has been made, but no allocation has yet been made\",\n              \"refId\": \"B\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_memory_HugePages_Surp{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"HugePages_Surp - Huge pages in the pool above the value in /proc/sys/vm/nr_hugepages\",\n              \"refId\": \"C\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Memory HugePages Counter\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"bytes\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"bytes\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Active\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#99440A\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Buffers\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#58140C\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Cache\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#6D1F62\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Cached\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#511749\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Committed\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#508642\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Dirty\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#6ED0E0\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Free\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#B7DBAB\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Inactive\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#EA6460\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Mapped\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#052B51\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"PageTables\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#0A50A1\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Page_Tables\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#0A50A1\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Slab_Cache\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#EAB839\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Swap\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#BF1B00\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Swap_Cache\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#C15C17\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Total\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#511749\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Total RAM\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#806EB7\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Total RAM + Swap\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#806EB7\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"VmallocUsed\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#EA6460\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 104\n          },\n          \"id\": 71,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_memory_HugePages_Total{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"HugePages - Total size of the pool of huge pages\",\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_memory_Hugepagesize_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Hugepagesize - Huge Page size\",\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Memory HugePages Size\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"bytes\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"bytes\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Active\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#99440A\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Buffers\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#58140C\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Cache\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#6D1F62\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Cached\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#511749\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Committed\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#508642\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Dirty\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#6ED0E0\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Free\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#B7DBAB\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Inactive\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#EA6460\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Mapped\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#052B51\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"PageTables\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#0A50A1\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Page_Tables\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#0A50A1\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Slab_Cache\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#EAB839\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Swap\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#BF1B00\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Swap_Cache\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#C15C17\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Total\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#511749\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Total RAM\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#052B51\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Total RAM + Swap\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#052B51\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"VmallocUsed\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#EA6460\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 114\n          },\n          \"id\": 128,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_memory_DirectMap1G_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"DirectMap1G - Amount of pages mapped as this size\",\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_memory_DirectMap2M_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"DirectMap2M - Amount of pages mapped as this size\",\n              \"refId\": \"B\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_memory_DirectMap4k_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"DirectMap4K - Amount of pages mapped as this size\",\n              \"refId\": \"C\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Memory DirectMap\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"bytes\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"bytes\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Apps\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#629E51\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Buffers\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#614D93\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Cache\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#6D1F62\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Cached\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#511749\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Committed\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#508642\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Free\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#0A437C\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Hardware Corrupted - Amount of RAM that the kernel identified as corrupted / not working\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#CFFAFF\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Inactive\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#584477\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"PageTables\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#0A50A1\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Page_Tables\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#0A50A1\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"RAM_Free\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#E0F9D7\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Slab\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#806EB7\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Slab_Cache\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#E0752D\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Swap\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#BF1B00\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Swap_Cache\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#C15C17\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Swap_Free\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#2F575E\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Unused\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#EAB839\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 114\n          },\n          \"id\": 137,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true,\n              \"width\": 350\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_memory_Unevictable_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Unevictable - Amount of unevictable memory that can't be swapped out for a variety of reasons\",\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_memory_Mlocked_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"MLocked - Size of pages locked to memory using the mlock() system call\",\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Memory Unevictable and MLocked\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"bytes\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"bytes\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Active\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#99440A\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Buffers\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#58140C\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Cache\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#6D1F62\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Cached\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#511749\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Committed\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#508642\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Dirty\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#6ED0E0\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Free\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#B7DBAB\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Inactive\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#EA6460\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Mapped\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#052B51\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"PageTables\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#0A50A1\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Page_Tables\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#0A50A1\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Slab_Cache\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#EAB839\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Swap\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#BF1B00\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Swap_Cache\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#C15C17\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Total\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#511749\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Total RAM\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#052B51\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Total RAM + Swap\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#052B51\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Total Swap\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#614D93\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"VmallocUsed\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#EA6460\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 124\n          },\n          \"id\": 132,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_memory_NFS_Unstable_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"NFS Unstable - Memory in NFS pages sent to the server, but not yet committed to the storage\",\n              \"refId\": \"A\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Memory NFS\",\n          \"type\": \"timeseries\"\n        }\n      ],\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"000000001\"\n          },\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Memory Meminfo\",\n      \"type\": \"row\"\n    },\n    {\n      \"collapsed\": true,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"000000001\"\n      },\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 22\n      },\n      \"id\": 267,\n      \"panels\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"pages out (-) / in (+)\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*out/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"custom.transform\",\n                    \"value\": \"negative-Y\"\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 41\n          },\n          \"id\": 176,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_vmstat_pgpgin{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Pagesin - Page in operations\",\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_vmstat_pgpgout{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Pagesout - Page out operations\",\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Memory Pages In / Out\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"pages out (-) / in (+)\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*out/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"custom.transform\",\n                    \"value\": \"negative-Y\"\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 41\n          },\n          \"id\": 22,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_vmstat_pswpin{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Pswpin - Pages swapped in\",\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_vmstat_pswpout{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Pswpout - Pages swapped out\",\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Memory Pages Swap In / Out\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"faults\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"normal\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Apps\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#629E51\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Buffers\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#614D93\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Cache\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#6D1F62\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Cached\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#511749\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Committed\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#508642\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Free\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#0A437C\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Hardware Corrupted - Amount of RAM that the kernel identified as corrupted / not working\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#CFFAFF\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Inactive\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#584477\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"PageTables\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#0A50A1\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Page_Tables\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#0A50A1\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"RAM_Free\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#E0F9D7\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Slab\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#806EB7\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Slab_Cache\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#E0752D\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Swap\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#BF1B00\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Swap_Cache\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#C15C17\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Swap_Free\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#2F575E\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Unused\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#EAB839\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Pgfault - Page major and minor fault operations\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"custom.fillOpacity\",\n                    \"value\": 0\n                  },\n                  {\n                    \"id\": \"custom.stacking\",\n                    \"value\": {\n                      \"group\": false,\n                      \"mode\": \"normal\"\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 51\n          },\n          \"id\": 175,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true,\n              \"width\": 350\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_vmstat_pgfault{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Pgfault - Page major and minor fault operations\",\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_vmstat_pgmajfault{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Pgmajfault - Major page fault operations\",\n              \"refId\": \"B\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_vmstat_pgfault{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])  - irate(node_vmstat_pgmajfault{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Pgminfault - Minor page fault operations\",\n              \"refId\": \"C\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Memory Page Faults\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"counter\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Active\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#99440A\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Buffers\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#58140C\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Cache\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#6D1F62\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Cached\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#511749\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Committed\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#508642\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Dirty\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#6ED0E0\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Free\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#B7DBAB\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Inactive\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#EA6460\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Mapped\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#052B51\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"PageTables\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#0A50A1\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Page_Tables\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#0A50A1\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Slab_Cache\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#EAB839\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Swap\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#BF1B00\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Swap_Cache\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#C15C17\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Total\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#511749\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Total RAM\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#052B51\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Total RAM + Swap\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#052B51\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Total Swap\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#614D93\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"VmallocUsed\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#EA6460\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 51\n          },\n          \"id\": 307,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_vmstat_oom_kill{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"oom killer invocations \",\n              \"refId\": \"A\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"OOM Killer\",\n          \"type\": \"timeseries\"\n        }\n      ],\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"000000001\"\n          },\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Memory Vmstat\",\n      \"type\": \"row\"\n    },\n    {\n      \"collapsed\": true,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"000000001\"\n      },\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 23\n      },\n      \"id\": 293,\n      \"panels\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"seconds\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"s\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*Variation*./\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#890F02\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 24\n          },\n          \"id\": 260,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_timex_estimated_error_seconds{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Estimated error in seconds\",\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_timex_offset_seconds{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Time offset in between local system and reference clock\",\n              \"refId\": \"B\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_timex_maxerror_seconds{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Maximum error in seconds\",\n              \"refId\": \"C\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Time Synchronized Drift\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"counter\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 24\n          },\n          \"id\": 291,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_timex_loop_time_constant{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Phase-locked loop time adjust\",\n              \"refId\": \"A\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Time PLL Adjust\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"counter\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*Variation*./\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#890F02\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 34\n          },\n          \"id\": 168,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_timex_sync_status{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Is clock synchronized to a reliable server (1 = yes, 0 = no)\",\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_timex_frequency_adjustment_ratio{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Local clock frequency adjustment\",\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Time Synchronized Status\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"seconds\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"s\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 34\n          },\n          \"id\": 294,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_timex_tick_seconds{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Seconds between clock ticks\",\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_timex_tai_offset_seconds{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"International Atomic Time (TAI) offset\",\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Time Misc\",\n          \"type\": \"timeseries\"\n        }\n      ],\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"000000001\"\n          },\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"System Timesync\",\n      \"type\": \"row\"\n    },\n    {\n      \"collapsed\": true,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"000000001\"\n      },\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 24\n      },\n      \"id\": 312,\n      \"panels\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"counter\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 73\n          },\n          \"id\": 62,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_procs_blocked{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Processes blocked waiting for I/O to complete\",\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_procs_running{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Processes in runnable state\",\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Processes Status\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"Enable with --collector.processes argument on node-exporter\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"counter\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"normal\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 73\n          },\n          \"id\": 315,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_processes_state{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{ state }}\",\n              \"refId\": \"A\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Processes State\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"forks / sec\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 83\n          },\n          \"id\": 148,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_forks_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Processes forks second\",\n              \"refId\": \"A\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Processes  Forks\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"bytes\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"decbytes\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*Max.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"custom.fillOpacity\",\n                    \"value\": 0\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 83\n          },\n          \"id\": 149,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(process_virtual_memory_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Processes virtual memory size in bytes\",\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"process_resident_memory_max_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Maximum amount of virtual memory available in bytes\",\n              \"refId\": \"B\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(process_virtual_memory_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Processes virtual memory size in bytes\",\n              \"refId\": \"C\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(process_virtual_memory_max_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Maximum amount of virtual memory available in bytes\",\n              \"refId\": \"D\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Processes Memory\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"Enable with --collector.processes argument on node-exporter\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"counter\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"PIDs limit\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#F2495C\",\n                      \"mode\": \"fixed\"\n                    }\n                  },\n                  {\n                    \"id\": \"custom.fillOpacity\",\n                    \"value\": 0\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 93\n          },\n          \"id\": 313,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_processes_pids{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Number of PIDs\",\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_processes_max_processes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"PIDs limit\",\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"PIDs Number and Limit\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"seconds\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"s\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*waiting.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"custom.transform\",\n                    \"value\": \"negative-Y\"\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 93\n          },\n          \"id\": 305,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_schedstat_running_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"CPU {{ cpu }} - seconds spent running a process\",\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_schedstat_waiting_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"CPU {{ cpu }} - seconds spent by processing waiting for this CPU\",\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Process schedule stats Running / Waiting\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"Enable with --collector.processes argument on node-exporter\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"counter\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Threads limit\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#F2495C\",\n                      \"mode\": \"fixed\"\n                    }\n                  },\n                  {\n                    \"id\": \"custom.fillOpacity\",\n                    \"value\": 0\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 103\n          },\n          \"id\": 314,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_processes_threads{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Allocated threads\",\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_processes_max_threads{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Threads limit\",\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Threads Number and Limit\",\n          \"type\": \"timeseries\"\n        }\n      ],\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"000000001\"\n          },\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"System Processes\",\n      \"type\": \"row\"\n    },\n    {\n      \"collapsed\": true,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"000000001\"\n      },\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 25\n      },\n      \"id\": 269,\n      \"panels\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"counter\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 26\n          },\n          \"id\": 8,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_context_switches_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Context switches\",\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_intr_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Interrupts\",\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Context Switches / Interrupts\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"counter\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 26\n          },\n          \"id\": 7,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_load1{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 4,\n              \"legendFormat\": \"Load 1m\",\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_load5{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 4,\n              \"legendFormat\": \"Load 5m\",\n              \"refId\": \"B\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_load15{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 4,\n              \"legendFormat\": \"Load 15m\",\n              \"refId\": \"C\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"System Load\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 0,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"hertz\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Max\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"custom.lineStyle\",\n                    \"value\": {\n                      \"dash\": [\n                        10,\n                        10\n                      ],\n                      \"fill\": \"dash\"\n                    }\n                  },\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"blue\",\n                      \"mode\": \"fixed\"\n                    }\n                  },\n                  {\n                    \"id\": \"custom.fillOpacity\",\n                    \"value\": 10\n                  },\n                  {\n                    \"id\": \"custom.hideFrom\",\n                    \"value\": {\n                      \"legend\": true,\n                      \"tooltip\": false,\n                      \"viz\": false\n                    }\n                  },\n                  {\n                    \"id\": \"custom.fillBelowTo\",\n                    \"value\": \"Min\"\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Min\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"custom.lineStyle\",\n                    \"value\": {\n                      \"dash\": [\n                        10,\n                        10\n                      ],\n                      \"fill\": \"dash\"\n                    }\n                  },\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"blue\",\n                      \"mode\": \"fixed\"\n                    }\n                  },\n                  {\n                    \"id\": \"custom.hideFrom\",\n                    \"value\": {\n                      \"legend\": true,\n                      \"tooltip\": false,\n                      \"viz\": false\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 36\n          },\n          \"id\": 321,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"desc\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"editorMode\": \"code\",\n              \"expr\": \"node_cpu_scaling_frequency_hertz{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"CPU {{ cpu }}\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"editorMode\": \"code\",\n              \"expr\": \"avg(node_cpu_scaling_frequency_max_hertz{instance=\\\"$node\\\",job=\\\"$job\\\"})\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Max\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"editorMode\": \"code\",\n              \"expr\": \"avg(node_cpu_scaling_frequency_min_hertz{instance=\\\"$node\\\",job=\\\"$job\\\"})\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Min\",\n              \"range\": true,\n              \"refId\": \"C\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"CPU Frequency Scaling\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"https://docs.kernel.org/accounting/psi.html\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 10,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"percentunit\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Memory some\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"dark-red\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Memory full\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"light-red\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"I/O some\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"dark-blue\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"I/O full\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"light-blue\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 36\n          },\n          \"id\": 322,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"editorMode\": \"code\",\n              \"expr\": \"rate(node_pressure_cpu_waiting_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"CPU some\",\n              \"range\": true,\n              \"refId\": \"CPU some\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"editorMode\": \"code\",\n              \"expr\": \"rate(node_pressure_memory_waiting_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Memory some\",\n              \"range\": true,\n              \"refId\": \"Memory some\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"editorMode\": \"code\",\n              \"expr\": \"rate(node_pressure_memory_stalled_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Memory full\",\n              \"range\": true,\n              \"refId\": \"Memory full\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"editorMode\": \"code\",\n              \"expr\": \"rate(node_pressure_io_waiting_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"I/O some\",\n              \"range\": true,\n              \"refId\": \"I/O some\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"editorMode\": \"code\",\n              \"expr\": \"rate(node_pressure_io_stalled_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"I/O full\",\n              \"range\": true,\n              \"refId\": \"I/O full\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Pressure Stall Information\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"Enable with --collector.interrupts argument on node-exporter\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"counter\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*Critical*./\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#E24D42\",\n                      \"mode\": \"fixed\"\n                    }\n                  },\n                  {\n                    \"id\": \"custom.fillOpacity\",\n                    \"value\": 0\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*Max*./\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#EF843C\",\n                      \"mode\": \"fixed\"\n                    }\n                  },\n                  {\n                    \"id\": \"custom.fillOpacity\",\n                    \"value\": 0\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 46\n          },\n          \"id\": 259,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_interrupts_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{ type }} - {{ info }}\",\n              \"refId\": \"A\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Interrupts Detail\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"counter\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 46\n          },\n          \"id\": 306,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_schedstat_timeslices_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"CPU {{ cpu }}\",\n              \"refId\": \"A\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Schedule timeslices executed by each cpu\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"counter\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 56\n          },\n          \"id\": 151,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_entropy_available_bits{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Entropy available to random number generators\",\n              \"refId\": \"A\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Entropy\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"seconds\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"s\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 56\n          },\n          \"id\": 308,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(process_cpu_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Time spent\",\n              \"refId\": \"A\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"CPU time spent in user and system contexts\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"counter\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*Max*./\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#890F02\",\n                      \"mode\": \"fixed\"\n                    }\n                  },\n                  {\n                    \"id\": \"custom.fillOpacity\",\n                    \"value\": 0\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 66\n          },\n          \"id\": 64,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"process_max_fds{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Maximum open file descriptors\",\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"process_open_fds{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Open file descriptors\",\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"File Descriptors\",\n          \"type\": \"timeseries\"\n        }\n      ],\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"000000001\"\n          },\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"System Misc\",\n      \"type\": \"row\"\n    },\n    {\n      \"collapsed\": true,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"000000001\"\n      },\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 26\n      },\n      \"id\": 304,\n      \"panels\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"temperature\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"celsius\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*Critical*./\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#E24D42\",\n                      \"mode\": \"fixed\"\n                    }\n                  },\n                  {\n                    \"id\": \"custom.fillOpacity\",\n                    \"value\": 0\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*Max*./\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#EF843C\",\n                      \"mode\": \"fixed\"\n                    }\n                  },\n                  {\n                    \"id\": \"custom.fillOpacity\",\n                    \"value\": 0\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 59\n          },\n          \"id\": 158,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_hwmon_temp_celsius{instance=\\\"$node\\\",job=\\\"$job\\\"} * on(chip) group_left(chip_name) node_hwmon_chip_names{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{ chip_name }} {{ sensor }} temp\",\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_hwmon_temp_crit_alarm_celsius{instance=\\\"$node\\\",job=\\\"$job\\\"} * on(chip) group_left(chip_name) node_hwmon_chip_names{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"hide\": true,\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{ chip_name }} {{ sensor }} Critical Alarm\",\n              \"refId\": \"B\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_hwmon_temp_crit_celsius{instance=\\\"$node\\\",job=\\\"$job\\\"} * on(chip) group_left(chip_name) node_hwmon_chip_names{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{ chip_name }} {{ sensor }} Critical\",\n              \"refId\": \"C\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_hwmon_temp_crit_hyst_celsius{instance=\\\"$node\\\",job=\\\"$job\\\"} * on(chip) group_left(chip_name) node_hwmon_chip_names{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"hide\": true,\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{ chip_name }} {{ sensor }} Critical Historical\",\n              \"refId\": \"D\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_hwmon_temp_max_celsius{instance=\\\"$node\\\",job=\\\"$job\\\"} * on(chip) group_left(chip_name) node_hwmon_chip_names{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"hide\": true,\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{ chip_name }} {{ sensor }} Max\",\n              \"refId\": \"E\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Hardware temperature monitor\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"counter\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*Max*./\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#EF843C\",\n                      \"mode\": \"fixed\"\n                    }\n                  },\n                  {\n                    \"id\": \"custom.fillOpacity\",\n                    \"value\": 0\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 59\n          },\n          \"id\": 300,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_cooling_device_cur_state{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Current {{ name }} in {{ type }}\",\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_cooling_device_max_state{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Max {{ name }} in {{ type }}\",\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Throttle cooling device\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"counter\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 69\n          },\n          \"id\": 302,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_power_supply_online{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{ power_supply }} online\",\n              \"refId\": \"A\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Power supply\",\n          \"type\": \"timeseries\"\n        }\n      ],\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"000000001\"\n          },\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Hardware Misc\",\n      \"type\": \"row\"\n    },\n    {\n      \"collapsed\": true,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"000000001\"\n      },\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 27\n      },\n      \"id\": 296,\n      \"panels\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"counter\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 46\n          },\n          \"id\": 297,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_systemd_socket_accepted_connections_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{ name }} Connections\",\n              \"refId\": \"A\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Systemd Sockets\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"counter\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"normal\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Failed\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#F2495C\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Inactive\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#FF9830\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Active\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#73BF69\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Deactivating\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#FFCB7D\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Activating\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#C8F2C2\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 46\n          },\n          \"id\": 298,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_systemd_units{instance=\\\"$node\\\",job=\\\"$job\\\",state=\\\"activating\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Activating\",\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_systemd_units{instance=\\\"$node\\\",job=\\\"$job\\\",state=\\\"active\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Active\",\n              \"refId\": \"B\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_systemd_units{instance=\\\"$node\\\",job=\\\"$job\\\",state=\\\"deactivating\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Deactivating\",\n              \"refId\": \"C\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_systemd_units{instance=\\\"$node\\\",job=\\\"$job\\\",state=\\\"failed\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Failed\",\n              \"refId\": \"D\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_systemd_units{instance=\\\"$node\\\",job=\\\"$job\\\",state=\\\"inactive\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Inactive\",\n              \"refId\": \"E\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Systemd Units State\",\n          \"type\": \"timeseries\"\n        }\n      ],\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"000000001\"\n          },\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Systemd\",\n      \"type\": \"row\"\n    },\n    {\n      \"collapsed\": true,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"000000001\"\n      },\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 28\n      },\n      \"id\": 270,\n      \"panels\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"The number (after merges) of I/O requests completed per second for the device\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"IO read (-) / write (+)\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"iops\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*Read.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"custom.transform\",\n                    \"value\": \"negative-Y\"\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sda_.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#7EB26D\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdb_.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#EAB839\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdc_.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#6ED0E0\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdd_.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#EF843C\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sde_.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#E24D42\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sda1.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#584477\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sda2_.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#BA43A9\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sda3_.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#F4D598\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdb1.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#0A50A1\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdb2.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#BF1B00\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdb3.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#E0752D\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdc1.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#962D82\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdc2.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#614D93\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdc3.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#9AC48A\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdd1.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#65C5DB\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdd2.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#F9934E\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdd3.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#EA6460\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sde1.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#E0F9D7\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdd2.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#FCEACA\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sde3.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#F9E2D2\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 47\n          },\n          \"id\": 9,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"single\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_disk_reads_completed_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"intervalFactor\": 4,\n              \"legendFormat\": \"{{device}} - Reads completed\",\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_disk_writes_completed_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{device}} - Writes completed\",\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Disk IOps Completed\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"The number of bytes read from or written to the device per second\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"bytes read (-) / write (+)\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"Bps\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*Read.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"custom.transform\",\n                    \"value\": \"negative-Y\"\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sda_.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#7EB26D\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdb_.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#EAB839\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdc_.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#6ED0E0\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdd_.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#EF843C\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sde_.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#E24D42\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sda1.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#584477\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sda2_.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#BA43A9\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sda3_.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#F4D598\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdb1.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#0A50A1\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdb2.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#BF1B00\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdb3.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#E0752D\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdc1.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#962D82\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdc2.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#614D93\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdc3.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#9AC48A\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdd1.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#65C5DB\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdd2.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#F9934E\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdd3.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#EA6460\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sde1.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#E0F9D7\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdd2.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#FCEACA\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sde3.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#F9E2D2\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 47\n          },\n          \"id\": 33,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"single\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_disk_read_bytes_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 4,\n              \"legendFormat\": \"{{device}} - Read bytes\",\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_disk_written_bytes_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{device}} - Written bytes\",\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Disk R/W Data\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"The average time for requests issued to the device to be served. This includes the time spent by the requests in queue and the time spent servicing them.\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"time. read (-) / write (+)\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 30,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"s\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*Read.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"custom.transform\",\n                    \"value\": \"negative-Y\"\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sda_.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#7EB26D\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdb_.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#EAB839\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdc_.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#6ED0E0\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdd_.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#EF843C\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sde_.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#E24D42\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sda1.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#584477\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sda2_.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#BA43A9\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sda3_.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#F4D598\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdb1.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#0A50A1\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdb2.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#BF1B00\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdb3.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#E0752D\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdc1.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#962D82\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdc2.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#614D93\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdc3.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#9AC48A\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdd1.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#65C5DB\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdd2.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#F9934E\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdd3.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#EA6460\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sde1.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#E0F9D7\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdd2.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#FCEACA\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sde3.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#F9E2D2\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 57\n          },\n          \"id\": 37,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"single\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_disk_read_time_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval]) / irate(node_disk_reads_completed_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 4,\n              \"legendFormat\": \"{{device}} - Read wait time avg\",\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_disk_write_time_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval]) / irate(node_disk_writes_completed_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{device}} - Write wait time avg\",\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Disk Average Wait Time\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"The average queue length of the requests that were issued to the device\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"aqu-sz\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"none\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sda_.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#7EB26D\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdb_.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#EAB839\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdc_.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#6ED0E0\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdd_.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#EF843C\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sde_.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#E24D42\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sda1.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#584477\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sda2_.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#BA43A9\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sda3_.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#F4D598\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdb1.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#0A50A1\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdb2.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#BF1B00\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdb3.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#E0752D\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdc1.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#962D82\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdc2.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#614D93\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdc3.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#9AC48A\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdd1.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#65C5DB\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdd2.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#F9934E\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdd3.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#EA6460\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sde1.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#E0F9D7\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdd2.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#FCEACA\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sde3.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#F9E2D2\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 57\n          },\n          \"id\": 35,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"single\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_disk_io_time_weighted_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"interval\": \"\",\n              \"intervalFactor\": 4,\n              \"legendFormat\": \"{{device}}\",\n              \"refId\": \"A\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Average Queue Size\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"The number of read and write requests merged per second that were queued to the device\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"I/Os\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"iops\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*Read.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"custom.transform\",\n                    \"value\": \"negative-Y\"\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sda_.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#7EB26D\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdb_.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#EAB839\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdc_.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#6ED0E0\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdd_.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#EF843C\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sde_.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#E24D42\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sda1.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#584477\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sda2_.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#BA43A9\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sda3_.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#F4D598\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdb1.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#0A50A1\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdb2.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#BF1B00\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdb3.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#E0752D\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdc1.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#962D82\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdc2.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#614D93\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdc3.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#9AC48A\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdd1.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#65C5DB\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdd2.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#F9934E\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdd3.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#EA6460\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sde1.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#E0F9D7\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdd2.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#FCEACA\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sde3.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#F9E2D2\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 67\n          },\n          \"id\": 133,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"single\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_disk_reads_merged_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{device}} - Read merged\",\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_disk_writes_merged_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{device}} - Write merged\",\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Disk R/W Merged\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"Percentage of elapsed time during which I/O requests were issued to the device (bandwidth utilization for the device). Device saturation occurs when this value is close to 100% for devices serving requests serially.  But for devices  serving requests in parallel, such as RAID arrays and modern SSDs, this number does not reflect their performance limits.\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"%util\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 30,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"percentunit\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sda_.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#7EB26D\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdb_.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#EAB839\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdc_.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#6ED0E0\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdd_.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#EF843C\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sde_.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#E24D42\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sda1.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#584477\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sda2_.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#BA43A9\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sda3_.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#F4D598\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdb1.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#0A50A1\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdb2.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#BF1B00\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdb3.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#E0752D\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdc1.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#962D82\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdc2.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#614D93\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdc3.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#9AC48A\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdd1.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#65C5DB\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdd2.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#F9934E\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdd3.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#EA6460\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sde1.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#E0F9D7\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdd2.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#FCEACA\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sde3.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#F9E2D2\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 67\n          },\n          \"id\": 36,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"single\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_disk_io_time_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"interval\": \"\",\n              \"intervalFactor\": 4,\n              \"legendFormat\": \"{{device}} - IO\",\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_disk_discard_time_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"interval\": \"\",\n              \"intervalFactor\": 4,\n              \"legendFormat\": \"{{device}} - discard\",\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Time Spent Doing I/Os\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"The number of outstanding requests at the instant the sample was taken. Incremented as requests are given to appropriate struct request_queue and decremented as they finish.\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"Outstanding req.\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"none\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sda_.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#7EB26D\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdb_.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#EAB839\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdc_.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#6ED0E0\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdd_.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#EF843C\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sde_.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#E24D42\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sda1.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#584477\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sda2_.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#BA43A9\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sda3_.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#F4D598\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdb1.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#0A50A1\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdb2.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#BF1B00\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdb3.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#E0752D\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdc1.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#962D82\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdc2.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#614D93\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdc3.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#9AC48A\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdd1.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#65C5DB\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdd2.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#F9934E\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdd3.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#EA6460\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sde1.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#E0F9D7\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdd2.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#FCEACA\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sde3.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#F9E2D2\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 77\n          },\n          \"id\": 34,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"single\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_disk_io_now{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"interval\": \"\",\n              \"intervalFactor\": 4,\n              \"legendFormat\": \"{{device}} - IO now\",\n              \"refId\": \"A\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Instantaneous Queue Size\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"IOs\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"iops\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sda_.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#7EB26D\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdb_.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#EAB839\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdc_.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#6ED0E0\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdd_.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#EF843C\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sde_.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#E24D42\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sda1.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#584477\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sda2_.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#BA43A9\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sda3_.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#F4D598\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdb1.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#0A50A1\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdb2.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#BF1B00\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdb3.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#E0752D\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdc1.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#962D82\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdc2.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#614D93\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdc3.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#9AC48A\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdd1.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#65C5DB\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdd2.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#F9934E\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdd3.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#EA6460\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sde1.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#E0F9D7\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sdd2.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#FCEACA\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*sde3.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#F9E2D2\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 77\n          },\n          \"id\": 301,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"single\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_disk_discards_completed_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"interval\": \"\",\n              \"intervalFactor\": 4,\n              \"legendFormat\": \"{{device}} - Discards completed\",\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_disk_discards_merged_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{device}} - Discards merged\",\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Disk IOps Discards completed / merged\",\n          \"type\": \"timeseries\"\n        }\n      ],\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"000000001\"\n          },\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Storage Disk\",\n      \"type\": \"row\"\n    },\n    {\n      \"collapsed\": true,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"000000001\"\n      },\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 29\n      },\n      \"id\": 271,\n      \"panels\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"bytes\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"bytes\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 62\n          },\n          \"id\": 43,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_filesystem_avail_bytes{instance=\\\"$node\\\",job=\\\"$job\\\",device!~'rootfs'}\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{mountpoint}} - Available\",\n              \"metric\": \"\",\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_filesystem_free_bytes{instance=\\\"$node\\\",job=\\\"$job\\\",device!~'rootfs'}\",\n              \"format\": \"time_series\",\n              \"hide\": true,\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{mountpoint}} - Free\",\n              \"refId\": \"B\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_filesystem_size_bytes{instance=\\\"$node\\\",job=\\\"$job\\\",device!~'rootfs'}\",\n              \"format\": \"time_series\",\n              \"hide\": true,\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{mountpoint}} - Size\",\n              \"refId\": \"C\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Filesystem space available\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"file nodes\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 62\n          },\n          \"id\": 41,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_filesystem_files_free{instance=\\\"$node\\\",job=\\\"$job\\\",device!~'rootfs'}\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{mountpoint}} - Free file nodes\",\n              \"refId\": \"A\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"File Nodes Free\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"files\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 72\n          },\n          \"id\": 28,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"single\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_filefd_maximum{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 4,\n              \"legendFormat\": \"Max open files\",\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_filefd_allocated{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Open files\",\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"File Descriptor\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"file Nodes\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 72\n          },\n          \"id\": 219,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_filesystem_files{instance=\\\"$node\\\",job=\\\"$job\\\",device!~'rootfs'}\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{mountpoint}} - File nodes total\",\n              \"refId\": \"A\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"File Nodes Size\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"counter\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"normal\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"max\": 1,\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"/ ReadOnly\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#890F02\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 82\n          },\n          \"id\": 44,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_filesystem_readonly{instance=\\\"$node\\\",job=\\\"$job\\\",device!~'rootfs'}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{mountpoint}} - ReadOnly\",\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_filesystem_device_error{instance=\\\"$node\\\",job=\\\"$job\\\",device!~'rootfs',fstype!~'tmpfs'}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{mountpoint}} - Device error\",\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Filesystem in ReadOnly / Error\",\n          \"type\": \"timeseries\"\n        }\n      ],\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"000000001\"\n          },\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Storage Filesystem\",\n      \"type\": \"row\"\n    },\n    {\n      \"collapsed\": true,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"000000001\"\n      },\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 30\n      },\n      \"id\": 272,\n      \"panels\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"packets out (-) / in (+)\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"pps\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"receive_packets_eth0\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#7EB26D\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"receive_packets_lo\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#E24D42\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"transmit_packets_eth0\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#7EB26D\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"transmit_packets_lo\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#E24D42\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*Trans.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"custom.transform\",\n                    \"value\": \"negative-Y\"\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 47\n          },\n          \"id\": 60,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true,\n              \"width\": 300\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_network_receive_packets_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{device}} - Receive\",\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_network_transmit_packets_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{device}} - Transmit\",\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Network Traffic by Packets\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"packets out (-) / in (+)\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"pps\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*Trans.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"custom.transform\",\n                    \"value\": \"negative-Y\"\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 47\n          },\n          \"id\": 142,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true,\n              \"width\": 300\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_network_receive_errs_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{device}} - Receive errors\",\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_network_transmit_errs_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{device}} - Transmit errors\",\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Network Traffic Errors\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"packets out (-) / in (+)\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"pps\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*Trans.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"custom.transform\",\n                    \"value\": \"negative-Y\"\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 57\n          },\n          \"id\": 143,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true,\n              \"width\": 300\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_network_receive_drop_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{device}} - Receive drop\",\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_network_transmit_drop_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{device}} - Transmit drop\",\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Network Traffic Drop\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"packets out (-) / in (+)\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"pps\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*Trans.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"custom.transform\",\n                    \"value\": \"negative-Y\"\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 57\n          },\n          \"id\": 141,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true,\n              \"width\": 300\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_network_receive_compressed_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{device}} - Receive compressed\",\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_network_transmit_compressed_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{device}} - Transmit compressed\",\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Network Traffic Compressed\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"packets out (-) / in (+)\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"pps\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*Trans.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"custom.transform\",\n                    \"value\": \"negative-Y\"\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 67\n          },\n          \"id\": 146,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true,\n              \"width\": 300\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_network_receive_multicast_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{device}} - Receive multicast\",\n              \"refId\": \"A\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Network Traffic Multicast\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"packets out (-) / in (+)\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"pps\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*Trans.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"custom.transform\",\n                    \"value\": \"negative-Y\"\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 67\n          },\n          \"id\": 144,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true,\n              \"width\": 300\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_network_receive_fifo_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{device}} - Receive fifo\",\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_network_transmit_fifo_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{device}} - Transmit fifo\",\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Network Traffic Fifo\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"packets out (-) / in (+)\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"pps\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*Trans.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"custom.transform\",\n                    \"value\": \"negative-Y\"\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 77\n          },\n          \"id\": 145,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true,\n              \"width\": 300\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_network_receive_frame_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{device}} - Receive frame\",\n              \"refId\": \"A\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Network Traffic Frame\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"counter\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 77\n          },\n          \"id\": 231,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true,\n              \"width\": 300\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_network_transmit_carrier_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{device}} - Statistic transmit_carrier\",\n              \"refId\": \"A\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Network Traffic Carrier\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"counter\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*Trans.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"custom.transform\",\n                    \"value\": \"negative-Y\"\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 87\n          },\n          \"id\": 232,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true,\n              \"width\": 300\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_network_transmit_colls_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{device}} - Transmit colls\",\n              \"refId\": \"A\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Network Traffic Colls\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"entries\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"NF conntrack limit\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#890F02\",\n                      \"mode\": \"fixed\"\n                    }\n                  },\n                  {\n                    \"id\": \"custom.fillOpacity\",\n                    \"value\": 0\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 87\n          },\n          \"id\": 61,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_nf_conntrack_entries{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"NF conntrack entries\",\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_nf_conntrack_entries_limit{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"NF conntrack limit\",\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"NF Conntrack\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"Entries\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 97\n          },\n          \"id\": 230,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_arp_entries{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{ device }} - ARP entries\",\n              \"refId\": \"A\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"ARP Entries\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"bytes\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"decimals\": 0,\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"bytes\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 97\n          },\n          \"id\": 288,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_network_mtu_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{ device }} - Bytes\",\n              \"refId\": \"A\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"MTU\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"bytes\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"decimals\": 0,\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"bytes\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 107\n          },\n          \"id\": 280,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_network_speed_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{ device }} - Speed\",\n              \"refId\": \"A\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Speed\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"packets\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"decimals\": 0,\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"none\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 107\n          },\n          \"id\": 289,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_network_transmit_queue_length{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{ device }} -   Interface transmit queue length\",\n              \"refId\": \"A\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Queue Length\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"packetes drop (-) / process (+)\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*Dropped.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"custom.transform\",\n                    \"value\": \"negative-Y\"\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 117\n          },\n          \"id\": 290,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true,\n              \"width\": 300\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_softnet_processed_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"CPU {{cpu}} - Processed\",\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_softnet_dropped_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"CPU {{cpu}} - Dropped\",\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Softnet Packets\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"counter\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 117\n          },\n          \"id\": 310,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true,\n              \"width\": 300\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_softnet_times_squeezed_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"CPU {{cpu}} - Squeezed\",\n              \"refId\": \"A\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Softnet Out of Quota\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"counter\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 127\n          },\n          \"id\": 309,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true,\n              \"width\": 300\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_network_up{operstate=\\\"up\\\",instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{interface}} - Operational state UP\",\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_network_carrier{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"instant\": false,\n              \"legendFormat\": \"{{device}} - Physical link state\",\n              \"refId\": \"B\"\n            }\n          ],\n          \"title\": \"Network Operational Status\",\n          \"type\": \"timeseries\"\n        }\n      ],\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"000000001\"\n          },\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Network Traffic\",\n      \"type\": \"row\"\n    },\n    {\n      \"collapsed\": true,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"000000001\"\n      },\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 31\n      },\n      \"id\": 273,\n      \"panels\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"counter\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 48\n          },\n          \"id\": 63,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true,\n              \"width\": 300\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_sockstat_TCP_alloc{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"TCP_alloc - Allocated sockets\",\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_sockstat_TCP_inuse{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"TCP_inuse - Tcp sockets currently in use\",\n              \"refId\": \"B\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_sockstat_TCP_mem{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"hide\": true,\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"TCP_mem - Used memory for tcp\",\n              \"refId\": \"C\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_sockstat_TCP_orphan{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"TCP_orphan - Orphan sockets\",\n              \"refId\": \"D\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_sockstat_TCP_tw{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"TCP_tw - Sockets waiting close\",\n              \"refId\": \"E\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Sockstat TCP\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"counter\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 48\n          },\n          \"id\": 124,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true,\n              \"width\": 300\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_sockstat_UDPLITE_inuse{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"UDPLITE_inuse - Udplite sockets currently in use\",\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_sockstat_UDP_inuse{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"UDP_inuse - Udp sockets currently in use\",\n              \"refId\": \"B\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_sockstat_UDP_mem{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"UDP_mem - Used memory for udp\",\n              \"refId\": \"C\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Sockstat UDP\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"counter\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 58\n          },\n          \"id\": 125,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true,\n              \"width\": 300\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_sockstat_FRAG_inuse{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"FRAG_inuse - Frag sockets currently in use\",\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_sockstat_RAW_inuse{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"RAW_inuse - Raw sockets currently in use\",\n              \"refId\": \"C\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Sockstat FRAG / RAW\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"bytes\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"bytes\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 58\n          },\n          \"id\": 220,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true,\n              \"width\": 300\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_sockstat_TCP_mem_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"mem_bytes - TCP sockets in that state\",\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_sockstat_UDP_mem_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"mem_bytes - UDP sockets in that state\",\n              \"refId\": \"B\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_sockstat_FRAG_memory{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"FRAG_memory - Used memory for frag\",\n              \"refId\": \"C\"\n            }\n          ],\n          \"title\": \"Sockstat Memory Size\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"sockets\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 68\n          },\n          \"id\": 126,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true,\n              \"width\": 300\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_sockstat_sockets_used{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Sockets_used - Sockets currently in use\",\n              \"refId\": \"A\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Sockstat Used\",\n          \"type\": \"timeseries\"\n        }\n      ],\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"000000001\"\n          },\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Network Sockstat\",\n      \"type\": \"row\"\n    },\n    {\n      \"collapsed\": true,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"000000001\"\n      },\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 32\n      },\n      \"id\": 274,\n      \"panels\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"octets out (-) / in (+)\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*Out.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"custom.transform\",\n                    \"value\": \"negative-Y\"\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 33\n          },\n          \"id\": 221,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true,\n              \"width\": 300\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_netstat_IpExt_InOctets{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"InOctets - Received octets\",\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_netstat_IpExt_OutOctets{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"OutOctets - Sent octets\",\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Netstat IP In / Out Octets\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"datagrams\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 33\n          },\n          \"id\": 81,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true,\n              \"width\": 300\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_netstat_Ip_Forwarding{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"Forwarding - IP forwarding\",\n              \"refId\": \"A\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Netstat IP Forwarding\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"messages out (-) / in (+)\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*Out.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"custom.transform\",\n                    \"value\": \"negative-Y\"\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 43\n          },\n          \"id\": 115,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_netstat_Icmp_InMsgs{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"InMsgs -  Messages which the entity received. Note that this counter includes all those counted by icmpInErrors\",\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_netstat_Icmp_OutMsgs{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"OutMsgs - Messages which this entity attempted to send. Note that this counter includes all those counted by icmpOutErrors\",\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"ICMP In / Out\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"messages out (-) / in (+)\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*Out.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"custom.transform\",\n                    \"value\": \"negative-Y\"\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 43\n          },\n          \"id\": 50,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_netstat_Icmp_InErrors{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"InErrors - Messages which the entity received but determined as having ICMP-specific errors (bad ICMP checksums, bad length, etc.)\",\n              \"refId\": \"A\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"ICMP Errors\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"datagrams out (-) / in (+)\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*Out.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"custom.transform\",\n                    \"value\": \"negative-Y\"\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*Snd.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"custom.transform\",\n                    \"value\": \"negative-Y\"\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 53\n          },\n          \"id\": 55,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_netstat_Udp_InDatagrams{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"InDatagrams - Datagrams received\",\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_netstat_Udp_OutDatagrams{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"OutDatagrams - Datagrams sent\",\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"UDP In / Out\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"datagrams\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 53\n          },\n          \"id\": 109,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_netstat_Udp_InErrors{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"InErrors - UDP Datagrams that could not be delivered to an application\",\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_netstat_Udp_NoPorts{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"NoPorts - UDP Datagrams received on a port with no listener\",\n              \"refId\": \"B\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_netstat_UdpLite_InErrors{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"interval\": \"\",\n              \"legendFormat\": \"InErrors Lite - UDPLite Datagrams that could not be delivered to an application\",\n              \"refId\": \"C\"\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_netstat_Udp_RcvbufErrors{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"RcvbufErrors - UDP buffer errors received\",\n              \"refId\": \"D\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_netstat_Udp_SndbufErrors{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"SndbufErrors - UDP buffer errors send\",\n              \"refId\": \"E\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"UDP Errors\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"datagrams out (-) / in (+)\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*Out.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"custom.transform\",\n                    \"value\": \"negative-Y\"\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*Snd.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"custom.transform\",\n                    \"value\": \"negative-Y\"\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 63\n          },\n          \"id\": 299,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_netstat_Tcp_InSegs{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"instant\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"InSegs - Segments received, including those received in error. This count includes segments received on currently established connections\",\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_netstat_Tcp_OutSegs{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"OutSegs - Segments sent, including those on current connections but excluding those containing only retransmitted octets\",\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"TCP In / Out\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"counter\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 63\n          },\n          \"id\": 104,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_netstat_TcpExt_ListenOverflows{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"ListenOverflows - Times the listen queue of a socket overflowed\",\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_netstat_TcpExt_ListenDrops{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"ListenDrops - SYNs to LISTEN sockets ignored\",\n              \"refId\": \"B\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_netstat_TcpExt_TCPSynRetrans{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"TCPSynRetrans - SYN-SYN/ACK retransmits to break down retransmissions in SYN, fast/timeout retransmits\",\n              \"refId\": \"C\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_netstat_Tcp_RetransSegs{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"interval\": \"\",\n              \"legendFormat\": \"RetransSegs - Segments retransmitted - that is, the number of TCP segments transmitted containing one or more previously transmitted octets\",\n              \"refId\": \"D\"\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_netstat_Tcp_InErrs{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"interval\": \"\",\n              \"legendFormat\": \"InErrs - Segments received in error (e.g., bad TCP checksums)\",\n              \"refId\": \"E\"\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_netstat_Tcp_OutRsts{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"interval\": \"\",\n              \"legendFormat\": \"OutRsts - Segments sent with RST flag\",\n              \"refId\": \"F\"\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_netstat_TcpExt_TCPRcvQDrop{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"legendFormat\": \"TCPRcvQDrop - Packets meant to be queued in rcv queue but dropped because socket rcvbuf limit hit\",\n              \"range\": true,\n              \"refId\": \"G\"\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_netstat_TcpExt_TCPOFOQueue{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"legendFormat\": \"TCPOFOQueue - TCP layer receives an out of order packet and has enough memory to queue it\",\n              \"range\": true,\n              \"refId\": \"H\"\n            }\n          ],\n          \"title\": \"TCP Errors\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"connections\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*MaxConn *./\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#890F02\",\n                      \"mode\": \"fixed\"\n                    }\n                  },\n                  {\n                    \"id\": \"custom.fillOpacity\",\n                    \"value\": 0\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 73\n          },\n          \"id\": 85,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_netstat_Tcp_CurrEstab{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"CurrEstab - TCP connections for which the current state is either ESTABLISHED or CLOSE- WAIT\",\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_netstat_Tcp_MaxConn{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"MaxConn - Limit on the total number of TCP connections the entity can support (Dynamic is \\\"-1\\\")\",\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"TCP Connections\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"counter out (-) / in (+)\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*Sent.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"custom.transform\",\n                    \"value\": \"negative-Y\"\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 73\n          },\n          \"id\": 91,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_netstat_TcpExt_SyncookiesFailed{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"SyncookiesFailed - Invalid SYN cookies received\",\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_netstat_TcpExt_SyncookiesRecv{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"SyncookiesRecv - SYN cookies received\",\n              \"refId\": \"B\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_netstat_TcpExt_SyncookiesSent{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"SyncookiesSent - SYN cookies sent\",\n              \"refId\": \"C\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"TCP SynCookie\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"connections\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 83\n          },\n          \"id\": 82,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_netstat_Tcp_ActiveOpens{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"ActiveOpens - TCP connections that have made a direct transition to the SYN-SENT state from the CLOSED state\",\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"irate(node_netstat_Tcp_PassiveOpens{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"PassiveOpens - TCP connections that have made a direct transition to the SYN-RCVD state from the LISTEN state\",\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"TCP Direct Transition\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"Enable with --collector.tcpstat argument on node-exporter\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"connections\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 83\n          },\n          \"id\": 320,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"editorMode\": \"code\",\n              \"expr\": \"node_tcp_connection_states{state=\\\"established\\\",instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"established - TCP sockets in established state\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"editorMode\": \"code\",\n              \"expr\": \"node_tcp_connection_states{state=\\\"fin_wait2\\\",instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"fin_wait2 - TCP sockets in fin_wait2 state\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"editorMode\": \"code\",\n              \"expr\": \"node_tcp_connection_states{state=\\\"listen\\\",instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"listen - TCP sockets in listen state\",\n              \"range\": true,\n              \"refId\": \"C\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"editorMode\": \"code\",\n              \"expr\": \"node_tcp_connection_states{state=\\\"time_wait\\\",instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"time_wait - TCP sockets in time_wait state\",\n              \"range\": true,\n              \"refId\": \"D\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"TCP Stat\",\n          \"type\": \"timeseries\"\n        }\n      ],\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"000000001\"\n          },\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Network Netstat\",\n      \"type\": \"row\"\n    },\n    {\n      \"collapsed\": true,\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"000000001\"\n      },\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 33\n      },\n      \"id\": 279,\n      \"panels\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"seconds\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"normal\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"s\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 66\n          },\n          \"id\": 40,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_scrape_collector_duration_seconds{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{collector}} - Scrape duration\",\n              \"refId\": \"A\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Node Exporter Scrape Time\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${datasource}\"\n          },\n          \"description\": \"\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"counter\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"lineInterpolation\": \"linear\",\n                \"lineStyle\": {\n                  \"fill\": \"solid\"\n                },\n                \"lineWidth\": 1,\n                \"pointSize\": 5,\n                \"scaleDistribution\": {\n                  \"type\": \"linear\"\n                },\n                \"showPoints\": \"never\",\n                \"spanNulls\": false,\n                \"stacking\": {\n                  \"group\": \"A\",\n                  \"mode\": \"none\"\n                },\n                \"thresholdsStyle\": {\n                  \"mode\": \"off\"\n                }\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*error.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#F2495C\",\n                      \"mode\": \"fixed\"\n                    }\n                  },\n                  {\n                    \"id\": \"custom.transform\",\n                    \"value\": \"negative-Y\"\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 66\n          },\n          \"id\": 157,\n          \"links\": [],\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"mean\",\n                \"lastNotNull\",\n                \"max\",\n                \"min\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"9.2.0\",\n          \"targets\": [\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_scrape_collector_success{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{collector}} - Scrape success\",\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"datasource\": {\n                \"type\": \"prometheus\",\n                \"uid\": \"${datasource}\"\n              },\n              \"expr\": \"node_textfile_scrape_error{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"hide\": false,\n              \"interval\": \"\",\n              \"intervalFactor\": 1,\n              \"legendFormat\": \"{{collector}} - Scrape textfile error (1 = true)\",\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Node Exporter Scrape\",\n          \"type\": \"timeseries\"\n        }\n      ],\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"000000001\"\n          },\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Node Exporter\",\n      \"type\": \"row\"\n    }\n  ],\n  \"refresh\": \"1m\",\n  \"revision\": 1,\n  \"schemaVersion\": 39,\n  \"tags\": [],\n  \"templating\": {\n    \"list\": [\n      {\n        \"current\": {\n          \"selected\": false,\n          \"text\": \"prometheus\",\n          \"value\": \"P1809F7CD0C75ACF3\"\n        },\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"label\": \"Datasource\",\n        \"multi\": false,\n        \"name\": \"datasource\",\n        \"options\": [],\n        \"query\": \"prometheus\",\n        \"queryValue\": \"\",\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"type\": \"datasource\"\n      },\n      {\n        \"current\": {\n          \"selected\": false,\n          \"text\": \"nyarlathotep-node\",\n          \"value\": \"nyarlathotep-node\"\n        },\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"${datasource}\"\n        },\n        \"definition\": \"\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"label\": \"Job\",\n        \"multi\": false,\n        \"name\": \"job\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"label_values(node_uname_info, job)\",\n          \"refId\": \"Prometheus-job-Variable-Query\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"sort\": 1,\n        \"tagValuesQuery\": \"\",\n        \"tagsQuery\": \"\",\n        \"type\": \"query\",\n        \"useTags\": false\n      },\n      {\n        \"current\": {\n          \"selected\": false,\n          \"text\": \"localhost:9100\",\n          \"value\": \"localhost:9100\"\n        },\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"${datasource}\"\n        },\n        \"definition\": \"label_values(node_uname_info{job=\\\"$job\\\"}, instance)\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"label\": \"Host\",\n        \"multi\": false,\n        \"name\": \"node\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"label_values(node_uname_info{job=\\\"$job\\\"}, instance)\",\n          \"refId\": \"Prometheus-node-Variable-Query\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"sort\": 1,\n        \"tagValuesQuery\": \"\",\n        \"tagsQuery\": \"\",\n        \"type\": \"query\",\n        \"useTags\": false\n      },\n      {\n        \"current\": {\n          \"selected\": false,\n          \"text\": \"[a-z]+|nvme[0-9]+n[0-9]+|mmcblk[0-9]+\",\n          \"value\": \"[a-z]+|nvme[0-9]+n[0-9]+|mmcblk[0-9]+\"\n        },\n        \"hide\": 2,\n        \"includeAll\": false,\n        \"multi\": false,\n        \"name\": \"diskdevices\",\n        \"options\": [\n          {\n            \"selected\": true,\n            \"text\": \"[a-z]+|nvme[0-9]+n[0-9]+|mmcblk[0-9]+\",\n            \"value\": \"[a-z]+|nvme[0-9]+n[0-9]+|mmcblk[0-9]+\"\n          }\n        ],\n        \"query\": \"[a-z]+|nvme[0-9]+n[0-9]+|mmcblk[0-9]+\",\n        \"skipUrlSync\": false,\n        \"type\": \"custom\"\n      }\n    ]\n  },\n  \"time\": {\n    \"from\": \"now-24h\",\n    \"to\": \"now\"\n  },\n  \"timepicker\": {\n    \"refresh_intervals\": [\n      \"5s\",\n      \"10s\",\n      \"30s\",\n      \"1m\",\n      \"5m\",\n      \"15m\",\n      \"30m\",\n      \"1h\",\n      \"2h\",\n      \"1d\"\n    ],\n    \"time_options\": [\n      \"5m\",\n      \"15m\",\n      \"1h\",\n      \"6h\",\n      \"12h\",\n      \"24h\",\n      \"2d\",\n      \"7d\",\n      \"30d\"\n    ]\n  },\n  \"timezone\": \"browser\",\n  \"title\": \"Node Stats (Detailed)\",\n  \"uid\": \"rYdddlPWk\",\n  \"version\": 1,\n  \"weekStart\": \"\"\n}"
  },
  {
    "path": "shared/default.nix",
    "content": "# Common configuration enabled on all hosts.\n#\n# **Alerts:**\n#\n# - A zpool is in \"degraded\" status (alertmanager)\n{ config, lib, pkgs, flakeInputs, ... }:\n\nwith lib;\n\nlet\n  promcfg = config.services.prometheus;\n  nodeExporter = promcfg.enable && config.services.prometheus.exporters.node.enable;\n\n  thereAreZfsFilesystems = any id (mapAttrsToList (_: attrs: attrs.fsType == \"zfs\") config.fileSystems);\n\n  firewallcfg = config.nixfiles.firewall;\n  readBlocklistFromFile = ''\n    cat ${firewallcfg.ipBlocklistFile} | sed 's/\\s//g' | sed 's/#.*$//' | grep . | while read ip; do\n      iptables -A barrucadu-ip-blocklist -s \"$ip\" -j DROP\n    done\n  '';\nin\n{\n  imports = [\n    ./options.nix\n    # modules\n    ./acme\n    ./bookdb\n    ./bookmarks\n    ./erase-your-darlings\n    ./finder\n    ./forgejo\n    ./foundryvtt\n    ./host-templates\n    ./minecraft\n    ./oci-containers\n    ./pleroma\n    ./resolved\n    ./restic-backups\n    ./torrents\n  ];\n\n  config = {\n    #############################################################################\n    ## General\n    #############################################################################\n\n    # The NixOS release to be compatible with for stateful data such as databases.\n    system.stateVersion = \"25.05\";\n\n    # Only keep the last 500MiB of systemd journal.\n    services.journald.extraConfig = \"SystemMaxUse=500M\";\n\n    # Collect nix store garbage and optimise daily.\n    nix.gc.automatic = true;\n    nix.gc.options = \"--delete-older-than 30d\";\n    nix.optimise.automatic = true;\n\n    # Enable flakes\n    nix.extraOptions = \"experimental-features = nix-command flakes\";\n\n    # Clear out /tmp after a fortnight and give all normal users a ~/tmp\n    # cleaned out weekly.\n    systemd.tmpfiles.rules = [ \"d /tmp 1777 root root 14d\" ] ++\n      (\n        let mkTmpDir = n: u: \"d ${u.home}/tmp 0700 ${n} ${u.group} 7d\";\n        in mapAttrsToList mkTmpDir (filterAttrs (_: u: u.isNormalUser) config.users.users)\n      );\n\n    # Enable passwd and co.\n    users.mutableUsers = true;\n\n    # Upgrade packages and reboot if needed\n    system.autoUpgrade.enable = true;\n    system.autoUpgrade.allowReboot = true;\n    system.autoUpgrade.flags = [ \"--recreate-lock-file\" ];\n    system.autoUpgrade.flake = \"/etc/nixos\";\n    system.autoUpgrade.dates = \"06:45\";\n\n    # Reboot on panic and oops\n    # https://utcc.utoronto.ca/~cks/space/blog/linux/RebootOnPanicSettings\n    boot.kernel.sysctl = {\n      \"kernel.panic\" = 10;\n      \"kernel.panic_on_oops\" = 1;\n    };\n\n    #############################################################################\n    ## Locale\n    #############################################################################\n\n    # Locale\n    i18n.defaultLocale = \"en_GB.UTF-8\";\n\n    # Timezone\n    services.timesyncd.enable = mkForce true;\n    time.timeZone = \"Europe/London\";\n\n    # Keyboard\n    console.keyMap = \"uk\";\n    services.xserver.xkb.layout = \"gb\";\n\n    #############################################################################\n    ## Firewall\n    #############################################################################\n\n    networking.firewall.enable = true;\n    networking.firewall.allowPing = true;\n    networking.firewall.trustedInterfaces = if config.nixfiles.oci-containers.backend == \"docker\" then [ \"docker0\" ] else [ \"podman\" ];\n\n    services.fail2ban.enable = true;\n\n    networking.firewall.extraCommands = ''\n      iptables -N barrucadu-ip-blocklist\n      ${if firewallcfg.ipBlocklistFile == null then \"\" else readBlocklistFromFile}\n      iptables -A barrucadu-ip-blocklist -j RETURN\n      iptables -A INPUT -j barrucadu-ip-blocklist\n    '';\n\n    networking.firewall.extraStopCommands = ''\n      if iptables -n --list barrucadu-ip-blocklist &>/dev/null; then\n        iptables -D INPUT -j barrucadu-ip-blocklist\n        iptables -F barrucadu-ip-blocklist\n        iptables -X barrucadu-ip-blocklist\n      fi\n    '';\n\n    #############################################################################\n    ## ZFS\n    #############################################################################\n\n    # Auto-trim is enabled per-pool:\n    # run `sudo zpool set autotrim=on <pool>`\n    services.zfs.trim.enable = thereAreZfsFilesystems;\n    services.zfs.trim.interval = \"weekly\";\n\n    # Auto-scrub applies to all pools, no need to set any pool\n    # properties.\n    services.zfs.autoScrub.enable = thereAreZfsFilesystems;\n    services.zfs.autoScrub.interval = \"monthly\";\n\n    # Auto-snapshot is enabled per dataset:\n    # run `sudo zfs set com.sun:auto-snapshot=true <dataset>`\n    #\n    # The default of 12 monthly snapshots takes up too much disk space\n    # in practice.\n    services.zfs.autoSnapshot.enable = thereAreZfsFilesystems;\n    services.zfs.autoSnapshot.monthly = 3;\n\n    # Actually panic when ZFS \"panics\"\n    # https://utcc.utoronto.ca/~cks/space/blog/linux/ZFSPanicsNotKernelPanics\n    boot.extraModprobeConfig = mkIf thereAreZfsFilesystems ''\n      options spl spl_panic_halt=1\n    '';\n\n    #############################################################################\n    ## Services\n    #############################################################################\n\n    # Every machine gets an sshd\n    services.openssh = {\n      enable = true;\n\n      # Only pubkey auth\n      settings.PasswordAuthentication = false;\n      settings.KbdInteractiveAuthentication = false;\n      authorizedKeysInHomedir = true;\n    };\n\n    # Start ssh-agent as a systemd user service\n    programs.ssh.startAgent = true;\n\n    # Mosh\n    programs.mosh = {\n      enable = true;\n      # make `who` work\n      withUtempter = true;\n    };\n\n    # Syncthing for shared folders (configured directly in the syncthing client)\n    services.syncthing = {\n      enable = true;\n      user = \"barrucadu\";\n      openDefaultPorts = true;\n    };\n\n    # Use podman for all the OCI container based services\n    nixfiles.oci-containers.backend = \"podman\";\n\n    # If running a docker registry, also enable deletion and garbage collection.\n    services.dockerRegistry.port = 46453;\n    services.dockerRegistry.enableDelete = config.services.dockerRegistry.enable;\n    services.dockerRegistry.enableGarbageCollect = config.services.dockerRegistry.enable;\n\n    #############################################################################\n    ## Dashboards & Alerting\n    #############################################################################\n\n    services.grafana = {\n      enable = promcfg.enable;\n      settings.server.http_port = 47652;\n      settings.\"auth.anonymous\".enabled = true;\n      provision.enable = true;\n      provision.datasources.settings.datasources = mkIf promcfg.enable [\n        {\n          name = \"prometheus\";\n          url = \"http://localhost:${toString promcfg.port}\";\n          type = \"prometheus\";\n        }\n      ];\n      provision.dashboards.settings.providers =\n        let\n          nodeExporterDashboard = { name = \"Node Stats (Detailed)\"; folder = \"Common\"; options.path = ./dashboards/node-stats-detailed.json; };\n        in\n        (if nodeExporter then [ nodeExporterDashboard ] else [ ]);\n    };\n\n    services.prometheus = {\n      enable = true;\n      listenAddress = \"127.0.0.1\";\n      port = 9090;\n      globalConfig.scrape_interval = \"15s\";\n      scrapeConfigs =\n        let\n          nodeExporterScraper = {\n            job_name = \"${config.networking.hostName}-node\";\n            static_configs = [{ targets = [ \"localhost:${toString promcfg.exporters.node.port}\" ]; }];\n          };\n        in\n        (if nodeExporter then [ nodeExporterScraper ] else [ ]);\n      alertmanagers = mkIf promcfg.alertmanager.enable [\n        {\n          static_configs = [{ targets = [ \"localhost:${toString promcfg.alertmanager.port}\" ]; }];\n        }\n      ];\n    };\n\n    services.prometheus.alertmanager = {\n      enable = promcfg.enable;\n      port = 9093;\n      configuration = {\n        route = {\n          group_by = [ \"alertname\" ];\n          repeat_interval = \"6h\";\n          receiver = \"aws-sns\";\n        };\n        receivers = [\n          {\n            name = \"aws-sns\";\n            sns_configs = [{\n              sigv4 = { region = \"eu-west-1\"; };\n              topic_arn = \"arn:aws:sns:eu-west-1:197544591260:host-notifications\";\n              subject = \"Alert: ${config.networking.hostName}\";\n            }];\n          }\n        ];\n      };\n    };\n\n    services.prometheus.rules = [\n      ''\n        groups:\n        - name: disk\n          rules:\n          - alert: DiskSpaceLow\n            expr: node_filesystem_avail_bytes{fstype!~\"(ramfs|tmpfs)\"} / node_filesystem_size_bytes < 0.1\n        - name: zfs\n          rules:\n          - alert: ZPoolStatusDegraded\n            expr: node_zfs_zpool_state{state!=\"online\"} > 0\n      ''\n    ];\n\n    # Host metrics\n    services.prometheus.exporters.node = {\n      enable = promcfg.enable;\n      enabledCollectors = [ \"processes\" \"systemd\" ];\n    };\n\n    # if a disk is mounted at /home, then the default value of\n    # `\"true\"` reports incorrect filesystem metrics\n    systemd.services.prometheus-node-exporter.serviceConfig.ProtectHome = mkForce \"read-only\";\n\n    #############################################################################\n    ## User accounts\n    #############################################################################\n\n    programs.zsh.enable = true;\n\n    users.users.barrucadu = {\n      uid = 1000;\n      description = \"Michael Walker <mike@barrucadu.co.uk>\";\n      isNormalUser = true;\n      extraGroups = [ config.nixfiles.oci-containers.backend \"wheel\" ];\n      group = \"users\";\n      initialPassword = \"breadbread\";\n      shell = pkgs.zsh;\n\n      packages = with pkgs; [\n        atuin\n        chezmoi\n        haskellPackages.hledger\n      ];\n\n      # Such pubkey!\n      openssh.authorizedKeys.keys = [\n        \"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDGsbaoX0seFfMTXePyaQchxU3g58xFMUipZPvddCT8c azathoth-windows\"\n        \"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIWvwOx9opSKGomvq8C3u1SghmaGiv0yiMZUdql6nBDB barrucadu@nyarlathotep\"\n        \"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJVnNyKbBcHMY7Tcak07bL6svb/x8KXCL5WJRck9PaDI barrucadu@carcosa\"\n        \"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJ5qZ+i88qWduVQHjnfm3KFdUnTOI0HBqBufGMfk/CkR yog-sothoth\"\n      ];\n    };\n\n\n    #############################################################################\n    ## Package management\n    #############################################################################\n\n    # gnupg doesn't come with pinentry, so require the agent\n    programs.gnupg.agent.enable = true;\n\n    # Allow packages with non-free licenses.\n    nixpkgs.config.allowUnfree = true;\n\n    # System-wide packages\n    environment.systemPackages = with pkgs; [\n      aspell\n      aspellDicts.en\n      bind\n      (if config.nixfiles.oci-containers.backend == \"docker\" then docker-compose else podman-compose)\n      emacs\n      fd\n      file\n      fortune\n      fzf\n      git\n      gnum4\n      gnupg\n      gnupg1compat\n      htop\n      imagemagick\n      iotop\n      lsof\n      lynx\n      man-pages\n      mtr\n      ncdu\n      psmisc\n      python3\n      ripgrep\n      rsync\n      shellcheck\n      smartmontools\n      stow\n      tmux\n      unzip\n      vim\n      wget\n      which\n      whois\n    ];\n  };\n}\n"
  },
  {
    "path": "shared/erase-your-darlings/default.nix",
    "content": "# Wipe `/` on boot, inspired by [\"erase your darlings\"][].\n#\n# This module is responsible for configuring standard NixOS options and\n# services, all of my modules have their own `erase-your-darlings.nix` file\n# which makes any changes that they need.\n#\n# This requires a setting up ZFS in a specific way when first installing NixOS.\n# See the [\"set up a new host\"][] runbook.\n#\n# [\"erase your darlings\"]: https://grahamc.com/blog/erase-your-darlings/\n# [\"set up a new host\"]: ./runbooks/set-up-a-new-host.md\n{ config, lib, ... }:\n\nwith lib;\n\nlet\n  cfg = config.nixfiles.eraseYourDarlings;\nin\n{\n  imports = [\n    ./options.nix\n  ];\n\n  config = mkIf cfg.enable {\n    # Wipe / on boot\n    boot.initrd.postResumeCommands = mkAfter ''\n      zfs rollback -r ${cfg.rootSnapshot}\n    '';\n\n    # Set /etc/machine-id, so that journalctl can access logs from\n    # previous boots.\n    environment.etc.machine-id = {\n      text = \"${cfg.machineId}\\n\";\n      mode = \"0444\";\n    };\n\n    # Switch back to immutable users\n    users.mutableUsers = mkForce false;\n    users.users.barrucadu.initialPassword = mkForce null;\n    users.users.barrucadu.hashedPasswordFile = cfg.barrucaduPasswordFile;\n\n    # Persist state in `cfg.persistDir`\n    services.openssh.hostKeys = [\n      {\n        path = \"${toString cfg.persistDir}/etc/ssh/ssh_host_ed25519_key\";\n        type = \"ed25519\";\n      }\n      {\n        path = \"${toString cfg.persistDir}/etc/ssh/ssh_host_rsa_key\";\n        type = \"rsa\";\n        bits = 4096;\n      }\n    ];\n\n    services.samba.settings.global = {\n      \"log file\" = \"/var/log/samba/%m.log\";\n      \"private dir\" = \"${toString cfg.persistDir}/var/lib/samba/private\";\n    };\n\n    systemd.tmpfiles.rules = [\n      \"L+ /etc/nixos - - - - ${toString cfg.persistDir}/etc/nixos\"\n    ];\n\n    systemd.services.prometheus.serviceConfig.BindPaths = \"${toString cfg.persistDir}/var/lib/${config.services.prometheus.stateDir}:/var/lib/${config.services.prometheus.stateDir}\";\n\n    # Needs real path, not a symlink\n    system.autoUpgrade.flake = mkForce \"${cfg.persistDir}/etc/nixos\";\n\n    services.caddy.dataDir = \"${toString cfg.persistDir}/var/lib/caddy\";\n    services.dockerRegistry.storagePath = \"${toString cfg.persistDir}/var/lib/docker-registry\";\n    services.syncthing.dataDir = \"${toString cfg.persistDir}/var/lib/syncthing\";\n  };\n}\n"
  },
  {
    "path": "shared/erase-your-darlings/options.nix",
    "content": "{ lib, ... }:\n\nwith lib;\n\n{\n  options.nixfiles.eraseYourDarlings = {\n    enable = mkOption {\n      type = types.bool;\n      default = false;\n      description = ''\n        Enable wiping `/` on boot and storing persistent data in\n        `''${persistDir}`.\n      '';\n    };\n\n    barrucaduPasswordFile = mkOption {\n      type = types.str;\n      description = ''\n        File containing the hashed password for `barrucadu`.\n\n        If using [sops-nix](https://github.com/Mic92/sops-nix) set the\n        `neededForUsers` option on the secret.\n      '';\n    };\n\n    rootSnapshot = mkOption {\n      type = types.str;\n      default = \"local/volatile/root@blank\";\n      description = ''\n        ZFS snapshot to roll back to on boot.\n      '';\n    };\n\n    persistDir = mkOption {\n      type = types.path;\n      default = \"/persist\";\n      description = ''\n        Persistent directory which will not be erased.  This must be on a\n        different ZFS dataset that will not be wiped when rolling back to the\n        `rootSnapshot`.\n\n        This module moves various files from `/` to here.\n      '';\n    };\n\n    machineId = mkOption {\n      type = types.str;\n      example = \"64b1b10f3bef4616a7faf5edf1ef3ca5\";\n      description = ''\n        An arbitrary 32-character hexadecimal string, used to identify the host.\n        This is needed for journalctl logs from previous boots to be accessible.\n\n        See [the systemd documentation](https://www.freedesktop.org/software/systemd/man/machine-id.html).\n      '';\n    };\n  };\n}\n"
  },
  {
    "path": "shared/finder/default.nix",
    "content": "# finder is a webapp to read downloaded manga.  There is no public deployment.\n#\n# finder uses a containerised elasticsearch database, and requires read access\n# to the filesystem where manga is stored.  It does not manage the manga, only\n# provides an interface to search and read.\n#\n# The database can be recreated from the manga files, so this module does not\n# include a backup script.\n{ config, lib, ... }:\n\nwith lib;\nlet\n  cfg = config.nixfiles.finder;\nin\n{\n  imports = [\n    ./options.nix\n  ];\n\n  config = mkIf cfg.enable {\n    nixfiles.oci-containers.pods.finder = {\n      containers = {\n        web = {\n          image = cfg.image;\n          environment = {\n            \"DATA_DIR\" = \"/data\";\n            \"ES_HOST\" = \"http://finder-db:9200\";\n          };\n          dependsOn = [ \"finder-db\" ];\n          ports = [{ host = cfg.port; inner = 8888; }];\n          volumes = [{ host = cfg.mangaDir; inner = \"/data\"; }];\n        };\n\n        db = {\n          image = \"mirror.gcr.io/elasticsearch:${cfg.elasticsearchTag}\";\n          environment = {\n            \"http.host\" = \"0.0.0.0\";\n            \"discovery.type\" = \"single-node\";\n            \"xpack.security.enabled\" = \"false\";\n            \"ES_JAVA_OPTS\" = \"-Xms512M -Xmx512M\";\n          };\n          volumes = [{ name = \"esdata\"; inner = \"/usr/share/elasticsearch/data\"; }];\n        };\n      };\n    };\n  };\n}\n"
  },
  {
    "path": "shared/finder/options.nix",
    "content": "{ lib, ... }:\n\nwith lib;\n\n{\n  options.nixfiles.finder = {\n    enable = mkOption {\n      type = types.bool;\n      default = false;\n      description = ''\n        Enable the finder service.\n      '';\n    };\n\n    image = mkOption {\n      type = types.str;\n      description = ''\n        Container image to run.\n      '';\n    };\n\n    port = mkOption {\n      type = types.int;\n      default = 44986;\n      description = ''\n        Port (on 127.0.0.1) to expose finder on.\n      '';\n    };\n\n    elasticsearchTag = mkOption {\n      type = types.str;\n      default = \"9.0.1\";\n      description = ''\n        Tag to use of the `elasticsearch` container image.\n      '';\n    };\n\n    mangaDir = mkOption {\n      type = types.path;\n      example = \"/mnt/nas/manga\";\n      description = ''\n        Directory to serve manga files from.\n      '';\n    };\n  };\n}\n"
  },
  {
    "path": "shared/forgejo/default.nix",
    "content": "# [Forgejo][] is git forge (I'll never like that term).  This module sets up an\n# instance with user registration disabled and an admin user set up.  The admin\n# user password path must be readable by the forgejo user.\n#\n# After initialising the instance log into the admin account and:\n#\n# 1. Set up non-admin users for normal usage.\n# 2. Generate a token for the runner, and update this configuration.\n#\n# Forgejo uses a containerised postgres database.\n#\n# **Backups:** the postgres database and state files (as a forgejo dump).\n#\n# [Forgejo]: https://forgejo.org/\n{ config, lib, pkgs, ... }:\n\nwith lib;\nlet\n  cfg = config.nixfiles.forgejo;\n  dbSocketDir = \"/run/forgejo-db\";\n\n  forgejoUser = config.services.forgejo.user;\n  forgejoGroup = config.services.forgejo.group;\nin\n{\n  imports = [\n    ./erase-your-darlings.nix\n    ./options.nix\n  ];\n\n  config = mkIf cfg.enable {\n    services.forgejo = {\n      enable = true;\n      package = pkgs.forgejo;\n      database = {\n        createDatabase = false;\n        socket = dbSocketDir;\n        type = \"postgres\";\n      };\n      dump = {\n        enable = true;\n        type = \"tar.xz\";\n      };\n      settings = {\n        actions = {\n          ENABLED = true;\n        };\n        server = {\n          DOMAIN = cfg.domain;\n          ROOT_URL = \"https://${cfg.domain}/\";\n          HTTP_PORT = cfg.port;\n          SSH_PORT = lib.head config.services.openssh.ports;\n        };\n        service = {\n          DISABLE_REGISTRATION = true;\n          REQUIRE_SIGNIN_VIEW = true;\n          ENABLE_BASIC_AUTHENTICATION = false;\n          ENABLE_TIMETRACKING = false;\n          DEFAULT_USER_VISIBILITY = \"limited\";\n          DEFAULT_ORG_VISIBILITY = \"limited\";\n        };\n        mailer = {\n          ENABLED = false;\n        };\n      };\n    };\n\n    systemd.services.forgejo = {\n      after = [ \"${config.nixfiles.oci-containers.backend}-pleroma-db.service\" ];\n      requires = [ \"${config.nixfiles.oci-containers.backend}-pleroma-db.service\" ];\n      preStart = let \n        cmd = \"${lib.getExe config.services.forgejo.package} admin user\";\n      in ''\n        ${cmd} create --admin --email \"root@localhost\" --username ${cfg.adminUserName} --password \"$(tr -d '\\n' < ${cfg.adminUserPasswordPath})\" || true\n        ${cmd} change-password --username ${cfg.adminUserName} --password \"$(tr -d '\\n' < ${cfg.adminUserPasswordPath})\" || true\n      '';\n    };\n\n    services.gitea-actions-runner = {\n      package = pkgs.forgejo-runner;\n      instances.default = mkIf (cfg.runnerTokenPath != null) {\n        enable = true;\n        name = \"default\";\n        url = config.services.forgejo.settings.server.ROOT_URL;\n        tokenFile = cfg.runnerTokenPath;\n        labels = [\n          \"nix:docker://mirror.gcr.io/nixos/nix:2.33.5\"\n        ];\n      };\n    };\n\n    users.users.\"${forgejoUser}\".uid = 980;\n    users.groups.\"${forgejoGroup}\".gid = 980;\n\n    nixfiles.oci-containers.pods.forgejo.containers.db = {\n      image = \"mirror.gcr.io/postgres:${cfg.postgresTag}\";\n      environment = {\n        \"POSTGRES_DB\" = \"forgejo\";\n        \"POSTGRES_USER\" = \"forgejo\";\n        \"POSTGRES_PASSWORD\" = \"forgejo\";\n      };\n      volumes = [\n        { name = \"pgdata\"; inner = \"/var/lib/postgresql\"; }\n        { host = dbSocketDir; inner = \"/var/run/postgresql\"; }\n      ];\n    };\n\n    systemd.tmpfiles.rules = [ \"d ${dbSocketDir} 0700 ${forgejoUser} ${forgejoGroup}\" ];\n\n    nixfiles.restic-backups.backups.forgejo = {\n      paths = [\n        config.services.forgejo.dump.backupDir\n      ];\n    };\n  };\n}\n"
  },
  {
    "path": "shared/forgejo/erase-your-darlings.nix",
    "content": "{ config, lib, ... }:\n\nwith lib;\nlet\n  cfg = config.nixfiles.forgejo;\n  eyd = config.nixfiles.eraseYourDarlings;\nin\n{\n  config = mkIf (cfg.enable && eyd.enable) {\n    services.forgejo.stateDir = \"${toString eyd.persistDir}/var/lib/forgejo\";\n  };\n}\n"
  },
  {
    "path": "shared/forgejo/options.nix",
    "content": "{ lib, ... }:\n\nwith lib;\n\n{\n  options.nixfiles.forgejo = {\n    enable = mkOption {\n      type = types.bool;\n      default = false;\n      description = ''\n        Enable the [Forgejo](https://forgejo.org/.\n      '';\n    };\n\n    port = mkOption {\n      type = types.int;\n      default = 46484;\n      description = ''\n        Port (on 127.0.0.1) to expose Forgejo on.\n      '';\n    };\n\n    postgresTag = mkOption {\n      type = types.str;\n      default = \"18\";\n      description = ''\n        Tag to use of the `postgres` container image.\n      '';\n    };\n\n    domain = mkOption {\n      type = types.str;\n      example = \"git.barrucadu.dev\";\n      description = ''\n        Domain which Forgejo will be exposed on.\n      '';\n    };\n\n    runnerTokenPath = mkOption {\n      type = types.nullOr types.path;\n      default = null;\n      description = ''\n        File in the format 'TOKEN=...' with the runner token.  If not specified,\n        the runner is not enabled.\n      '';\n    };\n\n    adminUserName = mkOption {\n      type = types.str;\n      default = \"root\";\n      description = ''\n        Name of the admin user (note: cannot be 'admin' as forgejo prevents\n        creation of a user called 'admin').\n      '';\n    };\n\n    adminUserPasswordPath = mkOption {\n      type = types.path;\n      description = ''\n        Path to a file containing the admin user password.\n      '';\n    };\n  };\n}\n"
  },
  {
    "path": "shared/foundryvtt/default.nix",
    "content": "# [FoundryVTT][] is a virtual tabletop to run roleplaying games.  It is licensed\n# software and needs to be downloaded after purchase.  This module doesn't\n# manage the FoundryVTT program files, only operating it.\n#\n# The downloaded FoundryVTT program files must be in `''${dataDir}/bin`.\n#\n# **Backups:** the data files - this requires briefly stopping the service, so\n# don't schedule backups during game time.\n#\n# **Erase your darlings:** overrides the `dataDir`.\n#\n# [FoundryVTT]: https://foundryvtt.com/\n{ config, lib, pkgs, ... }:\n\nwith lib;\nlet\n  cfg = config.nixfiles.foundryvtt;\nin\n{\n  imports = [\n    ./erase-your-darlings.nix\n    ./options.nix\n  ];\n\n  config = mkIf cfg.enable {\n    systemd.services.foundryvtt = {\n      enable = true;\n      description = \"Foundry Virtual Tabletop\";\n      wantedBy = [ \"multi-user.target\" ];\n      after = [ \"network.target\" ];\n      serviceConfig = {\n        ExecStart = \"${pkgs.nodejs_24}/bin/node resources/app/main.js --dataPath=${cfg.dataDir}/data --port=${toString cfg.port}\";\n        Restart = \"always\";\n        User = \"foundryvtt\";\n        WorkingDirectory = \"${cfg.dataDir}/bin\";\n      };\n    };\n\n    users.users.foundryvtt = {\n      uid = 994;\n      description = \"Foundry VTT service user\";\n      home = cfg.dataDir;\n      createHome = true;\n      isSystemUser = true;\n      group = \"nogroup\";\n    };\n\n    nixfiles.restic-backups.backups.foundryvtt = {\n      prepareCommand = ''\n        /run/wrappers/bin/sudo ${pkgs.systemd}/bin/systemctl stop foundryvtt\n      '';\n      cleanupCommand = ''\n        /run/wrappers/bin/sudo ${pkgs.systemd}/bin/systemctl start foundryvtt\n      '';\n      paths = [\n        cfg.dataDir\n      ];\n    };\n    nixfiles.restic-backups.sudoRules = [\n      { command = \"${pkgs.systemd}/bin/systemctl stop foundryvtt\"; }\n      { command = \"${pkgs.systemd}/bin/systemctl start foundryvtt\"; }\n    ];\n  };\n}\n"
  },
  {
    "path": "shared/foundryvtt/erase-your-darlings.nix",
    "content": "{ config, lib, ... }:\n\nwith lib;\nlet\n  cfg = config.nixfiles.foundryvtt;\n  eyd = config.nixfiles.eraseYourDarlings;\nin\n{\n  config = mkIf (cfg.enable && eyd.enable) {\n    nixfiles.foundryvtt.dataDir = \"${toString eyd.persistDir}/var/lib/foundryvtt\";\n  };\n}\n"
  },
  {
    "path": "shared/foundryvtt/options.nix",
    "content": "{ lib, ... }:\n\nwith lib;\n\n{\n  options.nixfiles.foundryvtt = {\n    enable = mkOption {\n      type = types.bool;\n      default = false;\n      description = ''\n        Enable the [FoundryVTT](https://foundryvtt.com/) service.\n      '';\n    };\n\n    port = mkOption {\n      type = types.int;\n      default = 46885;\n      description = ''\n        Port (on 127.0.0.1) to expose FoundryVTT on.\n      '';\n    };\n\n    dataDir = mkOption {\n      type = types.str;\n      default = \"/var/lib/foundryvtt\";\n      description = ''\n        Directory to store data files in.\n\n        The downloaded FoundryVTT program files must be in `''${dataDir}/bin`.\n\n        If the `erase-your-darlings` module is enabled, this is overridden to be\n        on the persistent volume.\n      '';\n    };\n  };\n}\n"
  },
  {
    "path": "shared/host-templates/default.nix",
    "content": "# Template configuration for a variety of functionality.\n#\n# See [the documentation for each template][].\n#\n# [the documentation for each template]: host-templates.html\n{ ... }:\n\n{\n  imports = [\n    ./website-mirror\n  ];\n}\n"
  },
  {
    "path": "shared/host-templates/website-mirror/default.nix",
    "content": "# Configures a webserver for the following domains:\n#\n# - {www,bookdb,bookmarks,memos,weeknotes,}barrucadu.co.uk\n# - {www,}barrucadu.com\n# - {www,}barrucadu.dev\n# - {www,}barrucadu.uk\n#\n# Access is configured for push-based updates:\n#\n# - Remote sync (defaulting to the nyarlathotep SSH key) for bookdb and bookmarks\n# - SSH and file ownership (defaulting to the concourse SSH key) for static websites\n#\n# Push needs to be configured in the appropriate places.\n{ config, lib, pkgs, ... }:\n\nwith lib;\nlet\n  baseDir =\n    if config.nixfiles.eraseYourDarlings.enable\n    then toString config.nixfiles.eraseYourDarlings.persistDir\n    else \"\";\n\n  httpDir = \"${baseDir}/srv/http\";\n  certDir = \"${baseDir}/var/lib/acme\";\n\n  caddyTlsConfig = certDomain: ''\n    tls ${certDir}/${certDomain}/cert.pem ${certDir}/${certDomain}/key.pem {\n      protocols tls1.3\n    }\n  '';\n\n  caddyConfig = ''\n    encode gzip\n\n    header Permissions-Policy \"interest-cohort=()\"\n    header Referrer-Policy \"strict-origin-when-cross-origin\"\n    header Strict-Transport-Security \"max-age=31536000; includeSubDomains\"\n    header X-Content-Type-Options \"nosniff\"\n    header X-Frame-Options \"SAMEORIGIN\"\n\n    header -Server\n  '';\n\n  mdBook = path: ''\n    root * ${httpDir}/${path}\n    file_server\n\n    handle_errors {\n      @404 {\n        expression {http.error.status_code} == 404\n      }\n      rewrite @404 /404.html\n      file_server\n    }\n  '';\n\n  cfg = config.nixfiles.hostTemplates.websiteMirror;\nin\n{\n  imports = [\n    ./options.nix\n  ];\n\n  config = mkIf cfg.enable {\n    ###############################################################################\n    ## Certificates\n    ###############################################################################\n\n    # Provision certificates via DNS challenge\n    nixfiles.acme = {\n      enable = true;\n      environmentFile = cfg.acmeEnvironmentFile;\n      domains.\"barrucadu.co.uk\" = { extraDomainNames = [ \"*.barrucadu.co.uk\" ]; };\n      domains.\"barrucadu.com\" = { extraDomainNames = [ \"*.barrucadu.com\" ]; };\n      domains.\"barrucadu.dev\" = { extraDomainNames = [ \"*.barrucadu.dev\" \"*.docs.barrucadu.dev\" ]; };\n      domains.\"barrucadu.uk\" = { extraDomainNames = [ \"*.barrucadu.uk\" ]; };\n    };\n\n\n    ###############################################################################\n    ## Websites\n    ###############################################################################\n\n    services.caddy.enable = true;\n\n    services.caddy.virtualHosts =\n      let\n        vhosts = {\n          \"barrucadu.co.uk\" = {\n            \"\" = ''\n              redir https://www.barrucadu.co.uk{uri}\n            '';\n            \"bookdb\" = ''\n              reverse_proxy http://127.0.0.1:${toString config.nixfiles.bookdb.port}\n            '';\n            \"bookmarks\" = ''\n              reverse_proxy http://127.0.0.1:${toString config.nixfiles.bookmarks.port}\n            '';\n            \"memo\" = ''\n              header /fonts/*   Cache-Control \"public, immutable, max-age=31536000\"\n              header /mathjax/* Cache-Control \"public, immutable, max-age=7776000\"\n              header /*.css     Cache-Control \"public, immutable, max-age=31536000\"\n\n              root * ${httpDir}/barrucadu.co.uk/memo\n              file_server\n\n              handle_errors {\n                @410 {\n                  expression {http.error.status_code} == 410\n                }\n                rewrite @410 /410.html\n                file_server\n              }\n\n              ${fileContents ./resources/memo-barrucadu-co-uk.caddyfile}\n            '';\n            \"weeknotes\" = ''\n              header /fonts/*   Cache-Control \"public, immutable, max-age=31536000\"\n              header /*.css     Cache-Control \"public, immutable, max-age=31536000\"\n\n              file_server  {\n                root ${httpDir}/barrucadu.co.uk/weeknotes\n              }\n            '';\n            \"www\" = ''\n              header /fonts/* Cache-Control \"public, immutable, max-age=31536000\"\n              header /*.css   Cache-Control \"public, immutable, max-age=31536000\"\n\n              root * ${httpDir}/barrucadu.co.uk/www\n              file_server\n\n              handle_errors {\n                @404 {\n                  expression {http.error.status_code} == 404\n                }\n                @410 {\n                  expression {http.error.status_code} == 410\n                }\n                rewrite @404 /404.html\n                rewrite @410 /410.html\n                file_server\n              }\n\n              ${fileContents ./resources/www-barrucadu-co-uk.caddyfile}\n            '';\n          };\n          \"barrucadu.com\" = {\n            \"\" = ''\n              redir https://www.barrucadu.co.uk\n            '';\n            \"www\" = ''\n              redir https://www.barrucadu.co.uk\n            '';\n          };\n          \"barrucadu.uk\" = {\n            \"\" = ''\n              redir https://www.barrucadu.co.uk\n            '';\n            \"www\" = ''\n              redir https://www.barrucadu.co.uk\n            '';\n          };\n          \"barrucadu.dev\" = {\n            \"\" = ''\n              redir https://www.barrucadu.co.uk\n            '';\n            \"www\" = ''\n              redir https://www.barrucadu.co.uk\n            '';\n            \"dejafu.docs\" = mdBook \"barrucadu.dev/docs/dejafu\";\n            \"nixfiles.docs\" = mdBook \"barrucadu.dev/docs/nixfiles\";\n            \"resolved.docs\" = mdBook \"barrucadu.dev/docs/resolved\";\n          };\n        };\n        mkVirtualHost = withTlsConfig: domain: subdomain: extraConfig: nameValuePair (if subdomain == \"\" then domain else \"${subdomain}.${domain}\") {\n          extraConfig = ''\n            ${caddyConfig}\n            ${optionalString withTlsConfig (caddyTlsConfig domain)}\n            ${extraConfig}\n          '';\n        };\n        mkVirtualHosts = domain: subdomains: mapAttrs' (mkVirtualHost true domain) subdomains;\n        mkPrefixedVirtualHosts = domain: subdomains: mapAttrs' (mkVirtualHost false \"${config.networking.hostName}.${domain}\") (filterAttrs (n: _: n != \"\") subdomains);\n      in\n      mkMerge [\n        (concatMapAttrs mkVirtualHosts vhosts)\n        (concatMapAttrs mkPrefixedVirtualHosts vhosts)\n      ];\n\n\n    ###############################################################################\n    ## Services\n    ###############################################################################\n\n    nixfiles.bookdb.enable = true;\n    nixfiles.bookdb.readOnly = true;\n\n    nixfiles.bookmarks.enable = true;\n    nixfiles.bookmarks.readOnly = true;\n\n    nixfiles.bookdb.remoteSync.receive.enable = config.nixfiles.bookdb.enable;\n    nixfiles.bookdb.remoteSync.receive.authorizedKeys = cfg.bookdbRemoteSyncAuthorizedKeys;\n\n    nixfiles.bookmarks.remoteSync.receive.enable = config.nixfiles.bookmarks.enable;\n    nixfiles.bookmarks.remoteSync.receive.authorizedKeys = cfg.bookmarksRemoteSyncAuthorizedKeys;\n\n\n    ###############################################################################\n    ## Miscellaneous\n    ###############################################################################\n\n    # Firewall\n    networking.firewall.allowedTCPPorts = [ 80 443 ];\n\n    # Concourse access\n    users.users.concourse-deploy-robot = {\n      uid = 997;\n      home = \"/var/lib/concourse-deploy-robot\";\n      createHome = true;\n      isSystemUser = true;\n      openssh.authorizedKeys.keys = cfg.concourseDeployRobotAuthorizedKeys;\n      shell = pkgs.bashInteractive;\n      group = \"nogroup\";\n    };\n\n    # Create needed directories if they don't already exist\n    systemd.tmpfiles.rules = [\n      # acme & caddy services\n      \"d ${certDir} - root root -\"\n      \"d ${baseDir}/var/lib/caddy 700 caddy caddy -\"\n      # static websites (for rsync - seems to want to traverse from /)\n      \"d ${baseDir}/srv - root root -\"\n      \"d ${httpDir} - root root -\"\n      \"d ${httpDir}/barrucadu.co.uk - root root -\"\n      \"d ${httpDir}/barrucadu.co.uk/memo - concourse-deploy-robot nogroup -\"\n      \"d ${httpDir}/barrucadu.co.uk/weeknotes - concourse-deploy-robot nogroup -\"\n      \"d ${httpDir}/barrucadu.co.uk/www - concourse-deploy-robot nogroup -\"\n      \"d ${httpDir}/barrucadu.dev - concourse-deploy-robot nogroup -\"\n      \"d ${httpDir}/barrucadu.dev/docs - concourse-deploy-robot nogroup -\"\n      \"d ${httpDir}/barrucadu.dev/docs/dejafu - concourse-deploy-robot nogroup -\"\n      \"d ${httpDir}/barrucadu.dev/docs/nixfiles - concourse-deploy-robot nogroup -\"\n      \"d ${httpDir}/barrucadu.dev/docs/resolved - concourse-deploy-robot nogroup -\"\n      # docker volumes\n      \"d ${config.nixfiles.oci-containers.volumeBaseDir}/bookdb/esdata - 1000 100 -\"\n      \"d ${config.nixfiles.oci-containers.volumeBaseDir}/bookmarks/esdata - 1000 100 -\"\n    ];\n  };\n}\n"
  },
  {
    "path": "shared/host-templates/website-mirror/options.nix",
    "content": "{ lib, ... }:\n\nwith lib;\n\n{\n  options.nixfiles.hostTemplates.websiteMirror = {\n    enable = mkOption {\n      type = types.bool;\n      default = false;\n      description = ''\n        Enable the website-mirror template.\n      '';\n    };\n\n    acmeEnvironmentFile = mkOption {\n      type = types.path;\n      description = ''\n        Environment file with AWS Route53 credentials for the ACME DNS-01 challenge.\n      '';\n    };\n\n    concourseDeployRobotAuthorizedKeys = mkOption {\n      type = types.listOf types.str;\n      default =\n        [ \"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFilTWek5xNpl82V48oQ99briJhn9BqwCACeRq1dQnZn concourse-worker@cd.barrucadu.dev\" ];\n      description = ''\n        SSH public keys to allow Concourse deployments from.\n      '';\n    };\n\n    bookdbRemoteSyncAuthorizedKeys = mkOption {\n      type = types.listOf types.str;\n      default =\n        [ \"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIChVw9DPLafA3lCLCI4Df9rYuxedFQTXAwDOOHUfZ0Ac remote-sync@nyarlathotep\" ];\n      description = ''\n        SSH public keys to allow bookdb remots sync from.\n      '';\n    };\n\n    bookmarksRemoteSyncAuthorizedKeys = mkOption {\n      type = types.listOf types.str;\n      default =\n        [ \"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIChVw9DPLafA3lCLCI4Df9rYuxedFQTXAwDOOHUfZ0Ac remote-sync@nyarlathotep\" ];\n      description = ''\n        SSH public keys to allow bookdb remots sync from.\n      '';\n    };\n  };\n}\n"
  },
  {
    "path": "shared/host-templates/website-mirror/resources/memo-barrucadu-co-uk.caddyfile",
    "content": "# SUPERSEDED\n\nredir /2018-budget.html /personal-finance.html permanent\nredir /concourseci-nixos.html /ci-cd.html permanent\nredir /hledger.html /personal-finance.html permanent\nredir /taxon/general-games.html /taxon/games.html permanent\nredir /taxon/general-games.xml /taxon/games.xml permanent\nredir /taxon/self-koans.html /taxon/general.html permanent\n\nerror /concourseci-on-nixos/barrucadu.co.uk-pipeline.png 410\nerror /concourseci-on-nixos/dashboard.png 410\nerror /taxon/self-koans.xml 410\n\n## By non-memos\nredir /backups.html https://github.com/barrucadu/nixfiles permanent\nredir /call-of-cthulhu-dice-rolls.html https://www.lookwhattheshoggothdraggedin.com/post/dice-rolls-in-call-of-cthulhu.html permanent\nredir /how-to-make-a-dejafu-release.html https://dejafu.readthedocs.io/en/latest/release_process.html permanent\nredir /how-to-set-up-a-new-machine.html https://github.com/barrucadu/nixfiles permanent\nredir /how-to-set-up-the-user-environment.html https://github.com/barrucadu/nixfiles permanent\nredir /machines.html https://github.com/barrucadu/nixfiles permanent\nredir /monitoring.html https://github.com/barrucadu/nixfiles permanent\nredir /sms-email-alerting.html https://github.com/barrucadu/nixfiles permanent\n\nerror /sms-email-alerting.png 410\n\n# -------------------------------------------------------------------------------\n# GONE\n\nerror /a-new-kind-of-imageboard.html 410\nerror /academic-mindset.html 410\nerror /blub-crisis.html 410\nerror /career-levels.html 410\nerror /contraptions-components-cables.html 410\nerror /game-systems.html 410\nerror /games-i-would-like-to-run.html 410\nerror /granfalloons.html 410\nerror /haskell-style-guide.html 410\nerror /how-to-add-new-emoji-to-pleroma.html 410\nerror /how-to-fix-lainradio.html 410\nerror /how-to-update-pihole.html 410\nerror /imageboards.html 410\nerror /incident-20210901-nyarlathotep-zpool-degraded.html 410\nerror /incident-report-template.html 410\nerror /m4-is-good.html 410\nerror /magic-mechanics.html 410\nerror /memo-organisation.html 410\nerror /memos-vs-blog-posts.html 410\nerror /one-shot-ideas.html 410\nerror /read-me-first.html 410\nerror /running-a-yusu-society.html 410\nerror /sed-as-a-service.html 410\nerror /slog17.html 410\nerror /symlinks-are-bad.html 410\nerror /taxon/techdocs-practices.html 410\nerror /taxon/techdocs-practices.xml 410\nerror /tea.html 410\nerror /texttt-vs-verb.html 410\nerror /the-way.html 410\nerror /time-tracking.html 410\n\nerror /incident-20210901-nyarlathoteop-zpool-degraded/prometheus-state-change.png 410\nerror /incident-20210901-nyarlathoteop-zpool-degraded/uptime.png 410\nerror /running-a-yusu-society/societea-journal.txt 410\nerror /running-a-yusu-society/societea-report.txt 410\n\n## Moved to personal notes\nerror /book-wishlist.html 410\nerror /cd-wishlist.html 410\n\nerror /kitchen-staples.html 410\nerror /recipe-bolognese.html 410\nerror /recipe-bread.html 410\nerror /recipe-chilli-slow-cooker.html 410\nerror /recipe-chilli.html 410\nerror /recipe-cottage-pie.html 410\nerror /recipe-flapjacks.html 410\nerror /recipe-pasta-bake.html 410\nerror /taxon/self-recipes.html 410\nerror /taxon/self-recipes.xml 410\n\nerror /campaign-notes-2018-09-masks-of-nyarlathotep.html 410\nerror /campaign-notes-2020-02-apocalypse-world.html 410\nerror /campaign-notes-2020-04-golden-sky-stories.html 410\nerror /campaign-notes-2020-05-call-of-cthulhu.html 410\nerror /campaign-notes-2021-10-traveller.html 410\nerror /campaign-notes-2021-11-ars-magica.html 410\nerror /campaign-notes-2022-06-cartographic-curiosities.html 410\nerror /campaign-notes-2022-08-goadventuring.html 410\nerror /campaign-notes-2022-09-wicked-ones.html 410\nerror /campaign-notes-2022-11-sylea-rising.html 410\nerror /taxon/games-campaigns.html 410\nerror /taxon/games-campaigns.xml 410\n\nerror /campaign-notes-2020-05-call-of-cthulhu/ap-telegram.jpg 410\nerror /campaign-notes-2020-05-call-of-cthulhu/central-america.png 410\nerror /campaign-notes-2020-05-call-of-cthulhu/city-of-the-great-race.jpg 410\nerror /campaign-notes-2020-05-call-of-cthulhu/city-of-the-great-race.xcf 410\nerror /campaign-notes-2020-05-call-of-cthulhu/quebec.png 410\nerror /campaign-notes-2020-05-call-of-cthulhu/rachels-notes-eye-of-light-and-darkness.png 410\nerror /campaign-notes-2020-05-call-of-cthulhu/rachels-notes-eye-of-light-and-darkness.xcf 410\nerror /campaign-notes-2020-05-call-of-cthulhu/san-jose-herald.png 410\nerror /campaign-notes-2020-05-call-of-cthulhu/the-aftermath.png 410\nerror /campaign-notes-2021-10-traveller/astraea-filipovna.png 410\nerror /campaign-notes-2021-10-traveller/far-trader.png 410\nerror /campaign-notes-2021-10-traveller/harrier.png 410\nerror /campaign-notes-2021-10-traveller/htoua.jpg 410\nerror /campaign-notes-2021-10-traveller/ilijah-veryn.png 410\nerror /campaign-notes-2021-10-traveller/lynette-hershey.png 410\nerror /campaign-notes-2021-10-traveller/metadata.xml 410\nerror /campaign-notes-2021-10-traveller/orcan-march.png 410\nerror /campaign-notes-2021-10-traveller/poster.png 410\nerror /campaign-notes-2021-10-traveller/scout-courier.png 410\nerror /campaign-notes-2021-10-traveller/sector-data.txt 410\nerror /campaign-notes-2021-10-traveller/xavier-echithilei.png 410\nerror /campaign-notes-2022-06-cartographic-curiosities/.gitignore 410\nerror /campaign-notes-2022-06-cartographic-curiosities/1406-the-golden-wood.pdf 410\nerror /campaign-notes-2022-06-cartographic-curiosities/1406-the-golden-wood.tex 410\nerror /campaign-notes-2022-06-cartographic-curiosities/hexmap.png 410\nerror /campaign-notes-2022-06-cartographic-curiosities/hexmap.xcf 410\nerror /campaign-notes-2022-11-sylea-rising/bulletins/01.html 410\nerror /campaign-notes-2022-11-sylea-rising/bulletins/02.html 410\nerror /campaign-notes-2022-11-sylea-rising/bulletins/sfss-bulletin.css 410\nerror /campaign-notes-2022-11-sylea-rising/bulletins/sfss-logo.svg 410\nerror /campaign-notes-2022-11-sylea-rising/bulletins/template.html 410\nerror /campaign-notes-2022-11-sylea-rising/generate-worlds-html.py 410\nerror /campaign-notes-2022-11-sylea-rising/lishun-metadata--players.xml 410\nerror /campaign-notes-2022-11-sylea-rising/lishun-metadata.xml 410\nerror /campaign-notes-2022-11-sylea-rising/lishun-poster--players.png 410\nerror /campaign-notes-2022-11-sylea-rising/lishun-poster.png 410\nerror /campaign-notes-2022-11-sylea-rising/lishun-sector-data--players.txt 410\nerror /campaign-notes-2022-11-sylea-rising/lishun-sector-data.txt 410\nerror /campaign-notes-2022-11-sylea-rising/tweak-uwps.py 410\n\n\n# -------------------------------------------------------------------------------\n# WEEKNOTES\n\nredir /taxon/weeknotes.html https://weeknotes.barrucadu.co.uk permanent\nredir /taxon/weeknotes.xml https://weeknotes.barrucadu.co.uk/atom.xml permanent\n\nredir /taxon/weeknotes-2022.html https://weeknotes.barrucadu.co.uk permanent\nredir /taxon/weeknotes-2021.html https://weeknotes.barrucadu.co.uk permanent\nredir /taxon/weeknotes-2020.html https://weeknotes.barrucadu.co.uk permanent\nredir /taxon/weeknotes-2019.html https://weeknotes.barrucadu.co.uk permanent\nredir /taxon/weeknotes-2018.html https://weeknotes.barrucadu.co.uk permanent\n\nerror /taxon/weeknotes-2022.xml 410\nerror /taxon/weeknotes-2021.xml 410\nerror /taxon/weeknotes-2020.xml 410\nerror /taxon/weeknotes-2019.xml 410\nerror /taxon/weeknotes-2018.xml 410\n\nerror /weeknotes-template.html 410\n\nredir /weeknotes-001.html https://weeknotes.barrucadu.co.uk/notes/001.html permanent\nredir /weeknotes-002.html https://weeknotes.barrucadu.co.uk/notes/002.html permanent\nredir /weeknotes-003.html https://weeknotes.barrucadu.co.uk/notes/003.html permanent\nredir /weeknotes-004.html https://weeknotes.barrucadu.co.uk/notes/004.html permanent\nredir /weeknotes-005.html https://weeknotes.barrucadu.co.uk/notes/005.html permanent\nredir /weeknotes-006.html https://weeknotes.barrucadu.co.uk/notes/006.html permanent\nredir /weeknotes-007.html https://weeknotes.barrucadu.co.uk/notes/007.html permanent\nredir /weeknotes-008.html https://weeknotes.barrucadu.co.uk/notes/008.html permanent\nredir /weeknotes-009.html https://weeknotes.barrucadu.co.uk/notes/009.html permanent\nredir /weeknotes-010.html https://weeknotes.barrucadu.co.uk/notes/010.html permanent\nredir /weeknotes-011.html https://weeknotes.barrucadu.co.uk/notes/011.html permanent\nredir /weeknotes-012.html https://weeknotes.barrucadu.co.uk/notes/012.html permanent\nredir /weeknotes-013.html https://weeknotes.barrucadu.co.uk/notes/013.html permanent\nredir /weeknotes-014.html https://weeknotes.barrucadu.co.uk/notes/014.html permanent\nredir /weeknotes-015.html https://weeknotes.barrucadu.co.uk/notes/015.html permanent\nredir /weeknotes-016.html https://weeknotes.barrucadu.co.uk/notes/016.html permanent\nredir /weeknotes-017.html https://weeknotes.barrucadu.co.uk/notes/017.html permanent\nredir /weeknotes-018.html https://weeknotes.barrucadu.co.uk/notes/018.html permanent\nredir /weeknotes-019.html https://weeknotes.barrucadu.co.uk/notes/019.html permanent\nredir /weeknotes-020.html https://weeknotes.barrucadu.co.uk/notes/020.html permanent\nredir /weeknotes-021.html https://weeknotes.barrucadu.co.uk/notes/021.html permanent\nredir /weeknotes-022.html https://weeknotes.barrucadu.co.uk/notes/022.html permanent\nredir /weeknotes-023.html https://weeknotes.barrucadu.co.uk/notes/023.html permanent\nredir /weeknotes-024.html https://weeknotes.barrucadu.co.uk/notes/024.html permanent\nredir /weeknotes-025.html https://weeknotes.barrucadu.co.uk/notes/025.html permanent\nredir /weeknotes-026.html https://weeknotes.barrucadu.co.uk/notes/026.html permanent\nredir /weeknotes-027.html https://weeknotes.barrucadu.co.uk/notes/027.html permanent\nredir /weeknotes-028.html https://weeknotes.barrucadu.co.uk/notes/028.html permanent\nredir /weeknotes-029.html https://weeknotes.barrucadu.co.uk/notes/029.html permanent\nredir /weeknotes-030.html https://weeknotes.barrucadu.co.uk/notes/030.html permanent\nredir /weeknotes-031.html https://weeknotes.barrucadu.co.uk/notes/031.html permanent\nredir /weeknotes-032.html https://weeknotes.barrucadu.co.uk/notes/032.html permanent\nredir /weeknotes-033.html https://weeknotes.barrucadu.co.uk/notes/033.html permanent\nredir /weeknotes-034.html https://weeknotes.barrucadu.co.uk/notes/034.html permanent\nredir /weeknotes-035.html https://weeknotes.barrucadu.co.uk/notes/035.html permanent\nredir /weeknotes-036.html https://weeknotes.barrucadu.co.uk/notes/036.html permanent\nredir /weeknotes-037.html https://weeknotes.barrucadu.co.uk/notes/037.html permanent\nredir /weeknotes-038.html https://weeknotes.barrucadu.co.uk/notes/038.html permanent\nredir /weeknotes-039.html https://weeknotes.barrucadu.co.uk/notes/039.html permanent\nredir /weeknotes-040.html https://weeknotes.barrucadu.co.uk/notes/040.html permanent\nredir /weeknotes-041.html https://weeknotes.barrucadu.co.uk/notes/041.html permanent\nredir /weeknotes-042.html https://weeknotes.barrucadu.co.uk/notes/042.html permanent\nredir /weeknotes-043.html https://weeknotes.barrucadu.co.uk/notes/043.html permanent\nredir /weeknotes-044.html https://weeknotes.barrucadu.co.uk/notes/044.html permanent\nredir /weeknotes-045.html https://weeknotes.barrucadu.co.uk/notes/045.html permanent\nredir /weeknotes-046.html https://weeknotes.barrucadu.co.uk/notes/046.html permanent\nredir /weeknotes-047.html https://weeknotes.barrucadu.co.uk/notes/047.html permanent\nredir /weeknotes-048.html https://weeknotes.barrucadu.co.uk/notes/048.html permanent\nredir /weeknotes-049.html https://weeknotes.barrucadu.co.uk/notes/049.html permanent\nredir /weeknotes-050.html https://weeknotes.barrucadu.co.uk/notes/050.html permanent\nredir /weeknotes-051.html https://weeknotes.barrucadu.co.uk/notes/051.html permanent\nredir /weeknotes-052.html https://weeknotes.barrucadu.co.uk/notes/052.html permanent\nredir /weeknotes-053.html https://weeknotes.barrucadu.co.uk/notes/053.html permanent\nredir /weeknotes-054.html https://weeknotes.barrucadu.co.uk/notes/054.html permanent\nredir /weeknotes-055.html https://weeknotes.barrucadu.co.uk/notes/055.html permanent\nredir /weeknotes-056.html https://weeknotes.barrucadu.co.uk/notes/056.html permanent\nredir /weeknotes-057.html https://weeknotes.barrucadu.co.uk/notes/057.html permanent\nredir /weeknotes-058.html https://weeknotes.barrucadu.co.uk/notes/058.html permanent\nredir /weeknotes-059.html https://weeknotes.barrucadu.co.uk/notes/059.html permanent\nredir /weeknotes-060.html https://weeknotes.barrucadu.co.uk/notes/060.html permanent\nredir /weeknotes-061.html https://weeknotes.barrucadu.co.uk/notes/061.html permanent\nredir /weeknotes-062.html https://weeknotes.barrucadu.co.uk/notes/062.html permanent\nredir /weeknotes-063.html https://weeknotes.barrucadu.co.uk/notes/063.html permanent\nredir /weeknotes-064.html https://weeknotes.barrucadu.co.uk/notes/064.html permanent\nredir /weeknotes-065.html https://weeknotes.barrucadu.co.uk/notes/065.html permanent\nredir /weeknotes-066.html https://weeknotes.barrucadu.co.uk/notes/066.html permanent\nredir /weeknotes-067.html https://weeknotes.barrucadu.co.uk/notes/067.html permanent\nredir /weeknotes-068.html https://weeknotes.barrucadu.co.uk/notes/068.html permanent\nredir /weeknotes-069.html https://weeknotes.barrucadu.co.uk/notes/069.html permanent\nredir /weeknotes-070.html https://weeknotes.barrucadu.co.uk/notes/070.html permanent\nredir /weeknotes-071.html https://weeknotes.barrucadu.co.uk/notes/071.html permanent\nredir /weeknotes-072.html https://weeknotes.barrucadu.co.uk/notes/072.html permanent\nredir /weeknotes-073.html https://weeknotes.barrucadu.co.uk/notes/073.html permanent\nredir /weeknotes-074.html https://weeknotes.barrucadu.co.uk/notes/074.html permanent\nredir /weeknotes-075.html https://weeknotes.barrucadu.co.uk/notes/075.html permanent\nredir /weeknotes-076.html https://weeknotes.barrucadu.co.uk/notes/076.html permanent\nredir /weeknotes-077.html https://weeknotes.barrucadu.co.uk/notes/077.html permanent\nredir /weeknotes-078.html https://weeknotes.barrucadu.co.uk/notes/078.html permanent\nredir /weeknotes-079.html https://weeknotes.barrucadu.co.uk/notes/079.html permanent\nredir /weeknotes-080.html https://weeknotes.barrucadu.co.uk/notes/080.html permanent\nredir /weeknotes-081.html https://weeknotes.barrucadu.co.uk/notes/081.html permanent\nredir /weeknotes-082.html https://weeknotes.barrucadu.co.uk/notes/082.html permanent\nredir /weeknotes-083.html https://weeknotes.barrucadu.co.uk/notes/083.html permanent\nredir /weeknotes-084.html https://weeknotes.barrucadu.co.uk/notes/084.html permanent\nredir /weeknotes-085.html https://weeknotes.barrucadu.co.uk/notes/085.html permanent\nredir /weeknotes-086.html https://weeknotes.barrucadu.co.uk/notes/086.html permanent\nredir /weeknotes-087.html https://weeknotes.barrucadu.co.uk/notes/087.html permanent\nredir /weeknotes-088.html https://weeknotes.barrucadu.co.uk/notes/088.html permanent\nredir /weeknotes-089.html https://weeknotes.barrucadu.co.uk/notes/089.html permanent\nredir /weeknotes-090.html https://weeknotes.barrucadu.co.uk/notes/090.html permanent\nredir /weeknotes-091.html https://weeknotes.barrucadu.co.uk/notes/091.html permanent\nredir /weeknotes-092.html https://weeknotes.barrucadu.co.uk/notes/092.html permanent\nredir /weeknotes-093.html https://weeknotes.barrucadu.co.uk/notes/093.html permanent\nredir /weeknotes-094.html https://weeknotes.barrucadu.co.uk/notes/094.html permanent\nredir /weeknotes-095.html https://weeknotes.barrucadu.co.uk/notes/095.html permanent\nredir /weeknotes-096.html https://weeknotes.barrucadu.co.uk/notes/096.html permanent\nredir /weeknotes-097.html https://weeknotes.barrucadu.co.uk/notes/097.html permanent\nredir /weeknotes-098.html https://weeknotes.barrucadu.co.uk/notes/098.html permanent\nredir /weeknotes-099.html https://weeknotes.barrucadu.co.uk/notes/099.html permanent\nredir /weeknotes-100.html https://weeknotes.barrucadu.co.uk/notes/100.html permanent\nredir /weeknotes-101.html https://weeknotes.barrucadu.co.uk/notes/101.html permanent\nredir /weeknotes-102.html https://weeknotes.barrucadu.co.uk/notes/102.html permanent\nredir /weeknotes-103.html https://weeknotes.barrucadu.co.uk/notes/103.html permanent\nredir /weeknotes-104.html https://weeknotes.barrucadu.co.uk/notes/104.html permanent\nredir /weeknotes-105.html https://weeknotes.barrucadu.co.uk/notes/105.html permanent\nredir /weeknotes-106.html https://weeknotes.barrucadu.co.uk/notes/106.html permanent\nredir /weeknotes-107.html https://weeknotes.barrucadu.co.uk/notes/107.html permanent\nredir /weeknotes-108.html https://weeknotes.barrucadu.co.uk/notes/108.html permanent\nredir /weeknotes-109.html https://weeknotes.barrucadu.co.uk/notes/109.html permanent\nredir /weeknotes-110.html https://weeknotes.barrucadu.co.uk/notes/110.html permanent\nredir /weeknotes-111.html https://weeknotes.barrucadu.co.uk/notes/111.html permanent\nredir /weeknotes-112.html https://weeknotes.barrucadu.co.uk/notes/112.html permanent\nredir /weeknotes-113.html https://weeknotes.barrucadu.co.uk/notes/113.html permanent\nredir /weeknotes-114.html https://weeknotes.barrucadu.co.uk/notes/114.html permanent\nredir /weeknotes-115.html https://weeknotes.barrucadu.co.uk/notes/115.html permanent\nredir /weeknotes-116.html https://weeknotes.barrucadu.co.uk/notes/116.html permanent\nredir /weeknotes-117.html https://weeknotes.barrucadu.co.uk/notes/117.html permanent\nredir /weeknotes-118.html https://weeknotes.barrucadu.co.uk/notes/118.html permanent\nredir /weeknotes-119.html https://weeknotes.barrucadu.co.uk/notes/119.html permanent\nredir /weeknotes-120.html https://weeknotes.barrucadu.co.uk/notes/120.html permanent\nredir /weeknotes-121.html https://weeknotes.barrucadu.co.uk/notes/121.html permanent\nredir /weeknotes-122.html https://weeknotes.barrucadu.co.uk/notes/122.html permanent\nredir /weeknotes-123.html https://weeknotes.barrucadu.co.uk/notes/123.html permanent\nredir /weeknotes-124.html https://weeknotes.barrucadu.co.uk/notes/124.html permanent\nredir /weeknotes-125.html https://weeknotes.barrucadu.co.uk/notes/125.html permanent\nredir /weeknotes-126.html https://weeknotes.barrucadu.co.uk/notes/126.html permanent\nredir /weeknotes-127.html https://weeknotes.barrucadu.co.uk/notes/127.html permanent\nredir /weeknotes-128.html https://weeknotes.barrucadu.co.uk/notes/128.html permanent\nredir /weeknotes-129.html https://weeknotes.barrucadu.co.uk/notes/129.html permanent\nredir /weeknotes-130.html https://weeknotes.barrucadu.co.uk/notes/130.html permanent\nredir /weeknotes-131.html https://weeknotes.barrucadu.co.uk/notes/131.html permanent\nredir /weeknotes-132.html https://weeknotes.barrucadu.co.uk/notes/132.html permanent\nredir /weeknotes-133.html https://weeknotes.barrucadu.co.uk/notes/133.html permanent\nredir /weeknotes-134.html https://weeknotes.barrucadu.co.uk/notes/134.html permanent\nredir /weeknotes-135.html https://weeknotes.barrucadu.co.uk/notes/135.html permanent\nredir /weeknotes-136.html https://weeknotes.barrucadu.co.uk/notes/136.html permanent\nredir /weeknotes-137.html https://weeknotes.barrucadu.co.uk/notes/137.html permanent\nredir /weeknotes-138.html https://weeknotes.barrucadu.co.uk/notes/138.html permanent\nredir /weeknotes-139.html https://weeknotes.barrucadu.co.uk/notes/139.html permanent\nredir /weeknotes-140.html https://weeknotes.barrucadu.co.uk/notes/140.html permanent\nredir /weeknotes-141.html https://weeknotes.barrucadu.co.uk/notes/141.html permanent\nredir /weeknotes-142.html https://weeknotes.barrucadu.co.uk/notes/142.html permanent\nredir /weeknotes-143.html https://weeknotes.barrucadu.co.uk/notes/143.html permanent\nredir /weeknotes-144.html https://weeknotes.barrucadu.co.uk/notes/144.html permanent\nredir /weeknotes-145.html https://weeknotes.barrucadu.co.uk/notes/145.html permanent\nredir /weeknotes-146.html https://weeknotes.barrucadu.co.uk/notes/146.html permanent\nredir /weeknotes-147.html https://weeknotes.barrucadu.co.uk/notes/147.html permanent\nredir /weeknotes-148.html https://weeknotes.barrucadu.co.uk/notes/148.html permanent\nredir /weeknotes-149.html https://weeknotes.barrucadu.co.uk/notes/149.html permanent\nredir /weeknotes-150.html https://weeknotes.barrucadu.co.uk/notes/150.html permanent\nredir /weeknotes-151.html https://weeknotes.barrucadu.co.uk/notes/151.html permanent\nredir /weeknotes-152.html https://weeknotes.barrucadu.co.uk/notes/152.html permanent\nredir /weeknotes-153.html https://weeknotes.barrucadu.co.uk/notes/153.html permanent\nredir /weeknotes-154.html https://weeknotes.barrucadu.co.uk/notes/154.html permanent\nredir /weeknotes-155.html https://weeknotes.barrucadu.co.uk/notes/155.html permanent\nredir /weeknotes-156.html https://weeknotes.barrucadu.co.uk/notes/156.html permanent\nredir /weeknotes-157.html https://weeknotes.barrucadu.co.uk/notes/157.html permanent\nredir /weeknotes-158.html https://weeknotes.barrucadu.co.uk/notes/158.html permanent\nredir /weeknotes-159.html https://weeknotes.barrucadu.co.uk/notes/159.html permanent\nredir /weeknotes-160.html https://weeknotes.barrucadu.co.uk/notes/160.html permanent\nredir /weeknotes-161.html https://weeknotes.barrucadu.co.uk/notes/161.html permanent\nredir /weeknotes-162.html https://weeknotes.barrucadu.co.uk/notes/162.html permanent\nredir /weeknotes-163.html https://weeknotes.barrucadu.co.uk/notes/163.html permanent\nredir /weeknotes-164.html https://weeknotes.barrucadu.co.uk/notes/164.html permanent\nredir /weeknotes-165.html https://weeknotes.barrucadu.co.uk/notes/165.html permanent\nredir /weeknotes-166.html https://weeknotes.barrucadu.co.uk/notes/166.html permanent\nredir /weeknotes-167.html https://weeknotes.barrucadu.co.uk/notes/167.html permanent\nredir /weeknotes-168.html https://weeknotes.barrucadu.co.uk/notes/168.html permanent\nredir /weeknotes-169.html https://weeknotes.barrucadu.co.uk/notes/169.html permanent\nredir /weeknotes-170.html https://weeknotes.barrucadu.co.uk/notes/170.html permanent\nredir /weeknotes-171.html https://weeknotes.barrucadu.co.uk/notes/171.html permanent\nredir /weeknotes-172.html https://weeknotes.barrucadu.co.uk/notes/172.html permanent\nredir /weeknotes-173.html https://weeknotes.barrucadu.co.uk/notes/173.html permanent\nredir /weeknotes-174.html https://weeknotes.barrucadu.co.uk/notes/174.html permanent\nredir /weeknotes-175.html https://weeknotes.barrucadu.co.uk/notes/175.html permanent\nredir /weeknotes-176.html https://weeknotes.barrucadu.co.uk/notes/176.html permanent\nredir /weeknotes-177.html https://weeknotes.barrucadu.co.uk/notes/177.html permanent\nredir /weeknotes-178.html https://weeknotes.barrucadu.co.uk/notes/178.html permanent\nredir /weeknotes-179.html https://weeknotes.barrucadu.co.uk/notes/179.html permanent\nredir /weeknotes-180.html https://weeknotes.barrucadu.co.uk/notes/180.html permanent\nredir /weeknotes-181.html https://weeknotes.barrucadu.co.uk/notes/181.html permanent\nredir /weeknotes-182.html https://weeknotes.barrucadu.co.uk/notes/182.html permanent\nredir /weeknotes-183.html https://weeknotes.barrucadu.co.uk/notes/183.html permanent\nredir /weeknotes-184.html https://weeknotes.barrucadu.co.uk/notes/184.html permanent\nredir /weeknotes-185.html https://weeknotes.barrucadu.co.uk/notes/185.html permanent\nredir /weeknotes-186.html https://weeknotes.barrucadu.co.uk/notes/186.html permanent\nredir /weeknotes-187.html https://weeknotes.barrucadu.co.uk/notes/187.html permanent\nredir /weeknotes-188.html https://weeknotes.barrucadu.co.uk/notes/188.html permanent\nredir /weeknotes-189.html https://weeknotes.barrucadu.co.uk/notes/189.html permanent\nredir /weeknotes-190.html https://weeknotes.barrucadu.co.uk/notes/190.html permanent\nredir /weeknotes-191.html https://weeknotes.barrucadu.co.uk/notes/191.html permanent\nredir /weeknotes-192.html https://weeknotes.barrucadu.co.uk/notes/192.html permanent\nredir /weeknotes-193.html https://weeknotes.barrucadu.co.uk/notes/193.html permanent\nredir /weeknotes-194.html https://weeknotes.barrucadu.co.uk/notes/194.html permanent\nredir /weeknotes-195.html https://weeknotes.barrucadu.co.uk/notes/195.html permanent\nredir /weeknotes-196.html https://weeknotes.barrucadu.co.uk/notes/196.html permanent\nredir /weeknotes-197.html https://weeknotes.barrucadu.co.uk/notes/197.html permanent\nredir /weeknotes-198.html https://weeknotes.barrucadu.co.uk/notes/198.html permanent\nredir /weeknotes-199.html https://weeknotes.barrucadu.co.uk/notes/199.html permanent\nredir /weeknotes-200.html https://weeknotes.barrucadu.co.uk/notes/200.html permanent\nredir /weeknotes-201.html https://weeknotes.barrucadu.co.uk/notes/201.html permanent\nredir /weeknotes-202.html https://weeknotes.barrucadu.co.uk/notes/202.html permanent\nredir /weeknotes-203.html https://weeknotes.barrucadu.co.uk/notes/203.html permanent\nredir /weeknotes-204.html https://weeknotes.barrucadu.co.uk/notes/204.html permanent\nredir /weeknotes-205.html https://weeknotes.barrucadu.co.uk/notes/205.html permanent\nredir /weeknotes-206.html https://weeknotes.barrucadu.co.uk/notes/206.html permanent\nredir /weeknotes-207.html https://weeknotes.barrucadu.co.uk/notes/207.html permanent\nredir /weeknotes-208.html https://weeknotes.barrucadu.co.uk/notes/208.html permanent\nredir /weeknotes-209.html https://weeknotes.barrucadu.co.uk/notes/209.html permanent\nredir /weeknotes-210.html https://weeknotes.barrucadu.co.uk/notes/210.html permanent\nredir /weeknotes-211.html https://weeknotes.barrucadu.co.uk/notes/211.html permanent\nredir /weeknotes-212.html https://weeknotes.barrucadu.co.uk/notes/212.html permanent\n\nredir /weeknotes-002/welsh.png https://weeknotes.barrucadu.co.uk/notes/002/welsh.png permanent\nredir /weeknotes-002/x-ray.png https://weeknotes.barrucadu.co.uk/notes/002/x-ray.png permanent\nredir /weeknotes-004/assets-vs-documents.png https://weeknotes.barrucadu.co.uk/notes/004/assets-vs-documents.png permanent\nredir /weeknotes-004/asset-workflow.png https://weeknotes.barrucadu.co.uk/notes/004/asset-workflow.png permanent\nredir /weeknotes-004/transition-architecture.png https://weeknotes.barrucadu.co.uk/notes/004/transition-architecture.png permanent\nredir /weeknotes-020/thesis.png https://weeknotes.barrucadu.co.uk/notes/020/thesis.png permanent\nredir /weeknotes-062/bank-holidays.png https://weeknotes.barrucadu.co.uk/notes/062/bank-holidays.png permanent\nredir /weeknotes-071/docs.png https://weeknotes.barrucadu.co.uk/notes/071/docs.png permanent\nredir /weeknotes-071/notion.png https://weeknotes.barrucadu.co.uk/notes/071/notion.png permanent\nredir /weeknotes-096/cheatsheet.pdf https://weeknotes.barrucadu.co.uk/notes/096/cheatsheet.pdf permanent\nredir /weeknotes-096/spellbook.pdf https://weeknotes.barrucadu.co.uk/notes/096/spellbook.pdf permanent\nredir /weeknotes-100/barking-permit.png https://weeknotes.barrucadu.co.uk/notes/100/barking-permit.png permanent\nredir /weeknotes-106/dashboard.png https://weeknotes.barrucadu.co.uk/notes/106/dashboard.png permanent\nredir /weeknotes-106/startpage.png https://weeknotes.barrucadu.co.uk/notes/106/startpage.png permanent\nredir /weeknotes-117/leisure-breakdown.png https://weeknotes.barrucadu.co.uk/notes/117/leisure-breakdown.png permanent\nredir /weeknotes-128/lookwhattheshoggothdraggedin.png https://weeknotes.barrucadu.co.uk/notes/128/lookwhattheshoggothdraggedin.png permanent\nredir /weeknotes-133/to-do.jpg https://weeknotes.barrucadu.co.uk/notes/133/to-do.jpg permanent\nredir /weeknotes-147/basics.pdf https://weeknotes.barrucadu.co.uk/notes/147/basics.pdf permanent\nredir /weeknotes-147/spacecraft.pdf https://weeknotes.barrucadu.co.uk/notes/147/spacecraft.pdf permanent\nredir /weeknotes-147/uwp.pdf https://weeknotes.barrucadu.co.uk/notes/147/uwp.pdf permanent\nredir /weeknotes-148/temperature.png https://weeknotes.barrucadu.co.uk/notes/148/temperature.png permanent\nredir /weeknotes-176/assets.png https://weeknotes.barrucadu.co.uk/notes/176/assets.png permanent\nredir /weeknotes-176/piracy.pdf https://weeknotes.barrucadu.co.uk/notes/176/piracy.pdf permanent\nredir /weeknotes-178/book-leak.jpg https://weeknotes.barrucadu.co.uk/notes/178/book-leak.jpg permanent\nredir /weeknotes-180/repetitive.jpg https://weeknotes.barrucadu.co.uk/notes/180/repetitive.jpg permanent\nredir /weeknotes-184/dns-dashboard.png https://weeknotes.barrucadu.co.uk/notes/184/dns-dashboard.png permanent\nredir /weeknotes-196/hot-springs-island-current-cover.jpg https://weeknotes.barrucadu.co.uk/notes/196/hot-springs-island-current-cover.jpg permanent\nredir /weeknotes-196/hot-springs-island-new-cover.jpg https://weeknotes.barrucadu.co.uk/notes/196/hot-springs-island-new-cover.jpg permanent\nredir /weeknotes-196/ose-photo.jpg https://weeknotes.barrucadu.co.uk/notes/196/ose-photo.jpg permanent\nredir /weeknotes-196/traveller-map.png https://weeknotes.barrucadu.co.uk/notes/196/traveller-map.png permanent\nredir /weeknotes-198/photo-hot-springs-island.jpg https://weeknotes.barrucadu.co.uk/notes/198/photo-hot-springs-island.jpg permanent\nredir /weeknotes-209/cult-of-the-lamb.jpg https://weeknotes.barrucadu.co.uk/notes/209/cult-of-the-lamb.jpg permanent\n"
  },
  {
    "path": "shared/host-templates/website-mirror/resources/www-barrucadu-co-uk.caddyfile",
    "content": "# Removed posts\nerror /posts/2013-05-27-a-gentle-introduction-to-parsec.html 410\nerror /posts/2014-01-07-garbage-collection.html 410\nerror /posts/2014-12-26-haskell-systematic-concurrency-testing.html 410\nerror /posts/2015-01-10-pre-emption-bounding.html 410\nerror /posts/2015-07-18-continuous-integration-with-jenkins-and-stack.html 410\nerror /posts/2015-07-26-erlang-gopher-server.html 410\nerror /posts/2015-08-01-debugging-an-allocation-issue.html 410\nerror /posts/2015-08-09-identity-monads-ahoy.html 410\nerror /posts/2015-09-23-icfp-retrospective.html 410\nerror /posts/2015-10-04-secure-communications-over-insecure-channels.html 410\nerror /posts/2015-12-15-finite-maps-in-isabelle.html 410\nerror /posts/2016-02-02-cabal-info.html 410\nerror /posts/2016-04-03-dejafu-0.3.0.0-release.html 410\nerror /posts/2016-05-18-some-thoughts-on-distributed-systems.html 410\nerror /posts/2016-09-10-dejafu-0.4.0.0-release.html 410\nerror /posts/2017-02-02-subconcurrency.html 410\nerror /posts/2017-02-21-concurrency-1.1.0.0-dejafu-0.5.0.1-release.html 410\n\nerror /posts/concurrency/2014-12-26-haskell-systematic-concurrency-testing.html 410\nerror /posts/concurrency/2015-01-10-pre-emption-bounding.html 410\nerror /posts/concurrency/2016-05-18-some-thoughts-on-distributed-systems.html 410\nerror /posts/concurrency/2017-02-02-subconcurrency.html 410\nerror /posts/etc/2013-05-27-a-gentle-introduction-to-parsec.html 410\nerror /posts/etc/2015-08-01-debugging-an-allocation-issue.html 410\nerror /posts/etc/2015-09-23-icfp-retrospective.html 410\nerror /posts/etc/2016-02-02-cabal-info.html 410\nerror /posts/etc/2017-03-15-optimising-haskell.html 410\nerror /posts/etc/2017-04-16-representing-generating-comparing-typed-expressions.html 410\nerror /posts/relnotes/2016-04-03-dejafu-0.3.0.0-release.html 410\nerror /posts/relnotes/2016-09-10-dejafu-0.4.0.0-release.html 410\nerror /posts/relnotes/2017-02-21-concurrency-1.1.0.0-dejafu-0.5.0.1-release.html 410\n\n# Moved proxies\nredir /bookdb   https://bookdb.barrucadu.co.uk permanent\nredir /bookdb/* https://bookdb.barrucadu.co.uk permanent\n\n# Removed files\nerror /now.html 410\n\n# Moved files\nredir /publications/coco-flops18-prelim.pdf /publications/coco-flops18.pdf permanent\nredir /publications/coco-flops18-prelim.bib /publications/coco-flops18.bib permanent\n\n# Renamed posts\nredir /posts/2015-08-21-reducing-combinatorial-explosion.html /posts/concurrency/2015-08-21-reducing-combinatorial-explosion.html permanent\nredir /posts/2015-08-27-announce-dejafu.html /posts/relnotes/2015-08-27-announce-dejafu.html permanent\nredir /posts/2015-11-29-breaking-the-law-verifying-typeclass-laws-with-quickcheck-and-dejafu.html /posts/concurrency/2015-11-29-breaking-the-law-verifying-typeclass-laws-with-quickcheck-and-dejafu.html permanent\nredir /posts/2016-01-09-c-is-not-turing-complete.html /posts/etc/2016-01-09-c-is-not-turing-complete.html permanent\nredir /posts/2016-02-12-strict-vs-lazy.html /posts/etc/2016-02-12-strict-vs-lazy.html permanent\nredir /posts/2016-05-13-systematic-concurrency-testing-and-daemon-threads.html /posts/concurrency/2016-05-13-systematic-concurrency-testing-and-daemon-threads.html permanent\nredir /posts/2016-08-25-three-months-of-go.html /posts/etc/2016-08-25-three-months-of-go.html permanent\n\n# Converted to memos\nredir /posts/concurrency/2015-08-21-reducing-combinatorial-explosion.html https://memo.barrucadu.co.uk/reducing-combinatorial-explosion.html permanent\nredir /posts/concurrency/2015-11-29-breaking-the-law-verifying-typeclass-laws-with-quickcheck-and-dejafu.html https://memo.barrucadu.co.uk/concurrency-and-typeclass-laws.html permanent\nredir /posts/concurrency/2016-05-13-systematic-concurrency-testing-and-daemon-threads.html https://memo.barrucadu.co.uk/sct-and-daemons.html permanent\nredir /posts/concurrency/2017-06-09-property-testing-side-effects.html https://memo.barrucadu.co.uk/property-testing-side-effects.html permanent\nredir /posts/concurrency/2017-10-14-writing-a-concurrency-testing-library-01.html https://memo.barrucadu.co.uk/minifu-01.html permanent\nredir /posts/concurrency/2017-10-28-writing-a-concurrency-testing-library-02.html https://memo.barrucadu.co.uk/minifu-02.html permanent\nredir /posts/etc/2016-01-09-c-is-not-turing-complete.html https://memo.barrucadu.co.uk/c-is-not-turing-complete.html permanent\nredir /posts/etc/2016-02-12-strict-vs-lazy.html https://memo.barrucadu.co.uk/strict-vs-lazy.html permanent\nredir /posts/etc/2016-08-25-three-months-of-go.html https://memo.barrucadu.co.uk/three-months-of-go.html permanent\nredir /posts/etc/2017-05-18-visualise-your-finances-with-hledger-influxdb-grafana.html https://memo.barrucadu.co.uk/hledger-influxdb-grafana.html permanent\nredir /posts/etc/2017-12-06-the-academic-mindset-and-me.html https://memo.barrucadu.co.uk/academic-mindset.html permanent\nredir /posts/etc/2017-12-16-i-need-a-budget.html https://memo.barrucadu.co.uk/2018-budget.html permanent\nredir /posts/relnotes/2015-08-27-announce-dejafu.html https://memo.barrucadu.co.uk/dejafu-0.1.0.0.html permanent\nredir /posts/relnotes/2017-08-16-significant-performance-improvements.html https://memo.barrucadu.co.uk/throwing-away-traces.html permanent\nredir /posts/relnotes/2017-09-22-irc-client-1.0.0.0.html https://memo.barrucadu.co.uk/irc-client-1.0.0.0.html permanent\n"
  },
  {
    "path": "shared/minecraft/default.nix",
    "content": "# [Minecraft][] Java Edition runner.  Supports multiple servers, with mods.\n# This module doesn't manage the Minecraft server files, only operating them.\n#\n# Yes, I know there's a NixOS minecraft module, but it uses the Minecraft in\n# nixpkgs and only runs one server, whereas I want to run multiple modded\n# servers.\n#\n# The Minecraft server files must be in `''${dataDir}/{name}`.\n#\n# This module does not include a backup script.  Servers must be backed up\n# independently.\n#\n# **Erase your darlings:** overrides the `dataDir`.\n#\n# [Minecraft]: https://www.minecraft.net/en-us\n{ config, lib, pkgs, ... }:\n\nwith lib;\nlet\n  cfg = config.nixfiles.minecraft;\n\n  serverPorts = mapAttrsToList (_: server: server.port) cfg.servers;\nin\n{\n  imports = [\n    ./erase-your-darlings.nix\n    ./options.nix\n  ];\n\n  config = mkIf cfg.enable {\n    # from https://github.com/NixOS/nixpkgs/blob/nixos-unstable/nixos/modules/services/games/minecraft-server.nix\n    users.users.minecraft = {\n      uid = 993;\n      description = \"Minecraft server service user\";\n      home = cfg.dataDir;\n      createHome = true;\n      isSystemUser = true;\n      group = \"nogroup\";\n    };\n\n    systemd.sockets =\n      let\n        make = name: _: nameValuePair \"minecraft-${name}-stdin\"\n          {\n            description = \"stdin for minecraft-${name}\";\n            socketConfig = {\n              ListenFIFO = \"%t/minecraft-${name}.stdin\";\n              Service = \"minecraft-${name}.service\";\n            };\n          };\n      in\n      mapAttrs' make cfg.servers;\n\n    systemd.services =\n      let\n        make = name: server: nameValuePair \"minecraft-${name}\"\n          {\n            description = \"Minecraft Server Service (${name})\";\n            wantedBy = if server.autoStart then [ \"multi-user.target\" ] else [ ];\n            after = [ \"network.target\" ];\n\n            serviceConfig = {\n              ExecStart = \"${server.jre}/bin/java ${server.jvmOpts} -jar ${server.jar}\";\n              Restart = \"always\";\n              User = \"minecraft\";\n              WorkingDirectory = \"${cfg.dataDir}/${name}\";\n              Sockets = \"minecraft-${name}-stdin.socket\";\n              StandardInput = \"socket\";\n              StandardOutput = \"journal\";\n              StandardError = \"journal\";\n            };\n          };\n      in\n      mapAttrs' make cfg.servers;\n\n    networking.firewall.allowedUDPPorts = serverPorts;\n    networking.firewall.allowedTCPPorts = serverPorts;\n  };\n}\n"
  },
  {
    "path": "shared/minecraft/erase-your-darlings.nix",
    "content": "{ config, lib, ... }:\n\nwith lib;\nlet\n  cfg = config.nixfiles.minecraft;\n  eyd = config.nixfiles.eraseYourDarlings;\nin\n{\n  config = mkIf (cfg.enable && eyd.enable) {\n    nixfiles.minecraft.dataDir = \"${toString eyd.persistDir}/var/lib/minecraft\";\n  };\n}\n"
  },
  {
    "path": "shared/minecraft/options.nix",
    "content": "{ lib, pkgs, ... }:\n\nwith lib;\n\n{\n  options.nixfiles.minecraft = {\n    enable = mkOption {\n      type = types.bool;\n      default = false;\n      description = ''\n        Enable the [Minecraft](https://www.minecraft.net/en-us) service.\n      '';\n    };\n\n    dataDir = mkOption {\n      type = types.path;\n      default = \"/var/lib/minecraft\";\n      description = ''\n        Directory to store data files in.\n\n        If the `erase-your-darlings` module is enabled, this is overridden to be\n        on the persistent volume.\n      '';\n    };\n\n    servers = mkOption {\n      type = types.attrsOf (types.submodule\n        {\n          options = {\n            autoStart = mkOption {\n              type = types.bool;\n              default = true;\n              description = ''\n                Start the server automatically on boot.\n              '';\n            };\n\n            port = mkOption {\n              type = types.int;\n              description = ''\n                Port to open in the firewall.  This must match the port in the\n                `server.properties` file.\n              '';\n            };\n\n            jar = mkOption {\n              type = types.str;\n              default = \"minecraft-server.jar\";\n              description = ''\n                Name of the JAR file to use.  This file must be in the working\n                directory.\n              '';\n            };\n\n            jre = mkOption {\n              type = types.package;\n              default = pkgs.jdk17_headless;\n              description = ''\n                Java runtime package to use.\n              '';\n            };\n\n            jvmOpts = mkOption {\n              type = types.separatedString \" \";\n              default = \"-Xmx4G -Xms4G -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC -XX:G1NewSizePercent=20 -XX:G1ReservePercent=20 -XX:MaxGCPauseMillis=50 -XX:G1HeapRegionSize=32M\";\n              description = ''\n                Java runtime arguments.  Cargo cult these from a forum post and\n                then never think about them again.\n              '';\n            };\n          };\n        }\n      );\n      default = { };\n      description = ''\n        Attrset of minecraft server definitions.  Each server `{name}` is run in\n        the working directory `''${dataDir}/{name}`.\n      '';\n    };\n  };\n}\n"
  },
  {
    "path": "shared/oci-containers/default.nix",
    "content": "# > [!NOTE]\n# > **TODO:** Run podman containers run as a non-root user.\n#\n# An abstraction over running containers as systemd units, enforcing some good\n# practices:\n#\n# - Container DNS behaves the same under docker and podman.\n# - Ports are exposed on `127.0.0.1`, rather than `0.0.0.0`.\n# - Volumes are backed up by bind-mounts to the host filesystem.\n#\n# Switching between using docker or podman for the container runtime should be\n# totally transparent.\n#\n# **Erase your darlings:** overrides the `volumeBaseDir`.\n{ config, lib, pkgs, ... }:\n\nwith lib;\nlet\n  mkPortDef = { host, inner }: \"127.0.0.1:${toString host}:${toString inner}\";\n\n  mkVolumeDef = container: { name, host, inner }:\n    if host != null\n    then \"${host}:${inner}\"\n    else \"${cfg.volumeBaseDir}/${container.volumeSubDir}/${name}:${inner}\";\n\n  shouldPreStart = _name: container: container.pullOnStart;\n  mkPreStart = name: container: nameValuePair \"${cfg.backend}-${name}\" {\n    preStart = \"${cfg.backend} pull ${container.image}\";\n  };\n\n  shouldDependOnNetwork = _name: container: container.network != null;\n  mkDependOnNetwork = nameValuePair \"${cfg.backend}-${name}\" (\n    let u = \"${cfg.backend}-net-${container.network}.service\";\n    in { after = [u]; requires = [u]; }\n  );\n\n  shouldDependOnPod = _name: container: container.pod != null;\n  mkDependOnPod = name: container: nameValuePair \"${cfg.backend}-${name}\" (\n    let u = \"${cfg.backend}-pod-${container.pod}.service\";\n    in { after = [u]; requires = [u]; }\n  );\n\n  shouldNetworkService = _name: container: container.network != null;\n  mkNetworkService = _name: container:\n    let package = if cfg.backend == \"docker\" then pkgs.docker else pkgs.podman;\n    in nameValuePair \"${cfg.backend}-net-${container.network}\" {\n      description = \"Manage the ${container.network} network for ${cfg.backend}\";\n      preStart = \"${package}/bin/${cfg.backend} network rm ${container.network} || true\";\n      serviceConfig = {\n        Type = \"oneshot\";\n        ExecStart = \"${package}/bin/${cfg.backend} network create -d bridge ${container.network}\";\n        ExecStop = \"${package}/bin/${cfg.backend} network rm ${container.network}\";\n        RemainAfterExit = \"yes\";\n      };\n    };\n\n  mkPodService = name: pod:\n    let\n      package = if cfg.backend == \"podman\" then pkgs.podman else throw \"mkPodService only supports podman\";\n      aliases = map (cn: \"${name}-${cn}\") (attrNames pod.containers);\n      ports = concatLists (catAttrs \"ports\" (attrValues pod.containers));\n    in\n    nameValuePair \"${cfg.backend}-pod-${name}\" {\n      description = \"Manage the ${name} pod for ${cfg.backend}\";\n      preStart = \"${package}/bin/${cfg.backend} pod rm --force --ignore ${name} || true\";\n      serviceConfig = {\n        Type = \"oneshot\";\n        ExecStart =\n          let args = map (n: \"--network-alias=${n}\") aliases ++ map (pd: \"-p ${mkPortDef pd}\") ports;\n          in \"${package}/bin/${cfg.backend} pod create ${concatStringsSep \" \" args} ${name}\";\n        ExecStop = \"${package}/bin/${cfg.backend} pod rm ${name}\";\n        RemainAfterExit = \"yes\";\n      };\n    };\n\n  mkContainer = _name: container: with container;\n    let\n      hasNetwork = container.network != null;\n      hasPod = container.pod != null;\n    in\n    {\n      inherit autoStart cmd dependsOn environment environmentFiles image login;\n      extraOptions =\n        container.extraOptions ++\n        (if hasNetwork then [ \"--network=${container.network}\" ] else [ ]) ++\n        (if hasPod then [ \"--pod=${container.pod}\" ] else [ ]);\n      /* ports are defined at the pod level */\n      ports = if hasPod then [ ] else map mkPortDef ports;\n      volumes = map (mkVolumeDef container) volumes;\n    };\n\n  cfg = config.nixfiles.oci-containers;\n\n  allContainers =\n    let\n      mkPodContainer = podName: pod: containerName: container: nameValuePair \"${podName}-${containerName}\" (\n        container //\n        {\n          network = if cfg.backend == \"docker\" then podName else null;\n          pod = if cfg.backend == \"docker\" then null else podName;\n          volumeSubDir = pod.volumeSubDir;\n        }\n      );\n    in\n    concatMapAttrs (podName: pod: mapAttrs' (mkPodContainer podName pod) pod.containers) cfg.pods;\nin\n{\n  imports = [\n    ./options.nix\n    ./erase-your-darlings.nix\n  ];\n\n  config = {\n    virtualisation.${cfg.backend} = {\n      enable = true;\n      autoPrune.enable = true;\n    };\n\n    virtualisation.oci-containers = {\n      backend = cfg.backend;\n      containers = mapAttrs mkContainer allContainers;\n    };\n\n    systemd.services = mkMerge [\n      (mapAttrs' mkPreStart (filterAttrs shouldPreStart allContainers))\n      (mapAttrs' mkDependOnNetwork (filterAttrs shouldDependOnNetwork allContainers))\n      (mapAttrs' mkDependOnPod (filterAttrs shouldDependOnPod allContainers))\n      (mapAttrs' mkNetworkService (filterAttrs shouldNetworkService allContainers))\n      (if cfg.backend == \"podman\" then mapAttrs' mkPodService cfg.pods else { })\n    ];\n  };\n}\n"
  },
  {
    "path": "shared/oci-containers/erase-your-darlings.nix",
    "content": "{ config, lib, ... }:\n\nwith lib;\nlet\n  eyd = config.nixfiles.eraseYourDarlings;\nin\n{\n  config = mkIf eyd.enable {\n    nixfiles.oci-containers.volumeBaseDir = \"${toString eyd.persistDir}/docker-volumes\";\n  };\n}\n"
  },
  {
    "path": "shared/oci-containers/options.nix",
    "content": "{ lib, ... }:\n\nwith lib;\nlet\n  portOptions = {\n    host = mkOption {\n      type = types.int;\n      description = ''\n        Host port (on 127.0.0.1) to expose the container port on.\n      '';\n    };\n\n    inner = mkOption {\n      type = types.int;\n      description = ''\n        The container port to expose to the hosti.\n      '';\n    };\n  };\n\n  volumeOptions = {\n    name = mkOption {\n      type = types.nullOr types.str;\n      default = null;\n      description = ''\n        Name of the volume.  This is equivalent to:\n\n        ```nix\n        host = \"''${volumeBaseDir}/''${volumeSubDir}/''${name}\";\n        ```\n\n        This option c.logonflicts with `''${host}`.\n      '';\n    };\n\n    host = mkOption {\n      type = types.nullOr types.str;\n      default = null;\n      description = ''\n        Directory on the host to bind-mount into the container.\n\n        This option conflicts with `''${name}`.\n      '';\n    };\n\n    inner = mkOption {\n      type = types.str;\n      description = ''\n        Directory in the container to mount the volume to.\n      '';\n    };\n  };\n\n  containerOptions = {\n    /* regular oci-containers */\n    autoStart = mkOption {\n      type = types.bool;\n      default = true;\n      description = ''\n        Start the container automatically on boot.\n      '';\n    };\n\n    cmd = mkOption {\n      type = types.listOf types.str;\n      default = [ ];\n      description = ''\n        Command-line arguments to pass to the container image's entrypoint.\n      '';\n    };\n\n    dependsOn = mkOption {\n      type = types.listOf types.str;\n      default = [ ];\n      example = [ \"concourse-db\" ];\n      description = ''\n        Other containers that this one depends on, in `''${pod}-''${name}`\n        format.\n      '';\n    };\n\n    environment = mkOption {\n      type = types.attrsOf types.str;\n      default = { };\n      description = ''\n        Environment variables to set for this container.\n      '';\n    };\n\n    environmentFiles = mkOption {\n      type = types.listOf types.path;\n      default = [ ];\n      description = ''\n        List of environment files for this container.\n      '';\n    };\n\n    extraOptions = mkOption {\n      type = types.listOf types.str;\n      default = [ ];\n      description = ''\n        Extra options to pass to `docker run` / `podman run`.\n      '';\n    };\n\n    image = mkOption {\n      type = types.str;\n      description = ''\n        Container image to run.\n      '';\n    };\n\n    login = {\n      username = mkOption {\n        type = types.nullOr types.str;\n        default = null;\n        description = ''\n          Username for the container registry.\n        '';\n      };\n      passwordFile = mkOption {\n        type = types.nullOr types.str;\n        default = null;\n        description = ''\n          File containing the password for the container registry.\n        '';\n      };\n      registry = mkOption {\n        type = types.nullOr types.str;\n        default = null;\n        description = ''\n          Container registry to authenticate with.\n        '';\n      };\n    };\n\n    /* changed */\n    ports = mkOption {\n      type = types.listOf (types.submodule { options = portOptions; });\n      default = [ ];\n      description = ''\n        List of ports to expose.\n      '';\n    };\n\n    volumes = mkOption {\n      type = types.listOf (types.submodule { options = volumeOptions; });\n      default = [ ];\n      description = ''\n        List of volume definitions.\n      '';\n    };\n\n    /* new options */\n    pullOnStart = mkOption {\n      type = types.bool;\n      default = true;\n      description = ''\n        Pull the container image when starting (useful for `:latest` images).\n      '';\n    };\n  };\nin\n{\n  options.nixfiles.oci-containers = {\n    backend = mkOption {\n      type = types.enum [ \"docker\" \"podman\" ];\n      default = \"docker\";\n      description = ''\n        The container runtime.\n      '';\n    };\n\n    pods = mkOption {\n      type = types.attrsOf (types.submodule ({ name, ... }: {\n        options = {\n          containers = mkOption {\n            type = types.attrsOf (types.submodule { options = containerOptions; });\n            default = { };\n            description = ''\n              Attrset of container definitions.\n            '';\n          };\n          volumeSubDir = mkOption {\n            type = types.str;\n            default = name;\n            description = ''\n              Subdirectory of the `''${volumeBaseDir}` to store bind-mounts\n              under.\n            '';\n          };\n        };\n      }));\n      default = { };\n      description = ''\n        Attrset of pod definitions.\n      '';\n    };\n\n    volumeBaseDir = mkOption {\n      type = types.str;\n      description = ''\n        Directory to store volume bind-mounts under.\n\n        If the `erase-your-darlings` module is enabled, this is overridden to be\n        on the persistent volume.\n      '';\n    };\n  };\n}\n"
  },
  {
    "path": "shared/options.nix",
    "content": "{ lib, ... }:\n\nwith lib;\n\n{\n  options.nixfiles.firewall = {\n    ipBlocklistFile = mkOption {\n      type = types.nullOr types.str;\n      default = null;\n      description = ''\n        File containing IPs to block.  This is of the form:\n\n        ```text\n        ip-address # comment\n        ip-address # comment\n        ...\n        ```\n      '';\n    };\n  };\n}\n"
  },
  {
    "path": "shared/pleroma/default.nix",
    "content": "# [Pleroma][] is a fediverese server.\n#\n# Pleroma uses a containerised postgres database.\n#\n# **Backups:** the postgres database, uploaded files, and custom emojis.\n#\n# **Erase your darlings:** transparently stores data on the persistent volume.\n#\n# [Pleroma]: https://pleroma.social/\n{ config, lib, pkgs, ... }:\n\nwith lib;\nlet\n  cfg = config.nixfiles.pleroma;\n  backend = config.nixfiles.oci-containers.backend;\n  backendPkg = if backend == \"docker\" then pkgs.docker else pkgs.podman;\n  dbSocketDir = \"/run/pleroma-db\";\n\n  pleromaUser = config.services.pleroma.user;\n  pleromaGroup = config.services.pleroma.group;\nin\n{\n  imports = [\n    ./erase-your-darlings.nix\n    ./options.nix\n  ];\n\n  config = mkIf cfg.enable {\n    services.pleroma.enable = true;\n    services.pleroma.configs = [\n      ''\n        import Config\n\n        config :pleroma, Pleroma.Web.Endpoint,\n          url: [host: System.fetch_env!(\"DOMAIN\"), scheme: \"https\", port: 443],\n          http: [ip: {127, 0, 0, 1}, port: System.fetch_env!(\"PORT\") |> String.to_integer]\n\n        config :pleroma, :instance,\n          name: System.fetch_env!(\"INSTANCE_NAME\"),\n          email: System.fetch_env!(\"ADMIN_EMAIL\"),\n          notify_email: System.fetch_env!(\"NOTIFY_EMAIL\"),\n          limit: 5000,\n          registrations_open: System.fetch_env!(\"ALLOW_REGISTRATION\") |> String.to_atom,\n          healthcheck: true\n\n        config :pleroma, Pleroma.Repo,\n          adapter: Ecto.Adapters.Postgres,\n          username: \"pleroma\",\n          password: \"pleroma\",\n          database: \"pleroma\",\n          socket_dir: \"${dbSocketDir}/\",\n          pool_size: 10\n\n        config :web_push_encryption, :vapid_details, subject: \"mailto:#{System.fetch_env!(\"NOTIFY_EMAIL\")}\"\n        config :pleroma, :database, rum_enabled: false\n        config :pleroma, :instance, static_dir: \"/var/lib/pleroma/static\"\n        config :pleroma, Pleroma.Uploaders.Local, uploads: \"/var/lib/pleroma/uploads\"\n\n        config :os_mon,\n          start_cpu_sup: false,\n          start_disksup: false,\n          start_memsup: false\n      ''\n    ];\n    services.pleroma.secretConfigFile = cfg.secretsFile;\n\n    systemd.services.pleroma = {\n      wantedBy = [ \"multi-user.target\" ];\n      after = [ \"network-online.target\" \"${backend}-pleroma-db.service\" ];\n      wants = [ \"network-online.target\" ];\n      requires = [ \"${backend}-pleroma-db.service\" ];\n      environment = {\n        DOMAIN = cfg.domain;\n        PORT = toString cfg.port;\n        INSTANCE_NAME = if cfg.instanceName == null then cfg.domain else cfg.instanceName;\n        ADMIN_EMAIL = cfg.adminEmail;\n        NOTIFY_EMAIL = if cfg.notifyEmail == null then cfg.adminEmail else cfg.notifyEmail;\n        ALLOW_REGISTRATION = if cfg.allowRegistration then \"true\" else \"false\";\n      };\n      serviceConfig.BindPaths =\n        [ \"${toString (pkgs.copyPathToStore cfg.faviconPath)}:/var/lib/pleroma/static/favicon.png\" ];\n    };\n    systemd.services.pleroma-migrations = {\n      after = [ \"network-online.target\" \"${backend}-pleroma-db.service\" ];\n      environment = config.systemd.services.pleroma.environment;\n    };\n\n    users.users.\"${pleromaUser}\".uid = 989;\n    users.groups.\"${pleromaGroup}\".gid = 994;\n\n    nixfiles.oci-containers.pods.pleroma.containers.db = {\n      image = \"mirror.gcr.io/postgres:${cfg.postgresTag}\";\n      environment = {\n        \"POSTGRES_DB\" = \"pleroma\";\n        \"POSTGRES_USER\" = \"pleroma\";\n        \"POSTGRES_PASSWORD\" = \"pleroma\";\n      };\n      extraOptions = [ \"--shm-size=1g\" ];\n      volumes = [\n        { name = \"pgdata\"; inner = \"/var/lib/postgresql/data\"; }\n        { host = dbSocketDir; inner = \"/var/run/postgresql\"; }\n      ];\n    };\n\n    systemd.tmpfiles.rules = [ \"d ${dbSocketDir} 0700 ${pleromaUser} ${pleromaGroup}\" ];\n\n    nixfiles.restic-backups.backups.pleroma = {\n      prepareCommand = ''\n        /run/wrappers/bin/sudo ${backendPkg}/bin/${backend} exec -i pleroma-db pg_dump -U pleroma --no-owner -Fc pleroma > postgres.dump\n      '';\n      paths = [\n        config.users.users.\"${pleromaUser}\".home\n        \"postgres.dump\"\n      ];\n    };\n    nixfiles.restic-backups.sudoRules = [\n      { command = \"${backendPkg}/bin/${backend} exec -i pleroma-db pg_dump -U pleroma --no-owner -Fc pleroma\"; }\n    ];\n  };\n}\n"
  },
  {
    "path": "shared/pleroma/erase-your-darlings.nix",
    "content": "{ config, lib, ... }:\n\nwith lib;\nlet\n  cfg = config.nixfiles.pleroma;\n  eyd = config.nixfiles.eraseYourDarlings;\n\n  # systemd unit assumes files are accessible under \"/var/lib/pleroma\"\n  pleromaHome = \"${toString eyd.persistDir}/var/lib/pleroma\";\nin\n{\n  config = mkIf (cfg.enable && eyd.enable) {\n    users.users.pleroma.home = mkForce pleromaHome;\n    systemd.services.pleroma.serviceConfig.BindPaths = [ \"${pleromaHome}:/var/lib/pleroma\" ];\n  };\n}\n"
  },
  {
    "path": "shared/pleroma/options.nix",
    "content": "{ lib, ... }:\n\nwith lib;\n\n{\n  options.nixfiles.pleroma = {\n    enable = mkOption {\n      type = types.bool;\n      default = false;\n      description = ''\n        Enable the [Pleroma](https://pleroma.social/) service.\n      '';\n    };\n\n    port = mkOption {\n      type = types.int;\n      default = 46283;\n      description = ''\n        Port (on 127.0.0.1) to expose Pleroma on.\n      '';\n    };\n\n    postgresTag = mkOption {\n      type = types.str;\n      default = \"16\";\n      description = ''\n        Tag to use of the `postgres` container image.\n      '';\n    };\n\n    domain = mkOption {\n      type = types.str;\n      example = \"social.lainon.life\";\n      description = ''\n        Domain which Pleroma will be exposed on.\n      '';\n    };\n\n    faviconPath = mkOption {\n      type = types.nullOr types.path;\n      default = null;\n      description = ''\n        File to use for the favicon.\n      '';\n    };\n\n    instanceName = mkOption {\n      type = types.nullOr types.str;\n      default = null;\n      description = ''\n        Name of the instance, defaults to the `''${domain}` if not set.\n      '';\n    };\n\n    adminEmail = mkOption {\n      type = types.str;\n      default = \"mike@barrucadu.co.uk\";\n      description = ''\n        Email address used to contact the server operator.\n      '';\n    };\n\n    notifyEmail = mkOption {\n      type = types.nullOr types.str;\n      default = null;\n      description = ''\n        Email address used for notification, defaults to the `''${adminEmail}`\n        if not set.\n      '';\n    };\n\n    allowRegistration = mkOption {\n      type = types.bool;\n      default = false;\n      description = ''\n        Allow new users to sign up.\n      '';\n    };\n\n    secretsFile = mkOption {\n      type = types.str;\n      description = ''\n        File containing secret configuration.\n\n        See the Pleroma documentation for what this needs to contain.\n      '';\n    };\n  };\n}\n"
  },
  {
    "path": "shared/resolved/dashboard.json",
    "content": "{\n  \"annotations\": {\n    \"list\": [\n      {\n        \"builtIn\": 1,\n        \"datasource\": {\n          \"type\": \"datasource\",\n          \"uid\": \"grafana\"\n        },\n        \"enable\": true,\n        \"hide\": true,\n        \"iconColor\": \"rgba(0, 211, 255, 1)\",\n        \"name\": \"Annotations & Alerts\",\n        \"target\": {\n          \"limit\": 100,\n          \"matchAny\": false,\n          \"tags\": [],\n          \"type\": \"dashboard\"\n        },\n        \"type\": \"dashboard\"\n      }\n    ]\n  },\n  \"editable\": true,\n  \"fiscalYearStartMonth\": 0,\n  \"graphTooltip\": 0,\n  \"links\": [],\n  \"liveNow\": false,\n  \"panels\": [\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"P1809F7CD0C75ACF3\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisBorderShow\": false,\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"axisSoftMin\": 0,\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"insertNulls\": false,\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          }\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 6,\n        \"x\": 0,\n        \"y\": 0\n      },\n      \"id\": 2,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"displayMode\": \"table\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"multi\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"P1809F7CD0C75ACF3\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"dns_requests_total{job=\\\"$Job\\\"}\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{protocol}}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Total Requests\",\n      \"transparent\": true,\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"P1809F7CD0C75ACF3\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisBorderShow\": false,\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"axisSoftMin\": 0,\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"insertNulls\": false,\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"reqps\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 6,\n        \"x\": 6,\n        \"y\": 0\n      },\n      \"id\": 4,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [\n            \"mean\"\n          ],\n          \"displayMode\": \"table\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"multi\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"P1809F7CD0C75ACF3\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"rate(dns_requests_total{job=\\\"$Job\\\"}[$__interval])\",\n          \"interval\": \"30s\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{protocol}}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Requests per Second\",\n      \"transparent\": true,\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"P1809F7CD0C75ACF3\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisBorderShow\": false,\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"axisSoftMin\": 0,\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"insertNulls\": false,\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          }\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 6,\n        \"x\": 12,\n        \"y\": 0\n      },\n      \"id\": 10,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"displayMode\": \"table\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"multi\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"P1809F7CD0C75ACF3\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"sum(dns_responses_total{job=\\\"$Job\\\"}) by (rcode)\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{rcode}}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Total Responses\",\n      \"transparent\": true,\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"P1809F7CD0C75ACF3\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisBorderShow\": false,\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"axisSoftMin\": 0,\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"insertNulls\": false,\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"ops\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 6,\n        \"x\": 18,\n        \"y\": 0\n      },\n      \"id\": 11,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [\n            \"mean\"\n          ],\n          \"displayMode\": \"table\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"multi\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"P1809F7CD0C75ACF3\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"sum(rate(dns_responses_total{job=\\\"$Job\\\"}[$__interval])) by (rcode)\",\n          \"interval\": \"30s\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{rcode}}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Responses per Second\",\n      \"transparent\": true,\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"P1809F7CD0C75ACF3\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisBorderShow\": false,\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"axisSoftMin\": 0,\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"insertNulls\": false,\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          }\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 6,\n        \"x\": 0,\n        \"y\": 8\n      },\n      \"id\": 27,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"displayMode\": \"table\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"multi\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"P1809F7CD0C75ACF3\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": true,\n          \"expr\": \"sum(dns_requests_refused_total{job=\\\"$Job\\\"}) by(reason)\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{reason}}\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Refused\",\n      \"transparent\": true,\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"P1809F7CD0C75ACF3\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisBorderShow\": false,\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"axisSoftMin\": 0,\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"insertNulls\": false,\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          }\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 6,\n        \"x\": 6,\n        \"y\": 8\n      },\n      \"id\": 13,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"displayMode\": \"table\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"multi\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"P1809F7CD0C75ACF3\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"sum(dns_questions_total{job=\\\"$Job\\\"}) by(qclass, qtype)\",\n          \"interval\": \"\",\n          \"legendFormat\": \"{{qclass}} {{qtype}}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Questions\",\n      \"transparent\": true,\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"P1809F7CD0C75ACF3\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisBorderShow\": false,\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"axisSoftMin\": 0,\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"insertNulls\": false,\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          }\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 6,\n        \"x\": 12,\n        \"y\": 8\n      },\n      \"id\": 17,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"displayMode\": \"table\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"multi\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"P1809F7CD0C75ACF3\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"dns_resolver_authoritative_hit_total{job=\\\"$Job\\\"}\",\n          \"interval\": \"\",\n          \"legendFormat\": \"Authoritatively\",\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"P1809F7CD0C75ACF3\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"dns_resolver_blocked_total{job=\\\"$Job\\\"}\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"Blocked\",\n          \"refId\": \"B\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"P1809F7CD0C75ACF3\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"dns_resolver_cache_hit_total{job=\\\"$Job\\\"}\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"Cached\",\n          \"refId\": \"C\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"P1809F7CD0C75ACF3\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"dns_resolver_override_hit_total{job=\\\"$Job\\\"}\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"Overridden\",\n          \"refId\": \"D\"\n        }\n      ],\n      \"title\": \"Answered Locally\",\n      \"transparent\": true,\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"P1809F7CD0C75ACF3\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisBorderShow\": false,\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"axisSoftMin\": 0,\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"insertNulls\": false,\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          }\n        },\n        \"overrides\": [\n          {\n            \"matcher\": {\n              \"id\": \"byFrameRefID\",\n              \"options\": \"C\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.axisPlacement\",\n                \"value\": \"right\"\n              },\n              {\n                \"id\": \"custom.axisSoftMax\",\n                \"value\": 1\n              },\n              {\n                \"id\": \"unit\",\n                \"value\": \"percentunit\"\n              }\n            ]\n          }\n        ]\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 6,\n        \"x\": 18,\n        \"y\": 8\n      },\n      \"id\": 18,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"displayMode\": \"table\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"multi\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"P1809F7CD0C75ACF3\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"dns_resolver_nameserver_hit_total{job=\\\"$Job\\\"}\",\n          \"interval\": \"\",\n          \"legendFormat\": \"Hits\",\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"P1809F7CD0C75ACF3\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"dns_resolver_nameserver_miss_total{job=\\\"$Job\\\"}\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"Misses\",\n          \"refId\": \"B\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"P1809F7CD0C75ACF3\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"dns_resolver_nameserver_hit_total{job=\\\"$Job\\\"} / (dns_resolver_nameserver_hit_total{job=\\\"$Job\\\"} + dns_resolver_nameserver_miss_total{job=\\\"$Job\\\"})\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"Ratio\",\n          \"refId\": \"C\"\n        }\n      ],\n      \"title\": \"Upstream Nameserver Calls\",\n      \"transparent\": true,\n      \"type\": \"timeseries\"\n    },\n    {\n      \"collapsed\": false,\n      \"datasource\": {\n        \"type\": \"datasource\",\n        \"uid\": \"grafana\"\n      },\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 16\n      },\n      \"id\": 6,\n      \"panels\": [],\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"datasource\",\n            \"uid\": \"grafana\"\n          },\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Cache\",\n      \"type\": \"row\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"P1809F7CD0C75ACF3\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisBorderShow\": false,\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"axisSoftMin\": 0,\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"insertNulls\": false,\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          }\n        },\n        \"overrides\": [\n          {\n            \"matcher\": {\n              \"id\": \"byFrameRefID\",\n              \"options\": \"C\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.axisPlacement\",\n                \"value\": \"right\"\n              },\n              {\n                \"id\": \"unit\",\n                \"value\": \"percentunit\"\n              },\n              {\n                \"id\": \"custom.axisSoftMax\",\n                \"value\": 1\n              }\n            ]\n          }\n        ]\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 17\n      },\n      \"id\": 15,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"displayMode\": \"table\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"multi\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"P1809F7CD0C75ACF3\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"dns_resolver_cache_hit_total{job=\\\"$Job\\\"}\",\n          \"interval\": \"\",\n          \"legendFormat\": \"Cache Hits\",\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"P1809F7CD0C75ACF3\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"dns_resolver_cache_miss_total{job=\\\"$Job\\\"}\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"Cache Misses\",\n          \"refId\": \"B\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"P1809F7CD0C75ACF3\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"dns_resolver_cache_hit_total{job=\\\"$Job\\\"} / (dns_resolver_cache_hit_total{job=\\\"$Job\\\"} + dns_resolver_cache_miss_total{job=\\\"$Job\\\"})\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"Ratio\",\n          \"refId\": \"C\"\n        }\n      ],\n      \"title\": \"Effectiveness\",\n      \"transparent\": true,\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"P1809F7CD0C75ACF3\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisBorderShow\": false,\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"axisSoftMin\": 0,\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"insertNulls\": false,\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"ops\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 17\n      },\n      \"id\": 24,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"displayMode\": \"table\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"multi\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"P1809F7CD0C75ACF3\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"rate(dns_resolver_cache_hit_total{job=\\\"$Job\\\"}[$__interval])\",\n          \"interval\": \"30s\",\n          \"legendFormat\": \"Cache Hits\",\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"P1809F7CD0C75ACF3\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"rate(dns_resolver_cache_miss_total{job=\\\"$Job\\\"}[$__interval])\",\n          \"hide\": false,\n          \"interval\": \"30s\",\n          \"legendFormat\": \"Cache Misses\",\n          \"refId\": \"B\"\n        }\n      ],\n      \"title\": \"Activity per Second\",\n      \"transparent\": true,\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"P1809F7CD0C75ACF3\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisBorderShow\": false,\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"axisSoftMin\": 0,\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"insertNulls\": false,\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          }\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 25\n      },\n      \"id\": 8,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"displayMode\": \"table\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"multi\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"P1809F7CD0C75ACF3\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"cache_size{job=\\\"$Job\\\"}\",\n          \"interval\": \"\",\n          \"legendFormat\": \"Size\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Size\",\n      \"transparent\": true,\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"P1809F7CD0C75ACF3\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisBorderShow\": false,\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"axisSoftMin\": 0,\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"insertNulls\": false,\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          }\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 6,\n        \"x\": 12,\n        \"y\": 25\n      },\n      \"id\": 9,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"displayMode\": \"table\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"multi\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"P1809F7CD0C75ACF3\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"cache_expired_total{job=\\\"$Job\\\"}\",\n          \"interval\": \"\",\n          \"legendFormat\": \"Expired\",\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"P1809F7CD0C75ACF3\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"cache_pruned_total{job=\\\"$Job\\\"}\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"Pruned\",\n          \"refId\": \"B\"\n        }\n      ],\n      \"title\": \"Eviction\",\n      \"transparent\": true,\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"P1809F7CD0C75ACF3\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisBorderShow\": false,\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"axisSoftMin\": 0,\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"insertNulls\": false,\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"ops\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 6,\n        \"x\": 18,\n        \"y\": 25\n      },\n      \"id\": 26,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"displayMode\": \"table\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"multi\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"P1809F7CD0C75ACF3\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"rate(cache_expired_total{job=\\\"$Job\\\"}[$__interval])\",\n          \"interval\": \"30s\",\n          \"legendFormat\": \"Expiration\",\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"P1809F7CD0C75ACF3\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"rate(cache_pruned_total{job=\\\"$Job\\\"}[$__interval])\",\n          \"hide\": false,\n          \"interval\": \"30s\",\n          \"legendFormat\": \"Pruning\",\n          \"refId\": \"B\"\n        }\n      ],\n      \"title\": \"Evictions per Second\",\n      \"transparent\": true,\n      \"type\": \"timeseries\"\n    },\n    {\n      \"collapsed\": false,\n      \"datasource\": {\n        \"type\": \"datasource\",\n        \"uid\": \"grafana\"\n      },\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 33\n      },\n      \"id\": 22,\n      \"panels\": [],\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"datasource\",\n            \"uid\": \"grafana\"\n          },\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Process\",\n      \"type\": \"row\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"P1809F7CD0C75ACF3\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"axisSoftMin\": 0,\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\"\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"bytes\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 34\n      },\n      \"id\": 20,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [\n            \"mean\",\n            \"lastNotNull\"\n          ],\n          \"displayMode\": \"table\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"multi\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"P1809F7CD0C75ACF3\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"process_resident_memory_bytes{job=\\\"$Job\\\"}\",\n          \"interval\": \"\",\n          \"legendFormat\": \"Resident\",\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"P1809F7CD0C75ACF3\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"process_virtual_memory_bytes{job=\\\"$Job\\\"}\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"Virtual\",\n          \"refId\": \"B\"\n        }\n      ],\n      \"title\": \"Memory Usage\",\n      \"transparent\": true,\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"P1809F7CD0C75ACF3\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"min\": 0,\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\"\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"percentunit\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 34\n      },\n      \"id\": 23,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [\n            \"mean\",\n            \"lastNotNull\"\n          ],\n          \"displayMode\": \"table\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"multi\",\n          \"sort\": \"none\"\n        }\n      },\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"P1809F7CD0C75ACF3\"\n          },\n          \"exemplar\": true,\n          \"expr\": \"rate(process_cpu_seconds_total{job=\\\"$Job\\\"}[$__interval])\",\n          \"interval\": \"30s\",\n          \"legendFormat\": \"Resident\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"CPU Usage\",\n      \"transparent\": true,\n      \"type\": \"timeseries\"\n    }\n  ],\n  \"refresh\": \"30s\",\n  \"revision\": 1,\n  \"schemaVersion\": 39,\n  \"tags\": [],\n  \"templating\": {\n    \"list\": [\n      {\n        \"current\": {\n          \"selected\": false,\n          \"text\": \"nyarlathotep-resolved\",\n          \"value\": \"nyarlathotep-resolved\"\n        },\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"P1809F7CD0C75ACF3\"\n        },\n        \"definition\": \"label_values(dns_requests_total, job)\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"multi\": false,\n        \"name\": \"Job\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"label_values(dns_requests_total, job)\",\n          \"refId\": \"StandardVariableQuery\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"type\": \"query\"\n      }\n    ]\n  },\n  \"time\": {\n    \"from\": \"now-24h\",\n    \"to\": \"now\"\n  },\n  \"timepicker\": {},\n  \"timezone\": \"\",\n  \"title\": \"DNS Resolver\",\n  \"uid\": \"h_opszynz\",\n  \"version\": 1,\n  \"weekStart\": \"\"\n}"
  },
  {
    "path": "shared/resolved/default.nix",
    "content": "# [resolved][] is a recursive DNS server for LAN DNS.\n#\n# Provides a grafana dashboard.\n#\n# [resolved]: https://github.com/barrucadu/resolved\n{ config, lib, pkgs, ... }:\n\nwith lib;\nlet\n  cfg = config.nixfiles.resolved;\nin\n{\n  imports = [\n    ./options.nix\n  ];\n\n  config = mkIf cfg.enable {\n    systemd.services.resolved = {\n      description = \"barrucadu/resolved nameserver\";\n      wantedBy = [ \"multi-user.target\" ];\n      after = [ \"network-online.target\" ];\n      wants = [ \"network-online.target\" ];\n      serviceConfig = {\n        AmbientCapabilities = \"CAP_NET_BIND_SERVICE\";\n        ExecStart = concatStringsSep \" \" [\n          \"${pkgs.nixfiles.resolved}/bin/resolved\"\n          \"-i ${cfg.address}\"\n          \"-s ${toString cfg.cacheSize}\"\n          \"--metrics-address ${cfg.metricsAddress}\"\n          \"--protocol-mode ${cfg.protocolMode}\"\n          (if cfg.authoritativeOnly then \"--authoritative-only \" else \"\")\n          (if cfg.forwardAddress != null then \"--forward-address ${cfg.forwardAddress} \" else \"\")\n          (if cfg.hostsDirs == [ ] then \"\" else \"-A ${concatStringsSep \" -A \" cfg.hostsDirs}\")\n          (if cfg.useDefaultZones then \"-Z ${pkgs.nixfiles.resolved}/etc/resolved/zones\" else \"\")\n          (if cfg.zonesDirs == [ ] then \"\" else \"-Z ${concatStringsSep \" -Z \" cfg.zonesDirs}\")\n        ];\n        ExecReload = \"${pkgs.coreutils}/bin/kill -USR1 $MAINPID\";\n        DynamicUser = \"true\";\n        Restart = \"on-failure\";\n      };\n      environment = {\n        RUST_LOG = cfg.logLevel;\n        RUST_LOG_FORMAT = cfg.logFormat;\n      };\n    };\n\n    networking.firewall.allowedTCPPorts = [ 53 ];\n    networking.firewall.allowedUDPPorts = [ 53 ];\n\n    services.prometheus.scrapeConfigs = [\n      {\n        job_name = \"${config.networking.hostName}-resolved\";\n        static_configs = [{ targets = [ cfg.metricsAddress ]; }];\n      }\n    ];\n    services.grafana.provision.dashboards.settings.providers =\n      [\n        { name = \"DNS Resolver\"; folder = \"Services\"; options.path = ./dashboard.json; }\n      ];\n  };\n}\n"
  },
  {
    "path": "shared/resolved/options.nix",
    "content": "{ lib, ... }:\n\nwith lib;\n\n{\n  options.nixfiles.resolved = {\n    enable = mkOption {\n      type = types.bool;\n      default = false;\n      description = ''\n        Enable the [resolved](https://github.com/barrucadu/resolved) service.\n      '';\n    };\n\n    address = mkOption {\n      type = types.str;\n      default = \"0.0.0.0:53\";\n      description = ''\n        Address to listen on.\n      '';\n    };\n\n    metricsAddress = mkOption {\n      type = types.str;\n      default = \"127.0.0.1:9420\";\n      description = ''\n        Address to listen on to serve Prometheus metrics.\n      '';\n    };\n\n    authoritativeOnly = mkOption {\n      type = types.bool;\n      default = false;\n      description = ''\n        Only answer queries for which this server is authoritative: do not\n        perform recursive or forwarding resolution.\n      '';\n    };\n\n    protocolMode = mkOption {\n      type = types.str;\n      default = \"only-v4\";\n      description = ''\n        How to choose between connecting to upstream nameservers over IPv4 or\n        IPv6 when acting as a recursive resolver.\n      '';\n    };\n\n    forwardAddress = mkOption {\n      type = types.nullOr types.str;\n      default = null;\n      description = ''\n        Act as a forwarding resolver, not a recursive resolver: forward queries\n        which can't be answered from local state to this nameserver and cache\n        the result.\n      '';\n    };\n\n    cacheSize = mkOption {\n      type = types.int;\n      default = 512;\n      description = ''\n        How many records to hold in the cache.\n      '';\n    };\n\n    hostsDirs = mkOption {\n      type = types.listOf types.str;\n      default = [ ];\n      description = ''\n        List of directories to read hosts files from.\n      '';\n    };\n\n    zonesDirs = mkOption {\n      type = types.listOf types.str;\n      default = [ ];\n      description = ''\n        List of directories to read zone files from.\n      '';\n    };\n\n    useDefaultZones = mkOption {\n      type = types.bool;\n      default = true;\n      description = ''\n        Include the default zone files.\n      '';\n    };\n\n    logLevel = mkOption {\n      type = types.str;\n      default = \"dns_resolver=info,resolved=info\";\n      description = ''\n        Verbosity of the log messages.\n      '';\n    };\n\n    logFormat = mkOption {\n      type = types.str;\n      default = \"json,no-time\";\n      description = ''\n        Format of the log messages.\n      '';\n    };\n  };\n}\n"
  },
  {
    "path": "shared/restic-backups/default.nix",
    "content": "# Manage regular incremental, compressed, and encrypted backups with [restic][].\n#\n# Backups are uploaded to the `barrucadu-backups-a19c48` [B2][] bucket.\n#\n# List all the snapshots with:\n#\n# ```bash\n# nix run .#backups                                # all snapshots\n# nix run .#backups -- snapshots --host <hostname> # for a specific host\n# nix run .#backups -- snapshots --tag <tag>       # for a specific tag\n# ```\n#\n# Restore a snapshot to `<restore-dir>` with:\n#\n# ```bash\n# nix run .#backups restore <snapshot> [<restore-dir>]\n# ```\n#\n# If unspecified, the snapshot is restored to `/tmp/restic-restore-<snapshot>`.\n#\n# **Alerts:**\n#\n# - Creating or uploading a snapshot fails.\n#\n# [restic]: https://restic.net/\n# [B2]: https://www.backblaze.com/\n{ config, lib, pkgs, ... }:\n\nwith lib;\n\nlet\n  repo = \"b2:barrucadu-backups-a19c48:nixfiles/restic\";\n\n  cfg = config.nixfiles.restic-backups;\n\n  mkSudoRule = rule: {\n    users = [ config.users.users.backups.name ];\n    runAs = rule.runAs;\n    commands = [{ command = rule.command; options = [ \"NOPASSWD\" ]; }];\n  };\n\n  mkBackup = name: options:\n    let\n      serviceName = \"restic-backups-${name}\";\n      filesFrom = \"/run/${serviceName}/includes\";\n    in\n    nameValuePair serviceName {\n      inherit (options) startAt;\n      environment = {\n        RESTIC_CACHE_DIR = \"%C/${serviceName}\";\n        RESTIC_REPOSITORY = repo;\n      };\n      wants = [ \"network-online.target\" ];\n      after = [ \"network-online.target\" ];\n      serviceConfig = {\n        Type = \"oneshot\";\n        ExecStart = \"${pkgs.restic}/bin/restic backup --tag ${name} --files-from=${filesFrom}\";\n        User = config.users.users.backups.name;\n        CacheDirectory = serviceName;\n        CacheDirectoryMode = \"0700\";\n        RuntimeDirectory = \"${serviceName} ${serviceName}/generated-files\";\n        WorkingDirectory = \"/run/${serviceName}/generated-files\";\n        PrivateTmp = true;\n        EnvironmentFile = cfg.environmentFile;\n        AmbientCapabilities = \"CAP_DAC_READ_SEARCH\";\n      };\n      preStart = ''\n        cat ${pkgs.writeText \"paths\" (concatStringsSep \"\\n\" options.paths)} > ${filesFrom}\n        ${optionalString (options.prepareCommand != null) options.prepareCommand}\n      '';\n      postStop = ''\n        if [[ \"$SERVICE_RESULT\" != \"success\" ]]; then\n          ${pkgs.awscli}/bin/aws sns publish \\\n            --topic-arn \"arn:aws:sns:eu-west-1:197544591260:host-notifications\" \\\n            --subject \"Alert: ${config.networking.hostName}\" \\\n            --message \"${name} backup failed: ''${SERVICE_RESULT}\"\n        fi\n\n        ${pkgs.coreutils}/bin/rm ${filesFrom}\n        ${optionalString (options.cleanupCommand != null) options.cleanupCommand}\n      '';\n    };\n\n  checkService =\n    let\n      serviceName = \"restic-check\";\n    in\n    {\n      environment = {\n        RESTIC_CACHE_DIR = \"%C/${serviceName}\";\n        RESTIC_REPOSITORY = repo;\n      };\n      wants = [ \"network-online.target\" ];\n      after = [ \"network-online.target\" ];\n      startAt = cfg.checkRepositoryAt;\n      serviceConfig = {\n        Type = \"oneshot\";\n        ExecStart = \"${pkgs.restic}/bin/restic check\";\n        User = config.users.users.backups.name;\n        RuntimeDirectory = serviceName;\n        CacheDirectory = serviceName;\n        CacheDirectoryMode = \"0700\";\n        PrivateTmp = true;\n        EnvironmentFile = cfg.environmentFile;\n      };\n      postStop = ''\n        if [[ \"$SERVICE_RESULT\" != \"success\" ]]; then\n          ${pkgs.awscli}/bin/aws sns publish \\\n            --topic-arn \"arn:aws:sns:eu-west-1:197544591260:host-notifications\" \\\n            --subject \"Alert: ${config.networking.hostName}\" \\\n            --message \"restic-check service failed: ''${SERVICE_RESULT}\"\n        fi\n      '';\n    };\nin\n{\n  imports = [\n    ./options.nix\n  ];\n\n  config = mkIf cfg.enable {\n    users.users.backups = {\n      uid = 999;\n      description = \"backup service user\";\n      isSystemUser = true;\n      group = \"nogroup\";\n    };\n\n    security.sudo.extraRules = map mkSudoRule cfg.sudoRules;\n\n    systemd.services = mapAttrs' mkBackup cfg.backups // (if cfg.checkRepositoryAt == null then { } else { \"restic-check\" = checkService; });\n  };\n}\n"
  },
  {
    "path": "shared/restic-backups/options.nix",
    "content": "{ lib, ... }:\n\nwith lib;\n\nlet\n  backupOptions = {\n    paths = mkOption {\n      type = types.listOf types.str;\n      default = [ ];\n      description = ''\n        List of paths to back up.\n      '';\n    };\n\n    prepareCommand = mkOption {\n      type = types.nullOr types.str;\n      default = null;\n      description = ''\n        A script to run before beginning the backup.\n      '';\n    };\n\n    cleanupCommand = mkOption {\n      type = types.nullOr types.str;\n      default = null;\n      description = ''\n        A script to run after taking the backup.\n      '';\n    };\n\n    startAt = mkOption {\n      type = types.str;\n      default = \"Mon, 04:00\";\n      description = ''\n        When to run the backup.\n      '';\n    };\n  };\n\n  sudoRuleOptions = {\n    command = mkOption {\n      type = types.str;\n      description = ''\n        The command for which the rule applies.\n      '';\n    };\n\n    runAs = mkOption {\n      type = types.str;\n      default = \"ALL:ALL\";\n      description = ''\n        The user / group under which the command is allowed to run.\n\n        A user can be specified using just the username: `\"foo\"`. It is also\n        possible to specify a user/group combination using `\"foo:bar\"` or to\n        only allow running as a specific group with `\":bar\"`.\n      '';\n    };\n  };\nin\n{\n  options.nixfiles.restic-backups = {\n    enable = mkOption {\n      type = types.bool;\n      default = false;\n      description = ''\n        Enable the backup service.\n      '';\n    };\n\n    backups = mkOption {\n      type = types.attrsOf (types.submodule { options = backupOptions; });\n      default = { };\n      description = ''\n        Attrset of backup job definitions.\n      '';\n    };\n\n    environmentFile = mkOption {\n      type = types.nullOr types.str;\n      description = ''\n        Environment file to pass secrets into the service.  This is of the form:\n\n        ```text\n        # Repository password\n        RESTIC_PASSWORD=\"...\"\n\n        # B2 credentials\n        B2_ACCOUNT_ID=\"...\"\n        B2_ACCOUNT_KEY=\"...\"\n\n        # AWS SNS credentials\n        AWS_ACCESS_KEY=\"...\"\n        AWS_SECRET_ACCESS_KEY=\"...\"\n        AWS_DEFAULT_REGION=\"...\"\n        ```\n\n        If any of the backup jobs need secrets, those should be specified in\n        this file as well.\n      '';\n    };\n\n    sudoRules = mkOption {\n      type = types.listOf (types.submodule { options = sudoRuleOptions; });\n      default = [ ];\n      description = ''\n        List of additional sudo rules to grant the backup user.\n      '';\n    };\n\n    checkRepositoryAt = mkOption {\n      type = types.nullOr types.str;\n      default = null;\n      description = ''\n        If not null, when to run `restic check` to validate the repository\n        metadata.\n      '';\n    };\n  };\n}\n"
  },
  {
    "path": "shared/torrents/default.nix",
    "content": "# [Transmission][] is a bittorrent client.  This module configures it along with\n# a web UI.\n#\n# This module does not include a backup script.  Torrented files must be backed\n# up independently.\n#\n# **Erase your darlings:** transparently stores session data on the persistent\n# volume.\n#\n# [Transmission]: https://transmissionbt.com/\n{ config, lib, pkgs, ... }:\n\nwith lib;\nlet\n  cfg = config.nixfiles.torrents;\nin\n{\n  imports = [\n    ./erase-your-darlings.nix\n    ./options.nix\n  ];\n\n  config = mkIf cfg.enable {\n    services.transmission = {\n      enable = true;\n      user = cfg.user;\n      group = cfg.group;\n      home = \"${cfg.stateDir}/transmission\";\n      openPeerPorts = cfg.openFirewall;\n      webHome = pkgs.flood-for-transmission;\n      package = pkgs.callPackage ./transmission_3 { };\n      settings = {\n        # paths\n        download-dir = cfg.downloadDir;\n        watch-dir = cfg.watchDir;\n        watch-dir-enabled = true;\n        incomplete-dir-enabled = false;\n\n        # optimise for private trackers (disable DHT and PEX, force encryption)\n        encryption = 2;\n        dht-enabled = false;\n        pex-enabled = false;\n\n        # peers\n        peer-port = cfg.peerPort;\n        peer-port-random-on-start = false;\n\n        # rpc\n        rpc-bind-address = \"127.0.0.1\";\n        rpc-port = cfg.rpcPort;\n        rpc-host-whitelist-enabled = false;\n\n        # misc\n        message-level = cfg.logLevel;\n        rename-partial-files = false;\n        trash-can-enabled = false;\n        trash-original-torrent-files = false;\n      };\n    };\n  };\n}\n"
  },
  {
    "path": "shared/torrents/erase-your-darlings.nix",
    "content": "{ config, lib, ... }:\n\nwith lib;\nlet\n  cfg = config.nixfiles.torrents;\n  eyd = config.nixfiles.eraseYourDarlings;\nin\n{\n  config = mkIf (cfg.enable && eyd.enable) {\n    nixfiles.torrents.stateDir = \"${toString eyd.persistDir}/var/lib/torrents\";\n  };\n}\n"
  },
  {
    "path": "shared/torrents/options.nix",
    "content": "{ lib, ... }:\n\nwith lib;\n\n{\n  options.nixfiles.torrents = {\n    enable = mkOption {\n      type = types.bool;\n      default = false;\n      description = ''\n        Enable the [Transmission](https://transmissionbt.com/) service.\n      '';\n    };\n\n    downloadDir = mkOption {\n      type = types.str;\n      example = \"/mnt/nas/torrents/files\";\n      description = ''\n        Directory to download torrented files to.\n      '';\n    };\n\n    stateDir = mkOption {\n      type = types.str;\n      example = \"/var/lib/torrents\";\n      description = ''\n        Directory to store service state in.\n      '';\n    };\n\n    watchDir = mkOption {\n      type = types.str;\n      example = \"/mnt/nas/torrents/watch\";\n      description = ''\n        Directory to monitor for new .torrent files.\n      '';\n    };\n\n    user = mkOption {\n      type = types.str;\n      description = ''\n        The user to run Transmission as.\n      '';\n    };\n\n    group = mkOption {\n      type = types.str;\n      description = ''\n        The group to run Transmission as.\n      '';\n    };\n\n    logLevel = mkOption {\n      type = types.ints.between 0 6;\n      default = 2;\n      description = ''\n        Verbosity of the log messages.\n      '';\n    };\n\n    openFirewall = mkOption {\n      type = types.bool;\n      default = true;\n      description = ''\n        Allow connections from TCP and UDP ports `''${portRange.from}` to\n        `''${portRange.to}`.\n      '';\n    };\n\n    peerPort = mkOption {\n      type = types.port;\n      default = 50000;\n      description = ''\n        Port to accept peer connections on.\n      '';\n    };\n\n    rpcPort = mkOption {\n      type = types.port;\n      default = 49528;\n      description = ''\n        Port to accept RPC connections on.  Bound on 127.0.0.1.\n      '';\n    };\n  };\n}\n"
  },
  {
    "path": "shared/torrents/transmission_3/default.nix",
    "content": "{\n  stdenv,\n  lib,\n  fetchFromGitHub,\n  cmake,\n  pkg-config,\n  openssl,\n  curl,\n  libevent,\n  inotify-tools,\n  systemd,\n  zlib,\n  pcre,\n  libb64,\n  libutp,\n  miniupnpc,\n  dht,\n  libnatpmp,\n  libiconv,\n  # Build options\n  enableGTK3 ? false,\n  gtk3,\n  xorg,\n  wrapGAppsHook3,\n  enableQt ? false,\n  qt5,\n  nixosTests,\n  enableSystemd ? lib.meta.availableOn stdenv.hostPlatform systemd,\n  enableDaemon ? true,\n  enableCli ? true,\n  installLib ? false,\n  apparmorRulesFromClosure,\n}:\n\nstdenv.mkDerivation (finalAttrs: {\n  pname = \"transmission\";\n  version = \"3.00\";\n\n  src = fetchFromGitHub {\n    owner = \"transmission\";\n    repo = \"transmission\";\n    tag = finalAttrs.version;\n    hash = \"sha256-n4iEDt9AstDZPZXN47p13brNLbNWS3BTB+A4UuoEjzE=\";\n    fetchSubmodules = true;\n  };\n\n  patches = [\n    # fix build with openssl 3.0\n    ./transmission-3.00-openssl-3.patch\n    # fix build with miniupnpc 2.2.8\n    ./transmission-3.00-miniupnpc-2.2.8.patch\n  ];\n\n  # Compatibility with CMake < 3.5 has been removed from CMake.\n  postPatch = ''\n    substituteInPlace \\\n      CMakeLists.txt \\\n      --replace-fail \\\n        \"cmake_minimum_required(VERSION 2.8.12 FATAL_ERROR)\" \\\n        \"cmake_minimum_required(VERSION 3.5)\"\n  '';\n\n  outputs = [\n    \"out\"\n    \"apparmor\"\n  ];\n\n  cmakeFlags =\n    let\n      mkFlag = opt: if opt then \"ON\" else \"OFF\";\n    in\n    [\n      \"-DENABLE_MAC=OFF\" # requires xcodebuild\n      \"-DENABLE_GTK=${mkFlag enableGTK3}\"\n      \"-DENABLE_QT=${mkFlag enableQt}\"\n      \"-DENABLE_DAEMON=${mkFlag enableDaemon}\"\n      \"-DENABLE_CLI=${mkFlag enableCli}\"\n      \"-DINSTALL_LIB=${mkFlag installLib}\"\n    ];\n\n  nativeBuildInputs = [\n    pkg-config\n    cmake\n  ]\n  ++ lib.optionals enableGTK3 [ wrapGAppsHook3 ]\n  ++ lib.optionals enableQt [ qt5.wrapQtAppsHook ];\n\n  buildInputs = [\n    openssl\n    curl\n    libevent\n    zlib\n    pcre\n    libb64\n    libutp\n    miniupnpc\n    dht\n    libnatpmp\n  ]\n  ++ lib.optionals enableQt [\n    qt5.qttools\n    qt5.qtbase\n  ]\n  ++ lib.optionals enableGTK3 [\n    gtk3\n    xorg.libpthreadstubs\n  ]\n  ++ lib.optionals enableSystemd [ systemd ]\n  ++ lib.optionals stdenv.hostPlatform.isLinux [ inotify-tools ]\n  ++ lib.optionals stdenv.hostPlatform.isDarwin [ libiconv ];\n\n  postInstall = ''\n    mkdir $apparmor\n    cat >$apparmor/bin.transmission-daemon <<EOF\n    include <tunables/global>\n    $out/bin/transmission-daemon {\n      include <abstractions/base>\n      include <abstractions/nameservice>\n      include <abstractions/ssl_certs>\n      include \"${\n        apparmorRulesFromClosure { name = \"transmission-daemon\"; } (\n          [\n            curl\n            libevent\n            openssl\n            pcre\n            zlib\n            libnatpmp\n            miniupnpc\n          ]\n          ++ lib.optionals enableSystemd [ systemd ]\n          ++ lib.optionals stdenv.hostPlatform.isLinux [ inotify-tools ]\n        )\n      }\"\n      r @{PROC}/sys/kernel/random/uuid,\n      r @{PROC}/sys/vm/overcommit_memory,\n      r @{PROC}/@{pid}/environ,\n      r @{PROC}/@{pid}/mounts,\n      rwk /tmp/tr_session_id_*,\n\n      r $out/share/transmission/web/**,\n\n      include <local/bin.transmission-daemon>\n    }\n    EOF\n  '';\n\n  env = {\n    # Fix GCC 14 build\n    NIX_CFLAGS_COMPILE = \"-Wno-error=incompatible-pointer-types\";\n  };\n\n  passthru.tests = {\n    apparmor = nixosTests.transmission_3; # starts the service with apparmor enabled\n    smoke-test = nixosTests.bittorrent;\n  };\n\n  meta = {\n    description = \"Fast, easy and free BitTorrent client (deprecated version 3)\";\n    mainProgram =\n      if enableQt then\n        \"transmission-qt\"\n      else if enableGTK3 then\n        \"transmission-gtk\"\n      else\n        \"transmission-cli\";\n    longDescription = ''\n      Transmission is a BitTorrent client which features a simple interface\n      on top of a cross-platform back-end.\n      Feature spotlight:\n        * Uses fewer resources than other clients\n        * Native Mac, GTK and Qt GUI clients\n        * Daemon ideal for servers, embedded systems, and headless use\n        * All these can be remote controlled by Web and Terminal clients\n        * Bluetack (PeerGuardian) blocklists with automatic updates\n        * Full encryption, DHT, and PEX support\n    '';\n    homepage = \"http://www.transmissionbt.com/\";\n    license = lib.licenses.gpl2Plus; # parts are under MIT\n    platforms = lib.platforms.unix;\n  };\n\n})\n"
  },
  {
    "path": "shared/torrents/transmission_3/transmission-3.00-miniupnpc-2.2.8.patch",
    "content": "diff --git a/libtransmission/upnp.c b/libtransmission/upnp.c\nindex c9e248a379...c7b2580bcb 100644\n--- a/libtransmission/upnp.c\n+++ b/libtransmission/upnp.c\n@@ -194,8 +194,13 @@\n \n         errno = 0;\n \n+#if (MINIUPNPC_API_VERSION >= 18)\n         if (UPNP_GetValidIGD(devlist, &handle->urls, &handle->data, handle->lanaddr,\n+            sizeof(handle->lanaddr), NULL, 0) == UPNP_IGD_VALID_CONNECTED)\n+#else\n+        if (UPNP_GetValidIGD(devlist, &handle->urls, &handle->data, handle->lanaddr,\n             sizeof(handle->lanaddr)) == UPNP_IGD_VALID_CONNECTED)\n+#endif\n         {\n             tr_logAddNamedInfo(getKey(), _(\"Found Internet Gateway Device \\\"%s\\\"\"), handle->urls.controlURL);\n             tr_logAddNamedInfo(getKey(), _(\"Local Address is \\\"%s\\\"\"), handle->lanaddr);\n"
  },
  {
    "path": "shared/torrents/transmission_3/transmission-3.00-openssl-3.patch",
    "content": "From 6ee128b95bacaff20746538dc97c2b8e2b9fcc29 Mon Sep 17 00:00:00 2001\nFrom: Mike Gilbert <floppym@gentoo.org>\nDate: Sun, 15 May 2022 10:54:38 -0400\nSubject: [PATCH] openssl: load \"legacy\" provider for RC4\n\n---\n libtransmission/crypto-utils-openssl.c | 7 +++++++\n 1 file changed, 7 insertions(+)\n\ndiff --git a/libtransmission/crypto-utils-openssl.c b/libtransmission/crypto-utils-openssl.c\nindex 45fd71913..14d680654 100644\n--- a/libtransmission/crypto-utils-openssl.c\n+++ b/libtransmission/crypto-utils-openssl.c\n@@ -20,6 +20,9 @@\n #include <openssl/rand.h>\n #include <openssl/ssl.h>\n #include <openssl/x509.h>\n+#if OPENSSL_VERSION_MAJOR >= 3\n+#include <openssl/provider.h>\n+#endif\n \n #include \"transmission.h\"\n #include \"crypto-utils.h\"\n@@ -184,6 +187,10 @@ static void openssl_evp_cipher_context_free(EVP_CIPHER_CTX* handle)\n \n tr_rc4_ctx_t tr_rc4_new(void)\n {\n+#if OPENSSL_VERSION_MAJOR >= 3\n+    OSSL_PROVIDER_load(NULL, \"default\");\n+    OSSL_PROVIDER_load(NULL, \"legacy\");\n+#endif\n     EVP_CIPHER_CTX* handle = EVP_CIPHER_CTX_new();\n \n     if (check_result(EVP_CipherInit_ex(handle, EVP_rc4(), NULL, NULL, NULL, -1)))\n-- \n2.35.1\n\n"
  },
  {
    "path": "tools/provision-machine.sh",
    "content": "#!/usr/bin/env bash\n\nset -e\n\n# see https://nixfiles.docs.barrucadu.dev/runbooks/set-up-a-new-host.html\n\nMODE=\"$1\"\nDEVICE=\"$2\"\n\nif ! [ \"$(id -u)\" -eq 0 ]; then\n    echo \"please run as root\"\n    exit 1\nfi\n\nif ! command -v git &>/dev/null; then\n    echo \"git not found in the PATH\"\n    exit 1\nfi\n\nif ! command -v nixos-generate-config &>/dev/null; then\n    echo \"nixos-generate-config not found in the PATH\"\n    exit 1\nfi\n\nif ! [ -e \"$DEVICE\" ]; then\n    echo \"${DEVICE} not found\"\n    exit 1\nfi\n\n# create partitions\ncase \"$MODE\" in\n    \"gpt\")\n        parted \"$DEVICE\" -- mklabel gpt\n        parted \"$DEVICE\" -- mkpart ESP fat32 1MB 512MB\n        parted \"$DEVICE\" -- mkpart root 512MB 100%\n        parted \"$DEVICE\" -- set 1 esp on\n        ;;\n    \"msdos\")\n        parted \"$DEVICE\" -- mklabel msdos\n        parted \"$DEVICE\" -- mkpart primary 1MB 512MB\n        parted \"$DEVICE\" -- mkpart primary 512MB 100%\n        parted \"$DEVICE\" -- set 1 boot on\n        ;;\n    *)\n        echo \"${MODE} should be gpt or msdos\"\n        exit 1\n        ;;\nesac\n\nBOOTDEV=\"${DEVICE}1\"\nROOTDEV=\"${DEVICE}2\"\n\n# create /boot filesystem\nmkfs.fat -F 32 -n boot \"$BOOTDEV\"\n\n# create zfs datasets & snapshot for erase-your-darlings\nzpool create -o autotrim=on local \"$ROOTDEV\"\n\nzfs create -o mountpoint=legacy local/volatile\nzfs create -o mountpoint=legacy local/volatile/root\n\nzfs create -o mountpoint=legacy local/persistent\nzfs create -o mountpoint=legacy -o com.sun:auto-snapshot=true local/persistent/home\nzfs create -o mountpoint=legacy -o com.sun:auto-snapshot=true local/persistent/nix\nzfs create -o mountpoint=legacy -o com.sun:auto-snapshot=true local/persistent/persist\nzfs create -o mountpoint=legacy -o com.sun:auto-snapshot=true -o xattr=sa -o acltype=posix local/persistent/var-log\n\nzfs snapshot local/volatile/root@blank\n\n# mount filesystems\nmount -t zfs local/volatile/root /mnt\n\nmkdir /mnt/boot\nmkdir /mnt/home\nmkdir /mnt/nix\nmkdir /mnt/persist\nmkdir -p /mnt/var/log\n\nmount -t vfat \"$BOOTDEV\" /mnt/boot\nmount -t zfs local/persistent/home /mnt/home\nmount -t zfs local/persistent/nix /mnt/nix\nmount -t zfs local/persistent/persist /mnt/persist\nmount -t zfs local/persistent/var-log /mnt/var/log\n\n# generate config\nmkdir /mnt/persist/etc\npushd /mnt/persist/etc\ngit clone https://github.com/barrucadu/nixfiles.git nixos\npopd\n\nmkdir /mnt/persist/etc/nixos/hosts/new\ncat <<EOF > /mnt/persist/etc/nixos/hosts/new/header.nix\n# This is {...}.\n#\n# It runs {...}.\n#\n# **Alerting:** disabled\n#\n# **Backups:** disabled\n#\n# **Public hostname:** n/a\n#\n# **Role:** server\n{ config, lib, pkgs, ... }:\n\nwith lib;\n{\n  networking.hostId = \"$(head -c 4 /dev/urandom | xxd -p)\";\n  boot.supportedFilesystems = { zfs = true; };\n\n  ###############################################################################\n  ## GENERATED CONFIG BELOW THIS LINE\n  ###############################################################################\n\nEOF\n\nnixos-generate-config --root /mnt\ncat /mnt/persist/etc/nixos/hosts/new/header.nix /mnt/etc/nixos/configuration.nix > /mnt/persist/etc/nixos/hosts/new/configuration.nix\nrm /mnt/persist/etc/nixos/hosts/new/header.nix\nrm /mnt/etc/nixos/configuration.nix\nmv /mnt/etc/nixos/hardware-configuration.nix /mnt/persist/etc/nixos/hosts/new/hardware.nix\nrmdir /mnt/etc/nixos\n\nnano /mnt/persist/etc/nixos/hosts/new/configuration.nix\nnano /mnt/persist/etc/nixos/hosts/new/hardware.nix\n\necho \"\"\necho \"1. rename /mnt/persist/etc/nixos/hosts/new for new hostname\"\necho \"2. add to /mnt/persist/etc/nixos/flake.nix\"\necho \"3. add to git\"\necho \"4. run nixos-install --flake /mnt/persist/etc/nixos#hostname\"\necho \"5. reboot\"\n"
  }
]