[
  {
    "path": ".gitignore",
    "content": "CONCEPT.html\nCONCEPT.pdf\nREADME.html\nREADME.pdf\nlintian.log\n*.swp\nrpm/SOURCES\nrpm/SPECS\nrpm/RPMS\nrpm/SRPMS\nrpm/BUILD\nrpm/BUILDROOT\n"
  },
  {
    "path": ".gitlab-ci.yml",
    "content": "image: \"debian:stretch\"\n\nstages:\n  - docbuild\n  - build\n  - publish\n  # - test\n  - deploy\n\n### build ###\n\ndocbuild:docs:\n  stage: docbuild\n  image: \"tianon/latex\"\n  script:\n    - apt-get update -qq\n    - apt-get install -y --no-install-recommends make sphinx-common python3-sphinx python3-recommonmark python3-sphinx-rtd-theme\n    - make docs\n  artifacts:\n    paths:\n      - doc/_build/html\n\nbuild:stretch: &build\n  stage: build\n  script:\n    - apt-get update -qq\n    - apt-get -y --no-install-recommends build-dep ./\n    - apt-get -y --no-install-recommends install devscripts\n    - ci/rebuild.sh $dist $is_release\n    - make deb BUILD_ARGS=-Pstretch\n    - mkdir -p debs\n    - mv ../*.* debs\n  variables:\n    dist: deb9\n  artifacts:\n    expire_in: 2 weeks\n    paths:\n      - debs/*\n      - lintian.log\n\nbuild:stretch-release:\n  <<: *build\n  variables:\n    dist: deb9\n    is_release: release\n  when: manual\n\nbuild:buster: &build_buster\n  <<: *build\n  image: \"debian:buster\"\n  script:\n    - apt-get update -qq\n    - apt-get -y --no-install-recommends build-dep ./\n    - apt-get -y --no-install-recommends install devscripts\n    - ci/rebuild.sh $dist $is_release\n    - make deb\n    - mkdir -p debs\n    - mv ../*.* debs\n  variables:\n    dist: deb10\n\nbuild:buster-release:\n  <<: *build_buster\n  variables:\n    dist: deb10\n    is_release: release\n  when: manual\n\nbuild:bionic: &build_bionic\n  <<: *build_buster\n  variables:\n    dist: ubuntu18.04\n\nbuild:bionic-release:\n  <<: *build_bionic\n  variables:\n    dist: ubuntu18.04\n    is_release: release\n  when: manual\n\nbuild:centos7: &build_centos7\n  image: \"centos:centos7\"\n  stage: build\n  dependencies:\n    - docbuild:docs\n  script:\n    - yum install -y rpm-build yum-utils git make\n    - yum-builddep -y rpm/elephant-shed.spec\n    - make rpmbuild PACKAGE_RELEASE=1~$(date -u +%Y%m%d.%H%M%S)\n  artifacts:\n    expire_in: 2 weeks\n    paths:\n      - rpm/RPMS/*/*\n      - rpm/SRPMS/*\n\nbuild:centos7-release:\n  <<: *build_centos7\n  script:\n    - yum install -y rpm-build yum-utils git make\n    - yum-builddep -y rpm/elephant-shed.spec\n    - make rpmbuild\n  when: manual\n\n### publish ###\n\npublish:stretch: &publish\n  tags:\n    - aptly\n  stage: publish\n  dependencies:\n    - build:stretch\n  script:\n    - aptly repo add $repo debs/*.dsc debs/*.deb\n    - aptly publish update $repo\n    - sync_packages.sh\n  variables:\n    repo: stretch-test\n  only:\n    - master\n    - rel1_3\n\npublish:stretch-release:\n  <<: *publish\n  dependencies:\n    - build:stretch-release\n  variables:\n    repo: stretch-stable\n  when: manual\n\npublish:buster: &publish_buster\n  <<: *publish\n  dependencies:\n    - build:buster\n  variables:\n    repo: buster-test\n\npublish:buster-release:\n  <<: *publish_buster\n  dependencies:\n    - build:buster-release\n  variables:\n    repo: buster-stable\n  when: manual\n\npublish:bionic: &publish_bionic\n  <<: *publish\n  dependencies:\n    - build:bionic\n  variables:\n    repo: bionic-test\n\npublish:bionic-release:\n  <<: *publish_bionic\n  dependencies:\n    - build:bionic-release\n  variables:\n    repo: bionic-stable\n  when: manual\n\npublish:centos7: &publish_centos\n  <<: *publish\n  dependencies:\n    - build:centos7\n  script:\n    - rpm --addsign rpm/RPMS/noarch/*.rpm rpm/SRPMS/*.rpm\n    - cp rpm/RPMS/noarch/*.rpm /home/debian/postgresql/yum/$repo/noarch\n    - cp rpm/SRPMS/*.rpm /home/debian/postgresql/yum/$repo/src\n    - cd /home/debian; make $repo\n  variables:\n    repo: el7-test\n\npublish:centos7-release:\n  <<: *publish_centos\n  dependencies:\n    - build:centos7-release\n  variables:\n    repo: el7\n  when: manual\n\n### deploy ###\n\n# requires gitlab-runner to be configured to execute shell commands as root:\n# rm /home/gitlab-runner/.bash_logout\n# systemctl edit gitlab-runner\n# [Service]\n# ExecStart=\n# ExecStart=/usr/bin/gitlab-runner \"run\" \"--working-directory\" \"/home/gitlab-runner\" \"--config\" \"/etc/gitlab-runner/config.toml\" \"--service\" --user root\n\ndeploy:stretch-x86: &deploy\n  stage: deploy\n  dependencies:\n    - publish:stretch\n  tags:\n    - stretch-amd64\n  script:\n    - 'test -f /etc/apt/sources.list.d/credativ_postgresql.list || echo \"deb https://packages.credativ.com/public/postgresql/ $(lsb_release -cs)-test main\" > https://packages.credativ.com/public/postgresql/'\n    - apt-get update -q\n    #- apt-get install -y ansible\n    - apt-get install -y 'elephant-shed.*'\n  only:\n    - master\n    - rel1_3\n  environment:\n    name: elephant-shed\n    url: https://elephant-shed.dev.credativ.de\n\ndeploy:buster-x86:\n  <<: *deploy\n  dependencies:\n    - publish:buster\n  tags:\n    - buster-amd64\n  environment:\n    name: elephant-shed-buster\n    url: https://elephant-shed-buster.dev.credativ.de\n\ndeploy:bionic-x86:\n  <<: *deploy\n  dependencies:\n    - publish:bionic\n  tags:\n    - bionic-amd64\n  environment:\n    name: elephant-shed-bionic\n    url: https://elephant-shed-bionic.dev.credativ.de\n\ndeploy:centos7-x86:\n  <<: *deploy\n  stage: deploy\n  dependencies:\n    - build:centos7\n  tags:\n    - centos7-x86\n  script:\n    - 'test -f /etc/yum.repos.d/pgdg-redhat-all.repo || yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm'\n    - 'test -f /etc/yum.repos.d/credativ-test.repo || yum install -y https://packages.credativ.com/public/postgresql/yum/credativ-test-repo.rpm'\n    - yum clean expire-cache\n    - yum update -y\n    - yum install -y elephant-shed\n  environment:\n    name: elephant-shed-centos7\n    url: https://elephant-shed-centos7.dev.credativ.de\n"
  },
  {
    "path": ".vimrc",
    "content": "set sw=2\n"
  },
  {
    "path": "LICENSE",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.  We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors.  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights.  Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received.  You must make sure that they, too, receive\nor can get the source code.  And you must show them these terms so they\nknow their rights.\n\n  Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.\n\n  For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software.  For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.\n\n  Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so.  This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software.  The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable.  Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts.  If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.\n\n  Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary.  To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Use with the GNU Affero General Public License.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If the program does terminal interaction, make it output a short\nnotice like this when it starts in an interactive mode:\n\n    <program>  Copyright (C) <year>  <name of author>\n    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, your program's commands\nmight be different; for a GUI interface, you would use an \"about box\".\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU GPL, see\n<http://www.gnu.org/licenses/>.\n\n  The GNU General Public License does not permit incorporating your program\ninto proprietary programs.  If your program is a subroutine library, you\nmay consider it more useful to permit linking proprietary applications with\nthe library.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.  But first, please read\n<http://www.gnu.org/philosophy/why-not-lgpl.html>.\n"
  },
  {
    "path": "Makefile",
    "content": "# Default git branch to build in RPM\nifndef GITBRANCH\nGITBRANCH=HEAD\nendif\n\nall: docs\n\ndoc docs:\n\t$(MAKE) -C doc html\n\ndeb:\n\tdpkg-buildpackage -us -uc $(BUILD_ARGS)\n\tlintian | tee -a lintian.log\n\nupload_packages: deb\n\taptly/upload_packages.sh\n\ninclude_packages:\n\taptly/include_packages.sh\n\npublish_packages:\n\taptly/publish_packages.sh\n\nvagrant: deb\n\tcd vagrant && vagrant up --provision\n\nansible: deb\n\tcd vagrant && ./elephant-shed.yml $(ANSIBLE_ARGS)\n\ndeploy_openpower: vagrant/inventory.openpower\n\tcd vagrant && ./elephant-shed.yml $(ANSIBLE_ARGS) \\\n\t  -i inventory.openpower \\\n\t  -e \"repo=http\"\n\nclean:\n\t$(MAKE) -C doc clean\n\t$(MAKE) -C grafana clean\n\trm -rf rpm/SOURCES/ rpm/SPECS rpm/BUILD rpm/BUILDROOT rpm/RPMS rpm/SRPMS\n\n# rpm\n\nDPKG_VERSION=$(shell sed -ne '1s/.*(//; 1s/).*//p' debian/changelog)\nPACKAGE_RELEASE=1\nRPMDIR=$(CURDIR)/rpm\nTARBALL=$(RPMDIR)/SOURCES/elephant-shed_$(DPKG_VERSION).tar\n\nrpmbuild: $(TMATESOURCE) $(TARBALL).xz\n\trpmbuild -D\"%_topdir $(RPMDIR)\" --define='package_version $(DPKG_VERSION)' --define='package_release $(PACKAGE_RELEASE)' -ba rpm/elephant-shed.spec\n\ntarball $(TARBALL).xz:\n\tmkdir -p $(dir $(TARBALL))\n\trm -f $(TARBALL).xz\n\tgit archive --prefix=elephant-shed-$(DPKG_VERSION)/ $(GITBRANCH) > $(TARBALL)\n\t# include pre-built documentation in tarball\n\ttar --append --transform \"s!^!elephant-shed-$(DPKG_VERSION)/!\" -f $(TARBALL) doc/_build/html\n\txz $(TARBALL)\n\n# tmate rpm\n\nTMATESOURCE=$(CURDIR)/rpm/SOURCES/$(shell rpmspec --srpm --query --queryformat '%{Source}' rpm/tmate.spec)\n\nrpmbuild-tmate: $(TMATESOURCE)\n\trpmbuild -D\"%_topdir $(RPMDIR)\" --define='package_version $(DPKG_VERSION)' -ba rpm/tmate.spec\n\n$(TMATESOURCE):\n\tmkdir -p rpm/SOURCES\n\tspectool -S -g -C rpm/SOURCES rpm/tmate.spec\n"
  },
  {
    "path": "README.md",
    "content": "<img src=\"portal/image/button_home.png\" width=\"200\">\n\n# Intro\n\nElephant Shed is a web-based PostgreSQL management front-end that bundles\nseveral utilities and applications for use with PostgreSQL. It currently\nmanages single-node Linux PostgreSQL servers and appliances.\n\nThe main components are:\n\n* PostgreSQL - <https://www.postgresql.org/>\n* OmniDB - <https://omnidb.org/>\n* postgresql-common - <https://salsa.debian.org/postgresql/postgresql-common>\n* pgBadger - <http://dalibo.github.io/pgbadger/>\n* pgBackRest - <http://www.pgbackrest.org/>\n* Grafana - <https://grafana.com/>\n* Prometheus - <https://prometheus.io/>\n* Cockpit - <http://cockpit-project.org/>\n* Shell In A Box - <https://github.com/shellinabox/shellinabox>\n* tmate - <https://tmate.io/>\n\nAll PostgreSQL versions are supported via <https://apt.postgresql.org>.\n\nSupported distributions:\n\n* Debian Trixie (13)\n* Debian Bookworm (12)\n* Ubuntu Noble (24.04)\n* Ubuntu Jammy (22.04)\n\n# Download\n\nPackages, Vagrant boxes, images: <https://elephant-shed.io/#download>\n\n# Documentation\n\nThe documentation is located at <https://elephant-shed.io/doc/>\n\n# Screenshots\n\n## Portal\n\nThe main portal webpage has links to all bundled applications. It also shows\nthe PostgreSQL status, and allows starting/stopping the clusters, backup, and\nlog reports.\n\n![Figure: Elephant Shed portal](images/el-portal.png)\n\n## Cockpit\n\nFor managing clusters and services, Cockpit is used.\n\n![Figure: Cockpit Cluster Service](images/cockpit_postgresql_service.png)\n\n## Monitoring - Prometheus\n\nPrometheus is a metric based monitoring system for servers and services. It\ncollects metrics from configured targets at given intervals, evaluates rule\nexpressions, displays the results, and can trigger alerts if some condition is\nobserved to be true.\n\n![Figure: Prometheus graphing the load](images/prometheus-load.png)\n\n## Monitoring - Grafana\n\nGrafana bundles metrics collected by Prometheus and presents them in a dashboard.\n\n![Figure: Grafana - PostgreSQL Server Overview](images/grafana-overview.png)\n\n## DBA Tool - OmniDB\n\nOmniDB is a management tool for PostgreSQL to help DBAs execute many different tasks.\nIt provides user management, DDL functionality, an interactive SQL shell, and more.\n\n![Figure: OmniDB](images/omnidb.png)\n\n## Backup - pgBackRest\n\nThe Elephant Shed comes with a preinstalled backup solution, *pgBackRest*.\n\n![Figure: pgBackRest Backup via Cockpit](images/el-backrest-start.png)\n\n## Reporting - pgBadger\n\nA pgBadger report is created for each PostgreSQL instance.\n\n![Figure: pgBadger overview](images/pgbadger-overview.png)\n\n## Web Terminal - Shell In A Box\n\nShell In A Box is a convenient web based terminal.\n\n## Remote Control - tmate\n\ntmate is a fork of the popular terminal multiplexer tmux, tweaked for instant\nterminal sharing. It is preconfigured to connect to a relay server and enables\nthe user to share the current terminal with a third party using a secret token.\n\n![Figure: tmate](images/tmate.png)\n\n# License\n\nThe Elephant Shed itself is licensed under the GPLv3 (<https://www.gnu.org/licenses/gpl-3.0.html>).\n\nAll bundled components are Free/Open-Source software with a known and approved open source license.\n\n# Support\n\n* Documentation: <https://elephant-shed.io/doc/>\n* Web-Chat: [#elephant-shed](https://webchat.oftc.net/?nick=web-user-.&channels=elephant-shed&uio=MT11bmRlZmluZWQmMj10cnVlJjk9dHJ1ZSYxMT0yMzY31)\n* IRC [#elephant-shed](https://webchat.oftc.net/?channels=elephant-shed&uio=MT11bmRlZmluZWQmMj10cnVlJjk9dHJ1ZSYxMT0yMzY31\n) on [irc.oftc.net](https://www.oftc.net/)\n\nElephant Shed is an open source project, developed and maintained by credativ.\n\nFor the Elephant Shed PostgreSQL appliance, credativ offers comprehensive\ntechnical support with service level agreements, which are also available\non 365 days a year and 24 hours a day as an option.\n\nInstallation and integration support, as well as an introduction\nin Elephant Shed PostgreSQL appliance is of course also part of\ncredativ's services. If you are interested, please feel free to contact us.\n\n![](images/logo_credativ_96.png)\n\n* **Web** [credativ.de](https://credativ.de)\n* **E-Mail:** [info@credativ.de](mailto:info@credativ.de)\n* **Phone:** [+49 2161 9174200](tel:+4921619174200)\n"
  },
  {
    "path": "ci/.gitignore",
    "content": "fact_cache/\n*.retry\n"
  },
  {
    "path": "ci/ansible.cfg",
    "content": "[defaults]\nhostfile = inventory\nnocows = True\n\ngathering = smart\nfact_caching = jsonfile\nfact_caching_connection = fact_cache\n\n[ssh_connection]\npipelining = True\n"
  },
  {
    "path": "ci/build-grafana.sh",
    "content": "#!/bin/bash\n\n# This script should be initiated inside the go src path of grafana!\n# For more information on building grafana \"the grafana-way\" see\n# https://github.com/grafana/grafana-packer.\n\nsudo apt install golang npm gem ruby ruby-dev\nsudo npm install -g yarn\n\n# This fails on ppc64el, since fpm isn't available on that platform.\nsudo gem install fpm -v 1.4\n\ngo run build.go build\nyarn install\n\n# Because we don't have fpm on ppc64el the following step fails\n# horible on this architecture.\ngo run build.go pkg-deb latest\n"
  },
  {
    "path": "ci/credativDeutschlandServerCA-chain.pem",
    "content": "Subject: CN=credativ Root CA,O=credativ,C=DE\nIssuer: CN=credativ Root CA,O=credativ,C=DE\n-----BEGIN CERTIFICATE-----\nMIIDWzCCAkOgAwIBAgIISCM+EhxtDiMwDQYJKoZIhvcNAQELBQAwOzEZMBcGA1UE\nAwwQY3JlZGF0aXYgUm9vdCBDQTERMA8GA1UECgwIY3JlZGF0aXYxCzAJBgNVBAYT\nAkRFMB4XDTE0MDgxODEwMDkyNVoXDTI0MDgxNTEwMDkyNVowOzEZMBcGA1UEAwwQ\nY3JlZGF0aXYgUm9vdCBDQTERMA8GA1UECgwIY3JlZGF0aXYxCzAJBgNVBAYTAkRF\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjdd8jPo/DZYagM0gCbjD\nQq6EBkHbeGbQPDQLoSt/M6xTP6CnHG3tBqG3gFRpjFAogn9eTGXFLvT+tGAvWHeY\nGQqT7Jwn/Utezuskl9M87O+QVPwwQfDus2+L98b4cBzs24t+jPqMe8Ucs7AsFDFj\nfHWRGh1a7lRvXwlcJzGT063MyC4awu8Ak7zxRI6h0/Six+h5v73OwOnW8jkkGNvS\nRNxgy3nkGdsUyculMhdNHx8CZm5SGmjOlNX9jolvfyRfCUGSOs4/MwKlB/kTFZsy\nYbEXhepa/58jf5XoU5vZoDUW7S3AcyW9luyH99vXokqDuUyjyHcBdCEawP+XNpBo\nXwIDAQABo2MwYTAdBgNVHQ4EFgQUukB/2X0jBvlK6IqQNEc1dSOZsA4wDwYDVR0T\nAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6QH/ZfSMG+UroipA0RzV1I5mwDjAOBgNV\nHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQADggEBAAEdlbkVPMRyGDSJqGphq3aM\nG9ksmuYUr64uoNydrnD64TT5mCmfNFYGXLYBIe0V5ZzgAUigoSipU0WUQFz0EKWX\no5WYa1RcnzGKsphieafekGBA4GnSrMIuxN29ZckOvT2gZMTpM9X381aY9Slm6TOP\na7XCobZDEZwBR4bmZZeJ8GOseWUHWK+Ddr+m38iUh0QqSMgfv5Iyzo0YrrFXl9FF\nORYDcdKSpMQcvKM+XVLNgLqGG+1DZEwDH2Lo87OHaQzmZfkfS2wFcTzVCLJW2z0T\ncwgzRQQdEocD72c9QHm3+VYU56Kh5OtZWVVTVofssCBgwJlE0K9EdpKaJe3BEwE=\n-----END CERTIFICATE-----\nSubject: CN=credativ Deutschland Server CA,O=credativ,C=DE\nIssuer: CN=credativ Root CA,O=credativ,C=DE\n-----BEGIN CERTIFICATE-----\nMIIDbDCCAlSgAwIBAgIIFgGTWLPv+rkwDQYJKoZIhvcNAQELBQAwOzEZMBcGA1UE\nAwwQY3JlZGF0aXYgUm9vdCBDQTERMA8GA1UECgwIY3JlZGF0aXYxCzAJBgNVBAYT\nAkRFMB4XDTE0MTEyNDE0NTEwM1oXDTI0MDgxNTEwMDkyNVowSTEnMCUGA1UEAwwe\nY3JlZGF0aXYgRGV1dHNjaGxhbmQgU2VydmVyIENBMREwDwYDVQQKDAhjcmVkYXRp\ndjELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCR\nJ/A2KvEBeoBR0cbb2sZadbzfg9+f/h7OozuW4/X6g1ciBKzC1eaU+eJnHjS3uZ2j\noVd2Q94icuRV+LesA1vlVNU6e/ZsOQg2HJIxEDBNK1lbsIVKm0hdMZsE/jD6Jmcj\nv712331zu/33+PUXtbEgLBZS8rwQROgGwMV2Jmf/qamxiyhjqU805ONdafgypHKt\nzYkdJ1yUnvBnWpYYZ4DKmQSwSFTgxtH3xctvD3v8uTmR/KUmYlQsRvt4wXSUY3dE\nU+WiwBl1kepzvmh/fCGoVmrpCSJjp5+FD82Q6XbNzHHOJZ9P5+z34BUmvirDBmHP\n5wZOkOYZKS2PCVjG9rv7AgMBAAGjZjBkMB0GA1UdDgQWBBSB3bLMhsu4ZBqT2r0w\np3oMcyuaGzASBgNVHRMBAf8ECDAGAQH/AgEAMB8GA1UdIwQYMBaAFLpAf9l9Iwb5\nSuiKkDRHNXUjmbAOMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEA\nc+AW1b36jXmCZu3npwxTACfY8M04Mg1NjI5pEK3nI9Tj74rkCOYY0HJ8I1X4f3SR\nd0mrc6RXlU6jpFriBiGduU9GTMdeNkDNCHqbiuv56Saa8wosQmVTuXQk7XP7w2i3\np0nt7u1yJBIzny6tSQdSRgq/ryWlye1byX9SAiMEZGrasz/CnumZbuCP8rWN+PGw\nzWZxd6ZVgZJoR0ZPGqhuT4aRLkSbyEUMbP9xL8wJ/gDhZTvamgGdNkLSAYpNzio+\nDKntJkpqXncMMSBi0pwnhK8JbXFXTvU0Qf/WEAEE1bAWqlxPku4XezFrYbAFhm0D\nf9YYoPUb3I1/K5+erEBADw==\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "ci/inventory",
    "content": "elephant-shed.dev.credativ.lan ansible_host=172.26.251.138 ansible_user=debian\n"
  },
  {
    "path": "ci/openstack_remove_instance_if_exists.sh",
    "content": "#!/usr/bin/env bash\n\n# This script assumes that all OS_* variables are set and valid.\n\nset -u\n\nif [ $# -lt 1 ]; then\n    cat <<EOF 1>&2\nUsage: $0 <instance>\n\n\tWhere <instance> could be either a machine name or UUID.\nEOF\n    exit 1\nfi\n\nINSTANCE=$1\n# Better save than sorry.\ntest -n $INSTANCE\nif [ $? -ne 0 ]; then\n    echo \"Instance variable is empty, not going any further.\" 1>&2\n    exit 2\nfi\n\nwhich openstack > /dev/null\nif [ $? -ne 0 ]; then\n    echo \"Could not find openstack client utilities.\" 1>&2\n    exit 3\nfi\n\nopenstack server list | grep -q \" $INSTANCE \"\nif [ $? -ne 0 ]; then\n    echo \"Instance \\\"$INSTANCE\\\" does not exist, exiting.\"\n    exit 0\nfi\n\n# If we get here a instance with name / UUID $INSTANCE does exist.\nopenstack server delete \"$INSTANCE\"\nif [ $? -ne 0 ]; then\n    echo \"Something went wrong removing the instance \\\"$INSTANCE\\\".\" 1>&2\n    exit 4\nfi\n\necho \"Instance \\\"$INSTANCE\\\" removed successfully.\"\n"
  },
  {
    "path": "ci/openstackrc.sh",
    "content": "#!/usr/bin/env bash\n\n# NOTE: We get the passwort from gitlab-ci.\n\nexport OS_AUTH_URL=https://nova.credativ.com:5000/v2.0\nexport OS_TENANT_ID=27498e6ffaca49f7b57a14ef505e3098\nexport OS_TENANT_NAME=\"database\"\nunset OS_PROJECT_ID\nunset OS_PROJECT_NAME\nunset OS_USER_DOMAIN_NAME\nexport OS_USERNAME=\"app_dbteam\"\nexport OS_REGION_NAME=\"regionOne\"\nif [ -z \"$OS_REGION_NAME\" ]; then unset OS_REGION_NAME; fi\n\n# Use our own certificate\nexport OS_CACERT=\"$(dirname $0)/credativDeutschlandServerCA-chain.pem\"\n"
  },
  {
    "path": "ci/rebuild.sh",
    "content": "#!/bin/bash\n\n# This script prepares a rebuild of our debian package for testing purposes.\n\nset -eu\n\nDISTTAG=\"$1\"\nIS_RELEASE_BUILD=\"${2:-}\" # leave empty for CI build\n\nexport DEBFULLNAME=\"credativ GmbH\"\nexport DEBEMAIL=\"dbteam@credativ.com\"\n\norig_version=$(dpkg-parsechangelog -S version)\nif [ \"$IS_RELEASE_BUILD\" ]; then\n  new_version=\"${orig_version}~$DISTTAG+1\"\nelse\n  date=\"$(date -u +%Y%m%d.%H%M%S)\"\n  new_version=\"${orig_version}~$DISTTAG~${date}\"\nfi\n\ndch --force-bad-version -v ${new_version} \"Automatic CI rebuild\"\ndch -r \"Build for $DISTTAG\"\n"
  },
  {
    "path": "ci/setup-gitlab-runner",
    "content": "#!/usr/bin/ansible-playbook\n---\n- name: setup-gitlab-runner\n  hosts: all\n  become: true\n\n  tasks:\n\n  - name: Install apt-transport-https\n    apt:\n      name: apt-transport-https\n      install_recommends: false\n\n  - name: gitlab-runner repository key\n    apt_key:\n      url: https://packages.gitlab.com/runner/gitlab-ci-multi-runner/gpgkey\n      id: 14219A96E15E78F4\n\n  - name: gitlab-runner repository\n    apt_repository:\n      repo: \"deb https://packages.gitlab.com/runner/gitlab-ci-multi-runner/debian/ stretch main\"\n      filename: 'gitlab-runner'\n\n  - name: Install gitlab-ci-multi-runner\n    apt:\n      name: gitlab-ci-multi-runner\n      install_recommends: false\n\n  - name: Add gitlab-runner to sudo group\n    user:\n      name: gitlab-runner\n      groups: sudo\n\n  - name: allow sudo without password\n    lineinfile:\n      dest: /etc/sudoers\n      line: '%sudo\tALL=(ALL:ALL) NOPASSWD: ALL'\n      regexp: '^%sudo'\n"
  },
  {
    "path": "cockpit/cockpit.conf",
    "content": "[WebService]\n# Origin is hardcoded to localhost in apache config\nOrigins = https://localhost https://localhost:10090\n"
  },
  {
    "path": "cockpit/port.conf",
    "content": "[Socket]\nListenStream=\nListenStream=10090\n"
  },
  {
    "path": "debian/.gitignore",
    "content": "*.debhelper\ndebhelper-build-stamp\nelephant-shed*.debhelper.log\nelephant-shed*.substvars\nelephant-shed*/\nfiles\n"
  },
  {
    "path": "debian/changelog",
    "content": "elephant-shed (1.3.12) unstable; urgency=medium\n\n  * sql-exporter: add io/wal and primary/replica metrics.\n  * Grafana: add io/wal and role (primary/replica) panels.\n  * ansible: bump default Postgres version to 17.\n\n -- Michael Banck <michael.banck@credativ.de>  Wed, 21 Jan 2026 16:27:00 +0100\n\nelephant-shed (1.3.11) unstable; urgency=medium\n\n  * node-exporter: listen on all interfaces.\n  * prometheus: make configuration extendable.\n  * {node,sql}-exporter: add host-specific scrape-targets.\n  * Dashboard: enable multi-host monitoring, overhaul system panels and ship\n    separate node overview dashboard.\n\n -- Michael Banck <michael.banck@credativ.de>  Wed, 29 Oct 2025 14:16:25 +0100\n\nelephant-shed (1.3.10) unstable; urgency=medium\n\n  * Grafana: small improvements to dashboard.\n  * ansible: bump default Postgres version to 16.\n\n -- Michael Banck <michael.banck@credativ.de>  Wed, 25 Jun 2025 08:49:24 +0200\n\nelephant-shed (1.3.9) unstable; urgency=medium\n\n  [ Michael Banck ]\n  * Overhaul Grafana dashboard.\n  * Add work-around to sql-exporter instant queries no longer being supported\n    upstream.\n\n  [ Nicolas Dandrimont ]\n  * Make sql-exporter only generate instant job if there are instant queries.\n\n -- Michael Banck <michael.banck@credativ.de>  Mon, 18 Nov 2024 17:06:10 +0100\n\nelephant-shed (1.3.8) unstable; urgency=medium\n\n  * Fix sql-exporter queries on Debian 12 / Ubuntu 22.04.\n  * Fix elephant-shed-cockpit postinst.\n  * Add enable-backup and enable-powa-addons features to es_ctlcluster.\n  * Replaced shellinabox with Cockpit's terminal.\n  * Remove vendorized javascript libraries from portal.\n\n -- Michael Banck <michael.banck@credativ.de>  Wed, 28 Feb 2024 09:41:48 +0100\n\nelephant-shed (1.3.7) unstable; urgency=medium\n\n  * Finish PoWA integration.\n  * Add es_ctlcluster script to enable PoWA in PG clusters.\n\n -- Christoph Berg <myon@debian.org>  Thu, 30 Jun 2022 16:58:35 +0200\n\nelephant-shed (1.3.6) unstable; urgency=medium\n\n  [ Christoph Berg ]\n  * Add PoWA integration.\n\n  [ Michael Banck ]\n  * node-exporter: Remove obsolete --collector.netdev.ignored-devices option.\n  * Fix pg_stat_statements sql-exporter query.\n\n -- Christoph Berg <myon@debian.org>  Tue, 31 May 2022 12:29:23 +0200\n\nelephant-shed (1.3.5) unstable; urgency=medium\n\n  * Generate dependency on tmate >= << 2.4 automatically.\n  * debian/clean: Remove build artifacts.\n  * Revert path activation for sql-exporter, doesn't work reliably.\n  * Restart sql-exporter when postgresql.service is started.\n  * Start omnidb-server once to initialize /var/lib/omnidb/.omnidb/.\n\n -- Christoph Berg <myon@debian.org>  Thu, 29 Jul 2021 15:10:20 +0200\n\nelephant-shed (1.3.4) unstable; urgency=medium\n\n  * Move from pgadmin4 to OmniDB; pgadmin4 is no longer provided on\n    apt.postgresql.org.\n  * Grafana: Fix syntax in datasource provisioning yaml.\n  * Grafana: Display only the currently selected database(s) in the Freeze Age\n    panel.\n  * ansible: restart prometheus-sql-exporter after postgres cluster creation.\n  * ansible: skip sysctl, io scheduler an grub tasks in LXC containers.\n  * sql-exporter: Add final newline to queries.yml.\n  * Require tmate >= 2.4 since the hostkey syntax changed.\n\n  [ Nicolas Dandrimont ]\n  * Update pg_stat_statements SQL exporter query for Postgres 13\n\n -- Christoph Berg <myon@debian.org>  Mon, 01 Mar 2021 11:44:22 +0100\n\nelephant-shed (1.3.3) unstable; urgency=medium\n\n  * Added limits to monitoring-queries.\n  * Fixed \"Column 'usename' must be type text (string)\".\n\n -- Christoph Berg <myon@debian.org>  Thu, 09 Jan 2020 14:23:31 +0100\n\nelephant-shed (1.3.2) unstable; urgency=medium\n\n  * Grafana: Fix \"WAL Senders\"-panel.\n  * Build infrastructure updates.\n\n -- Christoph Berg <myon@debian.org>  Tue, 06 Aug 2019 15:38:38 +0200\n\nelephant-shed (1.3.1) unstable; urgency=medium\n\n  * update-prometheus-sql-exporter-config: Support setting interval.\n    Patch by Nicolas Dandrimont, thanks!\n  * e-s-postgresql.postinst: Don't fail if logrotate file was removed.\n  * When building for packages.credativ.com, add dependency on\n    credativ-postgresql-keyring package.\n\n -- Christoph Berg <myon@debian.org>  Thu, 02 May 2019 16:00:09 +0200\n\nelephant-shed (1.3) unstable; urgency=medium\n\n  * Start prometheus-sql-exporter-restart.timer on package installation.\n  * Node exporter 0.16 renames many variables, update dashboard.\n  * elephant-shed-postgresql: Stop installing custom logrotate file.\n  * postgresql: Don't set waldir and data checksums by default.\n  * portal: Use AuthExternal pwauth instead of the buggy authnz-pam module.\n  * portal: Use HTTP_HOST instead of SSL_TLS_SNI in cockpit's CSP header.\n\n -- Christoph Berg <christoph.berg@credativ.de>  Fri, 07 Dec 2018 16:39:19 +0100\n\nelephant-shed (1.2) unstable; urgency=medium\n\n  * This release bundles a series of breaking changes:\n    + Upgrade to grafana 5 and prometheus 2. (Existing monitoring data is not\n      migrated.)\n    + Upgrade to prometheus-node-exporter 0.15.\n    + Rewrite update-prometheus-sql-exporter-config using PgCommon.pm, and\n      refactor its config file handling.\n  * prometheus: Use 'localhost' as job_name to bundle this machine's node and\n    sql exporter results. 'sql_job' contains the postgresql-common cluster\n    name now.\n  * The grafana dashboard has been updated to use rate() instead of increase()\n    in most panels to show values per second or minute.\n\n -- Christoph Berg <christoph.berg@credativ.de>  Fri, 18 May 2018 17:06:21 +0200\n\nelephant-shed (1.1.1) unstable; urgency=medium\n\n  [ Adrian Vondendriesch ]\n  * Split prometheus exporters into own packages.\n\n  [ Alexander Sosna ]\n  * Change docs build process to sphinx\n  * grafana: Fix \"Dead Tuples\"\n  * grafana: Fix \"Locks\"\n  * grafana: Change limits for \"Next Freeze\"\n  * grafana: Add tool tips\n\n -- Adrian Vondendriesch <adrian.vondendriesch@credativ.de>  Thu, 25 Jan 2018 17:00:25 +0100\n\nelephant-shed (1.0) unstable; urgency=medium\n\n  [ Christoph Berg ]\n  * cockpit: Add cockpit-packagekit to Recommends.\n\n  [ Adrian Vondendriesch ]\n  * prometheus: Add sudo to dependencies.\n  * portal: replace the way we show backups.\n  * portal: rework UI, introduce bootstrap.\n\n  [ Alexander Sosna ]\n  * grafana: Fix for queries for Prometheus 2.0\n  * portal: Use new Icons\n\n  [ Caique de Castro ]\n  * portal: Fix link to Grafana\n\n -- Adrian Vondendriesch <adrian.vondendriesch@credativ.de>  Mon, 16 Oct 2017 18:54:10 +0200\n\nelephant-shed (0.9) unstable; urgency=medium\n\n  * Team upload.\n  * Initial release.\n\n -- Adrian Vondendriesch <adrian.vondendriesch@credativ.de>  Mon, 16 Oct 2017 17:38:41 +0200\n"
  },
  {
    "path": "debian/clean",
    "content": "ci/fact_cache/\nci/*.retry\ndoc/_build/\nrpm/BUILD/\nrpm/BUILDROOT/\nrpm/RPMS/\nrpm/SOURCES/\nrpm/SPECS/\nrpm/SRPMS/\nvagrant/fact_cache/\nvagrant/*.retry\nvagrant/openstack/fact_cache/\nvagrant/.vagrant/\n"
  },
  {
    "path": "debian/compat",
    "content": "10\n"
  },
  {
    "path": "debian/control",
    "content": "Source: elephant-shed\nSection: database\nPriority: optional\nMaintainer: credativ GmbH <info@credativ.de>\nUploaders:\n Michael Banck <michael.banck@credativ.de>,\n Adrian Vondendriesch <adrian.vondendriesch@credativ.de>,\nStandards-Version: 4.1.1\nBuild-Depends:\n debhelper (>= 10~),\n python3-recommonmark,\n python3-sphinx-rtd-theme,\n python3-sphinx,\n sphinx-common,\n tmate,\n\nPackage: elephant-shed\nArchitecture: all\nDepends:\n elephant-shed-cockpit,\n elephant-shed-grafana,\n elephant-shed-omnidb <!stretch>,\n elephant-shed-pgbackrest,\n elephant-shed-pgbadger,\n elephant-shed-portal,\n elephant-shed-postgresql,\n elephant-shed-powa,\n elephant-shed-prometheus,\n elephant-shed-prometheus-node-exporter,\n elephant-shed-prometheus-sql-exporter,\n elephant-shed-tmate,\n ${keyring:Depends},\n ${misc:Depends},\nDescription: PostgreSQL dashboard\n The Elephant Shed is a web-based PostgreSQL management front-end.\n .\n This meta package depends on all Elephant Shed components.\n\nPackage: elephant-shed-portal\nArchitecture: all\nDepends:\n adduser,\n apache2,\n libapache2-mod-authnz-external,\n libapache2-mod-authz-unixgroup,\n libapache2-mod-wsgi-py3 <!stretch>,\n libjs-jquery,\n libjs-bootstrap,\n libjs-popper.js,\n libtemplate-perl,\n libcgi-pm-perl,\n pwauth,\n ${misc:Depends},\nDescription: PostgreSQL dashboard -- web interface\n The Elephant Shed is a web-based PostgreSQL management front-end.\n .\n This package provides the web interface.\n\nPackage: elephant-shed-postgresql\nArchitecture: all\nDepends:\n adduser,\n postgresql-common (>> 183~),\n ${misc:Depends},\nDescription: PostgreSQL dashboard -- PostgreSQL integration\n The Elephant Shed is a web-based PostgreSQL management front-end.\n .\n This package provides the integration with PostgreSQL.\n\nPackage: elephant-shed-omnidb\nArchitecture: all\nBuild-Profiles: <!stretch>\nDepends:\n omnidb-server,\n ${misc:Depends},\nDescription: PostgreSQL dashboard -- OmniDB integration\n The Elephant Shed is a web-based PostgreSQL management front-end.\n .\n This meta package provides the integration with OmniDB.\n\nPackage: elephant-shed-pgbadger\nArchitecture: all\nDepends:\n pgbadger (>> 9),\n postgresql-common,\n ${misc:Depends},\nDescription: PostgreSQL dashboard -- pgBadger integration\n The Elephant Shed is a web-based PostgreSQL management front-end.\n .\n This package provides the integration with pgBadger.\n\nPackage: elephant-shed-pgbackrest\nArchitecture: all\nDepends:\n pgbackrest,\n postgresql-common,\n ${misc:Depends},\nDescription: PostgreSQL dashboard -- pgBackRest integration\n The Elephant Shed is a web-based PostgreSQL management front-end.\n .\n This package provides the integration with pgBackRest.\n\nPackage: elephant-shed-grafana\nArchitecture: all\nDepends:\n curl,\n grafana (>> 5),\n ${misc:Depends},\nDescription: PostgreSQL dashboard -- Grafana integration\n The Elephant Shed is a web-based PostgreSQL management front-end.\n .\n This package provides the integration with Grafana.\n\nPackage: elephant-shed-powa\nArchitecture: all\nDepends:\n powa-web,\n postgresql-common,\n ${misc:Depends},\nDescription: PostgreSQL dashboard -- PoWA integration\n The Elephant Shed is a web-based PostgreSQL management front-end.\n .\n This package provides the integration with PoWA.\n\nPackage: elephant-shed-prometheus\nArchitecture: all\nDepends:\n prometheus (>= 2.0),\n ${misc:Depends},\nDescription: PostgreSQL dashboard -- Prometheus integration\n The Elephant Shed is a web-based PostgreSQL management front-end.\n .\n This package provides the integration with Prometheus.\n\nPackage: elephant-shed-prometheus-node-exporter\nArchitecture: all\nDepends:\n prometheus-node-exporter (>= 0.16.0),\n ${misc:Depends},\nBreaks: elephant-shed-prometheus (<< 1.1)\nReplaces: elephant-shed-prometheus (<< 1.1)\nDescription: PostgreSQL dashboard -- Node exporter integration\n The Elephant Shed is a web-based PostgreSQL management front-end.\n .\n This package provides the integration with the Prometheus node\n exporter.\n\nPackage: elephant-shed-prometheus-sql-exporter\nArchitecture: all\nDepends:\n libyaml-perl,\n postgresql-common,\n prometheus-sql-exporter,\n ${misc:Depends},\nBreaks: elephant-shed-prometheus (<< 1.1)\nReplaces: elephant-shed-prometheus (<< 1.1)\nDescription: PostgreSQL dashboard -- SQL exporter integration\n The Elephant Shed is a web-based PostgreSQL management front-end.\n .\n This package provides the integration with the Prometheus SQL\n exporter.\n\nPackage: elephant-shed-cockpit\nArchitecture: all\nDepends:\n cockpit,\n ${misc:Depends},\nRecommends:\n cockpit-packagekit,\nDescription: PostgreSQL dashboard -- cockpit integration\n The Elephant Shed is a web-based PostgreSQL management front-end.\n .\n This package provides the integration with cockpit.\n\nPackage: elephant-shed-shellinabox\nArchitecture: all\nDepends:\n shellinabox,\n ${misc:Depends},\nDescription: PostgreSQL dashboard -- shellinabox integration\n The Elephant Shed is a web-based PostgreSQL management front-end.\n .\n This meta package provides the integration with shellinabox.\n\nPackage: elephant-shed-tmate\nArchitecture: all\nDepends:\n tmate ${tmate:Depends},\n ${misc:Depends},\nDescription: PostgreSQL dashboard -- tmate integration\n The Elephant Shed is a web-based PostgreSQL management front-end.\n .\n This package provides the integration with tmate.\n"
  },
  {
    "path": "debian/copyright",
    "content": "Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/\n\nFiles: *\nCopyright: (c) 2017-2019 credativ GmbH <info@credativ.de>\nLicense: GPL-3\n This program is free software: you can redistribute it and/or modify\n it under the terms of the GNU General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n .\n This program is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n GNU General Public License for more details.\n .\n On Debian systems, the complete text of the GNU General Public License\n can be found in `/usr/share/common-licenses/GPL-3'.\n"
  },
  {
    "path": "debian/elephant-shed-cockpit.install",
    "content": "cockpit/cockpit.conf etc/cockpit\ncockpit/port.conf etc/systemd/system/cockpit.socket.d\n"
  },
  {
    "path": "debian/elephant-shed-cockpit.postinst",
    "content": "#!/bin/sh\n\nset -e\n\ncase $1 in\n  configure)\n    systemctl daemon-reload\n    # not restarting cockpit here, it is socket-activated\n\n    if [ -z \"$2\" ]; then\n      /usr/lib/cockpit/cockpit-certificate-ensure\n    fi\n\n    systemctl restart cockpit.socket\n    ;;\nesac\n\n#DEBHELPER#\n"
  },
  {
    "path": "debian/elephant-shed-grafana.install",
    "content": "grafana/datasource_prometheus.yml etc/grafana/provisioning/datasources\ngrafana/elephant-shed-grafana etc/default\ngrafana/elephant-shed-grafana.conf etc/systemd/system/grafana-server.service.d\ngrafana/elephant-shed-grafana.ini etc/grafana\ngrafana/postgresql_server_overview.json usr/share/elephant-shed/grafana\ngrafana/postgresql_server_overview.yml etc/grafana/provisioning/dashboards\ngrafana/node_overview.json usr/share/elephant-shed/grafana\ngrafana/node_overview.yml etc/grafana/provisioning/dashboards\n"
  },
  {
    "path": "debian/elephant-shed-grafana.postinst",
    "content": "#!/bin/sh\n\nset -eu\n\ncase $1 in\n  configure)\n    # we depend on grafana and it has to be enabled\n    # lintian wants us to use \"deb-systemd-helper enable\" instead, but that\n    # doesn't work with grafana-server.service being located in /usr/systemd/system\n    systemctl enable grafana-server\n    invoke-rc.d grafana-server restart\n    ;;\nesac\n\n#DEBHELPER#\n"
  },
  {
    "path": "debian/elephant-shed-omnidb.install",
    "content": "omnidb/wsgi.py /usr/share/elephant-shed/omnidb\n"
  },
  {
    "path": "debian/elephant-shed-omnidb.postinst",
    "content": "#!/bin/sh\n\nset -eu\n\ncase $1 in\n  configure)\n    echo Starting omnidb-server once to initialize /var/lib/omnidb/.omnidb/omnidb-server/ ...\n    systemctl start omnidb-server\n    sleep 5\n    systemctl stop omnidb-server\n    systemctl disable omnidb-server\n    ;;\nesac\n\n#DEBHELPER#\n"
  },
  {
    "path": "debian/elephant-shed-pgbackrest.install",
    "content": "pgbackrest/pgbackrest-run\t\t\t\tusr/share/elephant-shed\npgbackrest/pgbackrest-toggle-archiving\t\t\tusr/share/elephant-shed\npgbackrest/pgbackrest-archivecommand\t\t\tusr/share/elephant-shed\npgbackrest/pgbackrest@.service\t\t\t\tlib/systemd/system\npgbackrest/pgbackrest-incr@.service\t\t\tlib/systemd/system\npgbackrest/pgbackrest-toggle-archiving@.service\tlib/systemd/system\npgbackrest/pgbackrest@.timer\t\t\t\tlib/systemd/system\npgbackrest/pgbackrest-incr@.timer\t\t\tlib/systemd/system\n"
  },
  {
    "path": "debian/elephant-shed-pgbackrest.postinst",
    "content": "#!/bin/sh\n\nset -eu\n\nBACKUPDIR=\"/var/lib/pgbackrest\"\n\ncase $1 in\n  configure)\n    if ! test -e /etc/pgbackrest.conf; then\n      cat > /etc/pgbackrest.conf <<-EOF\n\t[global]\n\trepo-path=$BACKUPDIR\n\tretention-full=3\n\t\n\tEOF\n    fi\n\n    if ! test -d /var/www/html/pgbackrest; then\n      mkdir -p /var/www/html/pgbackrest\n      chown postgres:postgres /var/www/html/pgbackrest\n    fi\n\n    if ! test -d $BACKUPDIR; then\n      mkdir -p $BACKUPDIR\n      chown postgres:postgres $BACKUPDIR\n    fi\n    ;;\nesac\n\n#DEBHELPER#\n"
  },
  {
    "path": "debian/elephant-shed-pgbadger.dirs",
    "content": "var/lib/pgbadger\n"
  },
  {
    "path": "debian/elephant-shed-pgbadger.install",
    "content": "pgbadger/pgbadger-generator lib/systemd/system-generators\npgbadger/pgbadger-run       usr/share/elephant-shed\npgbadger/pgbadger.service   lib/systemd/system\npgbadger/pgbadger.timer     lib/systemd/system\npgbadger/pgbadger@.service  lib/systemd/system\n"
  },
  {
    "path": "debian/elephant-shed-pgbadger.postinst",
    "content": "#!/bin/sh\n\nset -eu\n\ncase $1 in\n  configure)\n    if test -d /var/lib/pgbadger; then\n      chown postgres:postgres /var/lib/pgbadger\n    fi\n    ;;\n\n  purge)\n    rm -rf /var/lib/pgbadger\n    ;;\nesac\n\n#DEBHELPER#\n"
  },
  {
    "path": "debian/elephant-shed-portal.install",
    "content": "doc/_build/html usr/share/elephant-shed/doc\nportal/cgi-bin usr/lib\nportal/elephant-shed.conf etc/apache2/sites-available\nportal/image usr/share/elephant-shed\nportal/template usr/share/elephant-shed\nportal/static usr/share/elephant-shed\n"
  },
  {
    "path": "debian/elephant-shed-portal.lintian-overrides",
    "content": "elephant-shed-portal: extra-license-file usr/share/doc/elephant-shed-portal/html/_sources/chapter/license.md.txt\n"
  },
  {
    "path": "debian/elephant-shed-portal.postinst",
    "content": "#!/bin/sh\n\nset -eu\n\ncase $1 in\n  configure)\n    # create elephant-shed group\n    addgroup --system elephant-shed\n\n    # enable apache modules\n    for module in xml2enc proxy proxy_http proxy_html proxy_connect proxy_wstunnel rewrite deflate headers ssl cgid substitute; do\n      a2enmod --maintmode $module\n    done\n\n    # enable site\n    a2dissite 000-default\n    a2ensite elephant-shed\n\n    # restart apache\n    invoke-rc.d apache2 restart\n    ;;\n\n  remove)\n    # disable site\n    a2dissite elephant-shed\n    ;;\n\nesac\n\n#DEBHELPER#\n"
  },
  {
    "path": "debian/elephant-shed-postgresql.install",
    "content": "postgresql/elephant-shed.conf etc/postgresql-common/createcluster.d\npostgresql/es_ctlcluster usr/bin\npostgresql/rsyslog-postgresql-discard.conf etc/rsyslog.d/postgresql-discard.conf\n"
  },
  {
    "path": "debian/elephant-shed-postgresql.postinst",
    "content": "#!/bin/sh\n\nset -e\n\ncase $1 in\n  configure)\n    # make sure postgres is in the shadow group\n    if ! id -Gn postgres | grep -qw shadow; then\n      adduser $quiet postgres shadow\n      invoke-rc.d postgresql restart\n    fi\n\n    # We deploy a rsyslog rule.\n    invoke-rc.d rsyslog restart\n\n    # Remove old config file diversion\n    if dpkg --compare-versions \"$2\" lt-nl \"1.2.1\"; then\n      SHA1SUM=\"$(sha1sum /etc/logrotate.d/postgresql-common 2> /dev/null || :)\"\n      if [ \"${SHA1SUM%% *}\" = \"6c4c0af32cf873a7050650d0ac85403410714ae7\" ]; then\n        rm -fv /etc/logrotate.d/postgresql-common\n      fi\n      dpkg-divert --package elephant-shed-postgresql --rename \\\n        --divert /etc/logrotate.d/postgresql-common.real.disabled \\\n        --remove /etc/logrotate.d/postgresql-common\n    fi\n\n    ;;\nesac\n\n#DEBHELPER#\n"
  },
  {
    "path": "debian/elephant-shed-powa.install",
    "content": "powa/update-powa-web-config usr/bin\n"
  },
  {
    "path": "debian/elephant-shed-powa.postinst",
    "content": "#!/bin/sh\n\nset -eu\n\ncase $1 in\n  configure)\n    update-powa-web-config\n    systemctl restart powa-web\n    ;;\nesac\n\n#DEBHELPER#\n"
  },
  {
    "path": "debian/elephant-shed-prometheus-node-exporter.install",
    "content": "node-exporter/elephant-shed-prometheus-node-exporter etc/default\nnode-exporter/elephant-shed-prometheus-node-exporter.conf etc/systemd/system/prometheus-node-exporter.service.d\n"
  },
  {
    "path": "debian/elephant-shed-prometheus-node-exporter.mainscript",
    "content": "mv_conffile /etc/default/elephant-shed-prometheus-node-exporter /etc/default/elephant-shed-prometheus-node-exporter 1.1~ elephant-shed-prometheus\nmv_conffile /etc/systemd/system/prometheus-node-exporter.service.d/elephant-shed-prometheus-node-exporter.conf /etc/systemd/system/prometheus-node-exporter.service.d/elephant-shed-prometheus-node-exporter.conf 1.1~ elephant-shed-prometheus"
  },
  {
    "path": "debian/elephant-shed-prometheus-node-exporter.postinst",
    "content": "#!/bin/sh\n\nset -e\n\nHOSTNAME=`hostname -f`\n\ncase $1 in\n  configure)\n    systemctl daemon-reload\n\n    deb-systemd-helper enable prometheus-node-exporter.service\n    deb-systemd-invoke restart prometheus-node-exporter\n\n    if [ ! -e /etc/prometheus/node_exporter/$HOSTNAME.yml ]; then\n      mkdir -p /etc/prometheus/node_exporter\n      echo \"- targets:\" > /etc/prometheus/node_exporter/$HOSTNAME.yml\n      echo \"    - $HOSTNAME:9100\" >> /etc/prometheus/node_exporter/$HOSTNAME.yml\n    fi\n    ;;\nesac\n\n#DEBHELPER#\n"
  },
  {
    "path": "debian/elephant-shed-prometheus-sql-exporter.install",
    "content": "sql-exporter/elephant-shed.conf lib/systemd/system/prometheus-sql-exporter.service.d\nsql-exporter/prometheus-sql-exporter-restart.service lib/systemd/system\nsql-exporter/prometheus-sql-exporter-restart.timer lib/systemd/system\nsql-exporter/update-prometheus-sql-exporter-config usr/bin\nsql-exporter/*.yml etc/prometheus-sql-exporter\n"
  },
  {
    "path": "debian/elephant-shed-prometheus-sql-exporter.lintian-overrides",
    "content": "# use systemctl directly because deb-systemd-invoke doesn't like static units\nelephant-shed-prometheus-sql-exporter: maintainer-script-calls-systemctl\n"
  },
  {
    "path": "debian/elephant-shed-prometheus-sql-exporter.maintscript",
    "content": "mv_conffile /etc/prometheus-sql-exporter.yml.in /etc/prometheus-sql-exporter.yml.in 1.1~ elephant-shed-prometheus\n"
  },
  {
    "path": "debian/elephant-shed-prometheus-sql-exporter.postinst",
    "content": "#!/bin/sh\n\nset -e\n\nHOSTNAME=$(hostname -f)\n\ncase $1 in\n  configure)\n    systemctl daemon-reload\n\n    systemctl enable prometheus-sql-exporter.service\n    systemctl restart prometheus-sql-exporter.service\n    systemctl enable prometheus-sql-exporter-restart.timer\n    systemctl start prometheus-sql-exporter-restart.timer\n\n    if [ ! -e /etc/prometheus/sql_exporter/$HOSTNAME.yml ]; then\n      mkdir -p /etc/prometheus/sql_exporter\n      echo \"- targets:\" > /etc/prometheus/sql_exporter/$HOSTNAME.yml\n      echo \"    - $HOSTNAME:9237\" >> /etc/prometheus/sql_exporter/$HOSTNAME.yml\n    fi\n    ;;\nesac\n\n#DEBHELPER#\n"
  },
  {
    "path": "debian/elephant-shed-prometheus-sql-exporter.postrm",
    "content": "#!/bin/sh\n\nset -e\n\ncase $1 in\n  purge)\n    rm -f /var/run/postgresql/prometheus-sql-exporter.yml\n    # old file location\n    rm -f /etc/prometheus-sql-exporter.yml\n    ;;\nesac\n\n#DEBHELPER#\n"
  },
  {
    "path": "debian/elephant-shed-prometheus.install",
    "content": "prometheus/elephant-shed-prometheus etc/default\nprometheus/elephant-shed-prometheus.conf etc/systemd/system/prometheus.service.d\nprometheus/elephant-shed-prometheus.yml etc/prometheus\n"
  },
  {
    "path": "debian/elephant-shed-prometheus.postinst",
    "content": "#!/bin/sh\n\nset -e\n\ncase $1 in\n  configure)\n    systemctl daemon-reload\n\n    deb-systemd-helper enable prometheus.service\n    deb-systemd-invoke restart prometheus\n    ;;\nesac\n\n#DEBHELPER#\n"
  },
  {
    "path": "debian/elephant-shed-shellinabox.postinst",
    "content": "#!/bin/sh\n\nset -eu\n\ncase $1 in\n  configure)\n    if ! grep -q '^SHELLINABOX_ARGS.*--localhost-only' /etc/default/shellinabox; then\n      sed -i -e 's/^SHELLINABOX_ARGS.*/SHELLINABOX_ARGS=\"--no-beep --localhost-only\"/' /etc/default/shellinabox\n      invoke-rc.d shellinabox restart\n    fi\n    ;;\nesac\n\n#DEBHELPER#\n"
  },
  {
    "path": "debian/elephant-shed-tmate.install",
    "content": "tmate/tmate.conf etc\n"
  },
  {
    "path": "debian/elephant-shed-tmate.lintian-overrides",
    "content": "# symlinks in /etc/skel are copied over to home directories, so must be absolute\nelephant-shed-tmate: symlink-should-be-relative etc/skel/.tmate.conf /etc/tmate.conf\n"
  },
  {
    "path": "debian/elephant-shed-tmate.postinst",
    "content": "#!/bin/sh\n\nset -eu\n\ncase $1 in\n  configure)\n    if ! test -e /root/.tmate.conf; then\n      ln -s /etc/tmate.conf /root/.tmate.conf\n    fi\n    ;;\nesac\n\n#DEBHELPER#\n"
  },
  {
    "path": "debian/rules",
    "content": "#!/usr/bin/make -f\n\nTMATE_VERSION = $(shell dpkg-query --showformat '$${Version}' --show tmate)\nTMATE_24 = $(shell dpkg --compare-versions $(TMATE_VERSION) ge 2.4 && echo yes)\nifeq ($(TMATE_24),yes)\n\tTMATE_DEPENDS = (>= 2.4)\nelse\n\tTMATE_DEPENDS = (<< 2.4)\nendif\n\n# when building for packages.credativ.com (from ci/rebuild.sh), add dependency on credativ-postgresql-keyring\nifneq ($(findstring deb, $(shell dpkg-parsechangelog -SVersion))$(findstring ubuntu, $(shell dpkg-parsechangelog -SVersion)),)\n\tCREDATIV_KEYRING=-Vkeyring:Depends=credativ-postgresql-keyring\nendif\n\n%:\n\tdh $@ --with=systemd\n\noverride_dh_install:\n\tdh_install\nifneq ($(TMATE_24),yes)\n\tsed -i -e 's/^\\(set.*fingerprint.*\\)/##\\1/' debian/elephant-shed-tmate/etc/tmate.conf\n\tsed -i -e 's/^#\\(set.*fingerprint.*\\)/\\1/' debian/elephant-shed-tmate/etc/tmate.conf\nendif\nifneq ($(filter stretch,$(DEB_BUILD_PROFILES)),)\n\tsed -i -e '/WSGI/d' debian/elephant-shed-portal/etc/apache2/sites-available/elephant-shed.conf\nendif\n\noverride_dh_link:\n\tmkdir -p debian/elephant-shed-tmate/etc/skel\n\tln -s /etc/tmate.conf debian/elephant-shed-tmate/etc/skel/.tmate.conf\n\tdh_link -X'tmate.conf' # don't fix /etc/skel link\n\noverride_dh_gencontrol:\n\tdh_gencontrol -- -Vtmate:Depends='$(TMATE_DEPENDS)' $(CREDATIV_KEYRING)\n"
  },
  {
    "path": "debian/source/format",
    "content": "3.0 (native)\n"
  },
  {
    "path": "doc/.gitignore",
    "content": "_build\n"
  },
  {
    "path": "doc/Makefile",
    "content": "# Makefile for Sphinx documentation\n#\n\n# You can set these variables from the command line.\nSPHINXOPTS    =\nSPHINXBUILD   = sphinx-build\nPAPER         =\nBUILDDIR      = _build\n\n# Internal variables.\nPAPEROPT_a4     = -D latex_paper_size=a4\nPAPEROPT_letter = -D latex_paper_size=letter\nALLSPHINXOPTS   = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .\n# the i18n builder cannot share the environment and doctrees with the others\nI18NSPHINXOPTS  = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .\n\n.PHONY: help\nhelp:\n\t@echo \"Please use \\`make <target>' where <target> is one of\"\n\t@echo \"  html       to make standalone HTML files\"\n\t@echo \"  dirhtml    to make HTML files named index.html in directories\"\n\t@echo \"  singlehtml to make a single large HTML file\"\n\t@echo \"  pickle     to make pickle files\"\n\t@echo \"  json       to make JSON files\"\n\t@echo \"  htmlhelp   to make HTML files and a HTML help project\"\n\t@echo \"  qthelp     to make HTML files and a qthelp project\"\n\t@echo \"  applehelp  to make an Apple Help Book\"\n\t@echo \"  devhelp    to make HTML files and a Devhelp project\"\n\t@echo \"  epub       to make an epub\"\n\t@echo \"  epub3      to make an epub3\"\n\t@echo \"  latex      to make LaTeX files, you can set PAPER=a4 or PAPER=letter\"\n\t@echo \"  latexpdf   to make LaTeX files and run them through pdflatex\"\n\t@echo \"  latexpdfja to make LaTeX files and run them through platex/dvipdfmx\"\n\t@echo \"  text       to make text files\"\n\t@echo \"  man        to make manual pages\"\n\t@echo \"  texinfo    to make Texinfo files\"\n\t@echo \"  info       to make Texinfo files and run them through makeinfo\"\n\t@echo \"  gettext    to make PO message catalogs\"\n\t@echo \"  changes    to make an overview of all changed/added/deprecated items\"\n\t@echo \"  xml        to make Docutils-native XML files\"\n\t@echo \"  pseudoxml  to make pseudoxml-XML files for display purposes\"\n\t@echo \"  linkcheck  to check all external links for integrity\"\n\t@echo \"  doctest    to run all doctests embedded in the documentation (if enabled)\"\n\t@echo \"  coverage   to run coverage check of the documentation (if enabled)\"\n\t@echo \"  dummy      to check syntax errors of document sources\"\n\n.PHONY: clean\nclean:\n\trm -rf $(BUILDDIR)/*\n\n.PHONY: html\nhtml:\n\t$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html\n\t@echo\n\t@echo \"Build finished. The HTML pages are in $(BUILDDIR)/html.\"\n\n.PHONY: dirhtml\ndirhtml:\n\t$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml\n\t@echo\n\t@echo \"Build finished. The HTML pages are in $(BUILDDIR)/dirhtml.\"\n\n.PHONY: singlehtml\nsinglehtml:\n\t$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml\n\t@echo\n\t@echo \"Build finished. The HTML page is in $(BUILDDIR)/singlehtml.\"\n\n.PHONY: pickle\npickle:\n\t$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle\n\t@echo\n\t@echo \"Build finished; now you can process the pickle files.\"\n\n.PHONY: json\njson:\n\t$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json\n\t@echo\n\t@echo \"Build finished; now you can process the JSON files.\"\n\n.PHONY: htmlhelp\nhtmlhelp:\n\t$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp\n\t@echo\n\t@echo \"Build finished; now you can run HTML Help Workshop with the\" \\\n\t      \".hhp project file in $(BUILDDIR)/htmlhelp.\"\n\n.PHONY: qthelp\nqthelp:\n\t$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp\n\t@echo\n\t@echo \"Build finished; now you can run \"qcollectiongenerator\" with the\" \\\n\t      \".qhcp project file in $(BUILDDIR)/qthelp, like this:\"\n\t@echo \"# qcollectiongenerator $(BUILDDIR)/qthelp/elephant-shed.qhcp\"\n\t@echo \"To view the help file:\"\n\t@echo \"# assistant -collectionFile $(BUILDDIR)/qthelp/elephant-shed.qhc\"\n\n.PHONY: applehelp\napplehelp:\n\t$(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp\n\t@echo\n\t@echo \"Build finished. The help book is in $(BUILDDIR)/applehelp.\"\n\t@echo \"N.B. You won't be able to view it unless you put it in\" \\\n\t      \"~/Library/Documentation/Help or install it in your application\" \\\n\t      \"bundle.\"\n\n.PHONY: devhelp\ndevhelp:\n\t$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp\n\t@echo\n\t@echo \"Build finished.\"\n\t@echo \"To view the help file:\"\n\t@echo \"# mkdir -p $$HOME/.local/share/devhelp/elephant-shed\"\n\t@echo \"# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/elephant-shed\"\n\t@echo \"# devhelp\"\n\n.PHONY: epub\nepub:\n\t$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub\n\t@echo\n\t@echo \"Build finished. The epub file is in $(BUILDDIR)/epub.\"\n\n.PHONY: epub3\nepub3:\n\t$(SPHINXBUILD) -b epub3 $(ALLSPHINXOPTS) $(BUILDDIR)/epub3\n\t@echo\n\t@echo \"Build finished. The epub3 file is in $(BUILDDIR)/epub3.\"\n\n.PHONY: latex\nlatex:\n\t$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex\n\t@echo\n\t@echo \"Build finished; the LaTeX files are in $(BUILDDIR)/latex.\"\n\t@echo \"Run \\`make' in that directory to run these through (pdf)latex\" \\\n\t      \"(use \\`make latexpdf' here to do that automatically).\"\n\n.PHONY: latexpdf\nlatexpdf:\n\t$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex\n\t@echo \"Running LaTeX files through pdflatex...\"\n\t$(MAKE) -C $(BUILDDIR)/latex all-pdf\n\t@echo \"pdflatex finished; the PDF files are in $(BUILDDIR)/latex.\"\n\n.PHONY: latexpdfja\nlatexpdfja:\n\t$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex\n\t@echo \"Running LaTeX files through platex and dvipdfmx...\"\n\t$(MAKE) -C $(BUILDDIR)/latex all-pdf-ja\n\t@echo \"pdflatex finished; the PDF files are in $(BUILDDIR)/latex.\"\n\n.PHONY: text\ntext:\n\t$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text\n\t@echo\n\t@echo \"Build finished. The text files are in $(BUILDDIR)/text.\"\n\n.PHONY: man\nman:\n\t$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man\n\t@echo\n\t@echo \"Build finished. The manual pages are in $(BUILDDIR)/man.\"\n\n.PHONY: texinfo\ntexinfo:\n\t$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo\n\t@echo\n\t@echo \"Build finished. The Texinfo files are in $(BUILDDIR)/texinfo.\"\n\t@echo \"Run \\`make' in that directory to run these through makeinfo\" \\\n\t      \"(use \\`make info' here to do that automatically).\"\n\n.PHONY: info\ninfo:\n\t$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo\n\t@echo \"Running Texinfo files through makeinfo...\"\n\tmake -C $(BUILDDIR)/texinfo info\n\t@echo \"makeinfo finished; the Info files are in $(BUILDDIR)/texinfo.\"\n\n.PHONY: gettext\ngettext:\n\t$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale\n\t@echo\n\t@echo \"Build finished. The message catalogs are in $(BUILDDIR)/locale.\"\n\n.PHONY: changes\nchanges:\n\t$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes\n\t@echo\n\t@echo \"The overview file is in $(BUILDDIR)/changes.\"\n\n.PHONY: linkcheck\nlinkcheck:\n\t$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck\n\t@echo\n\t@echo \"Link check complete; look for any errors in the above output \" \\\n\t      \"or in $(BUILDDIR)/linkcheck/output.txt.\"\n\n.PHONY: doctest\ndoctest:\n\t$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest\n\t@echo \"Testing of doctests in the sources finished, look at the \" \\\n\t      \"results in $(BUILDDIR)/doctest/output.txt.\"\n\n.PHONY: coverage\ncoverage:\n\t$(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage\n\t@echo \"Testing of coverage in the sources finished, look at the \" \\\n\t      \"results in $(BUILDDIR)/coverage/python.txt.\"\n\n.PHONY: xml\nxml:\n\t$(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml\n\t@echo\n\t@echo \"Build finished. The XML files are in $(BUILDDIR)/xml.\"\n\n.PHONY: pseudoxml\npseudoxml:\n\t$(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml\n\t@echo\n\t@echo \"Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml.\"\n\n.PHONY: dummy\ndummy:\n\t$(SPHINXBUILD) -b dummy $(ALLSPHINXOPTS) $(BUILDDIR)/dummy\n\t@echo\n\t@echo \"Build finished. Dummy builder generates no files.\"\n"
  },
  {
    "path": "doc/chapter/components.md",
    "content": "# Components\n\n## PostgreSQL\n\nThe Elephant Shed is based on `postgresql-common`, the default PostgreSQL\nmanagement system for Debian based installations. Tasks like creating, dropping\nor renaming a PostgreSQL instance (\"cluster\" in PostgreSQL terms) should be\ndone through `postgresql-common`'s command line utilities `pg_createcluster`,\n`pg_dropcluster` and `pg_renamecluster`.\n\n### Default Configuration\n\nBeside the postgresql-common default configuration the\n`elephant-shed-postgresql` package adds additional parameters for the cluster\ncreation process. Some of these parameters are required by the\nElephant Shed components. E.g. pgBadger requires some special\n`log_line_prefix`. You can find this configuration under\n`/etc/postgresql-common/createcluster.d/elephant-shed.conf`. Be\ncareful when changing any of these values.\n\n### Cluster Administration\n\nTo create a new cluster issue the command `pg_createcluster <version> <name>`.\nInstalled clusters and their status can be listed via\n`pg_lsclusters`.\n\n```\npostgres@stretch:~$ pg_lsclusters\nVer Cluster  Port Status          Owner    Data directory  Log file\n9.6 main     5432 online          postgres /9.6/main       /log/9.6-main.log\n9.6 standby1 5433 online,recovery postgres /9.6/standby1   /log/9.6-standby1.log\n9.6 standby2 5434 online,recovery postgres /9.6/standby2   /log/9.6-standby2.log\n9.6 test     5435 online          postgres /9.6/test       /log/9.6-test.log\n```\n\nTo delete a cluster use `pg_dropcluster <version>\n<name>` (be careful, this removes all data in the cluster as well!).\n\nTo start, stop, restart or reload use `pg_ctlcluster <action> <version>\n<name>` with the following commands as action:\n  - `start`\n  - `stop`\n  - `restart`\n  - `reload`\n\nAlternatively, you can use systemctl (`systemctl <action>\npostgresql@<version>-<name>`) or the Cockpit web interface.\n\n![Figure: Cockpit Cluster Service](images/cockpit_postgresql_service.png)\n\n*Note:* Future versions of The Elephant Shed will include cluster management in the [portal](#portal).\n\n## Portal\n\nThe portal serves as an entry point to all other web-based\ninterfaces. It uses HTTPS and basic authentication. Each user\nwithin the Unix group `elephant-shed` has access to it (see [Users](#users)).\n\nThe portal also shows the status of all\nPostgreSQL cluster including links to the Cockpit service (in order to start or\nstop the cluster), the log files, pgBadger reports and the backup software pgBackRest.\n\nA navigation bar at the top allows switching between the different web\nservices.\n\nBy default only a self signed certificate for HTTPS is deployed. A\ncorresponding security warning is shown in most browsers. You can change the\ncertificate with a signed one (e.g. from your company CA, or from [Let’s Encrypt](https://letsencrypt.org/)).\nThe web services are served by Apache2. It also acts as a reverse proxy to serve all other web interfaces and to enforce authentication.\n\n### PostgreSQL Cluster\n\n![Figure: PostgreSQL Cluster](images/portal_cluster_list.png)\n\nThis section presents an overview of the existing PostgreSQL clusters and their status.\nFor each cluster, a set of switches shows the current status.\nBy clicking on a cluster an additional menu with buttons opens.\nCurrently all buttons link to the corresponding components where a confirmation is required so no actions are triggered directly, but this may change in the future.\n\n### systemd - Service\n\nThis links to the configuration of this PostgreSQL cluster in Cockpit.\nHere it is possible to configure the corresponding service to be enabled or disabled on system start and also trigger actions like start, stop and reload.\n\n### systemd - Log\n\nLinks to the corresponding log entries in Cockpit if syslog is enabled for this cluster (which is the default for clusters created by Elephant Shed).\n\n### Report - Run\n\nBy default pgBadger reports for all clusters are generated once every night.\nWith this service it is possible to generate a report for a specific cluster on demand.\n\n### Report - Show\n\nLinks to the corresponding pgBadger report overview.\nSee [pgBadger](#reporting-pgbadger) for more information.\n\n### Backup\n\nThis sections provides several functions for backups using pgBackRest.\nFor more information about the backup tool pgBackRest visit [pgBackRest](#backup-pgbackrest).\n\n#### Full\n\nLink to Cockpit for starting an ad-hoc full backup.\n\n#### Incremental\n\nLink to Cockpit for staring an ad-hoc incremental backup.\n\n#### Info\n\nShows the status of the backups. This button is only shown after the first backup run.\nHere the available backups and the content of the WAL archive is shown.\n\nAdditional information can be found here: <http://www.pgbackrest.org/user-guide.html#quickstart/backup-info>\n\n### Switches\n\n#### Archiving\n\nThis switch shows if an archive command is set that uses pgBackRest.\nIt is possible to set one or to deactivate the feature by using '/bin/true'.\nArchiving is needed for point in time recovery but more importantly for pgBackRest backups.\nArchiving will be activated automatic if a backup is triggered via the portal or timers.\n\nTo change it manually the service `pgbackrest-toggle-archiving@<version>-<name>.service` can be started.\nThis toggles the state.\n\n#### Full Backup\n\nSwitch to enable or disable a periodical backup.\nAn enabled backup job (systemd timer) is shown by green color.\nTo start/stop the timer `pgbackrest@<version>-<name>.timer` needs to be started or stopped.\nEnable/disable is used to enable/disable the timer after the next reboot.\n\n#### Incr Backup\n\nSwitch to enable or disable a periodical backup.\nAn enabled backup job (systemd timer) is shown by green color.\nTo start/stop the timer `pgbackrest-incr@<version>-<name>.timer` needs to be started or stopped.\nEnable/disable is used to enable/disable the timer after the next reboot.\n\n## Service Web Interface - Cockpit\n\nCockpit allows remote management of all systemd related services via\nHTTPS. It makes starting, stopping or restarting of services as simple as\nclicking a button. It also shows system logs in real-time.\n\n![Figure: Cockpit Package Updates](images/cockpit_package_updates.png)\n\n## Monitoring - Prometheus\n\nPrometheus is a metric based monitoring system for servers and services.\nIt collects metrics from configured targets at given intervals, evaluates rule expressions, displays the results, and can trigger alerts if some condition is observed to be true.\n\n![Figure: Prometheus graphing the load](images/prometheus-load.png)\n\n![Figure: Prometheus targets](images/prometheus-targets.png)\n\n### Services\n\nIn this setup the Prometheus stack consists of different components controlled by systemd.\nThe following units are deployed.\n\n#### prometheus.service\n\nMonitoring system and time series database - This is the monitoring service itself. It actively pulls the metrics from the different sources.\nIt also provides internal metrics and a web interface which is accessible via the portal.\n\nConfiguration files:\n\n* `/etc/prometheus/elephant-shed-prometheus.yml`\n* `/etc/default/elephant-shed-prometheus`\n\n#### prometheus-node-exporter.service\n\nPrometheus exporter for machine metrics - This service exports the system metrics and listens on port 9100.\nThese metrics are collected every 30 seconds by default.\n\nConfiguration files:\n\n* `/etc/default/elephant-shed-prometheus-node-exporter`\n\n#### prometheus-sql-exporter.service\n\nPrometheus exporter for SQL metrics - This service collects the PostgreSQL specific metrics and listens on port 9237.\nThe metrics are retrieved by querying the database.\nIn order to not to generate additional load the metrics are collected only every 60 seconds.\n\n**WARNING: It is not advisable to set the monitoring interval for the `prometheus-sql-exporter` lower than 60 Seconds.\nThis could interference with normal applications and has a high impact on the PostgreSQL cluster.**\n\nThe `prometheus-sql-exporter.service` starts one connection to each database on startup and keeps this connection open.\nAt the beginning of each connection the `prometheus-sql-exporter.service` checks if the extension `pg_stat_statements` is present.\nIf not, the service issues the statement `CREATE EXTENSION pg_stat_statements`.\n\nConfiguration files:\n\n* `/etc/prometheus-sql-exporter.yml`\n\n#### update-prometheus-sql-exporter-config.timer\n\nThis timer triggers the `update-prometheus-sql-exporter-config.service` periodically which generates a new configuration for the `prometheus-sql-exporter` every 10 minutes.\nThis makes sure that every new database cluster and every new database is included in the monitoring automatically.\nIt's possible to call the update-prometheus-sql-exporter-config.service manually to generate a new configuration directly.\n\nConfiguration template file:\n\n* `prometheus-sql-exporter.yml.in`\n\nConfiguration file (runtime):\n\n* `prometheus-sql-exporter.yml`\n\n### Additional Resources\n\n* <https://prometheus.io/docs/introduction/overview/>\n* <https://github.com/prometheus/prometheus>\n\n## Dashboard - Grafana\n\nGrafana is a tool to create graphs and dashboards from a variety of different data sources.\nA PostgreSQL Server Overview dashboards is included in the default installation\nto get an overview over the most needed and many helpful metrics to manage and\ndebug PostgreSQL servers.\n\nThese pre-deployed dashboards are shipped via the `elephant-shed-graphana` Debian package and can change in the future.\nThey are read only and need to be saved under a new name if you do any changes.\n\n### PostgreSQL Server Overview\n\n![Figure: Grafana - PostgreSQL Server Overview](images/grafana-overview.png)\n\nThis dashboard starts with a summary section with simple gauges to provide a overview of the whole system.\nThese gauges may indicate current problems or give a hint on problems that might occur in the future.\n\nAfter the gauges in-depth metrics are shown as graphs.\n\n### Server metrics\n\nServer metrics include e.g.: CPU usage (by type / by core), disk usage, disk utilization, network throughput, and much more.\nThe following template filter are configured:\n\n  - `Disk`: filter one or more disks\n  - `Interface`: filter on or more interface\n  - `Filesystem`: filter on or more filesystem / mountpoint\n\n### Cluster metrics\n\nThe next section contains PostgreSQL Cluster wide metrics like connections (by type / by database), number of transactions, database growth and more.\nOnly one cluster is shown by a time. To switch the current shown cluster use the template filter `PostgreSQL Cluster`.\n\n### Database metrics\n\nDatabase level metrics are shown at the end of *PostgreSQL Overview* dashboard.\nBy default metrics for all databases of the current selected PostgreSQL cluster are shown.\nTo filter one or more databases the template filter `Database` could be used.\n\n### Additional Resources\n\n* <http://docs.grafana.org/>\n* <https://github.com/grafana/grafana>\n\n## DBA Tool - OmniDB\n\n![Figure: OmniDB](images/omnidb.png)\n\nOmniDB is a management tool for PostgreSQL to help DBAs execute many different tasks.\nIt provides user management, DDL functionality, an interactive SQL shell, and more.\n\n### Additional Resources\n\n* <https://omnidb.org/>\n\n## PoWA - PostgreSQL Workload Analyzer\n\nThe Elephant Shed includes integration with PoWA, a service that collects\ndatabase metrics, most notably about running queries. There is some overlap\nwith Prometheus and Grafana, but the PoWA statistics are much more detailed on\nthe database level.\n\n### Setup\n\nThe PoWA web interface maintains a list of known clusters in the system in\n`/etc/powa-web.conf`. To update that list, use:\n\n```\nupdate-powa-web-config\n```\n\nTo enable PoWA monitoring for a cluster, run `es_ctlcluster`:\n\n```\nes_ctlcluster <postgresql_version> main enable-powa\n```\n\nIn case of problems, the web interface will throw \"Auth failed\" errors for a\nwide range of possible errors. Consulting the PostgreSQL server log in\n`/var/log/postgresql/postgresql-NN-main.log` is often a good place to start\ndebugging.\n\n## Backup - pgBackRest\n\nThe Elephant Shed comes with a preinstalled backup solution, *pgBackRest*.\nEach PostgreSQL instance can be backed up individually by issuing the command `systemctl start pgbackrest@<version>-<name>` or initiating a backup via Cockpit in the web interface.\nA shortcut is listed for each instance.\n\nConfiguration entries for each cluster are created with the first\nbackup run. By default only `db-path` and `db-port` are set.\n\nA list of all backups can be obtained by clicking on the pgBackRest\nicon on the portal site.\n\n![Figure: pgBackRest Backup via Cockpit](images/el-backrest-start.png)\n\npgBackRest knows 3 types of backups full, incremental and differential.\nWe are using full and differential by default.\nA service file for differential backups is not installed by default.\n\n### Full Backup\n\nFull backups represent an complete backup of the database at a given point in time.\nA backup consists of two parts, the backup itself, stored in `backup` and the WAL files which were written during the backup, stored in `archive`.\n\nTo ensure these WAL files are in the archive we automatically enable WAL archiving before the first backup is created.\n\n**Warning**: If archiving is enabled all WAL files newer than the oldest stored backups are kept as well.\nThis can consume a lot space in the backup location if backups are kept for a long time and archiving is not disabled.\nBy deleting a backup the no longer needed WAL files are removed as well.\n\n### Incremental Backups\nIncremental backups represent the changed data between a previous full backup and the current data at a given point.\nIncremental backups can be significant smaller than full backups but depend on a specific previous full backup.\nWithout this full backup they can not be restored.\n\n\n### Retention\n\nTo clean up space old backups needs to be deleted.\npgBackRest needs to know how many full backups to keep.\nIf the number is reached all additional backups will be deleted starting with the oldest.\nIf a full backup is deleted all incremental backups depending on it will be deleted as well.\nThis is necessary because an incremental backup can not be restored without the matching full backup.\n\n\n### Configuration\n\nThe configuration file can be found in `/etc/pgbackrest.conf`.\n\n```\n[global]\nrepo-path=/var/lib/pgbackrest\n\n[9.6-main]\ndb-path=/var/lib/postgresql/9.6/main\ndb-port=5432\n\n[9.6-test]\ndb-port=5433\ndb-path=/var/lib/postgresql/9.6/test\n```\n\nThe global part sets the default configuration for every existing and future database cluster.\nFor each single cluster theses defaults can be changed.\nSome basic options will be explained here.\nPlease see the documentation for a full overview.\n\nIf the server is setup using ansible, additionally the following `[global]` parameters are set:\n\n```\n[global]\nretention-full=4\ncompress-level=6\nspool-path=/mnt/backup/pgbackrest_spool\narchive-async=y\narchive-queue-max=1099511627776\nrepo-path=/mnt/backup/pgbackrest\n...\n```\n\n#### retention-full\nThis option defines how many full backups should be kept.\n\n**Danger: If more full backups are stored than `retention-full` pgBackRest will delete the oldest backups to keep exactly `retention-full` full backups!**\n\n#### compress-level\nThe gzip compression level to use (6 is the default value).\n\n#### archive-async\nEnables asynchronous archiving of WAL files which allows a higher archiving throughput.\n\n#### spool-path\nWhere to keep additional information for asynchronous archiving (status directory).\n\n#### archive-queue-max\nHow many WAL segments to keep before throwing segments away.\n*Note: We configure a value of 1TB to ensure pgbackrest never throws WAL segments away by default*\n\n#### repo-path\nThis sets the main directory where backups and WAL files are stored in.\nIt can be set to any desired mount point so backups to remote servers are easily possible.\n\n### Backup\n\nFor each cluster there is a systemd service which does a full or incremental backup.\n\n* pgbackrest@\\<version\\>-\\<name\\>\n* pgbackrest-incr@\\<version\\>-\\<name\\>\n\nTo create an ad-hoc backup the corresponding service can be started.\n`systemctl start pgbackrest@9.6-main` would create a full backup of the cluster `9.6-main`.\n\nIf no previous full backup is available `pgbackrest-incr@` will also create a full backup.\n\n### Automation\n\nTo automate the creation of backups and the retention policy enforcing there are two systemd timers per cluster.\n\n* pgbackrest@<version>-<name>.timer\n* pgbackrest-incr@<version>-<name>.timer\n\n`pgbackrest@<version>-<name>.timer` triggers full backups and `pgbackrest-incr@<version>-<name>.timer` triggers incremental backups.\n\nThese timers are created for every cluster and are initialized with a default timing.\nThe timers can be enabled independently for every database cluster either via systemd or the web portal.\nTo fully enable a timed backup the `timer` must be *started* **and** *enabled*.\nIf the `timer` is *started* but not *enabled* systemd will not start it after the next reboot.\n\nKeep in mind that enabling only the incremental backup is only reasonable for shorter periods of time, special scenarios like not changing databases, or if the full backups are triggered in another way.\nTo keep storage and restore time at an reasonable level periodic full backups are needed.\n\n#### pgbackrest@.timer\n\n```\n# /lib/systemd/system/pgbackrest@.timer\n[Unit]\nDescription=Automated pgBackRest full backup of PostgreSQL cluster %i\n\n[Timer]\nOnCalendar=Sun *-*-* 01:00:00\nRandomizedDelaySec=2h\n\n[Install]\nWantedBy=multi-user.target\n```\n\nThis timer triggers a full backup every Sunday in the early morning 01:00 or randomly up to 2 hours later.\nThe random delay set by `RandomizedDelaySec=2h` is set so systemd can schedule many timers over a given time range.\nHere it is done so that not all backups for all clusters start at the same time blocking the I/O.\n\n#### pgbackrest-incr@.timer\n\n```\n# /lib/systemd/system/pgbackrest-incr@.timer\n[Unit]\nDescription=Automated pgBackRest incremental backup of PostgreSQL cluster %i\n\n[Timer]\nOnCalendar=Tue,Thu *-*-* 01:00:00\nRandomizedDelaySec=2h\n\n[Install]\nWantedBy=multi-user.target\n```\n\nThis timer triggers an incremental backup every Tuesday and Thursday in the early morning 01:00 or randomly up to 2 hours later.\n\n#### WAL Archiving\n\nWAL archiving is disabled by default for new PostgreSQL clusters.\nIt can be activated using the portal (see [portal](#portal)) or by starting `pgbackrest-toggle-archving.service`.\nThe service toggles archiving mode to on or off, depending on the former state.\n\n*Note:* If archiving is disabled and a full or incremental backup is started (manual or via timer), archiving is automatically enabled.\nThis step is required to ensure all WAL files need for a restore are archived beside the basebackup.\n**Archiving is _not_ disabled after the backup run.**\n\n### Restore\n\n**Restore is an invasive action that can destroy data if not executed properly!**\n\nTo restore a backup there are two main methods full and delta.\n\n#### Full Restore\n\nA full restore restores a given backup (by default the latest) to the given (default) destination.\nThe restore command expects the target directory to be empty.\nThis can be used to setup a cluster on a new machine, small clusters or if most of the remaining data is incorrect.\n\nSteps to full restore.\n\n  1. Stop the cluster (if still running)\n  2. Delete or move all remaining data\n  3. Restore full content from backup\n\n*All steps should be run as user `postgres`*.\n\n```\n# 1. Stop the cluster\npg_ctlcluster <major version> <name> stop\n\n# 2. Delete or move all remaining data\nmv /var/lib/postgresql/<major version>/<name> /var/somewhere-save\nmkdir /var/lib/postgresql/<major version>/<name>\n\n# 3. Restore full content from backup\npgbackrest --stanza=<major version>-<name> restore\n```\n\nAfter this the cluster can be started again.\nIf there is enough storage available it should be preferred to move the data to a save place instead of deletion.\n\n#### Delta Restore\n\nA delta restore does not need a clean target and it only copies files that differ from backup.\nThis approach can be much faster especially if most of the underling files did not change since the last backup.\n\n**This has the potential to destroy data!**\nBecause this works on the cluster data it is possible to cause damage.\nData that is not in the backup / WAL archive but in the current cluster will be lost!\n\nSteps to perform a delta restore.\n\n  1. Stop the cluster (if still running)\n  2. Restore delta content from backup\n\n```\n# 1. Stop the cluster\npg_ctlcluster <major version> <name> stop\n\n# 2. Restore full content from backup\npgbackrest --stanza=<major version>-<name> --delta restore\n```\n\nAfter this the cluster can be started again.\n\n#### Point in Time Recovery\n\nThe shown backups methods do a full restore.\nThis means a all basebackup files and copied back from the archive and all WAL files are applied.\n\nIf another recovery target should be restored `--type` and `--target` must be specified.\nMost of the time one would like to restore a database to a given point in time (e.g. '2017-08-24 12:00:00').\nThis would require the switch `--type=time` and `--target='2017-08-24 12:00:00'`.\n\n```\npgbackrest --stanza=<major version>-<name> --type=time --target=\"<ISO timestamp>\" restore\n```\n\n### Additional Resources\n\n* <http://www.pgbackrest.org/user-guide.html>\n* <http://www.pgbackrest.org/command.html>\n* <http://www.pgbackrest.org/configuration.html>\n\n## Reporting - pgBadger\n\nA pgBadger service is created for each PostgreSQL\ninstance. Those services are autogenerated and updated each time a new\ncluster is created or dropped (systemd-generators).\n\nA pgBadger systemd timer ensures reports are updated on a regular basis.\nBy default this is every day at 23:00.\n\nEach pgBadger service parses the PostgreSQL log file of the\ncorresponding PostgreSQL instance. Generated reports are saved within\n`/var/lib/pgbadger/<version>-<name>` (e.g. `/var/lib/pgbadger/9.6-main/`).\n\nAll reports are accessible in the web interface.\nAn calendar provides access to daily and weekly reports.\n\nA manual update of those reports can be triggered either using the corresponding service (e.g. `pgbadger@9.6-main.service`) or using the [portal](#portal).\nA update of *all* reports could be triggered using the parent service `pgbadger.service`.\n\n*Note:* Changing postgresql.conf settings like `log_line_prefix` or\n`lc_messages` can lead to pgBadger reports not getting updated anymore.\n\n![Figure: pgBadger overview](images/pgbadger-overview.png)\n\n## Web Terminal - Shell In A Box\n\nShell In A Box is a convenient web based terminal. It can be used like a normal console connection.\nExplicit login and authentication is required.\nTo change settings (e.g. the color theme) just right click anywhere on the terminal window.\n\n### Additional Resources\n\n* <https://github.com/shellinabox/shellinabox>\n\n## Remote Control - tmate\n\ntmate is a fork of the popular terminal multiplexer tmux.\nIt is used to provide remote support if needed.\n\nIt is preconfigured to connect to a relay server (`tmate.credativ.com`) and enables the user to share the current terminal with a third party by sending an SSH command including a secret token.\n\nThere are two modes of operation, read-write and read-only.\nThis enables the user to give a third party temporary access to the current terminal.\nThe user can always watch the terminal and audit the actions taken by the third party.\n\n* tmate is not running by default, it needs to be started explicitly\n* When the initiating shell is closed, the connection is closed as well\n* The backend to use is fully configurable (in `/etc/tmate.conf`) and preset to `tmate.credativ.com`\n* tmate is included as a technical preview to evaluate the potential\n\n### Usage\n\nStart tmate (opens a new terminal)\n\n```\ntmate\n```\n\nShow the credentials which need to be given to a third party (securely)\n\n```\ntmate show-messages\n```\n\n![Figure: tmate with multiple panes](images/tmate.png)\n\nFor further usage see the following additional resources regarding tmux.\n\n### Additional Resources\n\n* <https://tmate.io/>\n* <https://man.openbsd.org/OpenBSD-current/man1/tmux.1>\n\n## Configuration Revision - etckeeper\n\netckeeper is a set of tools and hooks to keep all configuration in `/etc` in a git repository.\nCommits can be done manually or will happen automatically via time or by package manager hooks.\n\nConfiguration changes can be seen and compared to previous versions.\nIf necessary previous settings can be restored.\n\n#### Additional Resources\n\n* <https://etckeeper.branchable.com/>\n* <https://www.thomas-krenn.com/de/wiki/Etc-Verzeichnis_mit_etckeeper_versionieren>\n"
  },
  {
    "path": "doc/chapter/first-steps.md",
    "content": "# First Steps\n\nLog into your web browser and go to the server's IP address (e.g.\n<https://your-server/>). The default setup will redirect HTTP requests to\nHTTPS.\n\nThe Elephant Shed portal provides information about\nrunning PostgreSQL instances and their status. Moreover you get\naccess to all other installed components.\n\nThe server will ask you for your user credentials. Depending on the\ndeployment process the required user will differ. On a test\ninstallation (e.g. using Vagrant) the initial user is **admin** with\npassword **admin**. See also: [Users](users.md). All bundled components except\nfor OmniDB have been configured to use PAM authentication.\n\nOmniDB doesn't support PAM authentication yet. It has its own user\nmanagement system which is decoupled from all system users.\nThe default initial user is **admin** with **admin** as password.\n\n![Figure: Elephant Shed portal](images/el-portal.png)\n\nOn a new installation you will find one cluster running the current PostgreSQL major version with the name `main`.\n\nThe configuration for clusters can be found in `/etc/postgresql/<major version>/<name>/`.\n\nTo use PostgreSQL from external application servers only a few steps are needed.\n\n1. Open a shell connection to the server using SSH or shellinabox <https://your-server/shellinabox>.\n\n2. Switch to user `postgres` and launch psql:\n    * `sudo -u postgres psql`\n\n3. Create a database and corresponding application user, options:\n    * `psql: CREATE ROLE appuser1 WITH LOGIN PASSWORD 'testpass';`\n    * `psql: CREATE DATABASE appdb1 OWNER appuser1;`\n\n4. Allow external access for your application servers, your network or everyone. Configuration file: `/etc/postgresql/<major version>/<name>/pg_hba.conf`\n\n5. (optional) Make desired configuration changes and tuning. `/etc/postgresql/<major version>/<name>/postgresql.conf`\n\n6. Reload the configuration, options:\n    * Portal: Click on the button `Service` next to the cluster and choose \"Reload\" from the dropdown menu\n    * `psql`: `SELECT pg_reload_conf();`\n\n7. (optional) Configure a superuser to be able to use OmniDB <https://your-server/omnidb> or other management tools\n    * Create password for user postgres: `\\password`\n    * Create personalized superusers: `CREATE USER \"sosna\" SUPERUSER;`, `\\password \"sosna\"`\n\n"
  },
  {
    "path": "doc/chapter/installation.md",
    "content": "\n# Installation\n\nElephant Shed consists of the following Debian packages and their dependencies:\n\n  * `elephant-shed`:\n    Metapackage that includes the following packages.\n  * `elephant-shed-prometheus`:\n    Configuration files and helper scripts for Prometheus and its exporters.\n  * `elephant-shed-cockpit`:\n    Configuration files for cockpit and cockpit-ws.\n  * `elephant-shed-grafana`:\n    Preconfigured Prometheus datasource and dashboard that includes various system\n    and PostgreSQL metrics.\n  * `elephant-shed-omnidb`:\n    Configuration files for OmniDB.\n  * `elephant-shed-pgbackrest`:\n    Systemd service files and generators, helper scripts and preset configuration.\n  * `elephant-shed-pgbadger`:\n    Systemd service files, generators and helper scripts.\n  * `elephant-shed-portal`:\n    Elephant Shed web portal including Apache configuration.\n  * `elephant-shed-postgresql`:\n    Additional preset configuration files for PostgreSQL.\n  * `elephant-shed-shellinabox`:\n    Shell In A Box configuration files.\n  * `elephant-shed-tmate`:\n    Preconfigured tmate installation for easier support.\n\n## Package Installation\n\nPrebuilt packages are available from <https://packages.credativ.com/public/postgresql/>.\n\nThe repository also contains packages that the `elephant-shed` packages depend\non. This includes packages for Grafana, Cockpit and various python libraries.\n\n### Installation on Debian and Ubuntu\n\n```\n# Install tools\nsudo apt-get install curl ca-certificates apt-transport-https\n\n# Use official PostgreSQL repo, apt.postgresql.org\necho \"deb http://apt.postgresql.org/pub/repos/apt/ buster-pgdg main\" | sudo tee -a /etc/apt/sources.list.d/pgdg.list\ncurl https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -\n\n# Use credativ repo, packages.credativ.com\necho \"deb https://packages.credativ.com/public/postgresql/ buster-stable main\" | sudo tee -a /etc/apt/sources.list.d/elephant-shed.list\ncurl https://packages.credativ.com/public/postgresql/aptly.key | sudo apt-key add -\n\n# Install elephant-shed\nsudo apt-get update\nsudo apt-get install elephant-shed\n\n# In case of dependency issues regarding omnidb on buster, add backports\necho \"deb http://deb.debian.org/debian buster-backports main\" | sudo tee -a /etc/apt/sources.list.d/backports.list\nsudo apt-get update\nsudo apt-get install -t buster-backports python3-django\nsudo apt-get install elephant-shed\n\n# Choose desired PostgreSQL versions to install\nsudo apt-get install postgresql-10\n\n# Every user in the group \"elephant-shed\" is allowed to login at the portal\n# Add all needed users to this group\nsudo adduser <USERNAME> elephant-shed\n```\n\n### Installation on RedHat and CentOS\n\nElephant Shed works with the PostgreSQL packages from the PostgreSQL RPM building project.\nGo to <a href=\"https://yum.postgresql.org/\"><b>yum.postgresql.org</b></a> and\ninstall the repository RPMs for the PostgreSQL versions you want to use.\nThen proceed to install Elephant Shed as below.\n\n```bash\n# Use credativ repository (will also pull in EPEL)\nsudo yum install https://packages.credativ.com/public/postgresql/yum/credativ-repo.rpm\n\n# On RedHat, activate additional repositories (not on CentOS)\nsubscription-manager repos --enable=rhel-7-server-extras-rpms\nsubscription-manager repos --enable=rhel-7-server-optional-rpms\n\n# Choose desired PostgreSQL versions to install\nsudo yum install postgresql13-server postgresql13-contrib postgresql-common\nsudo pg_createcluster 13 main --start\n\n# Install elephant-shed\nsudo yum install elephant-shed\n\n# Every user in the group \"elephant-shed\" is allowed to login at the portal\n# Add all needed users to this group\nsudo vigr\n\n# Unfortunately, shellinabox does not work with SELinux enabled\n# Disable SELinux if you want to use this component\nsudo setenforce 0\nsudo sed -i -e 's/^SELINUX=.*/SELINUX=permissive/' /etc/selinux/config\n```\n\n## Installation from source\n\nThe source code is available on GitHub: <https://github.com/credativ/elephant-shed>\n\n### Build Debian Packages\n\nAll Elephant Shed Debian packages can be built using the command `make deb`.\n\nRequirements:\n\n  - `dpkg-dev`\n  - `devscripts`\n\n### Build Documentation\n\nTo build the documentation in HTML format type `make docs`.\n\nRequirements:\n\n  - `sphinx`\n\n### Create Testsystem with Vagrant\n\nThe `make vagrant` command builds all components, creates a new virtual machine using Vagrant and deploys the software using Ansible.\nThis can also be used to redeploy a already running machine.\n\nThe Vagrant configuration is located in `vagrant/Vagrantfile`.\n\nRequirements:\n\n  - `vagrant`\n  - `virtualbox` or `libvirt`\n  - `ansible`\n\n### Deploy on remote machine\n\nTo deploy the software on any machine, enter the connection information in the inventory `vagrant/inventory`.\nThe deployment can than be started with the following command `make ansible`.\n\nRequirements:\n\n  - `ansible`\n"
  },
  {
    "path": "doc/chapter/intro.md",
    "content": "# Intro\nElephant Shed is a web-based PostgreSQL management front-end that bundles\nseveral utilities and applications for use with PostgreSQL. It currently\nmanages single-node Debian/Ubuntu PostgreSQL servers and appliances.\n\nThe main components are:\n\n* PostgreSQL - <https://www.postgresql.org/>\n* OmniDB - <https://omnidb.org/>\n* postgresql-common - <https://anonscm.debian.org/cgit/pkg-postgresql/postgresql-common.git>\n* pgBadger - <http://dalibo.github.io/pgbadger/>\n* pgBackRest - <http://www.pgbackrest.org/>\n* Grafana - <https://grafana.com/>\n* Prometheus - <https://prometheus.io/>\n* Cockpit - <http://cockpit-project.org/>\n* Shell In A Box - <https://github.com/shellinabox/shellinabox>\n\nIn addition several other tools are included for configuration management and setup.\n\nThe number of components bundled and tasks handled add some overhead compared\nto running just the database server. It is therefore only recommended for\nadequately sized systems.\n\nThis document describes the current version.\nUpdated versions of this document will be shipped with the elephant-shed packages and can be found in `/usr/share/doc/elephant-shed-portal` (`/usr/share/doc/elephant-shed*`) and in the web portal under <https://your-server/doc/>.\n"
  },
  {
    "path": "doc/chapter/issues.md",
    "content": "# Known Bugs and Issues\n\n## PostgreSQL\n\n  * The `prometheus-sql-exporter` monitoring agent is permanently keeping\n    connections open to all databases, which prevents `DROP DATABASE` from\n    working. To drop databases, stop `prometheus-sql-exporter` first.\n    This is possible via the web interface Cockpit: [services#/prometheus-sql-exporter.service](/system/services#/prometheus-sql-exporter.service).\n\n## OmniDB\n\n  * OmniDB does not use PAM authentication.\n\n## Portal\n\n  * A direct relogin after a logout does not work. Reloading the page is necessary.\n\n## RedHat / CentOS\n\n  * shellinabox does not work when SELinux is enabled.\n"
  },
  {
    "path": "doc/chapter/license.md",
    "content": "# License\n\nThe Elephant Shed itself is licensed under the GPLv3 (<https://www.gnu.org/licenses/gpl-3.0.de.html>).\n\nAll bundled components are Free/Open-Source software with a known and approved open source license.\n"
  },
  {
    "path": "doc/chapter/support.md",
    "content": "# Support and more\n## Do you have any question or want to know more?\n\n* **Project page** [elephant-shed.io](https://elephant-shed.io)\n* **Git** [github.com/credativ/elephant-shed](https://github.com/credativ/elephant-shed/)\n* **Web-Chat** [#elephant-shed](https://webchat.oftc.net/?nick=web-user-.&channels=elephant-shed&uio=MT11bmRlZmluZWQmMj10cnVlJjk9dHJ1ZSYxMT0yMzY31)\n* **IRC** [#elephant-shed](https://webchat.oftc.net/?channels=elephant-shed&uio=MT11bmRlZmluZWQmMj10cnVlJjk9dHJ1ZSYxMT0yMzY31\n) on [irc.oftc.net](https://www.oftc.net/)\n\n## Do you need professional support or additional services?\n\nElephant Shed is an open source project, developed and maintained by credativ.\n\nFor the Elephant Shed PostgreSQL appliance, credativ offers comprehensive\ntechnical support with service level agreements, which are also available\non 365 days a year and 24 hours a day as an option.\n\nInstallation and integration support, as well as an introduction\nin Elephant Shed PostgreSQL appliance is of course also part of\ncredativ's services. If you are interested, please feel free to contact us.\n\n![](images/logo_credativ_96.png)\n\n* **Web** [credativ.de](https://credativ.de)\n* **E-Mail:** [info@credativ.de](mailto:info@credativ.de)\n* **Phone:** [+49 2161 9174200](tel:+4921619174200)\n"
  },
  {
    "path": "doc/chapter/users.md",
    "content": "# Users\n\nThe web interface is password protected (HTTP basic authentication) and uses the system\nusers via PAM. When deployed via Ansible, the initial user is **admin** with\npassword **admin**. This user works for web access as well as for SSH and\nPostgreSQL.\n\nTo create new users, use `adduser`, and add the user to the **elephant-shed** group.\n\n```\nadduser myon\nadduser myon elephant-shed\n```\n\nOn RedHat/CentOS, use `vigr` to add users to the **elephant-shed** group.\n"
  },
  {
    "path": "doc/conf.py",
    "content": "# -*- coding: utf-8 -*-\n#\n# elephant-shed documentation build configuration file, created by\n# sphinx-quickstart on Fri Dec 15 14:52:01 2017.\n#\n# This file is execfile()d with the current directory set to its\n# containing dir.\n#\n# Note that not all possible configuration values are present in this\n# autogenerated file.\n#\n# All configuration values have a default; values that are commented out\n# serve to show the default.\n\n# If extensions (or modules to document with autodoc) are in another directory,\n# add these directories to sys.path here. If the directory is relative to the\n# documentation root, use os.path.abspath to make it absolute, like shown here.\n#\nimport os\nimport sys\nsys.path.insert(0, os.path.abspath('.'))\n\nimport recommonmark\nfrom recommonmark.parser import CommonMarkParser\nfrom recommonmark.transform import AutoStructify\n\n\n# -- General configuration ------------------------------------------------\n\n# If your documentation needs a minimal Sphinx version, state it here.\n#\n# needs_sphinx = '1.0'\n\n# Add any Sphinx extension module names here, as strings. They can be\n# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom\n# ones.\nextensions = [\n    'recommonmark',\n    'sphinx.ext.todo',\n    'sphinx.ext.githubpages',\n]\n\nsource_parsers = {\n    '.md': CommonMarkParser\n}\n\n\n# Add any paths that contain templates here, relative to this directory.\ntemplates_path = ['_templates']\n\n# The suffix(es) of source filenames.\n# You can specify multiple suffix as a list of string:\n#\n# source_suffix = ['.rst', '.md']\nsource_suffix = ['.rst', '.md']\n\n# The encoding of source files.\n#\n# source_encoding = 'utf-8-sig'\n\n# The master toctree document.\nmaster_doc = 'index'\n\n# General information about the project.\nproject = u'elephant-shed'\ncopyright = u'2017-2022, credativ'\nauthor = u'credativ'\n\n# The version info for the project you're documenting, acts as replacement for\n# |version| and |release|, also used in various other places throughout the\n# built documents.\n#\n# The short X.Y version.\nversion = u'1.3.10'\n# The full version, including alpha/beta/rc tags.\nrelease = u'1.3.10'\n\n# The language for content autogenerated by Sphinx. Refer to documentation\n# for a list of supported languages.\n#\n# This is also used if you do content translation via gettext catalogs.\n# Usually you set \"language\" from the command line for these cases.\nlanguage = None\n\n# There are two options for replacing |today|: either, you set today to some\n# non-false value, then it is used:\n#\n# today = ''\n#\n# Else, today_fmt is used as the format for a strftime call.\n#\n# today_fmt = '%B %d, %Y'\n\n# List of patterns, relative to source directory, that match files and\n# directories to ignore when looking for source files.\n# This patterns also effect to html_static_path and html_extra_path\nexclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']\n\n# The reST default role (used for this markup: `text`) to use for all\n# documents.\n#\n# default_role = None\n\n# If true, '()' will be appended to :func: etc. cross-reference text.\n#\n# add_function_parentheses = True\n\n# If true, the current module name will be prepended to all description\n# unit titles (such as .. function::).\n#\n# add_module_names = True\n\n# If true, sectionauthor and moduleauthor directives will be shown in the\n# output. They are ignored by default.\n#\n# show_authors = False\n\n# The name of the Pygments (syntax highlighting) style to use.\npygments_style = 'sphinx'\n\n# A list of ignored prefixes for module index sorting.\n# modindex_common_prefix = []\n\n# If true, keep warnings as \"system message\" paragraphs in the built documents.\n# keep_warnings = False\n\n# If true, `todo` and `todoList` produce output, else they produce nothing.\ntodo_include_todos = True\n\n\n# -- Options for HTML output ----------------------------------------------\n\n# The theme to use for HTML and HTML Help pages.  See the documentation for\n# a list of builtin themes.\n#\nhtml_theme = 'sphinx_rtd_theme'\n\n# Theme options are theme-specific and customize the look and feel of a theme\n# further.  For a list of options available for each theme, see the\n# documentation.\n#\nhtml_theme_options = {\n}\n\n# Add any paths that contain custom themes here, relative to this directory.\n# html_theme_path = []\n\n# The name for this set of Sphinx documents.\n# \"<project> v<release> documentation\" by default.\n#\n# html_title = u'elephant-shed v1.0'\n\n# A shorter title for the navigation bar.  Default is the same as html_title.\n#\n# html_short_title = None\n\n# The name of an image file (relative to this directory) to place at the top\n# of the sidebar.\n#\n# html_logo = None\n\n# The name of an image file (relative to this directory) to use as a favicon of\n# the docs.  This file should be a Windows icon file (.ico) being 16x16 or 32x32\n# pixels large.\n#\n# html_favicon = None\n\n# Add any paths that contain custom static files (such as style sheets) here,\n# relative to this directory. They are copied after the builtin static files,\n# so a file named \"default.css\" will overwrite the builtin \"default.css\".\n# html_static_path = ['_static']\n\n# Add any extra paths that contain custom files (such as robots.txt or\n# .htaccess) here, relative to this directory. These files are copied\n# directly to the root of the documentation.\n#\n# html_extra_path = []\n\n# If not None, a 'Last updated on:' timestamp is inserted at every page\n# bottom, using the given strftime format.\n# The empty string is equivalent to '%b %d, %Y'.\n#\n# html_last_updated_fmt = None\n\n# If true, SmartyPants will be used to convert quotes and dashes to\n# typographically correct entities.\n#\n# html_use_smartypants = True\n\n# Custom sidebar templates, maps document names to template names.\n#\n# html_sidebars = {}\n\n# Additional templates that should be rendered to pages, maps page names to\n# template names.\n#\n# html_additional_pages = {}\n\n# If false, no module index is generated.\n#\n# html_domain_indices = True\n\n# If false, no index is generated.\n#\n# html_use_index = True\n\n# If true, the index is split into individual pages for each letter.\n#\n# html_split_index = False\n\n# If true, links to the reST sources are added to the pages.\n#\n# html_show_sourcelink = True\n\n# If true, \"Created using Sphinx\" is shown in the HTML footer. Default is True.\n#\n# html_show_sphinx = True\n\n# If true, \"(C) Copyright ...\" is shown in the HTML footer. Default is True.\n#\n# html_show_copyright = True\n\n# If true, an OpenSearch description file will be output, and all pages will\n# contain a <link> tag referring to it.  The value of this option must be the\n# base URL from which the finished HTML is served.\n#\n# html_use_opensearch = ''\n\n# This is the file name suffix for HTML files (e.g. \".xhtml\").\n# html_file_suffix = None\n\n# Language to be used for generating the HTML full-text search index.\n# Sphinx supports the following languages:\n#   'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja'\n#   'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr', 'zh'\n#\n# html_search_language = 'en'\n\n# A dictionary with options for the search language support, empty by default.\n# 'ja' uses this config value.\n# 'zh' user can custom change `jieba` dictionary path.\n#\n# html_search_options = {'type': 'default'}\n\n# The name of a javascript file (relative to the configuration directory) that\n# implements a search results scorer. If empty, the default will be used.\n#\n# html_search_scorer = 'scorer.js'\n\n# Output file base name for HTML help builder.\nhtmlhelp_basename = 'elephant-sheddoc'\n\n# -- Options for LaTeX output ---------------------------------------------\n\nlatex_elements = {\n     # The paper size ('letterpaper' or 'a4paper').\n     #\n     # 'papersize': 'letterpaper',\n\n     # The font size ('10pt', '11pt' or '12pt').\n     #\n     # 'pointsize': '10pt',\n\n     # Additional stuff for the LaTeX preamble.\n     #\n     # 'preamble': '',\n\n     # Latex figure (float) alignment\n     #\n     # 'figure_align': 'htbp',\n}\n\n# Grouping the document tree into LaTeX files. List of tuples\n# (source start file, target name, title,\n#  author, documentclass [howto, manual, or own class]).\nlatex_documents = [\n    (master_doc, 'elephant-shed.tex', u'elephant-shed Documentation',\n     u'credativ', 'manual'),\n]\n\n# The name of an image file (relative to this directory) to place at the top of\n# the title page.\n#\n# latex_logo = None\n\n# For \"manual\" documents, if this is true, then toplevel headings are parts,\n# not chapters.\n#\n# latex_use_parts = False\n\n# If true, show page references after internal links.\n#\n# latex_show_pagerefs = False\n\n# If true, show URL addresses after external links.\n#\n# latex_show_urls = False\n\n# Documents to append as an appendix to all manuals.\n#\n# latex_appendices = []\n\n# It false, will not define \\strong, \\code, \titleref, \\crossref ... but only\n# \\sphinxstrong, ..., \\sphinxtitleref, ... To help avoid clash with user added\n# packages.\n#\n# latex_keep_old_macro_names = True\n\n# If false, no module index is generated.\n#\n# latex_domain_indices = True\n\n\n# -- Options for manual page output ---------------------------------------\n\n# One entry per manual page. List of tuples\n# (source start file, name, description, authors, manual section).\nman_pages = [\n    (master_doc, 'elephant-shed', u'elephant-shed Documentation',\n     [author], 1)\n]\n\n# If true, show URL addresses after external links.\n#\n# man_show_urls = False\n\n\n# -- Options for Texinfo output -------------------------------------------\n\n# Grouping the document tree into Texinfo files. List of tuples\n# (source start file, target name, title, author,\n#  dir menu entry, description, category)\ntexinfo_documents = [\n    (master_doc, 'elephant-shed', u'elephant-shed Documentation',\n     author, 'elephant-shed', 'One line description of project.',\n     'Miscellaneous'),\n]\n\n# Documents to append as an appendix to all manuals.\n#\n# texinfo_appendices = []\n\n# If false, no module index is generated.\n#\n# texinfo_domain_indices = True\n\n# How to display URL addresses: 'footnote', 'no', or 'inline'.\n#\n# texinfo_show_urls = 'footnote'\n\n# If true, do not generate a @detailmenu in the \"Top\" node's menu.\n#\n# texinfo_no_detailmenu = False\n\n\n# -- Options for Epub output ----------------------------------------------\n\n# Bibliographic Dublin Core info.\nepub_title = project\nepub_author = author\nepub_publisher = author\nepub_copyright = copyright\n\n# The basename for the epub file. It defaults to the project name.\n# epub_basename = project\n\n# The HTML theme for the epub output. Since the default themes are not\n# optimized for small screen space, using the same theme for HTML and epub\n# output is usually not wise. This defaults to 'epub', a theme designed to save\n# visual space.\n#\n# epub_theme = 'epub'\n\n# The language of the text. It defaults to the language option\n# or 'en' if the language is not set.\n#\n# epub_language = ''\n\n# The scheme of the identifier. Typical schemes are ISBN or URL.\n# epub_scheme = ''\n\n# The unique identifier of the text. This can be a ISBN number\n# or the project homepage.\n#\n# epub_identifier = ''\n\n# A unique identification for the text.\n#\n# epub_uid = ''\n\n# A tuple containing the cover image and cover page html template filenames.\n#\n# epub_cover = ()\n\n# A sequence of (type, uri, title) tuples for the guide element of content.opf.\n#\n# epub_guide = ()\n\n# HTML files that should be inserted before the pages created by sphinx.\n# The format is a list of tuples containing the path and title.\n#\n# epub_pre_files = []\n\n# HTML files that should be inserted after the pages created by sphinx.\n# The format is a list of tuples containing the path and title.\n#\n# epub_post_files = []\n\n# A list of files that should not be packed into the epub file.\nepub_exclude_files = ['search.html']\n\n# The depth of the table of contents in toc.ncx.\n#\n# epub_tocdepth = 3\n\n# Allow duplicate toc entries.\n#\n# epub_tocdup = True\n\n# Choose between 'default' and 'includehidden'.\n#\n# epub_tocscope = 'default'\n\n# Fix unsupported image types using the Pillow.\n#\n# epub_fix_images = False\n\n# Scale large images.\n#\n# epub_max_image_width = 0\n\n# How to display URL addresses: 'footnote', 'no', or 'inline'.\n#\n# epub_show_urls = 'inline'\n\n# If false, no index is generated.\n#\n# epub_use_index = True\n"
  },
  {
    "path": "doc/index.rst",
    "content": ".. elephant-shed documentation master file, created by\n   sphinx-quickstart on Fri Dec 15 14:52:01 2017.\n   You can adapt this file completely to your liking, but it should at least\n   contain the root `toctree` directive.\n\nElephant Shed - Documentation\n=============================\n\n.. toctree::\n    :maxdepth: 2\n    :numbered:\n\n    chapter/intro\n    chapter/installation\n    chapter/first-steps\n    chapter/components\n    chapter/users\n    chapter/issues\n    chapter/license\n    chapter/support\n"
  },
  {
    "path": "grafana/README",
    "content": "Prometheus queries\n------------------\n\nOrdering: `job=~'$job', host=~'$host', sql_job=~'$cluster'`, then other fields\n\nCluster selection: `sql_job=~'$cluster'` on \"global\" queries, `sql_job=~'$cluster.*'` on \"database\" queries\n"
  },
  {
    "path": "grafana/dashboard-sed",
    "content": "#!/bin/sh\n\n# To use, select Share > Export > Save to file in Grafana, and do:\n# grafana/dashboard-sed ~/Desktop/PostgreSQL\\ Server\\ Overview-* > grafana/postgresql_server_overview.json ; rm -f ~/Desktop/PostgreSQL\\ Server\\ Overview*\n\n# replace DS_PROMETHEUS by prometheus\n# replace \"Overview Copy\" by \"Overview\"\n\nsed -e 's/${DS_PROMETHEUS}/prometheus/' \\\n    -e 's/\"title\": \"PostgreSQL Server Overview.*/\"title\": \"PostgreSQL Server Overview\",/' \\\n    \"$@\"\n"
  },
  {
    "path": "grafana/datasource_prometheus.yml",
    "content": "---\n# config file version\napiVersion: 1\n\n# list of datasources to insert/update depending\n# whats available in the database\ndatasources:\n  # <string, required> name of the datasource. Required\n- name: prometheus\n  # <string, required> datasource type. Required\n  type: prometheus\n  # <string, required> access mode. direct or proxy. Required\n  access: proxy\n  # <int> org id. will default to orgId 1 if not specified\n  orgId: 1\n  # <string> url\n  url: http://127.0.0.1:9090/prometheus\n  # <string> database password, if used\n  password:\n  # <string> database user, if used\n  user:\n  # <string> database name, if used\n  database:\n  # <bool> enable/disable basic auth\n  basicAuth: false\n  # <string> basic auth username\n  basicAuthUser:\n  # <string> basic auth password\n  basicAuthPassword:\n  # <bool> enable/disable with credentials headers\n  withCredentials: false\n  # <bool> mark as default datasource. Max one per org\n  isDefault: true\n  # <map> fields that will be converted to json and stored in json_data\n  #jsonData:\n  #   graphiteVersion: \"1.1\"\n  #   tlsAuth: true\n  #   tlsAuthWithCACert: true\n  # <string> json object of data that will be encrypted.\n  #secureJsonData:\n  #  tlsCACert: \"...\"\n  #  tlsClientCert: \"...\"\n  #  tlsClientKey: \"...\"\n  version: 1\n  # <bool> allow users to edit datasources from the UI.\n  editable: false\n"
  },
  {
    "path": "grafana/elephant-shed-grafana",
    "content": "# Set go garbage collector to clean up more frequently\nGOGC=40\nGOMAXPROCS=4\nCONF_FILE=/etc/grafana/elephant-shed-grafana.ini\n"
  },
  {
    "path": "grafana/elephant-shed-grafana.conf",
    "content": "[Service]\nEnvironmentFile=/etc/default/elephant-shed-grafana\n"
  },
  {
    "path": "grafana/elephant-shed-grafana.ini",
    "content": "##################### Grafana Configuration Example #####################\n#\n# Everything has defaults so you only need to uncomment things you want to\n# change\n\n# possible values : production, development\n; app_mode = production\n\n# instance name, defaults to HOSTNAME environment variable value or hostname if HOSTNAME var is empty\n; instance_name = ${HOSTNAME}\n\n#################################### Paths ####################################\n[paths]\n# Path to where grafana can store temp files, sessions, and the sqlite3 db (if that is used)\n#\n;data = /var/lib/grafana\n#\n# Directory where grafana can store logs\n#\n;logs = /var/log/grafana\n#\n# Directory where grafana will automatically scan and look for plugins\n#\n;plugins = /var/lib/grafana/plugins\n\n#\n#################################### Server ####################################\n[server]\n# Protocol (http, https, socket)\nprotocol = http\ndomain = localhost\nroot_url = %(protocol)s://%(domain)s:/grafana\n\n# The ip address to bind to, empty will bind to all interfaces\nhttp_addr = 127.0.0.1\n\n# The http port  to use\nhttp_port = 3000\n\n# The public facing domain name used to access grafana from a browser\n;domain = localhost\n\n# Redirect to correct domain if host header does not match domain\n# Prevents DNS rebinding attacks\n;enforce_domain = false\n\n# The full public facing url you use in browser, used for redirects and emails\n# If you use reverse proxy and sub path specify full url (with sub path)\n;root_url = http://localhost:3000\n\n# Log web requests\n;router_logging = false\n\n# the path relative working path\n;static_root_path = public\n\n# enable gzip\n;enable_gzip = false\n\n# https certs & key file\n;cert_file =\n;cert_key =\n\n# Unix socket path\n;socket =\n\n#################################### Database ####################################\n[database]\n# You can configure the database connection by specifying type, host, name, user and password\n# as separate properties or as on string using the url propertie.\n\n# Either \"mysql\", \"postgres\" or \"sqlite3\", it's your choice\n;type = sqlite3\n;host = 127.0.0.1:3306\n;name = grafana\n;user = root\n# If the password contains # or ; you have to wrap it with trippel quotes. Ex \"\"\"#password;\"\"\"\n;password =\n\n# Use either URL or the previous fields to configure the database\n# Example: mysql://user:secret@host:port/database\n;url =\n\n# For \"postgres\" only, either \"disable\", \"require\" or \"verify-full\"\n;ssl_mode = disable\n\n# For \"sqlite3\" only, path relative to data_path setting\n;path = grafana.db\n\n# Max conn setting default is 0 (mean not set)\n;max_idle_conn =\n;max_open_conn =\n\n\n#################################### Session ####################################\n[session]\n# Either \"memory\", \"file\", \"redis\", \"mysql\", \"postgres\", default is \"file\"\n;provider = file\n\n# Provider config options\n# memory: not have any config yet\n# file: session dir path, is relative to grafana data_path\n# redis: config like redis server e.g. `addr=127.0.0.1:6379,pool_size=100,db=grafana`\n# mysql: go-sql-driver/mysql dsn config string, e.g. `user:password@tcp(127.0.0.1:3306)/database_name`\n# postgres: user=a password=b host=localhost port=5432 dbname=c sslmode=disable\n;provider_config = sessions\n\n# Session cookie name\n;cookie_name = grafana_sess\n\n# If you use session in https only, default is false\n;cookie_secure = false\n\n# Session life time, default is 86400\n;session_life_time = 86400\n\n#################################### Data proxy ###########################\n[dataproxy]\n\n# This enables data proxy logging, default is false\n;logging = false\n\n\n#################################### Analytics ####################################\n[analytics]\n# Server reporting, sends usage counters to stats.grafana.org every 24 hours.\n# No ip addresses are being tracked, only simple counters to track\n# running instances, dashboard and error counts. It is very helpful to us.\n# Change this option to false to disable reporting.\n;reporting_enabled = true\n\n# Set to false to disable all checks to https://grafana.net\n# for new vesions (grafana itself and plugins), check is used\n# in some UI views to notify that grafana or plugin update exists\n# This option does not cause any auto updates, nor send any information\n# only a GET request to http://grafana.com to get latest versions\n;check_for_updates = true\n\n# Google Analytics universal tracking code, only enabled if you specify an id here\n;google_analytics_ua_id =\n\n#################################### Security ####################################\n[security]\n# default admin user, created on startup\nadmin_user = admin\n\n# default admin password, can be changed before first start of grafana,  or in profile settings\nadmin_password = admin\n\n# used for signing\n;secret_key = SW2YcwTIb9zpOOhoPsMm\n\n# Auto-login remember days\n;login_remember_days = 7\n;cookie_username = grafana_user\n;cookie_remember_name = grafana_remember\n\n# disable gravatar profile images\n;disable_gravatar = false\n\n# data source proxy whitelist (ip_or_domain:port separated by spaces)\n;data_source_proxy_whitelist =\n\n[snapshots]\n# snapshot sharing options\n;external_enabled = true\n;external_snapshot_url = https://snapshots-origin.raintank.io\n;external_snapshot_name = Publish to snapshot.raintank.io\n\n# remove expired snapshot\n;snapshot_remove_expired = true\n\n# remove snapshots after 90 days\n;snapshot_TTL_days = 90\n\n#################################### Users ####################################\n[users]\n# disable user signup / registration\nallow_sign_up = true\n\n# Allow non admin users to create organizations\n;allow_org_create = true\n\n# Set to true to automatically assign new users to the default organization (id 1)\nauto_assign_org = true\n\n# Default role new users will be automatically assigned (if disabled above is set to true)\nauto_assign_org_role = Editor\n\n# Background text for the user field on the login page\n;login_hint = email or username\n\n# Default UI theme (\"dark\" or \"light\")\n;default_theme = dark\n\n[auth]\n# Set to true to disable (hide) the login form, useful if you use OAuth, defaults to false\n;disable_login_form = false\n\n# Set to true to disable the signout link in the side menu. useful if you use auth.proxy, defaults to false\n;disable_signout_menu = false\n\n#################################### Anonymous Auth ##########################\n[auth.anonymous]\n# enable anonymous access\n;enabled = false\n\n# specify organization name that should be used for unauthenticated users\n;org_name = Main Org.\n\n# specify role for unauthenticated users\n;org_role = Viewer\n\n#################################### Github Auth ##########################\n[auth.github]\n;enabled = false\n;allow_sign_up = true\n;client_id = some_id\n;client_secret = some_secret\n;scopes = user:email,read:org\n;auth_url = https://github.com/login/oauth/authorize\n;token_url = https://github.com/login/oauth/access_token\n;api_url = https://api.github.com/user\n;team_ids =\n;allowed_organizations =\n\n#################################### Google Auth ##########################\n[auth.google]\n;enabled = false\n;allow_sign_up = true\n;client_id = some_client_id\n;client_secret = some_client_secret\n;scopes = https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email\n;auth_url = https://accounts.google.com/o/oauth2/auth\n;token_url = https://accounts.google.com/o/oauth2/token\n;api_url = https://www.googleapis.com/oauth2/v1/userinfo\n;allowed_domains =\n\n#################################### Generic OAuth ##########################\n[auth.generic_oauth]\n;enabled = false\n;name = OAuth\n;allow_sign_up = true\n;client_id = some_id\n;client_secret = some_secret\n;scopes = user:email,read:org\n;auth_url = https://foo.bar/login/oauth/authorize\n;token_url = https://foo.bar/login/oauth/access_token\n;api_url = https://foo.bar/user\n;team_ids =\n;allowed_organizations =\n\n#################################### Grafana.com Auth ####################\n[auth.grafana_com]\n;enabled = false\n;allow_sign_up = true\n;client_id = some_id\n;client_secret = some_secret\n;scopes = user:email\n;allowed_organizations =\n\n#################################### Auth Proxy ##########################\n[auth.proxy]\nenabled = true\nheader_name = X-WEBAUTH-USER\nheader_property = username\nauto_sign_up = true\n;ldap_sync_ttl = 60\n;whitelist = 192.168.1.1, 192.168.2.1\n\n#################################### Basic Auth ##########################\n[auth.basic]\nenabled = true\n\n#################################### Auth LDAP ##########################\n[auth.ldap]\n;enabled = false\n;config_file = /etc/grafana/ldap.toml\n;allow_sign_up = true\n\n#################################### SMTP / Emailing ##########################\n[smtp]\n;enabled = false\n;host = localhost:25\n;user =\n# If the password contains # or ; you have to wrap it with trippel quotes. Ex \"\"\"#password;\"\"\"\n;password =\n;cert_file =\n;key_file =\n;skip_verify = false\n;from_address = admin@grafana.localhost\n;from_name = Grafana\n\n[emails]\n;welcome_email_on_sign_up = false\n\n#################################### Logging ##########################\n[log]\n# Either \"console\", \"file\", \"syslog\". Default is console and  file\n# Use space to separate multiple modes, e.g. \"console file\"\n;mode = console file\n\n# Either \"trace\", \"debug\", \"info\", \"warn\", \"error\", \"critical\", default is \"info\"\n;level = info\n\n# optional settings to set different levels for specific loggers. Ex filters = sqlstore:debug\n;filters =\n\n\n# For \"console\" mode only\n[log.console]\n;level =\n\n# log line format, valid options are text, console and json\n;format = console\n\n# For \"file\" mode only\n[log.file]\n;level =\n\n# log line format, valid options are text, console and json\n;format = text\n\n# This enables automated log rotate(switch of following options), default is true\n;log_rotate = true\n\n# Max line number of single file, default is 1000000\n;max_lines = 1000000\n\n# Max size shift of single file, default is 28 means 1 << 28, 256MB\n;max_size_shift = 28\n\n# Segment log daily, default is true\n;daily_rotate = true\n\n# Expired days of log file(delete after max days), default is 7\n;max_days = 7\n\n[log.syslog]\n;level =\n\n# log line format, valid options are text, console and json\n;format = text\n\n# Syslog network type and address. This can be udp, tcp, or unix. If left blank, the default unix endpoints will be used.\n;network =\n;address =\n\n# Syslog facility. user, daemon and local0 through local7 are valid.\n;facility =\n\n# Syslog tag. By default, the process' argv[0] is used.\n;tag =\n\n\n#################################### AMQP Event Publisher ##########################\n[event_publisher]\n;enabled = false\n;rabbitmq_url = amqp://localhost/\n;exchange = grafana_events\n\n;#################################### Dashboard JSON files ##########################\n[dashboards.json]\nenabled = true\npath = /usr/share/elephant-shed/grafana/dashboards\n\n#################################### Alerting ############################\n[alerting]\n# Disable alerting engine & UI features\n;enabled = true\n# Makes it possible to turn off alert rule execution but alerting UI is visible\n;execute_alerts = true\n\n#################################### Internal Grafana Metrics ##########################\n# Metrics available at HTTP API Url /api/metrics\n[metrics]\n# Disable / Enable internal metrics\n;enabled           = true\n\n# Publish interval\n;interval_seconds  = 10\n\n# Send internal metrics to Graphite\n[metrics.graphite]\n# Enable by setting the address setting (ex localhost:2003)\n;address =\n;prefix = prod.grafana.%(instance_name)s.\n\n#################################### Grafana.com integration  ##########################\n# Url used to import dashboards directly from Grafana.com\n[grafana_com]\n;url = https://grafana.com\n\n#################################### External image storage ##########################\n[external_image_storage]\n# Used for uploading images to public servers so they can be included in slack/email messages.\n# you can choose between (s3, webdav)\n;provider =\n\n[external_image_storage.s3]\n;bucket_url =\n;access_key =\n;secret_key =\n\n[external_image_storage.webdav]\n;url =\n;public_url =\n;username =\n;password =\n"
  },
  {
    "path": "grafana/node_overview.json",
    "content": "{\n  \"__requires\": [\n    {\n      \"type\": \"panel\",\n      \"id\": \"bargauge\",\n      \"name\": \"Bar gauge\",\n      \"version\": \"\"\n    },\n    {\n      \"type\": \"panel\",\n      \"id\": \"gauge\",\n      \"name\": \"Gauge\",\n      \"version\": \"\"\n    },\n    {\n      \"type\": \"grafana\",\n      \"id\": \"grafana\",\n      \"name\": \"Grafana\",\n      \"version\": \"11.6.1\"\n    },\n    {\n      \"type\": \"datasource\",\n      \"id\": \"prometheus\",\n      \"name\": \"Prometheus\",\n      \"version\": \"1.0.0\"\n    },\n    {\n      \"type\": \"panel\",\n      \"id\": \"stat\",\n      \"name\": \"Stat\",\n      \"version\": \"\"\n    },\n    {\n      \"type\": \"panel\",\n      \"id\": \"timeseries\",\n      \"name\": \"Time series\",\n      \"version\": \"\"\n    }\n  ],\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\": 1,\n  \"id\": null,\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\": 261,\n      \"panels\": [],\n      \"title\": \"Quick CPU / Mem / Disk\",\n      \"type\": \"row\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${ds_prometheus}\"\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              },\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        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": false\n        },\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\": \"11.6.1\",\n      \"targets\": [\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          \"legendFormat\": \"CPU\",\n          \"range\": false,\n          \"refId\": \"A\",\n          \"step\": 240\n        },\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          \"instant\": true,\n          \"legendFormat\": \"Mem\",\n          \"range\": false,\n          \"refId\": \"B\",\n          \"step\": 240\n        },\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          \"instant\": true,\n          \"legendFormat\": \"I/O\",\n          \"range\": false,\n          \"refId\": \"C\",\n          \"step\": 240\n        },\n        {\n          \"editorMode\": \"code\",\n          \"exemplar\": false,\n          \"expr\": \"irate(node_pressure_irq_stalled_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n          \"format\": \"time_series\",\n          \"instant\": true,\n          \"legendFormat\": \"Irq\",\n          \"range\": false,\n          \"refId\": \"D\",\n          \"step\": 240\n        }\n      ],\n      \"title\": \"Pressure\",\n      \"type\": \"bargauge\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${ds_prometheus}\"\n      },\n      \"description\": \"Overall CPU busy percentage (averaged across all cores)\",\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              },\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\": \"11.6.1\",\n      \"targets\": [\n        {\n          \"editorMode\": \"code\",\n          \"exemplar\": false,\n          \"expr\": \"100 * (1 - avg(rate(node_cpu_seconds_total{mode=\\\"idle\\\", instance=\\\"$node\\\"}[$__rate_interval])))\",\n          \"instant\": true,\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\": \"${ds_prometheus}\"\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              },\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\": \"11.6.1\",\n      \"targets\": [\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          \"instant\": true,\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\": \"${ds_prometheus}\"\n      },\n      \"description\": \"Real RAM usage excluding cache and reclaimable 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              },\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      \"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\": \"11.6.1\",\n      \"targets\": [\n        {\n          \"editorMode\": \"code\",\n          \"exemplar\": false,\n          \"expr\": \"clamp_min((1 - (node_memory_MemAvailable_bytes{instance=\\\"$node\\\", job=\\\"$job\\\"} / node_memory_MemTotal_bytes{instance=\\\"$node\\\", job=\\\"$job\\\"})) * 100, 0)\",\n          \"format\": \"time_series\",\n          \"instant\": true,\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\": \"${ds_prometheus}\"\n      },\n      \"description\": \"Percentage of swap space currently used by the system\",\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              },\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\": \"11.6.1\",\n      \"targets\": [\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          \"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\": \"${ds_prometheus}\"\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              },\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\": \"11.6.1\",\n      \"targets\": [\n        {\n          \"editorMode\": \"code\",\n          \"exemplar\": false,\n          \"expr\": \"(\\n  (node_filesystem_size_bytes{instance=\\\"$node\\\", job=\\\"$job\\\", mountpoint=\\\"/\\\", fstype!=\\\"rootfs\\\"}\\n   - node_filesystem_avail_bytes{instance=\\\"$node\\\", job=\\\"$job\\\", mountpoint=\\\"/\\\", fstype!=\\\"rootfs\\\"})\\n  / node_filesystem_size_bytes{instance=\\\"$node\\\", job=\\\"$job\\\", mountpoint=\\\"/\\\", fstype!=\\\"rootfs\\\"}\\n) * 100\\n\",\n          \"format\": \"time_series\",\n          \"instant\": true,\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\": \"${ds_prometheus}\"\n      },\n      \"description\": \"\",\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              }\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        \"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\": \"11.6.1\",\n      \"targets\": [\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\": \"${ds_prometheus}\"\n      },\n      \"description\": \"\",\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              },\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\": 1\n      },\n      \"id\": 75,\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        \"textMode\": \"auto\",\n        \"wideLayout\": true\n      },\n      \"pluginVersion\": \"11.6.1\",\n      \"targets\": [\n        {\n          \"editorMode\": \"code\",\n          \"exemplar\": false,\n          \"expr\": \"node_memory_MemTotal_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n          \"instant\": true,\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\": \"${ds_prometheus}\"\n      },\n      \"description\": \"\",\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              },\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\": 1\n      },\n      \"id\": 18,\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        \"textMode\": \"auto\",\n        \"wideLayout\": true\n      },\n      \"pluginVersion\": \"11.6.1\",\n      \"targets\": [\n        {\n          \"editorMode\": \"code\",\n          \"exemplar\": false,\n          \"expr\": \"node_memory_SwapTotal_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n          \"instant\": true,\n          \"range\": false,\n          \"refId\": \"A\",\n          \"step\": 240\n        }\n      ],\n      \"title\": \"SWAP Total\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${ds_prometheus}\"\n      },\n      \"description\": \"\",\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              },\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        \"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\": \"11.6.1\",\n      \"targets\": [\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          \"instant\": true,\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\": \"${ds_prometheus}\"\n      },\n      \"description\": \"\",\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              },\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\": 3\n      },\n      \"id\": 15,\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        \"textMode\": \"auto\",\n        \"wideLayout\": true\n      },\n      \"pluginVersion\": \"11.6.1\",\n      \"targets\": [\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          \"range\": false,\n          \"refId\": \"A\",\n          \"step\": 240\n        }\n      ],\n      \"title\": \"Uptime\",\n      \"type\": \"stat\"\n    },\n    {\n      \"collapsed\": false,\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 5\n      },\n      \"id\": 263,\n      \"panels\": [],\n      \"title\": \"Basic CPU / Mem / Net / Disk\",\n      \"type\": \"row\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${ds_prometheus}\"\n      },\n      \"description\": \"CPU time spent busy vs idle, split by activity type\",\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\": 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              }\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 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          \"hideZeros\": false,\n          \"mode\": \"multi\",\n          \"sort\": \"desc\"\n        }\n      },\n      \"pluginVersion\": \"11.6.1\",\n      \"targets\": [\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          \"instant\": false,\n          \"legendFormat\": \"Busy System\",\n          \"range\": true,\n          \"refId\": \"A\",\n          \"step\": 240\n        },\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          \"legendFormat\": \"Busy User\",\n          \"range\": true,\n          \"refId\": \"B\",\n          \"step\": 240\n        },\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          \"legendFormat\": \"Busy Iowait\",\n          \"range\": true,\n          \"refId\": \"C\",\n          \"step\": 240\n        },\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          \"legendFormat\": \"Busy IRQs\",\n          \"range\": true,\n          \"refId\": \"D\",\n          \"step\": 240\n        },\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          \"legendFormat\": \"Busy Other\",\n          \"range\": true,\n          \"refId\": \"E\",\n          \"step\": 240\n        },\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          \"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\": \"${ds_prometheus}\"\n      },\n      \"description\": \"RAM and swap usage overview, including caches\",\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\": 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              }\n            ]\n          },\n          \"unit\": \"bytes\"\n        },\n        \"overrides\": [\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\": \"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\": \"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\": \"Free\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"#7EB26D\",\n                  \"mode\": \"fixed\"\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          \"hideZeros\": false,\n          \"mode\": \"multi\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"11.6.1\",\n      \"targets\": [\n        {\n          \"editorMode\": \"code\",\n          \"expr\": \"node_memory_MemTotal_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n          \"format\": \"time_series\",\n          \"legendFormat\": \"Total\",\n          \"range\": true,\n          \"refId\": \"A\",\n          \"step\": 240\n        },\n        {\n          \"editorMode\": \"code\",\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          \"legendFormat\": \"Used\",\n          \"range\": true,\n          \"refId\": \"B\",\n          \"step\": 240\n        },\n        {\n          \"editorMode\": \"code\",\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          \"legendFormat\": \"Cache + Buffer\",\n          \"range\": true,\n          \"refId\": \"C\",\n          \"step\": 240\n        },\n        {\n          \"editorMode\": \"code\",\n          \"expr\": \"node_memory_MemFree_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n          \"format\": \"time_series\",\n          \"legendFormat\": \"Free\",\n          \"range\": true,\n          \"refId\": \"D\",\n          \"step\": 240\n        },\n        {\n          \"editorMode\": \"code\",\n          \"expr\": \"(node_memory_SwapTotal_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"} - node_memory_SwapFree_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"})\",\n          \"format\": \"time_series\",\n          \"legendFormat\": \"Swap used\",\n          \"range\": true,\n          \"refId\": \"E\",\n          \"step\": 240\n        }\n      ],\n      \"title\": \"Memory Basic\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"${ds_prometheus}\"\n      },\n      \"description\": \"Per-interface network traffic (receive and transmit) in bits per second\",\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\": 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              }\n            ]\n          },\n          \"unit\": \"bps\"\n        },\n        \"overrides\": [\n          {\n            \"matcher\": {\n              \"id\": \"byRegexp\",\n              \"options\": \"/.*Tx.*/\"\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          \"hideZeros\": false,\n          \"mode\": \"multi\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"11.6.1\",\n      \"targets\": [\n        {\n          \"editorMode\": \"code\",\n          \"expr\": \"rate(node_network_receive_bytes_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])*8\",\n          \"format\": \"time_series\",\n          \"legendFormat\": \"Rx {{device}}\",\n          \"range\": true,\n          \"refId\": \"A\",\n          \"step\": 240\n        },\n        {\n          \"editorMode\": \"code\",\n          \"expr\": \"rate(node_network_transmit_bytes_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])*8\",\n          \"format\": \"time_series\",\n          \"legendFormat\": \"Tx {{device}} \",\n          \"range\": true,\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\": \"${ds_prometheus}\"\n      },\n      \"description\": \"Percentage of filesystem space used for each mounted device\",\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\": 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              }\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          \"hideZeros\": false,\n          \"mode\": \"multi\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"11.6.1\",\n      \"targets\": [\n        {\n          \"editorMode\": \"code\",\n          \"expr\": \"((node_filesystem_size_bytes{instance=\\\"$node\\\", job=\\\"$job\\\", device!~\\\"rootfs\\\"} - node_filesystem_avail_bytes{instance=\\\"$node\\\", job=\\\"$job\\\", device!~\\\"rootfs\\\"}) / node_filesystem_size_bytes{instance=\\\"$node\\\", job=\\\"$job\\\", device!~\\\"rootfs\\\"}) * 100\",\n          \"format\": \"time_series\",\n          \"legendFormat\": \"{{mountpoint}}\",\n          \"range\": true,\n          \"refId\": \"A\",\n          \"step\": 240\n        }\n      ],\n      \"title\": \"Disk Space Used Basic\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"collapsed\": true,\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\": \"${ds_prometheus}\"\n          },\n          \"description\": \"CPU time usage split by state, normalized across all CPU cores\",\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\": 70,\n                \"gradientMode\": \"none\",\n                \"hideFrom\": {\n                  \"legend\": false,\n                  \"tooltip\": false,\n                  \"viz\": false\n                },\n                \"insertNulls\": false,\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              },\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                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Guest CPU usage\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"custom.fillOpacity\",\n                    \"value\": 0\n                  },\n                  {\n                    \"id\": \"custom.lineStyle\",\n                    \"value\": {\n                      \"dash\": [\n                        10,\n                        10\n                      ],\n                      \"fill\": \"dash\"\n                    }\n                  },\n                  {\n                    \"id\": \"custom.stacking\",\n                    \"value\": {\n                      \"group\": \"A\",\n                      \"mode\": \"none\"\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          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true,\n              \"width\": 250\n            },\n            \"tooltip\": {\n              \"hideZeros\": false,\n              \"mode\": \"multi\",\n              \"sort\": \"desc\"\n            }\n          },\n          \"pluginVersion\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"sum(irate(node_cpu_seconds_total{mode=\\\"system\\\",instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])) / scalar(count(count(node_cpu_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\"}) by (cpu)))\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"System - Processes executing in kernel mode\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"sum(irate(node_cpu_seconds_total{mode=\\\"user\\\",instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])) / scalar(count(count(node_cpu_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\"}) by (cpu)))\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"User - Normal processes executing in user mode\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"sum(irate(node_cpu_seconds_total{mode=\\\"nice\\\",instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])) / scalar(count(count(node_cpu_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\"}) by (cpu)))\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"Nice - Niced processes executing in user mode\",\n              \"range\": true,\n              \"refId\": \"C\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"sum(irate(node_cpu_seconds_total{mode=\\\"iowait\\\",instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])) / scalar(count(count(node_cpu_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\"}) by (cpu)))\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"Iowait - Waiting for I/O to complete\",\n              \"range\": true,\n              \"refId\": \"D\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"sum(irate(node_cpu_seconds_total{mode=\\\"irq\\\",instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])) / scalar(count(count(node_cpu_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\"}) by (cpu)))\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"Irq - Servicing interrupts\",\n              \"range\": true,\n              \"refId\": \"E\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"sum(irate(node_cpu_seconds_total{mode=\\\"softirq\\\",instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])) / scalar(count(count(node_cpu_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\"}) by (cpu)))\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"Softirq - Servicing softirqs\",\n              \"range\": true,\n              \"refId\": \"F\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"sum(irate(node_cpu_seconds_total{mode=\\\"steal\\\",instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])) / scalar(count(count(node_cpu_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\"}) by (cpu)))\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"Steal - Time spent in other operating systems when running in a virtualized environment\",\n              \"range\": true,\n              \"refId\": \"G\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"sum(irate(node_cpu_seconds_total{mode=\\\"idle\\\",instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])) / scalar(count(count(node_cpu_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\"}) by (cpu)))\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"Idle - Waiting for something to happen\",\n              \"range\": true,\n              \"refId\": \"H\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"sum by(instance) (irate(node_cpu_guest_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])) / on(instance) group_left sum by (instance)((irate(node_cpu_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval]))) > 0\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"Guest CPU usage\",\n              \"range\": true,\n              \"refId\": \"I\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"CPU\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Breakdown of physical memory and swap usage. Hardware-detected memory errors are also displayed\",\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\": 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                  }\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          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true,\n              \"width\": 350\n            },\n            \"tooltip\": {\n              \"hideZeros\": false,\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\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              \"legendFormat\": \"Apps - Memory used by user-space applications\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_memory_PageTables_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"PageTables - Memory used to map between virtual and physical memory addresses\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_memory_SwapCached_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"SwapCache - Memory that keeps track of pages that have been fetched from swap but not yet been modified\",\n              \"range\": true,\n              \"refId\": \"C\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_memory_Slab_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"Slab - Memory used by the kernel to cache data structures for its own use (caches like inode, dentry, etc)\",\n              \"range\": true,\n              \"refId\": \"D\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_memory_Cached_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"Cache - Parked file data (file content) cache\",\n              \"range\": true,\n              \"refId\": \"E\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_memory_Buffers_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"Buffers - Block device (e.g. harddisk) cache\",\n              \"range\": true,\n              \"refId\": \"F\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_memory_MemFree_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"Unused - Free memory unassigned\",\n              \"range\": true,\n              \"refId\": \"G\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"(node_memory_SwapTotal_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"} - node_memory_SwapFree_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"})\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"Swap - Swap space used\",\n              \"range\": true,\n              \"refId\": \"H\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_memory_HardwareCorrupted_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"Hardware Corrupted - Amount of RAM that the kernel identified as corrupted / not working\",\n              \"range\": true,\n              \"refId\": \"I\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Memory\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Incoming and outgoing network traffic 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\": \"out (-) / in (+)\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"barWidthFactor\": 0.6,\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                  }\n                ]\n              },\n              \"unit\": \"bps\"\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\": 12,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 433\n          },\n          \"id\": 84,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\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\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"rate(node_network_receive_bytes_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])*8\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"{{device}} - Rx in\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"rate(node_network_transmit_bytes_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])*8\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"{{device}} - Tx out\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Network Traffic\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Network interface utilization as a percentage of its maximum capacity\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisBorderShow\": false,\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"out (-) / in (+)\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"barWidthFactor\": 0.6,\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                  }\n                ]\n              },\n              \"unit\": \"percentunit\"\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\": 12,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 433\n          },\n          \"id\": 338,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\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\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"rate(node_network_receive_bytes_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\\n / ignoring(speed) node_network_speed_bytes{instance=\\\"$node\\\",job=\\\"$job\\\", speed!=\\\"-1\\\"}\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"{{device}} - Rx in\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"(rate(node_network_transmit_bytes_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\\n / ignoring(speed) node_network_speed_bytes{instance=\\\"$node\\\",job=\\\"$job\\\", speed!=\\\"-1\\\"})\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"{{device}} - Tx out\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Network Saturation\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Disk I/O operations per second for each device\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisBorderShow\": false,\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"read (-) / write (+)\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"barWidthFactor\": 0.6,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\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                  }\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          },\n          \"gridPos\": {\n            \"h\": 12,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 445\n          },\n          \"id\": 229,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"hideZeros\": false,\n              \"mode\": \"single\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_disk_reads_completed_total{instance=\\\"$node\\\",job=\\\"$job\\\",device=~\\\"[a-z]+|nvme[0-9]+n[0-9]+|mmcblk[0-9]+\\\"}[$__rate_interval])\",\n              \"legendFormat\": \"{{device}} - Read\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_disk_writes_completed_total{instance=\\\"$node\\\",job=\\\"$job\\\",device=~\\\"[a-z]+|nvme[0-9]+n[0-9]+|mmcblk[0-9]+\\\"}[$__rate_interval])\",\n              \"legendFormat\": \"{{device}} - Write\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Disk IOps\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Disk I/O throughput per device\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisBorderShow\": false,\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"read (-) / write (+)\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"barWidthFactor\": 0.6,\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                  }\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          },\n          \"gridPos\": {\n            \"h\": 12,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 445\n          },\n          \"id\": 42,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\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\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_disk_read_bytes_total{instance=\\\"$node\\\",job=\\\"$job\\\",device=~\\\"[a-z]+|nvme[0-9]+n[0-9]+|mmcblk[0-9]+\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"{{device}} - Read\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_disk_written_bytes_total{instance=\\\"$node\\\",job=\\\"$job\\\",device=~\\\"[a-z]+|nvme[0-9]+n[0-9]+|mmcblk[0-9]+\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"{{device}} - Write\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Disk Throughput\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Amount of available disk space per mounted filesystem, excluding rootfs. Based on block availability to non-root users\",\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\": 20,\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              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  }\n                ]\n              },\n              \"unit\": \"bytes\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 12,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 457\n          },\n          \"id\": 43,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\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\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_filesystem_avail_bytes{instance=\\\"$node\\\",job=\\\"$job\\\",device!~'rootfs'}\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"{{mountpoint}}\",\n              \"metric\": \"\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_filesystem_free_bytes{instance=\\\"$node\\\",job=\\\"$job\\\",device!~'rootfs'}\",\n              \"format\": \"time_series\",\n              \"hide\": true,\n              \"legendFormat\": \"{{mountpoint}} - Free\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_filesystem_size_bytes{instance=\\\"$node\\\",job=\\\"$job\\\",device!~'rootfs'}\",\n              \"format\": \"time_series\",\n              \"hide\": true,\n              \"legendFormat\": \"{{mountpoint}} - Size\",\n              \"range\": true,\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\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Disk usage (used = total - available) per mountpoint\",\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\": 20,\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              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  }\n                ]\n              },\n              \"unit\": \"bytes\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 12,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 457\n          },\n          \"id\": 156,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\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\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\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              \"legendFormat\": \"{{mountpoint}}\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Filesystem Used\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Percentage of time the disk was actively processing I/O operations\",\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\": 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              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  }\n                ]\n              },\n              \"unit\": \"percentunit\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 12,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 469\n          },\n          \"id\": 127,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\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\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_disk_io_time_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\",device=~\\\"[a-z]+|nvme[0-9]+n[0-9]+|mmcblk[0-9]+\\\"} [$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"{{device}}\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Disk I/O Utilization\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${ds_prometheus}\"\n          },\n          \"description\": \"How often tasks experience CPU, memory, or I/O delays. “Some” indicates partial slowdown; “Full” indicates all tasks are stalled. Based on Linux PSI metrics:\\nhttps://docs.kernel.org/accounting/psi.html\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisBorderShow\": false,\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"some (-) / full (+)\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"barWidthFactor\": 0.6,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 10,\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                  }\n                ]\n              },\n              \"unit\": \"percentunit\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*Some.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"custom.fillOpacity\",\n                    \"value\": 0\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*Some.*/\"\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\": 12,\n            \"y\": 469\n          },\n          \"id\": 322,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\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\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"rate(node_pressure_cpu_waiting_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"CPU - Some\",\n              \"range\": true,\n              \"refId\": \"CPU some\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"rate(node_pressure_memory_waiting_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"Memory - Some\",\n              \"range\": true,\n              \"refId\": \"Memory some\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"rate(node_pressure_memory_stalled_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"Memory - Full\",\n              \"range\": true,\n              \"refId\": \"Memory full\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"rate(node_pressure_io_waiting_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"I/O - Some\",\n              \"range\": true,\n              \"refId\": \"I/O some\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"rate(node_pressure_io_stalled_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"I/O - Full\",\n              \"range\": true,\n              \"refId\": \"I/O full\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"rate(node_pressure_irq_stalled_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"IRQ - Full\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Pressure Stall Information\",\n          \"type\": \"timeseries\"\n        }\n      ],\n      \"title\": \"CPU / Memory / Net / Disk\",\n      \"type\": \"row\"\n    },\n    {\n      \"collapsed\": true,\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\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Displays committed memory usage versus the system's commit limit. Exceeding the limit is allowed under Linux overcommit policies but may increase OOM risks under high load\",\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\": 20,\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              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  }\n                ]\n              },\n              \"unit\": \"bytes\"\n            },\n            \"overrides\": [\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\": 0,\n            \"y\": 732\n          },\n          \"id\": 135,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true,\n              \"width\": 350\n            },\n            \"tooltip\": {\n              \"hideZeros\": false,\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_memory_Committed_AS_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"Committed_AS – Memory promised to processes (not necessarily used)\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_memory_CommitLimit_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"CommitLimit - Max allowable committed memory\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Memory Committed\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Memory currently dirty (modified but not yet written to disk), being actively written back, or held by writeback buffers. High dirty or writeback memory may indicate disk I/O pressure or delayed flushing\",\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\": 20,\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              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  }\n                ]\n              },\n              \"unit\": \"bytes\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 732\n          },\n          \"id\": 130,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\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\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_memory_Writeback_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"Writeback – Memory currently being flushed to disk\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_memory_WritebackTmp_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"WritebackTmp – FUSE temporary writeback buffers\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_memory_Dirty_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"Dirty – Memory marked dirty (pending write to disk)\",\n              \"range\": true,\n              \"refId\": \"C\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_memory_NFS_Unstable_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"NFS Unstable – Pages sent to NFS server, awaiting storage commit\",\n              \"range\": true,\n              \"refId\": \"D\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Memory Writeback and Dirty\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Kernel slab memory usage, separated into reclaimable and non-reclaimable categories. Reclaimable memory can be freed under memory pressure (e.g., caches), while unreclaimable memory is locked by the kernel for core functions\",\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\": 20,\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                  }\n                ]\n              },\n              \"unit\": \"bytes\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 932\n          },\n          \"id\": 131,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\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\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_memory_SUnreclaim_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"SUnreclaim – Non-reclaimable slab memory (kernel objects)\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_memory_SReclaimable_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"SReclaimable – Potentially reclaimable slab memory (e.g., inode cache)\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Memory Slab\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Memory used for mapped files (such as libraries) and shared memory (shmem and tmpfs), including variants backed by huge pages\",\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\": 20,\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              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  }\n                ]\n              },\n              \"unit\": \"bytes\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 932\n          },\n          \"id\": 138,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true,\n              \"width\": 350\n            },\n            \"tooltip\": {\n              \"hideZeros\": false,\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_memory_Mapped_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"Mapped – Memory mapped from files (e.g., libraries, mmap)\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_memory_Shmem_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"Shmem – Shared memory used by processes and tmpfs\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_memory_ShmemHugePages_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"ShmemHugePages – Shared memory (shmem/tmpfs) allocated with HugePages\",\n              \"range\": true,\n              \"refId\": \"C\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_memory_ShmemPmdMapped_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"PMD Mapped – Shmem/tmpfs backed by Transparent HugePages (PMD)\",\n              \"range\": true,\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\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Proportion of memory pages in the kernel's active and inactive LRU lists relative to total RAM. Active pages have been recently used, while inactive pages are less recently accessed but still resident in memory\",\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\": 20,\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                  }\n                ]\n              },\n              \"unit\": \"percentunit\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*Active.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"green\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*Inactive.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"dark-blue\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 942\n          },\n          \"id\": 136,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true,\n              \"width\": 350\n            },\n            \"tooltip\": {\n              \"hideZeros\": false,\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"(node_memory_Inactive_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}) \\n/ \\n(node_memory_MemTotal_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"})\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"Inactive – Less recently used memory, more likely to be reclaimed\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"(node_memory_Active_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}) \\n/ \\n(node_memory_MemTotal_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"})\\n\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"Active – Recently used memory, retained unless under pressure\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Memory LRU Active / Inactive (%)\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Breakdown of memory pages in the kernel's active and inactive LRU lists, separated by anonymous (heap, tmpfs) and file-backed (caches, mmap) pages.\",\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\": 20,\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                  }\n                ]\n              },\n              \"unit\": \"bytes\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 942\n          },\n          \"id\": 191,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true,\n              \"width\": 350\n            },\n            \"tooltip\": {\n              \"hideZeros\": false,\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_memory_Inactive_file_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"Inactive_file - File-backed memory on inactive LRU list\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_memory_Inactive_anon_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"Inactive_anon – Anonymous memory on inactive LRU (incl. tmpfs & swap cache)\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_memory_Active_file_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"Active_file - File-backed memory on active LRU list\",\n              \"range\": true,\n              \"refId\": \"C\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_memory_Active_anon_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"Active_anon – Anonymous memory on active LRU (incl. tmpfs & swap cache)\",\n              \"range\": true,\n              \"refId\": \"D\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Memory LRU Active / Inactive Detail\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Tracks kernel memory used for CPU-local structures, per-thread stacks, and bounce buffers used for I/O on DMA-limited devices. These areas are typically small but critical for low-level operations\",\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\": 20,\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              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  }\n                ]\n              },\n              \"unit\": \"bytes\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 952\n          },\n          \"id\": 160,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true,\n              \"width\": 350\n            },\n            \"tooltip\": {\n              \"hideZeros\": false,\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_memory_KernelStack_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"KernelStack – Kernel stack memory (per-thread, non-reclaimable)\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_memory_Percpu_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"PerCPU – Dynamically allocated per-CPU memory (used by kernel modules)\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_memory_Bounce_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"Bounce Memory – I/O buffer for DMA-limited devices\",\n              \"range\": true,\n              \"refId\": \"C\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Memory Kernel / CPU / IO\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Usage of the kernel's vmalloc area, which provides virtual memory allocations for kernel modules and drivers. Includes total, used, and largest free block sizes\",\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\": 20,\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              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  }\n                ]\n              },\n              \"unit\": \"bytes\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*Total.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"custom.fillOpacity\",\n                    \"value\": 0\n                  },\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\": \"dark-red\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 952\n          },\n          \"id\": 70,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\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\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_memory_VmallocChunk_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"Vmalloc Free Chunk – Largest available block in vmalloc area\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_memory_VmallocTotal_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"Vmalloc Total – Total size of the vmalloc memory area\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_memory_VmallocUsed_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"Vmalloc Used – Portion of vmalloc area currently in use\",\n              \"range\": true,\n              \"refId\": \"C\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Memory Vmalloc\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Memory used by anonymous pages (not backed by files), including standard and huge page allocations. Includes heap, stack, and memory-mapped anonymous regions\",\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\": 20,\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              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  }\n                ]\n              },\n              \"unit\": \"bytes\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 962\n          },\n          \"id\": 129,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\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\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_memory_AnonHugePages_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"AnonHugePages – Anonymous memory using HugePages\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_memory_AnonPages_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"AnonPages – Anonymous memory (non-file-backed)\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Memory Anonymous\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Memory that is locked in RAM and cannot be swapped out. Includes both kernel-unevictable memory and user-level memory locked with mlock()\",\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\": 20,\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              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  }\n                ]\n              },\n              \"unit\": \"bytes\"\n            },\n            \"overrides\": [\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          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 962\n          },\n          \"id\": 137,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true,\n              \"width\": 350\n            },\n            \"tooltip\": {\n              \"hideZeros\": false,\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_memory_Unevictable_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"Unevictable – Kernel-pinned memory (not swappable)\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_memory_Mlocked_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"Mlocked – Application-locked memory via mlock()\",\n              \"range\": true,\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\": \"${ds_prometheus}\"\n          },\n          \"description\": \"How much memory is directly mapped in the kernel using different page sizes (4K, 2M, 1G). Helps monitor large page utilization in the direct map region\",\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\": 20,\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              \"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\": 972\n          },\n          \"id\": 128,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\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\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_memory_DirectMap1G_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"DirectMap 1G – Memory mapped with 1GB pages\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_memory_DirectMap2M_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"DirectMap 2M – Memory mapped with 2MB pages\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_memory_DirectMap4k_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"DirectMap 4K – Memory mapped with 4KB pages\",\n              \"range\": true,\n              \"refId\": \"C\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Memory DirectMap\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Displays HugePages memory usage in bytes, including allocated, free, reserved, and surplus memory. All values are calculated based on the number of huge pages multiplied by their configured size\",\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\": 20,\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              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  }\n                ]\n              },\n              \"unit\": \"bytes\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 972\n          },\n          \"id\": 140,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\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\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_memory_HugePages_Free{instance=\\\"$node\\\",job=\\\"$job\\\"} * node_memory_Hugepagesize_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"HugePages Used – Currently allocated\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_memory_HugePages_Rsvd{instance=\\\"$node\\\",job=\\\"$job\\\"} * node_memory_Hugepagesize_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"HugePages Reserved – Promised but unused\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_memory_HugePages_Surp{instance=\\\"$node\\\",job=\\\"$job\\\"} * node_memory_Hugepagesize_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"HugePages Surplus – Dynamic pool extension\",\n              \"range\": true,\n              \"refId\": \"C\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_memory_HugePages_Total{instance=\\\"$node\\\",job=\\\"$job\\\"} * node_memory_Hugepagesize_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"HugePages Total – Reserved memory\",\n              \"range\": true,\n              \"refId\": \"D\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Memory HugePages\",\n          \"type\": \"timeseries\"\n        }\n      ],\n      \"title\": \"Memory Meminfo\",\n      \"type\": \"row\"\n    },\n    {\n      \"collapsed\": true,\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\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Rate of memory pages being read from or written to disk (page-in and page-out operations). High page-out may indicate memory pressure or swapping activity\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisBorderShow\": false,\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"out (-) / in (+)\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"barWidthFactor\": 0.6,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\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                  }\n                ]\n              },\n              \"unit\": \"ops\"\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\": 733\n          },\n          \"id\": 176,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\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\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_vmstat_pgpgin{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"Pagesin - Page in ops\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_vmstat_pgpgout{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"Pagesout - Page out ops\",\n              \"range\": true,\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\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Rate at which memory pages are being swapped in from or out to disk. High swap-out activity may indicate memory pressure\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisBorderShow\": false,\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"out (-) / in (+)\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"barWidthFactor\": 0.6,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\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                  }\n                ]\n              },\n              \"unit\": \"ops\"\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\": 733\n          },\n          \"id\": 22,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\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\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_vmstat_pswpin{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"Pswpin - Pages swapped in\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_vmstat_pswpout{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"Pswpout - Pages swapped out\",\n              \"range\": true,\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\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Rate of memory page faults, split into total, major (disk-backed), and derived minor (non-disk) faults. High major fault rates may indicate memory pressure or insufficient RAM\",\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\": 20,\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                  }\n                ]\n              },\n              \"unit\": \"ops\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Pgfault - Page major and minor fault ops\"\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                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"dark-red\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 913\n          },\n          \"id\": 175,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true,\n              \"width\": 350\n            },\n            \"tooltip\": {\n              \"hideZeros\": false,\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_vmstat_pgfault{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"Pgfault - Page major and minor fault ops\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_vmstat_pgmajfault{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"Pgmajfault - Major page fault ops\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\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              \"legendFormat\": \"Pgminfault - Minor page fault ops\",\n              \"range\": true,\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\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Rate of Out-of-Memory (OOM) kill events. A non-zero value indicates the kernel has terminated one or more processes due to memory exhaustion\",\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\": 20,\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              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  }\n                ]\n              },\n              \"unit\": \"ops\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"OOM Kills\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"dark-red\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 913\n          },\n          \"id\": 307,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\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\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_vmstat_oom_kill{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"OOM Kills\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"OOM Killer\",\n          \"type\": \"timeseries\"\n        }\n      ],\n      \"title\": \"Memory Vmstat\",\n      \"type\": \"row\"\n    },\n    {\n      \"collapsed\": true,\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\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Tracks the system clock's estimated and maximum error, as well as its offset from the reference clock (e.g., via NTP). Useful for detecting synchronization drift\",\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\": 20,\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                  }\n                ]\n              },\n              \"unit\": \"s\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 734\n          },\n          \"id\": 260,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\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\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_timex_estimated_error_seconds{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"Estimated error\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_timex_offset_seconds{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"Offset local vs reference\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_timex_maxerror_seconds{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"Maximum error\",\n              \"range\": true,\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\": \"${ds_prometheus}\"\n          },\n          \"description\": \"NTP phase-locked loop (PLL) time constant used by the kernel to control time adjustments. Lower values mean faster correction but less stability\",\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\": 20,\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                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 734\n          },\n          \"id\": 291,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\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\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_timex_loop_time_constant{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"PLL Time Constant\",\n              \"range\": true,\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\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Shows whether the system clock is synchronized to a reliable time source, and the current frequency correction ratio applied by the kernel to maintain synchronization\",\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\": 20,\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                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 884\n          },\n          \"id\": 168,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\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\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_timex_sync_status{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"Sync status (1 = ok)\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_timex_frequency_adjustment_ratio{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"Frequency Adjustment\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_timex_tick_seconds{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"hide\": true,\n              \"interval\": \"\",\n              \"legendFormat\": \"Tick Interval\",\n              \"range\": true,\n              \"refId\": \"C\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_timex_tai_offset_seconds{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"hide\": true,\n              \"interval\": \"\",\n              \"legendFormat\": \"TAI Offset\",\n              \"range\": true,\n              \"refId\": \"D\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Time Synchronized Status\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Displays the PPS signal's frequency offset and stability (jitter) in hertz. Useful for monitoring high-precision time sources like GPS or atomic clocks\",\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\": 20,\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                  }\n                ]\n              },\n              \"unit\": \"rothz\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 884\n          },\n          \"id\": 333,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\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\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_timex_pps_frequency_hertz{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"PPS Frequency Offset\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_timex_pps_stability_hertz{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"PPS Frequency Stability\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"PPS Frequency / Stability\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Tracks PPS signal timing jitter and shift compared to system clock\",\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\": 20,\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                  }\n                ]\n              },\n              \"unit\": \"s\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 894\n          },\n          \"id\": 334,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\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\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_timex_pps_jitter_seconds{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"PPS Jitter\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_timex_pps_shift_seconds{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"PPS Shift\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"PPS Time Accuracy\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Rate of PPS synchronization diagnostics including calibration events, jitter violations, errors, and frequency stability exceedances\",\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\": 20,\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                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"ops\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 894\n          },\n          \"id\": 335,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\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\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_timex_pps_calibration_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"PPS Calibrations/sec\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_timex_pps_error_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"PPS Errors/sec\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_timex_pps_stability_exceeded_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"PPS Stability Exceeded/sec\",\n              \"range\": true,\n              \"refId\": \"C\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_timex_pps_jitter_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"PPS Jitter Events/sec\",\n              \"range\": true,\n              \"refId\": \"D\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"PPS Sync Events\",\n          \"type\": \"timeseries\"\n        }\n      ],\n      \"title\": \"System Timesync\",\n      \"type\": \"row\"\n    },\n    {\n      \"collapsed\": true,\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\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Processes currently in runnable or blocked states. Helps identify CPU contention or I/O wait bottlenecks.\",\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\": 20,\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              \"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\": 735\n          },\n          \"id\": 62,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\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\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_procs_blocked{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"Blocked (I/O Wait)\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_procs_running{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"Runnable (Ready for CPU)\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Processes Status\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Current number of processes in each state (e.g., running, sleeping, zombie). Requires --collector.processes to be enabled in node_exporter\",\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\": 20,\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                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"D\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"displayName\",\n                    \"value\": \"Uninterruptible Sleeping\"\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"I\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"displayName\",\n                    \"value\": \"Idle Kernel Thread\"\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"R\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"displayName\",\n                    \"value\": \"Running\"\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"S\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"displayName\",\n                    \"value\": \"Interruptible Sleeping\"\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"T\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"displayName\",\n                    \"value\": \"Stopped\"\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"X\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"displayName\",\n                    \"value\": \"Dead\"\n                  }\n                ]\n              },\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Z\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"displayName\",\n                    \"value\": \"Zombie\"\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 735\n          },\n          \"id\": 315,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\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\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_processes_state{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"{{ state }}\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Processes Detailed States\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Rate of new processes being created on the system (forks/sec).\",\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\": 20,\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              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  }\n                ]\n              },\n              \"unit\": \"ops\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 765\n          },\n          \"id\": 148,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\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\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_forks_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"Process Forks per second\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Processes Forks\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Shows CPU saturation per core, calculated as the proportion of time spent waiting to run relative to total time demanded (running + waiting).\",\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\": 20,\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                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"percentunit\"\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\": 765\n          },\n          \"id\": 305,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\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\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_schedstat_running_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"hide\": true,\n              \"interval\": \"\",\n              \"legendFormat\": \"CPU {{ cpu }} - Running\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_schedstat_waiting_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"hide\": true,\n              \"interval\": \"\",\n              \"legendFormat\": \"CPU {{cpu}} - Waiting Queue\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_schedstat_waiting_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\\n/\\n(irate(node_schedstat_running_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval]) + irate(node_schedstat_waiting_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval]))\\n\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"CPU {{cpu}}\",\n              \"range\": true,\n              \"refId\": \"C\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"CPU Saturation per Core\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Number of active PIDs on the system and the configured maximum allowed. Useful for detecting PID exhaustion risk. Requires --collector.processes in node_exporter\",\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\": 20,\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              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\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                    \"id\": \"custom.lineStyle\",\n                    \"value\": {\n                      \"dash\": [\n                        10,\n                        10\n                      ],\n                      \"fill\": \"dash\"\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 775\n          },\n          \"id\": 313,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\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\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_processes_pids{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"Number of PIDs\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_processes_max_processes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"PIDs limit\",\n              \"range\": true,\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\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Number of active threads on the system and the configured thread limit. Useful for monitoring thread pressure. Requires --collector.processes in node_exporter\",\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\": 20,\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              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\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                    \"id\": \"custom.lineStyle\",\n                    \"value\": {\n                      \"dash\": [\n                        10,\n                        10\n                      ],\n                      \"fill\": \"dash\"\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 775\n          },\n          \"id\": 314,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\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\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_processes_threads{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"Allocated threads\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_processes_max_threads{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"Threads limit\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Threads Number and Limit\",\n          \"type\": \"timeseries\"\n        }\n      ],\n      \"title\": \"System Processes\",\n      \"type\": \"row\"\n    },\n    {\n      \"collapsed\": true,\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\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Per-second rate of context switches and hardware interrupts. High values may indicate intense CPU or I/O activity\",\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\": 20,\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              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  }\n                ]\n              },\n              \"unit\": \"ops\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 816\n          },\n          \"id\": 8,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\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\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_context_switches_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"Context switches\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_intr_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"Interrupts\",\n              \"range\": true,\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\": \"${ds_prometheus}\"\n          },\n          \"description\": \"System load average over 1, 5, and 15 minutes. Reflects the number of active or waiting processes. Values above CPU core count may indicate overload\",\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\": 20,\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              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"CPU Core Count\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"custom.fillOpacity\",\n                    \"value\": 0\n                  },\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\": \"dark-red\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 816\n          },\n          \"id\": 7,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\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\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_load1{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"Load 1m\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_load5{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"Load 5m\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_load15{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"Load 15m\",\n              \"range\": true,\n              \"refId\": \"C\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"count(count(node_cpu_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\"}) by (cpu))\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"CPU Core Count\",\n              \"range\": true,\n              \"refId\": \"D\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"System Load\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Real-time CPU frequency scaling per core, including average minimum and maximum allowed scaling frequencies\",\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                \"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              },\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\": \"dark-red\",\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                \"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\": 826\n          },\n          \"id\": 321,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"hideZeros\": false,\n              \"mode\": \"multi\",\n              \"sort\": \"desc\"\n            }\n          },\n          \"pluginVersion\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_cpu_scaling_frequency_hertz{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"CPU {{ cpu }}\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"avg(node_cpu_scaling_frequency_max_hertz{instance=\\\"$node\\\",job=\\\"$job\\\"})\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"Max\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"avg(node_cpu_scaling_frequency_min_hertz{instance=\\\"$node\\\",job=\\\"$job\\\"})\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\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\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Rate of scheduling timeslices executed per CPU. Reflects how frequently the scheduler switches tasks on each core\",\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\": 20,\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                  }\n                ]\n              },\n              \"unit\": \"ops\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 826\n          },\n          \"id\": 306,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\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\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_schedstat_timeslices_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"CPU {{ cpu }}\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"CPU Schedule Timeslices\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Breaks down hardware interrupts by type and device. Useful for diagnosing IRQ load on network, disk, or CPU interfaces. Requires --collector.interrupts to be enabled in node_exporter\",\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\": 20,\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              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  }\n                ]\n              },\n              \"unit\": \"ops\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 836\n          },\n          \"id\": 259,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\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\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_interrupts_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"{{ type }} - {{ info }}\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"IRQ Detail\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Number of bits of entropy currently available to the system's random number generators (e.g., /dev/random). Low values may indicate that random number generation could block or degrade performance of cryptographic operations\",\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\": 20,\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              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  }\n                ]\n              },\n              \"unit\": \"decbits\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Entropy pool max\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"custom.fillOpacity\",\n                    \"value\": 0\n                  },\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\": \"dark-red\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 836\n          },\n          \"id\": 151,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\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\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_entropy_available_bits{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"Entropy available\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_entropy_pool_size_bits{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"Entropy pool max\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Entropy\",\n          \"type\": \"timeseries\"\n        }\n      ],\n      \"title\": \"System Misc\",\n      \"type\": \"row\"\n    },\n    {\n      \"collapsed\": true,\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\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Monitors hardware sensor temperatures and critical thresholds as exposed by Linux hwmon. Includes CPU, GPU, and motherboard sensors where available\",\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\": 20,\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              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\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          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 737\n          },\n          \"id\": 158,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\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\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\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              \"legendFormat\": \"{{ chip_name }} {{ sensor }}\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\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              \"legendFormat\": \"{{ chip_name }} {{ sensor }} Critical Alarm\",\n              \"refId\": \"B\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\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              \"legendFormat\": \"{{ chip_name }} {{ sensor }} Critical\",\n              \"range\": true,\n              \"refId\": \"C\",\n              \"step\": 240\n            },\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              \"legendFormat\": \"{{ chip_name }} {{ sensor }} Critical Historical\",\n              \"refId\": \"D\",\n              \"step\": 240\n            },\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              \"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\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Shows how hard each cooling device (fan/throttle) is working relative to its maximum capacity\",\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\": 20,\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                  }\n                ]\n              },\n              \"unit\": \"percent\"\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\": 737\n          },\n          \"id\": 300,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\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\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"100 * node_cooling_device_cur_state{instance=\\\"$node\\\",job=\\\"$job\\\"} / node_cooling_device_max_state{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"{{ name }} - {{ type }} \",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Cooling Device Utilization\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Shows the online status of power supplies (e.g., AC, battery). A value of 1-Yes indicates the power supply is active/online\",\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\": 20,\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                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"bool_yes_no\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 747\n          },\n          \"id\": 302,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\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\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_power_supply_online{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"{{ power_supply }} online\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Power Supply\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Displays the current fan speeds (RPM) from hardware sensors via the hwmon 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                \"barWidthFactor\": 0.6,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\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              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  }\n                ]\n              },\n              \"unit\": \"rotrpm\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 747\n          },\n          \"id\": 325,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\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\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_hwmon_fan_rpm{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              \"legendFormat\": \"{{ chip_name }} {{ sensor }}\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_hwmon_fan_min_rpm{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              \"legendFormat\": \"{{ chip_name }} {{ sensor }} rpm min\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Hardware Fan Speed\",\n          \"type\": \"timeseries\"\n        }\n      ],\n      \"title\": \"Hardware Misc\",\n      \"type\": \"row\"\n    },\n    {\n      \"collapsed\": true,\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\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Current number of systemd units in each operational state, such as active, failed, inactive, or transitioning\",\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\": 20,\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              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\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\": \"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\": \"Activating\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"#C8F2C2\",\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\": \"orange\",\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\": \"dark-blue\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 4228\n          },\n          \"id\": 298,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\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\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_systemd_units{instance=\\\"$node\\\",job=\\\"$job\\\",state=\\\"activating\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"Activating\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_systemd_units{instance=\\\"$node\\\",job=\\\"$job\\\",state=\\\"active\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"Active\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_systemd_units{instance=\\\"$node\\\",job=\\\"$job\\\",state=\\\"deactivating\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"Deactivating\",\n              \"range\": true,\n              \"refId\": \"C\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_systemd_units{instance=\\\"$node\\\",job=\\\"$job\\\",state=\\\"failed\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"Failed\",\n              \"range\": true,\n              \"refId\": \"D\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_systemd_units{instance=\\\"$node\\\",job=\\\"$job\\\",state=\\\"inactive\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"Inactive\",\n              \"range\": true,\n              \"refId\": \"E\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Systemd Units State\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Current number of active connections per systemd socket, as reported by the Node Exporter systemd collector\",\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\": 20,\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              \"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\": 4228\n          },\n          \"id\": 331,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\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\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_systemd_socket_current_connections{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"{{ name }}\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Systemd Sockets Current\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Rate of accepted connections per second for each systemd socket\",\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\": 20,\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              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  }\n                ]\n              },\n              \"unit\": \"eps\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 4238\n          },\n          \"id\": 297,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\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\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_systemd_socket_accepted_connections_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"{{ name }}\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Systemd Sockets Accepted\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Rate of systemd socket connection refusals per second, typically due to service unavailability or backlog overflow\",\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\": 20,\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              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  }\n                ]\n              },\n              \"unit\": \"eps\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 4238\n          },\n          \"id\": 332,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\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\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_systemd_socket_refused_connections_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"{{ name }}\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Systemd Sockets Refused\",\n          \"type\": \"timeseries\"\n        }\n      ],\n      \"title\": \"Systemd\",\n      \"type\": \"row\"\n    },\n    {\n      \"collapsed\": true,\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\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Number of I/O operations completed per second for the device (after merges), including both reads and writes\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisBorderShow\": false,\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"read (–) / write (+)\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"barWidthFactor\": 0.6,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\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                  }\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\": \"orange\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 29\n          },\n          \"id\": 9,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"hideZeros\": false,\n              \"mode\": \"single\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_disk_reads_completed_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"legendFormat\": \"{{device}} - Read\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_disk_writes_completed_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"legendFormat\": \"{{device}} - Write\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Disk Read/Write IOps\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${ds_prometheus}\"\n          },\n          \"description\": \"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                \"axisBorderShow\": false,\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"read (–) / write (+)\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"barWidthFactor\": 0.6,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\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                  }\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\": \"orange\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 29\n          },\n          \"id\": 33,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"hideZeros\": false,\n              \"mode\": \"single\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_disk_read_bytes_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"{{device}} - Read\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"exemplar\": false,\n              \"expr\": \"irate(node_disk_written_bytes_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"instant\": false,\n              \"legendFormat\": \"{{device}} - Write\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Disk Read/Write Data\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${ds_prometheus}\"\n          },\n          \"description\": \"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                \"axisBorderShow\": false,\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"read (–) / write (+)\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"barWidthFactor\": 0.6,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\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                  }\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\": \"orange\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 389\n          },\n          \"id\": 37,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"hideZeros\": false,\n              \"mode\": \"single\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\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              \"interval\": \"\",\n              \"legendFormat\": \"{{device}} - Read\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\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              \"interval\": \"\",\n              \"legendFormat\": \"{{device}} - Write\",\n              \"range\": true,\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\": \"${ds_prometheus}\"\n          },\n          \"description\": \"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                \"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\": 20,\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              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\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          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 389\n          },\n          \"id\": 35,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"hideZeros\": false,\n              \"mode\": \"single\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_disk_io_time_weighted_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"interval\": \"\",\n              \"legendFormat\": \"{{device}}\",\n              \"range\": true,\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\": \"${ds_prometheus}\"\n          },\n          \"description\": \"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                \"axisBorderShow\": false,\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"read (–) / write (+)\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"barWidthFactor\": 0.6,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\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                  }\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\": \"orange\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 399\n          },\n          \"id\": 133,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"hideZeros\": false,\n              \"mode\": \"single\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_disk_reads_merged_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"legendFormat\": \"{{device}} - Read\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_disk_writes_merged_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"legendFormat\": \"{{device}} - Write\",\n              \"range\": true,\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\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Percentage of time the disk spent actively processing I/O operations, including general I/O, discards (TRIM), and write cache flushes\",\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\": 20,\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              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\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\": \"orange\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 399\n          },\n          \"id\": 36,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"hideZeros\": false,\n              \"mode\": \"single\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_disk_io_time_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"interval\": \"\",\n              \"legendFormat\": \"{{device}} - General IO\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_disk_discard_time_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"interval\": \"\",\n              \"legendFormat\": \"{{device}} - Discard/TRIM\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_disk_flush_requests_time_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"interval\": \"\",\n              \"legendFormat\": \"{{device}} - Flush (write cache)\",\n              \"range\": true,\n              \"refId\": \"C\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Time Spent Doing I/Os\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Per-second rate of discard (TRIM) and flush (write cache) operations. Useful for monitoring low-level disk activity on SSDs and advanced storage\",\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\": 20,\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                  }\n                ]\n              },\n              \"unit\": \"ops\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/sda.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"orange\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 409\n          },\n          \"id\": 301,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"hideZeros\": false,\n              \"mode\": \"single\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_disk_discards_completed_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"interval\": \"\",\n              \"legendFormat\": \"{{device}} - Discards completed\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_disk_discards_merged_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"interval\": \"\",\n              \"legendFormat\": \"{{device}} - Discards merged\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_disk_flush_requests_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"interval\": \"\",\n              \"legendFormat\": \"{{device}} - Flush\",\n              \"range\": true,\n              \"refId\": \"C\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Disk Ops Discards / Flush\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Shows how many disk sectors are discarded (TRIMed) per second. Useful for monitoring SSD behavior and storage efficiency\",\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\": 20,\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                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/sda.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"orange\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 409\n          },\n          \"id\": 326,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"hideZeros\": false,\n              \"mode\": \"single\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_disk_discarded_sectors_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"interval\": \"\",\n              \"legendFormat\": \"{{device}}\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Disk Sectors Discarded Successfully\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Number of in-progress I/O requests at the time of sampling (active requests in the disk queue)\",\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\": 20,\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              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\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\": \"orange\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 419\n          },\n          \"id\": 34,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"hideZeros\": false,\n              \"mode\": \"single\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_disk_io_now{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"interval\": \"\",\n              \"legendFormat\": \"{{device}}\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Instantaneous Queue Size\",\n          \"type\": \"timeseries\"\n        }\n      ],\n      \"title\": \"Storage Disk\",\n      \"type\": \"row\"\n    },\n    {\n      \"collapsed\": true,\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\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Number of file descriptors currently allocated system-wide versus the system limit. Important for detecting descriptor exhaustion risks\",\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\": 20,\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              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  }\n                ]\n              },\n              \"unit\": \"short\"\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                    \"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\": \"dark-red\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 30\n          },\n          \"id\": 28,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true\n            },\n            \"tooltip\": {\n              \"hideZeros\": false,\n              \"mode\": \"single\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_filefd_maximum{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"Max open files\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_filefd_allocated{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"Open files\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"File Descriptor\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Number of free file nodes (inodes) available per mounted filesystem. A low count may prevent file creation even if disk space is available\",\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\": 20,\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              \"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\": 30\n          },\n          \"id\": 41,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\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\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_filesystem_files_free{instance=\\\"$node\\\",job=\\\"$job\\\",device!~'rootfs'}\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"{{mountpoint}}\",\n              \"range\": true,\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\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Indicates filesystems mounted in read-only mode or reporting device-level I/O errors.\",\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\": 20,\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              \"max\": 1,\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  }\n                ]\n              },\n              \"unit\": \"bool_yes_no\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 370\n          },\n          \"id\": 44,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\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\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_filesystem_readonly{instance=\\\"$node\\\",job=\\\"$job\\\",device!~'rootfs'}\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"{{mountpoint}} - ReadOnly\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_filesystem_device_error{instance=\\\"$node\\\",job=\\\"$job\\\",device!~'rootfs',fstype!~'tmpfs'}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"{{mountpoint}} - Device error\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Filesystem in ReadOnly / Error\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Number of file nodes (inodes) available per mounted filesystem. Reflects maximum file capacity regardless of disk size\",\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\": 20,\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              \"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\": 370\n          },\n          \"id\": 219,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\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\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_filesystem_files{instance=\\\"$node\\\",job=\\\"$job\\\",device!~'rootfs'}\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"{{mountpoint}}\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"File Nodes Size\",\n          \"type\": \"timeseries\"\n        }\n      ],\n      \"title\": \"Storage Filesystem\",\n      \"type\": \"row\"\n    },\n    {\n      \"collapsed\": true,\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\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Number of network packets received and transmitted per second, by 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\": \"out (-) / in (+)\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"barWidthFactor\": 0.6,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\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                  }\n                ]\n              },\n              \"unit\": \"pps\"\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\": 31\n          },\n          \"id\": 60,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true,\n              \"width\": 300\n            },\n            \"tooltip\": {\n              \"hideZeros\": false,\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"rate(node_network_receive_packets_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"{{device}} - Rx in\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"rate(node_network_transmit_packets_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"{{device}} - Tx out\",\n              \"range\": true,\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\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Rate of packet-level errors for each network interface. Receive errors may indicate physical or driver issues; transmit errors may reflect collisions or hardware faults\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisBorderShow\": false,\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"out (-) / in (+)\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"barWidthFactor\": 0.6,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\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                  }\n                ]\n              },\n              \"unit\": \"pps\"\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\": 31\n          },\n          \"id\": 142,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true,\n              \"width\": 300\n            },\n            \"tooltip\": {\n              \"hideZeros\": false,\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"rate(node_network_receive_errs_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"{{device}} - Rx in\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"rate(node_network_transmit_errs_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"{{device}} - Tx out\",\n              \"range\": true,\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\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Rate of dropped packets per network interface. Receive drops can indicate buffer overflow or driver issues; transmit drops may result from outbound congestion or queuing limits\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisBorderShow\": false,\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"out (-) / in (+)\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"barWidthFactor\": 0.6,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\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                  }\n                ]\n              },\n              \"unit\": \"pps\"\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\": 251\n          },\n          \"id\": 143,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true,\n              \"width\": 300\n            },\n            \"tooltip\": {\n              \"hideZeros\": false,\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"rate(node_network_receive_drop_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"{{device}} - Rx in\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"rate(node_network_transmit_drop_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"{{device}} - Tx out\",\n              \"range\": true,\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\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Rate of compressed network packets received and transmitted per interface. These are common in low-bandwidth or special interfaces like PPP or SLIP\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisBorderShow\": false,\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"out (-) / in (+)\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"barWidthFactor\": 0.6,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\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                  }\n                ]\n              },\n              \"unit\": \"pps\"\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\": 251\n          },\n          \"id\": 141,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true,\n              \"width\": 300\n            },\n            \"tooltip\": {\n              \"hideZeros\": false,\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"rate(node_network_receive_compressed_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"{{device}} - Rx in\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"rate(node_network_transmit_compressed_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"{{device}} - Tx out\",\n              \"range\": true,\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\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Rate of incoming multicast packets received per network interface. Multicast is used by protocols such as mDNS, SSDP, and some streaming or cluster services\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisBorderShow\": false,\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"out (-) / in (+)\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"barWidthFactor\": 0.6,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\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                  }\n                ]\n              },\n              \"unit\": \"pps\"\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\": 261\n          },\n          \"id\": 146,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true,\n              \"width\": 300\n            },\n            \"tooltip\": {\n              \"hideZeros\": false,\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"rate(node_network_receive_multicast_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"{{device}} - Rx in\",\n              \"range\": true,\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\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Rate of received packets that could not be processed due to missing protocol or handler in the kernel. May indicate unsupported traffic or misconfiguration\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisBorderShow\": false,\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"out (-) / in (+)\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"barWidthFactor\": 0.6,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\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                  }\n                ]\n              },\n              \"unit\": \"pps\"\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\": 261\n          },\n          \"id\": 327,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true,\n              \"width\": 300\n            },\n            \"tooltip\": {\n              \"hideZeros\": false,\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"rate(node_network_receive_nohandler_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"{{device}} - Rx in\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Network Traffic NoHandler\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Rate of frame errors on received packets, typically caused by physical layer issues such as bad cables, duplex mismatches, or hardware problems\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisBorderShow\": false,\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"out (-) / in (+)\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"barWidthFactor\": 0.6,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\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                  }\n                ]\n              },\n              \"unit\": \"pps\"\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\": 271\n          },\n          \"id\": 145,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true,\n              \"width\": 300\n            },\n            \"tooltip\": {\n              \"hideZeros\": false,\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"rate(node_network_receive_frame_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"{{device}} - Rx in\",\n              \"range\": true,\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\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Tracks FIFO buffer overrun errors on network interfaces. These occur when incoming or outgoing packets are dropped due to queue or buffer overflows, often indicating congestion or hardware limits\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisBorderShow\": false,\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"out (-) / in (+)\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"barWidthFactor\": 0.6,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\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                  }\n                ]\n              },\n              \"unit\": \"pps\"\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\": 271\n          },\n          \"id\": 144,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true,\n              \"width\": 300\n            },\n            \"tooltip\": {\n              \"hideZeros\": false,\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"rate(node_network_receive_fifo_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"{{device}} - Rx in\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"rate(node_network_transmit_fifo_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"{{device}} - Tx out\",\n              \"range\": true,\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\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Rate of packet collisions detected during transmission. Mostly relevant on half-duplex or legacy Ethernet networks\",\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\": 20,\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                  }\n                ]\n              },\n              \"unit\": \"pps\"\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\": 281\n          },\n          \"id\": 232,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true,\n              \"width\": 300\n            },\n            \"tooltip\": {\n              \"hideZeros\": false,\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"rate(node_network_transmit_colls_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"{{device}} - Tx out\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Network Traffic Collision\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Rate of carrier errors during transmission. These typically indicate physical layer issues like faulty cabling or duplex mismatches\",\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\": 20,\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                  }\n                ]\n              },\n              \"unit\": \"pps\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 281\n          },\n          \"id\": 231,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true,\n              \"width\": 300\n            },\n            \"tooltip\": {\n              \"hideZeros\": false,\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"rate(node_network_transmit_carrier_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"{{device}} - Tx out\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Network Traffic Carrier Errors\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Number of ARP entries per interface. Useful for detecting excessive ARP traffic or table growth due to scanning or misconfiguration\",\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\": 20,\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              \"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\": 0,\n            \"y\": 291\n          },\n          \"id\": 230,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\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\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_arp_entries{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"{{ device }} ARP Table\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"ARP Entries\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Current and maximum connection tracking entries used by Netfilter (nf_conntrack). High usage approaching the limit may cause packet drops or connection issues\",\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\": 20,\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              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\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\": \"dark-red\",\n                      \"mode\": \"fixed\"\n                    }\n                  },\n                  {\n                    \"id\": \"custom.fillOpacity\",\n                    \"value\": 0\n                  },\n                  {\n                    \"id\": \"custom.lineStyle\",\n                    \"value\": {\n                      \"dash\": [\n                        10,\n                        10\n                      ],\n                      \"fill\": \"dash\"\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 291\n          },\n          \"id\": 61,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\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\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_nf_conntrack_entries{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"NF conntrack entries\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_nf_conntrack_entries_limit{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"NF conntrack limit\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"NF Conntrack\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Operational and physical link status of each network interface. Values are Yes for 'up' or link present, and No for 'down' or no carrier.\\\"\",\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\": 20,\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                  }\n                ]\n              },\n              \"unit\": \"bool_yes_no\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 301\n          },\n          \"id\": 309,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true,\n              \"width\": 300\n            },\n            \"tooltip\": {\n              \"hideZeros\": false,\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_network_up{operstate=\\\"up\\\",instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"hide\": true,\n              \"legendFormat\": \"{{interface}} - Operational state UP\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_network_carrier{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"instant\": false,\n              \"legendFormat\": \"{{device}} - Physical link\",\n              \"refId\": \"B\"\n            }\n          ],\n          \"title\": \"Network Operational Status\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Maximum speed of each network interface as reported by the operating system. This is a static hardware capability, not current throughput\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"thresholds\"\n              },\n              \"decimals\": 0,\n              \"fieldMinMax\": false,\n              \"links\": [],\n              \"mappings\": [],\n              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  }\n                ]\n              },\n              \"unit\": \"bps\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 6,\n            \"x\": 12,\n            \"y\": 301\n          },\n          \"id\": 280,\n          \"options\": {\n            \"displayMode\": \"basic\",\n            \"legend\": {\n              \"calcs\": [],\n              \"displayMode\": \"list\",\n              \"placement\": \"bottom\",\n              \"showLegend\": false\n            },\n            \"maxVizHeight\": 30,\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\": \"manual\",\n            \"valueMode\": \"color\"\n          },\n          \"pluginVersion\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_network_speed_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"} * 8\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"{{ device }}\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Speed\",\n          \"type\": \"bargauge\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${ds_prometheus}\"\n          },\n          \"description\": \"MTU (Maximum Transmission Unit) in bytes for each network interface. Affects packet size and transmission efficiency\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"thresholds\"\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              },\n              \"unit\": \"none\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 6,\n            \"x\": 18,\n            \"y\": 301\n          },\n          \"id\": 288,\n          \"options\": {\n            \"displayMode\": \"basic\",\n            \"legend\": {\n              \"calcs\": [],\n              \"displayMode\": \"list\",\n              \"placement\": \"bottom\",\n              \"showLegend\": false\n            },\n            \"maxVizHeight\": 30,\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\": \"manual\",\n            \"valueMode\": \"color\"\n          },\n          \"pluginVersion\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_network_mtu_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"{{ device }}\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"MTU\",\n          \"type\": \"bargauge\"\n        }\n      ],\n      \"title\": \"Network Traffic\",\n      \"type\": \"row\"\n    },\n    {\n      \"collapsed\": true,\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\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Tracks TCP socket usage and memory per node\",\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\": 20,\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              \"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\": 0,\n            \"y\": 32\n          },\n          \"id\": 63,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true,\n              \"width\": 300\n            },\n            \"tooltip\": {\n              \"hideZeros\": false,\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_sockstat_TCP_alloc{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"Allocated Sockets\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_sockstat_TCP_inuse{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"In-Use Sockets\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_sockstat_TCP_orphan{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"Orphaned Sockets\",\n              \"range\": true,\n              \"refId\": \"C\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_sockstat_TCP_tw{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"TIME_WAIT Sockets\",\n              \"range\": true,\n              \"refId\": \"D\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Sockstat TCP\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Number of UDP and UDPLite sockets currently in use\",\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\": 20,\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              \"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\": 32\n          },\n          \"id\": 124,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true,\n              \"width\": 300\n            },\n            \"tooltip\": {\n              \"hideZeros\": false,\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_sockstat_UDPLITE_inuse{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"UDPLite - In-Use Sockets\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_sockstat_UDP_inuse{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"UDP - In-Use Sockets\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Sockstat UDP\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Total number of sockets currently in use across all protocols (TCP, UDP, UNIX, etc.), as reported by /proc/net/sockstat\",\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\": 20,\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              \"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\": 0,\n            \"y\": 42\n          },\n          \"id\": 126,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true,\n              \"width\": 300\n            },\n            \"tooltip\": {\n              \"hideZeros\": false,\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_sockstat_sockets_used{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"Total sockets\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Sockstat Used\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Number of FRAG and RAW sockets currently in use. RAW sockets are used for custom protocols or tools like ping; FRAG sockets are used internally for IP packet defragmentation\",\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\": 20,\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              \"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\": 42\n          },\n          \"id\": 125,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true,\n              \"width\": 300\n            },\n            \"tooltip\": {\n              \"hideZeros\": false,\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_sockstat_FRAG_inuse{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"FRAG - In-Use Sockets\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_sockstat_RAW_inuse{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"RAW - In-Use Sockets\",\n              \"range\": true,\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\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Kernel memory used by TCP, UDP, and IP fragmentation buffers\",\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\": 20,\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              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  }\n                ]\n              },\n              \"unit\": \"bytes\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 52\n          },\n          \"id\": 220,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true,\n              \"width\": 300\n            },\n            \"tooltip\": {\n              \"hideZeros\": false,\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_sockstat_TCP_mem_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"TCP\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_sockstat_UDP_mem_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"UDP\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_sockstat_FRAG_memory{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"interval\": \"\",\n              \"legendFormat\": \"Fragmentation\",\n              \"range\": true,\n              \"refId\": \"C\"\n            }\n          ],\n          \"title\": \"Sockstat Memory Size\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Average memory used per socket (TCP/UDP). Helps tune net.ipv4.tcp_rmem / tcp_wmem\",\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\": 20,\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              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  }\n                ]\n              },\n              \"unit\": \"bytes\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 52\n          },\n          \"id\": 339,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true,\n              \"width\": 300\n            },\n            \"tooltip\": {\n              \"hideZeros\": false,\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_sockstat_TCP_mem_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"} / node_sockstat_TCP_inuse{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"TCP\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_sockstat_UDP_mem_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"} / node_sockstat_UDP_inuse{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"UDP\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Sockstat Average Socket Memory\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${ds_prometheus}\"\n          },\n          \"description\": \"TCP/UDP socket memory usage in kernel (in pages)\",\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\": 20,\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              \"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\": 0,\n            \"y\": 62\n          },\n          \"id\": 336,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true,\n              \"width\": 300\n            },\n            \"tooltip\": {\n              \"hideZeros\": false,\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_sockstat_TCP_mem{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"TCP\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_sockstat_UDP_mem{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"UDP\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"TCP/UDP Kernel Buffer Memory Pages\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Packets processed and dropped by the softnet network stack per CPU. Drops may indicate CPU saturation or network driver limitations\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisBorderShow\": false,\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"drop (-) / process (+)\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"barWidthFactor\": 0.6,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\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                  }\n                ]\n              },\n              \"unit\": \"pps\"\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\": 12,\n            \"y\": 62\n          },\n          \"id\": 290,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true,\n              \"width\": 300\n            },\n            \"tooltip\": {\n              \"hideZeros\": false,\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_softnet_processed_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"CPU {{cpu}} - Processed\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_softnet_dropped_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"CPU {{cpu}} - Dropped\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Softnet Packets\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${ds_prometheus}\"\n          },\n          \"description\": \"How often the kernel was unable to process all packets in the softnet queue before time ran out. Frequent squeezes may indicate CPU contention or driver inefficiency\",\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\": 20,\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                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"eps\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 72\n          },\n          \"id\": 310,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true,\n              \"width\": 300\n            },\n            \"tooltip\": {\n              \"hideZeros\": false,\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_softnet_times_squeezed_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"CPU {{cpu}} - Times Squeezed\",\n              \"range\": true,\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\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Tracks the number of packets processed or dropped by Receive Packet Steering (RPS), a mechanism to distribute packet processing across CPUs\",\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\": 20,\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                  }\n                ]\n              },\n              \"unit\": \"pps\"\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                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"dark-red\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 72\n          },\n          \"id\": 330,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true,\n              \"width\": 300\n            },\n            \"tooltip\": {\n              \"hideZeros\": false,\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_softnet_received_rps_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"CPU {{cpu}} - Processed\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_softnet_flow_limit_count_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"CPU {{cpu}} - Dropped\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Softnet RPS\",\n          \"type\": \"timeseries\"\n        }\n      ],\n      \"title\": \"Network Sockstat\",\n      \"type\": \"row\"\n    },\n    {\n      \"collapsed\": true,\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\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Rate of octets sent and received at the IP layer, as reported by /proc/net/netstat\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisBorderShow\": false,\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"out (-) / in (+)\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"barWidthFactor\": 0.6,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\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                  }\n                ]\n              },\n              \"unit\": \"Bps\"\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\": 163\n          },\n          \"id\": 221,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\n              ],\n              \"displayMode\": \"table\",\n              \"placement\": \"bottom\",\n              \"showLegend\": true,\n              \"width\": 300\n            },\n            \"tooltip\": {\n              \"hideZeros\": false,\n              \"mode\": \"multi\",\n              \"sort\": \"none\"\n            }\n          },\n          \"pluginVersion\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_netstat_IpExt_InOctets{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"IP Rx in\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_netstat_IpExt_OutOctets{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"legendFormat\": \"IP Tx out\",\n              \"range\": true,\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\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Rate of TCP segments sent and received per second, including data and control segments\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisBorderShow\": false,\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"out (-) / in (+)\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"barWidthFactor\": 0.6,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\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                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"pps\"\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            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 163\n          },\n          \"id\": 299,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\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\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_netstat_Tcp_InSegs{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"instant\": false,\n              \"interval\": \"\",\n              \"legendFormat\": \"TCP Rx in\",\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_netstat_Tcp_OutSegs{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"TCP Tx out\",\n              \"range\": true,\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\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Rate of UDP datagrams sent and received per second, based on /proc/net/netstat\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisBorderShow\": false,\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"out (-) / in (+)\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"barWidthFactor\": 0.6,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\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                  }\n                ]\n              },\n              \"unit\": \"pps\"\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\": 193\n          },\n          \"id\": 55,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\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\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_netstat_Udp_InDatagrams{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"UDP Rx in\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_netstat_Udp_OutDatagrams{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"UDP Tx out\",\n              \"range\": true,\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\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Number of ICMP messages sent and received per second, including error and control messages\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisBorderShow\": false,\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"out (-) / in (+)\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"barWidthFactor\": 0.6,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\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                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"pps\"\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\": 193\n          },\n          \"id\": 115,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\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\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_netstat_Icmp_InMsgs{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"ICMP Rx in\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_netstat_Icmp_OutMsgs{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"ICMP Tx out\",\n              \"range\": true,\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\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Tracks various TCP error and congestion-related events, including retransmissions, timeouts, dropped connections, and buffer issues\",\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\": 20,\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              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  }\n                ]\n              },\n              \"unit\": \"pps\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 203\n          },\n          \"id\": 104,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\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\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_netstat_TcpExt_ListenOverflows{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"Listen Overflows\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_netstat_TcpExt_ListenDrops{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"Listen Drops\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_netstat_TcpExt_TCPSynRetrans{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"SYN Retransmits\",\n              \"range\": true,\n              \"refId\": \"C\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_netstat_Tcp_RetransSegs{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"interval\": \"\",\n              \"legendFormat\": \"Segment Retransmits\",\n              \"range\": true,\n              \"refId\": \"D\"\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_netstat_Tcp_InErrs{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"interval\": \"\",\n              \"legendFormat\": \"Receive Errors\",\n              \"range\": true,\n              \"refId\": \"E\"\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_netstat_Tcp_OutRsts{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"interval\": \"\",\n              \"legendFormat\": \"RST Sent\",\n              \"range\": true,\n              \"refId\": \"F\"\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_netstat_TcpExt_TCPRcvQDrop{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"interval\": \"\",\n              \"legendFormat\": \"Receive Queue Drops\",\n              \"range\": true,\n              \"refId\": \"G\"\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_netstat_TcpExt_TCPOFOQueue{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"interval\": \"\",\n              \"legendFormat\": \"Out-of-order Queued\",\n              \"range\": true,\n              \"refId\": \"H\"\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_netstat_TcpExt_TCPTimeouts{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"interval\": \"\",\n              \"legendFormat\": \"TCP Timeouts\",\n              \"range\": true,\n              \"refId\": \"I\"\n            }\n          ],\n          \"title\": \"TCP Errors\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Rate of UDP and UDPLite datagram delivery errors, including missing listeners, buffer overflows, and protocol-specific issues\",\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\": 20,\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                  },\n                  {\n                    \"color\": \"red\",\n                    \"value\": 80\n                  }\n                ]\n              },\n              \"unit\": \"pps\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 203\n          },\n          \"id\": 109,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\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\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_netstat_Udp_InErrors{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"UDP Rx in Errors\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_netstat_Udp_NoPorts{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"UDP No Listener\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_netstat_UdpLite_InErrors{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"interval\": \"\",\n              \"legendFormat\": \"UDPLite Rx in Errors\",\n              \"range\": true,\n              \"refId\": \"C\"\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_netstat_Udp_RcvbufErrors{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"UDP Rx in Buffer Errors\",\n              \"range\": true,\n              \"refId\": \"D\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_netstat_Udp_SndbufErrors{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"UDP Tx out Buffer Errors\",\n              \"range\": true,\n              \"refId\": \"E\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"UDP Errors\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Rate of incoming ICMP messages that contained protocol-specific errors, such as bad checksums or invalid lengths\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"palette-classic\"\n              },\n              \"custom\": {\n                \"axisBorderShow\": false,\n                \"axisCenteredZero\": false,\n                \"axisColorMode\": \"text\",\n                \"axisLabel\": \"out (-) / in (+)\",\n                \"axisPlacement\": \"auto\",\n                \"barAlignment\": 0,\n                \"barWidthFactor\": 0.6,\n                \"drawStyle\": \"line\",\n                \"fillOpacity\": 20,\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                  }\n                ]\n              },\n              \"unit\": \"pps\"\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\": 213\n          },\n          \"id\": 50,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\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\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_netstat_Icmp_InErrors{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"ICMP Rx In\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"ICMP Errors\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Rate of TCP SYN cookies sent, validated, and failed. These are used to protect against SYN flood attacks and manage TCP handshake resources under load\",\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\": 20,\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                  }\n                ]\n              },\n              \"unit\": \"eps\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byRegexp\",\n                  \"options\": \"/.*Failed.*/\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"color\",\n                    \"value\": {\n                      \"fixedColor\": \"dark-red\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 213\n          },\n          \"id\": 91,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\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\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_netstat_TcpExt_SyncookiesFailed{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"SYN Cookies Failed\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_netstat_TcpExt_SyncookiesRecv{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"SYN Cookies Validated\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_netstat_TcpExt_SyncookiesSent{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"SYN Cookies Sent\",\n              \"range\": true,\n              \"refId\": \"C\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"TCP SynCookie\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Number of currently established TCP connections and the system's max supported limit. On Linux, MaxConn may return -1 to indicate a dynamic/unlimited configuration\",\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\": 20,\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              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\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                    \"id\": \"custom.lineStyle\",\n                    \"value\": {\n                      \"dash\": [\n                        10,\n                        10\n                      ],\n                      \"fill\": \"dash\"\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 223\n          },\n          \"id\": 85,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\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\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_netstat_Tcp_CurrEstab{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"Current Connections\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_netstat_Tcp_MaxConn{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"Max Connections\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"TCP Connections\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Number of UDP packets currently queued in the receive (RX) and transmit (TX) buffers. A growing queue may indicate a bottleneck\",\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\": 20,\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                  }\n                ]\n              },\n              \"unit\": \"short\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 223\n          },\n          \"id\": 337,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\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\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_udp_queues{instance=\\\"$node\\\",job=\\\"$job\\\",ip=\\\"v4\\\",queue=\\\"rx\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"UDP Rx in Queue\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_udp_queues{instance=\\\"$node\\\",job=\\\"$job\\\",ip=\\\"v4\\\",queue=\\\"tx\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"UDP Tx out Queue\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"UDP Queue\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Rate of TCP connection initiations per second. 'Active' opens are initiated by this host. 'Passive' opens are accepted from incoming connections\",\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\": 20,\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              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  }\n                ]\n              },\n              \"unit\": \"eps\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 0,\n            \"y\": 233\n          },\n          \"id\": 82,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\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\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_netstat_Tcp_ActiveOpens{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"Active Opens\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(node_netstat_Tcp_PassiveOpens{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"Passive Opens\",\n              \"range\": true,\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\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Number of TCP sockets in key connection states. Requires the --collector.tcpstat flag on node_exporter\",\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\": 20,\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              \"min\": 0,\n              \"noValue\": \"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\": 233\n          },\n          \"id\": 320,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\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\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_tcp_connection_states{state=\\\"established\\\",instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"Established\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_tcp_connection_states{state=\\\"fin_wait2\\\",instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"FIN_WAIT2\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_tcp_connection_states{state=\\\"listen\\\",instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"Listen\",\n              \"range\": true,\n              \"refId\": \"C\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_tcp_connection_states{state=\\\"time_wait\\\",instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"TIME_WAIT\",\n              \"range\": true,\n              \"refId\": \"D\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_tcp_connection_states{state=\\\"close_wait\\\", instance=\\\"$node\\\", job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"CLOSE_WAIT\",\n              \"range\": true,\n              \"refId\": \"E\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"TCP Stat\",\n          \"type\": \"timeseries\"\n        }\n      ],\n      \"title\": \"Network Netstat\",\n      \"type\": \"row\"\n    },\n    {\n      \"collapsed\": true,\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\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Duration of each individual collector executed during a Node Exporter scrape. Useful for identifying slow or failing collectors\",\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\": 20,\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              \"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\": 164\n          },\n          \"id\": 40,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\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\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_scrape_collector_duration_seconds{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"{{collector}}\",\n              \"range\": true,\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\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Rate of CPU time used by the process exposing this metric (user + system mode)\",\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\": 20,\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                  }\n                ]\n              },\n              \"unit\": \"percentunit\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 12,\n            \"x\": 12,\n            \"y\": 164\n          },\n          \"id\": 308,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\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\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"irate(process_cpu_seconds_total{instance=\\\"$node\\\",job=\\\"$job\\\"}[$__rate_interval])\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"Process CPU Usage\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Exporter Process CPU Usage\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Tracks the memory usage of the process exposing this metric (e.g., node_exporter), including current virtual memory and maximum virtual memory limit\",\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\": 20,\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              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  }\n                ]\n              },\n              \"unit\": \"bytes\"\n            },\n            \"overrides\": [\n              {\n                \"matcher\": {\n                  \"id\": \"byName\",\n                  \"options\": \"Virtual Memory Limit\"\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"custom.fillOpacity\",\n                    \"value\": 0\n                  },\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\": \"dark-red\",\n                      \"mode\": \"fixed\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"__systemRef\": \"hideSeriesFrom\",\n                \"matcher\": {\n                  \"id\": \"byNames\",\n                  \"options\": {\n                    \"mode\": \"exclude\",\n                    \"names\": [\n                      \"Virtual Memory\"\n                    ],\n                    \"prefix\": \"All except:\",\n                    \"readOnly\": true\n                  }\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"custom.hideFrom\",\n                    \"value\": {\n                      \"legend\": false,\n                      \"tooltip\": false,\n                      \"viz\": true\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 10,\n            \"x\": 0,\n            \"y\": 174\n          },\n          \"id\": 149,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\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\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"process_virtual_memory_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"interval\": \"\",\n              \"legendFormat\": \"Virtual Memory\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"process_virtual_memory_max_bytes{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"interval\": \"\",\n              \"legendFormat\": \"Virtual Memory Limit\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Exporter Processes Memory\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Number of file descriptors used by the exporter process versus its configured limit\",\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\": 20,\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              \"min\": 0,\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\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                    \"id\": \"custom.lineStyle\",\n                    \"value\": {\n                      \"dash\": [\n                        10,\n                        10\n                      ],\n                      \"fill\": \"dash\"\n                    }\n                  }\n                ]\n              },\n              {\n                \"__systemRef\": \"hideSeriesFrom\",\n                \"matcher\": {\n                  \"id\": \"byNames\",\n                  \"options\": {\n                    \"mode\": \"exclude\",\n                    \"names\": [\n                      \"Open file descriptors\"\n                    ],\n                    \"prefix\": \"All except:\",\n                    \"readOnly\": true\n                  }\n                },\n                \"properties\": [\n                  {\n                    \"id\": \"custom.hideFrom\",\n                    \"value\": {\n                      \"legend\": false,\n                      \"tooltip\": false,\n                      \"viz\": true\n                    }\n                  }\n                ]\n              }\n            ]\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 10,\n            \"x\": 10,\n            \"y\": 174\n          },\n          \"id\": 64,\n          \"options\": {\n            \"legend\": {\n              \"calcs\": [\n                \"min\",\n                \"mean\",\n                \"max\"\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\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"process_max_fds{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"interval\": \"\",\n              \"legendFormat\": \"Maximum open file descriptors\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"process_open_fds{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"interval\": \"\",\n              \"legendFormat\": \"Open file descriptors\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Exporter File Descriptor Usage\",\n          \"type\": \"timeseries\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${ds_prometheus}\"\n          },\n          \"description\": \"Shows whether each Node Exporter collector scraped successfully (1 = success, 0 = failure), and whether the textfile collector returned an error.\",\n          \"fieldConfig\": {\n            \"defaults\": {\n              \"color\": {\n                \"mode\": \"thresholds\"\n              },\n              \"links\": [],\n              \"mappings\": [],\n              \"thresholds\": {\n                \"mode\": \"absolute\",\n                \"steps\": [\n                  {\n                    \"color\": \"green\"\n                  },\n                  {\n                    \"color\": \"dark-red\",\n                    \"value\": 0\n                  },\n                  {\n                    \"color\": \"green\",\n                    \"value\": 1\n                  }\n                ]\n              },\n              \"unit\": \"bool\"\n            },\n            \"overrides\": []\n          },\n          \"gridPos\": {\n            \"h\": 10,\n            \"w\": 4,\n            \"x\": 20,\n            \"y\": 174\n          },\n          \"id\": 157,\n          \"options\": {\n            \"displayMode\": \"basic\",\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\": \"11.6.1\",\n          \"targets\": [\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"node_scrape_collector_success{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"{{collector}}\",\n              \"range\": true,\n              \"refId\": \"A\",\n              \"step\": 240\n            },\n            {\n              \"editorMode\": \"code\",\n              \"expr\": \"1 - node_textfile_scrape_error{instance=\\\"$node\\\",job=\\\"$job\\\"}\",\n              \"format\": \"time_series\",\n              \"interval\": \"\",\n              \"legendFormat\": \"textfile\",\n              \"range\": true,\n              \"refId\": \"B\",\n              \"step\": 240\n            }\n          ],\n          \"title\": \"Node Exporter Scrape\",\n          \"type\": \"bargauge\"\n        }\n      ],\n      \"title\": \"Node Exporter\",\n      \"type\": \"row\"\n    }\n  ],\n  \"refresh\": \"1m\",\n  \"schemaVersion\": 41,\n  \"tags\": [\n    \"linux\"\n  ],\n  \"templating\": {\n    \"list\": [\n      {\n        \"current\": {},\n        \"hide\": 2,\n        \"includeAll\": false,\n        \"label\": \"Datasource\",\n        \"name\": \"ds_prometheus\",\n        \"options\": [],\n        \"query\": \"prometheus\",\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"type\": \"datasource\"\n      },\n      {\n        \"current\": {},\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"${ds_prometheus}\"\n        },\n        \"definition\": \"\",\n        \"hide\": 2,\n        \"includeAll\": false,\n        \"label\": \"Job\",\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        \"sort\": 1,\n        \"type\": \"query\"\n      },\n      {\n        \"current\": {},\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"${ds_prometheus}\"\n        },\n        \"definition\": \"label_values(node_uname_info{job=\\\"$job\\\"}, nodename)\",\n        \"includeAll\": false,\n        \"label\": \"Server\",\n        \"name\": \"nodename\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"label_values(node_uname_info{job=\\\"$job\\\"}, nodename)\",\n          \"refId\": \"Prometheus-nodename-Variable-Query\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"sort\": 1,\n        \"type\": \"query\"\n      },\n      {\n        \"current\": {},\n        \"datasource\": {\n          \"type\": \"prometheus\",\n          \"uid\": \"${ds_prometheus}\"\n        },\n        \"definition\": \"label_values(node_uname_info{job=\\\"$job\\\", nodename=\\\"$nodename\\\"}, instance)\",\n        \"hide\": 2,\n        \"includeAll\": false,\n        \"label\": \"Instance\",\n        \"name\": \"node\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"label_values(node_uname_info{job=\\\"$job\\\", nodename=\\\"$nodename\\\"}, instance)\",\n          \"refId\": \"Prometheus-node-Variable-Query\"\n        },\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"sort\": 1,\n        \"type\": \"query\"\n      }\n    ]\n  },\n  \"time\": {\n    \"from\": \"now-3h\",\n    \"to\": \"now\"\n  },\n  \"timepicker\": {},\n  \"timezone\": \"browser\",\n  \"title\": \"Node Overview\",\n  \"uid\": \"rYdddlPWk\",\n  \"version\": 98,\n  \"weekStart\": \"\",\n  \"gnetId\": 1860\n}\n"
  },
  {
    "path": "grafana/node_overview.yml",
    "content": "---\n# config file version\napiVersion: 1\n\nproviders:\n- name: 'node_overview'\n  orgId: 1\n  folder: ''\n  type: file\n  options:\n    path: /usr/share/elephant-shed/grafana/node_overview.json\n    datasource: prometheus\n"
  },
  {
    "path": "grafana/postgresql_server_overview.json",
    "content": "{\n  \"__inputs\": [\n    {\n      \"name\": \"DS_PROMETHEUS\",\n      \"label\": \"DS_PROMETHEUS\",\n      \"description\": \"\",\n      \"type\": \"datasource\",\n      \"pluginId\": \"prometheus\",\n      \"pluginName\": \"Prometheus\"\n    }\n  ],\n  \"__requires\": [\n    {\n      \"type\": \"grafana\",\n      \"id\": \"grafana\",\n      \"name\": \"Grafana\",\n      \"version\": \"5.2.3\"\n    },\n    {\n      \"type\": \"panel\",\n      \"id\": \"graph\",\n      \"name\": \"Graph\",\n      \"version\": \"5.0.0\"\n    },\n    {\n      \"type\": \"datasource\",\n      \"id\": \"prometheus\",\n      \"name\": \"Prometheus\",\n      \"version\": \"5.0.0\"\n    },\n    {\n      \"type\": \"panel\",\n      \"id\": \"singlestat\",\n      \"name\": \"Singlestat\",\n      \"version\": \"5.0.0\"\n    },\n    {\n      \"type\": \"panel\",\n      \"id\": \"table\",\n      \"name\": \"Table\",\n      \"version\": \"5.0.0\"\n    }\n  ],\n  \"annotations\": {\n    \"list\": [\n      {\n        \"builtIn\": 1,\n        \"datasource\": \"-- Grafana --\",\n        \"enable\": true,\n        \"hide\": true,\n        \"iconColor\": \"rgba(0, 211, 255, 1)\",\n        \"name\": \"Annotations & Alerts\",\n        \"type\": \"dashboard\"\n      }\n    ]\n  },\n  \"description\": \"Overview over the most needed and many helpful metrics to manage and debug PostgreSQL servers.\",\n  \"editable\": true,\n  \"gnetId\": null,\n  \"graphTooltip\": 0,\n  \"id\": null,\n  \"iteration\": 1536240081130,\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\": 100,\n      \"panels\": [],\n      \"title\": \"Settings\",\n      \"type\": \"row\"\n    },\n    {\n      \"datasource\": \"${DS_PROMETHEUS}\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"custom\": {},\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"rgb(255, 255, 255)\",\n                \"value\": null\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 2,\n        \"x\": 0,\n        \"y\": 1\n      },\n      \"id\": 119,\n      \"interval\": null,\n      \"maxDataPoints\": 100,\n      \"options\": {\n        \"colorMode\": \"value\",\n        \"graphMode\": \"none\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"auto\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"mean\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"text\": {},\n        \"textMode\": \"name\"\n      },\n      \"pluginVersion\": \"7.4.3\",\n      \"targets\": [\n        {\n          \"exemplar\": false,\n          \"expr\": \"sql_server{host=~'$host',instance=~'$instance',sql_job=~'$cluster',col=\\\"server_start_time\\\"}\",\n          \"instant\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"{{server_version}}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Version\",\n      \"transformations\": [],\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": \"${DS_PROMETHEUS}\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"custom\": {},\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"rgb(255, 255, 255)\",\n                \"value\": null\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 2,\n        \"x\": 2,\n        \"y\": 1\n      },\n      \"id\": 115,\n      \"options\": {\n        \"colorMode\": \"value\",\n        \"graphMode\": \"none\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"auto\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"text\": {},\n        \"textMode\": \"auto\"\n      },\n      \"pluginVersion\": \"7.4.3\",\n      \"targets\": [\n        {\n          \"expr\": \"count(count(node_cpu_seconds_total{instance=~'$instance'}) without (mode,job)) without (cpu)\",\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"# Cores\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": \"${DS_PROMETHEUS}\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"custom\": {},\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"rgb(255, 255, 255)\",\n                \"value\": null\n              }\n            ]\n          },\n          \"unit\": \"bytes\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 2,\n        \"x\": 4,\n        \"y\": 1\n      },\n      \"id\": 112,\n      \"options\": {\n        \"colorMode\": \"value\",\n        \"graphMode\": \"none\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"auto\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"text\": {},\n        \"textMode\": \"auto\"\n      },\n      \"pluginVersion\": \"7.4.3\",\n      \"targets\": [\n        {\n          \"expr\": \"node_memory_MemTotal_bytes{instance=~'$instance'}\",\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Total Memory\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": \"${DS_PROMETHEUS}\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"custom\": {},\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"rgb(255, 255, 255)\",\n                \"value\": null\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 3,\n        \"x\": 6,\n        \"y\": 1\n      },\n      \"id\": 110,\n      \"options\": {\n        \"colorMode\": \"value\",\n        \"graphMode\": \"none\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"auto\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"text\": {},\n        \"textMode\": \"auto\"\n      },\n      \"pluginVersion\": \"7.4.3\",\n      \"targets\": [\n        {\n          \"expr\": \"sql_settings{col=\\\"max_connections\\\",host=~'$host',instance=~'$instance',sql_job=~'$cluster'}\",\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Max Connections\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": \"${DS_PROMETHEUS}\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"custom\": {},\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"rgb(255, 255, 255)\",\n                \"value\": null\n              }\n            ]\n          },\n          \"unit\": \"bytes\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 3,\n        \"x\": 9,\n        \"y\": 1\n      },\n      \"id\": 104,\n      \"options\": {\n        \"colorMode\": \"value\",\n        \"graphMode\": \"none\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"auto\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"text\": {},\n        \"textMode\": \"auto\"\n      },\n      \"pluginVersion\": \"7.4.3\",\n      \"targets\": [\n        {\n          \"expr\": \"sql_settings{col=\\\"work_mem\\\",host=~'$host',instance=~'$instance',sql_job=~'$cluster'}\",\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Work Mem\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": \"${DS_PROMETHEUS}\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"custom\": {},\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"rgb(255, 255, 255)\",\n                \"value\": null\n              }\n            ]\n          },\n          \"unit\": \"bytes\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 3,\n        \"x\": 12,\n        \"y\": 1\n      },\n      \"id\": 105,\n      \"options\": {\n        \"colorMode\": \"value\",\n        \"graphMode\": \"none\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"auto\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"text\": {},\n        \"textMode\": \"auto\"\n      },\n      \"pluginVersion\": \"7.4.3\",\n      \"targets\": [\n        {\n          \"expr\": \"sql_settings{col=\\\"shared_buffers\\\",host=~'$host',instance=~'$instance',sql_job=~'$cluster'}\",\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Shared Buffers\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": \"${DS_PROMETHEUS}\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"custom\": {},\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"rgb(255, 255, 255)\",\n                \"value\": null\n              }\n            ]\n          },\n          \"unit\": \"bytes\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 3,\n        \"x\": 15,\n        \"y\": 1\n      },\n      \"id\": 109,\n      \"options\": {\n        \"colorMode\": \"value\",\n        \"graphMode\": \"none\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"auto\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"text\": {},\n        \"textMode\": \"auto\"\n      },\n      \"pluginVersion\": \"7.4.3\",\n      \"targets\": [\n        {\n          \"expr\": \"sql_settings{col=\\\"max_wal_size\\\",host=~'$host',instance=~'$instance',sql_job=~'$cluster'}\",\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Max WAL Size\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": \"${DS_PROMETHEUS}\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"custom\": {},\n          \"mappings\": [\n            {\n              \"from\": \"\",\n              \"id\": 1,\n              \"text\": \"Off\",\n              \"to\": \"\",\n              \"type\": 1,\n              \"value\": \"0\"\n            },\n            {\n              \"from\": \"\",\n              \"id\": 2,\n              \"text\": \"On\",\n              \"to\": \"\",\n              \"type\": 1,\n              \"value\": \"1\"\n            }\n          ],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"rgb(255, 255, 255)\",\n                \"value\": null\n              }\n            ]\n          }\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 3,\n        \"x\": 18,\n        \"y\": 1\n      },\n      \"id\": 102,\n      \"options\": {\n        \"colorMode\": \"value\",\n        \"graphMode\": \"none\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"auto\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"text\": {},\n        \"textMode\": \"auto\"\n      },\n      \"pluginVersion\": \"7.4.3\",\n      \"targets\": [\n        {\n          \"expr\": \"sql_settings{col=\\\"data_checksums\\\",host=~'$host',instance=~'$instance',sql_job=~'$cluster'}\",\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Data Checksums\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": \"${DS_PROMETHEUS}\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"custom\": {},\n          \"mappings\": [],\n          \"noValue\": \"N/A\",\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"rgb(255, 255, 255)\",\n                \"value\": null\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 3,\n        \"x\": 21,\n        \"y\": 1\n      },\n      \"id\": 114,\n      \"options\": {\n        \"colorMode\": \"value\",\n        \"graphMode\": \"none\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"auto\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"text\": {},\n        \"textMode\": \"auto\"\n      },\n      \"pluginVersion\": \"7.4.3\",\n      \"targets\": [\n        {\n          \"expr\": \"sum by (checksum_failures) (sql_pg_stat_database{col=\\\"checksum_failures\\\",host=~'$host',instance=~'$instance',sql_job=~'$cluster'})\",\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Checksum Failures\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": \"${DS_PROMETHEUS}\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [\n            {\n              \"options\": {\n                \"0\": {\n                  \"index\": 1,\n                  \"text\": \"Standby\"\n                },\n                \"1\": {\n                  \"color\": \"dark-green\",\n                  \"index\": 0,\n                  \"text\": \"Primary\"\n                }\n              },\n              \"type\": \"value\"\n            }\n          ],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"rgb(255, 255, 255)\",\n                \"value\": 0\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 2,\n        \"x\": 0,\n        \"y\": 4\n      },\n      \"id\": 126,\n      \"maxDataPoints\": 100,\n      \"options\": {\n        \"colorMode\": \"value\",\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\": \"value\",\n        \"wideLayout\": true\n      },\n      \"pluginVersion\": \"12.3.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"uid\": \"${DS_PROMETHEUS}\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": false,\n          \"expr\": \"sql_server{col='server_is_primary',host=~'$host',instance=~'$instance',sql_job=~'$cluster'}\",\n          \"format\": \"time_series\",\n          \"instant\": true,\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"range\": false,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Role\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": \"${DS_PROMETHEUS}\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"custom\": {},\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"rgb(255, 255, 255)\",\n                \"value\": null\n              }\n            ]\n          },\n          \"unit\": \"dateTimeFromNow\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 4,\n        \"x\": 2,\n        \"y\": 4\n      },\n      \"id\": 106,\n      \"options\": {\n        \"colorMode\": \"value\",\n        \"graphMode\": \"none\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"auto\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"text\": {},\n        \"textMode\": \"auto\"\n      },\n      \"pluginVersion\": \"7.4.3\",\n      \"targets\": [\n        {\n          \"expr\": \"sql_server{col=\\\"server_start_time\\\", host=~'$host',instance=~'$instance',sql_job=~'$cluster'} * 1000\",\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Server Start Time\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": \"${DS_PROMETHEUS}\",\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"custom\": {},\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"rgb(255, 255, 255)\",\n                \"value\": null\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 3,\n        \"x\": 6,\n        \"y\": 4\n      },\n      \"id\": 120,\n      \"options\": {\n        \"colorMode\": \"value\",\n        \"graphMode\": \"none\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"auto\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"text\": {},\n        \"textMode\": \"auto\"\n      },\n      \"pluginVersion\": \"7.4.3\",\n      \"targets\": [\n        {\n          \"expr\": \"sql_settings{col=\\\"max_worker_processes\\\",host=~'$host',instance=~'$instance',sql_job=~'$cluster'}\",\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Max Worker Processes\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": \"${DS_PROMETHEUS}\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"custom\": {},\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"rgb(255, 255, 255)\",\n                \"value\": null\n              }\n            ]\n          },\n          \"unit\": \"bytes\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 3,\n        \"x\": 9,\n        \"y\": 4\n      },\n      \"id\": 107,\n      \"options\": {\n        \"colorMode\": \"value\",\n        \"graphMode\": \"none\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"auto\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"text\": {},\n        \"textMode\": \"auto\"\n      },\n      \"pluginVersion\": \"7.4.3\",\n      \"targets\": [\n        {\n          \"expr\": \"sql_settings{col=\\\"maintenance_work_mem\\\",host=~'$host',instance=~'$instance',sql_job=~'$cluster'}\",\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Maintenance Work Mem\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": \"${DS_PROMETHEUS}\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"custom\": {},\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"rgb(255, 255, 255)\",\n                \"value\": null\n              }\n            ]\n          },\n          \"unit\": \"bytes\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 3,\n        \"x\": 12,\n        \"y\": 4\n      },\n      \"id\": 108,\n      \"options\": {\n        \"colorMode\": \"value\",\n        \"graphMode\": \"none\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"auto\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"text\": {},\n        \"textMode\": \"auto\"\n      },\n      \"pluginVersion\": \"7.4.3\",\n      \"targets\": [\n        {\n          \"expr\": \"sql_settings{col=\\\"effective_cache_size\\\",host=~'$host',instance=~'$instance',sql_job=~'$cluster'}\",\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Effective Cache Size\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": \"${DS_PROMETHEUS}\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"custom\": {},\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"rgb(255, 255, 255)\",\n                \"value\": null\n              }\n            ]\n          },\n          \"unit\": \"s\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 3,\n        \"x\": 15,\n        \"y\": 4\n      },\n      \"id\": 111,\n      \"options\": {\n        \"colorMode\": \"value\",\n        \"graphMode\": \"none\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"auto\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"text\": {},\n        \"textMode\": \"auto\"\n      },\n      \"pluginVersion\": \"7.4.3\",\n      \"targets\": [\n        {\n          \"expr\": \"sql_settings{col=\\\"checkpoint_timeout\\\",host=~'$host',instance=~'$instance',sql_job=~'$cluster'}\",\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Checkpoint Timeout\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": \"${DS_PROMETHEUS}\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"custom\": {},\n          \"mappings\": [\n            {\n              \"from\": \"\",\n              \"id\": 1,\n              \"text\": \"Off\",\n              \"to\": \"\",\n              \"type\": 1,\n              \"value\": \"0\"\n            },\n            {\n              \"from\": \"\",\n              \"id\": 2,\n              \"text\": \"On\",\n              \"to\": \"\",\n              \"type\": 1,\n              \"value\": \"1\"\n            }\n          ],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"rgb(255, 255, 255)\",\n                \"value\": null\n              }\n            ]\n          }\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 3,\n        \"x\": 18,\n        \"y\": 4\n      },\n      \"id\": 103,\n      \"options\": {\n        \"colorMode\": \"value\",\n        \"graphMode\": \"none\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"auto\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"text\": {},\n        \"textMode\": \"auto\"\n      },\n      \"pluginVersion\": \"7.4.3\",\n      \"targets\": [\n        {\n          \"expr\": \"sql_settings{col=\\\"jit\\\",host=~'$host',instance=~'$instance',sql_job=~'$cluster'}\",\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"JIT\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": \"${DS_PROMETHEUS}\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"custom\": {},\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"rgb(255, 255, 255)\",\n                \"value\": null\n              }\n            ]\n          },\n          \"unit\": \"none\"\n        },\n        \"overrides\": [\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"requested (explicit, wal or backup-based)\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"displayName\"\n              }\n            ]\n          }\n        ]\n      },\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 3,\n        \"x\": 21,\n        \"y\": 4\n      },\n      \"id\": 113,\n      \"options\": {\n        \"colorMode\": \"value\",\n        \"graphMode\": \"none\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"auto\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"text\": {},\n        \"textMode\": \"auto\"\n      },\n      \"pluginVersion\": \"7.4.3\",\n      \"targets\": [\n        {\n          \"expr\": \"node_vmstat_oom_kill{instance=~'$instance'}\",\n          \"interval\": \"\",\n          \"legendFormat\": \"\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Out-of-Memory Kills\",\n      \"type\": \"stat\"\n    },\n    {\n      \"collapsed\": false,\n      \"datasource\": \"${DS_PROMETHEUS}\",\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 7\n      },\n      \"id\": 69,\n      \"panels\": [],\n      \"repeat\": null,\n      \"title\": \"Summary for $instance\",\n      \"type\": \"row\"\n    },\n    {\n      \"id\": 124,\n      \"type\": \"timeseries\",\n      \"title\": \"System Stats\",\n      \"gridPos\": {\n        \"x\": 0,\n        \"y\": 8,\n        \"h\": 7,\n        \"w\": 15\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"custom\": {\n            \"drawStyle\": \"line\",\n            \"lineInterpolation\": \"linear\",\n            \"barAlignment\": 0,\n            \"barWidthFactor\": 0.6,\n            \"lineWidth\": 1,\n            \"fillOpacity\": 10,\n            \"gradientMode\": \"none\",\n            \"spanNulls\": false,\n            \"insertNulls\": false,\n            \"showPoints\": \"never\",\n            \"pointSize\": 5,\n            \"stacking\": {\n              \"mode\": \"none\",\n              \"group\": \"A\"\n            },\n            \"axisPlacement\": \"auto\",\n            \"axisLabel\": \"\",\n            \"axisColorMode\": \"text\",\n            \"axisBorderShow\": false,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"axisCenteredZero\": false,\n            \"hideFrom\": {\n              \"tooltip\": false,\n              \"viz\": false,\n              \"legend\": false\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            },\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            }\n          },\n          \"color\": {\n            \"mode\": \"palette-classic\"\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          \"min\": 0,\n          \"unit\": \"percentunit\"\n        },\n        \"overrides\": [\n          {\n            \"matcher\": {\n              \"id\": \"byValue\",\n              \"options\": {\n                \"op\": \"gte\",\n                \"reducer\": \"allIsZero\",\n                \"value\": 0\n              }\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.hideFrom\",\n                \"value\": {\n                  \"legend\": true,\n                  \"tooltip\": true,\n                  \"viz\": false\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byValue\",\n              \"options\": {\n                \"op\": \"gte\",\n                \"reducer\": \"allIsNull\",\n                \"value\": 0\n              }\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.hideFrom\",\n                \"value\": {\n                  \"legend\": true,\n                  \"tooltip\": true,\n                  \"viz\": false\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byValue\",\n              \"options\": {\n                \"op\": \"gte\",\n                \"reducer\": \"allIsZero\",\n                \"value\": 0\n              }\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.hideFrom\",\n                \"value\": {\n                  \"legend\": true,\n                  \"tooltip\": true,\n                  \"viz\": false\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byValue\",\n              \"options\": {\n                \"op\": \"gte\",\n                \"reducer\": \"allIsNull\",\n                \"value\": 0\n              }\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.hideFrom\",\n                \"value\": {\n                  \"legend\": true,\n                  \"tooltip\": true,\n                  \"viz\": false\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byValue\",\n              \"options\": {\n                \"op\": \"gte\",\n                \"reducer\": \"allIsZero\",\n                \"value\": 0\n              }\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.hideFrom\",\n                \"value\": {\n                  \"legend\": true,\n                  \"tooltip\": true,\n                  \"viz\": false\n                }\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byValue\",\n              \"options\": {\n                \"op\": \"gte\",\n                \"reducer\": \"allIsNull\",\n                \"value\": 0\n              }\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.hideFrom\",\n                \"value\": {\n                  \"legend\": true,\n                  \"tooltip\": true,\n                  \"viz\": false\n                }\n              }\n            ]\n          }\n        ]\n      },\n      \"pluginVersion\": \"12.0.2\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"uid\": \"${DS_PROMETHEUS}\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"1 - (avg by (instance) (rate(node_cpu_seconds_total{mode=\\\"idle\\\", instance=~'$instance'}[$rate_interval])))\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"CPU\",\n          \"metric\": \"node_cpu\",\n          \"range\": true,\n          \"refId\": \"A\",\n          \"step\": 40\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${DS_PROMETHEUS}\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"clamp_min((1 - (node_memory_MemAvailable_bytes{instance='$instance'} / node_memory_MemTotal_bytes{instance='$instance'})), 0)\",\n          \"hide\": false,\n          \"instant\": false,\n          \"legendFormat\": \"Memory\",\n          \"range\": true,\n          \"refId\": \"B\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${DS_PROMETHEUS}\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"1 - min(node_filesystem_free_bytes{instance=~'$instance', mountpoint=~'$filesystem'} / node_filesystem_size_bytes{instance=~'$instance', mountpoint=~'$filesystem'})\",\n          \"hide\": false,\n          \"instant\": false,\n          \"legendFormat\": \"Storage\",\n          \"range\": true,\n          \"refId\": \"C\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${DS_PROMETHEUS}\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"max(irate(node_disk_io_time_seconds_total{instance='$instance',device=~'$disk'}[$rate_interval]))\",\n          \"hide\": false,\n          \"instant\": false,\n          \"legendFormat\": \"I/O\",\n          \"range\": true,\n          \"refId\": \"D\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${DS_PROMETHEUS}\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"node_memory_SwapCached_bytes{instance=~'$instance'} / (node_memory_SwapCached_bytes{instance=~'$instance'} + node_memory_SwapFree_bytes{instance=~'$instance'})\",\n          \"hide\": false,\n          \"instant\": false,\n          \"legendFormat\": \"Swap\",\n          \"range\": true,\n          \"refId\": \"E\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${DS_PROMETHEUS}\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"sum(avg_over_time(sql_pg_stat_activity{host=~'$host', instance=~'$instance', sql_job=~'$cluster', col=\\\"count\\\"}[$rate_interval])) / (sum(sql_settings{host=~'$host', instance=~'$instance', sql_job=~'$cluster', col='max_connections'}) - sum(sql_settings{host=~'$host', instance=~'$instance', sql_job=~'$cluster', col='superuser_reserved_connections'}))\",\n          \"hide\": false,\n          \"instant\": false,\n          \"legendFormat\": \"Connections\",\n          \"range\": true,\n          \"refId\": \"F\"\n        }\n      ],\n      \"datasource\": {\n        \"uid\": \"${DS_PROMETHEUS}\"\n      },\n      \"options\": {\n        \"tooltip\": {\n          \"mode\": \"multi\",\n          \"sort\": \"none\",\n          \"hideZeros\": false\n        },\n        \"legend\": {\n          \"showLegend\": true,\n          \"displayMode\": \"table\",\n          \"placement\": \"right\",\n          \"calcs\": [\n            \"min\",\n            \"mean\",\n            \"max\"\n          ]\n        },\n        \"alertThreshold\": true\n      }\n    },\n    {\n      \"datasource\": {\n        \"uid\": \"${DS_PROMETHEUS}\"\n      },\n      \"description\": \"How often tasks experience CPU, memory, or I/O delays. “Some” indicates partial slowdown; “Full” indicates all tasks are stalled. Based on Linux PSI metrics:\\nhttps://docs.kernel.org/accounting/psi.html\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisBorderShow\": false,\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"some (-) / full (+)\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"barWidthFactor\": 0.6,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 10,\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\": \"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\": \"percentunit\"\n        },\n        \"overrides\": [\n          {\n            \"matcher\": {\n              \"id\": \"byRegexp\",\n              \"options\": \"/.*Some.*/\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.fillOpacity\",\n                \"value\": 0\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byRegexp\",\n              \"options\": \"/.*Some.*/\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.transform\",\n                \"value\": \"negative-Y\"\n              }\n            ]\n          }\n        ]\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 9,\n        \"x\": 15,\n        \"y\": 8\n      },\n      \"id\": 125,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [\n            \"min\",\n            \"mean\",\n            \"max\"\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.2.1\",\n      \"targets\": [\n        {\n          \"editorMode\": \"code\",\n          \"expr\": \"rate(node_pressure_cpu_waiting_seconds_total{instance='$instance'}[$rate_interval])\",\n          \"format\": \"time_series\",\n          \"legendFormat\": \"CPU - Some\",\n          \"range\": true,\n          \"refId\": \"CPU some\",\n          \"step\": 240\n        },\n        {\n          \"editorMode\": \"code\",\n          \"expr\": \"rate(node_pressure_memory_waiting_seconds_total{instance='$instance'}[$rate_interval])\",\n          \"format\": \"time_series\",\n          \"legendFormat\": \"Memory - Some\",\n          \"range\": true,\n          \"refId\": \"Memory some\",\n          \"step\": 240\n        },\n        {\n          \"editorMode\": \"code\",\n          \"expr\": \"rate(node_pressure_memory_stalled_seconds_total{instance='$instance'}[$rate_interval])\",\n          \"format\": \"time_series\",\n          \"legendFormat\": \"Memory - Full\",\n          \"range\": true,\n          \"refId\": \"Memory full\",\n          \"step\": 240\n        },\n        {\n          \"editorMode\": \"code\",\n          \"expr\": \"rate(node_pressure_io_waiting_seconds_total{instance='$instance'}[$rate_interval])\",\n          \"format\": \"time_series\",\n          \"legendFormat\": \"I/O - Some\",\n          \"range\": true,\n          \"refId\": \"I/O some\",\n          \"step\": 240\n        },\n        {\n          \"editorMode\": \"code\",\n          \"expr\": \"rate(node_pressure_io_stalled_seconds_total{instance='$instance'}[$rate_interval])\",\n          \"format\": \"time_series\",\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      \"cacheTimeout\": null,\n      \"colorBackground\": false,\n      \"colorValue\": true,\n      \"colors\": [\n        \"rgba(50, 172, 45, 0.97)\",\n        \"rgba(237, 129, 40, 0.89)\",\n        \"rgba(245, 54, 54, 0.9)\"\n      ],\n      \"datasource\": \"${DS_PROMETHEUS}\",\n      \"decimals\": 0,\n      \"description\": \"Number of WAL files that still need to be archived.\\n\\nCan grow under write load but should not increase over longer periods of time.\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"custom\": {}\n        },\n        \"overrides\": []\n      },\n      \"format\": \"none\",\n      \"gauge\": {\n        \"maxValue\": 3000,\n        \"minValue\": 0,\n        \"show\": true,\n        \"thresholdLabels\": false,\n        \"thresholdMarkers\": true\n      },\n      \"gridPos\": {\n        \"h\": 6,\n        \"w\": 4,\n        \"x\": 0,\n        \"y\": 14\n      },\n      \"id\": 45,\n      \"interval\": null,\n      \"links\": [],\n      \"mappingType\": 1,\n      \"mappingTypes\": [\n        {\n          \"name\": \"value to text\",\n          \"value\": 1\n        },\n        {\n          \"name\": \"range to text\",\n          \"value\": 2\n        }\n      ],\n      \"maxDataPoints\": 100,\n      \"nullPointMode\": \"connected\",\n      \"nullText\": null,\n      \"postfix\": \"\",\n      \"postfixFontSize\": \"50%\",\n      \"prefix\": \"\",\n      \"prefixFontSize\": \"50%\",\n      \"rangeMaps\": [\n        {\n          \"from\": \"null\",\n          \"text\": \"N/A\",\n          \"to\": \"null\"\n        }\n      ],\n      \"sparkline\": {\n        \"fillColor\": \"rgba(31, 118, 189, 0.02)\",\n        \"full\": false,\n        \"lineColor\": \"rgb(31, 120, 193)\",\n        \"show\": false\n      },\n      \"tableColumn\": \"\",\n      \"targets\": [\n        {\n          \"expr\": \"sql_archive_ready{host=~'$host', instance=~'$instance', sql_job=~'$cluster'}\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"\",\n          \"refId\": \"A\",\n          \"step\": 600\n        }\n      ],\n      \"thresholds\": \"1000,2000\",\n      \"title\": \"WAL Files Ready\",\n      \"transparent\": true,\n      \"type\": \"singlestat\",\n      \"valueFontSize\": \"70%\",\n      \"valueMaps\": [\n        {\n          \"op\": \"=\",\n          \"text\": \"0\",\n          \"value\": \"null\"\n        }\n      ],\n      \"valueName\": \"current\"\n    },\n    {\n      \"cacheTimeout\": null,\n      \"colorBackground\": false,\n      \"colorValue\": true,\n      \"colors\": [\n        \"rgba(50, 172, 45, 0.97)\",\n        \"rgba(237, 129, 40, 0.89)\",\n        \"rgba(245, 54, 54, 0.9)\"\n      ],\n      \"datasource\": \"${DS_PROMETHEUS}\",\n      \"decimals\": 0,\n      \"description\": \"The amount of WAL data that still needs to be archived.\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"custom\": {}\n        },\n        \"overrides\": []\n      },\n      \"format\": \"MBs\",\n      \"gauge\": {\n        \"maxValue\": 15,\n        \"minValue\": 0,\n        \"show\": true,\n        \"thresholdLabels\": false,\n        \"thresholdMarkers\": true\n      },\n      \"gridPos\": {\n        \"h\": 6,\n        \"w\": 4,\n        \"x\": 4,\n        \"y\": 14\n      },\n      \"id\": 50,\n      \"interval\": null,\n      \"links\": [],\n      \"mappingType\": 1,\n      \"mappingTypes\": [\n        {\n          \"name\": \"value to text\",\n          \"value\": 1\n        },\n        {\n          \"name\": \"range to text\",\n          \"value\": 2\n        }\n      ],\n      \"maxDataPoints\": 100,\n      \"nullPointMode\": \"connected\",\n      \"nullText\": null,\n      \"postfix\": \"\",\n      \"postfixFontSize\": \"50%\",\n      \"prefix\": \"\",\n      \"prefixFontSize\": \"50%\",\n      \"rangeMaps\": [\n        {\n          \"from\": \"null\",\n          \"text\": \"N/A\",\n          \"to\": \"null\"\n        }\n      ],\n      \"sparkline\": {\n        \"fillColor\": \"rgba(31, 118, 189, 0.18)\",\n        \"full\": false,\n        \"lineColor\": \"rgb(31, 120, 193)\",\n        \"show\": false\n      },\n      \"tableColumn\": \"\",\n      \"targets\": [\n        {\n          \"expr\": \"delta(sql_archive_ready{host=~'$host', instance=~'$instance', sql_job=~'$cluster'}[1h]) * 16 / 3600\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"\",\n          \"refId\": \"A\",\n          \"step\": 600\n        }\n      ],\n      \"thresholds\": \"5,10\",\n      \"title\": \"WAL Ready Growth [1h]\",\n      \"transparent\": true,\n      \"type\": \"singlestat\",\n      \"valueFontSize\": \"50%\",\n      \"valueMaps\": [\n        {\n          \"op\": \"=\",\n          \"text\": \"N/A\",\n          \"value\": \"null\"\n        }\n      ],\n      \"valueName\": \"current\"\n    },\n    {\n      \"cacheTimeout\": null,\n      \"colorBackground\": false,\n      \"colorValue\": true,\n      \"colors\": [\n        \"rgba(50, 172, 45, 0.97)\",\n        \"rgba(237, 129, 40, 0.89)\",\n        \"rgba(245, 54, 54, 0.9)\"\n      ],\n      \"datasource\": \"${DS_PROMETHEUS}\",\n      \"decimals\": 2,\n      \"description\": \"Shows the rate/increase in failed archive actions.\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"custom\": {}\n        },\n        \"overrides\": []\n      },\n      \"format\": \"none\",\n      \"gauge\": {\n        \"maxValue\": 3,\n        \"minValue\": 0,\n        \"show\": true,\n        \"thresholdLabels\": false,\n        \"thresholdMarkers\": true\n      },\n      \"gridPos\": {\n        \"h\": 6,\n        \"w\": 4,\n        \"x\": 8,\n        \"y\": 14\n      },\n      \"id\": 46,\n      \"interval\": null,\n      \"links\": [],\n      \"mappingType\": 1,\n      \"mappingTypes\": [\n        {\n          \"name\": \"value to text\",\n          \"value\": 1\n        },\n        {\n          \"name\": \"range to text\",\n          \"value\": 2\n        }\n      ],\n      \"maxDataPoints\": 100,\n      \"nullPointMode\": \"connected\",\n      \"nullText\": null,\n      \"postfix\": \"\",\n      \"postfixFontSize\": \"50%\",\n      \"prefix\": \"\",\n      \"prefixFontSize\": \"50%\",\n      \"rangeMaps\": [\n        {\n          \"from\": \"null\",\n          \"text\": \"N/A\",\n          \"to\": \"null\"\n        }\n      ],\n      \"sparkline\": {\n        \"fillColor\": \"rgba(31, 118, 189, 0.18)\",\n        \"full\": false,\n        \"lineColor\": \"rgb(31, 120, 193)\",\n        \"show\": false\n      },\n      \"tableColumn\": \"\",\n      \"targets\": [\n        {\n          \"expr\": \"increase(sql_pg_stat_archiver{host=~'$host', instance=~'$instance', sql_job=~'$cluster', col='failed_count'}[$rate_interval])\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"\",\n          \"refId\": \"A\",\n          \"step\": 600\n        }\n      ],\n      \"thresholds\": \"0.9,2.1\",\n      \"title\": \"WAL Archive Fails [$rate_interval]\",\n      \"transparent\": true,\n      \"type\": \"singlestat\",\n      \"valueFontSize\": \"70%\",\n      \"valueMaps\": [\n        {\n          \"op\": \"=\",\n          \"text\": \"N/A\",\n          \"value\": \"null\"\n        }\n      ],\n      \"valueName\": \"current\"\n    },\n    {\n      \"cacheTimeout\": null,\n      \"colorBackground\": false,\n      \"colorValue\": true,\n      \"colors\": [\n        \"rgba(50, 172, 45, 0.97)\",\n        \"rgba(237, 129, 40, 0.89)\",\n        \"rgba(245, 54, 54, 0.9)\"\n      ],\n      \"datasource\": \"${DS_PROMETHEUS}\",\n      \"decimals\": null,\n      \"description\": \"Active WAL senders in relation to max_wal_senders.\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"custom\": {}\n        },\n        \"overrides\": []\n      },\n      \"format\": \"percentunit\",\n      \"gauge\": {\n        \"maxValue\": 1,\n        \"minValue\": 0,\n        \"show\": true,\n        \"thresholdLabels\": false,\n        \"thresholdMarkers\": true\n      },\n      \"gridPos\": {\n        \"h\": 6,\n        \"w\": 4,\n        \"x\": 12,\n        \"y\": 14\n      },\n      \"id\": 43,\n      \"interval\": null,\n      \"links\": [],\n      \"mappingType\": 2,\n      \"mappingTypes\": [\n        {\n          \"name\": \"value to text\",\n          \"value\": 1\n        },\n        {\n          \"name\": \"range to text\",\n          \"value\": 2\n        }\n      ],\n      \"maxDataPoints\": 100,\n      \"nullPointMode\": \"connected\",\n      \"nullText\": null,\n      \"postfix\": \"\",\n      \"postfixFontSize\": \"50%\",\n      \"prefix\": \"\",\n      \"prefixFontSize\": \"50%\",\n      \"rangeMaps\": [\n        {\n          \"from\": \"null\",\n          \"text\": \"No WS\",\n          \"to\": \"null\"\n        }\n      ],\n      \"sparkline\": {\n        \"fillColor\": \"rgba(31, 118, 189, 0.18)\",\n        \"full\": false,\n        \"lineColor\": \"rgb(31, 120, 193)\",\n        \"show\": false\n      },\n      \"tableColumn\": \"\",\n      \"targets\": [\n        {\n          \"expr\": \"count(sql_pg_stat_replication{host=~'$host', instance=~'$instance', sql_job=~'$cluster', pid!='0', col='flush_lag_bytes'})/ scalar(sql_settings{host=~'$host', instance=~'$instance', sql_job=~'$cluster', col='max_wal_senders'})\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"\",\n          \"refId\": \"A\",\n          \"step\": 600\n        }\n      ],\n      \"thresholds\": \"0.7,0.85\",\n      \"title\": \"WAL Senders\",\n      \"transparent\": true,\n      \"type\": \"singlestat\",\n      \"valueFontSize\": \"50%\",\n      \"valueMaps\": [\n        {\n          \"op\": \"=\",\n          \"text\": \"\",\n          \"value\": \"\"\n        }\n      ],\n      \"valueName\": \"current\"\n    },\n    {\n      \"cacheTimeout\": null,\n      \"colorBackground\": false,\n      \"colorValue\": true,\n      \"colors\": [\n        \"rgba(50, 172, 45, 0.97)\",\n        \"rgba(237, 129, 40, 0.89)\",\n        \"rgba(245, 54, 54, 0.9)\"\n      ],\n      \"datasource\": \"${DS_PROMETHEUS}\",\n      \"description\": \"Shows the used prepared transactions.\\n\\n.\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"custom\": {}\n        },\n        \"overrides\": []\n      },\n      \"format\": \"none\",\n      \"gauge\": {\n        \"maxValue\": 1,\n        \"minValue\": 0,\n        \"show\": true,\n        \"thresholdLabels\": false,\n        \"thresholdMarkers\": true\n      },\n      \"gridPos\": {\n        \"h\": 6,\n        \"w\": 4,\n        \"x\": 16,\n        \"y\": 14\n      },\n      \"id\": 49,\n      \"interval\": null,\n      \"links\": [],\n      \"mappingType\": 1,\n      \"mappingTypes\": [\n        {\n          \"name\": \"value to text\",\n          \"value\": 1\n        },\n        {\n          \"name\": \"range to text\",\n          \"value\": 2\n        }\n      ],\n      \"maxDataPoints\": 100,\n      \"nullPointMode\": \"connected\",\n      \"nullText\": null,\n      \"postfix\": \"\",\n      \"postfixFontSize\": \"50%\",\n      \"prefix\": \"\",\n      \"prefixFontSize\": \"50%\",\n      \"rangeMaps\": [\n        {\n          \"from\": \"null\",\n          \"text\": \"N/A\",\n          \"to\": \"null\"\n        }\n      ],\n      \"sparkline\": {\n        \"fillColor\": \"rgba(31, 118, 189, 0.18)\",\n        \"full\": false,\n        \"lineColor\": \"rgb(31, 120, 193)\",\n        \"show\": false\n      },\n      \"tableColumn\": \"\",\n      \"targets\": [\n        {\n          \"expr\": \"sum(sql_prepared_transactions{host=~'$host', instance=~'$instance', sql_job=~'$cluster', col='count', datname=~'$datname'})\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"\",\n          \"refId\": \"A\",\n          \"step\": 600\n        }\n      ],\n      \"thresholds\": \"0.8,0.9\",\n      \"title\": \"Prepared Transactions\",\n      \"transparent\": true,\n      \"type\": \"singlestat\",\n      \"valueFontSize\": \"70%\",\n      \"valueMaps\": [\n        {\n          \"op\": \"=\",\n          \"text\": \"N/A\",\n          \"value\": \"null\"\n        }\n      ],\n      \"valueName\": \"current\"\n    },\n    {\n      \"cacheTimeout\": null,\n      \"colorBackground\": false,\n      \"colorValue\": true,\n      \"colors\": [\n        \"rgba(50, 172, 45, 0.97)\",\n        \"rgba(237, 129, 40, 0.89)\",\n        \"rgba(245, 54, 54, 0.9)\"\n      ],\n      \"datasource\": \"${DS_PROMETHEUS}\",\n      \"decimals\": 1,\n      \"description\": \"Shows the maximum of send_lag_bytes, flush_lag_bytes, replay_lag_bytes over all connected streaming receivers.\\nThis is not a sufficient way to monitor if a standby is up to date!\\nCan only give a hint if streaming is delayed.\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"custom\": {}\n        },\n        \"overrides\": []\n      },\n      \"format\": \"decbytes\",\n      \"gauge\": {\n        \"maxValue\": 1000000000,\n        \"minValue\": 0,\n        \"show\": true,\n        \"thresholdLabels\": false,\n        \"thresholdMarkers\": true\n      },\n      \"gridPos\": {\n        \"h\": 6,\n        \"w\": 4,\n        \"x\": 20,\n        \"y\": 14\n      },\n      \"id\": 64,\n      \"interval\": null,\n      \"links\": [],\n      \"mappingType\": 1,\n      \"mappingTypes\": [\n        {\n          \"name\": \"value to text\",\n          \"value\": 1\n        },\n        {\n          \"name\": \"range to text\",\n          \"value\": 2\n        }\n      ],\n      \"maxDataPoints\": 100,\n      \"nullPointMode\": \"connected\",\n      \"nullText\": null,\n      \"postfix\": \"\",\n      \"postfixFontSize\": \"50%\",\n      \"prefix\": \"\",\n      \"prefixFontSize\": \"50%\",\n      \"rangeMaps\": [\n        {\n          \"from\": \"null\",\n          \"text\": \"N/A\",\n          \"to\": \"null\"\n        }\n      ],\n      \"sparkline\": {\n        \"fillColor\": \"rgba(31, 118, 189, 0.18)\",\n        \"full\": false,\n        \"lineColor\": \"rgb(31, 120, 193)\",\n        \"show\": false\n      },\n      \"tableColumn\": \"\",\n      \"targets\": [\n        {\n          \"expr\": \"max(sql_pg_stat_replication{host=~'$host', instance=~'$instance', sql_job=~'$cluster', col=~'(send_lag_bytes|flush_lag_bytes|replay_lag_bytes)'})\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"\",\n          \"metric\": \"node_filesystem_free\",\n          \"refId\": \"A\",\n          \"step\": 300\n        }\n      ],\n      \"thresholds\": \"500000000,750000000\",\n      \"title\": \"Max Replication Lag\",\n      \"transparent\": true,\n      \"type\": \"singlestat\",\n      \"valueFontSize\": \"50%\",\n      \"valueMaps\": [\n        {\n          \"op\": \"=\",\n          \"text\": \"N/A\",\n          \"value\": \"null\"\n        }\n      ],\n      \"valueName\": \"current\"\n    },\n    {\n      \"collapsed\": false,\n      \"datasource\": \"${DS_PROMETHEUS}\",\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 62\n      },\n      \"id\": 76,\n      \"panels\": [],\n      \"repeat\": null,\n      \"title\": \"PostgreSQL Database Size\",\n      \"type\": \"row\"\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"${DS_PROMETHEUS}\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"custom\": {}\n        },\n        \"overrides\": []\n      },\n      \"fill\": 1,\n      \"fillGradient\": 0,\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 63\n      },\n      \"hiddenSeries\": false,\n      \"id\": 67,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"hideEmpty\": false,\n        \"hideZero\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"options\": {\n        \"alertThreshold\": true\n      },\n      \"percentage\": false,\n      \"pluginVersion\": \"7.4.3\",\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"rate(sql_pg_stat_database{host=~'$host', instance=~'$instance', sql_job=~'$cluster', datname=~'$datname', col='dbsize'}[$rate_interval])\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"{{datname}}\",\n          \"refId\": \"A\",\n          \"step\": 40\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeRegions\": [],\n      \"timeShift\": null,\n      \"title\": \"Database Growth [$rate_interval] - $datname\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"Bps\",\n          \"label\": \"\",\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": \"0\",\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"${DS_PROMETHEUS}\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"custom\": {}\n        },\n        \"overrides\": []\n      },\n      \"fill\": 1,\n      \"fillGradient\": 0,\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 63\n      },\n      \"hiddenSeries\": false,\n      \"id\": 68,\n      \"legend\": {\n        \"avg\": true,\n        \"current\": false,\n        \"hideEmpty\": false,\n        \"hideZero\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": true\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"options\": {\n        \"alertThreshold\": true\n      },\n      \"percentage\": false,\n      \"pluginVersion\": \"7.4.3\",\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"sql_pg_stat_database{host=~'$host', instance=~'$instance', sql_job=~'$cluster', datname=~'$datname', col='dbsize'}\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"{{datname}}\",\n          \"refId\": \"A\",\n          \"step\": 40\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeRegions\": [],\n      \"timeShift\": null,\n      \"title\": \"Database Size - $datname\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"bytes\",\n          \"label\": \"\",\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": \"0\",\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    },\n    {\n      \"collapsed\": false,\n      \"datasource\": \"${DS_PROMETHEUS}\",\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 70\n      },\n      \"id\": 75,\n      \"panels\": [],\n      \"repeat\": null,\n      \"title\": \"PostgreSQL Connections\",\n      \"type\": \"row\"\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"${DS_PROMETHEUS}\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"custom\": {}\n        },\n        \"overrides\": []\n      },\n      \"fill\": 1,\n      \"fillGradient\": 0,\n      \"gridPos\": {\n        \"h\": 9,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 71\n      },\n      \"hiddenSeries\": false,\n      \"id\": 6,\n      \"legend\": {\n        \"alignAsTable\": true,\n        \"avg\": true,\n        \"current\": true,\n        \"hideEmpty\": true,\n        \"hideZero\": true,\n        \"max\": true,\n        \"min\": false,\n        \"rightSide\": false,\n        \"show\": true,\n        \"sort\": \"avg\",\n        \"sortDesc\": false,\n        \"total\": false,\n        \"values\": true\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"options\": {\n        \"alertThreshold\": true\n      },\n      \"percentage\": false,\n      \"pluginVersion\": \"7.4.3\",\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [\n        {\n          \"$$hashKey\": \"object:5500\",\n          \"alias\": \"waiting\",\n          \"color\": \"#F2495C\"\n        },\n        {\n          \"$$hashKey\": \"object:5508\",\n          \"alias\": \"idle in transaction\",\n          \"color\": \"#FF9830\"\n        },\n        {\n          \"$$hashKey\": \"object:5516\",\n          \"alias\": \"active\",\n          \"color\": \"#73BF69\"\n        },\n        {\n          \"$$hashKey\": \"object:5530\",\n          \"alias\": \"idle\",\n          \"color\": \"#5794F2\"\n        },\n        {\n          \"$$hashKey\": \"object:743\",\n          \"alias\": \"idle in transaction (aborted)\",\n          \"color\": \"#FADE2A\"\n        }\n      ],\n      \"spaceLength\": 10,\n      \"stack\": true,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"sort_desc(sum by (state) (sql_pg_stat_activity{host=~'$host', instance=~'$instance', sql_job=~'$cluster', col='count', datname=~'$datname'}))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"{{state}}\",\n          \"metric\": \"sql_pg_stat_activity\",\n          \"refId\": \"A\",\n          \"step\": 60\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeRegions\": [],\n      \"timeShift\": null,\n      \"title\": \"Connections by State - $datname\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 2,\n        \"value_type\": \"individual\"\n      },\n      \"transformations\": [],\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"$$hashKey\": \"object:5021\",\n          \"decimals\": 0,\n          \"format\": \"short\",\n          \"label\": \"\",\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": \"0\",\n          \"show\": true\n        },\n        {\n          \"$$hashKey\": \"object:5022\",\n          \"decimals\": 3,\n          \"format\": \"short\",\n          \"label\": \"\",\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"${DS_PROMETHEUS}\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"custom\": {}\n        },\n        \"overrides\": []\n      },\n      \"fill\": 1,\n      \"fillGradient\": 0,\n      \"gridPos\": {\n        \"h\": 9,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 71\n      },\n      \"hiddenSeries\": false,\n      \"id\": 9,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"options\": {\n        \"alertThreshold\": true\n      },\n      \"percentage\": false,\n      \"pluginVersion\": \"7.4.3\",\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [\n        {\n          \"$$hashKey\": \"object:1166\"\n        }\n      ],\n      \"spaceLength\": 10,\n      \"stack\": true,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"sum by (datname) (sql_pg_stat_activity{host=~'$host', instance=~'$instance', sql_job=~'$cluster', col='count', datname=~'$datname'})\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"{{datname}}\",\n          \"metric\": \"sql_pg_stat_activity\",\n          \"refId\": \"A\",\n          \"step\": 60\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeRegions\": [],\n      \"timeShift\": null,\n      \"title\": \"Connections by Database - $datname\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"$$hashKey\": \"object:715\",\n          \"decimals\": 0,\n          \"format\": \"short\",\n          \"label\": \"\",\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": \"0\",\n          \"show\": true\n        },\n        {\n          \"$$hashKey\": \"object:716\",\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    },\n    {\n      \"collapsed\": false,\n      \"datasource\": \"${DS_PROMETHEUS}\",\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 80\n      },\n      \"id\": 93,\n      \"panels\": [],\n      \"title\": \"PostgreSQL Transactions and Locks\",\n      \"type\": \"row\"\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"${DS_PROMETHEUS}\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"custom\": {}\n        },\n        \"overrides\": []\n      },\n      \"fill\": 1,\n      \"fillGradient\": 0,\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 7,\n        \"x\": 0,\n        \"y\": 81\n      },\n      \"hiddenSeries\": false,\n      \"id\": 10,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"options\": {\n        \"alertThreshold\": true\n      },\n      \"percentage\": false,\n      \"pluginVersion\": \"7.4.3\",\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"sum by (datname) (rate(sql_pg_stat_database{host=~'$host', instance=~'$instance', sql_job=~'$cluster', col='xact_commit', datname=~'$datname'}[$rate_interval]))\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"commits {{datname}}\",\n          \"metric\": \"sql_pg_stat_database\",\n          \"refId\": \"A\",\n          \"step\": 60\n        },\n        {\n          \"expr\": \"sum by (datname) (rate(sql_pg_stat_database{host=~'$host', instance=~'$instance', sql_job=~'$cluster', col='xact_rollback', datname=~'$datname'}[$rate_interval]))\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"rollbacks {{datname}}\",\n          \"refId\": \"B\",\n          \"step\": 60\n        },\n        {\n          \"expr\": \"rate(sql_txid{host=~'$host', instance=~'$instance', sql_job=~'$cluster'}[$rate_interval])\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"TXIDs (global)\",\n          \"refId\": \"C\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeRegions\": [],\n      \"timeShift\": null,\n      \"title\": \"Transactions by database [$rate_interval] - $datname\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"$$hashKey\": \"object:1487\",\n          \"format\": \"ops\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": \"0\",\n          \"show\": true\n        },\n        {\n          \"$$hashKey\": \"object:1488\",\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"${DS_PROMETHEUS}\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"custom\": {}\n        },\n        \"overrides\": []\n      },\n      \"fill\": 1,\n      \"fillGradient\": 0,\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 5,\n        \"x\": 7,\n        \"y\": 81\n      },\n      \"hiddenSeries\": false,\n      \"id\": 91,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": true,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": true\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"options\": {\n        \"alertThreshold\": true\n      },\n      \"percentage\": false,\n      \"pluginVersion\": \"7.4.3\",\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"max by (datname) (sql_pg_stat_activity{host=~'$host', instance=~'$instance', sql_job=~'$cluster', col='max_tx_duration', datname=~'$datname'})\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{datname}}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeRegions\": [],\n      \"timeShift\": null,\n      \"title\": \"Maximum Transaction Age\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"$$hashKey\": \"object:1565\",\n          \"format\": \"s\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": \"0\",\n          \"show\": true\n        },\n        {\n          \"$$hashKey\": \"object:1566\",\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    },\n    {\n      \"aliasColors\": {\n        \"AccessExclusiveLock\": \"#99440A\",\n        \"ExclusiveLock\": \"#BF1B00\"\n      },\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"${DS_PROMETHEUS}\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"custom\": {}\n        },\n        \"overrides\": []\n      },\n      \"fill\": 1,\n      \"fillGradient\": 0,\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 6,\n        \"x\": 12,\n        \"y\": 81\n      },\n      \"hiddenSeries\": false,\n      \"id\": 42,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"options\": {\n        \"alertThreshold\": true\n      },\n      \"percentage\": false,\n      \"pluginVersion\": \"7.4.3\",\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [\n        {\n          \"$$hashKey\": \"object:1299\",\n          \"alias\": \"ExclusiveLock\",\n          \"color\": \"#BF1B00\",\n          \"fill\": 6,\n          \"linewidth\": 4\n        },\n        {\n          \"$$hashKey\": \"object:1300\",\n          \"alias\": \"AccessExclusiveLock\",\n          \"color\": \"#58140C\"\n        }\n      ],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"sum (sql_pg_locks{host=~'$host', instance=~'$instance', sql_job=~'$cluster', datname=~'$datname'}) by (mode)\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"{{ mode }}\",\n          \"refId\": \"A\",\n          \"step\": 20\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeRegions\": [],\n      \"timeShift\": null,\n      \"title\": \"Locks - $datname\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"$$hashKey\": \"object:1317\",\n          \"decimals\": 0,\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": \"0\",\n          \"show\": true\n        },\n        {\n          \"$$hashKey\": \"object:1318\",\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"${DS_PROMETHEUS}\",\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"custom\": {}\n        },\n        \"overrides\": []\n      },\n      \"fill\": 1,\n      \"fillGradient\": 0,\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 6,\n        \"x\": 18,\n        \"y\": 81\n      },\n      \"hiddenSeries\": false,\n      \"id\": 121,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"options\": {\n        \"alertThreshold\": true\n      },\n      \"percentage\": false,\n      \"pluginVersion\": \"7.4.3\",\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [\n        {\n          \"$$hashKey\": \"object:1071\",\n          \"alias\": \"/.*/\",\n          \"color\": \"#FADE2A\"\n        }\n      ],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"rate(sql_pg_stat_database{host=~'$host', instance=~'$instance', sql_job=~'$cluster', col='deadlocks', datname=~'$datname'}[90s]) * 60\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"deadlocks {{datname}}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeRegions\": [],\n      \"timeShift\": null,\n      \"title\": \"Deadlocks -$datname\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"$$hashKey\": \"object:1085\",\n          \"decimals\": 0,\n          \"format\": \"none\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": \"0\",\n          \"show\": true\n        },\n        {\n          \"$$hashKey\": \"object:1086\",\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    },\n    {\n      \"collapsed\": false,\n      \"datasource\": \"${DS_PROMETHEUS}\",\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 88\n      },\n      \"id\": 78,\n      \"panels\": [],\n      \"repeat\": null,\n      \"title\": \"PostgreSQL Tuple Activity\",\n      \"type\": \"row\"\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"${DS_PROMETHEUS}\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"custom\": {}\n        },\n        \"overrides\": []\n      },\n      \"fill\": 1,\n      \"fillGradient\": 0,\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 14,\n        \"x\": 0,\n        \"y\": 89\n      },\n      \"hiddenSeries\": false,\n      \"id\": 24,\n      \"legend\": {\n        \"alignAsTable\": false,\n        \"avg\": false,\n        \"current\": false,\n        \"hideZero\": false,\n        \"max\": false,\n        \"min\": false,\n        \"rightSide\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"options\": {\n        \"alertThreshold\": true\n      },\n      \"percentage\": false,\n      \"pluginVersion\": \"7.4.3\",\n      \"pointradius\": 2,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"rate(sql_pg_stat_database{host=~'$host', instance=~'$instance', sql_job=~'$cluster.*', datname=~'$datname', col='tup_returned'}[$rate_interval])\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"Select (table scan) {{datname}}\",\n          \"refId\": \"A\",\n          \"step\": 120\n        },\n        {\n          \"expr\": \"rate(sql_pg_stat_database{host=~'$host', instance=~'$instance', sql_job=~'$cluster.*', datname=~'$datname', col='tup_fetched'}[$rate_interval])\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"Select (index scan) {{datname}}\",\n          \"refId\": \"B\",\n          \"step\": 120\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeRegions\": [],\n      \"timeShift\": null,\n      \"title\": \"Read Stats [$rate_interval] - $datname\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"$$hashKey\": \"object:3090\",\n          \"format\": \"short\",\n          \"label\": \"Rows\",\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": \"0\",\n          \"show\": true\n        },\n        {\n          \"$$hashKey\": \"object:3091\",\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": false\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"${DS_PROMETHEUS}\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"custom\": {}\n        },\n        \"overrides\": []\n      },\n      \"fill\": 5,\n      \"fillGradient\": 0,\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 10,\n        \"x\": 14,\n        \"y\": 89\n      },\n      \"hiddenSeries\": false,\n      \"id\": 16,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"hideEmpty\": true,\n        \"hideZero\": true,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"options\": {\n        \"alertThreshold\": true\n      },\n      \"percentage\": false,\n      \"pluginVersion\": \"7.4.3\",\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": true,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"topk($ntop_relations, sql_pg_stat_user_tables{host=~'$host', instance=~'$instance', sql_job=~'$cluster.*', col='n_live_tup', datname=~'$datname'})\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"live {{schemaname}}.{{relname}} ({{database}})\",\n          \"metric\": \"sql_pg_stat_user_tables\",\n          \"refId\": \"A\",\n          \"step\": 40\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeRegions\": [],\n      \"timeShift\": null,\n      \"title\": \"Live Tuples (top $ntop_relations) - $datname\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"short\",\n          \"label\": \"\",\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": \"0\",\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"${DS_PROMETHEUS}\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"custom\": {}\n        },\n        \"overrides\": []\n      },\n      \"fill\": 1,\n      \"fillGradient\": 0,\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 14,\n        \"x\": 0,\n        \"y\": 96\n      },\n      \"hiddenSeries\": false,\n      \"id\": 122,\n      \"legend\": {\n        \"alignAsTable\": false,\n        \"avg\": false,\n        \"current\": false,\n        \"hideZero\": false,\n        \"max\": false,\n        \"min\": false,\n        \"rightSide\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"options\": {\n        \"alertThreshold\": true\n      },\n      \"percentage\": false,\n      \"pluginVersion\": \"7.4.3\",\n      \"pointradius\": 2,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"rate(sql_pg_stat_database{host=~'$host', instance=~'$instance', sql_job=~'$cluster.*', datname=~'$datname', col='tup_inserted'}[$rate_interval])\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"Insert {{datname}}\",\n          \"refId\": \"A\",\n          \"step\": 120\n        },\n        {\n          \"expr\": \"rate(sql_pg_stat_database{host=~'$host', instance=~'$instance', sql_job=~'$cluster.*', datname=~'$datname', col='tup_updated'}[$rate_interval])\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"Update {{datname}}\",\n          \"refId\": \"B\",\n          \"step\": 120\n        },\n        {\n          \"expr\": \"rate(sql_pg_stat_database{host=~'$host', instance=~'$instance', sql_job=~'$cluster.*', datname=~'$datname', col='tup_deleted'}[$rate_interval])\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"Delete {{datname}}\",\n          \"refId\": \"C\",\n          \"step\": 120\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeRegions\": [],\n      \"timeShift\": null,\n      \"title\": \"Change Stats [$rate_interval] - $datname\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"$$hashKey\": \"object:3016\",\n          \"format\": \"short\",\n          \"label\": \"Rows\",\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": \"0\",\n          \"show\": true\n        },\n        {\n          \"$$hashKey\": \"object:3017\",\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": false\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"${DS_PROMETHEUS}\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"custom\": {}\n        },\n        \"overrides\": []\n      },\n      \"fill\": 5,\n      \"fillGradient\": 0,\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 5,\n        \"x\": 14,\n        \"y\": 96\n      },\n      \"hiddenSeries\": false,\n      \"id\": 12,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"hideEmpty\": true,\n        \"hideZero\": true,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"options\": {\n        \"alertThreshold\": true\n      },\n      \"percentage\": false,\n      \"pluginVersion\": \"7.4.3\",\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": true,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"topk($ntop_relations, sql_pg_stat_user_tables{host=~'$host', instance=~'$instance', sql_job=~'$cluster.*', col='n_dead_tup', database=~'$datname'})\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"dead {{schemaname}}.{{relname}} ({{database}})\",\n          \"metric\": \"\",\n          \"refId\": \"B\",\n          \"step\": 40\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeRegions\": [],\n      \"timeShift\": null,\n      \"title\": \"Dead Tuples (top $ntop_relations) - $datname\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": \"0\",\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"${DS_PROMETHEUS}\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"custom\": {}\n        },\n        \"overrides\": []\n      },\n      \"fill\": 1,\n      \"fillGradient\": 0,\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 5,\n        \"x\": 19,\n        \"y\": 96\n      },\n      \"hiddenSeries\": false,\n      \"id\": 123,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"hideEmpty\": true,\n        \"hideZero\": true,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"options\": {\n        \"alertThreshold\": true\n      },\n      \"percentage\": false,\n      \"pluginVersion\": \"7.4.3\",\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"rate(sql_pg_stat_database{host=~'$host', instance=~'$instance', sql_job=~'$cluster', col='temp_bytes', datname=~'$datname'}[$rate_interval])\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"temp bytes {{datname}}\",\n          \"metric\": \"\",\n          \"refId\": \"B\",\n          \"step\": 40\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeRegions\": [],\n      \"timeShift\": null,\n      \"title\": \"Temp Files  [$rate_interval] - $datname\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"$$hashKey\": \"object:3200\",\n          \"format\": \"binBps\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": \"0\",\n          \"show\": true\n        },\n        {\n          \"$$hashKey\": \"object:3201\",\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    },\n    {\n      \"collapsed\": false,\n      \"datasource\": \"${DS_PROMETHEUS}\",\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 103\n      },\n      \"id\": 77,\n      \"panels\": [],\n      \"repeat\": null,\n      \"title\": \"PostgreSQL Table/Index Scans and Buffers\",\n      \"type\": \"row\"\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"${DS_PROMETHEUS}\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"custom\": {}\n        },\n        \"overrides\": []\n      },\n      \"fill\": 5,\n      \"fillGradient\": 0,\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 9,\n        \"x\": 0,\n        \"y\": 104\n      },\n      \"hiddenSeries\": false,\n      \"id\": 5,\n      \"legend\": {\n        \"alignAsTable\": true,\n        \"avg\": true,\n        \"current\": true,\n        \"hideEmpty\": true,\n        \"hideZero\": true,\n        \"max\": true,\n        \"min\": false,\n        \"rightSide\": false,\n        \"show\": true,\n        \"sort\": \"avg\",\n        \"sortDesc\": true,\n        \"total\": false,\n        \"values\": true\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"options\": {\n        \"alertThreshold\": true\n      },\n      \"percentage\": false,\n      \"pluginVersion\": \"7.4.3\",\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": true,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"topk($ntop_relations, rate(sql_pg_stat_user_tables{host=~'$host', instance=~'$instance', sql_job=~'$cluster.*', col='seq_tup_read', database=~'$datname'}[$rate_interval]))\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"seq scan tuples {{schemaname}}.{{relname}} ({{database}})\",\n          \"metric\": \"\",\n          \"refId\": \"B\",\n          \"step\": 40\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeRegions\": [],\n      \"timeShift\": null,\n      \"title\": \"Sequential Scan Tuples [$rate_interval] (top $ntop_relations) - $datname\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": \"0\",\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"${DS_PROMETHEUS}\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"custom\": {}\n        },\n        \"overrides\": []\n      },\n      \"fill\": 5,\n      \"fillGradient\": 0,\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 9,\n        \"x\": 9,\n        \"y\": 104\n      },\n      \"hiddenSeries\": false,\n      \"id\": 55,\n      \"legend\": {\n        \"alignAsTable\": true,\n        \"avg\": true,\n        \"current\": true,\n        \"hideEmpty\": true,\n        \"hideZero\": true,\n        \"max\": true,\n        \"min\": false,\n        \"rightSide\": false,\n        \"show\": true,\n        \"sort\": \"avg\",\n        \"sortDesc\": true,\n        \"total\": false,\n        \"values\": true\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"options\": {\n        \"alertThreshold\": true\n      },\n      \"percentage\": false,\n      \"pluginVersion\": \"7.4.3\",\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": true,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"topk($ntop_relations, rate(sql_pg_stat_user_tables{host=~'$host', instance=~'$instance', sql_job=~'$cluster.*', col='idx_tup_fetch', database=~'$datname'}[$rate_interval]))\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"index scan tuples {{schemaname}}.{{relname}} ({{database}})\",\n          \"metric\": \"sql_pg_stat_user_tables\",\n          \"refId\": \"A\",\n          \"step\": 40\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeRegions\": [],\n      \"timeShift\": null,\n      \"title\": \"Index Scan Tuples [$rate_interval] (top $ntop_relations) - $datname\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"none\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": \"0\",\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"${DS_PROMETHEUS}\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"custom\": {}\n        },\n        \"overrides\": []\n      },\n      \"fill\": 1,\n      \"fillGradient\": 0,\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 6,\n        \"x\": 18,\n        \"y\": 104\n      },\n      \"hiddenSeries\": false,\n      \"id\": 27,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"options\": {\n        \"alertThreshold\": true\n      },\n      \"percentage\": false,\n      \"pluginVersion\": \"7.4.3\",\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"sum(increase(sql_pg_stat_database{host=~'$host', instance=~'$instance', sql_job=~'$cluster', datname=~'$datname', col='blks_hit'}[$rate_interval])) / (sum(increase(sql_pg_stat_database{host=~'$host', instance=~'$instance', sql_job=~'$cluster', datname=~'$datname', col='blks_read'}[$rate_interval])) + sum(increase(sql_pg_stat_database{host=~'$host', instance=~'$instance', sql_job=~'$cluster', datname=~'$datname', col='blks_hit'}[$rate_interval])))\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"hit rate\",\n          \"refId\": \"A\",\n          \"step\": 60\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeRegions\": [],\n      \"timeShift\": null,\n      \"title\": \"Buffer Hit Rate [$rate_interval] - $datname\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"percentunit\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": 1,\n          \"min\": \"null\",\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    },\n    {\n      \"collapsed\": false,\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 112\n      },\n      \"id\": 126,\n      \"panels\": [],\n      \"title\": \"PostgreSQL I/O\",\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            \"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            \"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\": 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\": 0\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"ops\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 113\n      },\n      \"id\": 127,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [\n            \"mean\"\n          ],\n          \"displayMode\": \"table\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true,\n          \"sortBy\": \"Mean\",\n          \"sortDesc\": true\n        },\n        \"tooltip\": {\n          \"hideZeros\": false,\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"12.3.0\",\n      \"targets\": [\n        {\n          \"editorMode\": \"code\",\n          \"expr\": \"sum(rate(sql_pg_stat_io{host=~'$host', instance=~'$instance', sql_job=~'$cluster.*', col='reads'}[$rate_interval])) by (backend_type)\",\n          \"legendFormat\": \"{{backend_type}}\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Read IOPS by backend type\",\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\": \"off\"\n            }\n          },\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\": \"ops\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 113\n      },\n      \"id\": 128,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [\n            \"mean\"\n          ],\n          \"displayMode\": \"table\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true,\n          \"sortBy\": \"Mean\",\n          \"sortDesc\": true\n        },\n        \"tooltip\": {\n          \"hideZeros\": false,\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"12.3.0\",\n      \"targets\": [\n        {\n          \"editorMode\": \"code\",\n          \"expr\": \"sum(rate(sql_pg_stat_io{host=~'$host', instance=~'$instance', sql_job=~'$cluster.*', col='writes'}[$rate_interval])) by (backend_type)\",\n          \"legendFormat\": \"{{backend_type}}\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Write IOPS by backend type\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"collapsed\": false,\n      \"datasource\": \"${DS_PROMETHEUS}\",\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 120\n      },\n      \"id\": 80,\n      \"panels\": [],\n      \"repeat\": null,\n      \"title\": \"PostgreSQL Transaction Log and Checkpoints\",\n      \"type\": \"row\"\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"${DS_PROMETHEUS}\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"custom\": {}\n        },\n        \"overrides\": []\n      },\n      \"fill\": 1,\n      \"fillGradient\": 0,\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 7,\n        \"x\": 0,\n        \"y\": 121\n      },\n      \"hiddenSeries\": false,\n      \"id\": 26,\n      \"legend\": {\n        \"alignAsTable\": false,\n        \"avg\": true,\n        \"current\": true,\n        \"hideEmpty\": false,\n        \"hideZero\": false,\n        \"max\": true,\n        \"min\": true,\n        \"rightSide\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": true\n      },\n      \"lines\": true,\n      \"linewidth\": 2,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"options\": {\n        \"alertThreshold\": true\n      },\n      \"percentage\": false,\n      \"pluginVersion\": \"7.4.3\",\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"rate(sql_waldistance{host=~'$host', instance=~'$instance', sql_job=~'$cluster'}[$rate_interval])\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"WAL traffic\",\n          \"metric\": \"sql_waldistance\",\n          \"refId\": \"A\",\n          \"step\": 60\n        },\n        {\n          \"expr\": \"rate(sql_checkpoints{col=\\\"buffers\\\", host=~'$host', instance=~'$instance', sql_job=~'$cluster'}[$rate_interval]) * 8192\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"Checkpoint traffic\",\n          \"refId\": \"B\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeRegions\": [],\n      \"timeShift\": null,\n      \"title\": \"WAL/Checkpoint Traffic [$rate_interval]\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"Bps\",\n          \"label\": \"\",\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": \"0\",\n          \"show\": true\n        },\n        {\n          \"format\": \"decbytes\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": false\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"${DS_PROMETHEUS}\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"custom\": {}\n        },\n        \"overrides\": []\n      },\n      \"fill\": 1,\n      \"fillGradient\": 0,\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 9,\n        \"x\": 7,\n        \"y\": 121\n      },\n      \"hiddenSeries\": false,\n      \"id\": 29,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"options\": {\n        \"alertThreshold\": true\n      },\n      \"percentage\": false,\n      \"pluginVersion\": \"7.4.3\",\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [\n        {\n          \"$$hashKey\": \"object:795\",\n          \"alias\": \"requested (explicit, wal or backup-based)\",\n          \"color\": \"#FADE2A\"\n        },\n        {\n          \"$$hashKey\": \"object:803\",\n          \"alias\": \"timed\",\n          \"color\": \"#73BF69\"\n        }\n      ],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"floor(increase(sql_checkpoints{host=~'$host', instance=~'$instance', sql_job=~'$cluster'}[55s]))\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"{{col}}\",\n          \"metric\": \"sql_checkpoints\",\n          \"refId\": \"A\",\n          \"step\": 40\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeRegions\": [],\n      \"timeShift\": null,\n      \"title\": \"Checkpoints\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"transformations\": [\n        {\n          \"id\": \"renameByRegex\",\n          \"options\": {\n            \"regex\": \"requested\",\n            \"renamePattern\": \"requested (explicit, wal or backup-based)\"\n          }\n        },\n        {\n          \"id\": \"filterFieldsByName\",\n          \"options\": {\n            \"include\": {\n              \"names\": [\n                \"Time\",\n                \"requested (explicit, wal or backup-based)\",\n                \"timed\"\n              ]\n            }\n          }\n        }\n      ],\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"$$hashKey\": \"object:673\",\n          \"decimals\": 0,\n          \"format\": \"opm\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": \"0\",\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    },\n    {\n      \"aliasColors\": {\n        \"distance\": \"#CCA300\"\n      },\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"${DS_PROMETHEUS}\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"custom\": {}\n        },\n        \"overrides\": []\n      },\n      \"fill\": 1,\n      \"fillGradient\": 0,\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 8,\n        \"x\": 16,\n        \"y\": 121\n      },\n      \"hiddenSeries\": false,\n      \"id\": 31,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"options\": {\n        \"alertThreshold\": true\n      },\n      \"percentage\": false,\n      \"pluginVersion\": \"7.4.3\",\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"sql_LastCheckpointDistance{host=~'$host', instance=~'$instance', sql_job=~'$cluster'}\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"{{col}}\",\n          \"metric\": \"sql_LastCheckpointDistance\",\n          \"refId\": \"A\",\n          \"step\": 40\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeRegions\": [],\n      \"timeShift\": null,\n      \"title\": \"WAL since last Checkpoint\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"bytes\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": \"0\",\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    },\n    {\n      \"collapsed\": false,\n      \"datasource\": \"${DS_PROMETHEUS}\",\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 128\n      },\n      \"id\": 81,\n      \"panels\": [],\n      \"repeat\": null,\n      \"title\": \"PostgreSQL Vacuum and Analyze\",\n      \"type\": \"row\"\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"${DS_PROMETHEUS}\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"custom\": {}\n        },\n        \"overrides\": []\n      },\n      \"fill\": 1,\n      \"fillGradient\": 0,\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 10,\n        \"x\": 0,\n        \"y\": 129\n      },\n      \"hiddenSeries\": false,\n      \"id\": 30,\n      \"legend\": {\n        \"alignAsTable\": false,\n        \"avg\": false,\n        \"current\": false,\n        \"hideEmpty\": true,\n        \"hideZero\": true,\n        \"max\": false,\n        \"min\": false,\n        \"rightSide\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"options\": {\n        \"alertThreshold\": true\n      },\n      \"percentage\": false,\n      \"pluginVersion\": \"7.4.3\",\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"increase(sql_Maintenancecounters{host=~'$host', instance=~'$instance', sql_job=~'$cluster.*', datname=~'$datname'}[$rate_interval])\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"{{col}} ({{database}})\",\n          \"metric\": \"sql_Maintenancecounters\",\n          \"refId\": \"A\",\n          \"step\": 60\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeRegions\": [],\n      \"timeShift\": null,\n      \"title\": \"Maintenance Operations per Minute [$rate_interval] - $datname\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"opm\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": \"0\",\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"${DS_PROMETHEUS}\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"custom\": {}\n        },\n        \"overrides\": []\n      },\n      \"fill\": 1,\n      \"fillGradient\": 0,\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 9,\n        \"x\": 10,\n        \"y\": 129\n      },\n      \"hiddenSeries\": false,\n      \"id\": 53,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"hideEmpty\": true,\n        \"hideZero\": true,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"options\": {\n        \"alertThreshold\": true\n      },\n      \"percentage\": false,\n      \"pluginVersion\": \"7.4.3\",\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"sql_Maintenancecounters{host=~'$host', instance=~'$instance', sql_job=~'$cluster.*', database=~'$datname'}\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"{{col}} ({{database}})\",\n          \"metric\": \"sql_Maintenancecounters\",\n          \"refId\": \"A\",\n          \"step\": 60\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeRegions\": [],\n      \"timeShift\": null,\n      \"title\": \"Maintenance Counters - $datname\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": \"0\",\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"${DS_PROMETHEUS}\",\n      \"description\": \"Age of oldest XID in database\\n\\nWhen reaching autovacuum_max_freeze_age (default: 200 M), tables will be frozen by autovacuum.\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"custom\": {}\n        },\n        \"overrides\": []\n      },\n      \"fill\": 1,\n      \"fillGradient\": 0,\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 5,\n        \"x\": 19,\n        \"y\": 129\n      },\n      \"hiddenSeries\": false,\n      \"id\": 54,\n      \"legend\": {\n        \"alignAsTable\": false,\n        \"avg\": false,\n        \"current\": true,\n        \"max\": false,\n        \"min\": false,\n        \"rightSide\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": true\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"options\": {\n        \"alertThreshold\": true\n      },\n      \"percentage\": false,\n      \"pluginVersion\": \"7.4.3\",\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"sql_pg_stat_database{host=~'$host', instance=~'$instance', sql_job=~'$cluster', col='freeze_age', datname=~'$datname'}\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"{{ datname }}\",\n          \"metric\": \"sql_freeze_age\",\n          \"refId\": \"A\",\n          \"step\": 120\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeRegions\": [],\n      \"timeShift\": null,\n      \"title\": \"Database Freeze Age - $datname\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": \"0\",\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    },\n    {\n      \"collapsed\": false,\n      \"datasource\": \"${DS_PROMETHEUS}\",\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 136\n      },\n      \"id\": 85,\n      \"panels\": [],\n      \"repeat\": null,\n      \"title\": \"PostgreSQL Archiving and Replication\",\n      \"type\": \"row\"\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"${DS_PROMETHEUS}\",\n      \"description\": \"Number of WAL files that still need to be archived.\\n\\nCan grow under write load but should not increase over longer periods of time.\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"custom\": {}\n        },\n        \"overrides\": []\n      },\n      \"fill\": 1,\n      \"fillGradient\": 0,\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 7,\n        \"x\": 0,\n        \"y\": 137\n      },\n      \"hiddenSeries\": false,\n      \"id\": 51,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"options\": {\n        \"alertThreshold\": true\n      },\n      \"percentage\": false,\n      \"pluginVersion\": \"7.4.3\",\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"sql_archive_ready{host=~'$host', instance=~'$instance', sql_job=~'$cluster'}\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"WAL Files Ready\",\n          \"refId\": \"A\",\n          \"step\": 60\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeRegions\": [],\n      \"timeShift\": null,\n      \"title\": \"WAL Files Ready\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": \"0\",\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    },\n    {\n      \"aliasColors\": {\n        \"failed_count\": \"#BF1B00\"\n      },\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"${DS_PROMETHEUS}\",\n      \"description\": \"Successful and failed archive commands per minute.\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"custom\": {}\n        },\n        \"overrides\": []\n      },\n      \"fill\": 1,\n      \"fillGradient\": 0,\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 7,\n        \"x\": 7,\n        \"y\": 137\n      },\n      \"hiddenSeries\": false,\n      \"id\": 47,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"options\": {\n        \"alertThreshold\": true\n      },\n      \"percentage\": false,\n      \"pluginVersion\": \"7.4.3\",\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"increase(sql_pg_stat_archiver{host=~'$host', instance=~'$instance', sql_job=~'$cluster', col=~'archived_count|failed_count'}[$rate_interval])\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"interval\": \"\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"{{col}}\",\n          \"metric\": \"\",\n          \"refId\": \"B\",\n          \"step\": 60\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeRegions\": [],\n      \"timeShift\": null,\n      \"title\": \"WAL Archiving per Minute [$rate_interval]\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"opm\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": \"0\",\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    },\n    {\n      \"aliasColors\": {\n        \"flush_lag_bytes\": \"#E5AC0E\",\n        \"replay_lag_bytes\": \"#629E51\",\n        \"send_lag_bytes\": \"#BF1B00\"\n      },\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"${DS_PROMETHEUS}\",\n      \"description\": \"The amount of data a stream receiver like a standby server lags behind the master.\\n\\nsend_lag: Data that still needs to be send (should be small).\\n\\nflush_lag: Data that was received but must be flushed to persistent storage (this data can be lost if the standby is terminated).\\n\\nreplay_lag: Data that still needs to be replayed by PostgreSQL on the standby (can lag behind during writes in asynchronous configurations).\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"custom\": {}\n        },\n        \"overrides\": []\n      },\n      \"fill\": 1,\n      \"fillGradient\": 0,\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 10,\n        \"x\": 14,\n        \"y\": 137\n      },\n      \"hiddenSeries\": false,\n      \"id\": 61,\n      \"legend\": {\n        \"alignAsTable\": false,\n        \"avg\": false,\n        \"current\": false,\n        \"hideEmpty\": true,\n        \"hideZero\": false,\n        \"max\": false,\n        \"min\": false,\n        \"rightSide\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null as zero\",\n      \"options\": {\n        \"alertThreshold\": true\n      },\n      \"percentage\": false,\n      \"pluginVersion\": \"7.4.3\",\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"repeat\": null,\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"sql_pg_stat_replication{host=~'$host', instance=~'$instance', sql_job=~'$cluster', col='send_lag_bytes', application_name != ''}\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"{{application_name}} (send)\",\n          \"refId\": \"A\",\n          \"step\": 40\n        },\n        {\n          \"expr\": \"sql_pg_stat_replication{host=~'$host', instance=~'$instance', sql_job=~'$cluster', col='flush_lag_bytes', application_name != ''}\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{application_name}} (flush)\",\n          \"refId\": \"B\"\n        },\n        {\n          \"expr\": \"sql_pg_stat_replication{host=~'$host', instance=~'$instance', sql_job=~'$cluster', col='replay_lag_bytes', application_name != ''}\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{application_name}} (replay)\",\n          \"refId\": \"C\"\n        },\n        {\n          \"expr\": \"sql_pg_stat_replication{host=~'$host', instance=~'$instance', sql_job=~'$cluster', col=~'replay_lag_bytes|flush_lag_bytes|send_lag_bytes', application_name=''}>0\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"MISSING application_name ({{col}})\",\n          \"refId\": \"D\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeRegions\": [],\n      \"timeShift\": null,\n      \"title\": \"Replication Lag\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 2,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"bytes\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": \"0\",\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    },\n    {\n      \"collapsed\": false,\n      \"datasource\": \"${DS_PROMETHEUS}\",\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 143\n      },\n      \"id\": 83,\n      \"panels\": [],\n      \"repeat\": null,\n      \"title\": \"PostgreSQL Statements\",\n      \"type\": \"row\"\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"${DS_PROMETHEUS}\",\n      \"description\": \"Statement average execution time\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"custom\": {}\n        },\n        \"overrides\": []\n      },\n      \"fill\": 1,\n      \"fillGradient\": 0,\n      \"gridPos\": {\n        \"h\": 11,\n        \"w\": 8,\n        \"x\": 0,\n        \"y\": 143\n      },\n      \"hiddenSeries\": false,\n      \"id\": 57,\n      \"legend\": {\n        \"alignAsTable\": true,\n        \"avg\": true,\n        \"current\": false,\n        \"hideEmpty\": true,\n        \"hideZero\": true,\n        \"max\": true,\n        \"min\": false,\n        \"rightSide\": false,\n        \"show\": true,\n        \"sort\": \"avg\",\n        \"sortDesc\": true,\n        \"total\": false,\n        \"values\": true\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"options\": {\n        \"alertThreshold\": true\n      },\n      \"percentage\": false,\n      \"pluginVersion\": \"7.4.3\",\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"topk($ntop_relations, rate(sql_pg_stat_statements{host=~'$host', instance=~'$instance', sql_job=~'$cluster', col='total_time', datname=~'$datname'}[$rate_interval]) / ignoring(col) rate(sql_pg_stat_statements{host=~'$host', instance=~'$instance', sql_job=~'$cluster', col='calls', datname=~'$datname'}[$rate_interval]))\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"({{datname}}) {{query}}\",\n          \"refId\": \"A\",\n          \"step\": 40\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeRegions\": [],\n      \"timeShift\": null,\n      \"title\": \"Top $ntop_relations Statements by Average Execution Time [$rate_interval] - $datname\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"ms\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": \"0\",\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"${DS_PROMETHEUS}\",\n      \"description\": \"\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"custom\": {}\n        },\n        \"overrides\": []\n      },\n      \"fill\": 1,\n      \"fillGradient\": 0,\n      \"gridPos\": {\n        \"h\": 11,\n        \"w\": 8,\n        \"x\": 8,\n        \"y\": 144\n      },\n      \"hiddenSeries\": false,\n      \"id\": 98,\n      \"legend\": {\n        \"alignAsTable\": true,\n        \"avg\": true,\n        \"current\": false,\n        \"hideEmpty\": true,\n        \"hideZero\": true,\n        \"max\": true,\n        \"min\": false,\n        \"rightSide\": false,\n        \"show\": true,\n        \"sort\": \"avg\",\n        \"sortDesc\": true,\n        \"total\": false,\n        \"values\": true\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"options\": {\n        \"alertThreshold\": true\n      },\n      \"percentage\": false,\n      \"pluginVersion\": \"7.4.3\",\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"topk($ntop_relations, sum by (query, datname) (rate(sql_pg_stat_statements{host=~'$host', instance=~'$instance', sql_job=~'$cluster', col=~'shared_blks_.*', datname=~'$datname'}[$rate_interval])*8))\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"({{datname}}) {{query}}\",\n          \"refId\": \"A\",\n          \"step\": 40\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeRegions\": [],\n      \"timeShift\": null,\n      \"title\": \"Top $ntop_relations Statements by Buffers [$rate_interval] - $datname\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"KBs\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": \"0\",\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"${DS_PROMETHEUS}\",\n      \"description\": \"Statements called per second\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"custom\": {}\n        },\n        \"overrides\": []\n      },\n      \"fill\": 1,\n      \"fillGradient\": 0,\n      \"gridPos\": {\n        \"h\": 11,\n        \"w\": 8,\n        \"x\": 16,\n        \"y\": 144\n      },\n      \"hiddenSeries\": false,\n      \"id\": 59,\n      \"legend\": {\n        \"alignAsTable\": true,\n        \"avg\": true,\n        \"current\": false,\n        \"hideEmpty\": true,\n        \"hideZero\": true,\n        \"max\": true,\n        \"min\": false,\n        \"rightSide\": false,\n        \"show\": true,\n        \"sort\": \"avg\",\n        \"sortDesc\": true,\n        \"total\": false,\n        \"values\": true\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"options\": {\n        \"alertThreshold\": true\n      },\n      \"percentage\": false,\n      \"pluginVersion\": \"7.4.3\",\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"topk($ntop_relations, rate(sql_pg_stat_statements{host=~'$host', instance=~'$instance', sql_job=~'$cluster', col='calls', datname=~'$datname'}[$rate_interval]))\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"({{datname}}) {{query}}\",\n          \"refId\": \"A\",\n          \"step\": 40\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeRegions\": [],\n      \"timeShift\": null,\n      \"title\": \"Top $ntop_relations Statements by Calls [$rate_interval] - $datname\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"ops\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": \"0\",\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    },\n    {\n      \"columns\": [],\n      \"datasource\": \"${DS_PROMETHEUS}\",\n      \"description\": \"Shows how long statements took in the chosen time period.\",\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"custom\": {\n            \"cellOptions\": {\n              \"type\": \"auto\"\n            },\n            \"inspect\": false\n          },\n          \"decimals\": 2,\n          \"displayName\": \"\",\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\": \"Time\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"displayName\",\n                \"value\": \"Time\"\n              },\n              {\n                \"id\": \"custom.hidden\",\n                \"value\": true\n              },\n              {\n                \"id\": \"custom.align\"\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"__name__\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"unit\",\n                \"value\": \"short\"\n              },\n              {\n                \"id\": \"decimals\",\n                \"value\": 2\n              },\n              {\n                \"id\": \"custom.hidden\",\n                \"value\": true\n              },\n              {\n                \"id\": \"custom.align\"\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"col\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"unit\",\n                \"value\": \"short\"\n              },\n              {\n                \"id\": \"decimals\",\n                \"value\": 2\n              },\n              {\n                \"id\": \"custom.hidden\",\n                \"value\": true\n              },\n              {\n                \"id\": \"custom.align\"\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"database\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"unit\",\n                \"value\": \"short\"\n              },\n              {\n                \"id\": \"decimals\",\n                \"value\": 2\n              },\n              {\n                \"id\": \"custom.hidden\",\n                \"value\": true\n              },\n              {\n                \"id\": \"custom.align\"\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"driver\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"unit\",\n                \"value\": \"short\"\n              },\n              {\n                \"id\": \"decimals\",\n                \"value\": 2\n              },\n              {\n                \"id\": \"custom.hidden\",\n                \"value\": true\n              },\n              {\n                \"id\": \"custom.align\"\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"host\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"unit\",\n                \"value\": \"short\"\n              },\n              {\n                \"id\": \"decimals\",\n                \"value\": 2\n              },\n              {\n                \"id\": \"custom.hidden\",\n                \"value\": true\n              },\n              {\n                \"id\": \"custom.align\"\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"job\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"unit\",\n                \"value\": \"short\"\n              },\n              {\n                \"id\": \"decimals\",\n                \"value\": 2\n              },\n              {\n                \"id\": \"custom.hidden\",\n                \"value\": true\n              },\n              {\n                \"id\": \"custom.align\"\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"instance\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"unit\",\n                \"value\": \"short\"\n              },\n              {\n                \"id\": \"decimals\",\n                \"value\": 2\n              },\n              {\n                \"id\": \"custom.hidden\",\n                \"value\": true\n              },\n              {\n                \"id\": \"custom.align\"\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"queryid\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"unit\",\n                \"value\": \"short\"\n              },\n              {\n                \"id\": \"decimals\",\n                \"value\": 2\n              },\n              {\n                \"id\": \"custom.hidden\",\n                \"value\": true\n              },\n              {\n                \"id\": \"custom.align\"\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"sql_job\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"unit\",\n                \"value\": \"short\"\n              },\n              {\n                \"id\": \"decimals\",\n                \"value\": 2\n              },\n              {\n                \"id\": \"custom.hidden\",\n                \"value\": true\n              },\n              {\n                \"id\": \"custom.align\"\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"user\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"unit\",\n                \"value\": \"short\"\n              },\n              {\n                \"id\": \"decimals\",\n                \"value\": 2\n              },\n              {\n                \"id\": \"custom.hidden\",\n                \"value\": true\n              },\n              {\n                \"id\": \"custom.align\"\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Value\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"displayName\",\n                \"value\": \"Total Time\"\n              },\n              {\n                \"id\": \"unit\",\n                \"value\": \"ms\"\n              },\n              {\n                \"id\": \"decimals\",\n                \"value\": 3\n              },\n              {\n                \"id\": \"custom.align\"\n              },\n              {\n                \"id\": \"custom.width\",\n                \"value\": 100\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"query\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"displayName\",\n                \"value\": \"Query\"\n              },\n              {\n                \"id\": \"unit\",\n                \"value\": \"short\"\n              },\n              {\n                \"id\": \"decimals\",\n                \"value\": 2\n              },\n              {\n                \"id\": \"custom.align\"\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"datname\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"displayName\",\n                \"value\": \"Database\"\n              },\n              {\n                \"id\": \"unit\",\n                \"value\": \"short\"\n              },\n              {\n                \"id\": \"decimals\",\n                \"value\": 2\n              },\n              {\n                \"id\": \"custom.align\"\n              },\n              {\n                \"id\": \"custom.width\",\n                \"value\": 125\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"usename\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"displayName\",\n                \"value\": \"User\"\n              },\n              {\n                \"id\": \"unit\",\n                \"value\": \"short\"\n              },\n              {\n                \"id\": \"decimals\",\n                \"value\": 2\n              },\n              {\n                \"id\": \"custom.align\"\n              },\n              {\n                \"id\": \"custom.width\",\n                \"value\": 125\n              }\n            ]\n          }\n        ]\n      },\n      \"gridPos\": {\n        \"h\": 12,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 155\n      },\n      \"id\": 58,\n      \"options\": {\n        \"cellHeight\": \"sm\",\n        \"footer\": {\n          \"countRows\": false,\n          \"fields\": \"\",\n          \"reducer\": [\n            \"sum\"\n          ],\n          \"show\": false\n        },\n        \"showHeader\": true\n      },\n      \"pluginVersion\": \"11.3.1\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"${DS_PROMETHEUS}\"\n          },\n          \"expr\": \"topk($ntop_relations, increase(sql_pg_stat_statements{host=~'$host', instance=~'$instance', sql_job=~'$cluster', host=~'$host', col='total_time', datname=~'$datname'}[$__range]))\",\n          \"format\": \"table\",\n          \"instant\": true,\n          \"interval\": \"\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"\",\n          \"refId\": \"A\",\n          \"step\": 2\n        }\n      ],\n      \"title\": \"Top $ntop_relations Statements by Total Time - $datname\",\n      \"transformations\": [\n        {\n          \"id\": \"organize\",\n          \"options\": {\n            \"excludeByName\": {},\n            \"indexByName\": {\n              \"Time\": 0,\n              \"Value\": 10,\n              \"col\": 1,\n              \"database\": 2,\n              \"datname\": 3,\n              \"driver\": 6,\n              \"host\": 7,\n              \"instance\": 8,\n              \"job\": 9,\n              \"query\": 11,\n              \"queryid\": 12,\n              \"sql_job\": 13,\n              \"usename\": 4,\n              \"user\": 5\n            },\n            \"renameByName\": {}\n          }\n        }\n      ],\n      \"type\": \"table\"\n    }\n  ],\n  \"refresh\": \"1m\",\n  \"schemaVersion\": 27,\n  \"style\": \"dark\",\n  \"tags\": [\n    \"prometheus\",\n    \"system\",\n    \"postgresql\",\n    \"database\"\n  ],\n  \"templating\": {\n    \"list\": [\n      {\n        \"hide\": 2,\n        \"label\": \"datasource\",\n        \"name\": \"DS_PROMETHEUS\",\n        \"options\": [],\n        \"query\": \"prometheus\",\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"type\": \"datasource\"\n      },\n      {\n        \"allValue\": null,\n        \"current\": {\n          \"selected\": false,\n          \"text\": \"localhost\",\n          \"value\": \"localhost\"\n        },\n        \"datasource\": \"${DS_PROMETHEUS}\",\n        \"definition\": \"\",\n        \"description\": null,\n        \"error\": null,\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"label\": \"Server\",\n        \"multi\": false,\n        \"name\": \"instance\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"label_values(sql_settings{col='max_connections'}, instance)\",\n          \"refId\": \"prometheus-job-Variable-Query\"\n        },\n        \"refresh\": 2,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"tagValuesQuery\": \"\",\n        \"tags\": [],\n        \"tagsQuery\": \"\",\n        \"type\": \"query\",\n        \"useTags\": false\n      },\n      {\n        \"allValue\": null,\n        \"current\": {\n          \"selected\": false,\n          \"text\": \"11/main\",\n          \"value\": \"11/main\"\n        },\n        \"datasource\": \"${DS_PROMETHEUS}\",\n        \"definition\": \"\",\n        \"description\": null,\n        \"error\": null,\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"label\": \"Cluster\",\n        \"multi\": false,\n        \"name\": \"cluster\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"label_values(sql_settings{instance='$instance'}, sql_job)\",\n          \"refId\": \"prometheus-cluster-Variable-Query\"\n        },\n        \"refresh\": 2,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"sort\": 1,\n        \"tagValuesQuery\": \"\",\n        \"tags\": [],\n        \"tagsQuery\": \"\",\n        \"type\": \"query\",\n        \"useTags\": false\n      },\n      {\n        \"allValue\": null,\n        \"current\": {\n          \"selected\": false,\n          \"text\": \"All\",\n          \"value\": \"$__all\"\n        },\n        \"datasource\": \"${DS_PROMETHEUS}\",\n        \"definition\": \"\",\n        \"description\": null,\n        \"error\": null,\n        \"hide\": 2,\n        \"includeAll\": true,\n        \"label\": \"PostgreSQL Port\",\n        \"multi\": false,\n        \"name\": \"host\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"label_values(sql_settings{instance='$instance'}, host)\",\n          \"refId\": \"prometheus-host-Variable-Query\"\n        },\n        \"refresh\": 2,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"sort\": 1,\n        \"tagValuesQuery\": \"\",\n        \"tags\": [],\n        \"tagsQuery\": \"\",\n        \"type\": \"query\",\n        \"useTags\": false\n      },\n      {\n        \"allValue\": \"\",\n        \"current\": {\n          \"selected\": false,\n          \"text\": \"All\",\n          \"value\": \"$__all\"\n        },\n        \"datasource\": \"${DS_PROMETHEUS}\",\n        \"definition\": \"\",\n        \"description\": null,\n        \"error\": null,\n        \"hide\": 0,\n        \"includeAll\": true,\n        \"label\": \"Database\",\n        \"multi\": false,\n        \"name\": \"datname\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"label_values(sql_pg_stat_database{col='dbsize', host=~'$host', instance=~'$instance', sql_job=~'$cluster'}, datname)\",\n          \"refId\": \"prometheus-datname-Variable-Query\"\n        },\n        \"refresh\": 2,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"sort\": 1,\n        \"tagValuesQuery\": \"\",\n        \"tags\": [],\n        \"tagsQuery\": \"\",\n        \"type\": \"query\",\n        \"useTags\": false\n      },\n      {\n        \"auto\": false,\n        \"auto_count\": 30,\n        \"auto_min\": \"10s\",\n        \"current\": {\n          \"selected\": false,\n          \"text\": \"5m\",\n          \"value\": \"5m\"\n        },\n        \"description\": null,\n        \"error\": null,\n        \"hide\": 0,\n        \"label\": \"Rate Interval\",\n        \"name\": \"rate_interval\",\n        \"options\": [\n          {\n            \"selected\": false,\n            \"text\": \"1m\",\n            \"value\": \"1m\"\n          },\n          {\n            \"selected\": true,\n            \"text\": \"5m\",\n            \"value\": \"5m\"\n          },\n          {\n            \"selected\": false,\n            \"text\": \"10m\",\n            \"value\": \"10m\"\n          },\n          {\n            \"selected\": false,\n            \"text\": \"30m\",\n            \"value\": \"30m\"\n          },\n          {\n            \"selected\": false,\n            \"text\": \"1h\",\n            \"value\": \"1h\"\n          }\n        ],\n        \"query\": \"1m,5m,10m,30m,1h\",\n        \"refresh\": 2,\n        \"skipUrlSync\": false,\n        \"type\": \"interval\"\n      },\n      {\n        \"allValue\": null,\n        \"current\": {\n          \"selected\": false,\n          \"text\": \"All\",\n          \"value\": \"$__all\"\n        },\n        \"datasource\": \"${DS_PROMETHEUS}\",\n        \"definition\": \"\",\n        \"description\": null,\n        \"error\": null,\n        \"hide\": 0,\n        \"includeAll\": true,\n        \"label\": \"Disk\",\n        \"multi\": true,\n        \"name\": \"disk\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"label_values(node_disk_written_bytes_total, device)\",\n          \"refId\": \"prometheus-disk-Variable-Query\"\n        },\n        \"refresh\": 2,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"tagValuesQuery\": \"\",\n        \"tags\": [],\n        \"tagsQuery\": \"\",\n        \"type\": \"query\",\n        \"useTags\": false\n      },\n      {\n        \"allValue\": null,\n        \"current\": {\n          \"selected\": true,\n          \"text\": \"5\",\n          \"value\": \"5\"\n        },\n        \"description\": null,\n        \"error\": null,\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"label\": \"Top k\",\n        \"multi\": false,\n        \"name\": \"ntop_relations\",\n        \"options\": [\n          {\n            \"selected\": false,\n            \"text\": \"1\",\n            \"value\": \"1\"\n          },\n          {\n            \"selected\": false,\n            \"text\": \"3\",\n            \"value\": \"3\"\n          },\n          {\n            \"selected\": true,\n            \"text\": \"5\",\n            \"value\": \"5\"\n          },\n          {\n            \"selected\": false,\n            \"text\": \"10\",\n            \"value\": \"10\"\n          },\n          {\n            \"selected\": false,\n            \"text\": \"20\",\n            \"value\": \"20\"\n          },\n          {\n            \"selected\": false,\n            \"text\": \"50\",\n            \"value\": \"50\"\n          },\n          {\n            \"selected\": false,\n            \"text\": \"100\",\n            \"value\": \"100\"\n          }\n        ],\n        \"query\": \"1,3,5,10,20,50,100\",\n        \"skipUrlSync\": false,\n        \"type\": \"custom\"\n      },\n      {\n        \"allValue\": null,\n        \"current\": {\n          \"selected\": false,\n          \"text\": \"All\",\n          \"value\": \"$__all\"\n        },\n        \"datasource\": \"${DS_PROMETHEUS}\",\n        \"definition\": \"\",\n        \"description\": null,\n        \"error\": null,\n        \"hide\": 0,\n        \"includeAll\": true,\n        \"label\": \"Interface\",\n        \"multi\": false,\n        \"name\": \"interface\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"label_values(node_network_receive_bytes_total, device)\",\n          \"refId\": \"prometheus-interface-Variable-Query\"\n        },\n        \"refresh\": 2,\n        \"regex\": \"\",\n        \"skipUrlSync\": false,\n        \"sort\": 0,\n        \"tagValuesQuery\": \"\",\n        \"tags\": [],\n        \"tagsQuery\": \"\",\n        \"type\": \"query\",\n        \"useTags\": false\n      },\n      {\n        \"allValue\": null,\n        \"current\": {\n          \"selected\": false,\n          \"text\": \"All\",\n          \"value\": \"$__all\"\n        },\n        \"datasource\": \"${DS_PROMETHEUS}\",\n        \"definition\": \"\",\n        \"description\": null,\n        \"error\": null,\n        \"hide\": 0,\n        \"includeAll\": true,\n        \"label\": \"Filesystem\",\n        \"multi\": true,\n        \"name\": \"filesystem\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"label_values(node_filesystem_size_bytes{instance='$instance'}, mountpoint)\",\n          \"refId\": \"prometheus-filesystem-Variable-Query\"\n        },\n        \"refresh\": 2,\n        \"regex\": \"(?!/media).*\",\n        \"skipUrlSync\": false,\n        \"sort\": 1,\n        \"tagValuesQuery\": \"\",\n        \"tags\": [],\n        \"tagsQuery\": \"\",\n        \"type\": \"query\",\n        \"useTags\": false\n      },\n      {\n        \"allValue\": null,\n        \"current\": {\n          \"selected\": false,\n          \"text\": \"All\",\n          \"value\": \"$__all\"\n        },\n        \"datasource\": \"${DS_PROMETHEUS}\",\n        \"definition\": \"\",\n        \"description\": null,\n        \"error\": null,\n        \"hide\": 0,\n        \"includeAll\": true,\n        \"label\": \"Streaming Receiver\",\n        \"multi\": false,\n        \"name\": \"application_name\",\n        \"options\": [],\n        \"query\": {\n          \"query\": \"label_values(sql_pg_stat_replication{host=~'$host', instance=~'$instance', sql_job=~'$cluster'}, application_name)\",\n          \"refId\": \"prometheus-application_name-Variable-Query\"\n        },\n        \"refresh\": 2,\n        \"regex\": \"^.+.+\",\n        \"skipUrlSync\": false,\n        \"sort\": 1,\n        \"tagValuesQuery\": \"\",\n        \"tags\": [],\n        \"tagsQuery\": \"\",\n        \"type\": \"query\",\n        \"useTags\": false\n      }\n    ]\n  },\n  \"time\": {\n    \"from\": \"now-3h\",\n    \"to\": \"now\"\n  },\n  \"timepicker\": {\n    \"refresh_intervals\": [\n      \"30s\",\n      \"1m\",\n      \"5m\",\n      \"15m\",\n      \"1h\"\n    ],\n    \"time_options\": [\n      \"1m\",\n      \"5m\",\n      \"15m\",\n      \"1h\"\n    ]\n  },\n  \"timezone\": \"browser\",\n  \"title\": \"PostgreSQL Server Overview\",\n  \"uid\": \"5CGjHlRiz\",\n  \"version\": 1\n}\n"
  },
  {
    "path": "grafana/postgresql_server_overview.yml",
    "content": "---\n# config file version\napiVersion: 1\n\nproviders:\n- name: 'postgresql_server_overview'\n  orgId: 1\n  folder: ''\n  type: file\n  options:\n    path: /usr/share/elephant-shed/grafana/postgresql_server_overview.json\n    datasource: prometheus\n"
  },
  {
    "path": "node-exporter/elephant-shed-prometheus-node-exporter",
    "content": "# Set go garbage collector to clean up more frequently\nGOGC=40\n# Use only one thread\nGOMAXPROCS=1\n\n# Set the command-line arguments to pass to the server.\n# Due to shell scaping, to pass backslashes for regexes, you need to double\n# them (\\\\d for \\d). If running under systemd, you need to double them again\n# (\\\\\\\\d to mean \\d), and escape newlines too.\nARGS=\"--collector.diskstats.ignored-devices=^(ram|loop|fd|(h|s|v|xv)d[a-z]|nvme\\\\d+n\\\\d+p)\\\\d+$ \\\n      --collector.filesystem.ignored-mount-points=^/(sys|proc|dev|run)($|/) \\\n      --collector.textfile.directory=/var/lib/prometheus/node-exporter \\\n      --web.listen-address=:9100\"\n\n# Prometheus-node-exporter supports the following options:\n#\n#  --collector.bcache.priorityStats\n#                            Expose expensive priority stats.\n#  --collector.cpu.info      Enables metric cpu_info\n#  --collector.cpu.info.flags-include=COLLECTOR.CPU.INFO.FLAGS-INCLUDE\n#                            Filter the `flags` field in cpuInfo with a value that must be a regular expression\n#  --collector.cpu.info.bugs-include=COLLECTOR.CPU.INFO.BUGS-INCLUDE\n#                            Filter the `bugs` field in cpuInfo with a value that must be a regular expression\n#  --collector.diskstats.ignored-devices=\"^(ram|loop|fd|(h|s|v|xv)d[a-z]|nvme\\\\d+n\\\\d+p)\\\\d+$\"\n#                            Regexp of devices to ignore for diskstats.\n#  --collector.filesystem.ignored-mount-points=\"^/(dev|proc|run|sys|mnt|media|var/lib/docker/.+)($|/)\"\n#                            Regexp of mount points to ignore for filesystem collector.\n#  --collector.filesystem.ignored-fs-types=\"^(autofs|binfmt_misc|bpf|cgroup2?|configfs|debugfs|devpts|devtmpfs|fusectl|hugetlbfs|iso9660|mqueue|nsfs|overlay|proc|procfs|pstore|rpc_pipefs|securityfs|selinuxfs|squashfs|sysfs|tracefs)$\"\n#                            Regexp of filesystem types to ignore for filesystem collector.\n#  --collector.ipvs.backend-labels=\"local_address,local_port,remote_address,remote_port,proto,local_mark\"\n#                            Comma separated list for IPVS backend stats labels.\n#  --collector.netclass.ignored-devices=\"^$\"\n#                            Regexp of net devices to ignore for netclass collector.\n#  --collector.netdev.device-include=COLLECTOR.NETDEV.DEVICE-INCLUDE\n#                            Regexp of net devices to include (mutually exclusive to device-exclude).\n#  --collector.netdev.device-exclude=\"^lo$\"\n#                            Regexp of net devices to exclude (mutually exclusive to device-include).\n#  --collector.netstat.fields=\"^(.*_(InErrors|InErrs)|Ip_Forwarding|Ip(6|Ext)_(InOctets|OutOctets)|Icmp6?_(InMsgs|OutMsgs)|TcpExt_(Listen.*|Syncookies.*|TCPSynRetrans)|Tcp_(ActiveOpens|InSegs|OutSegs|OutRsts|PassiveOpens|RetransSegs|CurrEstab)|Udp6?_(InDatagrams|OutDatagrams|NoPorts|RcvbufErrors|SndbufErrors))$\"\n#                            Regexp of fields to return for netstat collector.\n#  --collector.ntp.server=\"127.0.0.1\"\n#                            NTP server to use for ntp collector\n#  --collector.ntp.protocol-version=4\n#                            NTP protocol version\n#  --collector.ntp.server-is-local\n#                            Certify that collector.ntp.server address is not a public ntp server\n#  --collector.ntp.ip-ttl=1  IP TTL to use while sending NTP query\n#  --collector.ntp.max-distance=3.46608s\n#                            Max accumulated distance to the root\n#  --collector.ntp.local-offset-tolerance=1ms\n#                            Offset between local clock and local ntpd time to tolerate\n#  --path.procfs=\"/proc\"     procfs mountpoint.\n#  --path.sysfs=\"/sys\"       sysfs mountpoint.\n#  --path.rootfs=\"/\"         rootfs mountpoint.\n#  --collector.perf.cpus=\"\"  List of CPUs from which perf metrics should be collected\n#  --collector.perf.tracepoint=COLLECTOR.PERF.TRACEPOINT ...\n#                            perf tracepoint that should be collected\n#  --collector.powersupply.ignored-supplies=\"^$\"\n#                            Regexp of power supplies to ignore for powersupplyclass collector.\n#  --collector.qdisc.fixtures=\"\"\n#                            test fixtures to use for qdisc collector end-to-end testing\n#  --collector.runit.servicedir=\"/etc/service\"\n#                            Path to runit service directory.\n#  --collector.supervisord.url=\"http://localhost:9001/RPC2\"\n#                            XML RPC endpoint.\n#  --collector.systemd.unit-include=\".+\"\n#                            Regexp of systemd units to include. Units must both match include and not match exclude to be included.\n#  --collector.systemd.unit-exclude=\".+\\\\.(automount|device|mount|scope|slice|target)\"\n#                            Regexp of systemd units to exclude. Units must both match include and not match exclude to be included.\n#  --collector.systemd.enable-task-metrics\n#                            Enables service unit tasks metrics unit_tasks_current and unit_tasks_max\n#  --collector.systemd.enable-restarts-metrics\n#                            Enables service unit metric service_restart_total\n#  --collector.systemd.enable-start-time-metrics\n#                            Enables service unit metric unit_start_time_seconds\n#  --collector.textfile.directory=\"/var/lib/prometheus/node-exporter\"\n#                            Directory to read text files with metrics from.\n#  --collector.vmstat.fields=\"^(oom_kill|pgpg|pswp|pg.*fault).*\"\n#                            Regexp of fields to return for vmstat collector.\n#  --collector.wifi.fixtures=\"\"\n#                            test fixtures to use for wifi collector metrics\n#  --collector.arp           Enable the arp collector (default: enabled).\n#  --collector.bcache        Enable the bcache collector (default: enabled).\n#  --collector.bonding       Enable the bonding collector (default: enabled).\n#  --collector.btrfs         Enable the btrfs collector (default: enabled).\n#  --collector.buddyinfo     Enable the buddyinfo collector (default: disabled).\n#  --collector.conntrack     Enable the conntrack collector (default: enabled).\n#  --collector.cpu           Enable the cpu collector (default: enabled).\n#  --collector.cpufreq       Enable the cpufreq collector (default: enabled).\n#  --collector.diskstats     Enable the diskstats collector (default: enabled).\n#  --collector.drbd          Enable the drbd collector (default: disabled).\n#  --collector.edac          Enable the edac collector (default: enabled).\n#  --collector.entropy       Enable the entropy collector (default: enabled).\n#  --collector.fibrechannel  Enable the fibrechannel collector (default: enabled).\n#  --collector.filefd        Enable the filefd collector (default: enabled).\n#  --collector.filesystem    Enable the filesystem collector (default: enabled).\n#  --collector.hwmon         Enable the hwmon collector (default: enabled).\n#  --collector.infiniband    Enable the infiniband collector (default: enabled).\n#  --collector.interrupts    Enable the interrupts collector (default: disabled).\n#  --collector.ipvs          Enable the ipvs collector (default: enabled).\n#  --collector.ksmd          Enable the ksmd collector (default: disabled).\n#  --collector.loadavg       Enable the loadavg collector (default: enabled).\n#  --collector.logind        Enable the logind collector (default: disabled).\n#  --collector.mdadm         Enable the mdadm collector (default: enabled).\n#  --collector.meminfo       Enable the meminfo collector (default: enabled).\n#  --collector.meminfo_numa  Enable the meminfo_numa collector (default: disabled).\n#  --collector.mountstats    Enable the mountstats collector (default: disabled).\n#  --collector.netclass      Enable the netclass collector (default: enabled).\n#  --collector.netdev        Enable the netdev collector (default: enabled).\n#  --collector.netstat       Enable the netstat collector (default: enabled).\n#  --collector.network_route Enable the network_route collector (default: disabled).\n#  --collector.nfs           Enable the nfs collector (default: enabled).\n#  --collector.nfsd          Enable the nfsd collector (default: enabled).\n#  --collector.ntp           Enable the ntp collector (default: disabled).\n#  --collector.perf          Enable the perf collector (default: disabled).\n#  --collector.powersupplyclass\n#                            Enable the powersupplyclass collector (default: enabled).\n#  --collector.pressure      Enable the pressure collector (default: enabled).\n#  --collector.processes     Enable the processes collector (default: disabled).\n#  --collector.qdisc         Enable the qdisc collector (default: disabled).\n#  --collector.rapl          Enable the rapl collector (default: enabled).\n#  --collector.runit         Enable the runit collector (default: disabled).\n#  --collector.schedstat     Enable the schedstat collector (default: enabled).\n#  --collector.sockstat      Enable the sockstat collector (default: enabled).\n#  --collector.softnet       Enable the softnet collector (default: enabled).\n#  --collector.stat          Enable the stat collector (default: enabled).\n#  --collector.supervisord   Enable the supervisord collector (default: disabled).\n#  --collector.systemd       Enable the systemd collector (default: enabled).\n#  --collector.tcpstat       Enable the tcpstat collector (default: disabled).\n#  --collector.textfile      Enable the textfile collector (default: enabled).\n#  --collector.thermal_zone  Enable the thermal_zone collector (default: enabled).\n#  --collector.time          Enable the time collector (default: enabled).\n#  --collector.timex         Enable the timex collector (default: enabled).\n#  --collector.udp_queues    Enable the udp_queues collector (default: enabled).\n#  --collector.uname         Enable the uname collector (default: enabled).\n#  --collector.vmstat        Enable the vmstat collector (default: enabled).\n#  --collector.wifi          Enable the wifi collector (default: disabled).\n#  --collector.xfs           Enable the xfs collector (default: enabled).\n#  --collector.zfs           Enable the zfs collector (default: enabled).\n#  --collector.zoneinfo      Enable the zoneinfo collector (default: disabled).\n#  --web.listen-address=\":9100\"\n#                            Address on which to expose metrics and web interface.\n#  --web.telemetry-path=\"/metrics\"\n#                            Path under which to expose metrics.\n#  --web.disable-exporter-metrics\n#                            Exclude metrics about the exporter itself (promhttp_*, process_*, go_*).\n#  --web.max-requests=40     Maximum number of parallel scrape requests. Use 0 to disable.\n#  --collector.disable-defaults\n#                            Set all collectors to disabled by default.\n#  --web.config=\"\"           [EXPERIMENTAL] Path to config yaml file that can enable TLS or authentication.\n#  --log.level=info          Only log messages with the given severity or above. One of: [debug, info, warn, error]\n#  --log.format=logfmt       Output format of log messages. One of: [logfmt, json]\n#  --version                 Show application version\n"
  },
  {
    "path": "node-exporter/elephant-shed-prometheus-node-exporter.conf",
    "content": "[Service]\nEnvironmentFile=/etc/default/elephant-shed-prometheus-node-exporter\n"
  },
  {
    "path": "omnidb/wsgi.py",
    "content": "import os\n\nfrom OmniDB import custom_settings\ncustom_settings.DEV_MODE = False\ncustom_settings.HOME_DIR = os.path.join(os.path.expanduser('~'), '.omnidb', 'omnidb-server')\ncustom_settings.PATH = '/omnidb/'\n\nfrom django.core.wsgi import get_wsgi_application\nos.environ.setdefault(\"DJANGO_SETTINGS_MODULE\", \"OmniDB.settings\")\napplication = get_wsgi_application()\n"
  },
  {
    "path": "pgbackrest/pgbackrest-archivecommand",
    "content": "#!/bin/bash\n\n# This wrapper around pgbackrest makes sure that the stanza exists for\n# a configured archived command.\n\n# In normal operation, arguments are just passed on to pgbackrest.\n\n# This is a kludge should go away as soon as pg_createcluster gets\n# hook support.\n\nset -eu\n\nPGCLUSTER=\"\"\nfor arg in \"$@\"; do\n    if [ x\"${arg#--stanza=}\" != x\"$arg\" ]; then\n\tPGCLUSTER=\"${1#--stanza=}\";\n    fi\ndone\n\nif [ -z \"$PGCLUSTER\" ]; then\n    echo \"ERROR:  No stanza found in argument list.\"\n    exit 1\nfi\n\nPGBACKREST=\"pgbackrest --log-level-console=info --stanza=$PGCLUSTER\"\n\nif ! grep -q -F \"[$PGCLUSTER]\" /etc/pgbackrest.conf; then\n  CONFTOOL=\"pg_conftool -s ${PGCLUSTER/-/ }\"\n  PGDATA=$($CONFTOOL show data_directory)\n  PGPORT=$($CONFTOOL show port)\n  test -d \"$PGDATA\"\n  cat >> /etc/pgbackrest.conf <<-EOF\n\n\t[$PGCLUSTER]\n\tdb-path=$PGDATA\n\tdb-port=$PGPORT\n\tEOF\nfi\n\nif ! pgbackrest info | grep -q \"stanza: $PGCLUSTER\"; then\n  $PGBACKREST stanza-create\nfi\n\nexec pgbackrest \"$@\"\n\n"
  },
  {
    "path": "pgbackrest/pgbackrest-incr@.service",
    "content": "# /lib/systemd/system/pgbackrest-incr@.service\n[Unit]\nDescription=Backup PostgreSQL cluster %i using pgBackRest, incremental if previous full backup is available\nConditionPathExists=/etc/postgresql/%I/postgresql.conf\n\n[Service]\nType=oneshot\nUser=postgres\nExecStart=/usr/share/elephant-shed/pgbackrest-run %i incr\nSyslogIdentifier=pgbackrest@%i\nNice=10\n"
  },
  {
    "path": "pgbackrest/pgbackrest-incr@.timer",
    "content": "# /lib/systemd/system/pgbackrest-incr@.timer\n[Unit]\nDescription=Automated pgBackRest incremental backup of PostgreSQL cluster %i\n\n[Timer]\nOnCalendar=Tue,Thu *-*-* 01:00:00\nRandomizedDelaySec=2h\n\n[Install]\nWantedBy=multi-user.target\n"
  },
  {
    "path": "pgbackrest/pgbackrest-run",
    "content": "#!/bin/bash\n\nset -eu\n\nPGCLUSTER=\"$1\" # in 9.6-main format\nBACKUPTYPE=\"$2\" # type of backup (full|incr|diff)\nSTATUSDIR=\"/var/www/html/pgbackrest\"\nPGBACKREST=\"pgbackrest --log-level-console=info --stanza=$PGCLUSTER\"\n\ntest -d $STATUSDIR\n\nif ! grep -q -F \"[$PGCLUSTER]\" /etc/pgbackrest.conf; then\n  CONFTOOL=\"pg_conftool -s ${PGCLUSTER/-/ }\"\n  PGDATA=$($CONFTOOL show data_directory)\n  PGPORT=$($CONFTOOL show port)\n  test -d \"$PGDATA\"\n  cat >> /etc/pgbackrest.conf <<-EOF\n\n\t[$PGCLUSTER]\n\tdb-path=$PGDATA\n\tdb-port=$PGPORT\n\tEOF\nfi\n\nif ! pgbackrest info | grep -q \"stanza: $PGCLUSTER\"; then\n  $PGBACKREST stanza-create\nfi\n\n# We need to make sure archiving is enabled\n/usr/share/elephant-shed/pgbackrest-toggle-archiving $PGCLUSTER enable\n\n$PGBACKREST backup --type=$BACKUPTYPE 2>&1 | tee $STATUSDIR/$PGCLUSTER.log # pipe ignores errors here\n\n$PGBACKREST info > $STATUSDIR/$PGCLUSTER.backup\n"
  },
  {
    "path": "pgbackrest/pgbackrest-toggle-archiving",
    "content": "#!/bin/bash\n\n# This script controls whether to enable or disable archiving using pgbackrest.\n# Any archive_command that doesn't contain the string \"pgbackrest\" is interpreted as \"disabled\"\n\n# Usage: pgbackrest-toogle-archiving <cluster> [enable|disable]\n#        where cluster is of format version-name (e.g. 9.6-main)\n\nset -eu\n\nPGCLUSTER=\"$1\" # in 9.6-main format\nCONFTOOL=\"pg_conftool -s ${PGCLUSTER/-/ }\"\n\nACTION=\"toggle\"\n\nCOMMAND_ENABLED=\"/usr/share/elephant-shed/pgbackrest-archivecommand --stanza=${PGCLUSTER} archive-push %p\"\nCOMMAND_DISABLED=\"/bin/true\"\n\nset +u\nif [ -n $2 ] && [ \"$2\" != \"\" ]; then\n    case \"$2\" in\n\t\"enable\"|\"disable\"|\"toggle\")\n\t    ACTION=\"$2\"\n\t    ;;\n\t*)\n\t    echo \"ERROR: action \\\"$2\\\" not supported, exiting.\" 1>&2\n\t    exit 1\n\t    ;;\n    esac\nfi\nset -u\n\nif $CONFTOOL --short show archive_command | grep -q \"pgbackrest\"; then\n    # archiving is currently on\n    if [ \"$ACTION\" == \"enable\" ]; then\n\techo \"INFO: archive_command is enabled. No action required.\"\n\texit 0\n    fi\n    echo \"INFO: archive_command is enabled. Disable archiving using \\\"$COMMAND_DISABLED\\\" as archive_command.\"\n    $CONFTOOL set archive_command \"$COMMAND_DISABLED\"\nelse\n    # archiving is currently off\n    if [ \"$ACTION\" == \"disable\" ]; then\n\techo \"INFO: archive_command is disabled. No action required.\"\n\texit 0\n    fi\n    echo \"INFO: archive_command is disabled. Enable archiving using \\\"$COMMAND_ENABLED\\\" as archive_command.\"\n    $CONFTOOL set archive_command \"$COMMAND_ENABLED\"\nfi\n\n# Check if archive mode is off and print a warning.\nif $CONFTOOL --short show archive_mode | grep -q \"off\"; then\n    echo \"WARNING: Archiving is disabled (\\\"archive_mode = off\\\").\"\n    echo \"DETAIL: Changes to the archive_command doesn't have any effect.\"\n    echo \"HINT: Please switch the archive_mode to \\\"on\\\" manually.\"\nfi\n\necho \"INFO: Reloading cluster configuration for \\\"${PGCLUSTER/-/ }\\\".\"\npg_ctlcluster ${PGCLUSTER/-/ } reload\n"
  },
  {
    "path": "pgbackrest/pgbackrest-toggle-archiving@.service",
    "content": "# /lib/systemd/system/pgbackrest-toggle-archiving@.service\n[Unit]\nDescription=pgBackrest - Toggle PostgreSQL archiving for cluster %i \nConditionPathExists=/etc/postgresql/%I/postgresql.conf\n\n[Service]\nType=oneshot\nUser=postgres\nExecStart=/usr/share/elephant-shed/pgbackrest-toggle-archiving %i\nSyslogIdentifier=pgbackrest@%i\nNice=10\n"
  },
  {
    "path": "pgbackrest/pgbackrest@.service",
    "content": "# /lib/systemd/system/pgbackrest@.service\n[Unit]\nDescription=Backup PostgreSQL cluster %i using pgBackRest, always creates full backup\nConditionPathExists=/etc/postgresql/%I/postgresql.conf\n\n[Service]\nType=oneshot\nUser=postgres\nExecStart=/usr/share/elephant-shed/pgbackrest-run %i full\nSyslogIdentifier=pgbackrest@%i\nNice=10\n"
  },
  {
    "path": "pgbackrest/pgbackrest@.timer",
    "content": "# /lib/systemd/system/pgbackrest@.timer\n[Unit]\nDescription=Automated pgBackRest full backup of PostgreSQL cluster %i\n\n[Timer]\nOnCalendar=Sun *-*-* 01:00:00\nRandomizedDelaySec=2h\n\n[Install]\nWantedBy=multi-user.target\n"
  },
  {
    "path": "pgbadger/pgbadger-generator",
    "content": "#!/bin/sh\n\nset -eu\n\ngendir=\"$1\"\nwantdir=\"$1/pgbadger.service.wants\"\npgbadgerservice=\"/lib/systemd/system/pgbadger@.service\"\n\nmkdir -p \"$wantdir\"\n\nfor conf in /etc/postgresql/*/*/postgresql.conf; do\n\ttest -e \"$conf\" || continue\n\tdir=\"${conf%/*}\"\n\n\tverdir=\"${dir%/*}\"\n\tversion=\"${verdir##*/}\"\n\tcluster=\"${dir##*/}\"\n\tln -s \"$pgbadgerservice\" \"$wantdir/pgbadger@$version-$cluster.service\"\ndone\n\nexit 0\n"
  },
  {
    "path": "pgbadger/pgbadger-run",
    "content": "#!/bin/bash\n\nset -eu\n\nPGCLUSTER=\"$1\" # in 9.6-main format (%i)\nREPORTDIR=\"/var/lib/pgbadger/$PGCLUSTER\"\n\nINFO=\"$(pg_lsclusters -h $PGCLUSTER)\"\n[ \"$INFO\" ] || exit 1\nset -- $INFO\nPGDATA=\"$6\"\nLOGFILE=\"$7\"\nLOGFILE=\"${LOGFILE%,*}\" # strip \",syslog\" et al\nLOGFILE=\"${LOGFILE/\\%?/*}\" # replace logging_collector placeholders by wildcard\ncase $LOGFILE in\n  /*) ;;\n  *) LOGFILE=\"$PGDATA/$LOGFILE\" ;; # prepend PGDATA\nesac\n\nPREFIX=\"$(pg_conftool -s ${PGCLUSTER/-/ } show log_line_prefix)\"\n\n[ -t 1 ] || QUIET=\"--quiet\"\nmkdir -p \"$REPORTDIR\"\n\nset -x\npgbadger ${QUIET:-} \\\n  --format stderr ${PREFIX+--prefix=\"$PREFIX\"} \\\n  --title=\"${PGCLUSTER/-//} pgBadger report\" \\\n  --incremental --extra-files --start-monday \\\n  --pid-dir \"$REPORTDIR\" --outdir \"$REPORTDIR\" \\\n  $LOGFILE*\n"
  },
  {
    "path": "pgbadger/pgbadger.service",
    "content": "# /lib/systemd/system/pgbadger.service\n[Unit]\nDescription=pgBadger reports for all PostgreSQL clusters\n\n[Service]\nType=oneshot\nUser=postgres\nExecStart=/bin/true\nExecReload=/bin/true\n"
  },
  {
    "path": "pgbadger/pgbadger.timer",
    "content": "# /lib/systemd/system/pgbadger.timer\n[Unit]\nDescription=Run pgbadger.service every night\n\n[Timer]\nOnBootSec=120\nOnCalendar=*-*-* 23:00:00\nRandomizedDelaySec=1h\n\n[Install]\nWantedBy=multi-user.target\n"
  },
  {
    "path": "pgbadger/pgbadger@.service",
    "content": "# /lib/systemd/system/pgbadger@.service\n[Unit]\nDescription=pgBadger report for PostgreSQL cluster %I\nPartOf=pgbadger.service\nBefore=pgbadger.service\n\n[Service]\nType=oneshot\nUser=postgres\nExecStart=/usr/share/elephant-shed/pgbadger-run \"%i\"\nSyslogIdentifier=pgbadger@%i\nNice=10\n"
  },
  {
    "path": "portal/cgi-bin/backrest.pl",
    "content": "#!/usr/bin/perl\n\nuse strict;\nuse warnings;\nuse Template;\nuse CGI;\nuse CGI::Carp 'fatalsToBrowser';\nuse Data::Dumper;\n\nmy $q = CGI->new();\nmy $get_cluster = $q->param('cluster') // '';\n\nmy $template_path = '/usr/share/elephant-shed/template';\nmy $page = 'backrest.html';\n\nmy $template = Template->new({\n  INCLUDE_PATH => $template_path,\n  POST_CHOMP => 1,\n});\n\nprint \"Content-type: text/html\\n\\n\";\n\nmy $directory = '/var/www/html/pgbackrest';\nmy @backup_files;\nmy %backups;\nopendir (DIR, $directory) or die $!;\nwhile (my $file = readdir(DIR)) {\n    # We always want to list files with \"backup\" or \"log\" suffix.\n    next unless ($file =~ m/.*\\.(backup|log)/);\n    # If the GET parameter \"cluster\" is given we want to filter out\n    # all other clusters.\n    next unless ($file =~ m/$get_cluster(\\.(backup|log))?/);\n    push @backup_files, $file;\n\n    open (FILE, join \"/\",$directory,$file) || die \"Could not open \\\"$file\\\", $!\";\n    my $content = join '', <FILE>;\n    $backups{$file} = $content;\n}\n\n$template->process($page, {\n  SERVER_NAME => $ENV{SERVER_NAME},\n  REMOTE_USER => $ENV{REMOTE_USER},\n  TITLE => \"Backups\",\n  HEADLINE => \"Backups\",\n  BACKUP_FILES => \\@backup_files,\n  BACKUPS => \\%backups,\n}) or die $template->error();\n"
  },
  {
    "path": "portal/cgi-bin/error.pl",
    "content": "#!/usr/bin/perl\n\nuse strict;\nuse warnings;\nuse PgCommon;\nuse Template;\n\nmy $template = Template->new({\n  INCLUDE_PATH => '/usr/share/elephant-shed/template',\n  POST_CHOMP => 1,\n});\n\nprint \"Content-type: text/html\\n\\n\";\n\n$template->process('error.html', {\n  SERVER_NAME => $ENV{SERVER_NAME},\n  REMOTE_USER => $ENV{REMOTE_USER},\n  TITLE => \"$ENV{REDIRECT_STATUS} - PostgreSQL\",\n  HEADLINE => \"Error $ENV{REDIRECT_STATUS}\",\n  REDIRECT_STATUS => $ENV{REDIRECT_STATUS},\n  REDIRECT_SCRIPT_URI => $ENV{REDIRECT_SCRIPT_URI},\n}) or die $template->error();\n"
  },
  {
    "path": "portal/cgi-bin/index_footer.pl",
    "content": "#!/usr/bin/perl\n\nuse strict;\nuse warnings;\nuse Template;\n\nmy $template = Template->new({\n  INCLUDE_PATH => '/usr/share/elephant-shed/template',\n  POST_CHOMP => 1,\n});\n\nprint \"Content-type: text/html\\n\\n\";\n\n$template->process('footer.html', {\n}) or die $template->error();\n"
  },
  {
    "path": "portal/cgi-bin/index_header.pl",
    "content": "#!/usr/bin/perl\n\nuse strict;\nuse warnings;\nuse Template;\n\nmy $template = Template->new({\n  INCLUDE_PATH => '/usr/share/elephant-shed/template',\n  POST_CHOMP => 1,\n});\n\nprint \"Content-type: text/html\\n\\n\";\n\n$template->process('header.html', {\n  SERVER_NAME => $ENV{SERVER_NAME},\n  REMOTE_USER => $ENV{REMOTE_USER},\n  TITLE => \"$ENV{REQUEST_URI} - PostgreSQL\",\n  HEADLINE => $ENV{REQUEST_URI},\n}) or die $template->error();\n"
  },
  {
    "path": "portal/cgi-bin/notloggedin.pl",
    "content": "#!/usr/bin/perl\n\nuse strict;\nuse warnings;\nuse PgCommon;\nuse Template;\n\nmy $template = Template->new({\n  INCLUDE_PATH => '/usr/share/elephant-shed/template',\n  POST_CHOMP => 1,\n});\n\nprint \"Content-type: text/html\\n\\n\";\n\n$template->process('notloggedin.html', {\n  SERVER_NAME => $ENV{SERVER_NAME},\n  TITLE => \"PostgreSQL Appliance\",\n  HEADLINE => \"PostgreSQL Appliance\",\n}) or die $template->error();\n"
  },
  {
    "path": "portal/cgi-bin/portalmain.pl",
    "content": "#!/usr/bin/perl\n\nuse strict;\nuse warnings;\nuse PgCommon;\nuse Template;\n\nmy $pgbadgerdir = \"/var/lib/pgbadger\";\nmy $backupstatusdir = \"/var/www/html/pgbackrest\";\nmy $systemdstatusdir = \"/etc/systemd/system/multi-user.target.wants\";\n\n# get PostgreSQL cluster information\nmy @clusters;\nforeach my $version (get_versions()) {\n  foreach my $cluster (get_version_clusters($version)) {\n    my %info = cluster_info($version, $cluster);\n    $info{version} = $version;\n    $info{cluster} = $cluster;\n    $info{owner} = (getpwuid $info{'owneruid'})[0];\n\n    # pgbadger report\n    if (-e \"$pgbadgerdir/$version-$cluster/LAST_PARSED\") {\n      $info{pgbadger} = \"/pgbadger/$version-$cluster/\";\n    }\n\n    # pgbackrest status\n    if (-e \"$backupstatusdir/$version-$cluster.backup\") {\n      $info{backup} = \"/pgbackrest/$version-$cluster.backup\";\n    }\n    if (not system(\"systemctl status pgbackrest\\@$version-$cluster.timer | grep -q 'Active: active'\")) {\n      $info{backup_enabled} = 1;\n    }\n    if (not system(\"systemctl status pgbackrest-incr\\@$version-$cluster.timer | grep -q 'Active: active'\")) {\n      $info{backup_incr_enabled} = 1;\n    }\n\n    # archive status\n    if (not system(\"pg_conftool $version $cluster show archive_command | grep -q pgbackrest\")) {\n      $info{archive_enabled} = 1;\n    }\n\n    push @clusters, \\%info;\n  }\n}\n\nmy $template = Template->new({\n  INCLUDE_PATH => '/usr/share/elephant-shed/template',\n  POST_CHOMP => 1,\n});\n\nprint \"Content-type: text/html\\n\\n\";\n\n$template->process('portalmain.html', {\n  CLUSTERS => \\@clusters,\n  SERVER_NAME => $ENV{SERVER_NAME},\n  REMOTE_USER => $ENV{REMOTE_USER},\n  TITLE => \"Dashboard - PostgreSQL\",\n  HEADLINE => \"PostgreSQL Appliance Dashboard\",\n}) or die $template->error();\n"
  },
  {
    "path": "portal/cgi-bin/support.pl",
    "content": "#!/usr/bin/perl\n\nuse strict;\nuse warnings;\nuse Template;\n\nmy $template_path = '/usr/share/elephant-shed/template';\nmy $support_page = 'support.html';\n\n\nmy $template = Template->new({\n  INCLUDE_PATH => $template_path,\n  POST_CHOMP => 1,\n});\n\nprint \"Content-type: text/html\\n\\n\";\n\nif (-f $template_path . '/support.partner.html') {\n    $support_page = 'support.partner.html';\n}\n\n$template->process($support_page, {\n  SERVER_NAME => $ENV{SERVER_NAME},\n  REMOTE_USER => $ENV{REMOTE_USER},\n  TITLE => \"Support - PostgreSQL\",\n  HEADLINE => \"PostgreSQL Support\",\n}) or die $template->error();\n"
  },
  {
    "path": "portal/elephant-shed.conf",
    "content": "<VirtualHost *:80>\n  RewriteEngine On\n  RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]\n</VirtualHost>\n\n<VirtualHost *:443>\n  SSLEngine on\n  SSLCertificateFile   /etc/ssl/certs/ssl-cert-snakeoil.pem\n  SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key\n  SSLProxyEngine On\n  SSLProxyCheckPeerCN Off\n  SSLProxyCheckPeerName Off\n\n  ServerAdmin webmaster@localhost\n  DocumentRoot /var/www/html\n  ErrorLog ${APACHE_LOG_DIR}/error.log\n  CustomLog ${APACHE_LOG_DIR}/access.log combined\n  DefineExternalAuth pwauth pipe /usr/sbin/pwauth\n\n  SetOutputFilter DEFLATE\n  AddOutputFilterByType DEFLATE text/plain\n  AddOutputFilterByType DEFLATE text/html\n  AddOutputFilterByType DEFLATE text/xml\n  AddOutputFilterByType DEFLATE text/css\n  AddOutputFilterByType DEFLATE application/xml\n  AddOutputFilterByType DEFLATE application/xhtml+xml\n  AddOutputFilterByType DEFLATE application/rss+xml\n  AddOutputFilterByType DEFLATE application/javascript\n  AddOutputFilterByType DEFLATE application/x-javascript\n\n  Alias /image /usr/share/elephant-shed/image\n\n  Alias /static /usr/share/elephant-shed/static\n  <Directory /usr/share/elephant-shed/static>\n    Satisfy Any\n    Allow from all\n  </Directory>\n\n  Alias /doc /usr/share/elephant-shed/doc\n\n  # directory listings\n  Options +Indexes\n  HeaderName /cgi-bin/index_header.pl\n  ReadmeName /cgi-bin/index_footer.pl\n  IndexOptions HTMLTable FancyIndexing FoldersFirst NameWidth=* VersionSort SuppressHTMLPreamble\n  # mod_autoindex wants the cgi's file type to be text/*\n  AddType text/html .pl\n\n  # custom error pages\n  ErrorDocument 401 /cgi-bin/notloggedin.pl\n  ErrorDocument 403 /cgi-bin/error.pl\n  ErrorDocument 404 /cgi-bin/error.pl\n  ErrorDocument 500 /cgi-bin/error.pl\n  ErrorDocument 503 /cgi-bin/error.pl\n\n  # pgadmin4 3.2 on CentOS 7 doesn't like /pgadmin4\n  RedirectMatch \"/pgadmin4$\" \"/pgadmin4/browser/\"\n\n  # pgBackRest\n  AddType text/plain .backup\n  AddType text/plain .log\n\n  Redirect \"/prometheus\" \"/prometheus/\"\n  <Location /prometheus/>\n    ProxyPass http://127.0.0.1:9090/prometheus/\n    ProxyPassReverse http://127.0.0.1:9090/prometheus/\n  </Location>\n\n  <Location /grafana>\n    ProxyPreserveHost On\n    ProxyPass http://127.0.0.1:3000\n    ProxyPassReverse http://127.0.0.1:3000\n\n    RewriteEngine On\n    # forward authed user to proxied applications\n    RewriteRule .* - [E=PROXY_USER:%{LA-U:REMOTE_USER},NS]\n    RequestHeader set X-WEBAUTH-USER \"%{PROXY_USER}e\"\n\n    RequestHeader unset Authorization\n\n  </Location>\n\n  <IfModule wsgi_module>\n    WSGIDaemonProcess omnidb user=omnidb group=omnidb\n    WSGIScriptAlias /omnidb /usr/share/elephant-shed/omnidb/wsgi.py process-group=omnidb\n    Alias /omnidb/static /usr/lib/python3/dist-packages/OmniDB_app/static\n    <Directory /usr/share/elephant-shed/omnidb>\n      <Files wsgi.py>\n        Require all granted\n      </Files>\n    </Directory>\n    <Directory /usr/lib/python3/dist-packages/OmniDB_app/static>\n      Require all granted\n    </Directory>\n  </IfModule>\n\n  <Location /powa>\n    ProxyPreserveHost On\n    ProxyPass http://127.0.0.1:8888/powa\n    ProxyPassReverse http://127.0.0.1:8888/powa\n  </Location>\n\n  <Location /shellinabox>\n    ProxyPreserveHost On\n    ProxyPass https://127.0.0.1:4200\n    ProxyPassReverse https://127.0.0.1:4200\n  </Location>\n\n Alias \"/pgbadger\" \"/var/lib/pgbadger/\"\n  <Directory /var/lib/pgbadger/>\n    Options +Indexes\n    IndexOptions HTMLTable IgnoreCase FancyIndexing FoldersFirst NameWidth=* VersionSort SuppressHTMLPreamble SuppressLastModified SuppressSize SuppressDescription\n  </Directory>\n\n  # require user for access\n  <Location />\n    AuthType Basic\n    AuthName \"Elephant Shed\"\n    AuthBasicProvider external\n    AuthExternal pwauth\n    Require unix-group elephant-shed\n\n    AddOutputFilterByType SUBSTITUTE text/html\n    Substitute \"s!</head!<link rel=\\\"stylesheet\\\" href=\\\"/static/css/esmenu.css\\\"></head!nq\"\n    Substitute \"s!</body!\\\n<div class=\\\"esmenu\\\">\\\n<hr>\\\n<a target=\\\"_top\\\" href=\\\"../../../../../../../../\\\"><img title=\\\"Portal Home\\\" src=\\\"/image/button_home.png\\\"></a>\\\n<a target=\\\"_top\\\" href=\\\"../../../../../../../../omnidb/\\\"><img title=\\\"OmniDB\\\" src=\\\"/image/button_omnidb.png\\\"></a>\\\n<a target=\\\"_top\\\" href=\\\"../../../../../../../../grafana/\\\"><img title=\\\"Grafana\\\" src=\\\"/image/button_grafana.png\\\"></a>\\\n<a target=\\\"_top\\\" href=\\\"../../../../../../../../prometheus/\\\"><img title=\\\"Prometheus\\\" src=\\\"/image/button_prometheus.png\\\"></a>\\\n<a target=\\\"_top\\\" href=\\\"../../../../../../../../powa/server/\\\"><img title=\\\"PoWA\\\" src=\\\"/image/button_powa.png\\\"></a>\\\n<a target=\\\"_top\\\" href=\\\"../../../../../../../../pgbadger/\\\"><img title=\\\"pgBadger\\\" src=\\\"/image/button_pgbadger.png\\\"></a>\\\n<a target=\\\"_top\\\" href=\\\"../../../../../../../../cgi-bin/backrest.pl\\\"><img title=\\\"pgBackRest\\\" src=\\\"/image/button_pgbackrest.png\\\"></a>\\\n<a target=\\\"_top\\\" href=\\\"../../../../../../../../system\\\"><img title=\\\"Cockpit\\\" src=\\\"/image/button_cockpit.png\\\"></a>\\\n<a target=\\\"_top\\\" href=\\\"../../../../../../../../system/terminal\\\"><img title=\\\"Shell\\\" src=\\\"/image/button_shellinabox.png\\\"></a>\\\n<a target=\\\"_top\\\" href=\\\"../../../../../../../../doc/html/\\\"><img title=\\\"Documentation\\\" src=\\\"/image/button_doc.png\\\"></a>\\\n<a target=\\\"_top\\\" href=\\\"../../../../../../../../cgi-bin/support.pl\\\"><img title=\\\"Support\\\" src=\\\"/image/button_credativ.png\\\"></a>\\\n</div></body!nq\"\n    # cockpit tries to redirect all local links through its websocket, and the only\n    # way around seems to be using ../links (onclick and friends are all caught)\n\n    # Debian stretch's apache runs deflate before substitute, breaking our menu. Disable deflating.\n    RequestHeader unset Accept-Encoding\n  </Location>\n\n  RewriteEngine On\n  # rewrite / to portal menu\n  RewriteRule ^/?$ /cgi-bin/portalmain.pl [PT]\n  # catch Cockpit paths (@ is /@localhost)\n  RewriteRule ^/cockpit/socket wss://127.0.0.1:10090/cockpit/socket [P,L]\n  RewriteRule ^/(apps|cockpit|dashboard|network|system|storage|updates|users|@)(.*) https://127.0.0.1:10090/$1$2 [P]\n\n  <Location ~ \"^/(apps|cockpit|dashboard|network|system|storage|updates|users|@)\">\n    # Fix CSP header\n    RewriteRule . - [env=HOST:%{HTTP_HOST}]\n    Header edit* Content-Security-Policy 127.0.0.1:10090 %{HOST}e\n    # Apache 2.4.6 on CentOS 7 does not interpolate variables here, unset the header instead\n    #Header unset Content-Security-Policy\n    # Origin accepted in cockpit.conf\n    RequestHeader set Origin https://localhost\n    RequestHeader set X-Authorize password\n  </Location>\n\n  # /logout: sending any sort of 401 to the browser makes it forget the current credentials\n  <Location /logout>\n    AuthType Basic\n    AuthName \"Elephant Shed\"\n    AuthBasicProvider external\n    AuthExternal pwauth\n    Require user does-not-exist\n  </Location>\n\n  # allow access to notloggedin page\n  <Location ~ \"^(/favicon.ico|/.*\\.png|/cgi-bin/notloggedin.pl|/cgi-bin/error.pl)\">\n    allow from all\n    satisfy any\n  </Location>\n\n  Alias /favicon.ico /usr/share/elephant-shed/image/favicon.ico\n\n</VirtualHost>\n"
  },
  {
    "path": "portal/static/css/elephant-shed.css",
    "content": "/* General */\nbody {\n    font-family: Arial, Sans-serif;\n}\n\n/* Links */\na {\n    text-decoration: none;\n}\na:link {\n    color: #000000;\n}\na:visited {\n    color: #000000;\n}\na:hover {\n    color: #FF0000;\n    text-decoration: none;\n}\n\n/* Header and Footer */\n.el-header {\n    border-bottom: 0.2em solid red;\n}\n\n.el-footer {\n    border-top: 0.2em solid red;\n}\n\n/* Dashboard Buttons */\n.dash td {\n    padding:1em;\n}\n.dash div div a:hover img {\n    filter: brightness(50%);\n    transition: filter 0.1s;\n}\n\n/* Icons */\n.main_icon {\n  width: 100px;\n  height: 100px;\n  box-shadow: 5px 10px 5px 0px rgba(0,0,0,0.15);\n  border-radius: 24px;\n  margin-bottom: 15px;\n}\n/* Switch */\n.switch {\n  position: relative;\n  display: inline-block;\n  width: 60px;\n  height: 34px;\n}\n\n.switch input {\n    display:none;\n}\n\n.slider {\n  position: absolute;\n  cursor: pointer;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  background-color: #ccc;\n  -webkit-transition: .4s;\n  transition: .4s;\n}\n\n.slider:before {\n  position: absolute;\n  content: \"\";\n  height: 26px;\n  width: 26px;\n  left: 4px;\n  bottom: 4px;\n  background-color: white;\n  -webkit-transition: .4s;\n  transition: .4s;\n}\n\ninput:checked + .slider {\n  background-color: #5c5;\n}\n\ninput:focus + .slider {\n  box-shadow: 0 0 1px #5c5;\n}\n\ninput:checked + .slider:before {\n  -webkit-transform: translateX(26px);\n  -ms-transform: translateX(26px);\n  transform: translateX(26px);\n}\n\n/* Rounded sliders */\n.slider.round {\n  border-radius: 34px;\n}\n\n.slider.round:before {\n  border-radius: 50%;\n}\n\n/* Status */\n.status {\n  width: 24px;\n  height: 24px;\n  background: #ccc;\n  -moz-border-radius: 50%;\n  -webkit-border-radius: 50%;\n  border-radius: 50%;\n  font-weight: bold;\n}\n\n.offline {\n  background: rgb(254, 60, 60);\n}\n\n.online {\n  background: #5c5;\n}\n\n.offlinetext {\n  color: rgb(254, 60, 60);\n}\n\n.onlinetext {\n  color: #5c5;\n}\n\n.recovery {\n  background: purple;\n}\n\n/* Define the hover highlight color for the table row */\n/*.clusterRow:hover{\n  background-color: #eee;\n}*/\n\n.important{\n  font-weight: bold;\n}\n\n/* Detail view */\n.detail {\n  margin-right:auto;\n  margin-left:auto;\n  text-align: center;\n  border: none;\n}\n\n/* Disable bootstrap table-hover for \"detail\" */\n.detail table tr:hover,\n.detail table tr:hover td,\n.detail table tr:hover th {\n  background-color: transparent;\n}\n\n.hidden {\n  display: none;\n}\n\n.more_button {\n  color: #ccc;\n  font-weight: bold;\n  text-align: center;\n  font-size: 24px;\n  cursor:pointer;\n}\n\n.more_button:hover {\n  color: #777;\n  transition: background-color 0.1s;\n}\n"
  },
  {
    "path": "portal/static/css/esmenu.css",
    "content": ".esmenu hr {\n  background: red;\n  height: 0px;\n  border-top: 0;\n  margin-top: 0;\n  margin-bottom: 0;\n}\n\n.esmenu:hover hr {\n  height: 2px;\n}\n\n.esmenu a {\n  text-decoration: none;\n  color: black;\n  font-weight: bold;\n  transition: .5s background-color;\n}\n\n.esmenu a:hover {\n  text-decoration: underline;\n  color: black;\n  transition: .5s background-color;\n}\n\n.esmenu a img {\n  width: 15px;\n  height: 15px;\n  margin-left: 2px;\n  margin-right: 2px;\n  margin-top: 2px;\n  margin-bottom: 2px;\n  transition: 1s all;\n}\n\n.esmenu:hover a img {\n  width: 40px;\n  height: 40px;\n  margin-left: 3px;\n  margin-right: 3px;\n  margin-top: 4px;\n  margin-bottom: 4px;\n  transition: .2s all;\n}\n\n.esmenu a:hover img {\n  filter: brightness(50%);\n  transition: .2s filter;\n}\n\n.esmenu {\n  z-index: 10000;\n  top: 0;\n  position: absolute;\n  left: 0px;\n  right: 0px;\n  margin-left: auto;\n  margin-right: auto;\n  text-align: center;\n  box-shadow: 3px 5px 3px 0px rgba(0,0,0,0.15);\n  width: 220px;\n  background-color: rgba(255,255,255,.15);\n  border: 1px solid black;\n  border-top: 0;\n  border-radius: 10px;\n  overflow: hidden;\n  border-top-left-radius: 0px;\n  border-top-right-radius: 0px;\n  transition: top 0.3s, background-color 1s, width 1s;\n  transition-timing-function: ease-out;\n  transition-delay: 0.0s;\n}\n\n.esmenu:hover {\n  background-color: rgba(255,255,255,1);\n  width: 550px;\n  transition: top 0.2s, width .2s, background-color 0.2s;\n}\n\n"
  },
  {
    "path": "portal/template/backrest.html",
    "content": "[% INCLUDE header.html %]\n\n<div class=\"container col-6 col-offset-3 text-justify\">\n  [% FOREACH file IN BACKUPS %]\n  <h2>[% file.key %]</h2>\n  <pre style=\"overflow: auto; max-height: 30%; max-width=100%;\">\n    [% file.value %]\n  </pre>\n  [% END %]\n</div>\n\n[% INCLUDE footer.html %]\n"
  },
  {
    "path": "portal/template/error.html",
    "content": "[% INCLUDE header.html %]\n\n<div class=\"container col-6 col-offset-3 text-justify\">\n  Sorry, a [% REDIRECT_STATUS %] error occurred while loading [% REDIRECT_SCRIPT_URI %].\n</div>\n\n<div class=\"container col-6 col-offset-3 text-justify\">\n  Entschuldigung, beim Zugriff auf [% REDIRECT_SCRIPT_URI %] trat ein [% REDIRECT_STATUS %]-Fehler auf.\n</div>\n\n[% INCLUDE footer.html %]\n"
  },
  {
    "path": "portal/template/footer.html",
    "content": "<div class=\"container-fluid el-footer\" align=\"center\">\n<a target=\"_blank\" href=\"https://elephant-shed.io\">Elephant Shed</a>\n-- report bugs on <a target=\"_blank\" href=\"https://github.com/credativ/elephant-shed\">GitHub</a>\n</div>\n\n<script src=\"/static/js/jquery-3.2.1.slim.min.js\"></script>\n<script src=\"/static/js/popper.min.js\"></script>\n<script src=\"/static/js/bootstrap.min.js\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "portal/template/header.html",
    "content": "<html>\n  <head>\n    <title>[% TITLE %]</title>\n    <meta http-equiv=\"Content-Type\" content=\"text/html;charset=UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\">\n    <link rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/favicon.ico\">\n    <link rel=\"stylesheet\" href=\"/static/css/bootstrap.min.css\">\n    <link rel=\"stylesheet\" href=\"/static/css/elephant-shed.css\">\n  </head>\n\n  <body>\n    <!-- Head Text -->\n    <div class=\"container-fluid p-3 el-header\">\n      <div class=\"row\">\n\t<div class=\"col-11\">\n\t  <h1>[% HEADLINE %]</h1>\n\t</div>\n\n\t<!-- Logos -->\n\t<!--\n\t<div class=\"col-1\">\n\t  <img src=\"/image/logo_partner.png\" alt=\"partner\" height=\"70\">\n\t</div>\n\t-->\n\t<div class=\"col-1\">\n\t  <a href=\"https://www.credativ.de\" target=\"_blank\"><img src=\"/image/logo_credativ.png\" alt=\"credativ\" height=\"70\"></a>\n\t</div>\n      </div>\n    </div>\n\n    [% IF REMOTE_USER %]\n    <div class=\"container-fluid text-right\">\n      <p>\n\t<a href=\"/users#/[% REMOTE_USER %]\">Logged in as <em>[% REMOTE_USER %]</em></a> - <a href=\"/logout\">Logout</a>\n      </p>\n    </div>\n    [% END %]\n"
  },
  {
    "path": "portal/template/notloggedin.html",
    "content": "[% INCLUDE header.html %]\n\n<div class=\"container col-2 col-offset-5\">\n  <img src=\"/image/button_home.png\" width=\"200\">\n</div>\n\n<div class=\"container col-6 col-offset-3 text-justify\">\n  <h2>Error</h2>\n  <p>\n    A a valid user is required for accessing the PostgreSQL appliance.\n  </p>\n  <p>\n    Every user in the group \"elephant-shed\" is allowed to log in.\n  </p>\n  <h2>Hint</h2>\n  <p>\n    <pre>\n# Every user in the group \"elephant-shed\" is allowed to login at the portal.\n# Add all needed users to this group.\nsudo adduser &lt;USERNAME&gt; elephant-shed\n    </pre>\n  </p>\n</div>\n\n<div class=\"container col-6 col-offset-3 text-center\">\n  <h2><a href=\"/\" style=\"font-size:large;\">Login</a></h2>\n</div>\n\n[% INCLUDE footer.html %]\n"
  },
  {
    "path": "portal/template/portalmain.html",
    "content": "[% INCLUDE header.html %]\n\n<script>\n  function toggleHidden(cluster) {\n      var menu = document.getElementById('cluster_'+cluster);\n      menu.style.display = menu.style.display == \"block\" ? \"none\" : \"block\";\n\n      var button = document.getElementById('button_'+cluster);\n      button.innerHTML = button.innerHTML == \"▲\" ? \"▼\" : \"▲\";\n  }\n</script>\n\n<div class=\"container p-3 dash\">\n  <div class=\"row justify-content-around text-center\">\n    <div class=\"col col-offset-1 component-link\">\n      <a href=\"/\">\n  <img class=\"main_icon\" src=\"/image/button_home.png\" alt=\"Home\">\n  <p>Home</p>\n      </a>\n    </div>\n    <div class=\"col component-link\">\n      <a target=\"_top\" href=\"/omnidb/\">\n  <img class=\"main_icon\" src=\"/image/button_omnidb.png\" alt=\"OmniDB\">\n  <p>DB Administration</p>\n      </a>\n    </div>\n    <div class=\"col component-link\">\n      <a href=\"/grafana/\">\n      <img class=\"main_icon\" src=\"/image/button_grafana.png\" alt=\"Grafana\">\n      <p>Monitoring</p>\n      </a>\n    </div>\n    <div class=\"col component-link\">\n      <a href=\"/prometheus/\">\n  <img class=\"main_icon\" src=\"/image/button_prometheus.png\" alt=\"Prometheus\">\n  <p>Metrics</p>\n      </a>\n    </div>\n    <div class=\"col component-link\">\n      <a href=\"/powa/server/\">\n        <img class=\"main_icon\" src=\"/image/button_powa.png\" alt=\"PoWA\">\n        <p>PoWA</p>\n      </a>\n    </div>\n    <div class=\"col component-link\">\n      <a href=\"/pgbadger/[% IF CLUSTERS.size == 1 AND CLUSTERS.0.pgbadger %][% CLUSTERS.0.version %]-[% CLUSTERS.0.cluster %]/[% END %]\">\n  <img class=\"main_icon\" src=\"/image/button_pgbadger.png\" alt=\"Card image cap\">\n  <p>Log Reports</p>\n      </a>\n    </div>\n\n    <div class=\"w-100 hidden-xs-down\"></div>\n\n    <div class=\"col component-link\">\n      <a href=\"/cgi-bin/backrest.pl\">\n  <img class=\"main_icon\" src=\"/image/button_pgbackrest.png\" alt=\"pgbackrest\">\n  <p>Backup</p>\n      </a>\n    </div>\n    <div class=\"col component-link\">\n      <a href=\"/system\">\n  <img class=\"main_icon\" src=\"/image/button_cockpit.png\" alt=\"cockpit\">\n  <p>System Management</p>\n      </a>\n    </div>\n    <div class=\"col component-link\">\n      <a href=\"/system/terminal\">\n  <img class=\"main_icon\" src=\"/image/button_shellinabox.png\" alt=\"shell\">\n  <p>Shell</p>\n      </a>\n    </div>\n    <div class=\"col component-link\">\n      <a href=\"/doc/html/\">\n  <img class=\"main_icon\" src=\"/image/button_doc.png\" alt=\"documentation\">\n  <p>Documentation</p>\n      </a>\n    </div>\n    <div class=\"col component-link\">\n      <a href=\"/cgi-bin/support.pl\">\n  <img class=\"main_icon\" src=\"/image/button_credativ.png\" alt=\"credativ\">\n  <p>Support</p>\n      </a>\n    </div>\n  </div>\n</div>\n\n\n<div class=\"container\">\n  <h3 align=\"center\">PostgreSQL Cluster</h3>\n  <div class=\"container cluster\">\n    <table class=\"table table-hover\">\n      <thead class=\"thead\">\n        <tr>\n          <th colspan=\"2\">Cluster</th>\n          <th>Port</th>\n          <!--<th>Owner</th>-->\n          <th>Data directory</th>\n          <th>Archiving</th>\n          <th>Full Backup</th>\n          <th>Incr Backup</th>\n          <th></th>\n        </tr>\n      </thead>\n      [% FOREACH cluster IN CLUSTERS.nsort('version') %]\n      <tr class=\"clusterRow\" onclick=\"toggleHidden('[% cluster.version %]_[% cluster.cluster %]');\">\n        <td>\n          <div class=\"status [% IF cluster.running %]online[% ELSE %]offline[% END %]\"></div>\n        </td>\n        <td class=\"important\">[% cluster.version %]/[% cluster.cluster %]</td>\n        <td class=\"clusterRight\">[% cluster.port %]</td>\n        <td>[% cluster.pgdata %]</td>\n        <td class=\"clusterCenter\">\n          <label class=\"switch\" onclick=\"location.href='/system/services#/pgbackrest-toggle-archiving@[% cluster.version %]-[% cluster.cluster %].service'\">\n            <input type=\"checkbox\" [% IF cluster.archive_enabled %]checked[% END %]>\n            <span class=\"slider round\"></span>\n          </label>\n        </td>\n        <td class=\"clusterCenter\">\n          <label class=\"switch\" onclick=\"location.href='/system/services#/pgbackrest@[% cluster.version %]-[% cluster.cluster %].timer'\">\n            <input type=\"checkbox\" [% IF cluster.backup_enabled %]checked[% END %]>\n            <span class=\"slider round\"></span>\n          </label>\n        </td>\n        <td class=\"clusterCenter\">\n          <label class=\"switch\" onclick=\"location.href='/system/services#/pgbackrest-incr@[% cluster.version %]-[% cluster.cluster %].timer'\">\n            <input type=\"checkbox\" [% IF cluster.backup_incr_enabled %]checked[% END %]>\n            <span class=\"slider round\"></span>\n          </label>\n        </td>\n        <td id=\"button_[% cluster.version %]_[% cluster.cluster %]\" class=\"more_button\">▼</td>\n            </tr>\n            <tr>\n        <td colspan=\"9\">\n          <div class=\"detail hidden\" id=\"cluster_[% cluster.version %]_[% cluster.cluster %]\">\n            <table class=\"detail\">\n              <tr>\n                <th colspan=\"2\">systemd</th>\n                <th colspan=\"2\">Report</th>\n                <th colspan=\"3\">Backup</th>\n              </tr>\n              <tr>\n                <td colspan=\"2\">\n                  <div class=\"btn-group\" role=\"group\">\n                    <a type=\"button\" class=\"btn btn-secondary\" href=\"/system/services#/postgresql@[% cluster.version %]-[% cluster.cluster %].service\">Service</a>\n                    <a type=\"button\" class=\"btn btn-secondary\" href=\"/system/logs#/?prio=5&tag=postgres-[% cluster.version %]-[% cluster.cluster %]\">Log</a>\n                  </div>\n                </td>\n                <td colspan=\"2\">\n                  <div class=\"btn-group\" role=\"group\">\n                    <a type=\"button\" class=\"btn btn-secondary\" href=\"/system/services#/pgbadger@[% cluster.version %]-[% cluster.cluster %].service\">Run</a>\n                    <a type=\"button\" class=\"btn btn-secondary[% !(cluster.pgbadger) ? ' disabled' : '' %]\" href=\"[% cluster.pgbadger %]\">Show</a>\n                  </div>\n                </td>\n                <td colspan=\"3\">\n                  <div class=\"btn-group\" role=\"group\">\n                    <a type=\"button\" class=\"btn btn-secondary\" href=\"/system/services#/pgbackrest@[% cluster.version %]-[% cluster.cluster %].service\">Full</a>\n                    <a type=\"button\" class=\"btn btn-secondary\" href=\"/system/services#/pgbackrest-incr@[% cluster.version %]-[% cluster.cluster %].service\">Incremental</a>\n                    <a type=\"button\" class=\"btn btn-secondary[% !(cluster.backup) ? ' disabled' : ''%]\" href=\"/cgi-bin/backrest.pl?cluster=[% cluster.version %]-[% cluster.cluster %]\">Info</a>\n                  </div>\n                </td>\n              </tr>\n            </table>\n          </div>\n        </td>\n      </tr>\n    [% END %]\n    </table>\n  </div>\n</div>\n\n\n[% INCLUDE footer.html %]\n"
  },
  {
    "path": "portal/template/support.html",
    "content": "[% INCLUDE header.html %]\n\n<div class=\"container col-6 col-offset-3 text-justify\">\n  <h2 class=\"text-center\">The Elephant Shed by cre<span style=\"color:red;\">d</span>ativ</h2>\n\n  <h3 class=\"text-center\">Source code</h3>\n  <p>\n    The Elephant Shed is available on <a href=\"https://github.com/credativ/elephant-shed\">GitHub</a>.\n    New releases of this software will be available on the GitHub project page.\n  </p>\n  <p>\n    A list of known issues and bugs is available on <a href=\"https://github.com/credativ/elephant-shed/issues\">GitHub</a> as well.\n    Feel free to open new issues if you think you found a bug.\n    Pull-requests are welcome as well.\n  </p>\n\n  <h3 class=\"text-center\">Support</h3>\n  <p>\n    The Elephant Shed is an open source project by cre<span style=\"color:red;\">d</span>ativ.\n    Our <a href=\"https://www.credativ.de/portfolio/support/postgresql-competence-center/\">PostgreSQL\n      Competence Center</a> supports the Elephant Shed as well as other open source products.\n    If you are interested in support please contact us.\n  </p>\n  <p>\n    <div class=\"text-center\">\n      <span style=\"font-weight: bold;\">Web: </span><a href=\"https://www.credativ.de\">www.credativ.de</a>\n    </div>\n    <div class=\"text-center\">\n      <span style=\"font-weight: bold;\">E-mail: </span><a href=\"mailto:info@credativ.de\">info@credativ.de</a>\n    </div>\n    <div class=\"text-center\">\n      <span style=\"font-weight: bold;\">Phone: </span><a href=\"tel:+4921619174200\">+49 2161 9174200</a>\n    </div>\n  </p>\n\n  <h3 class=\"text-center\">License</h3>\n  <p>\n    Copyright © 2017-2019 credativ GmbH &lt;info@credativ.de&gt;\n  </p>\n  <p>\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n  </p>\n  <p>\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n  </p>\n</div>\n\n[% INCLUDE footer.html %]\n"
  },
  {
    "path": "postgresql/elephant-shed.conf",
    "content": "# Default data directory.\n#data_directory = '/var/lib/postgresql/%v/%c'\n\n# Default directory for transaction logs\n#waldir = '/var/lib/postgresql/xlog/%v/%c/pg_xlog'\n\n# Options to pass to initdb.\n#initdb_options = '--data-checksums'\n\n# The following options are copied into the new cluster's postgresql.conf:\n\n# what IP address(es) to listen on\nlisten_addresses = '*'\n\n# We use 90 % of checkpoint_timeout to write a checkpoint (default since v14)\ncheckpoint_completion_target = 0.9\n\n# Log to syslog as well\nlog_destination = 'stderr,syslog'\n\n# Tag syslog ident with cluster name\nsyslog_ident = 'postgres-%v-%c'\n\n# Add prefix to log lines\nlog_line_prefix = '%%m [%%p] user=%u,db=%d,app=%a,client=%h '\n\n# Use C.UTF-8 as lc_messages to ensure pgBadger is able to parse the log\nlc_messages = 'C.UTF-8'\n\n# Log slow statements\nlog_min_duration_statement = 1s\n\n# Always log checkpoint information\nlog_checkpoints = on\n\n# Log lock waits to debug locking errors\nlog_lock_waits = on\n\n# Log temp files greater than 10 MB\nlog_temp_files = 10MB\n\n# Log autovacuum processes longer then 3 minutes\nlog_autovacuum_min_duration = 3min\n\n# Install lib for pg_stat_statements\nshared_preload_libraries = 'pg_stat_statements, auto_explain'\n\n# Backup\n#archive_command = '/usr/share/elephant-shed/pgbackrest-archivecommand --stanza=%v-%c archive-push %%p'\narchive_command = '/bin/true'\narchive_mode = on\nhot_standby = on\nmax_wal_senders = 5\nmax_replication_slots = 5\nwal_level = hot_standby\n"
  },
  {
    "path": "postgresql/es_ctlcluster",
    "content": "#!/bin/sh\n\n# This script configures PostgreSQL clusters for usage with Elephant Shed.\n\n# Usage: es_ctlcluster <cluster> {enable-powa|enable-powa-addons}\n\nset -eu\n\nif [ -z \"${2:-}\" ]; then\n  echo \"Usage: $0 <version> <cluster> {enable-backup|enable-powa|enable-powa-addons}\"\n  exit 1\nfi\n\ncase $1 in\n  *-*)\n    VERSION=\"${1%%-*}\" CLUSTER=\"${1#*-}\" ACTION=\"$2\" ;;\n  */*)\n    VERSION=\"${1%%/*}\" CLUSTER=\"${1#*/}\" ACTION=\"$2\" ;;\n  *)\n    VERSION=\"$1\" CLUSTER=\"$2\" ACTION=\"$3\" ;;\nesac\n\npg_lsclusters -h \"$VERSION/$CLUSTER\" > /dev/null\nif ! pg_lsclusters -h \"$VERSION/$CLUSTER\" | grep -q online; then\n  echo \"Cluster $VERSION $CLUSTER is not running\"\n  exit 1\nfi\n\nCONFTOOL=\"pg_conftool -s $VERSION $CLUSTER\"\n\nenable_backup()\n{\n  # check whether archiving is activated already\n  archive_command=$($CONFTOOL show archive_command || :)\n  case $archive_command in\n    *true*)\n      systemctl start pgbackrest-toggle-archiving@$VERSION-$CLUSTER ;;\n    *pgbackrest*)\n      echo \"archive_command already configured\" ;;\n  esac\n  systemctl enable pgbackrest@$VERSION-$CLUSTER.timer\n  systemctl start pgbackrest@$VERSION-$CLUSTER.timer\n  systemctl enable pgbackrest-incr@$VERSION-$CLUSTER.timer\n  systemctl start pgbackrest-incr@$VERSION-$CLUSTER.timer\n  echo \"backup for cluster $VERSION-$CLUSTER enabled\"\n}\n\nshared_preload ()\n{\n  local extension=\"$1\"\n  shared_preload_libraries=$($CONFTOOL show shared_preload_libraries || :)\n  case $shared_preload_libraries in\n    *$extension*)\n      return 1 ;; # no restart required\n  esac\n  echo \"Adding $extension to shared_preload_libraries ...\"\n  ( set -x\n    $CONFTOOL set shared_preload_libraries \"${shared_preload_libraries:+$shared_preload_libraries, }$extension\"\n  )\n  return 0\n}\n\nenable_powa ()\n{\n  if [ -x /usr/bin/dpkg ]; then\n    POWA_PKG=\"postgresql-$VERSION-powa\"\n    if ! dpkg -l \"$POWA_PKG\" | grep -q ^ii; then\n      echo \"Installing $POWA_PKG ...\"\n      apt-get install -y \"$POWA_PKG\"\n    fi\n  elif [ -x /usr/bin/rpm ]; then\n    CONTRIB_PKG=\"postgresql$VERSION-contrib\"\n    if ! rpm -q \"$CONTRIB_PKG\" > /dev/null; then\n      echo \"Installing $CONTRIB_PKG ...\"\n      yum install -y \"$CONTRIB_PKG\"\n    fi\n    POWA_PKG=\"powa_$VERSION\"\n    if ! rpm -q \"$POWA_PKG\" > /dev/null; then\n      echo \"Installing $POWA_PKG ...\"\n      yum install -y \"$POWA_PKG\"\n    fi\n  fi\n\n  shared_preload pg_stat_statements && restart=yes\n  shared_preload powa && restart=yes\n  if [ \"${restart:-}\" ]; then\n    echo \"Restarting cluster ...\"\n    pg_ctlcluster \"$VERSION\" \"$CLUSTER\" restart\n  fi\n\n  echo \"Setting up powa user and database ...\"\n  su postgres <<EOF\n    set -eu\n    [ \\$(psql -X --cluster \"$VERSION/$CLUSTER\" -Atc \"select datname from pg_database where datname = 'powa'\") ] ||\n    createdb --cluster \"$VERSION/$CLUSTER\" --echo powa\n    psql -X --cluster \"$VERSION/$CLUSTER\" -c \"create extension if not exists powa cascade\" powa\nEOF\n\n  echo \"Updating powa-web configuration ...\"\n  update-powa-web-config\n}\n\nenable_powa_addons ()\n{\n  if [ -x /usr/bin/dpkg ]; then\n    EXTENSIONS=\"pg-qualstats pg-wait-sampling pg-stat-kcache pg-track-settings hypopg\"\n    for EXTENSION in $EXTENSIONS; do\n      PKG=\"postgresql-$VERSION-$EXTENSION\"\n      if ! dpkg -l \"$PKG\" | grep -q ^ii; then\n        echo \"Installing $PKG ...\"\n        apt-get install -y \"$PKG\"\n      fi\n    done\n  elif [ -x /usr/bin/rpm ]; then\n    EXTENSIONS=\"pg_qualstats pg-stat-kcache pg_track_settings hypogpg\"\n    for EXTENSION in $EXTENSIONS; do\n      PKG=\"$EXTENSION_$VERSION\"\n      if ! rpm -q \"$PKG\" > /dev/null; then\n        echo \"Installing $PKG ...\"\n        yum install -y \"$PKG\"\n      fi\n    done\n  fi\n\n  for EXTENSION in $EXTENSIONS; do\n    if [ \"$EXTENSION\" = \"pg-track-settings\" -o \"$EXTENSION\" = \"pg_track_settings\" ]; then\n      continue\n    fi\n    shared_preload $(echo $EXTENSION | tr '-' '_') && restart=yes\n  done\n  if [ \"${restart:-}\" ]; then\n    echo \"Restarting cluster ...\"\n    pg_ctlcluster \"$VERSION\" \"$CLUSTER\" restart\n  fi\n  for EXTENSION in $EXTENSIONS; do\n    su postgres <<EOF\n      set -eu\n      psql -X --cluster \"$VERSION/$CLUSTER\" -c \"create extension if not exists $(echo $EXTENSION | tr '-' '_') cascade\" powa\nEOF\n  done\n}\n\ncase $ACTION in\n  enable-backup)\n    enable_backup ;;\n  enable-powa)\n    enable_powa ;;\n  enable-powa-addons)\n    enable_powa_addons ;;\n  *)\n    echo \"Error: unknown action '$ACTION'\"\n    exit 1 ;;\nesac\n"
  },
  {
    "path": "postgresql/rsyslog-postgresql-discard.conf",
    "content": "if $programname startswith 'postgres' then stop"
  },
  {
    "path": "powa/update-powa-web-config",
    "content": "#!/usr/bin/perl\n\nuse strict;\nuse warnings;\nuse PgCommon;\nuse JSON;\nuse File::Temp qw(tempfile);\n\nmy $powaconf = \"/etc/powa-web.conf\";\nmy $servers = {};\nmy ($cookie, $mode, $user, $group);\nmy $json = JSON->new;\n$json->canonical(1);\n$json->indent(1);\n\n# list all clusters\nforeach my $version (get_versions()) {\n  foreach my $cluster (get_version_clusters($version)) {\n    my %info = cluster_info($version, $cluster);\n    my $port = get_cluster_port($version, $cluster);\n\n    $servers->{\"$version/$cluster\"} = {\n      'host' => 'localhost',\n      'port' => $port,\n      'database' => 'powa',\n      'query' => {'client_encoding' => 'utf8'},\n    };\n  }\n}\n\n# retrieve cookie and modes from existing config file\nif(open(my $fh, \"<\", $powaconf)) {\n  # cookie_secret=\"xx\"\n  while (<$fh>) {\n    $cookie = $1 if /^cookie_secret=\"(\\S+)\"/;\n  }\n  close $fh;\n  ($mode, $user, $group) = (stat $powaconf)[2, 4, 5];\n}\n# if not found, generate a new one\nif (not defined $cookie) {\n  $cookie = `dd if=/dev/urandom bs=1k count=1 2>/dev/null | sha1sum | cut -d ' ' -f 1`;\n  chomp $cookie;\n  ($mode, $user, $group) = qw(0644 0 0);\n}\n\n# write output, preserving old mode and owner\nmy ($fh, $filename) = tempfile(\"powa-web.conf.XXXXXX\", DIR => \"/etc\", UNLINK => 1);\nmy $js = $json->encode($servers);\nprint $fh \"servers=$js\\nurl_prefix=\\\"/powa\\\"\\ncookie_secret=\\\"$cookie\\\"\\n\" or die \"$filename: $!\";\nclose $fh or die \"$filename: $!\";\nchmod $mode, $filename or die \"$filename: $!\";\nchown $user, $group, $filename or die \"$filename: $!\";\nrename $filename, $powaconf or die \"$powaconf: $!\";\n# restart powa-web\nsystem('systemctl restart powa-web')\n"
  },
  {
    "path": "prometheus/elephant-shed-prometheus",
    "content": "# Set go garbage collector to clean up more frequently\nGOGC=40\nGOMAXPROCS=2\n\n# Set the command-line arguments to pass to the server.\nARGS=\"--config.file /etc/prometheus/elephant-shed-prometheus.yml \\\n      --web.external-url http://127.0.0.1:9090/prometheus/ \\\n      --web.listen-address 127.0.0.1:9090 \\\n      --storage.tsdb.retention=90d\"\n\n# Prometheus supports the following options:\n#  --config.file=\"/etc/prometheus/prometheus.yml\"\n#                             Prometheus configuration file path.\n#  --web.listen-address=\"0.0.0.0:9090\"\n#                             Address to listen on for UI, API, and telemetry.\n#  --web.read-timeout=5m      Maximum duration before timing out read of the\n#                             request, and closing idle connections.\n#  --web.max-connections=512  Maximum number of simultaneous connections.\n#  --web.external-url=<URL>   The URL under which Prometheus is externally\n#                             reachable (for example, if Prometheus is served\n#                             via a reverse proxy). Used for generating\n#                             relative and absolute links back to Prometheus\n#                             itself. If the URL has a path portion, it will\n#                             be used to prefix all HTTP endpoints served by\n#                             Prometheus. If omitted, relevant URL components\n#                             will be derived automatically.\n#  --web.route-prefix=<path>  Prefix for the internal routes of web endpoints.\n#                             Defaults to path of --web.external-url.\n#  --web.local-assets=\"/usr/share/prometheus/web/\"\n#                             Path to static asset/templates directory.\n#  --web.user-assets=<path>   Path to static asset directory, available at\n#                             /user.\n#  --web.enable-lifecycle     Enable shutdown and reload via HTTP request.\n#  --web.enable-admin-api     Enables API endpoints for admin control actions.\n#  --web.console.templates=\"/etc/prometheus/consoles\"\n#                             Path to the console template directory,\n#                             available at /consoles.\n#  --web.console.libraries=\"/etc/prometheus/console_libraries\"\n#                             Path to the console library directory.\n#  --storage.tsdb.path=\"/var/lib/prometheus/metrics2/\"\n#                             Base path for metrics storage.\n#  --storage.tsdb.min-block-duration=2h\n#                             Minimum duration of a data block before being\n#                             persisted.\n#  --storage.tsdb.max-block-duration=<duration>\n#                             Maximum duration compacted blocks may span.\n#                             (Defaults to 10% of the retention period)\n#  --storage.tsdb.retention=15d\n#                             How long to retain samples in the storage.\n#  --storage.tsdb.no-lockfile\n#                             Do not create lockfile in data directory.\n#  --alertmanager.notification-queue-capacity=10000\n#                             The capacity of the queue for pending alert\n#                             manager notifications.\n#  --alertmanager.timeout=10s\n#                             Timeout for sending alerts to Alertmanager.\n#  --query.lookback-delta=5m  The delta difference allowed for retrieving\n#                             metrics during expression evaluations.\n#  --query.timeout=2m         Maximum time a query may take before being\n#                             aborted.\n#  --query.max-concurrency=20\n#                             Maximum number of queries executed concurrently.\n#  --log.level=info           Only log messages with the given severity or\n#                             above. One of: [debug, info, warn, error]\n\n"
  },
  {
    "path": "prometheus/elephant-shed-prometheus.conf",
    "content": "[Service]\nEnvironmentFile=/etc/default/elephant-shed-prometheus\n"
  },
  {
    "path": "prometheus/elephant-shed-prometheus.yml",
    "content": "# The Elephant Shed's Prometheus config\n\nglobal:\n  scrape_interval: 30s\n\n  # Attach these labels to any time series or alerts when communicating with\n  # external systems (federation, remote storage, Alertmanager).\n  external_labels:\n  #    monitor: 'example'\n\nscrape_configs:\n  # scrape data from prometheus itself\n  - job_name: prometheus\n    scrape_interval: 300s\n    metrics_path: /prometheus/metrics\n    static_configs:\n      - targets: ['localhost:9090']\n  # scrape data from node_exporter\n  - file_sd_configs:\n    - files:\n      - /etc/prometheus/node_exporter/*.yml\n    job_name: node\n    relabel_configs:\n    - source_labels:\n      - __address__\n      target_label: __param_target\n    - regex: (.+)\n      replacement: ${1};\n      source_labels:\n      - instance\n      target_label: __tmp_instance\n    - regex: ([^:;]+)((:[0-9]+)?|;(.*))\n      replacement: ${1}\n      separator: ''\n      source_labels:\n      - __tmp_instance\n      - __address__\n      target_label: instance\n  # scrape data from sql_exporter\n  - file_sd_configs:\n    - files:\n      - /etc/prometheus/sql_exporter/*.yml\n    job_name: sql\n    relabel_configs:\n    - regex: (.+)\n      replacement: ${1};\n      source_labels:\n      - instance\n      target_label: __tmp_instance\n    - regex: ([^:;]+)((:[0-9]+)?|;(.*))\n      replacement: ${1}\n      separator: ''\n      source_labels:\n      - __tmp_instance\n      - __address__\n      target_label: instance\n"
  },
  {
    "path": "rpm/56-authnz_external.conf",
    "content": "# Load authnz_external for elephant-shed-portal authentication\n# (This file is part of elephant-shed-portal)\nLoadModule authnz_external_module modules/mod_authnz_external.so\n"
  },
  {
    "path": "rpm/README",
    "content": "== CentOS/RHEL 7 package installation instructions ==\n\nelephant-shed depends on EPEL and PGDG software repositories. You\nneed to enable them first, before installing elephant-shed packages.\nThe following steps should be performed as root (if not noted otherwise).\n\n* EPEL\n\n   $ yum install epel-release\n\n* PGDG\n\nRepository packages can be retrieved from\n\n   https://yum.postgresql.org/repopackages.php\n\nChoose either CentOS or RHEL repository packages, depending on your\ntarget platform. Here for example PostgreSQL 10 repository packages for CentOS 7:\n\n   $ yum install https://download.postgresql.org/pub/repos/yum/10/redhat/rhel-7-x86_64/pgdg-centos10-10-2.noarch.rpm\n\n* elephant-shed package repository\n\nInstall the repository package from https://packages.credativ.com:\n\n   $ yum install https://packages.credativ.com/public/postgresql/yum/credativ-repo-1-1.noarch.rpm\n\n* RPM installation steps\n\nUpdate the yum cache\n\n   $ yum makecache\n\nInstall elephant-shed\n\n   $ yum install elephant-shed\n"
  },
  {
    "path": "rpm/elephant-shed.spec",
    "content": "Name:           elephant-shed\nVersion:        %{package_version}\nRelease:        %{package_release}%{?dist}\nBuildArch:      noarch\nSummary:        PostgreSQL dashboard\nPackager:       credativ GmbH <info@credativ.de>\nLicense:        GPLv3+\nURL:            https://packages.debian.org/sid/%{name}\nSource0:        http://ftp.debian.org/debian/pool/main/p/%{name}/%{name}_%{version}.tar.xz\n#BuildRequires:  python-sphinx\nRequires: elephant-shed-cockpit\nRequires: elephant-shed-grafana\nRequires: elephant-shed-pgbackrest\nRequires: elephant-shed-pgbadger\nRequires: elephant-shed-portal\nRequires: elephant-shed-postgresql\nRequires: elephant-shed-powa\nRequires: elephant-shed-prometheus\nRequires: elephant-shed-prometheus-node-exporter\nRequires: elephant-shed-prometheus-sql-exporter\nRequires: elephant-shed-shellinabox\nRequires: elephant-shed-tmate\n\n%description\nThe Elephant Shed is a web-based PostgreSQL management front-end.\nThis meta package depends on all Elephant Shed components.\n\n%package -n elephant-shed-portal\nSummary: PostgreSQL dashboard -- web interface\nRequires: shadow-utils\nRequires: httpd\nRequires: mod_ssl\nRequires: mod_authnz_external\nRequires: pwauth\nRequires: mod_authz_unixgroup\nRequires: perl-Template-Toolkit\n#Requires: libcgi-pm-perl\n%description -n elephant-shed-portal\nThe Elephant Shed is a web-based PostgreSQL management front-end.\nThis package provides the web interface.\n%post -n elephant-shed-portal\ngroupadd --system elephant-shed || :\nsystemctl enable httpd\nsystemctl restart httpd\n\n%package -n elephant-shed-postgresql\nRequires: shadow-utils\nRequires: postgresql-common >= 183\nSummary: PostgreSQL dashboard -- PostgreSQL integration\n%description -n elephant-shed-postgresql\n The Elephant Shed is a web-based PostgreSQL management front-end.\n .\n This package provides the integration with PostgreSQL.\n\n%package -n elephant-shed-pgbadger\nRequires: pgbadger >= 9\nRequires: postgresql-common\nSummary: PostgreSQL dashboard -- pgBadger integration\n%description -n elephant-shed-pgbadger\n The Elephant Shed is a web-based PostgreSQL management front-end.\n .\n This package provides the integration with pgBadger.\n%post -n elephant-shed-pgbadger\ninstall -d -o postgres -g postgres /var/lib/pgbadger\nsystemctl daemon-reload\nsystemctl enable pgbadger.timer\nsystemctl start pgbadger.timer\nsystemctl start pgbadger\n\n%package -n elephant-shed-pgbackrest\nRequires: pgbackrest\nRequires: postgresql-common\nSummary: PostgreSQL dashboard -- pgBackRest integration\n%description -n elephant-shed-pgbackrest\n The Elephant Shed is a web-based PostgreSQL management front-end.\n .\n This package provides the integration with pgBackRest.\n%post -n elephant-shed-pgbackrest\nsystemctl daemon-reload\ninstall -d -o postgres -g postgres /var/lib/pgbackrest /var/www/html/pgbackrest\nchown postgres: /etc/pgbackrest.conf\n\n%package -n elephant-shed-powa\nRequires: powa_14-web\nSummary: PostgreSQL dashboard -- powa\n%description -n elephant-shed-powa\n The Elephant Shed is a web-based PostgreSQL management front-end.\n .\n This package provides the integration with powa\n%post -n elephant-shed-powa\nupdate-powa-web-config\nsystemctl enable powa-web-14\nsystemctl start powa-web-14\n\n%package -n elephant-shed-grafana\nRequires: curl\nRequires: grafana >= 5\nSummary: PostgreSQL dashboard -- Grafana integration\n%description -n elephant-shed-grafana\n The Elephant Shed is a web-based PostgreSQL management front-end.\n .\n This package provides the integration with Grafana.\n%post -n elephant-shed-grafana\nsystemctl daemon-reload\nsystemctl enable grafana-server.service\nsystemctl start grafana-server.service\n\n%package -n elephant-shed-prometheus\nRequires: prometheus2\nSummary: PostgreSQL dashboard -- Prometheus integration\n%description -n elephant-shed-prometheus\n The Elephant Shed is a web-based PostgreSQL management front-end.\n .\n This package provides the integration with Prometheus.\n%post -n elephant-shed-prometheus\nsystemctl daemon-reload\nsystemctl enable prometheus\nsystemctl start prometheus\n\n%package -n elephant-shed-prometheus-node-exporter\nRequires: node_exporter >= 0.16.0\nSummary: PostgreSQL dashboard -- Node exporter integration\n%description -n elephant-shed-prometheus-node-exporter\n The Elephant Shed is a web-based PostgreSQL management front-end.\n .\n This package provides the integration with the Prometheus node\n exporter.\n%post -n elephant-shed-prometheus-node-exporter\nsystemctl daemon-reload\nsystemctl enable node_exporter\nsystemctl start node_exporter\n\n%package -n elephant-shed-prometheus-sql-exporter\nRequires: perl-YAML\nRequires: postgresql-common\nRequires: sql_exporter\nSummary: PostgreSQL dashboard -- SQL exporter integration\n%description -n elephant-shed-prometheus-sql-exporter\n The Elephant Shed is a web-based PostgreSQL management front-end.\n .\n This package provides the integration with the Prometheus SQL\n exporter.\n%post -n elephant-shed-prometheus-sql-exporter\nsystemctl daemon-reload\nsystemctl enable prometheus-sql-exporter\nsystemctl start prometheus-sql-exporter\nsystemctl enable prometheus-sql-exporter-restart.timer\nsystemctl start prometheus-sql-exporter-restart.timer\n\n%package -n elephant-shed-cockpit\nRequires: cockpit\nRequires: cockpit-packagekit\nSummary: PostgreSQL dashboard -- cockpit integration\n%description -n elephant-shed-cockpit\n The Elephant Shed is a web-based PostgreSQL management front-end.\n .\n This package provides the integration with cockpit.\n%post -n elephant-shed-cockpit\nsystemctl daemon-reload\n# create /run/cockpit\nsystemd-tmpfiles --create\n# allow cockpit to use port 10090\nsemanage port -a -t websm_port_t -p tcp 10090\n# allow apache to connect to any port\nsetsebool -P httpd_can_network_connect true\nsystemctl enable cockpit.socket\nsystemctl start cockpit.socket\n\n%package -n elephant-shed-shellinabox\nRequires: shellinabox\nSummary: PostgreSQL dashboard -- shellinabox integration\n%description -n elephant-shed-shellinabox\n The Elephant Shed is a web-based PostgreSQL management front-end.\n .\n This meta package provides the integration with shellinabox.\n%post -n elephant-shed-shellinabox\nsystemctl daemon-reload\nsystemctl enable shellinaboxd\nsystemctl start shellinaboxd\n\n%package -n elephant-shed-tmate\nRequires: tmate\nSummary: PostgreSQL dashboard -- tmate integration\n%description -n elephant-shed-tmate\n The Elephant Shed is a web-based PostgreSQL management front-end.\n .\n This package provides the integration with tmate.\n\n%prep\n# unpack tarball, ignoring the name of the top level directory inside\n%setup -c\nmv */* .\n\n%build\n#make\n\n%install\nrm -rf %{buildroot}\n# install in subpackages using the Debian files\nfor inst in debian/*.install; do\n    pkg=$(basename $inst .install)\n    [ \"$pkg\" = \"elephant-shed-omnidb\" ] && continue # not supported on RH yet\n    echo \"### Reading $pkg files list from $inst ###\"\n    while read file dir; do\n        case $file in\n          portal/cgi-bin) dir=\"var/www\" ;;\n          portal/elephant-shed.conf) dir=\"etc/httpd/conf.d\" ;;\n        esac\n        mkdir -p %{buildroot}/$dir\n        cp -r $file %{buildroot}/$dir\n        echo \"/$dir/${file##*/}\" >> files-$pkg\n    done < $inst\ndone\n\n# update httpd paths for CentOS\nsed -i -e 's!SSLCertificateFile.*!SSLCertificateFile /etc/pki/tls/certs/localhost.crt!' \\\n       -e 's!SSLCertificateKeyFile.*!SSLCertificateKeyFile /etc/pki/tls/private/localhost.key!' \\\n       -e 's!ErrorLog.*!ErrorLog /var/log/httpd/error_log!' \\\n       -e 's!CustomLog.*!CustomLog /var/log/httpd/access_log combined!' \\\n       -e 's!Header edit.*Content-Security-Policy.*!#&!' \\\n       -e '/Header unset Content-Security-Policy/s/#//' \\\n       -e 's!DefineExternalAuth.*!DefineExternalAuth pwauth pipe /usr/bin/pwauth!' \\\n  %{buildroot}/etc/httpd/conf.d/elephant-shed.conf\n# load authnz_external (it doesn't do that by itself)\nmkdir -p %{buildroot}/etc/httpd/conf.modules.d\ncp rpm/56-authnz_external.conf %{buildroot}/etc/httpd/conf.modules.d\necho /etc/httpd/conf.modules.d/56-authnz_external.conf >> files-elephant-shed-portal\n\n# PostgreSQL integration\n# CentOS 7 does not have C.UTF-8\nsed -i -e 's/C\\.UTF-8/en_US.utf8/g' \\\n  %{buildroot}/etc/postgresql-common/createcluster.d/elephant-shed.conf\n\n# prometheus2.rpm uses a different variable for extra arguments\n# preserve storage.tsdb.path from /etc/default/prometheus\nsed -i -e 's!^ARGS=\"!PROMETHEUS_OPTS=\"--storage.tsdb.path=/var/lib/prometheus/data !' %{buildroot}/etc/default/elephant-shed-prometheus\n\n# node exporter service is named differently on CentOS, and uses a different variable for extra arguments\nmv %{buildroot}/etc/systemd/system/prometheus-node-exporter.service.d %{buildroot}/etc/systemd/system/node_exporter.service.d\nsed -i -e 's!prometheus-node-exporter.service.d!node_exporter.service.d!' files-elephant-shed-prometheus-node-exporter\nsed -i -e 's!^ARGS=!NODE_EXPORTER_OPTS=!' %{buildroot}/etc/default/elephant-shed-prometheus-node-exporter\n\n%files -n elephant-shed-portal                   -f files-elephant-shed-portal\n%files -n elephant-shed-postgresql               -f files-elephant-shed-postgresql\n%files -n elephant-shed-pgbadger                 -f files-elephant-shed-pgbadger\n%files -n elephant-shed-pgbackrest               -f files-elephant-shed-pgbackrest\n%files -n elephant-shed-powa                     -f files-elephant-shed-powa\n%files -n elephant-shed-grafana                  -f files-elephant-shed-grafana\n%files -n elephant-shed-prometheus               -f files-elephant-shed-prometheus\n%files -n elephant-shed-prometheus-node-exporter -f files-elephant-shed-prometheus-node-exporter\n%files -n elephant-shed-prometheus-sql-exporter  -f files-elephant-shed-prometheus-sql-exporter\n%files -n elephant-shed-cockpit                  -f files-elephant-shed-cockpit\n%files -n elephant-shed-shellinabox\n%files -n elephant-shed-tmate                    -f files-elephant-shed-tmate\n%files -n elephant-shed\n"
  },
  {
    "path": "rpm/tmate.spec",
    "content": "Name: tmate\nVersion: 2.2.1\nRelease: 1\nLicense: BSD\nSummary: Instant Terminal Sharing\nBuildArch: x86_64\nSource: https://github.com/tmate-io/tmate/archive/%{version}.tar.gz\n\nBuildRequires: openssl-devel zlib-devel ruby ncurses-devel libssh-devel msgpack-devel libevent-devel\nRequires: openssl zlib ncurses libssh msgpack libevent\n\n%description\n\nTmate is a fork of tmux. It provides an instant pairing solution.\n\n%prep\n\n%setup -n tmate-%{version}\n\n%build\n\n./autogen.sh\n./configure --prefix=/usr\nmake\n\n%install\n\nmake install DESTDIR=%buildroot\n\n%clean\n\nrm -rf %buildroot\n\n%files\n%defattr(-,root,root,-)\n%{_bindir}/%{name}\n%{_mandir}/man1/%{name}.1.gz\n\n%changelog\n* Thu Oct 18 2018 Bernd Helmle <bernd.helmle@credativ.de> 2.2.1-1\n- Upstream release 2.2.1\n"
  },
  {
    "path": "sql-exporter/SAMPLE.yml",
    "content": "# Files here named *.yml will be used by update-prometheus-sql-exporter-config\n# to update the prometheus-sql-exporter config in /var/run/postgresql/.\n# Queries with scope 'cluster' are executed once per cluster (via the\n# 'postgres' database). Scope 'database' queries are executed in each database.\n# Example:\n\n#- name: \"application_hits\"\n#  help: \"Web hits in our application\"\n#  scope: database # or 'cluster'\n#  min_version: 9.0\n#  max_version: 9.6\n#  # alternative: version: 10 # run only on this version (regexp)\n#  cluster: main # run only on this cluster (regexp)\n#  database: appdb # run only on this database (regexp)\n#  interval: 1h # only run the query every $interval (default: run synchronously)\n#  labels:\n#    - \"username\"\n#  values:\n#    - \"count\"\n#  query: |\n#          SELECT username, count(*) FROM applog GROUP BY username\n"
  },
  {
    "path": "sql-exporter/activity.yml",
    "content": "# queries run once per cluster (via the 'postgres' database)\n\n- name: \"running_queries\"\n  help: \"number of running queries\"\n  scope: cluster\n  labels:\n    - \"datname\"\n    - \"usename\"\n  values:\n    - \"count\"\n  query: >-\n          SELECT datname::text, usename::text, COUNT(*)::float AS count\n          FROM pg_stat_activity\n          WHERE NOT datname ~ '^template(0|1)$' AND usename IS NOT NULL\n          GROUP BY datname, usename\n\n- name: \"pg_stat_activity\"\n  help: \"running backends by database and state\"\n  scope: cluster\n  labels:\n    - \"datname\"\n    - \"state\"\n  values:\n    - \"count\"\n    - \"max_tx_duration\"\n  query: >-\n          SELECT\n                  pg_database.datname::text,\n                  states.state::text,\n                  COALESCE(count, 0) as count,\n                  COALESCE(max_tx_duration, 0) as max_tx_duration\n          FROM\n                  (VALUES ('active'),\n                          ('waiting'),\n                          ('idle'),\n                          ('idle in transaction'),\n                          ('idle in transaction (aborted)'),\n                          ('fastpath function call'),\n                          ('disabled')) AS states(state)\n          CROSS JOIN pg_database\n          LEFT JOIN\n                  (SELECT\n                          datname,\n                          CASE WHEN state = 'active' AND wait_event_type = 'Lock' THEN 'waiting' ELSE state END AS state,\n                          count(*) AS count,\n                          MAX(EXTRACT(EPOCH FROM now() - xact_start))::float AS max_tx_duration\n                  FROM pg_stat_activity WHERE backend_type = 'client backend' AND pid != pg_backend_pid()\n                  GROUP BY 1, 2) AS act\n          ON states.state = act.state AND pg_database.datname = act.datname\n          WHERE NOT pg_database.datname ~ '^template(0|1)$'\n"
  },
  {
    "path": "sql-exporter/elephant-shed.conf",
    "content": "[Unit]\n# forget default config file location\nConditionPathExists=\n# wait for PostgreSQL to start up\nAfter=postgresql.service\n# If no PostgreSQL cluster exist, we dont't start.\nConditionPathExistsGlob=/etc/postgresql/*/*/postgresql.conf\n\n[Service]\n# before starting the sql exporter, generate config (as root)\nPermissionsStartOnly=true\nExecStartPre=/usr/bin/update-prometheus-sql-exporter-config /etc/prometheus-sql-exporter /var/run/postgresql/prometheus-sql-exporter.yml\nEnvironment=\"ARGS=-config.file /var/run/postgresql/prometheus-sql-exporter.yml\"\nEnvironment=\"GOMAXPROCS=1\"\n"
  },
  {
    "path": "sql-exporter/io.yml",
    "content": "# queries run once per cluster (via the 'postgres' database)\n\n- name: \"pg_stat_io\"\n  help: \"I/O statistics\"\n  scope: cluster\n  min_version: 16\n  type: \"counter\"\n  labels:\n    - \"backend_type\"\n    - \"object\"\n    - \"context\"\n  values:\n    - \"reads\"\n    - \"read_time\"\n    - \"writes\"\n    - \"write_time\"\n    - \"writebacks\"\n    - \"writeback_time\"\n    - \"extends\"\n    - \"extend_time\"\n    - \"hits\"\n    - \"evictions\"\n    - \"reuses\"\n    - \"fsyncs\"\n    - \"fsync_time\"\n  query: >-\n          SELECT\n          backend_type::text,\n          object::text,\n          context::text,\n          COALESCE(reads::float, 0) AS reads,\n          COALESCE(read_time::float, 0) AS read_time,\n          COALESCE(writes::float, 0) AS writes,\n          COALESCE(write_time::float, 0) AS write_time,\n          COALESCE(writebacks::float, 0) AS writebacks,\n          COALESCE(writeback_time::float, 0) AS writeback_time,\n          COALESCE(extends::float, 0) AS extends,\n          COALESCE(extend_time::float, 0) AS extend_time,\n          COALESCE(hits::float, 0) AS hits,\n          COALESCE(evictions::float, 0) AS evictions,\n          COALESCE(reuses::float, 0) AS reuses,\n          COALESCE(fsyncs::float, 0) AS fsyncs,\n          COALESCE(fsync_time::float, 0) AS fsync_time\n          FROM\n          pg_stat_io\n          WHERE\n          backend_type NOT IN ('autovacuum launcher', 'startup', 'standalone backend');\n"
  },
  {
    "path": "sql-exporter/prometheus-sql-exporter-restart.service",
    "content": "[Unit]\nDescription=Restart prometheus-sql-exporter to update config based on clusters and databases present on the system\n\n[Service]\nType=oneshot\nExecStart=/bin/systemctl try-restart prometheus-sql-exporter.service\n\n[Install]\n# when enabled, start along with postgresql\nWantedBy=postgresql.service\n"
  },
  {
    "path": "sql-exporter/prometheus-sql-exporter-restart.timer",
    "content": "[Unit]\nDescription=Restart prometheus-sql-exporter every 10 minutes to update config based on clusters and databases present on the system\n\n[Timer]\nOnCalendar=*:0/10\n\n[Install]\nWantedBy=multi-user.target\n"
  },
  {
    "path": "sql-exporter/queries.yml",
    "content": "# queries run once per cluster (via the 'postgres' database)\n\n- name: \"server\"\n  help: \"Server version, role and start time\"\n  scope: cluster\n  labels:\n    - \"server_version\"\n  values:\n    - \"server_start_time\"\n    - \"server_is_primary\"\n    - \"server_is_replica\"\n  query: >-\n          SELECT\n          split_part(current_setting('server_version'), ' ', 1) AS server_version,\n          extract(epoch FROM pg_postmaster_start_time())::float AS server_start_time,\n          CASE WHEN pg_is_in_recovery() THEN 0 ELSE 1 END AS server_is_primary,\n          CASE WHEN NOT pg_is_in_recovery() THEN 0 ELSE 1 END AS server_is_replica\n\n- name: \"settings\"\n  help: \"PostgreSQL settings\"\n  scope: cluster\n  min_version: 9.5\n  max_version: 10\n  labels:\n    - \"settings\"\n  values:\n    - \"data_checksums\"\n    - \"max_connections\"\n    - \"autovacuum_freeze_max_age\"\n    - \"superuser_reserved_connections\"\n    - \"max_wal_senders\"\n    - \"max_prepared_transactions\"\n    - \"max_worker_processes\"\n    - \"random_page_cost\"\n    - \"seq_page_cost\"\n    - \"checkpoint_timeout\"\n    - \"work_mem\"\n    - \"maintenance_work_mem\"\n    - \"shared_buffers\"\n    - \"effective_cache_size\"\n    - \"max_wal_size\"\n  query: >-\n          SELECT\n          current_setting('data_checksums')::bool::int::float AS data_checksums,\n          current_setting('max_connections')::float AS max_connections,\n          current_setting('autovacuum_freeze_max_age')::float AS autovacuum_freeze_max_age,\n          current_setting('superuser_reserved_connections')::float AS superuser_reserved_connections,\n          current_setting('max_wal_senders')::float AS max_wal_senders,\n          current_setting('max_prepared_transactions')::float AS max_prepared_transactions,\n          current_setting('max_worker_processes')::float AS max_worker_processes,\n          current_setting('random_page_cost')::float AS random_page_cost,\n          current_setting('seq_page_cost')::float AS seq_page_cost,\n          (SELECT setting FROM pg_settings WHERE name = 'checkpoint_timeout') AS checkpoint_timeout,\n          pg_size_bytes(current_setting('work_mem'))::float AS work_mem,\n          pg_size_bytes(current_setting('maintenance_work_mem'))::float AS maintenance_work_mem,\n          pg_size_bytes(current_setting('shared_buffers'))::float AS shared_buffers,\n          pg_size_bytes(current_setting('effective_cache_size'))::float AS effective_cache_size,\n          pg_size_bytes(current_setting('max_wal_size'))::float AS max_wal_size\n\n- name: \"settings\"\n  help: \"PostgreSQL settings\"\n  scope: cluster\n  min_version: 11\n  labels:\n    - \"settings\"\n  values:\n    - \"data_checksums\"\n    - \"jit\"\n    - \"max_connections\"\n    - \"autovacuum_freeze_max_age\"\n    - \"superuser_reserved_connections\"\n    - \"max_wal_senders\"\n    - \"max_prepared_transactions\"\n    - \"max_worker_processes\"\n    - \"random_page_cost\"\n    - \"seq_page_cost\"\n    - \"checkpoint_timeout\"\n    - \"work_mem\"\n    - \"maintenance_work_mem\"\n    - \"shared_buffers\"\n    - \"effective_cache_size\"\n    - \"max_wal_size\"\n  query: >-\n          SELECT\n          current_setting('data_checksums')::bool::int::float AS data_checksums,\n          current_setting('jit')::bool::int::float AS jit,\n          current_setting('max_connections')::float AS max_connections,\n          current_setting('autovacuum_freeze_max_age')::float AS autovacuum_freeze_max_age,\n          current_setting('superuser_reserved_connections')::float AS superuser_reserved_connections,\n          current_setting('max_wal_senders')::float AS max_wal_senders,\n          current_setting('max_prepared_transactions')::float AS max_prepared_transactions,\n          current_setting('max_worker_processes')::float AS max_worker_processes,\n          current_setting('random_page_cost')::float AS random_page_cost,\n          current_setting('seq_page_cost')::float AS seq_page_cost,\n          (SELECT setting FROM pg_settings WHERE name = 'checkpoint_timeout') AS checkpoint_timeout,\n          pg_size_bytes(current_setting('work_mem'))::float AS work_mem,\n          pg_size_bytes(current_setting('maintenance_work_mem'))::float AS maintenance_work_mem,\n          pg_size_bytes(current_setting('shared_buffers'))::float AS shared_buffers,\n          pg_size_bytes(current_setting('effective_cache_size'))::float AS effective_cache_size,\n          pg_size_bytes(current_setting('max_wal_size'))::float AS max_wal_size\n\n- name: \"pg_locks\"\n  help: \"locks held\"\n  scope: cluster\n  labels:\n    - \"datname\"\n    - \"mode\"\n  values:\n    - \"count\"\n  query: >-\n            SELECT datname, t.mode, count(l.mode) FROM pg_database d CROSS JOIN\n            (VALUES ('AccessShareLock'), ('RowShareLock'), ('RowExclusiveLock'), ('ShareUpdateExclusiveLock'), ('ShareLock'), ('ShareRowExclusiveLock'), ('ExclusiveLock'), ('AccessExclusiveLock')) t(mode)\n            LEFT JOIN pg_locks l ON d.oid = l.database AND t.mode = l.mode AND l.pid <> pg_backend_pid()\n            WHERE datname !~ '^template(0|1)$' GROUP BY 1, 2\n\n- name: \"pg_stat_database\"\n  help: \"database statistics\"\n  scope: cluster\n  min_version: 9.2\n  max_version: 11\n  type: \"counter\"\n  labels:\n    - \"datname\"\n  values:\n    - \"numbackends\"\n    - \"xact_commit\"\n    - \"xact_rollback\"\n    - \"blks_read\"\n    - \"blks_hit\"\n    - \"tup_returned\"\n    - \"tup_fetched\"\n    - \"tup_inserted\"\n    - \"tup_updated\"\n    - \"tup_deleted\"\n    - \"conflicts\"\n    - \"temp_files\"\n    - \"temp_bytes\"\n    - \"deadlocks\"\n    - \"blk_read_time\"\n    - \"blk_write_time\"\n    - \"freeze_age\"\n    - \"dbsize\"\n  query: >-\n          SELECT\n          s.datname::text,\n          numbackends::float,\n          xact_commit::float,\n          xact_rollback::float,\n          blks_read::float,\n          blks_hit::float,\n          tup_returned::float,\n          tup_fetched::float,\n          tup_inserted::float,\n          tup_updated::float,\n          tup_deleted::float,\n          conflicts::float,\n          temp_files::float,\n          temp_bytes::float,\n          deadlocks::float,\n          blk_read_time,\n          blk_write_time,\n          age(d.datfrozenxid) AS freeze_age,\n          pg_database_size(s.datname)::float AS dbsize\n          FROM pg_stat_database s\n          LEFT JOIN pg_database d ON d.datname = s.datname\n          WHERE NOT s.datname ~ '^template(0|1)$'\n\n- name: \"pg_stat_database\"\n  help: \"database statistics\"\n  scope: cluster\n  min_version: 12\n  type: \"counter\"\n  labels:\n    - \"datname\"\n  values:\n    - \"numbackends\"\n    - \"xact_commit\"\n    - \"xact_rollback\"\n    - \"blks_read\"\n    - \"blks_hit\"\n    - \"tup_returned\"\n    - \"tup_fetched\"\n    - \"tup_inserted\"\n    - \"tup_updated\"\n    - \"tup_deleted\"\n    - \"conflicts\"\n    - \"temp_files\"\n    - \"temp_bytes\"\n    - \"deadlocks\"\n    - \"blk_read_time\"\n    - \"blk_write_time\"\n    - \"freeze_age\"\n    - \"checksum_failures\"\n    - \"dbsize\"\n  query: >-\n          SELECT\n          s.datname::text,\n          numbackends::float,\n          xact_commit::float,\n          xact_rollback::float,\n          blks_read::float,\n          blks_hit::float,\n          tup_returned::float,\n          tup_fetched::float,\n          tup_inserted::float,\n          tup_updated::float,\n          tup_deleted::float,\n          conflicts::float,\n          temp_files::float,\n          temp_bytes::float,\n          deadlocks::float,\n          blk_read_time,\n          blk_write_time,\n          age(d.datfrozenxid) AS freeze_age,\n          coalesce(checksum_failures::float, 0) AS checksum_failures,\n          pg_database_size(s.datname)::float AS dbsize\n          FROM pg_stat_database s\n          LEFT JOIN pg_database d ON d.datname = s.datname\n          WHERE NOT s.datname ~ '^template(0|1)$'\n\n- name: \"pg_stat_statements\"\n  help: \"statement statistics\"\n  scope: cluster\n  min_version: 9.2\n  max_version: 12\n  labels:\n    - \"usename\"\n    - \"datname\"\n    - \"queryid\"\n    - \"query\"\n  values:\n    - \"calls\"\n    - \"total_time\"\n    - \"rows\"\n    - \"shared_blks_hit\"\n    - \"shared_blks_read\"\n    - \"shared_blks_dirtied\"\n    - \"shared_blks_written\"\n    - \"local_blks_hit\"\n    - \"local_blks_read\"\n    - \"local_blks_dirtied\"\n    - \"local_blks_written\"\n    - \"temp_blks_read\"\n    - \"temp_blks_written\"\n  query: >-\n          WITH w_pg_stat_statements AS ( SELECT * FROM pg_stat_statements)\n          (SELECT\n          usename::text,\n          datname::text,\n          queryid::text,\n          substr(regexp_replace(query, E'[\\\\n\\\\r]+', ' ', 'g' ), 1, 1024) AS query,\n          calls,\n          total_time,\n          rows,\n          shared_blks_hit,\n          shared_blks_read,\n          shared_blks_dirtied,\n          shared_blks_written,\n          local_blks_hit,\n          local_blks_read,\n          local_blks_dirtied,\n          local_blks_written,\n          temp_blks_read,\n          temp_blks_written\n          FROM w_pg_stat_statements pss JOIN pg_database pd ON pss.dbid = pd.oid\n          JOIN pg_user pu ON pss.userid = pu.usesysid\n          ORDER BY pss.total_time DESC\n          LIMIT 25)\n          UNION\n          (SELECT\n          usename::text,\n          datname::text,\n          queryid::text,\n          substr(regexp_replace(query, E'[\\\\n\\\\r]+', ' ', 'g' ), 1, 1024) AS query,\n          calls,\n          total_time,\n          rows,\n          shared_blks_hit,\n          shared_blks_read,\n          shared_blks_dirtied,\n          shared_blks_written,\n          local_blks_hit,\n          local_blks_read,\n          local_blks_dirtied,\n          local_blks_written,\n          temp_blks_read,\n          temp_blks_written\n          FROM w_pg_stat_statements pss2 JOIN pg_database pd2 ON pss2.dbid = pd2.oid\n          JOIN pg_user pu2 ON pss2.userid = pu2.usesysid\n          ORDER BY calls DESC\n          LIMIT 25)\n\n- name: \"pg_stat_statements\"\n  help: \"statement statistics\"\n  scope: cluster\n  min_version: 13\n  labels:\n    - \"usename\"\n    - \"datname\"\n    - \"queryid\"\n    - \"query\"\n  values:\n    - \"calls\"\n    - \"total_time\"\n    - \"total_plan_time\"\n    - \"total_exec_time\"\n    - \"rows\"\n    - \"shared_blks_hit\"\n    - \"shared_blks_read\"\n    - \"shared_blks_dirtied\"\n    - \"shared_blks_written\"\n    - \"local_blks_hit\"\n    - \"local_blks_read\"\n    - \"local_blks_dirtied\"\n    - \"local_blks_written\"\n    - \"temp_blks_read\"\n    - \"temp_blks_written\"\n  query: >-\n          WITH w_pg_stat_statements AS ( SELECT * FROM pg_stat_statements)\n          (SELECT\n          usename::text,\n          datname::text,\n          queryid::text,\n          substr(regexp_replace(query, E'[\\\\n\\\\r]+', ' ', 'g' ), 1, 1024) AS query,\n          calls,\n          total_plan_time + total_exec_time as total_time,\n          total_plan_time,\n          total_exec_time,\n          rows,\n          shared_blks_hit,\n          shared_blks_read,\n          shared_blks_dirtied,\n          shared_blks_written,\n          local_blks_hit,\n          local_blks_read,\n          local_blks_dirtied,\n          local_blks_written,\n          temp_blks_read,\n          temp_blks_written\n          FROM w_pg_stat_statements pss JOIN pg_database pd ON pss.dbid = pd.oid\n          JOIN pg_user pu ON pss.userid = pu.usesysid\n          ORDER BY 6 DESC\n          LIMIT 25)\n          UNION\n          (SELECT\n          usename::text,\n          datname::text,\n          queryid::text,\n          substr(regexp_replace(query, E'[\\\\n\\\\r]+', ' ', 'g' ), 1, 1024) AS query,\n          calls,\n          total_plan_time + total_exec_time as total_time,\n          total_plan_time,\n          total_exec_time,\n          rows,\n          shared_blks_hit,\n          shared_blks_read,\n          shared_blks_dirtied,\n          shared_blks_written,\n          local_blks_hit,\n          local_blks_read,\n          local_blks_dirtied,\n          local_blks_written,\n          temp_blks_read,\n          temp_blks_written\n          FROM w_pg_stat_statements pss2 JOIN pg_database pd2 ON pss2.dbid = pd2.oid\n          JOIN pg_user pu2 ON pss2.userid = pu2.usesysid\n          ORDER BY calls DESC\n          LIMIT 25)\n\n- name: \"txid\"\n  help: \"current txid\"\n  scope: cluster\n  values:\n    - \"txid_current\"\n  query: SELECT CASE WHEN pg_is_in_recovery() THEN 0 ELSE txid_current() END\n\n- name: \"prepared_transactions\"\n  help: \"prepared transactions\"\n  scope: cluster\n  labels:\n    - \"datname\"\n  values:\n    - \"count\"\n  query: >-\n          SELECT\n          datname::text,\n          COUNT(transaction) AS count\n          FROM pg_database d\n          LEFT JOIN pg_prepared_xacts x ON d.datname = x.database\n          WHERE NOT d.datname ~ '^template(0|1)$'\n          GROUP BY datname\n\n# queries run for each database (except template0/template1)\n\n- name: \"pg_stat_user_tables\"\n  help: \"table statistics\"\n  scope: database\n  labels:\n    - \"datname\"\n    - \"schemaname\"\n    - \"relname\"\n  values:\n    - \"seq_scan\"\n    - \"seq_tup_read\"\n    - \"idx_scan\"\n    - \"idx_tup_fetch\"\n    - \"n_tup_ins\"\n    - \"n_tup_upd\"\n    - \"n_tup_del\"\n    - \"n_tup_hot_upd\"\n    - \"n_live_tup\"\n    - \"n_dead_tup\"\n    - \"vacuum_count\"\n    - \"autovacuum_count\"\n    - \"analyze_count\"\n    - \"autoanalyze_count\"\n  query: >-\n          SELECT\n          current_database()::text AS datname,\n          COALESCE(schemaname::text, 'null') AS schemaname,\n          COALESCE(relname::text, 'null') AS relname,\n          COALESCE(seq_scan, 0)::float AS seq_scan,\n          COALESCE(seq_tup_read, 0)::float AS seq_tup_read,\n          COALESCE(idx_scan, 0)::float AS idx_scan,\n          COALESCE(idx_tup_fetch, 0)::float AS idx_tup_fetch,\n          COALESCE(n_tup_ins, 0)::float AS n_tup_ins,\n          COALESCE(n_tup_upd, 0)::float AS n_tup_upd,\n          COALESCE(n_tup_del, 0)::float AS n_tup_del,\n          COALESCE(n_tup_hot_upd, 0)::float AS n_tup_hot_upd,\n          COALESCE(n_live_tup, 0)::float AS n_live_tup,\n          COALESCE(n_dead_tup, 0)::float AS n_dead_tup,\n          COALESCE(vacuum_count, 0)::float AS vacuum_count,\n          COALESCE(autovacuum_count, 0)::float AS autovacuum_count,\n          COALESCE(analyze_count, 0)::float AS analyze_count,\n          COALESCE(autoanalyze_count, 0)::float AS autoanalyze_count\n          FROM pg_stat_user_tables FULL JOIN (VALUES(0)) filler(i) ON TRUE  ORDER BY n_live_tup DESC LIMIT 1000\n\n- name: \"pg_statio_user_tables\"\n  help: \"IO statistics\"\n  scope: database\n  labels:\n    - \"datname\"\n    - \"schemaname\"\n    - \"relname\"\n  values:\n    - \"heap_blks_read\"\n    - \"heap_blks_hit\"\n    - \"idx_blks_read\"\n    - \"idx_blks_hit\"\n  query: >-\n          SELECT\n          current_database()::text AS datname,\n          COALESCE(schemaname::text, 'null') AS schemaname,\n          COALESCE(relname::text, 'null') AS relname,\n          COALESCE(heap_blks_read::float, 0) AS heap_blks_read,\n          COALESCE(heap_blks_hit::float, 0) AS heap_blks_hit,\n          COALESCE(idx_blks_read::float, 0) AS idx_blks_read,\n          COALESCE(idx_blks_hit::float, 0) AS idx_blks_hit\n          FROM pg_statio_user_tables FULL JOIN (VALUES(0)) filler(i) ON TRUE ORDER BY 6 DESC LIMIT 1000\n\n- name: \"BufferAccess\"\n  help: \"buffer access statistics\"\n  scope: database\n  labels:\n    - \"datname\"\n    - \"schemaname\"\n    - \"relname\"\n  values:\n    - \"reads\"\n  query: >-\n          SELECT\n          current_database()::text AS datname,\n          COALESCE(schemaname::text, 'null') AS schemaname,\n          COALESCE(relname::text, 'null') AS relname,\n          SUM(COALESCE(heap_blks_read, 0)\n          + COALESCE(heap_blks_hit, 0)\n          + COALESCE(idx_blks_hit, 0)\n          + COALESCE(idx_blks_read, 0)\n          + COALESCE(toast_blks_hit, 0)\n          + COALESCE(toast_blks_read, 0)\n          + COALESCE(tidx_blks_hit, 0)\n          + COALESCE(tidx_blks_read, 0)) * 8192::bigint as reads\n          FROM pg_statio_user_tables FULL JOIN (VALUES(0)) filler(i) ON TRUE\n          GROUP BY 1, 2, 3 ORDER BY 3 DESC,2,1 LIMIT 1000\n\n- name: \"Maintenancecounters\"\n  help: \"table maintenance job counters\"\n  scope: database\n  labels:\n    - \"datname\"\n  values:\n    - \"vacuum_count\"\n    - \"autovacuum_count\"\n    - \"analyze_count\"\n    - \"autoanalyze_count\"\n  query: >-\n          SELECT\n          current_database()::text AS datname,\n          COALESCE(SUM(vacuum_count), 0) vacuum_count,\n          COALESCE(SUM(autovacuum_count), 0) autovacuum_count,\n          COALESCE(SUM(analyze_count), 0) analyze_count,\n          COALESCE(SUM(autoanalyze_count), 0) autoanalyze_count\n          FROM pg_stat_user_tables  ORDER BY 1,2,3 LIMIT 1000\n"
  },
  {
    "path": "sql-exporter/replication.yml",
    "content": "# queries run once per cluster (via the 'postgres' database)\n\n- name: \"archive_ready\"\n  help: \"number of WAL files waiting to be archived\"\n  scope: cluster\n  min_version: 10\n  values:\n    - \"archive_ready\"\n  query: SELECT COUNT(*) AS archive_ready FROM pg_ls_dir('pg_wal/archive_status') WHERE pg_ls_dir ~ '^[0-9a-fA-F]{24}\\.ready$'\n\n- name: \"pg_stat_archiver\"\n  help: \"archiver statistics\"\n  scope: cluster\n  values:\n    - \"archived_count\"\n    - \"failed_count\"\n  query: SELECT archived_count, failed_count FROM pg_stat_archiver\n\n- name: \"pg_stat_replication\"\n  help: \"replication statistics\"\n  scope: cluster\n  min_version: 10\n  labels:\n    - \"application_name\"\n    - \"pid\"\n  values:\n    - \"send_lag_bytes\"\n    - \"flush_lag_bytes\"\n    - \"replay_lag_bytes\"\n  query: >-\n          SELECT\n          COALESCE(application_name, '')::text AS application_name,\n          COALESCE(pid, 0)::text AS pid,\n          COALESCE(pg_wal_lsn_diff(CASE WHEN pg_is_in_recovery() THEN pg_last_wal_receive_lsn() ELSE pg_current_wal_lsn() END, sent_lsn), 0) AS send_lag_bytes,\n          COALESCE(pg_wal_lsn_diff(CASE WHEN pg_is_in_recovery() THEN pg_last_wal_receive_lsn() ELSE pg_current_wal_lsn() END, flush_lsn), 0) AS flush_lag_bytes,\n          COALESCE(pg_wal_lsn_diff(CASE WHEN pg_is_in_recovery() THEN pg_last_wal_receive_lsn() ELSE pg_current_wal_lsn() END, replay_lsn), 0) AS replay_lag_bytes\n          FROM pg_stat_replication FULL JOIN (VALUES(0)) filler(i) ON TRUE\n"
  },
  {
    "path": "sql-exporter/update-prometheus-sql-exporter-config",
    "content": "#!/usr/bin/perl\n\nuse strict;\nuse warnings;\nuse PgCommon;\nuse Storable qw(dclone);\nuse YAML;\n\n# from list of queries, remove all that do not satisfy the scope/version/cluster/database constraints\nsub filter_queries($$$$;$)\n{\n  my ($queries, $scope, $version, $cluster, $database) = @_;\n  my @result;\n  foreach my $query (@$queries) {\n    $query->{scope} //= 'database';\n    die \"scope '$query->{scope}' must be either 'cluster' or 'database'\"\n      unless ($query->{scope} =~ /^(cluster|database)$/);\n    next if $query->{scope} ne $scope;\n    next if $query->{min_version} and $version < $query->{min_version};\n    next if $query->{max_version} and $version > $query->{max_version};\n    next if $query->{version} and $version !~ /$query->{version}/;\n    next if $query->{cluster} and $cluster !~ /$query->{cluster}/;\n    next if $query->{database} and $database !~ /$query->{database}/;\n\n    my $q = dclone($query);\n    delete $q->{scope}; delete $q->{min_version}; delete $q->{max_version};\n    delete $q->{version}; delete $q->{cluster}; delete $q->{database};\n    push @result, $q;\n  }\n  return \\@result;\n}\n\n# Generate jobs from the given queries. One job is created for all the queries\n# with null interval, and one job is created per query with non-null interval.\nsub push_queries_as_jobs($$$)\n{\n  my ($jobs, $queries, $job_settings) = @_;\n  my @instant;\n  foreach my $query (@$queries) {\n    if (!$query->{interval}) {\n      push @instant, $query;\n    } else {\n      # Generate separate job for query with non-null interval\n      my $job_settings_query = dclone($job_settings);\n      $job_settings_query->{interval} = $query->{interval};\n      $job_settings_query->{name} .= '/' . $query->{name};\n      my $q = dclone($query);\n      delete $q->{interval};\n      $job_settings_query->{queries} = [$q];\n\n      push @$jobs, $job_settings_query;\n    }\n  }\n\n  if (@instant) {\n    my $instant_job = dclone($job_settings);\n    # Debian switched to upstream sql-exporter which does not have synchronous\n    # jobs yet, so interval cannot be 0 for instant, or else sql-exporter would\n    # run the queries non-stop. Our default Prometheus scrape interval is 300s,\n    # so set this to 150s for now.\n    $instant_job->{interval} = '150s';\n    $instant_job->{queries} = \\@instant;\n    push @$jobs, $instant_job;\n  }\n}\n\nmy $queries_directory = $ARGV[0] // die \"No directory for *.yml query files specified\";\nmy $output_yaml = $ARGV[1] // die \"No output yaml file specified\";\n\n# load all *.yml files from input directory and collect the contained query lists\nmy $queries;\nforeach my $yml (glob \"$queries_directory/*.yml\") {\n  my $q;\n  eval { $q = YAML::LoadFile($yml); };\n  die \"Error loading $yml: $@\" if ($@);\n  next if (ref($q) eq ''); # file is empty\n  die \"$yml is not a yaml list:\" . ref($q) unless (ref($q) eq 'ARRAY');\n  push @$queries, @$q;\n}\n\n# walk all clusters and databases and produce jobs for them\nmy $jobs = [];\nforeach my $version (get_versions()) {\n  foreach my $cluster (get_version_clusters($version)) {\n    my %info = cluster_info($version, $cluster);\n    next unless $info{running}; # cluster is down, skip it\n    my $owner = (getpwuid $info{owneruid})[0] // die \"Could not determine owner name of cluster $version $cluster\";\n    my $socket = get_cluster_socketdir($version, $cluster);\n\n    # jobs for cluster-wide queries\n    push_queries_as_jobs $jobs, filter_queries($queries, 'cluster', $version, $cluster), {\n      connections => [ \"postgres://$owner\\@:$info{port}/postgres?sslmode=disable&host=$socket\" ],\n      name => \"$version/$cluster\",\n    };\n\n    # jobs for per-database queries\n    my @cluster_databases = get_cluster_databases($version, $cluster);\n    foreach my $database (grep { $_ and $_ !~ /^template[01]$/ } @cluster_databases) {\n      push_queries_as_jobs $jobs, filter_queries($queries, 'database', $version, $cluster, $database), {\n        connections => [ \"postgres://$owner\\@:$info{port}/$database?sslmode=disable&host=$socket\" ],\n        name => \"$version/$cluster/$database\",\n      };\n    }\n\n    # create pg_stat_statements in \"postgres\" database if missing\n    next if $info{recovery}; # cluster is in recovery mode, skip it\n    open PSQL, \"|-\", \"su -c 'psql -q -h $socket -p $info{port} postgres' $owner\";\n    print PSQL \"DO \\$\\$DECLARE ext name; BEGIN SELECT INTO ext extname FROM pg_extension WHERE extname = 'pg_stat_statements'; IF NOT FOUND THEN RAISE NOTICE 'Creating pg_stat_statements extension in cluster $version/$cluster'; CREATE EXTENSION pg_stat_statements; END IF; END\\$\\$ LANGUAGE plpgsql;\\n\";\n    close PSQL;\n  }\n}\n\n# write output yml\nYAML::DumpFile($output_yaml, { jobs => $jobs });\n"
  },
  {
    "path": "sql-exporter/wal.yml",
    "content": "# queries run once per cluster (via the 'postgres' database)\n\n- name: \"checkpoints\"\n  help: \"requested/timed checkpoints and checkpoint buffers\"\n  scope: cluster\n  values:\n    - \"timed\"\n    - \"requested\"\n    - \"buffers\"\n  max_version: 16\n  query: >-\n          SELECT\n          pg_stat_get_bgwriter_timed_checkpoints() timed,\n          pg_stat_get_bgwriter_requested_checkpoints() requested,\n          pg_stat_get_bgwriter_buf_written_checkpoints() buffers\n\n- name: \"checkpoints\"\n  help: \"requested/timed checkpoints and checkpoint buffers\"\n  scope: cluster\n  values:\n    - \"timed\"\n    - \"requested\"\n    - \"buffers\"\n  min_version: 17\n  query: >-\n          SELECT\n          pg_stat_get_checkpointer_num_timed() timed,\n          pg_stat_get_checkpointer_num_requested() requested,\n          pg_stat_get_checkpointer_buffers_written() buffers\n\n- name: \"LastCheckpointDistance\"\n  help: \"distance to the last checkpoint\"\n  scope: cluster\n  min_version: 10\n  values:\n    - \"distance\"\n  query: SELECT pg_wal_lsn_diff(CASE WHEN pg_is_in_recovery() THEN pg_last_wal_receive_lsn() ELSE pg_current_wal_lsn() END, checkpoint_lsn) \"distance\" FROM pg_control_checkpoint()\n\n- name: \"waldistance\"\n  help: \"amount of WAL written\"\n  scope: cluster\n  min_version: 10\n  values:\n    - \"location\"\n  query: SELECT pg_wal_lsn_diff(CASE WHEN pg_is_in_recovery() THEN pg_last_wal_receive_lsn() ELSE pg_current_wal_lsn() END, '0/0') \"location\"\n\n- name: \"pg_stat_wal\"\n  help: \"WAL statistics\"\n  scope: cluster\n  min_version: 14\n  max_version: 17\n  values:\n    - \"wal_records\"\n    - \"wal_fpi\"\n    - \"wal_bytes\"\n    - \"wal_buffers_full\"\n    - \"wal_write\"\n    - \"wal_sync\"\n    - \"wal_write_time\"\n    - \"wal_sync_time\"\n  query: >-\n          SELECT\n          wal_records::float,\n          wal_fpi::float,\n          wal_bytes::float,\n          wal_buffers_full::float,\n          wal_write::float,\n          wal_sync::float,\n          wal_write_time::float,\n          wal_sync_time::float\n          FROM pg_stat_wal;\n\n- name: \"pg_stat_wal\"\n  help: \"WAL statistics\"\n  scope: cluster\n  min_version: 18\n  values:\n    - \"wal_records\"\n    - \"wal_fpi\"\n    - \"wal_bytes\"\n    - \"wal_buffers_full\"\n    - \"wal_write\"\n    - \"wal_sync\"\n    - \"wal_write_time\"\n    - \"wal_sync_time\"\n  query: >-\n          WITH io AS (SELECT coalesce(SUM(io.writes), 0) AS wal_write, coalesce(SUM(io.fsyncs), 0) AS wal_sync,coalesce(SUM(io.write_time), 0) AS wal_write_time, coalesce(SUM(io.fsync_time), 0) AS wal_sync_time FROM pg_stat_io io WHERE io.object = 'wal')\n          SELECT\n          w.wal_records::float,\n          w.wal_fpi::float,\n          w.wal_bytes::float,\n          w.wal_buffers_full::float,\n          io.wal_write::float,\n          io.wal_sync::float,\n          io.wal_write_time::float,\n          io.wal_sync_time::float\n          FROM pg_stat_wal w, io;\n"
  },
  {
    "path": "tmate/tmate.conf",
    "content": "# credativ tmate.conf\n# This settings configure tmate to use tmate.credativ.com\nset -g tmate-server-host \"tmate.credativ.com\"\nset -g tmate-server-port 10022\n# tmate >= 2.4:\nset -g tmate-server-rsa-fingerprint   \"SHA256:a6ZNpEpVHviZ14uIb1qpJi1TOO4p+RWnn/1fPHM75Sg\"\n# tmate <= 2.2:\n#set -g tmate-server-rsa-fingerprint   \"d2:cb:4b:24:28:cf:32:54:00:43:15:fa:db:ca:79:67\"\n#set -g tmate-server-ecdsa-fingerprint \"0e:84:4e:0d:2f:76:11:d9:5c:00:ea:6a:d1:97:c0:e3\"\nset -g tmate-identity \"\"              # Can be specified to use a different SSH key.\n\n#set -g pane-border-fg black\n#set -g pane-active-border-fg brightred\n\n# make tmux display things in 256 colors\nset -g default-terminal \"screen-256color\"\n\n# set scrollback history\nset -g history-limit 10000\n\n## Status bar design\n## status line\nset -g status-bg default\nset -g status-fg brightred\nset -g status-interval 2\n\n# messaging\nset -g message-fg white\nset -g message-bg brightred\nset -g message-command-fg blue\nset -g message-command-bg black\n\n# show host name and IP address on left side of status bar\nset -g status-left-length 70\nset -g status-left \"tmate.credativ.com #[fg=green]#h \"\n"
  },
  {
    "path": "vagrant/.gitignore",
    "content": ".vagrant\n*.retry\nfact_cache/\n*.box\n"
  },
  {
    "path": "vagrant/Vagrantfile",
    "content": "# -*- mode: ruby -*-\n# vi: set ft=ruby :\n\n# All Vagrant configuration is done below. The \"2\" in Vagrant.configure\n# configures the configuration version (we support older styles for\n# backwards compatibility). Please don't change it unless you know what\n# you're doing.\nVagrant.configure(\"2\") do |config|\n  # The most common configuration options are documented and commented below.\n  # For a complete reference, please see the online documentation at\n  # https://docs.vagrantup.com.\n\n  # Every Vagrant development environment requires a box. You can search for\n  # boxes at https://atlas.hashicorp.com/search.\n  config.vm.box = \"debian/bookworm64\"\n\n  # Disable automatic box update checking. If you disable this, then\n  # boxes will only be checked for updates when the user runs\n  # `vagrant box outdated`. This is not recommended.\n  # config.vm.box_check_update = false\n\n  # Create a forwarded port mapping which allows access to a specific port\n  # within the machine from a port on the host machine. In the example below,\n  # accessing \"localhost:8080\" will access port 80 on the guest machine.\n  config.vm.network \"forwarded_port\", guest: 80, host: 8080\n  config.vm.network \"forwarded_port\", guest: 443, host: 4433\n  config.vm.network \"forwarded_port\", guest: 3000, host: 8730\n  config.vm.network \"forwarded_port\", guest: 5432, host: 8732\n  config.vm.network \"forwarded_port\", guest: 9090, host: 8790\n  config.vm.network \"forwarded_port\", guest: 9100, host: 8791\n  config.vm.network \"forwarded_port\", guest: 4200, host: 4200\n  config.vm.network \"forwarded_port\", guest: 10090, host: 10090\n\n  # Create a private network, which allows host-only access to the machine\n  # using a specific IP.\n  # config.vm.network \"private_network\", ip: \"192.168.33.10\"\n\n  # Create a public network, which generally matched to bridged network.\n  # Bridged networks make the machine appear as another physical device on\n  # your network.\n  # config.vm.network \"public_network\"\n\n  # Share an additional folder to the guest VM. The first argument is\n  # the path on the host to the actual folder. The second argument is\n  # the path on the guest to mount the folder. And the optional third\n  # argument is a set of non-required options.\n  config.vm.synced_folder \"../\", \"/elephant-shed\", type: \"rsync\", disabled: true\n  config.vm.synced_folder \"./\", \"/vagrant\", type: \"rsync\", disabled: true\n\n  # Provider-specific configuration so you can fine-tune various\n  # backing providers for Vagrant. These expose provider-specific options.\n  # Example for VirtualBox:\n  #\n   config.vm.provider \"virtualbox\" do |vb|\n     # Display the VirtualBox GUI when booting the machine\n     #vb.gui = true\n\n     # Customize the amount of memory on the VM:\n     vb.memory = \"4096\"\n     vb.cpus = 6\n   end\n   config.vm.provider \"libvirt\" do |lv|\n     # Customize the amount of memory on the VM:\n     lv.memory = \"4096\"\n     lv.cpus = 2\n   end\n\n\n  #\n  # View the documentation for the provider you are using for more\n  # information on available options.\n\n  # Define a Vagrant Push strategy for pushing to Atlas. Other push strategies\n  # such as FTP and Heroku are also available. See the documentation at\n  # https://docs.vagrantup.com/v2/push/atlas.html for more information.\n  # config.push.define \"atlas\" do |push|\n  #   push.app = \"YOUR_ATLAS_USERNAME/YOUR_APPLICATION_NAME\"\n  # end\n\n  # Enable provisioning with a shell script. Additional provisioners such as\n  # Puppet, Chef, Ansible, Salt, and Docker are also available. Please see the\n  # documentation for more information about their specific syntax and use.\n  # config.vm.provision \"shell\", inline: <<-SHELL\n  #   ./elephant-shed/provision.sh\n  # SHELL\n\n   config.vm.provision \"ansible\" do |ansible|\n     ansible.playbook = \"elephant-shed.yml\"\n     ansible.groups = {\n       #\"dev\" => [\"default\"],\n       \"ansible\" => [\"default\"],\n     }\n   end\nend\n"
  },
  {
    "path": "vagrant/Vagrantfile.template",
    "content": "# -*- mode: ruby -*-\n# vi: set ft=ruby :\n\nVagrant.configure(\"2\") do |config|\n  # The most common configuration options are documented and commented below.\n  # For a complete reference, please see the online documentation at\n  # https://docs.vagrantup.com.\n\n  # Create a forwarded port mapping which allows access to a specific port\n  # within the machine from a port on the host machine.\n  config.vm.network \"forwarded_port\", guest: 443, host: 4433\n  config.vm.network \"forwarded_port\", guest: 5432, host: 55432\n\n  # Share an additional folder to the guest VM. The first argument is\n  # the path on the host to the actual folder. The second argument is\n  # the path on the guest to mount the folder. And the optional third\n  # argument is a set of non-required options.\n  config.vm.synced_folder \"./\", \"/vagrant\", type: \"rsync\", disabled: true\n\n  # Provider-specific configuration so you can fine-tune various\n  # backing providers for Vagrant. These expose provider-specific options.\n  # Example for VirtualBox:\n  #\n  config.vm.provider \"virtualbox\" do |vb|\n    # Display the VirtualBox GUI when booting the machine\n    #vb.gui = true\n\n    # Customize the amount of memory on the VM:\n    vb.memory = \"4096\"\n    vb.cpus = 4\n  end\n  config.vm.provider \"libvirt\" do |lv|\n    # Customize the amount of memory on the VM:\n    lv.memory = \"4096\"\n    lv.cpus = 4\n  end\n\n  config.vm.post_up_message = <<-EOM\n    Welcome to the Elephant Shed!\n    https://elephant-shed.io/\n\n    Default user: admin\n    Default pass: admin\n\n    The web interface is at https://localhost:4433/\n    PostgreSQL is listening on port 55432:\n      psql -h localhost -p 55432 -U admin\n  EOM\n\nend\n"
  },
  {
    "path": "vagrant/ansible.cfg",
    "content": "[defaults]\ninventory = inventory\nnocows = True\ninterpreter_python=/usr/bin/python3\nansible_python_interpreter=/usr/bin/python3\n\ngathering = smart\nfact_caching = jsonfile\nfact_caching_connection = fact_cache\n\n# Fix Failed to set permissions on the temporary files\nallow_world_readable_tmpfiles = True\n\n[ssh_connection]\npipelining = True\n"
  },
  {
    "path": "vagrant/elephant-shed.yml",
    "content": "#!/usr/bin/ansible-playbook\n# Copyright © 2017-2019 credativ GmbH <info@credativ.de>\n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation, either version 3 of the License, or\n# (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n---\n- name: elephant-shed\n  hosts: all\n  become: true\n  handlers:\n  - include: handlers.yml\n\n  tasks:\n  - name: Update package cache\n    apt:\n      update_cache: yes\n\n  - name: Install pre dependencies\n    package:\n      name: '{{ item }}'\n      state: present\n    with_items:\n    - apt-transport-https\n    - gpg\n    - etckeeper\n    - lvm2\n\n  # Update etckeeper\n  - name: Record changes found in /etc as etckeeper commit\n    shell: \"if etckeeper unclean; then etckeeper commit 'Changes FOUND by elephant-shed.yml (ansible)'; fi\"\n    changed_when: False\n\n  - name: Partitioning\n    include: tasks/partitioning.yml\n    tags: partitioning\n    when: partitioning == true\n\n  - name: Setup local repository\n    include: tasks/repository-local.yml\n    tags: repository-local\n    when: use_local_repo == true\n\n  - name: Remove local repository\n    apt_repository:\n      repo: '{{ local_repo }}'\n      filename: 'local'\n      state: absent\n    when: use_local_repo != true\n\n  - include: tasks/grafana.yml\n    tags: packages\n\n  - include: tasks/packages.yml\n    tags: packages\n\n  - include: tasks/config-system.yml\n    tags: config\n  - include: tasks/ferm.yml\n    tags:\n    - ferm\n    - firewall\n    when: ansible_virtualization_type != \"lxc\"\n  - include: tasks/apache2.yml\n    tags: apache\n  - include: tasks/postgresql.yml\n    tags: postgresql\n  - include: tasks/config-backup.yml\n    tags:\n    - config\n    - backup\n\n  # Update etckeeper\n  - name: Record changes done in /etc as etckeeper commit\n    shell: \"if etckeeper unclean; then etckeeper commit 'Changes DONE by elephant-shed.yml (ansible)'; fi\"\n    changed_when: False\n"
  },
  {
    "path": "vagrant/files/git/gitconfig",
    "content": "# This is Git's per-user configuration file.\n[user]\n# Please adapt and uncomment the following lines:\n#\tname = root\n#\temail = root@debian\n"
  },
  {
    "path": "vagrant/files/grafana-key.10458545.asc",
    "content": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQGNBGTnhmkBDADUE+SzjRRyitIm1siGxiHlIlnn6KO4C4GfEuV+PNzqxvwYO+1r\nmcKlGDU0ugo8ohXruAOC77Kwc4keVGNU89BeHvrYbIftz/yxEneuPsCbGnbDMIyC\nk44UOetRtV9/59Gj5YjNqnsZCr+e5D/JfrHUJTTwKLv88A9eHKxskrlZr7Un7j3i\nEf3NChlOh2Zk9Wfk8IhAqMMTferU4iTIhQk+5fanShtXIuzBaxU3lkzFSG7VuAH4\nCBLPWitKRMn5oqXUE0FZbRYL/6Qz0Gt6YCJsZbaQ3Am7FCwWCp9+ZHbR9yU+bkK0\nDts4PNx4Wr9CktHIvbypT4Lk2oJEPWjcCJQHqpPQZXbnclXRlK5Ea0NVpaQdGK+v\nJS4HGxFFjSkvTKAZYgwOk93qlpFeDML3TuSgWxuw4NIDitvewudnaWzfl9tDIoVS\nBb16nwJ8bMDzovC/RBE14rRKYtMLmBsRzGYHWd0NnX+FitAS9uURHuFxghv9GFPh\neTaXvc4glM94HBUAEQEAAbQmR3JhZmFuYSBMYWJzIDxlbmdpbmVlcmluZ0BncmFm\nYW5hLmNvbT6JAdQEEwEKAD4CGwMFCwkIBwIGFQoJCAsCBBYCAwECHgECF4AWIQS1\nOud7rbYwpoMEYAWWP6J3EEWFRQUCaKhvPQUJB4NP1AAKCRCWP6J3EEWFRUjOC/9Y\ndWOWJLJVKzLx8uv5YVzebyw15HevhKahbznJX5fHnE8irjkiPFltVEZ4T37s5afR\nGBEJnR1UFd80s7jzwbuoZh/zEB3jN8q50g64AznuzDa0PWKzaY7Tgkssx3+hs6TS\nvIwV4z8T7f56lDudeHxHXx+htRnZ3ebKNPCJS7+G12GF6W3C3znpdjgvhVUB0uxd\n+42V0fRqk2GLNZeKS9988fi5dYRAy9Ozwced7ByCFjde9FBgUtrH3mG1/ibzLEh0\n4k02nYjc8mrH32t4UCWpxQEJ1vZA2vT2HN3/cH/4uyFdyU6OHkMyMbz6lmeXe71d\nF5hOB4+/RP6Ndyj7ViRNDbm70NRBaFne/+YOJvmMfJTCh7YbF5qEn1ihGkJJ0ohE\nu2IB+EGEhyiDm8SIsj1uMw7n17iIPNtbsU5GgnmLtfguP/WbwKV2UeuxTpiOeYb6\nblDwRlh48uHMlA5HBW+487Jktw3iPj1IKhdtAC9CU3xAvzDcseMbgmM6Xj2bSQG5\nAY0EZOeGaQEMALNIFUricEIwtZiX7vSDjwxobbqPKqzdek8x3ud0CyYlrbGHy0k+\nFDEXstjJQQ1s9rjJSu3sv5wyg9GDAUH3nzO976n/ZZvKPti3p2XU2UFx5gYkaaFV\nD56yYxqGY0YU5ft6BG+RUz3iEPg3UBUzt0sCIYnG9+CsDqGOnRYIIa46fu2/H9Vu\n8JvvSq9xbsK9CfoQDkIcoQOixPuI4P7eHtswCeYR/1LUTWEnYQWsBCf57cEpzR6t\n7mlQnzQo9z4i/kp4S0ybDB77wnn+isMADOS+/VpXO+M7Zj5tpfJ6PkKch3SGXdUy\n3zht8luFOYpJr2lVzp7n3NwB4zW08RptTzTgFAaW/NH2JjYI+rDvQm4jNs08Dtsp\nnm4OQvBA9Df/6qwMEOZ9i10ixqk+55UpQFJ3nf4uKlSUM7bKXXVcD/odq804Y/K4\ny3csE059YVIyaPexEvYSYlHE2odJWRg2Q1VehmrOSC8Qps3xpU7dTHXD74ZpaYbr\nhaViRS5v/lCsiwARAQABiQG8BBgBCgAmAhsMFiEEtTrne622MKaDBGAFlj+idxBF\nhUUFAmiobzkFCQeDT9AACgkQlj+idxBFhUVsmQwA0PA/zd7NqtnZ/Z8857gp2Wq2\n/e4EX8nRjsW2ZlrZfbU5oMQv9OZZ4z1UjIKEUV+TnCwXEKXTMJomdekQSSayVVx/\nu5w+0YM8gRuQGrG8hW0GRR8sHIeuwBFlyQrlwxUwXvDOPDYyieETjaQqMucupIKo\nIPm3CjFySvfizvSWUVSWBnGmQfpv6OiGYawvwfewcQHUdLMgWN3lYlzGQJL4+OMm\n7XcB8VNTa586Q00fmjDfktHYvGpmhqr3gsd4gS3AjTk0zI65qXBRJkdqVnwUrMUD\n8TcxXYNXf90mhR0NWkLmp6kBYiW8+QY6ndMmRVpodg1A87qgMYaZUAAlxCS4XKTU\nr+/YMDYOWgLN6i4UeYG/3/hsnAEHm5ITojfh6cLfdlhjohFTnD0IYw3AsNJXRzKB\n1g5FTBKLLLIdXgS/3rWV1qjAd3drQVIMCku6HKl/vT4ftrBHeSyV7eLwOYbe3/bw\n8VMx+lmMheD8/qJMia1om0iBBRSXRjY//f+Lllqm\n=TH3J\n-----END PGP PUBLIC KEY BLOCK-----\n"
  },
  {
    "path": "vagrant/files/postgresql/ACCC4CF8.asc",
    "content": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBE6XR8IBEACVdDKT2HEH1IyHzXkb4nIWAY7echjRxo7MTcj4vbXAyBKOfjja\nUrBEJWHN6fjKJXOYWXHLIYg0hOGeW9qcSiaa1/rYIbOzjfGfhE4x0Y+NJHS1db0V\nG6GUj3qXaeyqIJGS2z7m0Thy4Lgr/LpZlZ78Nf1fliSzBlMo1sV7PpP/7zUO+aA4\nbKa8Rio3weMXQOZgclzgeSdqtwKnyKTQdXY5MkH1QXyFIk1nTfWwyqpJjHlgtwMi\nc2cxjqG5nnV9rIYlTTjYG6RBglq0SmzF/raBnF4Lwjxq4qRqvRllBXdFu5+2pMfC\nIZ10HPRdqDCTN60DUix+BTzBUT30NzaLhZbOMT5RvQtvTVgWpeIn20i2NrPWNCUh\nhj490dKDLpK/v+A5/i8zPvN4c6MkDHi1FZfaoz3863dylUBR3Ip26oM0hHXf4/2U\nA/oA4pCl2W0hc4aNtozjKHkVjRx5Q8/hVYu+39csFWxo6YSB/KgIEw+0W8DiTII3\nRQj/OlD68ZDmGLyQPiJvaEtY9fDrcSpI0Esm0i4sjkNbuuh0Cvwwwqo5EF1zfkVj\nTqz2REYQGMJGc5LUbIpk5sMHo1HWV038TWxlDRwtOdzw08zQA6BeWe9FOokRPeR2\nAqhyaJJwOZJodKZ76S+LDwFkTLzEKnYPCzkoRwLrEdNt1M7wQBThnC5z6wARAQAB\ntBxQb3N0Z3JlU1FMIERlYmlhbiBSZXBvc2l0b3J5iQJOBBMBCAA4AhsDBQsJCAcD\nBRUKCQgLBRYCAwEAAh4BAheAFiEEuXsK/KoaR/BE8kSgf8x9RqzMTPgFAlhtCD8A\nCgkQf8x9RqzMTPgECxAAk8uL+dwveTv6eH21tIHcltt8U3Ofajdo+D/ayO53LiYO\nxi27kdHD0zvFMUWXLGxQtWyeqqDRvDagfWglHucIcaLxoxNwL8+e+9hVFIEskQAY\nkVToBCKMXTQDLarz8/J030Pmcv3ihbwB+jhnykMuyyNmht4kq0CNgnlcMCdVz0d3\nz/09puryIHJrD+A8y3TD4RM74snQuwc9u5bsckvRtRJKbP3GX5JaFZAqUyZNRJRJ\nTn2OQRBhCpxhlZ2afkAPFIq2aVnEt/Ie6tmeRCzsW3lOxEH2K7MQSfSu/kRz7ELf\nCz3NJHj7rMzC+76Rhsas60t9CjmvMuGONEpctijDWONLCuch3Pdj6XpC+MVxpgBy\n2VUdkunb48YhXNW0jgFGM/BFRj+dMQOUbY8PjJjsmVV0joDruWATQG/M4C7O8iU0\nB7o6yVv4m8LDEN9CiR6r7H17m4xZseT3f+0QpMe7iQjz6XxTUFRQxXqzmNnloA1T\n7VjwPqIIzkj/u0V8nICG/ktLzp1OsCFatWXh7LbU+hwYl6gsFH/mFDqVxJ3+DKQi\nvyf1NatzEwl62foVjGUSpvh3ymtmtUQ4JUkNDsXiRBWczaiGSuzD9Qi0ONdkAX3b\newqmN4TfE+XIpCPxxHXwGq9Rv1IFjOdCX0iG436GHyTLC1tTUIKF5xV4Y0+cXIOI\nRgQQEQgABgUCTpdI7gAKCRDFr3dKWFELWqaPAKD1TtT5c3sZz92Fj97KYmqbNQZP\n+ACfSC6+hfvlj4GxmUjp1aepoVTo3weJAhwEEAEIAAYFAk6XSQsACgkQTFprqxLS\np64F8Q//cCcutwrH50UoRFejg0EIZav6LUKejC6kpLeubbEtuaIH3r2zMblPGc4i\n+eMQKo/PqyQrceRXeNNlqO6/exHozYi2meudxa6IudhwJIOn1MQykJbNMSC2sGUp\n1W5M1N5EYgt4hy+qhlfnD66LR4G+9t5FscTJSy84SdiOuqgCOpQmPkVRm1HX5X1+\ndmnzMOCk5LHHQuiacV0qeGO7JcBCVEIDr+uhU1H2u5GPFNHm5u15n25tOxVivb94\nxg6NDjouECBH7cCVuW79YcExH/0X3/9G45rjdHlKPH1OIUJiiX47OTxdG3dAbB4Q\nfnViRJhjehFscFvYWSqXo3pgWqUsEvv9qJac2ZEMSz9x2mj0ekWxuM6/hGWxJdB+\n+985rIelPmc7VRAXOjIxWknrXnPCZAMlPlDLu6+vZ5BhFX0Be3y38f7GNCxFkJzl\nhWZ4Cj3WojMj+0DaC1eKTj3rJ7OJlt9S9xnO7OOPEUTGyzgNIDAyCiu8F4huLPaT\nape6RupxOMHZeoCVlqx3ouWctelB2oNXcxxiQ/8y+21aHfD4n/CiIFwDvIQjl7dg\nmT3u5Lr6yxuosR3QJx1P6rP5ZrDTP9khT30t+HZCbvs5Pq+v/9m6XDmi+NlU7Zuh\nEhy97tL3uBDgoL4b/5BpFL5U9nruPlQzGq1P9jj40dxAaDAX/WKJAj0EEwEIACcC\nGwMFCwkIBwMFFQoJCAsFFgIDAQACHgECF4AFAlB5KywFCQPDFt8ACgkQf8x9RqzM\nTPhuCQ//QAjRSAOCQ02qmUAikT+mTB6baOAakkYq6uHbEO7qPZkv4E/M+HPIJ4wd\nnBNeSQjfvdNcZBA/x0hr5EMcBneKKPDj4hJ0panOIRQmNSTThQw9OU351gm3YQct\nAMPRUu1fTJAL/AuZUQf9ESmhyVtWNlH/56HBfYjE4iVeaRkkNLJyX3vkWdJSMwC/\nLO3Lw/0M3R8itDsm74F8w4xOdSQ52nSRFRh7PunFtREl+QzQ3EA/WB4AIj3VohIG\nkWDfPFCzV3cyZQiEnjAe9gG5pHsXHUWQsDFZ12t784JgkGyO5wT26pzTiuApWM3k\n/9V+o3HJSgH5hn7wuTi3TelEFwP1fNzI5iUUtZdtxbFOfWMnZAypEhaLmXNkg4zD\nkH44r0ss9fR0DAgUav1a25UnbOn4PgIEQy2fgHKHwRpCy20d6oCSlmgyWsR40EPP\nYvtGq49A2aK6ibXmdvvFT+Ts8Z+q2SkFpoYFX20mR2nsF0fbt1lfH65P64dukxeR\nGteWIeNakDD40bAAOH8+OaoTGVBJ2ACJfLVNM53PEoftavAwUYMrR910qvwYfd/4\n6rh46g1Frr9SFMKYE9uvIJIgDsQB3QBp71houU4H55M5GD8XURYs+bfiQpJG1p7e\nB8e5jZx1SagNWc4XwL2FzQ9svrkbg1Y+359buUiP7T6QXX2zY++JAj0EEwEIACcC\nGwMFCwkIBwMFFQoJCAsFFgIDAQACHgECF4AFAlEqbZUFCQg2wEEACgkQf8x9RqzM\nTPhFMQ//WxAfKMdpSIA9oIC/yPD/dJpY/+DyouOljpE6MucMy/ArBECjFTBwi/j9\nNYM4ynAk34IkhuNexc1i9/05f5RM6+riLCLgAOsADDbHD4miZzoSxiVr6GQ3YXMb\nOGld9kV9Sy6mGNjcUov7iFcf5Hy5w3AjPfKuR9zXswyfzIU1YXObiiZT38l55pp/\nBSgvGVQsvbNjsff5CbEKXS7q3xW+WzN0QWF6YsfNVhFjRGj8hKtHvwKcA02wwjLe\nLXVTm6915ZUKhZXUFc0vM4Pj4EgNswH8Ojw9AJaKWJIZmLyW+aP+wpu6YwVCicxB\nY59CzBO2pPJDfKFQzUtrErk9irXeuCCLesDyirxJhv8o0JAvmnMAKOLhNFUrSQ2m\n+3EnF7zhfz70gHW+EG8X8mL/EN3/dUM09j6TVrjtw43RLxBzwMDeariFF9yC+5bL\ntnGgxjsB9Ik6GV5v34/NEEGf1qBiAzFmDVFRZlrNDkq6gmpvGnA5hUWNr+y0i01L\njGyaLSWHYjgw2UEQOqcUtTFK9MNzbZze4mVaHMEz9/aMfX25R6qbiNqCChveIm8m\nYr5Ds2zdZx+G5bAKdzX7nx2IUAxFQJEE94VLSp3npAaTWv3sHr7dR8tSyUJ9poDw\ngw4W9BIcnAM7zvFYbLF5FNggg/26njHCCN70sHt8zGxKQINMc6SJAj0EEwEIACcC\nGwMFCwkIBwMFFQoJCAsFFgIDAQACHgECF4AFAlLpFRkFCQ6EJy0ACgkQf8x9RqzM\nTPjOZA//Zp0e25pcvle7cLc0YuFr9pBv2JIkLzPm83nkcwKmxaWayUIG4Sv6pH6h\nm8+S/CHQij/yFCX+o3ngMw2J9HBUvafZ4bnbI0RGJ70GsAwraQ0VlkIfg7GUw3Tz\nvoGYO42rZTru9S0K/6nFP6D1HUu+U+AsJONLeb6oypQgInfXQExPZyliUnHdipei\n4WR1YFW6sjSkZT/5C3J1wkAvPl5lvOVthI9Zs6bZlJLZwusKxU0UM4Btgu1Sf3nn\nJcHmzisixwS9PMHE+AgPWIGSec/N27a0KmTTvImV6K6nEjXJey0K2+EYJuIBsYUN\norOGBwDFIhfRk9qGlpgt0KRyguV+AP5qvgry95IrYtrOuE7307SidEbSnvO5ezNe\nmE7gT9Z1tM7IMPfmoKph4BfpNoH7aXiQh1Wo+ChdP92hZUtQrY2Nm13cmkxYjQ4Z\ngMWfYMC+DA/GooSgZM5i6hYqyyfAuUD9kwRN6BqTbuAUAp+hCWYeN4D88sLYpFh3\npaDYNKJ+Gf7Yyi6gThcV956RUFDH3ys5Dk0vDL9NiWwdebWfRFbzoRM3dyGP889a\nOyLzS3mh6nHzZrNGhW73kslSQek8tjKrB+56hXOnb4HaElTZGDvD5wmrrhN94kby\nGtz3cydIohvNO9d90+29h0eGEDYti7j7maHkBKUAwlcPvMg5m3Y=\n=DA1T\n-----END PGP PUBLIC KEY BLOCK-----\n"
  },
  {
    "path": "vagrant/files/postgresql/pg_hba.conf",
    "content": "# PostgreSQL Client Authentication Configuration File\n# ===================================================\n#\n# Refer to the \"Client Authentication\" section in the PostgreSQL\n# documentation for a complete description of this file.  A short\n# synopsis follows.\n#\n# This file controls: which hosts are allowed to connect, how clients\n# are authenticated, which PostgreSQL user names they can use, which\n# databases they can access.  Records take one of these forms:\n#\n# local      DATABASE  USER  METHOD  [OPTIONS]\n# host       DATABASE  USER  ADDRESS  METHOD  [OPTIONS]\n# hostssl    DATABASE  USER  ADDRESS  METHOD  [OPTIONS]\n# hostnossl  DATABASE  USER  ADDRESS  METHOD  [OPTIONS]\n#\n# (The uppercase items must be replaced by actual values.)\n#\n# The first field is the connection type: \"local\" is a Unix-domain\n# socket, \"host\" is either a plain or SSL-encrypted TCP/IP socket,\n# \"hostssl\" is an SSL-encrypted TCP/IP socket, and \"hostnossl\" is a\n# plain TCP/IP socket.\n#\n# DATABASE can be \"all\", \"sameuser\", \"samerole\", \"replication\", a\n# database name, or a comma-separated list thereof. The \"all\"\n# keyword does not match \"replication\". Access to replication\n# must be enabled in a separate record (see example below).\n#\n# USER can be \"all\", a user name, a group name prefixed with \"+\", or a\n# comma-separated list thereof.  In both the DATABASE and USER fields\n# you can also write a file name prefixed with \"@\" to include names\n# from a separate file.\n#\n# ADDRESS specifies the set of hosts the record matches.  It can be a\n# host name, or it is made up of an IP address and a CIDR mask that is\n# an integer (between 0 and 32 (IPv4) or 128 (IPv6) inclusive) that\n# specifies the number of significant bits in the mask.  A host name\n# that starts with a dot (.) matches a suffix of the actual host name.\n# Alternatively, you can write an IP address and netmask in separate\n# columns to specify the set of hosts.  Instead of a CIDR-address, you\n# can write \"samehost\" to match any of the server's own IP addresses,\n# or \"samenet\" to match any address in any subnet that the server is\n# directly connected to.\n#\n# METHOD can be \"trust\", \"reject\", \"md5\", \"password\", \"gss\", \"sspi\",\n# \"ident\", \"peer\", \"pam\", \"ldap\", \"radius\" or \"cert\".  Note that\n# \"password\" sends passwords in clear text; \"md5\" is preferred since\n# it sends encrypted passwords.\n#\n# OPTIONS are a set of options for the authentication in the format\n# NAME=VALUE.  The available options depend on the different\n# authentication methods -- refer to the \"Client Authentication\"\n# section in the documentation for a list of which options are\n# available for which authentication methods.\n#\n# Database and user names containing spaces, commas, quotes and other\n# special characters must be quoted.  Quoting one of the keywords\n# \"all\", \"sameuser\", \"samerole\" or \"replication\" makes the name lose\n# its special character, and just match a database or username with\n# that name.\n#\n# This file is read on server startup and when the postmaster receives\n# a SIGHUP signal.  If you edit the file on a running system, you have\n# to SIGHUP the postmaster for the changes to take effect.  You can\n# use \"pg_ctl reload\" to do that.\n\n# Put your actual configuration here\n# ----------------------------------\n#\n# If you want to allow non-local connections, you need to add more\n# \"host\" records.  In that case you will also need to make PostgreSQL\n# listen on a non-local interface via the listen_addresses\n# configuration parameter, or via the -i or -h command line switches.\n\n\n\n\n# DO NOT DISABLE!\n# If you change this first entry you will need to make sure that the\n# database superuser can access the database using some other method.\n# Noninteractive access to all databases is required during automatic\n# maintenance (custom daily cronjobs, replication, and similar tasks).\n#\n# Database administrative login by Unix domain socket\nlocal   all             postgres                                peer\n\n# TYPE  DATABASE        USER            ADDRESS                 METHOD\n\n# \"local\" is for Unix domain socket connections only\nlocal   all             all                                     peer\n# IPv4 local connections:\nhost    all             all             127.0.0.1/32            pam\n# IPv6 local connections:\nhost    all             all             ::1/128                 pam\n\nhost    all             all             0.0.0.0/0               pam\nhost    all             all             ::/0                    pam\n\n# Allow replication connections from localhost, by a user with the\n# replication privilege.\nlocal   replication     all                                     peer\nhost    replication     postgres        127.0.0.1/32            md5\nhost    replication     postgres        ::1/128                 md5\n"
  },
  {
    "path": "vagrant/group_vars/all",
    "content": "---\n# Partitioning\npartitioning: False\ncreat_test_loops: False\nvg_data_devices: /dev/sda1, /dev/sdb1\nvg_data: vg_data\nlv_wal: lv_wal\nlv_wal_size: 10g\nlv_data: lv_data\nlv_data_size: 100%FREE\n\nvg_backup_devices: /dev/sdc1, /dev/sdd1\nvg_backup: vg_backup\nlv_backup: lv_backup\nlv_backup_size: 100%FREE\n\ndatadir_base: /mnt/pgdata\nwaldir_base: /mnt/wal\nbackupdir_base: /mnt/backup\n\nmount_fstype: ext4\nmount_opts: noatime,nodev,noexec,nobarrier\n\n# System\novercommit_ratio: 90\nversion: 17\nclustername: main\nconfdir: /etc/postgresql/{{ version }}/{{ clustername }}\ndatadir: '{{ datadir_base }}/{{ version }}/{{ clustername }}'\nwaldir: '{{ waldir_base }}/{{ version }}/{{ clustername }}'\nadmin_user: 'admin'\nadmin_pass: '$6$smIbQ.WUs$pOjJEGx4nk3tBGJtebUXAToQsT/DTM8BESdD/pZ4SUxfvn.q8B15YR5o0rib1QMCJicUdtj1FYAYWnZRIZ6XS1' # admin\nlocal_repo: 'deb [trusted=yes] file:/srv/repository ./'\npgdg_repo: 'pgdg' # 'pgdg' or 'pgdg-testing'\nuse_local_repo: False\nsql_exporter_version: '0.2.0.1'\nlocale:\n  - de_DE.UTF-8 UTF-8\n  - en_US.UTF-8 UTF-8\nnofiles_hard: 131072\nnofiles_soft: 65536\n\n# Backup\npgbackrest_backupdir: '{{ backupdir_base }}/pgbackrest'\npgbackrest_retention_full: 4\npgbackrest_compress_level: 3\npgbackrest_spool_path: '{{ backupdir_base }}/pgbackrest_spool'\npgbackrest_process_max: 2\npgbackrest_archive_async: 'y'\npgbackrest_archive_queue_max: 1099511627776\npgbackrest_archive_push_process_max: 10\n\n# PostgreSQL Tuning\nmax_connections: 100\nsuperuser_reserved_connections: 8\nshared_buffers: 512MB\ntemp_buffers: 64MB\nwork_mem: 64MB\nmaintenance_work_mem: 1GB\nvacuum_cost_limit: 400\nwal_compression: off\nwal_log_hints: on\ncheckpoint_timeout: 15min\nmax_wal_size: 4GB\nmin_wal_size: 160MB\ncheckpoint_completion_target: 0.8\nrandom_page_cost: 0.4\neffective_cache_size: 5GB\nautovacuum_max_workers: 5\nautovacuum_naptime: 1min\nmax_worker_processes: 8\nmax_parallel_workers_per_gather: 2\ntrack_io_timing: on\n"
  },
  {
    "path": "vagrant/group_vars/dev",
    "content": "---\nuse_local_repo: True\n\n# PostgreSQL Tuning\nmax_connections: 100\nshared_buffers: 1GB\nwork_mem: 32MB\nmaintenance_work_mem: 1GB\nvacuum_cost_limit: 400\nmax_wal_size: 1GB\nmin_wal_size: 64MB\neffective_cache_size: 4GB\n"
  },
  {
    "path": "vagrant/group_vars/openpower",
    "content": "---\nuse_local_repo: False\n\n# Partitioning\npartitioning: True\nvg_data_devices: /dev/sda\nlv_wal_size: 50g\n\nvg_backup_devices: /dev/md0\n\n# PostgreSQL Tuning\nmax_connections: 800\nsuperuser_reserved_connections: 16\nshared_buffers: 16GB\nwork_mem: 256MB\nmaintenance_work_mem: 8GB\nvacuum_cost_limit: 800\nmax_wal_size: 25GB\nmin_wal_size: 160MB\ncheckpoint_completion_target: 0.8\nrandom_page_cost: 2\neffective_cache_size: 256GB\nautovacuum_max_workers: 6\nautovacuum_naptime: 30s\nmax_worker_processes: 16\nmax_parallel_workers_per_gather: 4\n"
  },
  {
    "path": "vagrant/group_vars/test",
    "content": "---\n# The goal of this ansible configuration is to test all components.\n# However, no partitioning tests are done.\n\nuse_local_repo: False\n\n# PostgreSQL Tuning\nmax_connections: 100\nshared_buffers: 1GB\nwork_mem: 32MB\nmaintenance_work_mem: 1GB\nvacuum_cost_limit: 400\nmax_wal_size: 1GB\nmin_wal_size: 64MB\neffective_cache_size: 4GB\n"
  },
  {
    "path": "vagrant/group_vars/test-with-disks",
    "content": "---\n# The goal of this ansible configuration is to test all components,\n# including partitioning.\n\nuse_local_repo: True\ncreat_test_loops: True\n\n# Partitioning\npartitioning: True\nvg_data_devices: /dev/loop0\nlv_wal_size: 400m\n\nvg_backup_devices: /dev/loop1\n\n# PostgreSQL Tuning\nmax_connections: 100\nshared_buffers: 1GB\nwork_mem: 32MB\nmaintenance_work_mem: 1GB\nvacuum_cost_limit: 400\nmax_wal_size: 1GB\nmin_wal_size: 64MB\neffective_cache_size: 4GB\n"
  },
  {
    "path": "vagrant/group_vars/x86-big",
    "content": "---\nuse_local_repo: False\n\n# Partitioning\npartitioning: True\nvg_data_devices: /dev/sdc\nlv_wal_size: 50g\n\nvg_backup_devices: /dev/md0\n\n# PostgreSQL Tuning\nmax_connections: 800\nsuperuser_reserved_connections: 16\nshared_buffers: 16GB\nwork_mem: 256MB\nmaintenance_work_mem: 8GB\nvacuum_cost_limit: 800\nmax_wal_size: 25GB\nmin_wal_size: 160MB\ncheckpoint_completion_target: 0.8\nrandom_page_cost: 2\neffective_cache_size: 256GB\nautovacuum_max_workers: 6\nautovacuum_naptime: 30s\nmax_worker_processes: 16\nmax_parallel_workers_per_gather: 4\n"
  },
  {
    "path": "vagrant/handlers.yml",
    "content": "- name: apt-get update\n  apt:\n    update_cache: true\n\n- name: update grub2\n  command: update-grub # on Debian\n\n- name: apt-ftparchive\n  shell: 'apt-ftparchive packages . > Packages'\n  args:\n    chdir: /srv/repository\n  notify: apt-get update\n\n- name: restart postgresql\n  service:\n    name: postgresql\n    state: restarted\n\n- name: reload postgresql\n  service:\n    name: postgresql\n    state: reloaded\n\n- name: restart apache\n  service:\n    name: apache2\n    state: restarted\n\n- name: restart grafana\n  service:\n    name: grafana-server\n    state: restarted\n\n- name: restart prometheus\n  service:\n    name: prometheus\n    state: restarted\n\n- name: restart prometheus-node-exporter\n  service:\n    name: prometheus-node-exporter\n    state: restarted\n\n- name: restart prometheus-sql-exporter\n  service:\n    name: prometheus-sql-exporter\n    state: restarted\n\n- name: restart pgbadger-report\n  service:\n    name: pgbadger-report\n    state: restarted\n\n- name: restart pgbadger-report timer\n  service:\n    name: pgbadger-report.timer\n    state: restarted\n\n- name: restart update prometheus sql exporter timer\n  service:\n    name: update-prometheus-sql-exporter-config.timer\n    state: restarted\n\n- name: restart cockpit\n  service:\n    name: cockpit\n    state: restarted\n\n- name: reload cockpit\n  service:\n    name: cockpit\n    state: reload\n\n- name: systemctl daemon-reload\n  command: systemctl daemon-reload\n  become: true\n\n- name: restart ferm\n  service:\n    name: ferm\n    state: restarted\n\n- name: restart sysstat\n  service:\n    name: sysstat\n    state: restarted\n    enabled: true\n"
  },
  {
    "path": "vagrant/inventory",
    "content": "[vm]\n#elephant-shed.dev.credativ.lan ansible_host=172.26.251.138 ansible_user=debian\n"
  },
  {
    "path": "vagrant/openstack/Vagrantfile",
    "content": "require 'vagrant-openstack-plugin'\n\nVagrant.configure('2') do |config|\n\n  config.vm.box = \"sharpie/dummy\"\n\n  config.ssh.username = 'debian'\n  config.ssh.private_key_path = 'app_dbteam.pem'\n\n  config.vm.synced_folder \"./\", \"/vagrant\", type: \"rsync\", disabled: true\n\n  config.vm.provider \"openstack\" do |os|\n    # Connection parameter\n    os.endpoint = ENV['OS_AUTH_URL']+\"/tokens\"\n    os.username = ENV['OS_USERNAME']\n    os.api_key  = ENV['OS_PASSWORD']\n    os.tenant   = ENV['OS_TENANT_NAME']\n    os.region   = ENV['OS_REGION_NAME']\n\n    # VM parameter\n    os.server_name = \"elephant-shed-test\"\n    os.flavor   = \"m1.large\"\n    os.image    = \"Debian 9 -- 20170119\"\n    os.keypair_name = \"app_dbteam\"\n    os.ssh_username = \"debian\"\n    os.public_network_name = \"public\"\n    os.networks = %w(DEV)\n  end\n\n   config.vm.provision \"ansible\" do |ansible|\n     ansible.playbook = \"../elephant-shed.yml\"\n     ansible.groups = {\n       \"dev\" => [\"default\"],\n       \"ansible\" => [\"default\"],\n     }\n   end\nend\n"
  },
  {
    "path": "vagrant/tasks/apache2.yml",
    "content": "- name: Configure apache2 to use less resources\n  template:\n    src: templates/apache2/mpm_event.conf.j2\n    dest: /etc/apache2/mods-available/mpm_event.conf\n    owner: root\n    group: root\n    mode: 0644\n  notify: restart apache"
  },
  {
    "path": "vagrant/tasks/config-backup.yml",
    "content": "---\n- name: Set pgBackrest global repo-path\n  ini_file:\n    dest: /etc/pgbackrest.conf\n    state: present\n    section: 'global'\n    option: 'repo1-path'\n    value: '{{ pgbackrest_backupdir }}'\n    no_extra_spaces: true\n\n- name: Set pgBackrest global retension policy\n  ini_file:\n    dest: /etc/pgbackrest.conf\n    state: present\n    section: 'global'\n    option: 'repo1-retention-full'\n    value: '{{ pgbackrest_retention_full }}'\n    no_extra_spaces: true\n\n- name: Set pgBackrest compression level\n  ini_file:\n    dest: /etc/pgbackrest.conf\n    state: present\n    section: 'global'\n    option: 'compress-level'\n    value: '{{ pgbackrest_compress_level }}'\n    no_extra_spaces: true\n\n- name: Set pgBackrest spool path\n  ini_file:\n    dest: /etc/pgbackrest.conf\n    state: present\n    section: 'global'\n    option: 'spool-path'\n    value: '{{ pgbackrest_spool_path }}'\n    no_extra_spaces: true\n\n- name: Set pgBackrest process-max\n  ini_file:\n    dest: /etc/pgbackrest.conf\n    state: present\n    section: 'global'\n    option: 'process-max'\n    value: '{{ pgbackrest_process_max }}'\n    no_extra_spaces: true\n\n- name: Set pgBackrest async archiving\n  ini_file:\n    dest: /etc/pgbackrest.conf\n    state: present\n    section: 'global'\n    option: 'archive-async'\n    value: '{{ pgbackrest_archive_async }}'\n    no_extra_spaces: true\n\n- name: Set pgBackrest max async queue\n  ini_file:\n    dest: /etc/pgbackrest.conf\n    state: present\n    section: 'global'\n    option: 'archive-queue-max'\n    value: '{{ pgbackrest_archive_queue_max }}'\n    no_extra_spaces: true\n\n- name: Set pgBackrest archive-push process-max\n  ini_file:\n    dest: /etc/pgbackrest.conf\n    state: present\n    section: \"global:archive-push\"\n    option: 'process-max'\n    value: '{{ pgbackrest_archive_push_process_max }}'\n    no_extra_spaces: true\n"
  },
  {
    "path": "vagrant/tasks/config-system.yml",
    "content": "# BASIC TUNING\n- name: Generate ssh keys for user root\n  user:\n    name: root\n    generate_ssh_key: yes\n\n- name: Create admin user\n  user:\n    name: '{{ admin_user }}'\n    # password is 'admin'\n    password: '{{ admin_pass }}'\n    update_password: on_create\n    comment: 'Default Admin User,,,'\n    shell: /bin/bash\n    groups: sudo,elephant-shed\n    generate_ssh_key: yes\n\n# Set locale\n- name: Set locale\n  lineinfile:\n    dest: /etc/locale.gen\n    line: \"{{ item }}\"\n  with_items: \"{{ locale }}\"\n  register: locale\n\n- name: Gen locale\n  command: locale-gen\n  when: locale is changed\n\n# Kernel configuration\n- name: Set vm.overcommit_ratio\n  sysctl:\n    name: vm.overcommit_ratio\n    value: \"{{ overcommit_ratio }}\"\n  when: ansible_virtualization_type != \"lxc\"\n\n- name: Set vm.overcommit_memory=2, don't overcommit\n  sysctl:\n    name: vm.overcommit_memory\n    value: 2\n  when: ansible_virtualization_type != \"lxc\"\n\n- name: Turn off memory zone reclaim\n  sysctl:\n    name: vm.zone_reclaim_mode\n    value: 0\n  when: ansible_virtualization_type != \"lxc\"\n\n- name: Edit grub defaults\n  lineinfile:\n    dest: /etc/default/grub\n    state: present\n    regexp: GRUB_TIMEOUT\n    line: GRUB_TIMEOUT=1\n  when: ansible_virtualization_type != \"lxc\"\n  notify:\n    - update grub2\n\n- name: Silence etckeeper git messages\n  copy:\n    src: files/git/gitconfig\n    dest: /root/.gitconfig\n    owner: root\n    group: root\n    mode: 0644\n    force: no\n\n- name: Create /etc/security/limits.d/\n  file:\n    path: /etc/security/limits.d\n    owner: root\n    mode: 0755\n    state: directory\n\n- name: Set max open files for postgres user\n  template:\n    dest: /etc/security/limits.d/postgres.conf\n    src: templates/postgres/postgres-limits.conf.j2\n\n- name: Set max open files for service postgresql@.service\n  lineinfile:\n    dest: /lib/systemd/system/postgresql@.service\n    state: present\n    regexp: 'LimitNOFILE'\n    line: 'LimitNOFILE={{ nofiles_hard }}'\n    insertafter: '^\\[Service\\]'\n  notify:\n    - systemctl daemon-reload\n\n- name: Enable sysstat metrics capturing\n  lineinfile:\n    dest: /etc/default/sysstat\n    state: present\n    regexp: ENABLED\n    line: ENABLED=\"true\"\n  notify:\n    - restart sysstat\n"
  },
  {
    "path": "vagrant/tasks/ferm.yml",
    "content": "- name: Create ferm.d\n  file:\n    path: /etc/ferm/ferm.d\n    state: directory\n    owner: root\n    group: adm\n    mode: 0751\n\n- name: Configure ferm.conf\n  template:\n    src: templates/ferm/ferm.conf.j2\n    dest: /etc/ferm/ferm.conf\n    owner: root\n    group: root\n    mode: 0644\n  notify: restart ferm\n\n- name: Configure ferm.d/elephant-shed.conf\n  template:\n    src: templates/ferm/elephant-shed.conf.j2\n    dest: /etc/ferm/ferm.d/elephant-shed.conf\n    owner: root\n    group: root\n    mode: 0644\n  notify: restart ferm"
  },
  {
    "path": "vagrant/tasks/grafana.yml",
    "content": "---\n- name: Get Grafana key\n  apt_key:\n    data: \"{{ lookup('file', 'grafana-key.10458545.asc') }}\"\n    id: 10458545\n    state: present\n\n- name: Setup Grafana repository\n  apt_repository:\n    repo: \"deb https://apt.grafana.com stable main\"\n    filename: 'grafana'\n    state: present\n\n- name: Update package cache\n  apt:\n    update_cache: yes\n\n- name: Install Grafana\n  apt:\n    name: grafana\n    state: present\n  notify: restart grafana\n"
  },
  {
    "path": "vagrant/tasks/packages.yml",
    "content": "# pgapt\n- name: Install pgdg Apt key\n  apt_key:\n    data: \"{{ lookup('file', 'postgresql/ACCC4CF8.asc') }}\"\n    id: ACCC4CF8\n    state: present\n\n- name: Setup pgdg repository\n  apt_repository:\n    repo: \"deb http://apt.postgresql.org/pub/repos/apt/ {{ ansible_distribution_release }}-{{ pgdg_repo | default('pgdg') }} main\"\n    filename: 'pgdg'\n    update_cache: false\n\n  # We want to add the debian security repository, if not already\n  # present. This is required if some 3rd party package depends on\n  # versions that are not included in bookworm main but in\n  # bookworm/updates main.  We use lineinfile instead of apt_repository\n  # to not add it if its already configured in\n  # /etc/apt/sources.list. apt_repository would add a new entry within\n  # /etc/apt/sources.list.d.\n- name: Setup debian security repository if not already present.\n  lineinfile:\n    dest: /etc/apt/sources.list\n    regexp: \"^deb\\ .*security.debian.org.*\"\n    line: \"deb http://security.debian.org/debian-security {{ ansible_distribution_release }}/updates main contrib\"\n  when: ansible_distribution_release == \"buster\"\n\n- name: Setup debian security repository if not already present.\n  lineinfile:\n    dest: /etc/apt/sources.list\n    regexp: \"^deb\\ .*security.debian.org.*\"\n    line: \"deb http://security.debian.org/debian-security {{ ansible_distribution_release }}-security main contrib\"\n  when: ansible_distribution_release != \"buster\" and ansible_distribution != \"Ubuntu\"\n\n# apt\n- name: Apt Dist-Upgrade\n  apt:\n    update_cache: yes\n    upgrade: dist\n\n# packages\n- name: Install base packages\n  package:\n    name: \"{{ item }}\"\n    state: present\n  with_items:\n  - tree\n  - vim\n  - screen\n  - tmux\n  - htop\n  - unzip\n  - w3m\n  - openssh-server\n  - ncdu\n  - ssl-cert\n  - net-tools\n  - ferm\n  - wget\n  - sysstat\n\n# elephant shed\n# separate tasks, so we can see the progress better\n- name:               Install elephant-shed-omnidb\n  package: state=present name=elephant-shed-omnidb\n  when: 'ansible_distribution_release != \"stretch\"'\n- name:               Install elephant-shed-portal\n  package: state=present name=elephant-shed-portal\n- name:               Install elephant-shed-cockpit\n  package: state=present name=elephant-shed-cockpit\n- name:               Install elephant-shed-prometheus\n  package: state=present name=elephant-shed-prometheus\n- name:               Install elephant-shed-grafana\n  package: state=present name=elephant-shed-grafana\n- name:               Install elephant-shed-pgbackrest\n  package: state=present name=elephant-shed-pgbackrest\n- name:               Install elephant-shed-pgbadger\n  package: state=present name=elephant-shed-pgbadger\n- name:               Install elephant-shed-tmate\n  package: state=present name=elephant-shed-tmate\n- name:               Install elephant-shed-powa\n  package: state=present name=elephant-shed-powa\n- name:               Install elephant-shed\n  package: state=present name=elephant-shed\n"
  },
  {
    "path": "vagrant/tasks/partitioning.yml",
    "content": "---\n- name: Create loop devices for testing\n  shell: |\n    dd if=/dev/zero of=/tmp/loop0 bs=1024 count=1000000\n    dd if=/dev/zero of=/tmp/loop1 bs=1024 count=1000000\n  args:\n    creates: /tmp/loop1\n  when: creat_test_loops == True\n\n- name: Mount loop devices for testing\n  shell: |\n    losetup /dev/loop0 /tmp/loop0\n    losetup /dev/loop1 /tmp/loop1\n  args:\n    creates: /dev/loop1\n  when: creat_test_loops == True\n\n- name: Create Data VG\n  lvg:\n    vg: '{{ vg_data }}'\n    pvs: '{{ vg_data_devices }}'\n\n- name: Create Backup VG\n  lvg:\n    vg: '{{ vg_backup }}'\n    pvs: '{{ vg_backup_devices }}'\n\n- name: Setup WAL LV\n  lvol:\n    vg: '{{ vg_data }}'\n    lv: '{{ lv_wal }}'\n    size: '{{ lv_wal_size }}'\n    shrink: no\n\n- name: Setup Data LV\n  lvol:\n    vg: '{{ vg_data }}'\n    lv: '{{ lv_data }}'\n    size: '{{ lv_data_size }}'\n    shrink: no\n\n- name: Setup Backup LV\n  lvol:\n    vg: '{{ vg_backup }}'\n    lv: '{{ lv_backup }}'\n    size: '{{ lv_backup_size }}'\n    shrink: no\n\n- name: Format Data Volume\n  filesystem:\n    fstype: '{{ mount_fstype }}'\n    dev: /dev/{{ vg_data }}/{{ lv_data }}\n\n- name: Format WAL Volume\n  filesystem:\n    fstype: '{{ mount_fstype }}'\n    dev: /dev/{{ vg_data }}/{{ lv_wal }}\n\n- name: Format Backup Volume\n  filesystem:\n    fstype: '{{ mount_fstype }}'\n    dev: /dev/{{ vg_backup }}/{{ lv_backup }}\n\n- name: Mount Data Volume\n  mount:\n    name: '{{ datadir_base }}'\n    # path\n    src: /dev/{{ vg_data }}/{{ lv_data }}\n    fstype: '{{ mount_fstype }}'\n    opts: '{{ mount_opts }}'\n    state: mounted\n\n- name: Mount WAL Volume\n  mount:\n    name: '{{ waldir_base }}'\n    # path\n    src: /dev/{{ vg_data }}/{{ lv_wal }}\n    fstype: '{{ mount_fstype }}'\n    opts: '{{ mount_opts }}'\n    state: mounted\n\n- name: Mount Backup Volume\n  mount:\n    name: '{{ backupdir_base }}'\n    # path\n    src: /dev/{{ vg_backup }}/{{ lv_backup }}\n    fstype: '{{ mount_fstype }}'\n    opts: '{{ mount_opts }}'\n    state: mounted\n"
  },
  {
    "path": "vagrant/tasks/postgresql.yml",
    "content": "# PostgreSQL\n\n- name: Install postgresql-common\n  package:\n    name: \"{{ item }}\"\n    state: present\n  with_items:\n  - postgresql-common\n\n- name: Disable auto cluster creation\n  lineinfile:\n    dest: /etc/postgresql-common/createcluster.conf\n    state: present\n    regexp: '^.?create_main_cluster'\n    line: 'create_main_cluster = false'\n\n- name: Install elephant-shed-postgresql.deb\n  package:\n    name: elephant-shed-postgresql\n    state: present\n\n- name: Install PostgreSQL packages\n  package:\n    name: \"{{ item }}\"\n    state: present\n  with_items:\n  - postgresql-{{ version }}\n  - postgresql-contrib-{{ version }}\n  - postgresql-{{ version }}-unit\n  - check-postgres\n  - python3-psycopg2 # for postgresql_user\n\n- name: Create data volume\n  file:\n    path: '{{ datadir_base }}'\n    owner: postgres\n    group: postgres\n    mode: 0700\n    state: directory\n    recurse: true\n\n\n- name: Create WAL volume\n  file:\n    path: '{{ waldir_base }}'\n    owner: postgres\n    group: postgres\n    mode: 0700\n    state: directory\n    recurse: true\n\n- name: Create backup volume\n  file:\n    path: '{{ backupdir_base }}'\n    owner: postgres\n    group: postgres\n    mode: 0700\n    state: directory\n    recurse: true\n\n- name: Create backup dir\n  file:\n    path: '{{ pgbackrest_backupdir }}'\n    owner: postgres\n    group: postgres\n    mode: 0700\n    state: directory\n    recurse: true\n\n- name: Create backup spool dir\n  file:\n    path: '{{ pgbackrest_spool_path }}'\n    owner: postgres\n    group: postgres\n    mode: 0700\n    state: directory\n    recurse: true\n\n- name: Change data_directory for new clusters\n  lineinfile:\n    dest: /etc/postgresql-common/createcluster.d/elephant-shed.conf\n    state: present\n    regexp: '^.?data_directory'\n    line: \"data_directory = '{{ datadir_base }}/%v/%c'\"\n    insertafter: '^# Default data directory'\n\n- name: Config waldir for new clusters\n  lineinfile:\n    dest: /etc/postgresql-common/createcluster.d/elephant-shed.conf\n    state: present\n    regexp: '^.?waldir'\n    line: \"waldir = '{{ waldir_base }}/%v/%c'\"\n    insertafter: '^# Default directory for transaction logs'\n\n- name: Deploy performance tuning configuration for postgresql-common\n  template:\n    dest: /etc/postgresql-common/createcluster.d/performance-tuning.conf\n    src: templates/postgresql-common/performance-tuning.conf.j2\n\n- name: Create {{version}}/main cluster\n  shell: \"pg_createcluster {{ version }} main --start\"\n  args:\n    creates: /etc/postgresql/{{version}}/main/postgresql.conf\n  notify: restart prometheus-sql-exporter\n\n- name: Deploy pg_hba.conf\n  copy:\n    dest:  \"{{ confdir }}/pg_hba.conf\"\n    src: files/postgresql/pg_hba.conf\n    owner: postgres\n    group: postgres\n    mode: 0600\n  notify:\n    - reload postgresql\n\n- name: Start postgresql@{{version}}-main\n  service:\n    name: postgresql@{{version}}-main\n    state: started\n\n- name: Process all pending handler actions now\n  meta: flush_handlers\n\n- name: 'Create {{ admin_user }} user in PostgreSQL'\n  become_user: postgres\n  become_method: sudo\n  postgresql_user:\n    name: '{{ admin_user }}'\n    role_attr_flags: LOGIN,SUPERUSER\n  ignore_errors: True # Fails on read-only standby\n\n- name: Generate ssh keys for user postgres\n  user:\n    name: postgres\n    generate_ssh_key: yes\n"
  },
  {
    "path": "vagrant/tasks/repository-local.yml",
    "content": "- name: Install apt-utils\n  package:\n    name: apt-utils\n    state: present\n\n- name: Create directory /srv/repository\n  file:\n    path: /srv/repository\n    state: directory\n    mode: 0775\n  notify: apt-ftparchive\n\n- name: Copy elephant-shed*all.deb\n  copy:\n    src: '../../{{item}}'\n    dest: '/srv/repository/{{item}}'\n  with_lines: 'cd ../.. && ls elephant-shed*all.deb || :'\n  notify: apt-ftparchive\n  register: localpackages\n\n- meta: flush_handlers\n\n- name: Setup local repository\n  apt_repository:\n    repo: '{{ local_repo }}'\n    filename: 'local'\n\n# Reinstall packages when changed (the version number doesn't change, so upgrade doesn't work)\n- name: Reinstall elephant-shed-*all.deb\n  shell: |\n    DEBIAN_FRONTEND=noninteractive dpkg -l elephant-shed\\* | grep ^ii | awk '{ print $2 }' | xargs -r apt-get install --reinstall -y --force-yes\n  when: localpackages is changed\n"
  },
  {
    "path": "vagrant/templates/apache2/mpm_event.conf.j2",
    "content": "# event MPM\n# StartServers: initial number of server processes to start\n# MinSpareThreads: minimum number of worker threads which are kept spare\n# MaxSpareThreads: maximum number of worker threads which are kept spare\n# ThreadsPerChild: constant number of worker threads in each server process\n# MaxRequestWorkers: maximum number of worker threads\n# MaxConnectionsPerChild: maximum number of requests a server process serves\n<IfModule mpm_event_module>\n\tStartServers            1\n\tMinSpareThreads         2\n\tMaxSpareThreads         4\n\tThreadLimit             64\n\tThreadsPerChild         16\n\tMaxRequestWorkers       128\n\tMaxConnectionsPerChild   0\n</IfModule>\n\n# vim: syntax=apache ts=4 sw=4 sts=4 sr noet\n"
  },
  {
    "path": "vagrant/templates/ferm/elephant-shed.conf.j2",
    "content": "chain INPUT {\n        # allow access to the web interface\n        proto tcp dport (http https) ACCEPT;\n\n        # allow access to the first 8 PostgreSQL clusters\n        proto tcp dport (5432:5439) ACCEPT;\n    }"
  },
  {
    "path": "vagrant/templates/ferm/ferm.conf.j2",
    "content": "# -*- shell-script -*-\n#\n#  Configuration file for ferm(1).\n#\ndomain (ip ip6) {\n    table filter {\n        chain INPUT {\n            policy DROP;\n\n            # connection tracking\n            mod state state INVALID DROP;\n            mod state state (ESTABLISHED RELATED) ACCEPT;\n\n            # allow local packet\n            interface lo ACCEPT;\n\n            # respond to ping\n            proto icmp ACCEPT;\n\n            # allow IPsec\n            proto udp dport 500 ACCEPT;\n\t    @if @eq($DOMAIN, ip) {\n\t      proto (esp ah) ACCEPT;\n\t    } @else {\n\t      proto (esp) ACCEPT;\n\t    }\n\n            # allow SSH connections\n            proto tcp dport ssh ACCEPT;\n        }\n        chain OUTPUT {\n            policy ACCEPT;\n\n            # connection tracking\n            #mod state state INVALID DROP;\n            mod state state (ESTABLISHED RELATED) ACCEPT;\n        }\n        chain FORWARD {\n            policy DROP;\n\n            # connection tracking\n            mod state state INVALID DROP;\n            mod state state (ESTABLISHED RELATED) ACCEPT;\n        }\n    }\n}\n\n@include ferm.d/;\n"
  },
  {
    "path": "vagrant/templates/postgres/postgres-limits.conf.j2",
    "content": "postgres    hard    nofile    {{ nofiles_hard }}\npostgres    soft    nofile    {{ nofiles_soft }}\n"
  },
  {
    "path": "vagrant/templates/postgresql-common/performance-tuning.conf.j2",
    "content": "#------------------------------------------------------------------------------\n# CONNECTIONS AND AUTHENTICATION\n#------------------------------------------------------------------------------\nmax_connections = {{ max_connections }}\nsuperuser_reserved_connections = {{ superuser_reserved_connections }}\n\n#------------------------------------------------------------------------------\n# RESOURCE USAGE (except WAL)\n#------------------------------------------------------------------------------\nshared_buffers = {{ shared_buffers }}\ntemp_buffers = {{ temp_buffers }}\nwork_mem = {{ work_mem }}\nmaintenance_work_mem = {{ maintenance_work_mem }}\nvacuum_cost_limit = {{ vacuum_cost_limit }}\nmax_worker_processes = {{ max_worker_processes }}\nmax_parallel_workers_per_gather = {{ max_parallel_workers_per_gather }}\n\n#------------------------------------------------------------------------------\n# WRITE AHEAD LOG\n#------------------------------------------------------------------------------\nwal_compression = {{ wal_compression }}\nwal_log_hints = {{ wal_log_hints }}\n\n# - Checkpoints -\ncheckpoint_timeout = {{ checkpoint_timeout }}\nmax_wal_size = {{ max_wal_size }}\nmin_wal_size = {{ min_wal_size }}\ncheckpoint_completion_target = {{ checkpoint_completion_target }}\n\n#------------------------------------------------------------------------------\n# QUERY TUNING\n#------------------------------------------------------------------------------\n# - Planner Cost Constants -\nrandom_page_cost = {{ random_page_cost }}\neffective_cache_size = {{ effective_cache_size }}\n\n#------------------------------------------------------------------------------\n# RUNTIME STATISTICS\n#------------------------------------------------------------------------------\ntrack_activities = on\ntrack_counts = on\ntrack_io_timing = {{ track_io_timing }}\n\n\n#------------------------------------------------------------------------------\n# AUTOVACUUM PARAMETERS\n#------------------------------------------------------------------------------\nautovacuum_max_workers = {{ autovacuum_max_workers }}\nautovacuum_naptime = {{ autovacuum_naptime }}\n"
  },
  {
    "path": "vagrant/vagrantpackage.sh",
    "content": "#!/bin/sh\n\nrm -vf elephant-shed.box\n\nvagrant package --vagrantfile Vagrantfile.template --output elephant-shed.box\n"
  }
]