diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..d8fe4fa
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+/.project
diff --git a/README.md b/README.md
index b718b13..55ccdee 100644
--- a/README.md
+++ b/README.md
@@ -1,24 +1,39 @@
-# magma-deployer
-
-Docs: https://magma.github.io/magma/docs/next/orc8r/deploy_using_ansible
-
-Quick Install:
-```bash
-sudo bash -c "$(curl -sL https://github.com/magma/magma-deployer/raw/main/deploy-orc8r.sh)"
-```
-
-Switch to `magma` user after deployment has finsished:
-```bash
-sudo su - magma
-```
-
-Once all pods are ready, setup NMS login:
-```bash
-cd ~/magma-deployer
-ansible-playbook config-orc8r.yml
-```
-
-You can get your `rootCA.pem` file from the following location:
-```bash
-cat ~/magma-deployer/secrets/rootCA.pem
-```
+# Magma-Deployer
+Is a Magma project to simplify deployment of the components of the Magma Platform. The deployable components include the *Orchestrator aka Orc8r*, the *Access Gateway aka AGW*, the *Federation Gateway aka FEG (future)*, and the *Domain Proxy aka DP (future)*. There are multiple deployment methods and target environments possible for these components. At this time, magma-deployer enables the following deployments:
+
+| Component | Version | Host | Deployment Model |
+| --------- | ------- | ---------------------------------------------------- | ------------------------------------------------------------ |
+| Orc8r | v1.9 | Ubuntu 22.04 Bare Metal or Virtual Machine | Ansible playbook(s) and helm into K8s cluster |
+| AGW | v1.9 | Ubuntu 20.04 Bare Metal or Virtual Machine (2 NICs) | Ansible playbook(s) and docker-compose into docker containers |
+
+## Out of Scope (at this time)
+
+* Although other deployment models exist (e.g., Terraform, AWS-specific, Vagrant VMs, non-containerized AGW, k8s AGW), they are not currently implemented in magma-deployer.
+* Magma-deployer does not currently support FEG or DP deployments
+* Magma-deployer ends when the AGW successfully connects to the Orc8r. Follow on tasks of adding eNodeBs and gNodeBs, subscribers, configuring for 5G and connecting UEs are considered post-deployment steps.
+
+## Basic Workflow
+
+A minimal new deployment begins with an Orc8r and a single AGW. To have a full standalone network, an eNodeB (LTE) or gNodeB (5G) and a compatible UE and SIM are needed. The steps in the deployment are:
+
+1. Deploy Orc8r using orc8r-deployer.
+2. Deploy an AGW using agw-deployer. You will need information from step #1 during step #2 and beyond.
+3. Connect the AGW to the Orc8r
+
+----
+
+*Magma-deployer ends here.*
+
+-----
+
+4. [optional] Configure the network for 5G
+5. Connect eNodeB or gNodeB to AGW and provision in Orc8r
+6. Provision a UE and SIM for the network
+7. Provision a subscriber in Orc8r
+8. Connect the UE to the network
+
+Now, head to orc8r-deployer.
+
+## References
+
+TBD
diff --git a/agw-deployer/.gitignore b/agw-deployer/.gitignore
new file mode 100644
index 0000000..9c22dbc
--- /dev/null
+++ b/agw-deployer/.gitignore
@@ -0,0 +1,2 @@
+/downloads
+ansible_collections
diff --git a/agw-deployer/README.md b/agw-deployer/README.md
new file mode 100644
index 0000000..342953a
--- /dev/null
+++ b/agw-deployer/README.md
@@ -0,0 +1,201 @@
+# An AGW Deployment Recipe
+
+This recipe deploys a standalone Magma AGW. It assumes that the orc8r-deployer or equivalent has already been run and the orc8r is accessible from the AGW machine.
+
+DISCLAIMER: As with many deployment recipes, successful execution of the recipe is dependent on adjusting it to the specifics of a given environment. There is no guarantee this recipe can work "out of the box" in an arbitrary environment. Familiarity with Linux, Docker, Magma, IP Networking, and Ansible are likely to be needed to assure successful completion.
+
+The recipe consists of the following primary steps:
+
+1. Bootstrapping the initial environment
+2. Deploy the Access Gateway
+3. Connect the AGW to the Orc8r
+
+
+### Prerequisites
+Ubuntu 20.04 system with >100GB disk.
+
+## Preparing your environment
+
+You will need a physical system running Ubuntu 20.04 to deploy the **Magma Access Gateway (AGW)**. The AGW requires two physical ethernet network interface cards. It is possible to run this same recipe in a virtual machine and this method has been tested in KVM/QEMU virtual machines. This recipe does not cover preparing a virtual machine.) This recipe assumes a bare metal install of the AGW. The AGW deployment uses docker and docker-compose deployment on the baremetal AGW system.
+
+This recipe deploys a 5G network using Magma v1.9.
+
+On the AGW System, set the environment variable `RECIPE_HOME` to the full pathname of the recipe folder (e.g,. `export RECIPE_HOME=/home/ubuntu//magma-deployer/agw-deployer`).
+
+## Deploy the AGW
+Deployment of the AGW involves:
+
+1. Configuring deployment specific environment variables and installing prerequisites (`.env`, `bootstrap.sh`, reboot)
+2. Setting up the AGW network configuration (`agwc-networking` playbook)
+3. AGW docker-compose deployment (`agwc1` playbook, reboot, `agcw2` playbook)
+
+The recipe is based on [this](https://magma.github.io/magma/docs/next/lte/deploy_install_docker) deployment guide.
+
+### Initial configuration and installation of prerequistes
+
+```
+$ export RECIPE_HOME=
+$ cd $RECIPE_HOME/bootstrap
+$ cp template.env .env
+$ vim .env
+```
+
+Edit the variables in .env to your preferred values. Then run:
+
+```
+$ bash bootstrap.sh
+```
+#### Notes on the `.env` variables:
+- MAGMA_DN is the domain for your Orc8r
+- PRIVATE_KEY is used for ansible hosts
+- ROOT_CA_PATH is the directory that contains your Orc8r's `rootCA.pem`
+- At this writing:
+ - `DOCKER_IMAGE_VERSION=20.10.21-0ubuntu1~20.04.2`
+ - `DOCKER_COMPOSE_VERSION="v2.17.2"`
+
+Reboot and test that docker works correctly (e.g., `docker ps` should respond with no containers running). You may want to to inspect the `$RECIPE_HOME/ansible/hosts.yml` file to validate the configuration set up by `bootstrap.sh`.
+
+`bootstrap.sh` runs an ansible playbook called `deploy-common-system.yml`. If you run into issues during this phase, you may need rerun this playbook.
+```
+$ cd $RECIPE_HOME/ansible
+$ ansible-playbook deploy-common-system.yml -K
+```
+
+### AGW network configuration
+
+This will set up the AGW eth0 and eth1 interfaces
+
+```
+$ cd $RECIPE_HOME/ansible
+$ ansible-playbook deploy-agwc-networking.yml -K
+$ ip a
+```
+Verify that network for eth0 and eth1 are correct. You should be able to ping the Orc8r over eth0 and, if you have one, your gNB over eth1.
+
+#### Notes on network configuration
+- Your network renderer should be set to `NetworkManager` (check: `/etc/netplan/00-installer-config.yaml`)
+- You may have issues with connectivity if this stage fails. Try to have direct console access during this playbook's execution
+- Configuration of the AGW's ethernet networking has been one of the more problematic parts of bringing up an AGW. The playbook sets up the networking prior to actually deploying the gateway to prevent some issues that arise during. However, the deployment may impact some of the configuration.
+- If you find that your network names are changing after reboots, make sure you do [this](https://askubuntu.com/questions/1255823/network-interface-names-change-every-reboot) Your grub configuration is wrong. Make it like this:
+
+```
+$ sudo vim /etc/default/grub
+...
+# GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0"
+GRUB_CMDLINE_LINUX=""
+...
+$ sudo update-grub
+
+$ reboot
+```
+
+### AGW docker-compose deployment (Part 1 and Part 2)
+
+The docker-compose version of the AGW will be deployed in two stages.
+
+Stage one sets up many of the agwc parameters and files and runs `agw_install_docker.sh`. This script clones magma and configures it for use. It installs the OpenVSwitch used by magma which requires a reboot.
+
+```
+$ cd $RECIPE_HOME/ansible
+$ ansible-playbook deploy-agwc1.yml -K
+```
+Reboot.
+
+Stage two completes the configuration and brings up the AGW containers. After this is complete,
+
+```
+$ cd $RECIPE_HOME/ansible
+$ ansible-playbook deploy-agwc2.yml -K
+$ docker ps
+```
+
+All AGW containers should be running and showing healthy. The playbook will print the information needed to provision the AGW in the Orc8r. You can do that provisioning at this point. If you lose the info:
+
+```
+$ docker exec magmad show_gateway_info.py
+```
+Use this to provision the AGW in the Orc8r.
+On the Orc8r NMS, navigate to `Equipment->Gateways" from the left navigation bar, hit "Add New" on the upper right, and fill out the multi-step modal form. Use the secrets from above for the "Hardware UUID" and "Challenge Key" fields.
+
+For now, you won't have any eNodeB's to select in the eNodeB dropdown under the "Ran" tab. This is OK, we'll get back to this in a later step.
+
+At this point, you can validate the connection between your AGW and Orchestrator:
+
+After the provisioning, restart the AGW services.
+
+```
+$ cd /var/opt/magma/docker
+$ sudo docker compose --compatibility up -d --force-recreate
+```
+At this point, you can validate the connection between your AGW and Orchestrator.
+
+The magma documentation says to run:
+```
+sudo docker exec magmad checkin_cli.py
+```
+
+to verify connectivity, however, as of this writing, there is a bug in the containerized version that will give this error even when you are connected to the Orc8r:
+```
+1. -- Testing TCP connection to controller.orc8r.magma18.livingedgelab.org:443 --
+2. -- Testing Certificate --
+3. -- Testing SSL --
+4. -- Creating direct cloud checkin --
+
+> Error: <_MultiThreadedRendezvous of RPC that terminated with:
+ status = StatusCode.UNAVAILABLE
+ details = "failed to connect to all addresses; last error: UNAVAILABLE: Socket closed"
+ debug_error_string = "UNKNOWN:Failed to pick subchannel {created_time:"2022-10-21T19:23:22.773234625+02:00", children:[UNKNOWN:failed to connect to all addresses; last error: UNAVAILABLE: Socket closed {created_time:"2022-10-21T19:23:22.773231265+02:00", grpc_status:14}]}"
+```
+Two currently more reliable ways to validate Orc8r connection are:
+```
+$ sudo docker exec magmad cat /var/log/syslog|grep heart
+```
+
+Which should show multiple lines of:
+```
+Oct 21 13:33:43 agw-p18-2 eba229d6ac98[780]: INFO:root:[SyncRPC] Got heartBeat from cloud
+```
+
+And, from the NMS console in Orc8r, see if the AGW has checked in recently. Sometimes, this method will indicate a bad state even when all is OK, though. C.f.:
+
+
+
+At this point, you should have a working dockerized AGW connected to the Orc8r. You can check the overall operation of the AGW.
+```
+$ docker ps
+```
+Should show something like this:
+```
+CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
+
+CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
+49fa338525dd linuxfoundation.jfrog.io/magma-docker-agw-test/agw_gateway_c:v1.9 "sh -c 'mkdir -p /va…" 2 hours ago Up 2 hours (healthy) sessiond
+20204d9636e0 linuxfoundation.jfrog.io/magma-docker-agw-test/agw_gateway_c:v1.9 "sh -c '/usr/local/b…" 2 hours ago Up 2 hours (healthy) oai_mme
+0af7a08a2489 linuxfoundation.jfrog.io/magma-docker-agw-test/agw_gateway_python:v1.9 "/usr/bin/env python…" 2 hours ago Up 2 hours (healthy) state
+975a3a3af345 linuxfoundation.jfrog.io/magma-docker-agw-test/agw_gateway_python:v1.9 "/usr/bin/env python…" 2 hours ago Up 2 hours (healthy) policydb
+19a416e835ec linuxfoundation.jfrog.io/magma-docker-agw-test/agw_gateway_python:v1.9 "/usr/bin/env python…" 2 hours ago Up 2 hours (healthy) directoryd
+49372d59d9d8 linuxfoundation.jfrog.io/magma-docker-agw-test/agw_gateway_python:v1.9 "bash -c '/usr/bin/o…" 2 hours ago Up 2 hours (healthy) pipelined
+64990c44a1da linuxfoundation.jfrog.io/magma-docker-agw-test/agw_gateway_c:v1.9 "/usr/local/bin/sctpd" 2 hours ago Up 2 hours sctpd
+bd0e794c9a3c linuxfoundation.jfrog.io/magma-docker-agw-test/agw_gateway_python:v1.9 "/usr/bin/env python…" 2 hours ago Up 2 hours (healthy) subscriberdb
+a21bdf353a1b linuxfoundation.jfrog.io/magma-docker-agw-test/agw_gateway_python:v1.9 "/usr/bin/env python…" 2 hours ago Up 2 hours (healthy) eventd
+434910ae0121 linuxfoundation.jfrog.io/magma-docker-agw-test/agw_gateway_python:v1.9 "/usr/bin/env python…" 2 hours ago Up 2 hours (healthy) redirectd
+20636cdd3a41 linuxfoundation.jfrog.io/magma-docker-agw-test/agw_gateway_python:v1.9 "sh -c '/usr/local/b…" 2 hours ago Up 2 hours (healthy) control_proxy
+68143b9804e6 linuxfoundation.jfrog.io/magma-docker-agw-test/agw_gateway_python:v1.9 "/bin/bash -c '/usr/…" 2 hours ago Up 2 hours (healthy) redis
+854259a6b479 linuxfoundation.jfrog.io/magma-docker-agw-test/agw_gateway_python:v1.9 "/bin/bash -c '/usr/…" 2 hours ago Up 2 hours (healthy) td-agent-bit
+db4a62105283 linuxfoundation.jfrog.io/magma-docker-agw-test/agw_gateway_python:v1.9 "/usr/bin/env python…" 2 hours ago Up 2 hours (healthy) health
+fad91576d6be linuxfoundation.jfrog.io/magma-docker-agw-test/agw_gateway_c:v1.9 "/usr/local/bin/conn…" 2 hours ago Up 2 hours (healthy) connectiond
+4a704bbe52ea linuxfoundation.jfrog.io/magma-docker-agw-test/agw_gateway_python:v1.9 "sh -c 'sleep 5 && /…" 2 hours ago Up 2 hours (healthy) mobilityd
+dc15610a0c3f linuxfoundation.jfrog.io/magma-docker-agw-test/agw_gateway_python:v1.9 "/bin/bash -c '\n /u…" 2 hours ago Up 2 hours magmad
+cf8dd09aeac8 linuxfoundation.jfrog.io/magma-docker-agw-test/agw_gateway_python:v1.9 "/usr/bin/env python…" 2 hours ago Up 2 hours (healthy) ctraced
+1aa4cde13cd2 linuxfoundation.jfrog.io/magma-docker-agw-test/agw_gateway_python:v1.9 "/usr/bin/env python…" 2 hours ago Up 2 hours (healthy) enodebd
+a215379edf82 linuxfoundation.jfrog.io/magma-docker-agw-test/agw_gateway_python:v1.9 "/usr/bin/env python…" 2 hours ago Up 2 hours (healthy) smsd
+f3fd137e4652 linuxfoundation.jfrog.io/magma-docker-agw-test/agw_gateway_python:v1.9 "/usr/bin/env python…" 2 hours ago Up 2 hours (healthy) monitord
+
+```
+
+## Other tools, tips, debugging suggestions
+
+# Notes to be dealt with later
+
+# TODO
+
diff --git a/agw-deployer/ansible/.gitignore b/agw-deployer/ansible/.gitignore
new file mode 100644
index 0000000..48601b6
--- /dev/null
+++ b/agw-deployer/ansible/.gitignore
@@ -0,0 +1,2 @@
+/hosts.yml
+/env2jinja2.log
diff --git a/agw-deployer/ansible/LICENSE b/agw-deployer/ansible/LICENSE
new file mode 100644
index 0000000..237120d
--- /dev/null
+++ b/agw-deployer/ansible/LICENSE
@@ -0,0 +1,29 @@
+BSD 3-Clause License
+
+Copyright (c) 2022, Shubham Tatvamasi
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holder nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/ansible.cfg b/agw-deployer/ansible/ansible.cfg
similarity index 100%
rename from ansible.cfg
rename to agw-deployer/ansible/ansible.cfg
diff --git a/agw-deployer/ansible/collections/requirements.yml b/agw-deployer/ansible/collections/requirements.yml
new file mode 100644
index 0000000..dd3ef27
--- /dev/null
+++ b/agw-deployer/ansible/collections/requirements.yml
@@ -0,0 +1,6 @@
+collections:
+ - name: community.crypto
+ - name: community.docker
+ - name: cloud.common
+ - name: kubernetes.core
+ - name: ansible.posix
diff --git a/config-orc8r.yml b/agw-deployer/ansible/config-orc8r.yml
similarity index 100%
rename from config-orc8r.yml
rename to agw-deployer/ansible/config-orc8r.yml
diff --git a/agw-deployer/ansible/deploy-agwc-networking.yml b/agw-deployer/ansible/deploy-agwc-networking.yml
new file mode 100644
index 0000000..251e75f
--- /dev/null
+++ b/agw-deployer/ansible/deploy-agwc-networking.yml
@@ -0,0 +1,6 @@
+---
+# Must run common-system first
+- name: Configure Magma AGW Networking
+ hosts: all
+ roles:
+ - role: agwc-config-networking
diff --git a/agw-deployer/ansible/deploy-agwc1.yml b/agw-deployer/ansible/deploy-agwc1.yml
new file mode 100644
index 0000000..4e1bd03
--- /dev/null
+++ b/agw-deployer/ansible/deploy-agwc1.yml
@@ -0,0 +1,6 @@
+---
+# Must run common-system first
+- name: Install Magma AGW
+ hosts: all
+ roles:
+ - role: agwc-compose-part1
diff --git a/agw-deployer/ansible/deploy-agwc2.yml b/agw-deployer/ansible/deploy-agwc2.yml
new file mode 100644
index 0000000..a38d9f5
--- /dev/null
+++ b/agw-deployer/ansible/deploy-agwc2.yml
@@ -0,0 +1,7 @@
+---
+# Must run common-system first
+- name: Install Magma AGW
+ hosts: all
+ roles:
+ - role: agwc-compose-part2
+
diff --git a/agw-deployer/ansible/deploy-common-system.yml b/agw-deployer/ansible/deploy-common-system.yml
new file mode 100644
index 0000000..42edc13
--- /dev/null
+++ b/agw-deployer/ansible/deploy-common-system.yml
@@ -0,0 +1,13 @@
+---
+- name: Install Common System
+ hosts: all
+ roles:
+ - role: prerequisites
+ - role: docker
+
+ tasks:
+ - name: Reboot
+ pause:
+ prompt: Reboot your system now; wireshark and docker (at least) require reboot here
+ echo: yes
+
\ No newline at end of file
diff --git a/agw-deployer/ansible/deploy-docker.yml b/agw-deployer/ansible/deploy-docker.yml
new file mode 100644
index 0000000..f54af58
--- /dev/null
+++ b/agw-deployer/ansible/deploy-docker.yml
@@ -0,0 +1,5 @@
+---
+- name: Install Docker
+ hosts: all
+ roles:
+ - role: docker
diff --git a/agw-deployer/ansible/deploy-k9s.yml b/agw-deployer/ansible/deploy-k9s.yml
new file mode 100644
index 0000000..6bb07d7
--- /dev/null
+++ b/agw-deployer/ansible/deploy-k9s.yml
@@ -0,0 +1,5 @@
+---
+- name: Install k9s
+ hosts: all
+ roles:
+ - role: k9s
\ No newline at end of file
diff --git a/agw-deployer/ansible/deploy-kubernetes.yml b/agw-deployer/ansible/deploy-kubernetes.yml
new file mode 100644
index 0000000..dff4e47
--- /dev/null
+++ b/agw-deployer/ansible/deploy-kubernetes.yml
@@ -0,0 +1,7 @@
+---
+- name: Install Kubernetes
+ hosts: all
+ roles:
+ # - role: prerequisites
+ # - role: docker
+ - role: kubernetes
\ No newline at end of file
diff --git a/agw-deployer/ansible/deploy-orc8r.yml b/agw-deployer/ansible/deploy-orc8r.yml
new file mode 100644
index 0000000..6ab97b6
--- /dev/null
+++ b/agw-deployer/ansible/deploy-orc8r.yml
@@ -0,0 +1,15 @@
+---
+# Must run common-system first
+- name: Install Magma Orchestrator
+ hosts: all
+ roles:
+ - role: metallb
+ - role: openebs
+ - role: postgresql
+ - role: secrets
+ - role: orc8r
+ - role: prometheus_cache_cleanup
+ - role: haproxy
+ - role: elasticsearch
+ - role: fluentd
+ - role: dns
diff --git a/agw-deployer/ansible/deploy-testrole.yml b/agw-deployer/ansible/deploy-testrole.yml
new file mode 100644
index 0000000..18050fc
--- /dev/null
+++ b/agw-deployer/ansible/deploy-testrole.yml
@@ -0,0 +1,5 @@
+---
+- name: Install TestRole
+ hosts: all
+ roles:
+ - role: testrole
diff --git a/agw-deployer/ansible/docs/agw.md b/agw-deployer/ansible/docs/agw.md
new file mode 100644
index 0000000..872521e
--- /dev/null
+++ b/agw-deployer/ansible/docs/agw.md
@@ -0,0 +1,50 @@
+# Access Gateway
+
+Update **control_proxy.yml** file as per your domain:
+```bash
+sudo mkdir -p /var/opt/magma/configs/
+sudo vim /var/opt/magma/configs/control_proxy.yml
+```
+
+```yaml
+cloud_address: controller.magma.local
+cloud_port: 443
+bootstrap_address: bootstrapper-controller.magma.local
+bootstrap_port: 443
+fluentd_address: fluentd.magma.local
+fluentd_port: 443
+
+rootca_cert: /var/opt/magma/tmp/certs/rootCA.pem
+```
+> Note: if you are using Private IP then you will have to update `/etc/hosts` file as per your domain.
+
+Update **rootCA.pem** file from as per your Orchestrator:
+```bash
+sudo mkdir -p /var/opt/magma/tmp/certs/
+sudo vim /var/opt/magma/tmp/certs/rootCA.pem
+```
+
+Get Hardware ID and Challenge key from the Access Gateway:
+```bash
+show_gateway_info.py
+```
+
+Stop and restart magma services:
+```bash
+sudo systemctl stop magma@*
+sudo systemctl restart magma@magmad
+```
+
+Follow the `magmad` service logs for getting updates on Bootstrap and Checkin:
+```bash
+sudo journalctl -fu magma@magmad
+```
+
+### Cleanup
+
+Remove old gateway keys and network config files from the Access Gateway:
+```bash
+sudo rm /var/opt/magma/certs/gateway.crt
+sudo rm /var/opt/magma/certs/gateway.key
+sudo rm /var/opt/magma/configs/gateway.mconfig
+```
diff --git a/agw-deployer/ansible/docs/aws.md b/agw-deployer/ansible/docs/aws.md
new file mode 100644
index 0000000..b812ba5
--- /dev/null
+++ b/agw-deployer/ansible/docs/aws.md
@@ -0,0 +1,18 @@
+# AWS
+
+AMI: Ubuntu Server 20.04 LTS - 64-bit (x86) \
+Instance Type: **t3a.xlarge** - 4vCPU x 16GB (for better performance) \
+Instance Type: **t3a.large** - 2vCPU x 8GB (for cost saving) \
+Storage: 100 GB SSD (gp3)
+
+Allow following ports in Inbound rules in Security Groups:
+```
+22
+80
+443
+2379
+6443
+10250
+```
+
+https://calculator.aws/#/createCalculator/EC2
diff --git a/agw-deployer/ansible/docs/collection-setup.md b/agw-deployer/ansible/docs/collection-setup.md
new file mode 100644
index 0000000..4ea869d
--- /dev/null
+++ b/agw-deployer/ansible/docs/collection-setup.md
@@ -0,0 +1,17 @@
+# Collection Setup
+
+Initiating a new collection:
+```bash
+ansible-galaxy collection init jitcloudlet.jitcloudlet
+```
+
+Initiating a new role:
+```bash
+ansible-galaxy role init docker
+```
+
+Tag and push for triggering the build:
+```bash
+git tag 0.1.3
+git push --tags
+```
diff --git a/agw-deployer/ansible/docs/debug.md b/agw-deployer/ansible/docs/debug.md
new file mode 100644
index 0000000..9108323
--- /dev/null
+++ b/agw-deployer/ansible/docs/debug.md
@@ -0,0 +1,24 @@
+# Debug
+
+Deploy kibana dashboard:
+```bash
+helm upgrade -i kibana elastic/kibana \
+ --set service.type=LoadBalancer
+```
+> Note: you will need another IP for this.
+
+http://192.168.5.58:5601
+
+Request for getting event and log counts:
+```bash
+curl http://elasticsearch-master:9200//_count; echo
+curl http://elasticsearch-master:9200/eventd%2A/_count; echo
+curl http://elasticsearch-master:9200/magma%2A/_count; echo
+```
+
+### Storage cleanup
+
+Keep deleting prometheus-cache pod if you have limited storage:
+```bash
+kubectl delete pods -l app.kubernetes.io/component=prometheus-cache
+```
diff --git a/agw-deployer/ansible/docs/manual-install.md b/agw-deployer/ansible/docs/manual-install.md
new file mode 100644
index 0000000..660b121
--- /dev/null
+++ b/agw-deployer/ansible/docs/manual-install.md
@@ -0,0 +1,47 @@
+# Manual Install
+
+Install dependant collections:
+```bash
+ansible-galaxy collection install shubhamtatvamasi.magma
+```
+
+Copy your public SSH key to the host:
+```bash
+ssh-keygen -R 192.168.5.70
+ssh-copy-id ubuntu@192.168.5.70
+```
+
+**Update your values in `hosts.yml` file before running the playbook.**
+
+Deploy Magma orchestrator:
+```bash
+ansible-playbook deploy-orc8r.yml
+```
+> Note: After deployment is done it takes around 10 minutes to start all the magma services.
+
+Create new user:
+```bash
+ORC_POD=$(kubectl -n orc8r get pod -l app.kubernetes.io/component=orchestrator -o jsonpath='{.items[0].metadata.name}')
+kubectl -n orc8r exec -it ${ORC_POD} -- envdir /var/opt/magma/envdir /var/opt/magma/bin/accessc \
+ add-existing -admin -cert /var/opt/magma/certs/admin_operator.pem admin_operator
+
+NMS_POD=$(kubectl -n orc8r get pod -l app.kubernetes.io/component=magmalte -o jsonpath='{.items[0].metadata.name}')
+kubectl -n orc8r exec -it ${NMS_POD} -- yarn setAdminPassword magma-test admin admin
+kubectl -n orc8r exec -it ${NMS_POD} -- yarn setAdminPassword master admin admin
+```
+
+### Ansible Setup
+
+Install Ansible - Ubuntu 20.04 LTS:
+```bash
+sudo apt remove ansible
+sudo apt update
+sudo apt install software-properties-common
+sudo add-apt-repository --yes --update ppa:ansible/ansible
+sudo apt install ansible -y
+```
+
+Install Ansible - macOS:
+```bash
+brew install ansible
+```
diff --git a/agw-deployer/ansible/docs/multipass.md b/agw-deployer/ansible/docs/multipass.md
new file mode 100644
index 0000000..0b82307
--- /dev/null
+++ b/agw-deployer/ansible/docs/multipass.md
@@ -0,0 +1,37 @@
+# Multipass Setup
+
+Start multipass if it's not running:
+```bash
+sudo snap restart multipass.multipassd
+```
+
+Start a new multipass instance with the following command:
+```bash
+multipass launch jammy \
+ --name orc8r \
+ --disk 100G \
+ --memory 8G \
+ --cpus 4
+```
+
+Check if instance has started:
+```bash
+multipass ls
+```
+
+Get access to the shell:
+```bash
+multipass shell orc8r
+```
+
+Add your public SSH key to the instance:
+```bash
+vim .ssh/authorized_keys
+```
+
+### Uninstall
+
+Delete Instance
+```bash
+multipass delete --purge orc8r
+```
diff --git a/agw-deployer/ansible/galaxy.yml b/agw-deployer/ansible/galaxy.yml
new file mode 100644
index 0000000..ced4fe2
--- /dev/null
+++ b/agw-deployer/ansible/galaxy.yml
@@ -0,0 +1,57 @@
+---
+### REQUIRED
+# The namespace of the collection. This can be a company/brand/organization or product namespace under which all
+# content lives. May only contain alphanumeric lowercase characters and underscores. Namespaces cannot start with
+# underscores or numbers and cannot contain consecutive underscores
+namespace: jitcloudlet
+# The name of the collection. Has the same character restrictions as 'namespace'
+name: jitcloudlet
+# The version of the collection. Must be compatible with semantic versioning
+version: 0.0.1
+# The path to the Markdown (.md) readme file. This path is relative to the root of the collection
+readme: README.md
+# A list of the collection's content authors. Can be just the name or in the format 'Full Name (url)
+# @nicks:irc/im.site#channel'
+authors:
+ - Jim Blakley
+### OPTIONAL but strongly recommended
+# A short summary description of the collection
+description: Collection for deploying the Just-In-Time Cloudlet
+# Either a single license or a list of licenses for content inside of a collection. Ansible Galaxy currently only
+# accepts L(SPDX,https://spdx.org/licenses/) licenses. This key is mutually exclusive with 'license_file'
+license:
+ - GPL-2.0-or-later
+# TODO Apache 2?
+# The path to the license file for the collection. This path is relative to the root of the collection. This key is
+# mutually exclusive with 'license'
+license_file: ''
+# A list of tags you want to associate with the collection for indexing/searching. A tag name has the same character
+# requirements as 'namespace' and 'name'
+tags:
+ - jit-cloudlet
+ - magma
+ - orchestrator
+# Collections that this collection requires to be installed for it to be usable. The key of the dict is the
+# collection label 'namespace.name'. The value is a version range
+# L(specifiers,https://python-semanticversion.readthedocs.io/en/latest/#requirement-specification). Multiple version
+# range specifiers can be set and are separated by ','
+dependencies:
+ community.crypto: ">=2.2.4"
+ community.docker: ">=2.3.0"
+ kubernetes.core: ">=2.3.0"
+# The URL of the originating SCM repository
+repository: https://github.com/jblakley/jitc-galaxy
+# The URL to any online docs
+# documentation: http://docs.example.com
+
+# The URL to the homepage of the collection/project
+# homepage: http://example.com
+
+# The URL to the collection issue tracker
+# issues: http://example.com/issue/tracker
+
+# A list of file glob-like patterns used to filter any files or directories that should not be included in the build
+# artifact. A pattern is matched from the relative path of the file or directory of the collection directory. This
+# uses 'fnmatch' to match the files or directories. Some directories and files like 'galaxy.yml', '*.pyc', '*.retry',
+# and '.git' are always filtered
+build_ignore: []
diff --git a/agw-deployer/ansible/meta/runtime.yml b/agw-deployer/ansible/meta/runtime.yml
new file mode 100644
index 0000000..cc14de6
--- /dev/null
+++ b/agw-deployer/ansible/meta/runtime.yml
@@ -0,0 +1,2 @@
+---
+requires_ansible: ">=2"
diff --git a/agw-deployer/ansible/removal_playbooks/remove-docker.yml b/agw-deployer/ansible/removal_playbooks/remove-docker.yml
new file mode 100644
index 0000000..949003d
--- /dev/null
+++ b/agw-deployer/ansible/removal_playbooks/remove-docker.yml
@@ -0,0 +1,5 @@
+---
+- name: Remove Docker (but not daemon.json or stored images)
+ hosts: all
+ roles:
+ - role: docker-remove
diff --git a/agw-deployer/ansible/removal_playbooks/remove-kubernetes.yml b/agw-deployer/ansible/removal_playbooks/remove-kubernetes.yml
new file mode 100644
index 0000000..ef99a19
--- /dev/null
+++ b/agw-deployer/ansible/removal_playbooks/remove-kubernetes.yml
@@ -0,0 +1,5 @@
+---
+- name: Remove Rancher Kubernetes Engine
+ hosts: all
+ roles:
+ - role: kubernetes-remove
diff --git a/agw-deployer/ansible/roles/agwc-compose-part1/README.md b/agw-deployer/ansible/roles/agwc-compose-part1/README.md
new file mode 100644
index 0000000..9875cb5
--- /dev/null
+++ b/agw-deployer/ansible/roles/agwc-compose-part1/README.md
@@ -0,0 +1,2 @@
+Rancher Kubernetes Engine
+=========
diff --git a/agw-deployer/ansible/roles/agwc-compose-part1/defaults/main.yml b/agw-deployer/ansible/roles/agwc-compose-part1/defaults/main.yml
new file mode 100644
index 0000000..ddb75d8
--- /dev/null
+++ b/agw-deployer/ansible/roles/agwc-compose-part1/defaults/main.yml
@@ -0,0 +1,3 @@
+---
+agwc_state: present
+
diff --git a/agw-deployer/ansible/roles/agwc-compose-part1/meta/main.yml b/agw-deployer/ansible/roles/agwc-compose-part1/meta/main.yml
new file mode 100644
index 0000000..04a0d8b
--- /dev/null
+++ b/agw-deployer/ansible/roles/agwc-compose-part1/meta/main.yml
@@ -0,0 +1,47 @@
+---
+galaxy_info:
+ author: Shubham Tatvamasi
+ description: Rancher Kubernetes Engine
+ # If the issue tracker for your role is not on github, uncomment the
+ # next line and provide a value
+ # issue_tracker_url: http://example.com/issue/tracker
+
+ # Choose a valid license ID from https://spdx.org - some suggested licenses:
+ # - BSD-3-Clause (default)
+ # - MIT
+ # - GPL-2.0-or-later
+ # - GPL-3.0-only
+ # - Apache-2.0
+ # - CC-BY-4.0
+ license: license (GPL-2.0-or-later, MIT, etc)
+ min_ansible_version: 2.1
+ # If this a Container Enabled role, provide the minimum Ansible Container version.
+ # min_ansible_container_version:
+
+ #
+ # Provide a list of supported platforms, and for each platform a list of versions.
+ # If you don't wish to enumerate all versions for a particular platform, use 'all'.
+ # To view available platforms and versions (or releases), visit:
+ # https://galaxy.ansible.com/api/v1/platforms/
+ #
+ # platforms:
+ # - name: Fedora
+ # versions:
+ # - all
+ # - 25
+ # - name: SomePlatform
+ # versions:
+ # - all
+ # - 1.0
+ # - 7
+ # - 99.99
+ galaxy_tags: []
+ # List tags for your role here, one per line. A tag is a keyword that describes
+ # and categorizes the role. Users find roles by searching for tags. Be sure to
+ # remove the '[]' above, if you add tags to this list.
+ #
+ # NOTE: A tag is limited to a single word comprised of alphanumeric characters.
+ # Maximum 20 tags per role.
+dependencies: []
+# List your role dependencies here, one per line. Be sure to remove the '[]' above,
+# if you add dependencies to this list.
diff --git a/agw-deployer/ansible/roles/agwc-compose-part1/tasks/deploy-agwc-compose-part1.yml b/agw-deployer/ansible/roles/agwc-compose-part1/tasks/deploy-agwc-compose-part1.yml
new file mode 100644
index 0000000..e4199bc
--- /dev/null
+++ b/agw-deployer/ansible/roles/agwc-compose-part1/tasks/deploy-agwc-compose-part1.yml
@@ -0,0 +1,16 @@
+---
+- name: Message
+ debug:
+ msg: "Monitor the execution of this task in {{ logs_local }}/agwc_compose.log"
+
+
+
+- name: Install docker compose version of AGW (agw_install_docker.sh)
+ become: yes
+ shell:
+ bash "{{ bin_local }}/agw_install_docker.sh" > "{{ logs_local }}/agwc_compose.log" 2>&1
+
+ # Up to kernel reboot
+- pause:
+ prompt: Reboot your system now and return to run the second playbook of the AGW install
+ echo: yes
\ No newline at end of file
diff --git a/agw-deployer/ansible/roles/agwc-compose-part1/tasks/main.yml b/agw-deployer/ansible/roles/agwc-compose-part1/tasks/main.yml
new file mode 100644
index 0000000..5899d15
--- /dev/null
+++ b/agw-deployer/ansible/roles/agwc-compose-part1/tasks/main.yml
@@ -0,0 +1,11 @@
+---
+- name: Starting
+ ansible.builtin.debug:
+ msg: "Task may take time to complete; You can follow the log at {{ logs_local }}/agwc_compose.log"
+
+- import_tasks: set-agwc-parameters.yml
+- import_tasks: deploy-agwc-compose-part1.yml
+
+- name: Finished
+ ansible.builtin.debug:
+ msg: "Completed Part 1 of AGW docker compose deployment; time to reboot"
\ No newline at end of file
diff --git a/agw-deployer/ansible/roles/agwc-compose-part1/tasks/set-agwc-parameters.yml b/agw-deployer/ansible/roles/agwc-compose-part1/tasks/set-agwc-parameters.yml
new file mode 100644
index 0000000..e4b703c
--- /dev/null
+++ b/agw-deployer/ansible/roles/agwc-compose-part1/tasks/set-agwc-parameters.yml
@@ -0,0 +1,92 @@
+---
+- name: Create a directory for certs
+ become: yes
+ ansible.builtin.file:
+ path: /var/opt/magma/certs
+ state: directory
+ mode: '0755'
+
+- name: Create a directory for configs
+ become: yes
+ ansible.builtin.file:
+ path: /var/opt/magma/configs
+ state: directory
+ mode: '0755'
+
+- name: Copy rootCA.pem
+ become: yes
+ ansible.builtin.copy:
+ src: "{{ secrets_local}}/rootCA.pem"
+ dest: /var/opt/magma/certs
+ mode: '0644'
+
+- name: Create a directory for tmp
+ ansible.builtin.file:
+ path: "{{ tmp_local }}"
+ state: directory
+ mode: '0755'
+
+- name: Configure control_proxy
+ become: yes
+ template:
+ src: "{{files_local}}/control_proxy.yml.j2"
+ dest: "{{ tmp_local }}/control_proxy.yml"
+ mode: '0644'
+
+- name: Copy control_proxy
+ become: yes
+ ansible.builtin.copy:
+ src: "{{ tmp_local }}/control_proxy.yml"
+ dest: /var/opt/magma/configs
+ mode: '0644'
+
+- name: Copy 20auto-upgrades
+ become: yes
+ ansible.builtin.copy:
+ src: "{{ files_local }}/20auto-upgrades"
+ dest: /etc/apt/apt.conf.d
+ mode: '0644'
+
+- name: Create orc8r /etc/hosts addiiton
+ become: yes
+ template:
+ src: "{{files_local}}/etchosts.j2"
+ dest: "{{ tmp_local }}/etchosts"
+
+- name: Add orc8r to AGW /etc/hosts
+ become: yes
+ blockinfile:
+ path: /etc/hosts
+ block: "{{ lookup('file', '{{ tmp_local }}/etchosts') }}"
+
+
+- name: Create a directory for logs
+ ansible.builtin.file:
+ path: "{{ logs_local }}"
+ state: directory
+ mode: '0755'
+
+- name: Set alternate magma_version name
+ when: magma_version == "1.8.0"
+ set_fact:
+ altmagma_version: "v1.8"
+
+- name: Make debconf not interactive
+ become: yes
+ shell:
+ bash "debconf debconf/frontend select Noninteractive" | "debconf-set-selections"
+
+# setup resolv.conf
+- name: Create a symbolic link (/var/run/systemd/resolve/resolv.conf /etc/resolv.conf)
+ become: yes
+ ansible.builtin.file:
+ src: /var/run/systemd/resolve/resolv.conf
+ dest: /etc/resolv.conf
+ state: link
+
+- name: set nameservers to {{ nameserver_ip | replace(',',' ')}} in /etc/resolv.conf
+ become: yes
+ lineinfile:
+ path: /etc/resolv.conf
+ regexp: '#DNS='
+ line: "DNS={{ nameserver_ip | replace(',',' ')}}"
diff --git a/agw-deployer/ansible/roles/agwc-compose-part2/README.md b/agw-deployer/ansible/roles/agwc-compose-part2/README.md
new file mode 100644
index 0000000..9875cb5
--- /dev/null
+++ b/agw-deployer/ansible/roles/agwc-compose-part2/README.md
@@ -0,0 +1,2 @@
+Rancher Kubernetes Engine
+=========
diff --git a/agw-deployer/ansible/roles/agwc-compose-part2/defaults/main.yml b/agw-deployer/ansible/roles/agwc-compose-part2/defaults/main.yml
new file mode 100644
index 0000000..ddb75d8
--- /dev/null
+++ b/agw-deployer/ansible/roles/agwc-compose-part2/defaults/main.yml
@@ -0,0 +1,3 @@
+---
+agwc_state: present
+
diff --git a/agw-deployer/ansible/roles/agwc-compose-part2/meta/main.yml b/agw-deployer/ansible/roles/agwc-compose-part2/meta/main.yml
new file mode 100644
index 0000000..04a0d8b
--- /dev/null
+++ b/agw-deployer/ansible/roles/agwc-compose-part2/meta/main.yml
@@ -0,0 +1,47 @@
+---
+galaxy_info:
+ author: Shubham Tatvamasi
+ description: Rancher Kubernetes Engine
+ # If the issue tracker for your role is not on github, uncomment the
+ # next line and provide a value
+ # issue_tracker_url: http://example.com/issue/tracker
+
+ # Choose a valid license ID from https://spdx.org - some suggested licenses:
+ # - BSD-3-Clause (default)
+ # - MIT
+ # - GPL-2.0-or-later
+ # - GPL-3.0-only
+ # - Apache-2.0
+ # - CC-BY-4.0
+ license: license (GPL-2.0-or-later, MIT, etc)
+ min_ansible_version: 2.1
+ # If this a Container Enabled role, provide the minimum Ansible Container version.
+ # min_ansible_container_version:
+
+ #
+ # Provide a list of supported platforms, and for each platform a list of versions.
+ # If you don't wish to enumerate all versions for a particular platform, use 'all'.
+ # To view available platforms and versions (or releases), visit:
+ # https://galaxy.ansible.com/api/v1/platforms/
+ #
+ # platforms:
+ # - name: Fedora
+ # versions:
+ # - all
+ # - 25
+ # - name: SomePlatform
+ # versions:
+ # - all
+ # - 1.0
+ # - 7
+ # - 99.99
+ galaxy_tags: []
+ # List tags for your role here, one per line. A tag is a keyword that describes
+ # and categorizes the role. Users find roles by searching for tags. Be sure to
+ # remove the '[]' above, if you add tags to this list.
+ #
+ # NOTE: A tag is limited to a single word comprised of alphanumeric characters.
+ # Maximum 20 tags per role.
+dependencies: []
+# List your role dependencies here, one per line. Be sure to remove the '[]' above,
+# if you add dependencies to this list.
diff --git a/agw-deployer/ansible/roles/agwc-compose-part2/tasks/deploy-agwc-compose-part2.yml b/agw-deployer/ansible/roles/agwc-compose-part2/tasks/deploy-agwc-compose-part2.yml
new file mode 100644
index 0000000..87bb473
--- /dev/null
+++ b/agw-deployer/ansible/roles/agwc-compose-part2/tasks/deploy-agwc-compose-part2.yml
@@ -0,0 +1,50 @@
+---
+- name: Install control_proxy.yaml
+ become: yes
+ ansible.builtin.copy:
+ src: "{{ tmp_local }}/control_proxy.yml"
+ dest: /var/opt/magma/configs/control_proxy.yml
+ mode: '0644'
+
+- name: Start AGW (docker compose)
+ become: yes
+ args:
+ chdir: /var/opt/magma/docker/
+ command:
+ docker-compose --compatibility up -d --force-recreate
+ register: result
+- debug:
+ var: result.stderr_lines
+
+
+- name: Get gateway information
+ become: yes
+ command:
+ docker exec magmad show_gateway_info.py
+ register: result
+- debug:
+ var: result.stdout_lines
+
+- pause:
+ prompt: Register the AGW in the Orc8r and then hit return to proceed
+ echo: yes
+
+- name: Restart AGW (docker compose)
+ become: yes
+ args:
+ chdir: /var/opt/magma/docker/
+ command:
+ docker-compose --compatibility up -d --force-recreate
+ register: result
+- debug:
+ var: result
+
+#- name: Shutdown AGW (docker compose)
+# become: yes
+# args:
+# chdir: /var/opt/magma/docker/
+# command:
+# docker-compose --compatibility down
+# register: result
+#- debug:
+# var: result
diff --git a/agw-deployer/ansible/roles/agwc-compose-part2/tasks/main.yml b/agw-deployer/ansible/roles/agwc-compose-part2/tasks/main.yml
new file mode 100644
index 0000000..d917849
--- /dev/null
+++ b/agw-deployer/ansible/roles/agwc-compose-part2/tasks/main.yml
@@ -0,0 +1,10 @@
+---
+- name: Starting
+ ansible.builtin.debug:
+ msg: "Finishes the bringup (post reboot) of the docker compose version"
+
+- import_tasks: deploy-agwc-compose-part2.yml
+
+- name: Finished
+ ansible.builtin.debug:
+ msg: "Docker compose AGW now working"
\ No newline at end of file
diff --git a/agw-deployer/ansible/roles/agwc-config-networking/README.md b/agw-deployer/ansible/roles/agwc-config-networking/README.md
new file mode 100644
index 0000000..9875cb5
--- /dev/null
+++ b/agw-deployer/ansible/roles/agwc-config-networking/README.md
@@ -0,0 +1,2 @@
+Rancher Kubernetes Engine
+=========
diff --git a/agw-deployer/ansible/roles/agwc-config-networking/defaults/main.yml b/agw-deployer/ansible/roles/agwc-config-networking/defaults/main.yml
new file mode 100644
index 0000000..ddb75d8
--- /dev/null
+++ b/agw-deployer/ansible/roles/agwc-config-networking/defaults/main.yml
@@ -0,0 +1,3 @@
+---
+agwc_state: present
+
diff --git a/agw-deployer/ansible/roles/agwc-config-networking/meta/main.yml b/agw-deployer/ansible/roles/agwc-config-networking/meta/main.yml
new file mode 100644
index 0000000..04a0d8b
--- /dev/null
+++ b/agw-deployer/ansible/roles/agwc-config-networking/meta/main.yml
@@ -0,0 +1,47 @@
+---
+galaxy_info:
+ author: Shubham Tatvamasi
+ description: Rancher Kubernetes Engine
+ # If the issue tracker for your role is not on github, uncomment the
+ # next line and provide a value
+ # issue_tracker_url: http://example.com/issue/tracker
+
+ # Choose a valid license ID from https://spdx.org - some suggested licenses:
+ # - BSD-3-Clause (default)
+ # - MIT
+ # - GPL-2.0-or-later
+ # - GPL-3.0-only
+ # - Apache-2.0
+ # - CC-BY-4.0
+ license: license (GPL-2.0-or-later, MIT, etc)
+ min_ansible_version: 2.1
+ # If this a Container Enabled role, provide the minimum Ansible Container version.
+ # min_ansible_container_version:
+
+ #
+ # Provide a list of supported platforms, and for each platform a list of versions.
+ # If you don't wish to enumerate all versions for a particular platform, use 'all'.
+ # To view available platforms and versions (or releases), visit:
+ # https://galaxy.ansible.com/api/v1/platforms/
+ #
+ # platforms:
+ # - name: Fedora
+ # versions:
+ # - all
+ # - 25
+ # - name: SomePlatform
+ # versions:
+ # - all
+ # - 1.0
+ # - 7
+ # - 99.99
+ galaxy_tags: []
+ # List tags for your role here, one per line. A tag is a keyword that describes
+ # and categorizes the role. Users find roles by searching for tags. Be sure to
+ # remove the '[]' above, if you add tags to this list.
+ #
+ # NOTE: A tag is limited to a single word comprised of alphanumeric characters.
+ # Maximum 20 tags per role.
+dependencies: []
+# List your role dependencies here, one per line. Be sure to remove the '[]' above,
+# if you add dependencies to this list.
diff --git a/agw-deployer/ansible/roles/agwc-config-networking/tasks/main.yml b/agw-deployer/ansible/roles/agwc-config-networking/tasks/main.yml
new file mode 100644
index 0000000..cae764c
--- /dev/null
+++ b/agw-deployer/ansible/roles/agwc-config-networking/tasks/main.yml
@@ -0,0 +1,29 @@
+---
+- name: Starting AGWC Network Tasks
+ ansible.builtin.debug:
+ msg: "Starting AGWC Network Tasks"
+
+- name: Configure eth0 netplan
+ become: yes
+ template:
+ src: "{{files_local}}/75-eth0-itf.yaml.j2"
+ dest: "/etc/netplan/75-eth0-itf.yaml"
+
+- name: Configure eth1 netplan
+ become: yes
+ template:
+ src: "{{files_local}}/80-eth1-itf.yaml.j2"
+ dest: "/etc/netplan/80-eth1-itf.yaml"
+
+- name: Run netplan to configure network (could cause connectivity issues)
+ become: yes
+ command: netplan apply
+
+- name: Enable masquerading on eth0
+ become: yes
+ command: iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
+
+
+- name: Finished
+ ansible.builtin.debug:
+ msg: "AGWC Networking Setup Complete"
\ No newline at end of file
diff --git a/agw-deployer/ansible/roles/docker-remove/README.md b/agw-deployer/ansible/roles/docker-remove/README.md
new file mode 100644
index 0000000..a572a9e
--- /dev/null
+++ b/agw-deployer/ansible/roles/docker-remove/README.md
@@ -0,0 +1,2 @@
+Docker
+=========
diff --git a/roles/docker/defaults/main.yml b/agw-deployer/ansible/roles/docker-remove/defaults/main.yml
similarity index 100%
rename from roles/docker/defaults/main.yml
rename to agw-deployer/ansible/roles/docker-remove/defaults/main.yml
diff --git a/agw-deployer/ansible/roles/docker-remove/meta/main.yml b/agw-deployer/ansible/roles/docker-remove/meta/main.yml
new file mode 100644
index 0000000..34cf580
--- /dev/null
+++ b/agw-deployer/ansible/roles/docker-remove/meta/main.yml
@@ -0,0 +1,47 @@
+---
+galaxy_info:
+ author: Shubham Tatvamasi
+ description: Docker
+ # If the issue tracker for your role is not on github, uncomment the
+ # next line and provide a value
+ # issue_tracker_url: http://example.com/issue/tracker
+
+ # Choose a valid license ID from https://spdx.org - some suggested licenses:
+ # - BSD-3-Clause (default)
+ # - MIT
+ # - GPL-2.0-or-later
+ # - GPL-3.0-only
+ # - Apache-2.0
+ # - CC-BY-4.0
+ license: license (GPL-2.0-or-later, MIT, etc)
+ min_ansible_version: 2.1
+ # If this a Container Enabled role, provide the minimum Ansible Container version.
+ # min_ansible_container_version:
+
+ #
+ # Provide a list of supported platforms, and for each platform a list of versions.
+ # If you don't wish to enumerate all versions for a particular platform, use 'all'.
+ # To view available platforms and versions (or releases), visit:
+ # https://galaxy.ansible.com/api/v1/platforms/
+ #
+ # platforms:
+ # - name: Fedora
+ # versions:
+ # - all
+ # - 25
+ # - name: SomePlatform
+ # versions:
+ # - all
+ # - 1.0
+ # - 7
+ # - 99.99
+ galaxy_tags: []
+ # List tags for your role here, one per line. A tag is a keyword that describes
+ # and categorizes the role. Users find roles by searching for tags. Be sure to
+ # remove the '[]' above, if you add tags to this list.
+ #
+ # NOTE: A tag is limited to a single word comprised of alphanumeric characters.
+ # Maximum 20 tags per role.
+dependencies: []
+# List your role dependencies here, one per line. Be sure to remove the '[]' above,
+# if you add dependencies to this list.
diff --git a/agw-deployer/ansible/roles/docker-remove/tasks/main.yml b/agw-deployer/ansible/roles/docker-remove/tasks/main.yml
new file mode 100644
index 0000000..3a960cb
--- /dev/null
+++ b/agw-deployer/ansible/roles/docker-remove/tasks/main.yml
@@ -0,0 +1,17 @@
+---
+# Leave repository and daemon.json in place
+- name: Remove docker.io and containerd
+ become: yes
+ apt:
+ name:
+ - docker.io=20.10.21-0ubuntu1~20.04.2
+ - containerd
+ state: absent
+
+# - name: Install Docker Module for Python
+ # pip:
+ # name: docker
+ # shell:
+ # curl https://releases.rancher.com/install-docker/{{ docker_version }}.sh | sh
+
+
diff --git a/agw-deployer/ansible/roles/docker/README.md b/agw-deployer/ansible/roles/docker/README.md
new file mode 100644
index 0000000..a572a9e
--- /dev/null
+++ b/agw-deployer/ansible/roles/docker/README.md
@@ -0,0 +1,2 @@
+Docker
+=========
diff --git a/agw-deployer/ansible/roles/docker/defaults/main.yml b/agw-deployer/ansible/roles/docker/defaults/main.yml
new file mode 100644
index 0000000..476d017
--- /dev/null
+++ b/agw-deployer/ansible/roles/docker/defaults/main.yml
@@ -0,0 +1,2 @@
+---
+docker_version: "20.10"
diff --git a/agw-deployer/ansible/roles/docker/meta/main.yml b/agw-deployer/ansible/roles/docker/meta/main.yml
new file mode 100644
index 0000000..34cf580
--- /dev/null
+++ b/agw-deployer/ansible/roles/docker/meta/main.yml
@@ -0,0 +1,47 @@
+---
+galaxy_info:
+ author: Shubham Tatvamasi
+ description: Docker
+ # If the issue tracker for your role is not on github, uncomment the
+ # next line and provide a value
+ # issue_tracker_url: http://example.com/issue/tracker
+
+ # Choose a valid license ID from https://spdx.org - some suggested licenses:
+ # - BSD-3-Clause (default)
+ # - MIT
+ # - GPL-2.0-or-later
+ # - GPL-3.0-only
+ # - Apache-2.0
+ # - CC-BY-4.0
+ license: license (GPL-2.0-or-later, MIT, etc)
+ min_ansible_version: 2.1
+ # If this a Container Enabled role, provide the minimum Ansible Container version.
+ # min_ansible_container_version:
+
+ #
+ # Provide a list of supported platforms, and for each platform a list of versions.
+ # If you don't wish to enumerate all versions for a particular platform, use 'all'.
+ # To view available platforms and versions (or releases), visit:
+ # https://galaxy.ansible.com/api/v1/platforms/
+ #
+ # platforms:
+ # - name: Fedora
+ # versions:
+ # - all
+ # - 25
+ # - name: SomePlatform
+ # versions:
+ # - all
+ # - 1.0
+ # - 7
+ # - 99.99
+ galaxy_tags: []
+ # List tags for your role here, one per line. A tag is a keyword that describes
+ # and categorizes the role. Users find roles by searching for tags. Be sure to
+ # remove the '[]' above, if you add tags to this list.
+ #
+ # NOTE: A tag is limited to a single word comprised of alphanumeric characters.
+ # Maximum 20 tags per role.
+dependencies: []
+# List your role dependencies here, one per line. Be sure to remove the '[]' above,
+# if you add dependencies to this list.
diff --git a/agw-deployer/ansible/roles/docker/tasks/main.yml b/agw-deployer/ansible/roles/docker/tasks/main.yml
new file mode 100644
index 0000000..4fdddcb
--- /dev/null
+++ b/agw-deployer/ansible/roles/docker/tasks/main.yml
@@ -0,0 +1,102 @@
+---
+- name: Unhold current docker.io
+ become: yes
+ ansible.builtin.dpkg_selections:
+ name: docker.io
+ selection: install
+
+- name: Remove any existing docker.io and containerd
+ become: yes
+ apt:
+ name:
+ - docker.io
+ - containerd
+ state: absent
+
+- name: Add Docker GPG apt Key
+ become: yes
+ apt_key:
+ url: https://download.docker.com/linux/ubuntu/gpg
+ state: present
+
+- name: Add Docker Repository
+ become: yes
+ apt_repository:
+ repo: deb https://download.docker.com/linux/ubuntu focal stable
+ state: present
+
+- name: Install python docker packages
+ become: yes
+ pip:
+ name:
+ - "docker==6.1.3"
+ - "docker-compose"
+
+
+
+- name: Update apt and install docker.io (version {{ docker_image_version }}) and containerd
+ become: yes
+ apt:
+ name:
+ - docker.io='{{ docker_image_version }}'
+ - containerd
+ update_cache: true
+
+- name: Hold docker.io at '{{ docker_image_version }}'
+ become: yes
+ ansible.builtin.dpkg_selections:
+ name: docker.io
+ selection: hold
+
+# - name: Install Docker Module for Python
+ # pip:
+ # name: docker
+ # shell:
+ # curl https://releases.rancher.com/install-docker/{{ docker_version }}.sh | sh
+
+- name: Add user to docker group
+ become: yes
+ user:
+ name: "{{ ansible_user }}"
+ groups: docker
+ append: yes
+
+- name: Install docker daemon.json
+ become: yes
+ copy:
+ src: "{{ files_local }}/daemon.json.template"
+ dest: "/etc/docker/daemon.json"
+
+- name: Do daemon reload
+ become: yes
+ command: "systemctl daemon-reload"
+
+- name: Restart docker
+ become: yes
+ command: "systemctl restart docker"
+
+#- name: Pull alpine docker image
+# become: yes
+# docker_image:
+# name: alpine
+# source: pull
+
+- name: Remove existing docker-compose versions
+ become: yes
+ file:
+ state: absent
+ path:
+ - /usr/bin/docker-compose
+ - /usr/local/bin/docker-compose
+
+- name: Install docker-compose version {{ docker_compose_version }}
+ become: yes
+ get_url:
+ url: "https://github.com/docker/compose/releases/download/{{ docker_compose_version }}/docker-compose-linux-{{ arch }}"
+ dest: /usr/local/bin/docker-compose
+ mode: 'u+x,g+x'
+
+
+
+
+
diff --git a/agw-deployer/ansible/roles/k9s/README.md b/agw-deployer/ansible/roles/k9s/README.md
new file mode 100644
index 0000000..9875cb5
--- /dev/null
+++ b/agw-deployer/ansible/roles/k9s/README.md
@@ -0,0 +1,2 @@
+Rancher Kubernetes Engine
+=========
diff --git a/agw-deployer/ansible/roles/k9s/defaults/main.yml b/agw-deployer/ansible/roles/k9s/defaults/main.yml
new file mode 100644
index 0000000..3193339
--- /dev/null
+++ b/agw-deployer/ansible/roles/k9s/defaults/main.yml
@@ -0,0 +1,3 @@
+---
+magma_directory: "magma-galaxy"
+k9s_version: "v0.31.7"
diff --git a/agw-deployer/ansible/roles/k9s/meta/main.yml b/agw-deployer/ansible/roles/k9s/meta/main.yml
new file mode 100644
index 0000000..04a0d8b
--- /dev/null
+++ b/agw-deployer/ansible/roles/k9s/meta/main.yml
@@ -0,0 +1,47 @@
+---
+galaxy_info:
+ author: Shubham Tatvamasi
+ description: Rancher Kubernetes Engine
+ # If the issue tracker for your role is not on github, uncomment the
+ # next line and provide a value
+ # issue_tracker_url: http://example.com/issue/tracker
+
+ # Choose a valid license ID from https://spdx.org - some suggested licenses:
+ # - BSD-3-Clause (default)
+ # - MIT
+ # - GPL-2.0-or-later
+ # - GPL-3.0-only
+ # - Apache-2.0
+ # - CC-BY-4.0
+ license: license (GPL-2.0-or-later, MIT, etc)
+ min_ansible_version: 2.1
+ # If this a Container Enabled role, provide the minimum Ansible Container version.
+ # min_ansible_container_version:
+
+ #
+ # Provide a list of supported platforms, and for each platform a list of versions.
+ # If you don't wish to enumerate all versions for a particular platform, use 'all'.
+ # To view available platforms and versions (or releases), visit:
+ # https://galaxy.ansible.com/api/v1/platforms/
+ #
+ # platforms:
+ # - name: Fedora
+ # versions:
+ # - all
+ # - 25
+ # - name: SomePlatform
+ # versions:
+ # - all
+ # - 1.0
+ # - 7
+ # - 99.99
+ galaxy_tags: []
+ # List tags for your role here, one per line. A tag is a keyword that describes
+ # and categorizes the role. Users find roles by searching for tags. Be sure to
+ # remove the '[]' above, if you add tags to this list.
+ #
+ # NOTE: A tag is limited to a single word comprised of alphanumeric characters.
+ # Maximum 20 tags per role.
+dependencies: []
+# List your role dependencies here, one per line. Be sure to remove the '[]' above,
+# if you add dependencies to this list.
diff --git a/agw-deployer/ansible/roles/k9s/tasks/install-k9s.yml b/agw-deployer/ansible/roles/k9s/tasks/install-k9s.yml
new file mode 100644
index 0000000..6b87cef
--- /dev/null
+++ b/agw-deployer/ansible/roles/k9s/tasks/install-k9s.yml
@@ -0,0 +1,8 @@
+---
+- name: Download, unzip and install k9s
+ become: yes
+ unarchive:
+ src: https://github.com/derailed/k9s/releases/download/{{ k9s_version }}/k9s_Linux_{{ altarch }}.tar.gz
+ dest: /usr/local/bin
+ copy: no
+
diff --git a/agw-deployer/ansible/roles/k9s/tasks/main.yml b/agw-deployer/ansible/roles/k9s/tasks/main.yml
new file mode 100644
index 0000000..b089a11
--- /dev/null
+++ b/agw-deployer/ansible/roles/k9s/tasks/main.yml
@@ -0,0 +1,21 @@
+---
+- name: Set darwin as Operating System
+ when: ansible_distribution == "MacOSX"
+ set_fact:
+ operating_system: "darwin"
+
+- name: Set linux as Operating System
+ when: ansible_distribution != "MacOSX"
+ set_fact:
+ operating_system: "linux"
+
+- name: Set alternate architecture name default
+ set_fact:
+ altarch: arch
+
+- name: Set alternate architecture name for x86
+ when: arch == "x86_64"
+ set_fact:
+ altarch: "amd64"
+
+- import_tasks: install-k9s.yml
diff --git a/agw-deployer/ansible/roles/kubernetes-remove/README.md b/agw-deployer/ansible/roles/kubernetes-remove/README.md
new file mode 100644
index 0000000..9875cb5
--- /dev/null
+++ b/agw-deployer/ansible/roles/kubernetes-remove/README.md
@@ -0,0 +1,2 @@
+Rancher Kubernetes Engine
+=========
diff --git a/agw-deployer/ansible/roles/kubernetes-remove/defaults/main.yml b/agw-deployer/ansible/roles/kubernetes-remove/defaults/main.yml
new file mode 100644
index 0000000..cd21505
--- /dev/null
+++ b/agw-deployer/ansible/roles/kubernetes-remove/defaults/main.yml
@@ -0,0 +1,2 @@
+---
+
diff --git a/agw-deployer/ansible/roles/kubernetes-remove/meta/main.yml b/agw-deployer/ansible/roles/kubernetes-remove/meta/main.yml
new file mode 100644
index 0000000..04a0d8b
--- /dev/null
+++ b/agw-deployer/ansible/roles/kubernetes-remove/meta/main.yml
@@ -0,0 +1,47 @@
+---
+galaxy_info:
+ author: Shubham Tatvamasi
+ description: Rancher Kubernetes Engine
+ # If the issue tracker for your role is not on github, uncomment the
+ # next line and provide a value
+ # issue_tracker_url: http://example.com/issue/tracker
+
+ # Choose a valid license ID from https://spdx.org - some suggested licenses:
+ # - BSD-3-Clause (default)
+ # - MIT
+ # - GPL-2.0-or-later
+ # - GPL-3.0-only
+ # - Apache-2.0
+ # - CC-BY-4.0
+ license: license (GPL-2.0-or-later, MIT, etc)
+ min_ansible_version: 2.1
+ # If this a Container Enabled role, provide the minimum Ansible Container version.
+ # min_ansible_container_version:
+
+ #
+ # Provide a list of supported platforms, and for each platform a list of versions.
+ # If you don't wish to enumerate all versions for a particular platform, use 'all'.
+ # To view available platforms and versions (or releases), visit:
+ # https://galaxy.ansible.com/api/v1/platforms/
+ #
+ # platforms:
+ # - name: Fedora
+ # versions:
+ # - all
+ # - 25
+ # - name: SomePlatform
+ # versions:
+ # - all
+ # - 1.0
+ # - 7
+ # - 99.99
+ galaxy_tags: []
+ # List tags for your role here, one per line. A tag is a keyword that describes
+ # and categorizes the role. Users find roles by searching for tags. Be sure to
+ # remove the '[]' above, if you add tags to this list.
+ #
+ # NOTE: A tag is limited to a single word comprised of alphanumeric characters.
+ # Maximum 20 tags per role.
+dependencies: []
+# List your role dependencies here, one per line. Be sure to remove the '[]' above,
+# if you add dependencies to this list.
diff --git a/agw-deployer/ansible/roles/kubernetes-remove/tasks/main.yml b/agw-deployer/ansible/roles/kubernetes-remove/tasks/main.yml
new file mode 100644
index 0000000..f4987ae
--- /dev/null
+++ b/agw-deployer/ansible/roles/kubernetes-remove/tasks/main.yml
@@ -0,0 +1,4 @@
+---
+- import_tasks: remove-rke.yml
+- import_tasks: remove-k9s.yml
+# - import_tasks: remove-ssh-key.yml
\ No newline at end of file
diff --git a/agw-deployer/ansible/roles/kubernetes-remove/tasks/remove-k9s.yml b/agw-deployer/ansible/roles/kubernetes-remove/tasks/remove-k9s.yml
new file mode 100644
index 0000000..3ff372c
--- /dev/null
+++ b/agw-deployer/ansible/roles/kubernetes-remove/tasks/remove-k9s.yml
@@ -0,0 +1,7 @@
+---
+- name: Remove k9s
+ become: yes
+ file:
+ path: /usr/local/bin/k9s
+ state: absent
+
diff --git a/agw-deployer/ansible/roles/kubernetes-remove/tasks/remove-rke.yml b/agw-deployer/ansible/roles/kubernetes-remove/tasks/remove-rke.yml
new file mode 100644
index 0000000..246f6af
--- /dev/null
+++ b/agw-deployer/ansible/roles/kubernetes-remove/tasks/remove-rke.yml
@@ -0,0 +1,29 @@
+---
+- name: Stop Rancher Kubernetes Engine
+ command: rke remove --force --config {{ ansible_env.HOME }}/{{ magma_directory }}/rke/cluster.yml
+
+- name: Stop and Remove all k8s pods
+ shell: for d in $(docker ps|grep 'k8s_'|awk '{print $1}'); do docker stop $d && docker rm $d; done
+
+- name: Remove rke directory
+ file:
+ path: "{{ ansible_env.HOME }}/{{ magma_directory }}/rke"
+ state: absent
+
+- name: Remove kubernetes config directory
+ file:
+ path: "{{ ansible_env.HOME }}/.kube"
+ state: absent
+
+- name: Remove rke binary for {{ ansible_distribution }}
+ become: yes
+ file:
+ path: /usr/local/bin/rke
+ state: absent
+
+
+- name: Remove kubectl binary for {{ ansible_distribution }}
+ become: yes
+ file:
+ path: /usr/local/bin/kubectl
+ state: absent
diff --git a/agw-deployer/ansible/roles/kubernetes-remove/tasks/remove-ssh-key.yml b/agw-deployer/ansible/roles/kubernetes-remove/tasks/remove-ssh-key.yml
new file mode 100644
index 0000000..95ba804
--- /dev/null
+++ b/agw-deployer/ansible/roles/kubernetes-remove/tasks/remove-ssh-key.yml
@@ -0,0 +1,6 @@
+---
+- name: Remove SSH directory
+ file:
+ path: "{{ ansible_env.HOME }}/{{ magma_directory }}/.ssh"
+ state: absent
+
diff --git a/agw-deployer/ansible/roles/kubernetes/README.md b/agw-deployer/ansible/roles/kubernetes/README.md
new file mode 100644
index 0000000..9875cb5
--- /dev/null
+++ b/agw-deployer/ansible/roles/kubernetes/README.md
@@ -0,0 +1,2 @@
+Rancher Kubernetes Engine
+=========
diff --git a/agw-deployer/ansible/roles/kubernetes/defaults/main.yml b/agw-deployer/ansible/roles/kubernetes/defaults/main.yml
new file mode 100644
index 0000000..ba4c3c2
--- /dev/null
+++ b/agw-deployer/ansible/roles/kubernetes/defaults/main.yml
@@ -0,0 +1,2 @@
+---
+magma_directory: "magma-galaxy"
diff --git a/agw-deployer/ansible/roles/kubernetes/meta/main.yml b/agw-deployer/ansible/roles/kubernetes/meta/main.yml
new file mode 100644
index 0000000..04a0d8b
--- /dev/null
+++ b/agw-deployer/ansible/roles/kubernetes/meta/main.yml
@@ -0,0 +1,47 @@
+---
+galaxy_info:
+ author: Shubham Tatvamasi
+ description: Rancher Kubernetes Engine
+ # If the issue tracker for your role is not on github, uncomment the
+ # next line and provide a value
+ # issue_tracker_url: http://example.com/issue/tracker
+
+ # Choose a valid license ID from https://spdx.org - some suggested licenses:
+ # - BSD-3-Clause (default)
+ # - MIT
+ # - GPL-2.0-or-later
+ # - GPL-3.0-only
+ # - Apache-2.0
+ # - CC-BY-4.0
+ license: license (GPL-2.0-or-later, MIT, etc)
+ min_ansible_version: 2.1
+ # If this a Container Enabled role, provide the minimum Ansible Container version.
+ # min_ansible_container_version:
+
+ #
+ # Provide a list of supported platforms, and for each platform a list of versions.
+ # If you don't wish to enumerate all versions for a particular platform, use 'all'.
+ # To view available platforms and versions (or releases), visit:
+ # https://galaxy.ansible.com/api/v1/platforms/
+ #
+ # platforms:
+ # - name: Fedora
+ # versions:
+ # - all
+ # - 25
+ # - name: SomePlatform
+ # versions:
+ # - all
+ # - 1.0
+ # - 7
+ # - 99.99
+ galaxy_tags: []
+ # List tags for your role here, one per line. A tag is a keyword that describes
+ # and categorizes the role. Users find roles by searching for tags. Be sure to
+ # remove the '[]' above, if you add tags to this list.
+ #
+ # NOTE: A tag is limited to a single word comprised of alphanumeric characters.
+ # Maximum 20 tags per role.
+dependencies: []
+# List your role dependencies here, one per line. Be sure to remove the '[]' above,
+# if you add dependencies to this list.
diff --git a/agw-deployer/ansible/roles/kubernetes/tasks/add-helm-repo.yml b/agw-deployer/ansible/roles/kubernetes/tasks/add-helm-repo.yml
new file mode 100644
index 0000000..9e54442
--- /dev/null
+++ b/agw-deployer/ansible/roles/kubernetes/tasks/add-helm-repo.yml
@@ -0,0 +1,45 @@
+---
+- name: Add Stable Helm repository
+ kubernetes.core.helm_repository:
+ name: stable
+ url: https://charts.helm.sh/stable
+
+- name: Add Bitnami Helm repository
+ kubernetes.core.helm_repository:
+ name: bitnami
+ url: https://charts.bitnami.com/bitnami
+
+- name: Add Elastic Search Helm repository
+ kubernetes.core.helm_repository:
+ name: elastic
+ url: https://helm.elastic.co
+
+- name: Add OpenEBS Helm repository
+ kubernetes.core.helm_repository:
+ name: openebs
+ url: https://openebs.github.io/charts
+
+- name: Add MetalLB Helm repository
+ kubernetes.core.helm_repository:
+ name: metallb
+ url: https://metallb.github.io/metallb
+
+- name: Add HAProxy Helm repository
+ kubernetes.core.helm_repository:
+ name: haproxytech
+ url: https://haproxytech.github.io/helm-charts
+
+- name: Add Ingress NGINX Helm repository
+ kubernetes.core.helm_repository:
+ name: ingress-nginx
+ url: https://kubernetes.github.io/ingress-nginx
+
+- name: Remove old Magma Helm repository
+ kubernetes.core.helm_repository:
+ name: orc8r
+ state: absent
+
+- name: Add Magma Orchestrator Helm repository
+ kubernetes.core.helm_repository:
+ name: orc8r
+ url: "{{ orc8r_helm_repo }}"
diff --git a/agw-deployer/ansible/roles/kubernetes/tasks/install-binaries.yml b/agw-deployer/ansible/roles/kubernetes/tasks/install-binaries.yml
new file mode 100644
index 0000000..09407fe
--- /dev/null
+++ b/agw-deployer/ansible/roles/kubernetes/tasks/install-binaries.yml
@@ -0,0 +1,28 @@
+---
+- name: Download rke binary for {{ ansible_distribution }}
+ become: yes
+ get_url:
+ url: https://github.com/rancher/rke/releases/download/{{ rke_version }}/rke_{{ operating_system }}-{{ altarch }}
+ dest: /usr/local/bin/rke
+ mode: '0755'
+
+- name: Download kubectl binary for {{ ansible_distribution }}
+ become: yes
+ get_url:
+ url: https://dl.k8s.io/release/{{ kubectl_version }}/bin/{{ operating_system }}/{{ altarch }}/kubectl
+ dest: /usr/local/bin/kubectl
+ mode: '0755'
+
+- name: Download helm binary for {{ ansible_distribution }}
+ unarchive:
+ src: https://get.helm.sh/helm-{{ helm_version }}-{{ operating_system }}-{{ altarch }}.tar.gz
+ dest: /tmp
+ remote_src: yes
+
+- name: Copy helm binary file to executable path
+ become: yes
+ copy:
+ src: /tmp/{{ operating_system }}-{{ altarch }}/helm
+ dest: /usr/local/bin/helm
+ mode: '0755'
+ remote_src: yes
diff --git a/agw-deployer/ansible/roles/kubernetes/tasks/install-k9s.yml b/agw-deployer/ansible/roles/kubernetes/tasks/install-k9s.yml
new file mode 100644
index 0000000..6b87cef
--- /dev/null
+++ b/agw-deployer/ansible/roles/kubernetes/tasks/install-k9s.yml
@@ -0,0 +1,8 @@
+---
+- name: Download, unzip and install k9s
+ become: yes
+ unarchive:
+ src: https://github.com/derailed/k9s/releases/download/{{ k9s_version }}/k9s_Linux_{{ altarch }}.tar.gz
+ dest: /usr/local/bin
+ copy: no
+
diff --git a/agw-deployer/ansible/roles/kubernetes/tasks/install-rke.yml b/agw-deployer/ansible/roles/kubernetes/tasks/install-rke.yml
new file mode 100644
index 0000000..ddb7c0b
--- /dev/null
+++ b/agw-deployer/ansible/roles/kubernetes/tasks/install-rke.yml
@@ -0,0 +1,27 @@
+---
+- name: Create rke directory
+ file:
+ path: "{{ ansible_env.HOME }}/{{ magma_directory }}/rke"
+ state: directory
+
+- name: Copy rke config file to host
+ template:
+ src: cluster.yml.j2
+ dest: "{{ ansible_env.HOME }}/{{ magma_directory }}/rke/cluster.yml"
+
+- name: Install Rancher Kubernetes Engine
+ command: rke up --config {{ ansible_env.HOME }}/{{ magma_directory }}/rke/cluster.yml
+ async: 500
+ poll: 5
+
+- name: Create kubernetes config directory
+ file:
+ path: "{{ ansible_env.HOME }}/.kube"
+ state: directory
+
+- name: Copy kubernetes config file to home
+ copy:
+ src: "{{ ansible_env.HOME }}/{{ magma_directory }}/rke/kube_config_cluster.yml"
+ dest: "{{ ansible_env.HOME }}/.kube/config"
+ remote_src: yes
+ mode: '0600'
diff --git a/agw-deployer/ansible/roles/kubernetes/tasks/main.yml b/agw-deployer/ansible/roles/kubernetes/tasks/main.yml
new file mode 100644
index 0000000..c5f9918
--- /dev/null
+++ b/agw-deployer/ansible/roles/kubernetes/tasks/main.yml
@@ -0,0 +1,29 @@
+---
+- name: Set darwin as Operating System
+ when: ansible_distribution == "MacOSX"
+ set_fact:
+ operating_system: "darwin"
+
+- name: Set linux as Operating System
+ when: ansible_distribution != "MacOSX"
+ set_fact:
+ operating_system: "linux"
+
+- name: Set alternate architecture name default
+ set_fact:
+ altarch: arch
+
+- name: Set alternate architecture name for x86
+ when: arch == "x86_64"
+ set_fact:
+ altarch: "amd64"
+
+# - name: Print alternate architecture name
+# debug:
+# msg: "{{ altarch }}"
+
+- import_tasks: install-binaries.yml
+- import_tasks: add-helm-repo.yml
+- import_tasks: setup-ssh-key.yml
+- import_tasks: install-rke.yml
+- import_tasks: install-k9s.yml
diff --git a/agw-deployer/ansible/roles/kubernetes/tasks/setup-ssh-key.yml b/agw-deployer/ansible/roles/kubernetes/tasks/setup-ssh-key.yml
new file mode 100644
index 0000000..4155298
--- /dev/null
+++ b/agw-deployer/ansible/roles/kubernetes/tasks/setup-ssh-key.yml
@@ -0,0 +1,20 @@
+---
+- name: Create SSH directory
+ file:
+ path: "{{ ansible_env.HOME }}/{{ magma_directory }}/.ssh"
+ state: directory
+
+- name: Generate an OpenSSH keypair
+ openssh_keypair:
+ path: "{{ ansible_env.HOME }}/{{ magma_directory }}/.ssh/id_rsa"
+ comment: "{{ ansible_user }}@{{ ansible_host }}"
+
+- name: Register SSH Public Key
+ slurp:
+ src: "{{ ansible_env.HOME }}/{{ magma_directory }}/.ssh/id_rsa.pub"
+ register: rke_ssh_key
+
+- name: Add rke public SSH key to authorized keys list
+ ansible.posix.authorized_key:
+ user: "{{ ansible_user }}"
+ key: "{{ rke_ssh_key['content'] | b64decode }}"
diff --git a/agw-deployer/ansible/roles/kubernetes/templates/cluster.yml.j2 b/agw-deployer/ansible/roles/kubernetes/templates/cluster.yml.j2
new file mode 100644
index 0000000..7dfe0ab
--- /dev/null
+++ b/agw-deployer/ansible/roles/kubernetes/templates/cluster.yml.j2
@@ -0,0 +1,218 @@
+# If you intended to deploy Kubernetes in an air-gapped environment,
+# please consult the documentation on how to configure custom RKE images.
+nodes:
+- address: {{ ansible_host }}
+ port: "22"
+ internal_address: ""
+ role:
+ - controlplane
+ - worker
+ - etcd
+ hostname_override: ""
+ user: {{ ansible_user }}
+ docker_socket: /var/run/docker.sock
+ ssh_key: ""
+ ssh_key_path: {{ ansible_env.HOME }}/{{ magma_directory }}/.ssh/id_rsa
+ ssh_cert: ""
+ ssh_cert_path: ""
+ labels: {}
+ taints: []
+services:
+ etcd:
+ image: ""
+ extra_args: {}
+ extra_args_array: {}
+ extra_binds: []
+ extra_env: []
+ win_extra_args: {}
+ win_extra_args_array: {}
+ win_extra_binds: []
+ win_extra_env: []
+ external_urls: []
+ ca_cert: ""
+ cert: ""
+ key: ""
+ path: ""
+ uid: 0
+ gid: 0
+ snapshot: null
+ retention: ""
+ creation: ""
+ backup_config: null
+ kube-api:
+ image: ""
+ extra_args: {}
+ extra_args_array: {}
+ extra_binds: []
+ extra_env: []
+ win_extra_args: {}
+ win_extra_args_array: {}
+ win_extra_binds: []
+ win_extra_env: []
+ service_cluster_ip_range: 10.43.0.0/16
+ service_node_port_range: ""
+ pod_security_policy: false
+ pod_security_configuration: ""
+ always_pull_images: false
+ secrets_encryption_config: null
+ audit_log: null
+ admission_configuration: null
+ event_rate_limit: null
+ kube-controller:
+ image: ""
+ extra_args: {}
+ extra_args_array: {}
+ extra_binds: []
+ extra_env: []
+ win_extra_args: {}
+ win_extra_args_array: {}
+ win_extra_binds: []
+ win_extra_env: []
+ cluster_cidr: 10.42.0.0/16
+ service_cluster_ip_range: 10.43.0.0/16
+ scheduler:
+ image: ""
+ extra_args: {}
+ extra_args_array: {}
+ extra_binds: []
+ extra_env: []
+ win_extra_args: {}
+ win_extra_args_array: {}
+ win_extra_binds: []
+ win_extra_env: []
+ kubelet:
+ image: ""
+ extra_args: {}
+ extra_args_array: {}
+ extra_binds: ['/var/openebs/local:/var/openebs/local']
+ extra_env: []
+ win_extra_args: {}
+ win_extra_args_array: {}
+ win_extra_binds: []
+ win_extra_env: []
+ cluster_domain: cluster.local
+ infra_container_image: ""
+ cluster_dns_server: 10.43.0.10
+ fail_swap_on: false
+ generate_serving_certificate: false
+ kubeproxy:
+ image: ""
+ extra_args: {}
+ extra_args_array: {}
+ extra_binds: []
+ extra_env: []
+ win_extra_args: {}
+ win_extra_args_array: {}
+ win_extra_binds: []
+ win_extra_env: []
+network:
+ plugin: canal
+ options: {}
+ mtu: 0
+ node_selector: {}
+ update_strategy: null
+ tolerations: []
+authentication:
+ strategy: x509
+ sans: []
+ webhook: null
+addons: ""
+addons_include: []
+system_images:
+ etcd: rancher/mirrored-coreos-etcd:v3.5.4
+ alpine: rancher/rke-tools:v0.1.88
+ nginx_proxy: rancher/rke-tools:v0.1.88
+ cert_downloader: rancher/rke-tools:v0.1.88
+ kubernetes_services_sidecar: rancher/rke-tools:v0.1.88
+ kubedns: rancher/mirrored-k8s-dns-kube-dns:1.21.1
+ dnsmasq: rancher/mirrored-k8s-dns-dnsmasq-nanny:1.21.1
+ kubedns_sidecar: rancher/mirrored-k8s-dns-sidecar:1.21.1
+ kubedns_autoscaler: rancher/mirrored-cluster-proportional-autoscaler:1.8.5
+ coredns: rancher/mirrored-coredns-coredns:1.9.3
+ coredns_autoscaler: rancher/mirrored-cluster-proportional-autoscaler:1.8.5
+ nodelocal: rancher/mirrored-k8s-dns-node-cache:1.21.1
+ kubernetes: rancher/hyperkube:v1.24.10-rancher4
+ flannel: rancher/mirrored-coreos-flannel:v0.15.1
+ flannel_cni: rancher/flannel-cni:v0.3.0-rancher6
+ calico_node: rancher/mirrored-calico-node:v3.22.5
+ calico_cni: rancher/calico-cni:v3.22.5-rancher1
+ calico_controllers: rancher/mirrored-calico-kube-controllers:v3.22.5
+ calico_ctl: rancher/mirrored-calico-ctl:v3.22.5
+ calico_flexvol: rancher/mirrored-calico-pod2daemon-flexvol:v3.22.5
+ canal_node: rancher/mirrored-calico-node:v3.22.5
+ canal_cni: rancher/calico-cni:v3.22.5-rancher1
+ canal_controllers: rancher/mirrored-calico-kube-controllers:v3.22.5
+ canal_flannel: rancher/mirrored-flannelcni-flannel:v0.17.0
+ canal_flexvol: rancher/mirrored-calico-pod2daemon-flexvol:v3.22.5
+ weave_node: weaveworks/weave-kube:2.8.1
+ weave_cni: weaveworks/weave-npc:2.8.1
+ pod_infra_container: rancher/mirrored-pause:3.6
+ ingress: rancher/nginx-ingress-controller:nginx-1.5.1-rancher2
+ ingress_backend: rancher/mirrored-nginx-ingress-controller-defaultbackend:1.5-rancher1
+ ingress_webhook: rancher/mirrored-ingress-nginx-kube-webhook-certgen:v1.1.1
+ metrics_server: rancher/mirrored-metrics-server:v0.6.2
+ windows_pod_infra_container: rancher/mirrored-pause:3.6
+ aci_cni_deploy_container: noiro/cnideploy:5.2.3.5.1d150da
+ aci_host_container: noiro/aci-containers-host:5.2.3.5.1d150da
+ aci_opflex_container: noiro/opflex:5.2.3.5.1d150da
+ aci_mcast_container: noiro/opflex:5.2.3.5.1d150da
+ aci_ovs_container: noiro/openvswitch:5.2.3.5.1d150da
+ aci_controller_container: noiro/aci-containers-controller:5.2.3.5.1d150da
+ aci_gbp_server_container: noiro/gbp-server:5.2.3.5.1d150da
+ aci_opflex_server_container: noiro/opflex-server:5.2.3.5.1d150da
+ssh_key_path: {{ ansible_env.HOME }}/{{ magma_directory }}/.ssh/id_rsa
+ssh_cert_path: ""
+ssh_agent_auth: false
+authorization:
+ mode: rbac
+ options: {}
+ignore_docker_version: null
+enable_cri_dockerd: null
+kubernetes_version: "v1.24.10-rancher4"
+private_registries: []
+ingress:
+ provider: none
+ options: {}
+ node_selector: {}
+ extra_args: {}
+ dns_policy: ""
+ extra_envs: []
+ extra_volumes: []
+ extra_volume_mounts: []
+ update_strategy: null
+ http_port: 0
+ https_port: 0
+ network_mode: ""
+ tolerations: []
+ default_backend: null
+ default_http_backend_priority_class_name: ""
+ nginx_ingress_controller_priority_class_name: ""
+ default_ingress_class: null
+cluster_name: ""
+cloud_provider:
+ name: ""
+prefix_path: ""
+win_prefix_path: ""
+addon_job_timeout: 0
+bastion_host:
+ address: ""
+ port: ""
+ user: ""
+ ssh_key: ""
+ ssh_key_path: ""
+ ssh_cert: ""
+ ssh_cert_path: ""
+ ignore_proxy_env_vars: false
+monitoring:
+ provider: ""
+ options: {}
+ node_selector: {}
+ update_strategy: null
+ replicas: null
+ tolerations: []
+ metrics_server_priority_class_name: ""
+restore:
+ restore: false
+ snapshot_name: ""
+rotate_encryption_key: false
+dns: null
diff --git a/agw-deployer/ansible/roles/orc8r/README.md b/agw-deployer/ansible/roles/orc8r/README.md
new file mode 100644
index 0000000..0304535
--- /dev/null
+++ b/agw-deployer/ansible/roles/orc8r/README.md
@@ -0,0 +1,2 @@
+Magma Orchestrator
+=========
diff --git a/roles/orc8r/defaults/main.yml b/agw-deployer/ansible/roles/orc8r/defaults/main.yml
similarity index 85%
rename from roles/orc8r/defaults/main.yml
rename to agw-deployer/ansible/roles/orc8r/defaults/main.yml
index 3cc9576..d912e06 100644
--- a/roles/orc8r/defaults/main.yml
+++ b/agw-deployer/ansible/roles/orc8r/defaults/main.yml
@@ -1,9 +1,9 @@
---
-orc8r_domain: "magma.local"
+orc8r_domain: ""
magma_namespace: "orc8r"
magma_docker_registry: "magmacore"
magma_docker_tag: "1.8.0"
-magma_directory: "magma-deployer"
+magma_directory: "magma-galaxy"
magma_service_type: "ClusterIP"
orc8r_db_driver: "postgres"
orc8r_db_name: "magma"
diff --git a/agw-deployer/ansible/roles/orc8r/meta/main.yml b/agw-deployer/ansible/roles/orc8r/meta/main.yml
new file mode 100644
index 0000000..2b0082e
--- /dev/null
+++ b/agw-deployer/ansible/roles/orc8r/meta/main.yml
@@ -0,0 +1,47 @@
+---
+galaxy_info:
+ author: Shubham Tatvamasi
+ description: Magma Orchestrator
+ # If the issue tracker for your role is not on github, uncomment the
+ # next line and provide a value
+ # issue_tracker_url: http://example.com/issue/tracker
+
+ # Choose a valid license ID from https://spdx.org - some suggested licenses:
+ # - BSD-3-Clause (default)
+ # - MIT
+ # - GPL-2.0-or-later
+ # - GPL-3.0-only
+ # - Apache-2.0
+ # - CC-BY-4.0
+ license: license (GPL-2.0-or-later, MIT, etc)
+ min_ansible_version: 2.1
+ # If this a Container Enabled role, provide the minimum Ansible Container version.
+ # min_ansible_container_version:
+
+ #
+ # Provide a list of supported platforms, and for each platform a list of versions.
+ # If you don't wish to enumerate all versions for a particular platform, use 'all'.
+ # To view available platforms and versions (or releases), visit:
+ # https://galaxy.ansible.com/api/v1/platforms/
+ #
+ # platforms:
+ # - name: Fedora
+ # versions:
+ # - all
+ # - 25
+ # - name: SomePlatform
+ # versions:
+ # - all
+ # - 1.0
+ # - 7
+ # - 99.99
+ galaxy_tags: []
+ # List tags for your role here, one per line. A tag is a keyword that describes
+ # and categorizes the role. Users find roles by searching for tags. Be sure to
+ # remove the '[]' above, if you add tags to this list.
+ #
+ # NOTE: A tag is limited to a single word comprised of alphanumeric characters.
+ # Maximum 20 tags per role.
+dependencies: []
+# List your role dependencies here, one per line. Be sure to remove the '[]' above,
+# if you add dependencies to this list.
diff --git a/roles/orc8r/tasks/cwf-orc8r.yml b/agw-deployer/ansible/roles/orc8r/tasks/cwf-orc8r.yml
similarity index 100%
rename from roles/orc8r/tasks/cwf-orc8r.yml
rename to agw-deployer/ansible/roles/orc8r/tasks/cwf-orc8r.yml
diff --git a/roles/orc8r/tasks/domain-proxy.yml b/agw-deployer/ansible/roles/orc8r/tasks/domain-proxy.yml
similarity index 100%
rename from roles/orc8r/tasks/domain-proxy.yml
rename to agw-deployer/ansible/roles/orc8r/tasks/domain-proxy.yml
diff --git a/roles/orc8r/tasks/fbinternal-orc8r.yml b/agw-deployer/ansible/roles/orc8r/tasks/fbinternal-orc8r.yml
similarity index 100%
rename from roles/orc8r/tasks/fbinternal-orc8r.yml
rename to agw-deployer/ansible/roles/orc8r/tasks/fbinternal-orc8r.yml
diff --git a/roles/orc8r/tasks/feg-orc8r.yml b/agw-deployer/ansible/roles/orc8r/tasks/feg-orc8r.yml
similarity index 100%
rename from roles/orc8r/tasks/feg-orc8r.yml
rename to agw-deployer/ansible/roles/orc8r/tasks/feg-orc8r.yml
diff --git a/roles/orc8r/tasks/lte-orc8r.yml b/agw-deployer/ansible/roles/orc8r/tasks/lte-orc8r.yml
similarity index 100%
rename from roles/orc8r/tasks/lte-orc8r.yml
rename to agw-deployer/ansible/roles/orc8r/tasks/lte-orc8r.yml
diff --git a/roles/orc8r/tasks/main.yml b/agw-deployer/ansible/roles/orc8r/tasks/main.yml
similarity index 100%
rename from roles/orc8r/tasks/main.yml
rename to agw-deployer/ansible/roles/orc8r/tasks/main.yml
diff --git a/roles/orc8r/tasks/orc8r.yml b/agw-deployer/ansible/roles/orc8r/tasks/orc8r.yml
similarity index 100%
rename from roles/orc8r/tasks/orc8r.yml
rename to agw-deployer/ansible/roles/orc8r/tasks/orc8r.yml
diff --git a/roles/orc8r/tasks/register-secrets.yml b/agw-deployer/ansible/roles/orc8r/tasks/register-secrets.yml
similarity index 100%
rename from roles/orc8r/tasks/register-secrets.yml
rename to agw-deployer/ansible/roles/orc8r/tasks/register-secrets.yml
diff --git a/roles/orc8r/tasks/set-namespace.yml b/agw-deployer/ansible/roles/orc8r/tasks/set-namespace.yml
similarity index 100%
rename from roles/orc8r/tasks/set-namespace.yml
rename to agw-deployer/ansible/roles/orc8r/tasks/set-namespace.yml
diff --git a/roles/orc8r/tasks/volume-claims.yml b/agw-deployer/ansible/roles/orc8r/tasks/volume-claims.yml
similarity index 100%
rename from roles/orc8r/tasks/volume-claims.yml
rename to agw-deployer/ansible/roles/orc8r/tasks/volume-claims.yml
diff --git a/roles/orc8r/tasks/wifi-orc8r.yml b/agw-deployer/ansible/roles/orc8r/tasks/wifi-orc8r.yml
similarity index 100%
rename from roles/orc8r/tasks/wifi-orc8r.yml
rename to agw-deployer/ansible/roles/orc8r/tasks/wifi-orc8r.yml
diff --git a/agw-deployer/ansible/roles/prerequisites/README.md b/agw-deployer/ansible/roles/prerequisites/README.md
new file mode 100644
index 0000000..edefbb8
--- /dev/null
+++ b/agw-deployer/ansible/roles/prerequisites/README.md
@@ -0,0 +1,2 @@
+Prerequisites for Magma
+=========
diff --git a/agw-deployer/ansible/roles/prerequisites/defaults/main.yml b/agw-deployer/ansible/roles/prerequisites/defaults/main.yml
new file mode 100644
index 0000000..79831fe
--- /dev/null
+++ b/agw-deployer/ansible/roles/prerequisites/defaults/main.yml
@@ -0,0 +1,6 @@
+---
+rke_version: "v1.4.7"
+helm_version: "v3.11.2"
+kubectl_version: "v1.24.15"
+magma_directory: "magma-galaxy"
+orc8r_helm_repo: "https://linuxfoundation.jfrog.io/artifactory/magma-helm-prod"
diff --git a/agw-deployer/ansible/roles/prerequisites/meta/main.yml b/agw-deployer/ansible/roles/prerequisites/meta/main.yml
new file mode 100644
index 0000000..9601a12
--- /dev/null
+++ b/agw-deployer/ansible/roles/prerequisites/meta/main.yml
@@ -0,0 +1,47 @@
+---
+galaxy_info:
+ author: Shubham Tatvamasi
+ description: Prerequisites for Magma
+ # If the issue tracker for your role is not on github, uncomment the
+ # next line and provide a value
+ # issue_tracker_url: http://example.com/issue/tracker
+
+ # Choose a valid license ID from https://spdx.org - some suggested licenses:
+ # - BSD-3-Clause (default)
+ # - MIT
+ # - GPL-2.0-or-later
+ # - GPL-3.0-only
+ # - Apache-2.0
+ # - CC-BY-4.0
+ license: license (GPL-2.0-or-later, MIT, etc)
+ min_ansible_version: 2.1
+ # If this a Container Enabled role, provide the minimum Ansible Container version.
+ # min_ansible_container_version:
+
+ #
+ # Provide a list of supported platforms, and for each platform a list of versions.
+ # If you don't wish to enumerate all versions for a particular platform, use 'all'.
+ # To view available platforms and versions (or releases), visit:
+ # https://galaxy.ansible.com/api/v1/platforms/
+ #
+ # platforms:
+ # - name: Fedora
+ # versions:
+ # - all
+ # - 25
+ # - name: SomePlatform
+ # versions:
+ # - all
+ # - 1.0
+ # - 7
+ # - 99.99
+ galaxy_tags: []
+ # List tags for your role here, one per line. A tag is a keyword that describes
+ # and categorizes the role. Users find roles by searching for tags. Be sure to
+ # remove the '[]' above, if you add tags to this list.
+ #
+ # NOTE: A tag is limited to a single word comprised of alphanumeric characters.
+ # Maximum 20 tags per role.
+dependencies: []
+# List your role dependencies here, one per line. Be sure to remove the '[]' above,
+# if you add dependencies to this list.
diff --git a/agw-deployer/ansible/roles/prerequisites/tasks/get-latest-versions.yml b/agw-deployer/ansible/roles/prerequisites/tasks/get-latest-versions.yml
new file mode 100644
index 0000000..edd0e35
--- /dev/null
+++ b/agw-deployer/ansible/roles/prerequisites/tasks/get-latest-versions.yml
@@ -0,0 +1,28 @@
+---
+- name: Get latest kubectl version
+ uri:
+ url: https://dl.k8s.io/release/stable.txt
+ return_content: yes
+ register: latest_kubectl_version
+
+- name: Set kubectl version
+ set_fact:
+ kubectl_version: "{{ latest_kubectl_version.content }}"
+
+- name: Get latest rke version
+ uri:
+ url: https://api.github.com/repos/rancher/rke/tags
+ register: latest_rke_version
+
+- name: Set rke version
+ set_fact:
+ rke_version: "{{ latest_rke_version.json[0].name }}"
+
+- name: Get latest helm version
+ uri:
+ url: https://api.github.com/repos/helm/helm/tags
+ register: latest_helm_version
+
+- name: Set helm version
+ set_fact:
+ helm_version: "{{ latest_helm_version.json[0].name }}"
diff --git a/agw-deployer/ansible/roles/prerequisites/tasks/install-general.yml b/agw-deployer/ansible/roles/prerequisites/tasks/install-general.yml
new file mode 100644
index 0000000..20474b4
--- /dev/null
+++ b/agw-deployer/ansible/roles/prerequisites/tasks/install-general.yml
@@ -0,0 +1,41 @@
+---
+
+- name: Install and configure apt packages
+ debug:
+ msg: "Install and configure apt packages"
+
+#- name: Install chromium browser
+# become: yes
+# apt:
+# update_cache: yes
+# name: chromium-browser
+
+- name: Install wireshark and tshark
+ become: yes
+ apt:
+ name:
+ - wireshark
+ - wireshark-qt
+ - tshark
+ update_cache: true
+
+# Now in tcap_permissions.sh
+#- name: Set wireshark dpkg setuid true
+# become: yes
+# shell: "echo wireshark-common/install-setuid wireshark-common/install-setuid select true|sudo debconf-set-selections"
+
+#- name: Run wireshark dpkg-reconfigure
+# become: yes
+# command: "dpkg-reconfigure -f noninteractive wireshark-common"
+
+- name: Make tcap and wireshark executable by ansible_user
+ become: yes
+ shell:
+ bash "{{ bin_local }}/tcap_permissions.sh" "{{ ansible_user }}"
+
+- name: Make dumpcap executable by everyone
+ become: yes
+ ansible.builtin.file:
+ path: "/usr/bin/dumpcap"
+ mode: "o+x"
+
diff --git a/agw-deployer/ansible/roles/prerequisites/tasks/install-packages.yml b/agw-deployer/ansible/roles/prerequisites/tasks/install-packages.yml
new file mode 100644
index 0000000..f34c8c1
--- /dev/null
+++ b/agw-deployer/ansible/roles/prerequisites/tasks/install-packages.yml
@@ -0,0 +1,31 @@
+---
+- name: Install pip package
+ when: ansible_distribution != "MacOSX"
+ become: yes
+ apt:
+ update_cache: yes
+ name: python3-pip
+
+- name: Install kubernetes and crypto python packages
+ become: yes
+ pip:
+ name:
+ - kubernetes
+ - cryptography
+ - pyopenssl
+ extra_args: --ignore-installed
+
+- name: Install other pip packages
+ become: yes
+ pip:
+ name:
+ - tqdm
+ - jinja2
+ - python-dotenv
+ - numpy
+ - pandas
+
+
+
+
+
diff --git a/agw-deployer/ansible/roles/prerequisites/tasks/main.yml b/agw-deployer/ansible/roles/prerequisites/tasks/main.yml
new file mode 100644
index 0000000..dfc752a
--- /dev/null
+++ b/agw-deployer/ansible/roles/prerequisites/tasks/main.yml
@@ -0,0 +1,5 @@
+---
+- import_tasks: set-operating-system.yml
+- import_tasks: install-general.yml
+# - import_tasks: get-latest-versions.yml
+- import_tasks: install-packages.yml
diff --git a/roles/prerequisites/tasks/set-operating-system.yml b/agw-deployer/ansible/roles/prerequisites/tasks/set-operating-system.yml
similarity index 100%
rename from roles/prerequisites/tasks/set-operating-system.yml
rename to agw-deployer/ansible/roles/prerequisites/tasks/set-operating-system.yml
diff --git a/agw-deployer/ansible/roles/testrole/README.md b/agw-deployer/ansible/roles/testrole/README.md
new file mode 100644
index 0000000..9875cb5
--- /dev/null
+++ b/agw-deployer/ansible/roles/testrole/README.md
@@ -0,0 +1,2 @@
+Rancher Kubernetes Engine
+=========
diff --git a/agw-deployer/ansible/roles/testrole/defaults/main.yml b/agw-deployer/ansible/roles/testrole/defaults/main.yml
new file mode 100644
index 0000000..a7d64c8
--- /dev/null
+++ b/agw-deployer/ansible/roles/testrole/defaults/main.yml
@@ -0,0 +1,3 @@
+---
+agwc_state: present
+
diff --git a/agw-deployer/ansible/roles/testrole/meta/main.yml b/agw-deployer/ansible/roles/testrole/meta/main.yml
new file mode 100644
index 0000000..04a0d8b
--- /dev/null
+++ b/agw-deployer/ansible/roles/testrole/meta/main.yml
@@ -0,0 +1,47 @@
+---
+galaxy_info:
+ author: Shubham Tatvamasi
+ description: Rancher Kubernetes Engine
+ # If the issue tracker for your role is not on github, uncomment the
+ # next line and provide a value
+ # issue_tracker_url: http://example.com/issue/tracker
+
+ # Choose a valid license ID from https://spdx.org - some suggested licenses:
+ # - BSD-3-Clause (default)
+ # - MIT
+ # - GPL-2.0-or-later
+ # - GPL-3.0-only
+ # - Apache-2.0
+ # - CC-BY-4.0
+ license: license (GPL-2.0-or-later, MIT, etc)
+ min_ansible_version: 2.1
+ # If this a Container Enabled role, provide the minimum Ansible Container version.
+ # min_ansible_container_version:
+
+ #
+ # Provide a list of supported platforms, and for each platform a list of versions.
+ # If you don't wish to enumerate all versions for a particular platform, use 'all'.
+ # To view available platforms and versions (or releases), visit:
+ # https://galaxy.ansible.com/api/v1/platforms/
+ #
+ # platforms:
+ # - name: Fedora
+ # versions:
+ # - all
+ # - 25
+ # - name: SomePlatform
+ # versions:
+ # - all
+ # - 1.0
+ # - 7
+ # - 99.99
+ galaxy_tags: []
+ # List tags for your role here, one per line. A tag is a keyword that describes
+ # and categorizes the role. Users find roles by searching for tags. Be sure to
+ # remove the '[]' above, if you add tags to this list.
+ #
+ # NOTE: A tag is limited to a single word comprised of alphanumeric characters.
+ # Maximum 20 tags per role.
+dependencies: []
+# List your role dependencies here, one per line. Be sure to remove the '[]' above,
+# if you add dependencies to this list.
diff --git a/agw-deployer/ansible/roles/testrole/tasks/main.yml b/agw-deployer/ansible/roles/testrole/tasks/main.yml
new file mode 100644
index 0000000..98d027a
--- /dev/null
+++ b/agw-deployer/ansible/roles/testrole/tasks/main.yml
@@ -0,0 +1,7 @@
+---
+- name: Create a Magma Namespace
+ kubernetes.core.k8s:
+ name: "{{ magma_namespace }}"
+ api_version: v1
+ kind: Namespace
+ state: present
\ No newline at end of file
diff --git a/agw-deployer/bin/README.md b/agw-deployer/bin/README.md
new file mode 100644
index 0000000..7e59600
--- /dev/null
+++ b/agw-deployer/bin/README.md
@@ -0,0 +1 @@
+# README
diff --git a/agw-deployer/bin/agw_install_docker.sh b/agw-deployer/bin/agw_install_docker.sh
new file mode 100644
index 0000000..60ca710
--- /dev/null
+++ b/agw-deployer/bin/agw_install_docker.sh
@@ -0,0 +1,83 @@
+#!/bin/bash
+# Copyright 2021 The Magma Authors.
+
+# This source code is licensed under the BSD-style license found in the
+# LICENSE file in the root directory of this source tree.
+
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+MODE=$1
+RERUN=0 # Set to 1 to skip network configuration and run ansible playbook only
+WHOAMI=$(whoami)
+MAGMA_USER="ubuntu"
+MAGMA_VERSION="${MAGMA_VERSION:-v1.8}"
+GIT_URL="${GIT_URL:-https://github.com/magma/magma.git}"
+DEPLOY_PATH="/opt/magma/lte/gateway/deploy"
+
+if [ $RERUN -eq 0 ]; then
+ # Update DNS resolvers
+ ln -sf /var/run/systemd/resolve/resolv.conf /etc/resolv.conf
+ sed -i 's/#DNS=/DNS=8.8.8.8 208.67.222.222/' /etc/systemd/resolved.conf
+ service systemd-resolved restart
+
+ # echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections
+
+# cat > /etc/apt/apt.conf.d/20auto-upgrades << EOF
+# APT::Periodic::Update-Package-Lists "0";
+# APT::Periodic::Download-Upgradeable-Packages "0";
+# APT::Periodic::AutocleanInterval "0";
+# APT::Periodic::Unattended-Upgrade "0";
+# EOF
+
+ apt purge --auto-remove unattended-upgrades -y
+ apt-mark hold "$(uname -r)" linux-aws linux-headers-aws linux-image-aws
+
+ # interface config
+ INTERFACE_DIR="/etc/network/interfaces.d"
+ mkdir -p "$INTERFACE_DIR"
+ echo "source-directory $INTERFACE_DIR" > /etc/network/interfaces
+
+ # get rid of netplan
+ # systemctl unmask networking
+ # systemctl enable networking
+
+ echo "Install Magma"
+
+ echo "Making sure $MAGMA_USER user is sudoers"
+ if ! grep -q "$MAGMA_USER ALL=(ALL) NOPASSWD:ALL" /etc/sudoers; then
+ adduser --disabled-password --gecos "" $MAGMA_USER
+ adduser $MAGMA_USER sudo
+ echo "$MAGMA_USER ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
+
+ adduser $MAGMA_USER docker
+ fi
+
+ alias python=python3
+
+ rm -rf /opt/magma/
+ git clone "${GIT_URL}" /opt/magma
+ cd /opt/magma || exit
+ git checkout "$MAGMA_VERSION"
+
+ # changing intefaces name
+# sed -i 's/GRUB_CMDLINE_LINUX=""/GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0"/g' /etc/default/grub
+# update-grub2
+
+fi
+
+echo "Generating localhost hostfile for Ansible"
+echo "[agw_docker]
+127.0.0.1 ansible_connection=local" > $DEPLOY_PATH/agw_hosts
+
+if [ "$MODE" == "base" ]; then
+ su - $MAGMA_USER -c "sudo ansible-playbook -v -e \"MAGMA_ROOT='/opt/magma' OUTPUT_DIR='/tmp'\" -i $DEPLOY_PATH/agw_hosts --tags base $DEPLOY_PATH/magma_docker.yml"
+else
+ # install magma and its dependencies including OVS.
+ su - $MAGMA_USER -c "sudo ansible-playbook -v -e \"MAGMA_ROOT='/opt/magma' OUTPUT_DIR='/tmp'\" -i $DEPLOY_PATH/agw_hosts --tags agwc $DEPLOY_PATH/magma_docker.yml"
+fi
+
+[[ $RERUN -eq 1 ]] || echo "Reboot this VM to apply kernel settings"
diff --git a/agw-deployer/bin/agwc_dryrun.sh b/agw-deployer/bin/agwc_dryrun.sh
new file mode 100644
index 0000000..fea7737
--- /dev/null
+++ b/agw-deployer/bin/agwc_dryrun.sh
@@ -0,0 +1,4 @@
+#!/bin/bash
+CHARTPATH="../helm/charts/agwc"
+cd ${CHARTPATH}
+helm install --debug --dry-run agwc . --values=values.yaml|less
diff --git a/agw-deployer/bin/bringdown.sh b/agw-deployer/bin/bringdown.sh
new file mode 100644
index 0000000..12425f7
--- /dev/null
+++ b/agw-deployer/bin/bringdown.sh
@@ -0,0 +1,4 @@
+#!/bin/bash
+CHARTPATH="../helm/charts/agwc"
+cd ${CHARTPATH}
+helm delete agwc -n magma && kubectl delete pvc agwc-claim -n magma && kubectl delete -f agwc-pv.yaml
diff --git a/agw-deployer/bin/bringup.sh b/agw-deployer/bin/bringup.sh
new file mode 100644
index 0000000..2ad34d0
--- /dev/null
+++ b/agw-deployer/bin/bringup.sh
@@ -0,0 +1,5 @@
+#!/bin/bash
+CHARTPATH="../helm/charts/agwc"
+cd ${CHARTPATH}
+kubectl delete -f agwc-pv.yaml
+kubectl apply -f agwc-pv.yaml;helm install agwc . --values=values.yaml -n magma
diff --git a/agw-deployer/bin/build_c.sh b/agw-deployer/bin/build_c.sh
new file mode 100644
index 0000000..858d9db
--- /dev/null
+++ b/agw-deployer/bin/build_c.sh
@@ -0,0 +1,7 @@
+MAGMA_ROOT=/home/jblake1/build/magma
+TAG=local
+TAG=$(git branch|grep '*'|awk '{print $2}'|cut -c1-7)
+echo TAG=$TAG
+DOCKER_BUILDKIT=1 docker build -t local/agw_gateway_c:${TAG} -f services/c/Dockerfile $MAGMA_ROOT
+# DOCKER_BUILDKIT=1 docker build --no-cache -t local/agw_gateway_c:${TAG} -f services/c/Dockerfile $MAGMA_ROOT
+
diff --git a/agw-deployer/bin/build_python.sh b/agw-deployer/bin/build_python.sh
new file mode 100644
index 0000000..835fd64
--- /dev/null
+++ b/agw-deployer/bin/build_python.sh
@@ -0,0 +1,6 @@
+MAGMA_ROOT=/home/jblake1/build/magma
+TAG=local
+TAG=$(git branch|grep '*'|awk '{print $2}'|cut -c1-7)
+echo TAG=$TAG
+# DOCKER_BUILDKIT=1 docker build --no-cache --build-arg CPU_ARCH=aarch64 --build-arg DEB_PORT=arm64 -t local/agw_gateway_python_arm:$TAG -f services/python/Dockerfile $MAGMA_ROOT
+DOCKER_BUILDKIT=1 docker build -t local/agw_gateway_python:$TAG -f services/python/Dockerfile $MAGMA_ROOT
diff --git a/deploy-orc8r.sh b/agw-deployer/bin/deploy-orc8r.sh
old mode 100755
new mode 100644
similarity index 57%
rename from deploy-orc8r.sh
rename to agw-deployer/bin/deploy-orc8r.sh
index 8b822b0..7fc74f3
--- a/deploy-orc8r.sh
+++ b/agw-deployer/bin/deploy-orc8r.sh
@@ -14,28 +14,31 @@ if [ $(id -u) != 0 ]; then
exit 1
fi
-DEFAULT_ORC8R_DOMAIN="magma.local"
-DEFAULT_NMS_ORGANIZATION_NAME="magma-test"
-DEFAULT_NMS_EMAIL_ID_AND_PASSWORD="admin"
-ORC8R_IP=$(hostname -I | awk '{print $1}')
-GITHUB_USERNAME="magma"
-MAGMA_DOCKER_REGISTRY="magmacore"
-MAGMA_ORC8R_REPO="magma-deployer"
+ORC8R_DOMAIN="magma.local"
+NMS_ORGANIZATION_NAME="magma-test"
+NMS_EMAIL_ID_AND_PASSWORD="admin"
+ORC8R_IP=$(ip a s $(ip r | head -n 1 | awk '{print $5}') | awk '/inet/ {print $2}' | cut -d / -f 1 | head -n 1)
+GITHUB_USERNAME="jblakley"
+MAGMA_ORC8R_REPO="magma-galaxy"
MAGMA_USER="magma"
HOSTS_FILE="hosts.yml"
# Take input from user
-read -p "Your Magma Orchestrator domain name? [${DEFAULT_ORC8R_DOMAIN}]: " ORC8R_DOMAIN
-ORC8R_DOMAIN="${ORC8R_DOMAIN:-${DEFAULT_ORC8R_DOMAIN}}"
-
-read -p "NMS organization(subdomain) name you want? [${DEFAULT_NMS_ORGANIZATION_NAME}]: " NMS_ORGANIZATION_NAME
-NMS_ORGANIZATION_NAME="${NMS_ORGANIZATION_NAME:-${DEFAULT_NMS_ORGANIZATION_NAME}}"
-
-read -p "Set your email ID for NMS? [${DEFAULT_NMS_EMAIL_ID_AND_PASSWORD}]: " NMS_EMAIL_ID
-NMS_EMAIL_ID="${NMS_EMAIL_ID:-${DEFAULT_NMS_EMAIL_ID_AND_PASSWORD}}"
-
-read -p "Set your password for NMS? [${DEFAULT_NMS_EMAIL_ID_AND_PASSWORD}]: " NMS_PASSWORD
-NMS_PASSWORD="${NMS_PASSWORD:-${DEFAULT_NMS_EMAIL_ID_AND_PASSWORD}}"
+read -rp "Your Magma Orchestrator domain name: " -ei "${ORC8R_DOMAIN}" ORC8R_DOMAIN
+read -rp "NMS organization(subdomain) name you want: " -ei "${NMS_ORGANIZATION_NAME}" NMS_ORGANIZATION_NAME
+read -rp "Set your email ID for NMS: " -ei "${NMS_EMAIL_ID_AND_PASSWORD}" NMS_EMAIL_ID
+read -rp "Set your password for NMS: " -ei "${NMS_EMAIL_ID_AND_PASSWORD}" NMS_PASSWORD
+read -rp "Do you wish to install latest Orc8r build: " -ei "No" LATEST_ORC8R
+read -rp "Set your LoadBalancer IP: " -ei "${ORC8R_IP}" ORC8R_IP
+
+case ${LATEST_ORC8R} in
+ [yY]*)
+ ORC8R_VERSION="latest"
+ ;;
+ [nN]*)
+ ORC8R_VERSION="stable"
+ ;;
+esac
# Add repos for installing yq and ansible
add-apt-repository --yes ppa:rmescandon/yq
@@ -45,7 +48,7 @@ add-apt-repository --yes ppa:ansible/ansible
apt install yq ansible -y
# Create magma user and give sudo permissions
-useradd -m ${MAGMA_USER} -s /bin/bash -G sudo
+id ${MAGMA_USER} || useradd -m ${MAGMA_USER} -s /bin/bash -G sudo
echo "${MAGMA_USER} ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
# switch to magma user
@@ -55,10 +58,16 @@ su - ${MAGMA_USER} -c bash <<_
ssh-keygen -t rsa -f ~/.ssh/id_rsa -N ''
cp ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys
-# Clone Magma Deployer repo
+# Clone Magma Galaxy repo
git clone https://github.com/${GITHUB_USERNAME}/${MAGMA_ORC8R_REPO} --depth 1
cd ~/${MAGMA_ORC8R_REPO}
+# Depoly latest Orc8r build
+if [ "${ORC8R_VERSION}" == "latest" ]; then
+ sed "s/# magma_docker/magma_docker/g" -i ${HOSTS_FILE}
+ sed "s/# orc8r_helm_repo/orc8r_helm_repo/" -i ${HOSTS_FILE}
+fi
+
# export variables for yq
export ORC8R_IP=${ORC8R_IP}
export MAGMA_USER=${MAGMA_USER}
diff --git a/agw-deployer/bin/env2jinja2.py b/agw-deployer/bin/env2jinja2.py
new file mode 100644
index 0000000..c6ae034
--- /dev/null
+++ b/agw-deployer/bin/env2jinja2.py
@@ -0,0 +1,60 @@
+#!/usr/bin/env python
+import sys, os
+# from _abc import __name__
+sys.path.append("../../lib")
+from optparse import OptionParser
+from pyutils import *
+import jinja2
+from jinja2 import Template
+
+
+from dotenv import load_dotenv
+from dotenv import dotenv_values
+
+from simlogging import *
+
+
+LOGNAME=__name__
+TEMPLATEFILE="../files/hosts.yml.j2"
+OUTFILE="../tmp/hosts.yml"
+DOTENVDIR="../bootstrap"
+cnf = {}
+
+def main():
+ global logger
+ LOGFILE="env2jinja2.log"
+ logger = configureLogging(LOGNAME=LOGNAME,LOGFILE=LOGFILE,coloron=False)
+
+ try:
+ mconsole("Starting {}".format(__file__))
+ (options,_) = cmdOptions()
+ kwargs = {**cnf, **options.__dict__.copy()}
+ env = getEnv()
+ renderTemplate(env)
+ except KeyboardInterrupt:
+ sys.exit(0)
+
+def getEnv():
+ envfn = os.path.join(DOTENVDIR,".env")
+ if os.path.isfile(envfn):
+ return dotenv_values(envfn)
+ else:
+ mconsole(f".env file ({envfn} does not exist")
+ pass
+
+def renderTemplate(data, templatefn = TEMPLATEFILE, outfile = OUTFILE):
+ with open(templatefn) as f:
+ rendered = Template(f.read()).render(data)
+ with open(outfile,'w') as f:
+ f.writelines(rendered)
+ pass
+
+def cmdOptions():
+ parser = OptionParser(usage="usage: %prog [options]")
+ parser.add_option("-d", "--debug",
+ action="store_true", dest="debug", default=False,
+ help="Debugging mode")
+ return parser.parse_args()
+
+if __name__ == '__main__': main()
+if __name__ == '_abc': main()
\ No newline at end of file
diff --git a/agw-deployer/bin/gateway_info.sh b/agw-deployer/bin/gateway_info.sh
new file mode 100644
index 0000000..dc174eb
--- /dev/null
+++ b/agw-deployer/bin/gateway_info.sh
@@ -0,0 +1,2 @@
+export MPOD=$(kubectl get pods -n magma| grep magmad|awk '{print $1}') ; echo $MPOD
+kubectl exec -it -n magma $MPOD -- show_gateway_info.py
diff --git a/agw-deployer/bin/mmelog.sh b/agw-deployer/bin/mmelog.sh
new file mode 100644
index 0000000..907c7d1
--- /dev/null
+++ b/agw-deployer/bin/mmelog.sh
@@ -0,0 +1 @@
+MPOD=$(kubectl get pods -n magma| grep oai-mme|awk {print }) ; echo $MPOD
diff --git a/agw-deployer/bin/tcap_permissions.sh b/agw-deployer/bin/tcap_permissions.sh
new file mode 100644
index 0000000..27995ed
--- /dev/null
+++ b/agw-deployer/bin/tcap_permissions.sh
@@ -0,0 +1,11 @@
+#!/bin/bash
+echo wireshark-common/install-setuid wireshark-common/install-setuid select true|sudo debconf-set-selections
+dpkg-reconfigure -f noninteractive wireshark-common
+groupadd pcap
+usermod -a -G pcap $1
+usermod -a -G wireshark $1
+chgrp pcap /usr/sbin/tcpdump
+chmod 750 /usr/sbin/tcpdump
+# setcap cap_net_aw,cap_net_admin=eip /usr/sbin/tcpdump
+setcap "CAP_NET_RAW+eip" /usr/sbin/tcpdump
+
diff --git a/agw-deployer/bin/wireshark_mon.sh b/agw-deployer/bin/wireshark_mon.sh
new file mode 100644
index 0000000..74549b9
--- /dev/null
+++ b/agw-deployer/bin/wireshark_mon.sh
@@ -0,0 +1,4 @@
+INTERFACE=$1
+test -n "${INTERFACE}" || INTERFACE="eth1"
+echo "Watching ${INTERFACE}"
+sudo dumpcap -s 0 -n -i ${INTERFACE} -w - |wireshark -k -i -
diff --git a/agw-deployer/bootstrap/.gitignore b/agw-deployer/bootstrap/.gitignore
new file mode 100644
index 0000000..28b7a93
--- /dev/null
+++ b/agw-deployer/bootstrap/.gitignore
@@ -0,0 +1,2 @@
+/env2jinja2.log
+/.env
diff --git a/agw-deployer/bootstrap/README.md b/agw-deployer/bootstrap/README.md
new file mode 100644
index 0000000..5eb0c84
--- /dev/null
+++ b/agw-deployer/bootstrap/README.md
@@ -0,0 +1,58 @@
+# Getting Started With the JIT Cloudlet
+
+## 1. Cloudlet Configuration
+### 1.1. Ampere Development Platform
+- Ubuntu 20.04
+- Will use 2-3 network interfaces
+
+#### Bootstrapping the system
+
+```
+git clone https://github.com/cmusatyalab/
+cd /recipe/bootstrap
+cp template.env .env
+# Edit .env as needed; you will need set all value for all variables
+bash bootstrap.sh
+```
+
+#### Install ansible prerequisites
+
+```
+cd ../ansible
+
+
+### 1.2. Azure
+#### Configure VM
+- Standard D4s v3; 4 vCPU, 16 GB RAM 128 GB Disk (enlarged from default)
+- Ubuntu 20.04
+
+- Add second network interface
+
+
+- Edit network security group
+- Set a domain name
+
+- Add ports:
+
+```
+TBD
+```
+
+Start VM and ssh into VM
+
+```
+git clone https://github.com/cmusatyalab/
+cd /recipe/bootstrap
+cp template.env .env
+# Edit .env as needed
+bash bootstrap.sh
+```
+
+
+
+
+
+## Management System Configuration
+
+### Azure
+
diff --git a/agw-deployer/bootstrap/bootstrap.agw.sh b/agw-deployer/bootstrap/bootstrap.agw.sh
new file mode 100644
index 0000000..a5ad350
--- /dev/null
+++ b/agw-deployer/bootstrap/bootstrap.agw.sh
@@ -0,0 +1,56 @@
+#!/bin/bash
+cat bootstrap_start.txt
+test -f .env || bash -c "echo No '.env file; exiting'"; test -f .env || exit
+source .env
+echo "Checking .env completeness"
+test -n "${ARCH}" || echo 'No ARCH defined; exiting'; test -n "${ARCH}" || exit
+test -n "${USER}" || echo 'No USER defined; exiting'; test -n "${USER}" || exit
+test -d "${RECIPE_HOME}" || echo 'No RECIPE_HOME; exiting'; test -d "${RECIPE_HOME}" || exit
+test -d "${PLAYBOOK_HOME}" || echo 'No PLAYBOOK_HOME; exiting'; test -d "${PLAYBOOK_HOME}" || exit
+test -n "${CLOUDLET_IP}" || echo 'No CLOUDLET_IP defined; exiting'; test -n "${CLOUDLET_IP}" || exit
+test -n "${S1_IP}" || echo 'No S1_IP defined; exiting'; test -n "${S1_IP}" || exit
+test -n "${NODEB_IP}" || echo 'No NODEB_IP defined; exiting'; test -n "${NODEB_IP}" || exit
+test -n "${IPGATEWAY_IP}" || echo 'No IPGATEWAY_IP defined; exiting'; test -n "${IPGATEWAY_IP}" || exit
+test -n "${CLOUDLET_DN}" || echo 'No CLOUDLET_DN defined; exiting'; test -n "${CLOUDLET_DN}" || exit
+test -n "${MAGMA_DN}" || echo 'No MAGMA_DN defined; exiting'; test -n "${MAGMA_DN}" || exit
+test -n "${PRIVATE_KEY}" || echo 'No PRIVATE_KEY defined; exiting'; test -n "${PRIVATE_KEY}" || exit
+test -n "${ROOT_CA_PATH}" || echo 'No ROOT_CA_PATH defined; exiting'; test -n "${ROOT_CA_PATH}" || exit
+test -n "${ORC8R_IP}" || echo 'No ORC8R_IP defined; exiting'; test -n "${ORC8R_IP}" || exit
+# test -n "${BLANK}" || echo 'No BLANK defined; exiting'; test -n "${BLANK}" || exit
+
+ls ../tmp || mkdir -v ../tmp
+
+# UPDATE SYSTEM
+sudo apt update && sudo apt upgrade -y && sudo apt autoremove -y
+
+# INSTALL PYTHON
+sudo apt install python3-pip -y # Install python early for other things that require it. 20.04 comes with python 3.8 by default
+sudo pip3 install --upgrade pip
+sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 1
+sudo update-alternatives --install /usr/bin/pip pip /usr/bin/pip3 1
+
+# MAKE TMP DIRECTORY
+ls ../tmp || mkdir ../tmp
+
+# INSTALL ANSIBLE
+sudo apt install ansible -y
+pip install ansible tqdm jinja2 python-dotenv
+chmod +x ../bin/env2jinja2.py
+
+
+# START ANSIBLE RECIPE
+echo ${PLAYBOOK_HOME}
+
+# ANSIBLE: Set up ansible playbook
+cd ${PLAYBOOK_HOME}
+ansible-galaxy collection install -r ./collections/requirements.yml
+
+echo "Updating hosts.yaml from .env; NOTE: Doesn't overwrite previous values only template placeholders"
+export PYTHONPATH=../lib
+../bin/env2jinja2.py
+cp -pv ../tmp/hosts.yml ${PLAYBOOK_HOME}/
+
+# ANSIBLE:
+ansible-playbook deploy-common-system.yml -K
+
+cat $RECIPE_HOME/bootstrap/bootstrap_end.txt
diff --git a/agw-deployer/bootstrap/bootstrap.orc8r.sh b/agw-deployer/bootstrap/bootstrap.orc8r.sh
new file mode 100644
index 0000000..40aab8d
--- /dev/null
+++ b/agw-deployer/bootstrap/bootstrap.orc8r.sh
@@ -0,0 +1,39 @@
+#!/bin/bash
+cat bootstrap_start.txt
+test -f .env || bash -c "echo No '.env file; exiting'"; test -f .env || exit
+source .env
+echo "Checking .env completeness"
+test -n "${ARCH}" || echo 'No ARCH defined; exiting'; test -n "${ARCH}" || exit
+test -n "${USER}" || echo 'No USER defined; exiting'; test -n "${USER}" || exit
+test -d "${RECIPE_HOME}" || echo 'No RECIPE_HOME; exiting'; test -d "${RECIPE_HOME}" || exit
+test -d "${PLAYBOOK_HOME}" || echo 'No PLAYBOOK_HOME; exiting'; test -d "${PLAYBOOK_HOME}" || exit
+test -n "${MAGMA_DN}" || echo 'No MAGMA_DN defined; exiting'; test -n "${MAGMA_DN}" || exit
+test -n "${PRIVATE_KEY}" || echo 'No PRIVATE_KEY defined; exiting'; test -n "${PRIVATE_KEY}" || exit
+test -n "${ROOT_CA_PATH}" || echo 'No ROOT_CA_PATH defined; exiting'; test -n "${ROOT_CA_PATH}" || exit
+test -n "${ORC8R_IP}" || echo 'No ORC8R_IP defined; exiting'; test -n "${ORC8R_IP}" || exit
+# test -n "${BLANK}" || echo 'No BLANK defined; exiting'; test -n "${BLANK}" || exit
+
+ls ../tmp || mkdir -v ../tmp
+
+# UPDATE SYSTEM
+sudo apt update && sudo apt upgrade -y && sudo apt autoremove -y
+
+# INSTALL PYTHON
+sudo apt install python3-pip -y # Install python early for other things that require it. 20.04 comes with python 3.8 by default
+sudo pip3 install --upgrade pip
+sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 1
+sudo update-alternatives --install /usr/bin/pip pip /usr/bin/pip3 1
+
+# MAKE TMP DIRECTORY
+ls ../tmp || mkdir ../tmp
+
+# INSTALL ANSIBLE
+sudo apt install ansible -y
+pip install ansible tqdm jinja2 python-dotenv
+chmod +x ../bin/env2jinja2.py
+
+echo "Updating hosts.yaml from .env; NOTE: Doesn't overwrite previous values only template placeholders"
+export PYTHONPATH=../lib
+../bin/env2jinja2.py
+cp -pv ../tmp/hosts.yml ${PLAYBOOK_HOME}/
+
diff --git a/agw-deployer/bootstrap/bootstrap_end.txt b/agw-deployer/bootstrap/bootstrap_end.txt
new file mode 100644
index 0000000..b1265fe
--- /dev/null
+++ b/agw-deployer/bootstrap/bootstrap_end.txt
@@ -0,0 +1 @@
+This is the default text for bootstrap.txt
diff --git a/agw-deployer/bootstrap/bootstrap_start.txt b/agw-deployer/bootstrap/bootstrap_start.txt
new file mode 100644
index 0000000..b1265fe
--- /dev/null
+++ b/agw-deployer/bootstrap/bootstrap_start.txt
@@ -0,0 +1 @@
+This is the default text for bootstrap.txt
diff --git a/agw-deployer/bootstrap/template.agw.env b/agw-deployer/bootstrap/template.agw.env
new file mode 100644
index 0000000..7e0d3cb
--- /dev/null
+++ b/agw-deployer/bootstrap/template.agw.env
@@ -0,0 +1,24 @@
+export ARCH=x86_64 # arm64 or x86_64
+export USER=
+export CLOUDLET_DN= # fqdn of server AGW runs on
+export MAGMA_DN= # e.g., magma.local
+export MAGMA_USER= # e.g., magma
+export CLOUDLET_IP= # IP of server AGW runs on
+export S1_IP= # IP address of AGW S1 interface
+export RECIPE_HOME= # local path of this repository/recipe
+export PLAYBOOK_HOME=${RECIPE_HOME}/ansible
+export NETWORK_ELEMENT=agw # agw or orc8r
+export PRIVATE_KEY=
+export ROOT_CA_PATH=
+export ORC8R_IP=
+export ETH0_MAC=
+export ETH1_MAC=
+export NAMESERVER_IP= # e.g., "8.8.8.8"
+export NODEB_IP= # IP of a NodeB
+export IPGATEWAY_IP= # Internet gateway from eth0
+export MAGMA_GITHUB=https://github.com/magma/magma.git
+
+export MAGMA_VERSION= # e.g., 1.9.0
+export DOCKER_IMAGE_VERSION= # e.g., 20.10.21-0ubuntu1~20.04.2
+export DOCKER_COMPOSE_VERSION= # e.g., "v2.17.2"
+
diff --git a/agw-deployer/bootstrap/template.orc8r.env b/agw-deployer/bootstrap/template.orc8r.env
new file mode 100644
index 0000000..665e4ba
--- /dev/null
+++ b/agw-deployer/bootstrap/template.orc8r.env
@@ -0,0 +1,13 @@
+export ARCH=x86_64 # arm64 or x86_64
+export USER=
+export MAGMA_DN= # e.g., magma.local
+export MAGMA_USER= # e.g., magma
+export RECIPE_HOME= # local path of this repository/recipe
+export PLAYBOOK_HOME=${RECIPE_HOME}/ansible
+export NETWORK_ELEMENT=orc8r # agw or orc8r
+export PRIVATE_KEY=
+export ROOT_CA_PATH=/home/magma/magma-deployer/secrets/rootCA.pem
+export ORC8R_IP=
+
+export MAGMA_VERSION= # e.g., 1.9.0
+
diff --git a/agw-deployer/doc/README.md b/agw-deployer/doc/README.md
new file mode 100644
index 0000000..7e59600
--- /dev/null
+++ b/agw-deployer/doc/README.md
@@ -0,0 +1 @@
+# README
diff --git a/agw-deployer/files/20auto-upgrades b/agw-deployer/files/20auto-upgrades
new file mode 100644
index 0000000..c457add
--- /dev/null
+++ b/agw-deployer/files/20auto-upgrades
@@ -0,0 +1,4 @@
+ APT::Periodic::Update-Package-Lists "0";
+ APT::Periodic::Download-Upgradeable-Packages "0";
+ APT::Periodic::AutocleanInterval "0";
+ APT::Periodic::Unattended-Upgrade "0";
\ No newline at end of file
diff --git a/agw-deployer/files/75-eth0-itf.yaml.j2 b/agw-deployer/files/75-eth0-itf.yaml.j2
new file mode 100644
index 0000000..027fd85
--- /dev/null
+++ b/agw-deployer/files/75-eth0-itf.yaml.j2
@@ -0,0 +1,15 @@
+network:
+ ethernets:
+ eth0:
+ dhcp4: false
+ dhcp6: false
+ addresses: [{{ cloudlet_ip }}/24]
+ routes:
+ - to: default
+ via: {{ipgateway_ip}}
+ match:
+ macaddress: {{eth0_mac}}
+ nameservers:
+ addresses: [{{nameserver_ip}}]
+ set-name: eth0
+ version: 2
diff --git a/agw-deployer/files/80-eth1-itf.yaml.j2 b/agw-deployer/files/80-eth1-itf.yaml.j2
new file mode 100644
index 0000000..248bf14
--- /dev/null
+++ b/agw-deployer/files/80-eth1-itf.yaml.j2
@@ -0,0 +1,14 @@
+network:
+ ethernets:
+ eth1:
+ dhcp4: false
+ dhcp6: false
+ addresses: [{{ s1_ip }}/24]
+ match:
+ macaddress: {{eth1_mac}}
+ routes:
+ - to: {{nodeb_ip}}/32
+ via: {{s1_ip}}
+ set-name: eth1
+ version: 2
+
diff --git a/agw-deployer/files/control_proxy.yml.j2 b/agw-deployer/files/control_proxy.yml.j2
new file mode 100644
index 0000000..a159ac2
--- /dev/null
+++ b/agw-deployer/files/control_proxy.yml.j2
@@ -0,0 +1,8 @@
+cloud_address: controller.{{domainName}}
+cloud_port: 443
+bootstrap_address: bootstrapper-controller.{{domainName}}
+bootstrap_port: 443
+fluentd_address: fluentd.{{domainName}}
+fluentd_port: 24224
+
+rootca_cert: /var/opt/magma/certs/rootCA.pem
diff --git a/agw-deployer/files/daemon.json.template b/agw-deployer/files/daemon.json.template
new file mode 100644
index 0000000..895e49f
--- /dev/null
+++ b/agw-deployer/files/daemon.json.template
@@ -0,0 +1,9 @@
+{
+ "exec-opts": ["native.cgroupdriver=systemd"],
+ "log-driver": "json-file",
+ "log-opts": {
+ "max-size": "100m"
+ },
+ "storage-driver": "overlay2",
+ "data-root": "/store1/docker"
+}
diff --git a/agw-deployer/files/etchosts.j2 b/agw-deployer/files/etchosts.j2
new file mode 100644
index 0000000..4961886
--- /dev/null
+++ b/agw-deployer/files/etchosts.j2
@@ -0,0 +1,5 @@
+{{orc8r_ip}} api.{{domainName}}
+{{orc8r_ip}} jit-lte.nms.{{domainName}}
+{{orc8r_ip}} fluentd.{{domainName}}
+{{orc8r_ip}} controller.{{domainName}}
+{{orc8r_ip}} bootstrapper-controller.{{domainName}}
diff --git a/agw-deployer/files/hosts.yml.j2 b/agw-deployer/files/hosts.yml.j2
new file mode 100644
index 0000000..2d86c0f
--- /dev/null
+++ b/agw-deployer/files/hosts.yml.j2
@@ -0,0 +1,48 @@
+---
+all:
+ # Update your VM or bare-metal IP address
+ hosts: {{ CLOUDLET_IP }}
+ # hosts: 127.0.0.1
+ vars:
+ ansible_user: "{{ USER }}"
+ arch: {{ ARCH }}
+ domainName: {{ MAGMA_DN }}
+ magma_namespace: magma
+ magma_directory: "magma"
+ magma_user: {{ MAGMA_USER }}
+ magma_github: {{ MAGMA_GITHUB }}
+ magma_version: {{ MAGMA_VERSION }}
+ cloudlet_ip: {{ CLOUDLET_IP }}
+ orc8r_ip: {{ ORC8R_IP }}
+ s1_ip: {{ S1_IP }}
+ nodeb_ip: {{ NODEB_IP }}
+ eth0_mac: {{ ETH0_MAC }}
+ eth1_mac: {{ ETH1_MAC }}
+ nameserver_ip: "{{ NAMESERVER_IP }}"
+ ipgateway_ip: {{ IPGATEWAY_IP }}
+ # directory path setup
+ recipe_home: {{ RECIPE_HOME }}
+ secrets_local: "{{ ROOT_CA_PATH }}"
+ helm_local: "{{ RECIPE_HOME }}/helm/charts"
+ files_local: "{{ RECIPE_HOME }}/files"
+ tmp_local: "{{ RECIPE_HOME }}/tmp"
+ bin_local: "{{ RECIPE_HOME }}/bin"
+ logs_local: "{{ RECIPE_HOME }}/logs"
+
+ # ssh key for all hosts
+ ansible_ssh_private_key_file: "{{ PRIVATE_KEY }}"
+
+ # repositories
+
+ orc8r_helm_repo: "{{ ORC8R_HELM_REPO }}"
+
+
+ # versions
+ rke_version: "{{ RKE_VERSION }}"
+ kubectl_version: "{{ KUBECTL_VERSION }}"
+ helm_version: "{{ HELM_VERSION }}"
+ docker_image_version: "{{ DOCKER_IMAGE_VERSION }}"
+ k9s_version: "{{ K9S_VERSION }}"
+ docker_compose_version: "{{ DOCKER_COMPOSE_VERSION }}"
+
+
diff --git a/agw-deployer/files/sample.hosts.yml b/agw-deployer/files/sample.hosts.yml
new file mode 100644
index 0000000..8990bc4
--- /dev/null
+++ b/agw-deployer/files/sample.hosts.yml
@@ -0,0 +1,43 @@
+---
+all:
+ # Update your VM or bare-metal IP address
+ hosts: 192.168.122.121
+ # hosts: 127.0.0.1
+ vars:
+ ansible_user: "jblake1"
+ arch: x86_64
+ domainName: magma.local
+ magma_namespace: magma
+ magma_directory: "magma"
+ magma_version: 1.8.0
+ cloudlet_ip: 192.168.122.121
+ orc8r_ip: 192.168.8.153
+ s1_ip: 192.168.9.10
+ nodeb_ip: 192.168.9.8
+ eth0_mac: 52:54:00:6f:d1:b4
+ eth1_mac: 52:54:00:40:e1:e8
+ nameserver_ip: "8.8.8.8,128.2.212.53"
+ ipgateway_ip: 192.168.122.1
+ # directory path setup
+ recipe_home: /home/jblake1/git/CMUProjects/JITCloudlet/recipe
+ secrets_local: "/home/jblake1/secrets/orc8r.jit-c01-off.secrets"
+ helm_local: "/home/jblake1/git/CMUProjects/JITCloudlet/recipe/helm/charts"
+ files_local: "/home/jblake1/git/CMUProjects/JITCloudlet/recipe/files"
+ tmp_local: "/home/jblake1/git/CMUProjects/JITCloudlet/recipe/tmp"
+ bin_local: "/home/jblake1/git/CMUProjects/JITCloudlet/recipe/bin"
+ logs_local: "/home/jblake1/git/CMUProjects/JITCloudlet/recipe/logs"
+
+ # ssh key for all hosts
+ ansible_ssh_private_key_file: "/home/jblake1/.ssh/jblake1-azure-02.pem"
+
+ # repositories
+
+ orc8r_helm_repo: "https://linuxfoundation.jfrog.io/artifactory/magma-helm-prod"
+ # versions
+ rke_version: "v1.4.3"
+ kubectl_version: "v1.26.2"
+ helm_version: "v3.11.2"
+ docker_image_version: "20.10.21-0ubuntu1~20.04.2"
+ docker_compose_version: "v2.17.2"
+ k9s_version: "v0.31.7"
+
diff --git a/agw-deployer/helm/README.md b/agw-deployer/helm/README.md
new file mode 100644
index 0000000..7e59600
--- /dev/null
+++ b/agw-deployer/helm/README.md
@@ -0,0 +1 @@
+# README
diff --git a/agw-deployer/helm/charts/.gitignore b/agw-deployer/helm/charts/.gitignore
new file mode 100644
index 0000000..1377554
--- /dev/null
+++ b/agw-deployer/helm/charts/.gitignore
@@ -0,0 +1 @@
+*.swp
diff --git a/agw-deployer/helm/charts/agwc/.gitignore b/agw-deployer/helm/charts/agwc/.gitignore
new file mode 100644
index 0000000..3e3f503
--- /dev/null
+++ b/agw-deployer/helm/charts/agwc/.gitignore
@@ -0,0 +1 @@
+/rootCA.pem
diff --git a/agw-deployer/helm/charts/agwc/.helmignore b/agw-deployer/helm/charts/agwc/.helmignore
new file mode 100644
index 0000000..0e8a0eb
--- /dev/null
+++ b/agw-deployer/helm/charts/agwc/.helmignore
@@ -0,0 +1,23 @@
+# Patterns to ignore when building packages.
+# This supports shell glob matching, relative path matching, and
+# negation (prefixed with !). Only one pattern per line.
+.DS_Store
+# Common VCS dirs
+.git/
+.gitignore
+.bzr/
+.bzrignore
+.hg/
+.hgignore
+.svn/
+# Common backup files
+*.swp
+*.bak
+*.tmp
+*.orig
+*~
+# Various IDEs
+.project
+.idea/
+*.tmproj
+.vscode/
diff --git a/agw-deployer/helm/charts/agwc/Chart.yaml b/agw-deployer/helm/charts/agwc/Chart.yaml
new file mode 100644
index 0000000..83a2dd2
--- /dev/null
+++ b/agw-deployer/helm/charts/agwc/Chart.yaml
@@ -0,0 +1,22 @@
+# Copyright 2020 The Magma Authors.
+
+# This source code is licensed under the BSD-style license found in the
+# LICENSE file in the root directory of this source tree.
+
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+---
+apiVersion: v2
+appVersion: "1.0"
+description: Helm chart for the Magma containerized AGW
+name: agwc
+version: 1.0
+home: https://www.magmacore.org
+sources:
+ - https://github.com/magma/magma
+keywords:
+ - magma
+ - agwc
diff --git a/agw-deployer/helm/charts/agwc/README.md b/agw-deployer/helm/charts/agwc/README.md
new file mode 100644
index 0000000..3b05724
--- /dev/null
+++ b/agw-deployer/helm/charts/agwc/README.md
@@ -0,0 +1,63 @@
+# AGW Helm Deployment - Experimental
+
+This folder contains a Helm Chart for the containerized AGW.
+
+Currently working on arm64 kvm-qemu VM host.
+
+## Configuration
+
+The following table list the configurable parameters of the agw chart and their default values.
+
+| Parameter | Description | Default |
+| --- | --- | --- |
+| `secret.certs` | Secret name containing agwc certs. | `agwc-secrets-certs` |
+| `image.repository` | Repository for agwc images. | `` |
+| `image.pullPolicy` | Pull policy for agwc images. | `` |
+| `image.tag` | Tag for agwc image. | `latest` |
+| `image.arch` | Tag for node architecture (e.g., arm). | `` |
+| `config.domainName` | Orchestrator domain name. | `` |
+| `persistant.name` | Secret name containing agwc certs. | `agwc-claim` |
+
+For `image.arch`, use `arm` or leave blank for x86
+
+## Installation
+
+# Create magma namespace
+```sh
+~ kubectl create namespace magma
+```
+
+# Create rootca certificate secret needed to communicate with orc8r
+```sh
+~ kubectl create secret generic agwc-secret-certs --from-file=rootCA.pem=rootCA.pem --namespace magma
+```
+# Create storage class and persistent volume needed for agwc-claim
+```sh
+~ kubectl apply -f agwc-sc.yaml
+~ kubectl apply -f agwc-pv.yaml
+```
+You may need to `kubectl delete -f agwc-pv.yaml` after each `helm install`
+
+# Deploy an AGW after updating values.yaml
+```sh
+~ cd lte/gateway/deploy/agwc-helm-charts
+~ helm --debug install agwc --namespace magma . --values=values.yaml
+```
+
+# Delete the AGW if needed using,
+```sh
+~ helm uninstall agwc --namespace magma
+~ kubectl delete -n magma secret agwc-secret-certs
+~ kubectl delete namespace magma
+~ kubectl delete -f agwc-sc.yaml
+~ kubectl delete -f agwc-pv.yaml
+```
+
+# Convenience scripts
+
+```sh
+~ bringup.sh # Perform agwc-pv creation and the install
+~ bringdown.sh # Delete the install and cleanup
+~ dryrun.sh # Run a dryrun
+~ mmelog.sh # Follow the deployment's mme.log
+```
diff --git a/agw-deployer/helm/charts/agwc/agwc-pv.yaml b/agw-deployer/helm/charts/agwc/agwc-pv.yaml
new file mode 100644
index 0000000..58e1da4
--- /dev/null
+++ b/agw-deployer/helm/charts/agwc/agwc-pv.yaml
@@ -0,0 +1,15 @@
+apiVersion: v1
+kind: PersistentVolume
+metadata:
+ name: agwc-pv
+ labels:
+ type: local
+ app.kubernetes.io/component: agwc-claim
+spec:
+ storageClassName: standard
+ capacity:
+ storage: 10Gi
+ accessModes:
+ - ReadWriteOnce
+ hostPath:
+ path: "/var/opt/magma"
diff --git a/agw-deployer/helm/charts/agwc/agwc-sc.yaml b/agw-deployer/helm/charts/agwc/agwc-sc.yaml
new file mode 100644
index 0000000..189d286
--- /dev/null
+++ b/agw-deployer/helm/charts/agwc/agwc-sc.yaml
@@ -0,0 +1,12 @@
+apiVersion: storage.k8s.io/v1
+kind: StorageClass
+metadata:
+ name: standard
+provisioner: local
+parameters:
+ type: gp2
+reclaimPolicy: Retain
+allowVolumeExpansion: true
+mountOptions:
+ - debug
+volumeBindingMode: Immediate
diff --git a/agw-deployer/helm/charts/agwc/templates/_container.yaml b/agw-deployer/helm/charts/agwc/templates/_container.yaml
new file mode 100644
index 0000000..7280296
--- /dev/null
+++ b/agw-deployer/helm/charts/agwc/templates/_container.yaml
@@ -0,0 +1,32 @@
+{{/*
+Copyright 2020 The Magma Authors.
+
+This source code is licensed under the BSD-style license found in the
+LICENSE file in the root directory of this source tree.
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/}}
+{{- define "agwc.container.tpl" -}}
+name: agwc-container
+imagePullPolicy: {{ .Values.image.pullPolicy }}
+securityContext:
+ privileged: true
+volumeMounts:
+ - name: "magma-config"
+ mountPath: /etc/magma/
+ readOnly: true
+ - name: {{ .Values.persistent.name }}
+ mountPath: /var/opt/magma
+ readOnly: false
+ - mountPath: /etc/snowflake
+ name: snowflake-file
+resources:
+{{ toYaml .Values.resources | indent 2 }}
+{{- end -}}
+{{- define "agwc.container" -}}
+{{- include "agwc.util.merge" (append . "agwc.container.tpl") | indent 8 -}}
+{{- end -}}
diff --git a/agw-deployer/helm/charts/agwc/templates/_deployment.yaml b/agw-deployer/helm/charts/agwc/templates/_deployment.yaml
new file mode 100644
index 0000000..d644884
--- /dev/null
+++ b/agw-deployer/helm/charts/agwc/templates/_deployment.yaml
@@ -0,0 +1,59 @@
+{{/*
+Copyright 2020 The Magma Authors.
+
+This source code is licensed under the BSD-style license found in the
+LICENSE file in the root directory of this source tree.
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/}}
+{{- define "agwc.deployment.tpl" -}}
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: agwc
+ namespace: {{ .Values.namespace }}
+ labels:
+ app.kubernetes.io/component: agwc
+{{ include "default-labels" . | indent 4 }}
+{{ include "image-version-label" . | indent 4 }}
+spec:
+ replicas: 1
+ strategy:
+ type: Recreate
+ selector:
+ matchLabels:
+ app.kubernetes.io/component: agwc
+{{ include "default-selector-labels" . | indent 6 }}
+{{ include "image-version-label" . | indent 6 }}
+ template:
+ metadata:
+ labels:
+ app.kubernetes.io/component: agwc
+{{ include "default-selector-labels" . | indent 8 }}
+{{ include "image-version-label" . | indent 8 }}
+ spec:
+ restartPolicy: Always
+ hostNetwork: true
+ volumes:
+ - name: magma-config
+ hostPath:
+ path: /etc/magma
+ type: Directory
+ - name: agwc-claim
+ persistentVolumeClaim:
+ claimName: {{ .Values.persistent.name }}
+ - name: snowflake-file
+ hostPath:
+ path: /etc/snowflake
+ type: FileOrCreate
+ containers:
+ -
+{{ include "agwc.container.tpl" . | indent 8 }}
+{{- end -}}
+{{- define "agwc.deployment" -}}
+{{- include "agwc.util.merge" (append . "agwc.deployment.tpl") -}}
+{{- end -}}
diff --git a/agw-deployer/helm/charts/agwc/templates/_helpers.tpl b/agw-deployer/helm/charts/agwc/templates/_helpers.tpl
new file mode 100644
index 0000000..74eee17
--- /dev/null
+++ b/agw-deployer/helm/charts/agwc/templates/_helpers.tpl
@@ -0,0 +1,30 @@
+{{/*
+Copyright 2020 The Magma Authors.
+
+This source code is licensed under the BSD-style license found in the
+LICENSE file in the root directory of this source tree.
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/}}
+{{/* Generate basic labels */}}
+{{- define "default-labels" -}}
+app.kubernetes.io/name: {{ .Chart.Name }}
+app.kubernetes.io/component: {{ .Chart.Name }}
+app.kubernetes.io/instance: {{ .Release.Name }}
+app.kubernetes.io/managed-by: helm
+helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}
+{{- end -}}
+
+{{/* Generate selector labels */}}
+{{- define "default-selector-labels" -}}
+app.kubernetes.io/name: {{ .Chart.Name }}
+app.kubernetes.io/instance: {{ .Release.Name }}
+{{- end -}}
+
+{{/* Generate selector labels */}}
+{{- define "image-version-label" -}}
+{{- end -}}
diff --git a/agw-deployer/helm/charts/agwc/templates/_util.yaml b/agw-deployer/helm/charts/agwc/templates/_util.yaml
new file mode 100644
index 0000000..4f3d0a4
--- /dev/null
+++ b/agw-deployer/helm/charts/agwc/templates/_util.yaml
@@ -0,0 +1,24 @@
+{{- /*
+Copyright 2020 The Magma Authors.
+
+This source code is licensed under the BSD-style license found in the
+LICENSE file in the root directory of this source tree.
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+agwc.util.merge will merge two YAML templates and output the result.
+This takes an array of three values:
+- the top context
+- the template name of the overrides (destination)
+- the template name of the base (source)
+*/ -}}
+{{- define "agwc.util.merge" -}}
+{{- $top := first . -}}
+{{- $overrides := fromYaml (include (index . 1) $top) | default (dict ) -}}
+{{- $tpl := fromYaml (include (index . 2) $top) | default (dict ) -}}
+{{- toYaml (merge $overrides $tpl) -}}
+{{- end -}}
diff --git a/agw-deployer/helm/charts/agwc/templates/agwc-claim-pvc.yaml b/agw-deployer/helm/charts/agwc/templates/agwc-claim-pvc.yaml
new file mode 100644
index 0000000..5159b3e
--- /dev/null
+++ b/agw-deployer/helm/charts/agwc/templates/agwc-claim-pvc.yaml
@@ -0,0 +1,18 @@
+---
+apiVersion: v1
+kind: PersistentVolumeClaim
+metadata:
+ labels:
+ app.kubernetes.io/component: agwc-claim
+ name: agwc-claim
+ namespace: magma
+ annotations:
+ "helm.sh/hook": "pre-install"
+ "helm.sh/hook-weight": "-5"
+spec:
+ storageClassName: standard
+ accessModes:
+ - ReadWriteOnce
+ resources:
+ requests:
+ storage: 1Gi
diff --git a/agw-deployer/helm/charts/agwc/templates/agwc-config.config.yaml b/agw-deployer/helm/charts/agwc/templates/agwc-config.config.yaml
new file mode 100644
index 0000000..683ef1a
--- /dev/null
+++ b/agw-deployer/helm/charts/agwc/templates/agwc-config.config.yaml
@@ -0,0 +1,36 @@
+{{/*
+# Copyright 2020 The Magma Authors.
+
+# This source code is licensed under the BSD-style license found in the
+# LICENSE file in the root directory of this source tree.
+
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+*/}}
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ labels:
+ app.kubernetes.io/component: orc8r-config
+ name: orc8r-config
+ namespace: {{ .Values.namespace }}
+ annotations:
+ "helm.sh/hook": "pre-install"
+ "helm.sh/hook-weight": "-5"
+data:
+ gw_challenge.b64: |
+ {{ print .Values.config.gwChallenge | trim | nospace }}
+ control_proxy.yml: |
+ # Cloud address for reaching out to the cloud.
+ cloud_address: controller.{{ .Values.config.domainName }}
+ cloud_port: 443
+
+ bootstrap_address: bootstrapper-controller.{{ .Values.config.domainName }}
+ bootstrap_port: 443
+
+ fluentd_address: fluentd.{{ .Values.config.domainName }}
+ fluentd_port: 24224
diff --git a/agw-deployer/helm/charts/agwc/templates/agwc-config.pod.yaml b/agw-deployer/helm/charts/agwc/templates/agwc-config.pod.yaml
new file mode 100644
index 0000000..d4835de
--- /dev/null
+++ b/agw-deployer/helm/charts/agwc/templates/agwc-config.pod.yaml
@@ -0,0 +1,60 @@
+{{/*
+# Copyright 2020 The Magma Authors.
+
+# This source code is licensed under the BSD-style license found in the
+# LICENSE file in the root directory of this source tree.
+
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+*/}}
+---
+apiVersion: v1
+kind: Pod
+metadata:
+ labels:
+ app.kubernetes.io/component: agwc-config
+ name: agwc-config
+ namespace: {{ .Values.namespace }}
+ annotations:
+ "helm.sh/hook": "pre-install"
+ "helm.sh/hook-weight": "5"
+ "helm.sh/hook-delete-policy": "hook-succeeded"
+spec:
+ containers:
+ - args:
+ - sh
+ - -c
+ - mkdir -p /var/opt/magma/configs && cp -f /configs/control_proxy.yml /var/opt/magma/configs/ &&
+ mkdir -p /var/opt/magma/certs && cp -f /certs/rootCA.pem /var/opt/magma/certs/ &&
+ /usr/local/bin/generate_nghttpx_config.py
+ image: "{{ .Values.image.repository }}/agw_gateway_python{{ .Values.image.arch}}:{{ .Values.image.tag | default .Chart.AppVersion }}"
+ name: agwc-config
+ resources: {}
+ volumeMounts:
+ - mountPath: /etc/magma
+ name: magma-config
+ - mountPath: /var/opt/magma
+ name: agwc-claim
+ - mountPath: /certs
+ name: agwc-secret
+ - mountPath: /configs
+ name: controlproxy-config
+ restartPolicy: Never
+ hostNetwork: true
+ volumes:
+ - name: magma-config
+ hostPath:
+ path: /etc/magma
+ type: DirectoryOrCreate
+ - name: agwc-claim
+ persistentVolumeClaim:
+ claimName: agwc-claim
+ - name: agwc-secret
+ secret:
+ secretName: {{ .Values.secret.certs }}
+ - name: controlproxy-config
+ configMap:
+ name: controlproxy-config
diff --git a/agw-deployer/helm/charts/agwc/templates/agwc_values.yaml.j2 b/agw-deployer/helm/charts/agwc/templates/agwc_values.yaml.j2
new file mode 100644
index 0000000..25c2e00
--- /dev/null
+++ b/agw-deployer/helm/charts/agwc/templates/agwc_values.yaml.j2
@@ -0,0 +1,32 @@
+# Copyright 2020 The Magma Authors.
+
+# This source code is licensed under the BSD-style license found in the
+# LICENSE file in the root directory of this source tree.
+
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+---
+namespace: magma
+
+# Define which secrets should be mounted by pods.
+secret:
+ certs: agwc-secret-certs
+
+image:
+ repository: linuxfoundation.jfrog.io/magma-docker-test
+ pullPolicy: IfNotPresent
+ # Overrides the image tag whose default is the chart appVersion.
+ tag: "1.8"
+ arch: ""
+
+config:
+ domainName: magma.local
+ gwChallenge: MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAExUpIxlzehJH8SPXXBk5waTFpeY1mEWOXW+TlUwMj6Xq1xWayUxNDbA+lxxpxCcR+oKuQJPxVz9xkMS42egoeV2BLqX2BRArR/do7O6lIyLE9qHtAco1mtpGDeXt+l54m
+
+persistent:
+ name: agwc-claim
+
+ressources:
diff --git a/agw-deployer/helm/charts/agwc/templates/connectiond.deployment.yaml b/agw-deployer/helm/charts/agwc/templates/connectiond.deployment.yaml
new file mode 100644
index 0000000..d1a8d08
--- /dev/null
+++ b/agw-deployer/helm/charts/agwc/templates/connectiond.deployment.yaml
@@ -0,0 +1,38 @@
+{{/*
+# Copyright 2020 The Magma Authors.
+
+# This source code is licensed under the BSD-style license found in the
+# LICENSE file in the root directory of this source tree.
+
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+*/}}
+---
+{{- include "agwc.deployment" (list . "connectiond.deployment") -}}
+{{- define "connectiond.deployment" -}}
+metadata:
+ labels:
+ app.kubernetes.io/component: connectiond
+ name: connectiond
+spec:
+ selector:
+ matchLabels:
+ app.kubernetes.io/component: connectiond
+ template:
+ metadata:
+ labels:
+ app.kubernetes.io/component: connectiond
+ spec:
+ containers:
+ -
+{{ include "agwc.container" (list . "connectiond.container")}}
+{{- end -}}
+{{- define "connectiond.container" -}}
+name: connectiond
+args:
+ - /usr/local/bin/connectiond
+image: "{{ .Values.image.repository }}/agw_gateway_c{{ .Values.image.arch}}:{{ .Values.image.tag | default .Chart.AppVersion }}"
+{{- end -}}
diff --git a/agw-deployer/helm/charts/agwc/templates/control-proxy.config.yaml b/agw-deployer/helm/charts/agwc/templates/control-proxy.config.yaml
new file mode 100644
index 0000000..52bc9c0
--- /dev/null
+++ b/agw-deployer/helm/charts/agwc/templates/control-proxy.config.yaml
@@ -0,0 +1,36 @@
+{{/*
+# Copyright 2020 The Magma Authors.
+
+# This source code is licensed under the BSD-style license found in the
+# LICENSE file in the root directory of this source tree.
+
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+*/}}
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ labels:
+ app.kubernetes.io/component: control-proxy
+ name: controlproxy-config
+ namespace: {{ .Values.namespace }}
+ annotations:
+ "helm.sh/hook": "pre-install"
+ "helm.sh/hook-weight": "-5"
+data:
+ gw_challenge.b64: |
+ {{ print .Values.config.gwChallenge | trim | nospace }}
+ control_proxy.yml: |
+ # Cloud address for reaching out to the cloud.
+ cloud_address: controller.{{ .Values.config.domainName }}
+ cloud_port: 443
+
+ bootstrap_address: bootstrapper-controller.{{ .Values.config.domainName }}
+ bootstrap_port: 443
+
+ fluentd_address: fluentd.{{ .Values.config.domainName }}
+ fluentd_port: 24224
diff --git a/agw-deployer/helm/charts/agwc/templates/control-proxy.deployment.yaml b/agw-deployer/helm/charts/agwc/templates/control-proxy.deployment.yaml
new file mode 100644
index 0000000..01da7cd
--- /dev/null
+++ b/agw-deployer/helm/charts/agwc/templates/control-proxy.deployment.yaml
@@ -0,0 +1,41 @@
+{{/*
+# Copyright 2020 The Magma Authors.
+
+# This source code is licensed under the BSD-style license found in the
+# LICENSE file in the root directory of this source tree.
+
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+*/}}
+---
+{{- include "agwc.deployment" (list . "control-proxy.deployment") -}}
+{{- define "control-proxy.deployment" -}}
+metadata:
+ labels:
+ app.kubernetes.io/component: control-proxy
+ name: control-proxy
+spec:
+ selector:
+ matchLabels:
+ app.kubernetes.io/component: control-proxy
+ template:
+ metadata:
+ labels:
+ app.kubernetes.io/component: control-proxy
+ spec:
+ containers:
+ -
+{{ include "agwc.container" (list . "control-proxy.container")}}
+{{- end -}}
+{{- define "control-proxy.container" -}}
+name: control-proxy
+args:
+ - sh
+ - -c
+ - while [ ! -f /var/opt/magma/certs/gateway.crt ]; do sleep 1; done && /usr/local/bin/generate_nghttpx_config.py &&
+ /usr/bin/env nghttpx --conf /var/opt/magma/tmp/nghttpx.conf /var/opt/magma/certs/controller.key /var/opt/magma/certs/controller.crt
+image: "{{ .Values.image.repository }}/agw_gateway_python{{ .Values.image.arch}}:{{ .Values.image.tag | default .Chart.AppVersion }}"
+{{- end -}}
diff --git a/agw-deployer/helm/charts/agwc/templates/ctraced.deployment.yaml b/agw-deployer/helm/charts/agwc/templates/ctraced.deployment.yaml
new file mode 100644
index 0000000..a7ed73d
--- /dev/null
+++ b/agw-deployer/helm/charts/agwc/templates/ctraced.deployment.yaml
@@ -0,0 +1,41 @@
+{{/*
+# Copyright 2020 The Magma Authors.
+
+# This source code is licensed under the BSD-style license found in the
+# LICENSE file in the root directory of this source tree.
+
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+*/}}
+---
+{{- include "agwc.deployment" (list . "ctraced.deployment") -}}
+{{- define "ctraced.deployment" -}}
+metadata:
+ labels:
+ app.kubernetes.io/component: ctraced
+ name: ctraced
+spec:
+ selector:
+ matchLabels:
+ app.kubernetes.io/component: ctraced
+ template:
+ metadata:
+ labels:
+ app.kubernetes.io/component: ctraced
+ spec:
+ containers:
+ -
+{{ include "agwc.container" (list . "ctraced.container")}}
+{{- end -}}
+{{- define "ctraced.container" -}}
+name: ctraced
+args:
+ - /usr/bin/env
+ - python3
+ - -m
+ - magma.ctraced.main
+image: "{{ .Values.image.repository }}/agw_gateway_python{{ .Values.image.arch}}:{{ .Values.image.tag | default .Chart.AppVersion }}"
+{{- end -}}
diff --git a/agw-deployer/helm/charts/agwc/templates/directoryd.deployment.yaml b/agw-deployer/helm/charts/agwc/templates/directoryd.deployment.yaml
new file mode 100644
index 0000000..d49684c
--- /dev/null
+++ b/agw-deployer/helm/charts/agwc/templates/directoryd.deployment.yaml
@@ -0,0 +1,41 @@
+{{/*
+# Copyright 2020 The Magma Authors.
+
+# This source code is licensed under the BSD-style license found in the
+# LICENSE file in the root directory of this source tree.
+
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+*/}}
+---
+{{- include "agwc.deployment" (list . "directoryd.deployment") -}}
+{{- define "directoryd.deployment" -}}
+metadata:
+ labels:
+ app.kubernetes.io/component: directoryd
+ name: directoryd
+spec:
+ selector:
+ matchLabels:
+ app.kubernetes.io/component: directoryd
+ template:
+ metadata:
+ labels:
+ app.kubernetes.io/component: directoryd
+ spec:
+ containers:
+ -
+{{ include "agwc.container" (list . "directoryd.container")}}
+{{- end -}}
+{{- define "directoryd.container" -}}
+name: directoryd
+args:
+ - /usr/bin/env
+ - python3
+ - -m
+ - magma.directoryd.main
+image: "{{ .Values.image.repository }}/agw_gateway_python{{ .Values.image.arch}}:{{ .Values.image.tag | default .Chart.AppVersion }}"
+{{- end -}}
diff --git a/agw-deployer/helm/charts/agwc/templates/enodebd.deployment.yaml b/agw-deployer/helm/charts/agwc/templates/enodebd.deployment.yaml
new file mode 100644
index 0000000..48f2966
--- /dev/null
+++ b/agw-deployer/helm/charts/agwc/templates/enodebd.deployment.yaml
@@ -0,0 +1,41 @@
+{{/*
+# Copyright 2020 The Magma Authors.
+
+# This source code is licensed under the BSD-style license found in the
+# LICENSE file in the root directory of this source tree.
+
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+*/}}
+---
+{{- include "agwc.deployment" (list . "enodebd.deployment") -}}
+{{- define "enodebd.deployment" -}}
+metadata:
+ labels:
+ app.kubernetes.io/component: enodebd
+ name: enodebd
+spec:
+ selector:
+ matchLabels:
+ app.kubernetes.io/component: enodebd
+ template:
+ metadata:
+ labels:
+ app.kubernetes.io/component: enodebd
+ spec:
+ containers:
+ -
+{{ include "agwc.container" (list . "enodebd.container")}}
+{{- end -}}
+{{- define "enodebd.container" -}}
+name: enodebd
+args:
+ - /usr/bin/env
+ - python3
+ - -m
+ - magma.enodebd.main
+image: "{{ .Values.image.repository }}/agw_gateway_python{{ .Values.image.arch}}:{{ .Values.image.tag | default .Chart.AppVersion }}"
+{{- end -}}
diff --git a/agw-deployer/helm/charts/agwc/templates/eventd.deployment.yaml b/agw-deployer/helm/charts/agwc/templates/eventd.deployment.yaml
new file mode 100644
index 0000000..2edd93b
--- /dev/null
+++ b/agw-deployer/helm/charts/agwc/templates/eventd.deployment.yaml
@@ -0,0 +1,41 @@
+{{/*
+# Copyright 2020 The Magma Authors.
+
+# This source code is licensed under the BSD-style license found in the
+# LICENSE file in the root directory of this source tree.
+
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+*/}}
+---
+{{- include "agwc.deployment" (list . "eventd.deployment") -}}
+{{- define "eventd.deployment" -}}
+metadata:
+ labels:
+ app.kubernetes.io/component: eventd
+ name: eventd
+spec:
+ selector:
+ matchLabels:
+ app.kubernetes.io/component: eventd
+ template:
+ metadata:
+ labels:
+ app.kubernetes.io/component: eventd
+ spec:
+ containers:
+ -
+{{ include "agwc.container" (list . "eventd.container")}}
+{{- end -}}
+{{- define "eventd.container" -}}
+name: eventd
+args:
+ - /usr/bin/env
+ - python3
+ - -m
+ - magma.eventd.main
+image: "{{ .Values.image.repository }}/agw_gateway_python{{ .Values.image.arch}}:{{ .Values.image.tag | default .Chart.AppVersion }}"
+{{- end -}}
diff --git a/agw-deployer/helm/charts/agwc/templates/health.deployment.yaml b/agw-deployer/helm/charts/agwc/templates/health.deployment.yaml
new file mode 100644
index 0000000..3529472
--- /dev/null
+++ b/agw-deployer/helm/charts/agwc/templates/health.deployment.yaml
@@ -0,0 +1,41 @@
+{{/*
+# Copyright 2020 The Magma Authors.
+
+# This source code is licensed under the BSD-style license found in the
+# LICENSE file in the root directory of this source tree.
+
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+*/}}
+---
+{{- include "agwc.deployment" (list . "health.deployment") -}}
+{{- define "health.deployment" -}}
+metadata:
+ labels:
+ app.kubernetes.io/component: health
+ name: health
+spec:
+ selector:
+ matchLabels:
+ app.kubernetes.io/component: health
+ template:
+ metadata:
+ labels:
+ app.kubernetes.io/component: health
+ spec:
+ containers:
+ -
+{{ include "agwc.container" (list . "health.container")}}
+{{- end -}}
+{{- define "health.container" -}}
+name: health
+args:
+ - /usr/bin/env
+ - python3
+ - -m
+ - magma.health.main
+image: "{{ .Values.image.repository }}/agw_gateway_python{{ .Values.image.arch}}:{{ .Values.image.tag | default .Chart.AppVersion }}"
+{{- end -}}
diff --git a/agw-deployer/helm/charts/agwc/templates/magmad.deployment.yaml b/agw-deployer/helm/charts/agwc/templates/magmad.deployment.yaml
new file mode 100644
index 0000000..e898a1c
--- /dev/null
+++ b/agw-deployer/helm/charts/agwc/templates/magmad.deployment.yaml
@@ -0,0 +1,66 @@
+{{/*
+# Copyright 2020 The Magma Authors.
+
+# This source code is licensed under the BSD-style license found in the
+# LICENSE file in the root directory of this source tree.
+
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+*/}}
+---
+{{- include "agwc.deployment" (list . "magmad.deployment") -}}
+{{- define "magmad.deployment" -}}
+metadata:
+ labels:
+ app.kubernetes.io/component: magmad
+ name: magmad
+spec:
+ selector:
+ matchLabels:
+ app.kubernetes.io/component: magmad
+ template:
+ metadata:
+ labels:
+ app.kubernetes.io/component: magmad
+ spec:
+ volumes:
+ - name: magma-config
+ hostPath:
+ path: /etc/magma
+ type: Directory
+ - name: agwc-claim
+ persistentVolumeClaim:
+ claimName: agwc-claim
+ - name: snowflake-file
+ hostPath:
+ path: /etc/snowflake
+ type: FileOrCreate
+ - name: profile-file
+ hostPath:
+ path: /etc/profile
+ type: File
+ containers:
+ -
+{{ include "agwc.container" (list . "magmad.container")}}
+{{- end -}}
+{{- define "magmad.container" -}}
+name: magmad
+args:
+ - /usr/bin/env
+ - python3
+ - -m
+ - magma.magmad.main
+image: "{{ .Values.image.repository }}/agw_gateway_python{{ .Values.image.arch}}:{{ .Values.image.tag | default .Chart.AppVersion }}"
+volumeMounts:
+ - mountPath: /etc/magma
+ name: magma-config
+ - mountPath: /var/opt/magma
+ name: agwc-claim
+ - mountPath: /etc/snowflake
+ name: snowflake-file
+ - mountPath: /etc/profile
+ name: profile-file
+{{- end -}}
diff --git a/agw-deployer/helm/charts/agwc/templates/mobilityd.deployment.yaml b/agw-deployer/helm/charts/agwc/templates/mobilityd.deployment.yaml
new file mode 100644
index 0000000..1089e76
--- /dev/null
+++ b/agw-deployer/helm/charts/agwc/templates/mobilityd.deployment.yaml
@@ -0,0 +1,40 @@
+{{/*
+# Copyright 2020 The Magma Authors.
+
+# This source code is licensed under the BSD-style license found in the
+# LICENSE file in the root directory of this source tree.
+
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+*/}}
+---
+{{- include "agwc.deployment" (list . "mobilityd.deployment") -}}
+{{- define "mobilityd.deployment" -}}
+metadata:
+ labels:
+ app.kubernetes.io/component: mobilityd
+ name: mobilityd
+spec:
+ selector:
+ matchLabels:
+ app.kubernetes.io/component: mobilityd
+ template:
+ metadata:
+ labels:
+ app.kubernetes.io/component: mobilityd
+ spec:
+ containers:
+ -
+{{ include "agwc.container" (list . "mobilityd.container")}}
+{{- end -}}
+{{- define "mobilityd.container" -}}
+name: mobilityd
+args:
+ - /bin/bash
+ - -c
+ - sleep 1 && /usr/bin/env python3 -m magma.mobilityd.main
+image: "{{ .Values.image.repository }}/agw_gateway_python{{ .Values.image.arch}}:{{ .Values.image.tag | default .Chart.AppVersion }}"
+{{- end -}}
diff --git a/agw-deployer/helm/charts/agwc/templates/monitord.deployment.yaml b/agw-deployer/helm/charts/agwc/templates/monitord.deployment.yaml
new file mode 100644
index 0000000..ceffbeb
--- /dev/null
+++ b/agw-deployer/helm/charts/agwc/templates/monitord.deployment.yaml
@@ -0,0 +1,41 @@
+{{/*
+# Copyright 2020 The Magma Authors.
+
+# This source code is licensed under the BSD-style license found in the
+# LICENSE file in the root directory of this source tree.
+
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+*/}}
+---
+{{- include "agwc.deployment" (list . "monitord.deployment") -}}
+{{- define "monitord.deployment" -}}
+metadata:
+ labels:
+ app.kubernetes.io/component: monitord
+ name: monitord
+spec:
+ selector:
+ matchLabels:
+ app.kubernetes.io/component: monitord
+ template:
+ metadata:
+ labels:
+ app.kubernetes.io/component: monitord
+ spec:
+ containers:
+ -
+{{ include "agwc.container" (list . "monitord.container")}}
+{{- end -}}
+{{- define "monitord.container" -}}
+name: monitord
+args:
+ - /usr/bin/env
+ - python3
+ - -m
+ - magma.monitord.main
+image: "{{ .Values.image.repository }}/agw_gateway_python{{ .Values.image.arch}}:{{ .Values.image.tag | default .Chart.AppVersion }}"
+{{- end -}}
diff --git a/agw-deployer/helm/charts/agwc/templates/oai-mme.deployment.yaml b/agw-deployer/helm/charts/agwc/templates/oai-mme.deployment.yaml
new file mode 100644
index 0000000..9c144c7
--- /dev/null
+++ b/agw-deployer/helm/charts/agwc/templates/oai-mme.deployment.yaml
@@ -0,0 +1,71 @@
+{{/*
+# Copyright 2020 The Magma Authors.
+
+# This source code is licensed under the BSD-style license found in the
+# LICENSE file in the root directory of this source tree.
+
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+*/}}
+---
+{{- include "agwc.deployment" (list . "oai-mme.deployment") -}}
+{{- define "oai-mme.deployment" -}}
+metadata:
+ labels:
+ app.kubernetes.io/component: oai-mme
+ name: oai-mme
+spec:
+ selector:
+ matchLabels:
+ app.kubernetes.io/component: oai-mme
+ template:
+ metadata:
+ labels:
+ app.kubernetes.io/component: oai-mme
+ spec:
+ volumes:
+ - name: magma-config
+ hostPath:
+ path: /etc/magma
+ type: Directory
+ - name: agwc-claim
+ persistentVolumeClaim:
+ claimName: agwc-claim
+ - name: tmp-volume
+ hostPath:
+ path: /tmp
+ type: Directory
+ - name: ovs-volume
+ hostPath:
+ path: /var/run
+ type: Directory
+ containers:
+ -
+{{ include "agwc.container" (list . "oai-mme.container")}}
+{{- end -}}
+{{- define "oai-mme.container" -}}
+name: oai-mme
+args:
+ - /bin/bash
+ - -c
+ - /usr/local/bin/oai_mme -c /var/opt/magma/tmp/mme.conf -s /var/opt/magma/tmp/spgw.conf
+image: "{{ .Values.image.repository }}/agw_gateway_c{{ .Values.image.arch}}:{{ .Values.image.tag | default .Chart.AppVersion }}"
+securityContext:
+ privileged: true
+ capabilities:
+ add:
+ - NET_ADMIN
+ - NET_RAW
+volumeMounts:
+ - mountPath: /etc/magma
+ name: magma-config
+ - mountPath: /var/opt/magma
+ name: agwc-claim
+ - mountPath: /tmp
+ name: tmp-volume
+ - mountPath: /var/run
+ name: ovs-volume
+{{- end -}}
diff --git a/agw-deployer/helm/charts/agwc/templates/pipelined.deployment.yaml b/agw-deployer/helm/charts/agwc/templates/pipelined.deployment.yaml
new file mode 100644
index 0000000..ac1a0f0
--- /dev/null
+++ b/agw-deployer/helm/charts/agwc/templates/pipelined.deployment.yaml
@@ -0,0 +1,76 @@
+{{/*
+# Copyright 2020 The Magma Authors.
+
+# This source code is licensed under the BSD-style license found in the
+# LICENSE file in the root directory of this source tree.
+
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+*/}}
+---
+{{- include "agwc.deployment" (list . "pipelined.deployment") -}}
+{{- define "pipelined.deployment" -}}
+metadata:
+ labels:
+ app.kubernetes.io/component: pipelined
+ name: pipelined
+spec:
+ selector:
+ matchLabels:
+ app.kubernetes.io/component: pipelined
+ template:
+ metadata:
+ labels:
+ app.kubernetes.io/component: pipelined
+ spec:
+ volumes:
+ - name: magma-config
+ hostPath:
+ path: /etc/magma
+ type: Directory
+ - name: agwc-claim
+ persistentVolumeClaim:
+ claimName: agwc-claim
+ - name: tmp-volume
+ hostPath:
+ path: /tmp
+ type: Directory
+ - name: ovs-volume
+ hostPath:
+ path: /var/run
+ type: Directory
+ containers:
+ -
+{{ include "agwc.container" (list . "pipelined.container")}}
+{{- end -}}
+{{- define "pipelined.container" -}}
+name: pipelined
+args:
+ - /bin/bash
+ - -c
+ - /usr/bin/ovs-vsctl --all destroy Flow_Sample_Collector_Set &&
+ /usr/bin/ovs-vsctl set bridge gtp_br0 protocols=OpenFlow10,OpenFlow13,OpenFlow14 other-config:disable-in-band=true &&
+ /usr/bin/ovs-vsctl set-controller gtp_br0 tcp:127.0.0.1:6633 tcp:127.0.0.1:6654 &&
+ /usr/bin/ovs-vsctl set-fail-mode gtp_br0 secure &&
+ /usr/bin/ovs-vsctl set-manager ptcp:6640 &&
+ /usr/bin/env python3 -m magma.pipelined.main
+image: "{{ .Values.image.repository }}/agw_gateway_python{{ .Values.image.arch}}:{{ .Values.image.tag | default .Chart.AppVersion }}"
+securityContext:
+ privileged: true
+ capabilities:
+ add:
+ - NET_ADMIN
+ - NET_RAW
+volumeMounts:
+ - mountPath: /etc/magma
+ name: magma-config
+ - mountPath: /var/opt/magma
+ name: agwc-claim
+ - mountPath: /tmp
+ name: tmp-volume
+ - mountPath: /var/run
+ name: ovs-volume
+{{- end -}}
diff --git a/agw-deployer/helm/charts/agwc/templates/policydb.deployment.yaml b/agw-deployer/helm/charts/agwc/templates/policydb.deployment.yaml
new file mode 100644
index 0000000..3e4d717
--- /dev/null
+++ b/agw-deployer/helm/charts/agwc/templates/policydb.deployment.yaml
@@ -0,0 +1,41 @@
+{{/*
+# Copyright 2020 The Magma Authors.
+
+# This source code is licensed under the BSD-style license found in the
+# LICENSE file in the root directory of this source tree.
+
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+*/}}
+---
+{{- include "agwc.deployment" (list . "policydb.deployment") -}}
+{{- define "policydb.deployment" -}}
+metadata:
+ labels:
+ app.kubernetes.io/component: policydb
+ name: policydb
+spec:
+ selector:
+ matchLabels:
+ app.kubernetes.io/component: policydb
+ template:
+ metadata:
+ labels:
+ app.kubernetes.io/component: policydb
+ spec:
+ containers:
+ -
+{{ include "agwc.container" (list . "policydb.container")}}
+{{- end -}}
+{{- define "policydb.container" -}}
+name: policydb
+args:
+ - /usr/bin/env
+ - python3
+ - -m
+ - magma.policydb.main
+image: "{{ .Values.image.repository }}/agw_gateway_python{{ .Values.image.arch}}:{{ .Values.image.tag | default .Chart.AppVersion }}"
+{{- end -}}
diff --git a/agw-deployer/helm/charts/agwc/templates/redirectd.deployment.yaml b/agw-deployer/helm/charts/agwc/templates/redirectd.deployment.yaml
new file mode 100644
index 0000000..0d33fcd
--- /dev/null
+++ b/agw-deployer/helm/charts/agwc/templates/redirectd.deployment.yaml
@@ -0,0 +1,41 @@
+{{/*
+# Copyright 2020 The Magma Authors.
+
+# This source code is licensed under the BSD-style license found in the
+# LICENSE file in the root directory of this source tree.
+
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+*/}}
+---
+{{- include "agwc.deployment" (list . "redirectd.deployment") -}}
+{{- define "redirectd.deployment" -}}
+metadata:
+ labels:
+ app.kubernetes.io/component: redirectd
+ name: redirectd
+spec:
+ selector:
+ matchLabels:
+ app.kubernetes.io/component: redirectd
+ template:
+ metadata:
+ labels:
+ app.kubernetes.io/component: redirectd
+ spec:
+ containers:
+ -
+{{ include "agwc.container" (list . "redirectd.container")}}
+{{- end -}}
+{{- define "redirectd.container" -}}
+name: redirectd
+args:
+ - /usr/bin/env
+ - python3
+ - -m
+ - magma.redirectd.main
+image: "{{ .Values.image.repository }}/agw_gateway_python{{ .Values.image.arch}}:{{ .Values.image.tag | default .Chart.AppVersion }}"
+{{- end -}}
diff --git a/agw-deployer/helm/charts/agwc/templates/redis.deployment.yaml b/agw-deployer/helm/charts/agwc/templates/redis.deployment.yaml
new file mode 100644
index 0000000..d8f3f60
--- /dev/null
+++ b/agw-deployer/helm/charts/agwc/templates/redis.deployment.yaml
@@ -0,0 +1,43 @@
+{{/*
+# Copyright 2020 The Magma Authors.
+
+# This source code is licensed under the BSD-style license found in the
+# LICENSE file in the root directory of this source tree.
+
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+*/}}
+---
+{{- include "agwc.deployment" (list . "redis.deployment") -}}
+{{- define "redis.deployment" -}}
+metadata:
+ labels:
+ app.kubernetes.io/component: redis
+ name: redis
+spec:
+ selector:
+ matchLabels:
+ app.kubernetes.io/component: redis
+ template:
+ metadata:
+ labels:
+ app.kubernetes.io/component: redis
+ spec:
+ containers:
+ -
+{{ include "agwc.container" (list . "redis.container")}}
+{{- end -}}
+{{- define "redis.container" -}}
+name: redis
+args:
+ - /bin/bash
+ - -c
+ - |-
+ /usr/local/bin/generate_service_config.py --service=redis --template=redis &&
+ /usr/bin/redis-server /var/opt/magma/tmp/redis.conf --daemonize no &&
+ /usr/bin/redis-cli shutdown
+image: "{{ .Values.image.repository }}/agw_gateway_python{{ .Values.image.arch}}:{{ .Values.image.tag | default .Chart.AppVersion }}"
+{{- end -}}
diff --git a/agw-deployer/helm/charts/agwc/templates/sctpd.deployment.yaml b/agw-deployer/helm/charts/agwc/templates/sctpd.deployment.yaml
new file mode 100644
index 0000000..037c1d9
--- /dev/null
+++ b/agw-deployer/helm/charts/agwc/templates/sctpd.deployment.yaml
@@ -0,0 +1,69 @@
+{{/*
+# Copyright 2020 The Magma Authors.
+
+# This source code is licensed under the BSD-style license found in the
+# LICENSE file in the root directory of this source tree.
+
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+*/}}
+---
+{{- include "agwc.deployment" (list . "sctpd.deployment") -}}
+{{- define "sctpd.deployment" -}}
+metadata:
+ labels:
+ app.kubernetes.io/component: sctpd
+ name: sctpd
+spec:
+ selector:
+ matchLabels:
+ app.kubernetes.io/component: sctpd
+ template:
+ metadata:
+ labels:
+ app.kubernetes.io/component: sctpd
+ spec:
+ volumes:
+ - name: magma-config
+ hostPath:
+ path: /etc/magma
+ type: Directory
+ - name: agwc-claim
+ persistentVolumeClaim:
+ claimName: agwc-claim
+ - name: tmp-volume
+ hostPath:
+ path: /tmp
+ type: Directory
+ - name: ovs-volume
+ hostPath:
+ path: /var/run
+ type: Directory
+ containers:
+ -
+{{ include "agwc.container" (list . "sctpd.container")}}
+{{- end -}}
+{{- define "sctpd.container" -}}
+name: sctpd
+args:
+ - /usr/local/bin/sctpd
+image: "{{ .Values.image.repository }}/agw_gateway_c{{ .Values.image.arch}}:{{ .Values.image.tag | default .Chart.AppVersion }}"
+securityContext:
+ privileged: true
+ capabilities:
+ add:
+ - NET_ADMIN
+ - NET_RAW
+volumeMounts:
+ - mountPath: /etc/magma
+ name: magma-config
+ - mountPath: /var/opt/magma
+ name: agwc-claim
+ - mountPath: /tmp
+ name: tmp-volume
+ - mountPath: /var/run
+ name: ovs-volume
+{{- end -}}
diff --git a/agw-deployer/helm/charts/agwc/templates/sessiond.deployment.yaml b/agw-deployer/helm/charts/agwc/templates/sessiond.deployment.yaml
new file mode 100644
index 0000000..9e28dea
--- /dev/null
+++ b/agw-deployer/helm/charts/agwc/templates/sessiond.deployment.yaml
@@ -0,0 +1,44 @@
+{{/*
+# Copyright 2020 The Magma Authors.
+
+# This source code is licensed under the BSD-style license found in the
+# LICENSE file in the root directory of this source tree.
+
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+*/}}
+---
+{{- include "agwc.deployment" (list . "sessiond.deployment") -}}
+{{- define "sessiond.deployment" -}}
+metadata:
+ labels:
+ app.kubernetes.io/component: sessiond
+ name: sessiond
+spec:
+ selector:
+ matchLabels:
+ app.kubernetes.io/component: sessiond
+ template:
+ metadata:
+ labels:
+ app.kubernetes.io/component: sessiond
+ spec:
+ containers:
+ -
+{{ include "agwc.container" (list . "sessiond.container")}}
+{{- end -}}
+{{- define "sessiond.container" -}}
+name: sessiond
+args:
+ - sh
+ - -c
+ - mkdir -p /var/opt/magma/cores &&
+ sysctl -w kernel.core_pattern=/var/opt/magma/cores/core.%e.%t &&
+ /usr/local/bin/sessiond
+image: "{{ .Values.image.repository }}/agw_gateway_c{{ .Values.image.arch }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
+securityContext:
+ privileged: true
+{{- end -}}
diff --git a/agw-deployer/helm/charts/agwc/templates/smsd.deployment.yaml b/agw-deployer/helm/charts/agwc/templates/smsd.deployment.yaml
new file mode 100644
index 0000000..79c4138
--- /dev/null
+++ b/agw-deployer/helm/charts/agwc/templates/smsd.deployment.yaml
@@ -0,0 +1,41 @@
+{{/*
+# Copyright 2020 The Magma Authors.
+
+# This source code is licensed under the BSD-style license found in the
+# LICENSE file in the root directory of this source tree.
+
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+*/}}
+---
+{{- include "agwc.deployment" (list . "smsd.deployment") -}}
+{{- define "smsd.deployment" -}}
+metadata:
+ labels:
+ app.kubernetes.io/component: smsd
+ name: smsd
+spec:
+ selector:
+ matchLabels:
+ app.kubernetes.io/component: smsd
+ template:
+ metadata:
+ labels:
+ app.kubernetes.io/component: smsd
+ spec:
+ containers:
+ -
+{{ include "agwc.container" (list . "smsd.container")}}
+{{- end -}}
+{{- define "smsd.container" -}}
+name: smsd
+args:
+ - /usr/bin/env
+ - python3
+ - -m
+ - magma.smsd.main
+image: "{{ .Values.image.repository }}/agw_gateway_python{{ .Values.image.arch}}:{{ .Values.image.tag | default .Chart.AppVersion }}"
+{{- end -}}
diff --git a/agw-deployer/helm/charts/agwc/templates/state.deployment.yaml b/agw-deployer/helm/charts/agwc/templates/state.deployment.yaml
new file mode 100644
index 0000000..61eca3e
--- /dev/null
+++ b/agw-deployer/helm/charts/agwc/templates/state.deployment.yaml
@@ -0,0 +1,39 @@
+{{/*
+# Copyright 2020 The Magma Authors.
+
+# This source code is licensed under the BSD-style license found in the
+# LICENSE file in the root directory of this source tree.
+
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+*/}}
+---
+{{- include "agwc.deployment" (list . "state.deployment") -}}
+{{- define "state.deployment" -}}
+metadata:
+ name: state
+spec:
+ selector:
+ matchLabels:
+ app.kubernetes.io/component: state
+ template:
+ metadata:
+ labels:
+ app.kubernetes.io/component: state
+ spec:
+ containers:
+ -
+{{ include "agwc.container" (list . "state.container")}}
+{{- end -}}
+{{- define "state.container" -}}
+name: state
+args:
+ - /usr/bin/env
+ - python3
+ - -m
+ - magma.state.main
+image: "{{ .Values.image.repository }}/agw_gateway_python{{ .Values.image.arch}}:{{ .Values.image.tag | default .Chart.AppVersion }}"
+{{- end -}}
diff --git a/agw-deployer/helm/charts/agwc/templates/subscriberdb.deployment.yaml b/agw-deployer/helm/charts/agwc/templates/subscriberdb.deployment.yaml
new file mode 100644
index 0000000..b1f30fc
--- /dev/null
+++ b/agw-deployer/helm/charts/agwc/templates/subscriberdb.deployment.yaml
@@ -0,0 +1,41 @@
+{{/*
+# Copyright 2020 The Magma Authors.
+
+# This source code is licensed under the BSD-style license found in the
+# LICENSE file in the root directory of this source tree.
+
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+*/}}
+---
+{{- include "agwc.deployment" (list . "subscriberdb.deployment") -}}
+{{- define "subscriberdb.deployment" -}}
+metadata:
+ labels:
+ app.kubernetes.io/component: subscriberdb
+ name: subscriberdb
+spec:
+ selector:
+ matchLabels:
+ app.kubernetes.io/component: subscriberdb
+ template:
+ metadata:
+ labels:
+ app.kubernetes.io/component: subscriberdb
+ spec:
+ containers:
+ -
+{{ include "agwc.container" (list . "subscriberdb.container")}}
+{{- end -}}
+{{- define "subscriberdb.container" -}}
+name: subscriberdb
+args:
+ - /usr/bin/env
+ - python3
+ - -m
+ - magma.subscriberdb.main
+image: "{{ .Values.image.repository }}/agw_gateway_python{{ .Values.image.arch}}:{{ .Values.image.tag | default .Chart.AppVersion }}"
+{{- end -}}
diff --git a/agw-deployer/helm/charts/agwc/templates/td-agent-bit.deployment.yaml b/agw-deployer/helm/charts/agwc/templates/td-agent-bit.deployment.yaml
new file mode 100644
index 0000000..d8a2882
--- /dev/null
+++ b/agw-deployer/helm/charts/agwc/templates/td-agent-bit.deployment.yaml
@@ -0,0 +1,41 @@
+{{/*
+# Copyright 2020 The Magma Authors.
+
+# This source code is licensed under the BSD-style license found in the
+# LICENSE file in the root directory of this source tree.
+
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+*/}}
+---
+{{- include "agwc.deployment" (list . "td-agent-bit.deployment") -}}
+{{- define "td-agent-bit.deployment" -}}
+metadata:
+ labels:
+ app.kubernetes.io/component: td-agent-bit
+ name: td-agent-bit
+spec:
+ selector:
+ matchLabels:
+ app.kubernetes.io/component: td-agent-bit
+ template:
+ metadata:
+ labels:
+ app.kubernetes.io/component: td-agent-bit
+ spec:
+ containers:
+ -
+{{ include "agwc.container" (list . "td-agent-bit.container")}}
+{{- end -}}
+{{- define "td-agent-bit.container" -}}
+name: td-agent-bit
+args:
+ - /bin/bash
+ - -c
+ - mkdir -p /var/opt/magma/fluent-bit &&
+ /usr/local/bin/generate_fluent_bit_config.py && /opt/td-agent-bit/bin/td-agent-bit -c /var/opt/magma/tmp/td-agent-bit.conf
+image: "{{ .Values.image.repository }}/agw_gateway_python{{ .Values.image.arch}}:{{ .Values.image.tag | default .Chart.AppVersion }}"
+{{- end -}}
diff --git a/agw-deployer/helm/charts/agwc/values.yaml b/agw-deployer/helm/charts/agwc/values.yaml
new file mode 100644
index 0000000..25c2e00
--- /dev/null
+++ b/agw-deployer/helm/charts/agwc/values.yaml
@@ -0,0 +1,32 @@
+# Copyright 2020 The Magma Authors.
+
+# This source code is licensed under the BSD-style license found in the
+# LICENSE file in the root directory of this source tree.
+
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+---
+namespace: magma
+
+# Define which secrets should be mounted by pods.
+secret:
+ certs: agwc-secret-certs
+
+image:
+ repository: linuxfoundation.jfrog.io/magma-docker-test
+ pullPolicy: IfNotPresent
+ # Overrides the image tag whose default is the chart appVersion.
+ tag: "1.8"
+ arch: ""
+
+config:
+ domainName: magma.local
+ gwChallenge: MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAExUpIxlzehJH8SPXXBk5waTFpeY1mEWOXW+TlUwMj6Xq1xWayUxNDbA+lxxpxCcR+oKuQJPxVz9xkMS42egoeV2BLqX2BRArR/do7O6lIyLE9qHtAco1mtpGDeXt+l54m
+
+persistent:
+ name: agwc-claim
+
+ressources:
diff --git a/agw-deployer/helm/charts/grafana/.helmignore b/agw-deployer/helm/charts/grafana/.helmignore
new file mode 100644
index 0000000..8cade13
--- /dev/null
+++ b/agw-deployer/helm/charts/grafana/.helmignore
@@ -0,0 +1,23 @@
+# Patterns to ignore when building packages.
+# This supports shell glob matching, relative path matching, and
+# negation (prefixed with !). Only one pattern per line.
+.DS_Store
+# Common VCS dirs
+.git/
+.gitignore
+.bzr/
+.bzrignore
+.hg/
+.hgignore
+.svn/
+# Common backup files
+*.swp
+*.bak
+*.tmp
+*~
+# Various IDEs
+.vscode
+.project
+.idea/
+*.tmproj
+OWNERS
diff --git a/agw-deployer/helm/charts/grafana/Chart.yaml b/agw-deployer/helm/charts/grafana/Chart.yaml
new file mode 100644
index 0000000..095d58e
--- /dev/null
+++ b/agw-deployer/helm/charts/grafana/Chart.yaml
@@ -0,0 +1,22 @@
+apiVersion: v2
+appVersion: 7.3.5
+description: The leading tool for querying and visualizing time series and metrics.
+home: https://grafana.net
+icon: https://raw.githubusercontent.com/grafana/grafana/master/public/img/logo_transparent_400x.png
+kubeVersion: ^1.8.0-0
+maintainers:
+- email: zanhsieh@gmail.com
+ name: zanhsieh
+- email: rluckie@cisco.com
+ name: rtluckie
+- email: maor.friedman@redhat.com
+ name: maorfr
+- email: miroslav.hadzhiev@gmail.com
+ name: Xtigyro
+- email: mail@torstenwalter.de
+ name: torstenwalter
+name: grafana
+sources:
+- https://github.com/grafana/grafana
+type: application
+version: 6.2.1
diff --git a/agw-deployer/helm/charts/grafana/README.md b/agw-deployer/helm/charts/grafana/README.md
new file mode 100644
index 0000000..3e3d784
--- /dev/null
+++ b/agw-deployer/helm/charts/grafana/README.md
@@ -0,0 +1,526 @@
+# Grafana Helm Chart
+
+* Installs the web dashboarding system [Grafana](http://grafana.org/)
+
+## Get Repo Info
+
+```console
+helm repo add grafana https://grafana.github.io/helm-charts
+helm repo update
+```
+
+_See [helm repo](https://helm.sh/docs/helm/helm_repo/) for command documentation._
+
+## Installing the Chart
+
+To install the chart with the release name `my-release`:
+
+```console
+helm install my-release grafana/grafana
+```
+
+## Uninstalling the Chart
+
+To uninstall/delete the my-release deployment:
+
+```console
+helm delete my-release
+```
+
+The command removes all the Kubernetes components associated with the chart and deletes the release.
+
+## Upgrading an existing Release to a new major version
+
+A major chart version change (like v1.2.3 -> v2.0.0) indicates that there is an
+incompatible breaking change needing manual actions.
+
+### To 4.0.0 (And 3.12.1)
+
+This version requires Helm >= 2.12.0.
+
+### To 5.0.0
+
+You have to add --force to your helm upgrade command as the labels of the chart have changed.
+
+### To 6.0.0
+
+This version requires Helm >= 3.1.0.
+
+## Configuration
+
+| Parameter | Description | Default |
+|-------------------------------------------|-----------------------------------------------|---------------------------------------------------------|
+| `replicas` | Number of nodes | `1` |
+| `podDisruptionBudget.minAvailable` | Pod disruption minimum available | `nil` |
+| `podDisruptionBudget.maxUnavailable` | Pod disruption maximum unavailable | `nil` |
+| `deploymentStrategy` | Deployment strategy | `{ "type": "RollingUpdate" }` |
+| `livenessProbe` | Liveness Probe settings | `{ "httpGet": { "path": "/api/health", "port": 3000 } "initialDelaySeconds": 60, "timeoutSeconds": 30, "failureThreshold": 10 }` |
+| `readinessProbe` | Readiness Probe settings | `{ "httpGet": { "path": "/api/health", "port": 3000 } }`|
+| `securityContext` | Deployment securityContext | `{"runAsUser": 472, "runAsGroup": 472, "fsGroup": 472}` |
+| `priorityClassName` | Name of Priority Class to assign pods | `nil` |
+| `image.repository` | Image repository | `grafana/grafana` |
+| `image.tag` | Image tag (`Must be >= 5.0.0`) | `7.0.3` |
+| `image.sha` | Image sha (optional) | `17cbd08b9515fda889ca959e9d72ee6f3327c8f1844a3336dfd952134f38e2fe` |
+| `image.pullPolicy` | Image pull policy | `IfNotPresent` |
+| `image.pullSecrets` | Image pull secrets | `{}` |
+| `service.type` | Kubernetes service type | `ClusterIP` |
+| `service.port` | Kubernetes port where service is exposed | `80` |
+| `service.portName` | Name of the port on the service | `service` |
+| `service.targetPort` | Internal service is port | `3000` |
+| `service.nodePort` | Kubernetes service nodePort | `nil` |
+| `service.annotations` | Service annotations | `{}` |
+| `service.labels` | Custom labels | `{}` |
+| `service.clusterIP` | internal cluster service IP | `nil` |
+| `service.loadBalancerIP` | IP address to assign to load balancer (if supported) | `nil` |
+| `service.loadBalancerSourceRanges` | list of IP CIDRs allowed access to lb (if supported) | `[]` |
+| `service.externalIPs` | service external IP addresses | `[]` |
+| `extraExposePorts` | Additional service ports for sidecar containers| `[]` |
+| `hostAliases` | adds rules to the pod's /etc/hosts | `[]` |
+| `ingress.enabled` | Enables Ingress | `false` |
+| `ingress.annotations` | Ingress annotations (values are templated) | `{}` |
+| `ingress.labels` | Custom labels | `{}` |
+| `ingress.path` | Ingress accepted path | `/` |
+| `ingress.hosts` | Ingress accepted hostnames | `["chart-example.local"]` |
+| `ingress.extraPaths` | Ingress extra paths to prepend to every host configuration. Useful when configuring [custom actions with AWS ALB Ingress Controller](https://kubernetes-sigs.github.io/aws-alb-ingress-controller/guide/ingress/annotation/#actions). | `[]` |
+| `ingress.tls` | Ingress TLS configuration | `[]` |
+| `resources` | CPU/Memory resource requests/limits | `{}` |
+| `nodeSelector` | Node labels for pod assignment | `{}` |
+| `tolerations` | Toleration labels for pod assignment | `[]` |
+| `affinity` | Affinity settings for pod assignment | `{}` |
+| `extraInitContainers` | Init containers to add to the grafana pod | `{}` |
+| `extraContainers` | Sidecar containers to add to the grafana pod | `{}` |
+| `extraContainerVolumes` | Volumes that can be mounted in sidecar containers | `[]` |
+| `schedulerName` | Name of the k8s scheduler (other than default) | `nil` |
+| `persistence.enabled` | Use persistent volume to store data | `false` |
+| `persistence.type` | Type of persistence (`pvc` or `statefulset`) | `pvc` |
+| `persistence.size` | Size of persistent volume claim | `10Gi` |
+| `persistence.existingClaim` | Use an existing PVC to persist data | `nil` |
+| `persistence.storageClassName` | Type of persistent volume claim | `nil` |
+| `persistence.accessModes` | Persistence access modes | `[ReadWriteOnce]` |
+| `persistence.annotations` | PersistentVolumeClaim annotations | `{}` |
+| `persistence.finalizers` | PersistentVolumeClaim finalizers | `[ "kubernetes.io/pvc-protection" ]` |
+| `persistence.subPath` | Mount a sub dir of the persistent volume | `nil` |
+| `initChownData.enabled` | If false, don't reset data ownership at startup | true |
+| `initChownData.image.repository` | init-chown-data container image repository | `busybox` |
+| `initChownData.image.tag` | init-chown-data container image tag | `1.31.1` |
+| `initChownData.image.sha` | init-chown-data container image sha (optional)| `""` |
+| `initChownData.image.pullPolicy` | init-chown-data container image pull policy | `IfNotPresent` |
+| `initChownData.resources` | init-chown-data pod resource requests & limits | `{}` |
+| `schedulerName` | Alternate scheduler name | `nil` |
+| `env` | Extra environment variables passed to pods | `{}` |
+| `envValueFrom` | Environment variables from alternate sources. See the API docs on [EnvVarSource](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.17/#envvarsource-v1-core) for format details. | `{}` |
+| `envFromSecret` | Name of a Kubernetes secret (must be manually created in the same namespace) containing values to be added to the environment. Can be templated | `""` |
+| `envRenderSecret` | Sensible environment variables passed to pods and stored as secret | `{}` |
+| `extraSecretMounts` | Additional grafana server secret mounts | `[]` |
+| `extraVolumeMounts` | Additional grafana server volume mounts | `[]` |
+| `extraConfigmapMounts` | Additional grafana server configMap volume mounts | `[]` |
+| `extraEmptyDirMounts` | Additional grafana server emptyDir volume mounts | `[]` |
+| `plugins` | Plugins to be loaded along with Grafana | `[]` |
+| `datasources` | Configure grafana datasources (passed through tpl) | `{}` |
+| `notifiers` | Configure grafana notifiers | `{}` |
+| `dashboardProviders` | Configure grafana dashboard providers | `{}` |
+| `dashboards` | Dashboards to import | `{}` |
+| `dashboardsConfigMaps` | ConfigMaps reference that contains dashboards | `{}` |
+| `grafana.ini` | Grafana's primary configuration | `{}` |
+| `ldap.enabled` | Enable LDAP authentication | `false` |
+| `ldap.existingSecret` | The name of an existing secret containing the `ldap.toml` file, this must have the key `ldap-toml`. | `""` |
+| `ldap.config` | Grafana's LDAP configuration | `""` |
+| `annotations` | Deployment annotations | `{}` |
+| `labels` | Deployment labels | `{}` |
+| `podAnnotations` | Pod annotations | `{}` |
+| `podLabels` | Pod labels | `{}` |
+| `podPortName` | Name of the grafana port on the pod | `grafana` |
+| `sidecar.image.repository` | Sidecar image repository | `kiwigrid/k8s-sidecar` |
+| `sidecar.image.tag` | Sidecar image tag | `1.1.0` |
+| `sidecar.image.sha` | Sidecar image sha (optional) | `""` |
+| `sidecar.imagePullPolicy` | Sidecar image pull policy | `IfNotPresent` |
+| `sidecar.resources` | Sidecar resources | `{}` |
+| `sidecar.enableUniqueFilenames` | Sets the kiwigrid/k8s-sidecar UNIQUE_FILENAMES environment variable | `false` |
+| `sidecar.dashboards.enabled` | Enables the cluster wide search for dashboards and adds/updates/deletes them in grafana | `false` |
+| `sidecar.dashboards.SCProvider` | Enables creation of sidecar provider | `true` |
+| `sidecar.dashboards.provider.name` | Unique name of the grafana provider | `sidecarProvider` |
+| `sidecar.dashboards.provider.orgid` | Id of the organisation, to which the dashboards should be added | `1` |
+| `sidecar.dashboards.provider.folder` | Logical folder in which grafana groups dashboards | `""` |
+| `sidecar.dashboards.provider.disableDelete` | Activate to avoid the deletion of imported dashboards | `false` |
+| `sidecar.dashboards.provider.allowUiUpdates` | Allow updating provisioned dashboards from the UI | `false` |
+| `sidecar.dashboards.provider.type` | Provider type | `file` |
+| `sidecar.dashboards.provider.foldersFromFilesStructure` | Allow Grafana to replicate dashboard structure from filesystem. | `false` |
+| `sidecar.dashboards.watchMethod` | Method to use to detect ConfigMap changes. With WATCH the sidecar will do a WATCH requests, with SLEEP it will list all ConfigMaps, then sleep for 60 seconds. | `WATCH` |
+| `sidecar.skipTlsVerify` | Set to true to skip tls verification for kube api calls | `nil` |
+| `sidecar.dashboards.label` | Label that config maps with dashboards should have to be added | `grafana_dashboard` |
+| `sidecar.dashboards.labelValue` | Label value that config maps with dashboards should have to be added | `nil` |
+| `sidecar.dashboards.folder` | Folder in the pod that should hold the collected dashboards (unless `sidecar.dashboards.defaultFolderName` is set). This path will be mounted. | `/tmp/dashboards` |
+| `sidecar.dashboards.folderAnnotation` | The annotation the sidecar will look for in configmaps to override the destination folder for files | `nil` |
+| `sidecar.dashboards.defaultFolderName` | The default folder name, it will create a subfolder under the `sidecar.dashboards.folder` and put dashboards in there instead | `nil` |
+| `sidecar.dashboards.searchNamespace` | If specified, the sidecar will search for dashboard config-maps inside this namespace. Otherwise the namespace in which the sidecar is running will be used. It's also possible to specify ALL to search in all namespaces | `nil` |
+| `sidecar.datasources.enabled` | Enables the cluster wide search for datasources and adds/updates/deletes them in grafana |`false` |
+| `sidecar.datasources.label` | Label that config maps with datasources should have to be added | `grafana_datasource` |
+| `sidecar.datasources.labelValue` | Label value that config maps with datasources should have to be added | `nil` |
+| `sidecar.datasources.searchNamespace` | If specified, the sidecar will search for datasources config-maps inside this namespace. Otherwise the namespace in which the sidecar is running will be used. It's also possible to specify ALL to search in all namespaces | `nil` |
+| `sidecar.notifiers.enabled` | Enables the cluster wide search for notifiers and adds/updates/deletes them in grafana | `false` |
+| `sidecar.notifiers.label` | Label that config maps with notifiers should have to be added | `grafana_notifier` |
+| `sidecar.notifiers.searchNamespace` | If specified, the sidecar will search for notifiers config-maps (or secrets) inside this namespace. Otherwise the namespace in which the sidecar is running will be used. It's also possible to specify ALL to search in all namespaces | `nil` |
+| `smtp.existingSecret` | The name of an existing secret containing the SMTP credentials. | `""` |
+| `smtp.userKey` | The key in the existing SMTP secret containing the username. | `"user"` |
+| `smtp.passwordKey` | The key in the existing SMTP secret containing the password. | `"password"` |
+| `admin.existingSecret` | The name of an existing secret containing the admin credentials. | `""` |
+| `admin.userKey` | The key in the existing admin secret containing the username. | `"admin-user"` |
+| `admin.passwordKey` | The key in the existing admin secret containing the password. | `"admin-password"` |
+| `serviceAccount.annotations` | ServiceAccount annotations | |
+| `serviceAccount.create` | Create service account | `true` |
+| `serviceAccount.name` | Service account name to use, when empty will be set to created account if `serviceAccount.create` is set else to `default` | `` |
+| `serviceAccount.nameTest` | Service account name to use for test, when empty will be set to created account if `serviceAccount.create` is set else to `default` | `nil` |
+| `rbac.create` | Create and use RBAC resources | `true` |
+| `rbac.namespaced` | Creates Role and Rolebinding instead of the default ClusterRole and ClusteRoleBindings for the grafana instance | `false` |
+| `rbac.useExistingRole` | Set to a rolename to use existing role - skipping role creating - but still doing serviceaccount and rolebinding to the rolename set here. | `nil` |
+| `rbac.pspEnabled` | Create PodSecurityPolicy (with `rbac.create`, grant roles permissions as well) | `true` |
+| `rbac.pspUseAppArmor` | Enforce AppArmor in created PodSecurityPolicy (requires `rbac.pspEnabled`) | `true` |
+| `rbac.extraRoleRules` | Additional rules to add to the Role | [] |
+| `rbac.extraClusterRoleRules` | Additional rules to add to the ClusterRole | [] |
+| `command` | Define command to be executed by grafana container at startup | `nil` |
+| `testFramework.enabled` | Whether to create test-related resources | `true` |
+| `testFramework.image` | `test-framework` image repository. | `bats/bats` |
+| `testFramework.tag` | `test-framework` image tag. | `v1.1.0` |
+| `testFramework.imagePullPolicy` | `test-framework` image pull policy. | `IfNotPresent` |
+| `testFramework.securityContext` | `test-framework` securityContext | `{}` |
+| `downloadDashboards.env` | Environment variables to be passed to the `download-dashboards` container | `{}` |
+| `downloadDashboards.resources` | Resources of `download-dashboards` container | `{}` |
+| `downloadDashboardsImage.repository` | Curl docker image repo | `curlimages/curl` |
+| `downloadDashboardsImage.tag` | Curl docker image tag | `7.73.0` |
+| `downloadDashboardsImage.sha` | Curl docker image sha (optional) | `""` |
+| `downloadDashboardsImage.pullPolicy` | Curl docker image pull policy | `IfNotPresent` |
+| `namespaceOverride` | Override the deployment namespace | `""` (`Release.Namespace`) |
+| `serviceMonitor.enabled` | Use servicemonitor from prometheus operator | `false` |
+| `serviceMonitor.namespace` | Namespace this servicemonitor is installed in | |
+| `serviceMonitor.interval` | How frequently Prometheus should scrape | `1m` |
+| `serviceMonitor.path` | Path to scrape | `/metrics` |
+| `serviceMonitor.scheme` | Scheme to use for metrics scraping | `http` |
+| `serviceMonitor.tlsConfig` | TLS configuration block for the endpoint | `{}` |
+| `serviceMonitor.labels` | Labels for the servicemonitor passed to Prometheus Operator | `{}` |
+| `serviceMonitor.scrapeTimeout` | Timeout after which the scrape is ended | `30s` |
+| `serviceMonitor.relabelings` | MetricRelabelConfigs to apply to samples before ingestion. | `[]` |
+| `revisionHistoryLimit` | Number of old ReplicaSets to retain | `10` |
+| `imageRenderer.enabled` | Enable the image-renderer deployment & service | `false` |
+| `imageRenderer.image.repository` | image-renderer Image repository | `grafana/grafana-image-renderer` |
+| `imageRenderer.image.tag` | image-renderer Image tag | `latest` |
+| `imageRenderer.image.sha` | image-renderer Image sha (optional) | `""` |
+| `imageRenderer.image.pullPolicy` | image-renderer ImagePullPolicy | `Always` |
+| `imageRenderer.env` | extra env-vars for image-renderer | `{}` |
+| `imageRenderer.serviceAccountName` | image-renderer deployment serviceAccountName | `""` |
+| `imageRenderer.securityContext` | image-renderer deployment securityContext | `{}` |
+| `imageRenderer.hostAliases` | image-renderer deployment Host Aliases | `[]` |
+| `imageRenderer.priorityClassName` | image-renderer deployment priority class | `''` |
+| `imageRenderer.service.portName` | image-renderer service port name | `'http'` |
+| `imageRenderer.service.port` | image-renderer service port used by both service and deployment | `8081` |
+| `imageRenderer.podPortName` | name of the image-renderer port on the pod | `http` |
+| `imageRenderer.revisionHistoryLimit` | number of image-renderer replica sets to keep | `10` |
+| `imageRenderer.networkPolicy.limitIngress` | Enable a NetworkPolicy to limit inbound traffic from only the created grafana pods | `true` |
+| `imageRenderer.networkPolicy.limitEgress` | Enable a NetworkPolicy to limit outbound traffic to only the created grafana pods | `false` |
+| `imageRenderer.resources` | Set resource limits for image-renderer pdos | `{}` |
+
+### Example ingress with path
+
+With grafana 6.3 and above
+```yaml
+grafana.ini:
+ server:
+ domain: monitoring.example.com
+ root_url: "%(protocol)s://%(domain)s/grafana"
+ serve_from_sub_path: true
+ingress:
+ enabled: true
+ hosts:
+ - "monitoring.example.com"
+ path: "/grafana"
+```
+
+### Example of extraVolumeMounts
+
+```yaml
+- extraVolumeMounts:
+ - name: plugins
+ mountPath: /var/lib/grafana/plugins
+ subPath: configs/grafana/plugins
+ existingClaim: existing-grafana-claim
+ readOnly: false
+```
+
+## Import dashboards
+
+There are a few methods to import dashboards to Grafana. Below are some examples and explanations as to how to use each method:
+
+```yaml
+dashboards:
+ default:
+ some-dashboard:
+ json: |
+ {
+ "annotations":
+
+ ...
+ # Complete json file here
+ ...
+
+ "title": "Some Dashboard",
+ "uid": "abcd1234",
+ "version": 1
+ }
+ custom-dashboard:
+ # This is a path to a file inside the dashboards directory inside the chart directory
+ file: dashboards/custom-dashboard.json
+ prometheus-stats:
+ # Ref: https://grafana.com/dashboards/2
+ gnetId: 2
+ revision: 2
+ datasource: Prometheus
+ local-dashboard:
+ url: https://raw.githubusercontent.com/user/repository/master/dashboards/dashboard.json
+```
+
+## BASE64 dashboards
+
+Dashboards could be stored on a server that does not return JSON directly and instead of it returns a Base64 encoded file (e.g. Gerrit)
+A new parameter has been added to the url use case so if you specify a b64content value equals to true after the url entry a Base64 decoding is applied before save the file to disk.
+If this entry is not set or is equals to false not decoding is applied to the file before saving it to disk.
+
+### Gerrit use case
+
+Gerrit API for download files has the following schema: where {project-name} and
+{file-id} usually has '/' in their values and so they MUST be replaced by %2F so if project-name is user/repo, branch-id is master and file-id is equals to dir1/dir2/dashboard
+the url value is
+
+## Sidecar for dashboards
+
+If the parameter `sidecar.dashboards.enabled` is set, a sidecar container is deployed in the grafana
+pod. This container watches all configmaps (or secrets) in the cluster and filters out the ones with
+a label as defined in `sidecar.dashboards.label`. The files defined in those configmaps are written
+to a folder and accessed by grafana. Changes to the configmaps are monitored and the imported
+dashboards are deleted/updated.
+
+A recommendation is to use one configmap per dashboard, as a reduction of multiple dashboards inside
+one configmap is currently not properly mirrored in grafana.
+
+Example dashboard config:
+
+```yaml
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: sample-grafana-dashboard
+ labels:
+ grafana_dashboard: "1"
+data:
+ k8s-dashboard.json: |-
+ [...]
+```
+
+## Sidecar for datasources
+
+If the parameter `sidecar.datasources.enabled` is set, an init container is deployed in the grafana
+pod. This container lists all secrets (or configmaps, though not recommended) in the cluster and
+filters out the ones with a label as defined in `sidecar.datasources.label`. The files defined in
+those secrets are written to a folder and accessed by grafana on startup. Using these yaml files,
+the data sources in grafana can be imported. The secrets must be created before `helm install` so
+that the datasources init container can list the secrets.
+
+Secrets are recommended over configmaps for this usecase because datasources usually contain private
+data like usernames and passwords. Secrets are the more appropriate cluster resource to manage those.
+
+Example datasource config adapted from [Grafana](http://docs.grafana.org/administration/provisioning/#example-datasource-config-file):
+
+```yaml
+apiVersion: v1
+kind: Secret
+metadata:
+ name: sample-grafana-datasource
+ labels:
+ grafana_datasource: "1"
+type: Opaque
+stringData:
+ datasource.yaml: |-
+ # config file version
+ apiVersion: 1
+
+ # list of datasources that should be deleted from the database
+ deleteDatasources:
+ - name: Graphite
+ orgId: 1
+
+ # list of datasources to insert/update depending
+ # whats available in the database
+ datasources:
+ # name of the datasource. Required
+ - name: Graphite
+ # datasource type. Required
+ type: graphite
+ # access mode. proxy or direct (Server or Browser in the UI). Required
+ access: proxy
+ # org id. will default to orgId 1 if not specified
+ orgId: 1
+ # url
+ url: http://localhost:8080
+ # database password, if used
+ password:
+ # database user, if used
+ user:
+ # database name, if used
+ database:
+ # enable/disable basic auth
+ basicAuth:
+ # basic auth username
+ basicAuthUser:
+ # basic auth password
+ basicAuthPassword:
+ # enable/disable with credentials headers
+ withCredentials:
+ # mark as default datasource. Max one per org
+ isDefault:
+ # fields that will be converted to json and stored in json_data
+ jsonData:
+ graphiteVersion: "1.1"
+ tlsAuth: true
+ tlsAuthWithCACert: true
+ # json object of data that will be encrypted.
+ secureJsonData:
+ tlsCACert: "..."
+ tlsClientCert: "..."
+ tlsClientKey: "..."
+ version: 1
+ # allow users to edit datasources from the UI.
+ editable: false
+
+```
+
+## Sidecar for notifiers
+
+If the parameter `sidecar.notifiers.enabled` is set, an init container is deployed in the grafana
+pod. This container lists all secrets (or configmaps, though not recommended) in the cluster and
+filters out the ones with a label as defined in `sidecar.notifiers.label`. The files defined in
+those secrets are written to a folder and accessed by grafana on startup. Using these yaml files,
+the notification channels in grafana can be imported. The secrets must be created before
+`helm install` so that the notifiers init container can list the secrets.
+
+Secrets are recommended over configmaps for this usecase because alert notification channels usually contain
+private data like SMTP usernames and passwords. Secrets are the more appropriate cluster resource to manage those.
+
+Example datasource config adapted from [Grafana](https://grafana.com/docs/grafana/latest/administration/provisioning/#alert-notification-channels):
+
+```yaml
+notifiers:
+ - name: notification-channel-1
+ type: slack
+ uid: notifier1
+ # either
+ org_id: 2
+ # or
+ org_name: Main Org.
+ is_default: true
+ send_reminder: true
+ frequency: 1h
+ disable_resolve_message: false
+ # See `Supported Settings` section for settings supporter for each
+ # alert notification type.
+ settings:
+ recipient: 'XXX'
+ token: 'xoxb'
+ uploadImage: true
+ url: https://slack.com
+
+delete_notifiers:
+ - name: notification-channel-1
+ uid: notifier1
+ org_id: 2
+ - name: notification-channel-2
+ # default org_id: 1
+```
+
+## How to serve Grafana with a path prefix (/grafana)
+
+In order to serve Grafana with a prefix (e.g., ), add the following to your values.yaml.
+
+```yaml
+ingress:
+ enabled: true
+ annotations:
+ kubernetes.io/ingress.class: "nginx"
+ nginx.ingress.kubernetes.io/rewrite-target: /$1
+ nginx.ingress.kubernetes.io/use-regex: "true"
+
+ path: /grafana/?(.*)
+ hosts:
+ - k8s.example.dev
+
+grafana.ini:
+ server:
+ root_url: http://localhost:3000/grafana # this host can be localhost
+```
+
+## How to securely reference secrets in grafana.ini
+
+This example uses Grafana uses [file providers](https://grafana.com/docs/grafana/latest/administration/configuration/#file-provider) for secret values and the `extraSecretMounts` configuration flag (Additional grafana server secret mounts) to mount the secrets.
+
+In grafana.ini:
+
+```yaml
+grafana.ini:
+ [auth.generic_oauth]
+ enabled = true
+ client_id = $__file{/etc/secrets/auth_generic_oauth/client_id}
+ client_secret = $__file{/etc/secrets/auth_generic_oauth/client_secret}
+```
+
+Existing secret, or created along with helm:
+
+```yaml
+---
+apiVersion: v1
+kind: Secret
+metadata:
+ name: auth-generic-oauth-secret
+type: Opaque
+stringData:
+ client_id:
+ client_secret:
+```
+
+Include in the `extraSecretMounts` configuration flag:
+
+```yaml
+- extraSecretMounts:
+ - name: auth-generic-oauth-secret-mount
+ secretName: auth-generic-oauth-secret
+ defaultMode: 0440
+ mountPath: /etc/secrets/auth_generic_oauth
+ readOnly: true
+```
+
+### extraSecretMounts using a Container Storage Interface (CSI) provider
+
+This example uses a CSI driver e.g. retrieving secrets using [Azure Key Vault Provider](https://github.com/Azure/secrets-store-csi-driver-provider-azure)
+
+```yaml
+- extraSecretMounts:
+ - name: secrets-store-inline
+ mountPath: /run/secrets
+ readOnly: true
+ csi:
+ driver: secrets-store.csi.k8s.io
+ readOnly: true
+ volumeAttributes:
+ secretProviderClass: "my-provider"
+ nodePublishSecretRef:
+ name: akv-creds
+```
+
+## Image Renderer Plug-In
+
+This chart supports enabling [remote image rendering](https://github.com/grafana/grafana-image-renderer/blob/master/docs/remote_rendering_using_docker.md)
+
+```yaml
+imageRenderer:
+ enabled: true
+```
+
+### Image Renderer NetworkPolicy
+
+By default the image-renderer pods will have a network policy which only allows ingress traffic from the created grafana instance
diff --git a/agw-deployer/helm/charts/grafana/ci/default-values.yaml b/agw-deployer/helm/charts/grafana/ci/default-values.yaml
new file mode 100644
index 0000000..fc2ba60
--- /dev/null
+++ b/agw-deployer/helm/charts/grafana/ci/default-values.yaml
@@ -0,0 +1 @@
+# Leave this file empty to ensure that CI runs builds against the default configuration in values.yaml.
diff --git a/agw-deployer/helm/charts/grafana/ci/with-dashboard-json-values.yaml b/agw-deployer/helm/charts/grafana/ci/with-dashboard-json-values.yaml
new file mode 100644
index 0000000..e0c4e41
--- /dev/null
+++ b/agw-deployer/helm/charts/grafana/ci/with-dashboard-json-values.yaml
@@ -0,0 +1,53 @@
+dashboards:
+ my-provider:
+ my-awesome-dashboard:
+ # An empty but valid dashboard
+ json: |
+ {
+ "__inputs": [],
+ "__requires": [
+ {
+ "type": "grafana",
+ "id": "grafana",
+ "name": "Grafana",
+ "version": "6.3.5"
+ }
+ ],
+ "annotations": {
+ "list": [
+ {
+ "builtIn": 1,
+ "datasource": "-- Grafana --",
+ "enable": true,
+ "hide": true,
+ "iconColor": "rgba(0, 211, 255, 1)",
+ "name": "Annotations & Alerts",
+ "type": "dashboard"
+ }
+ ]
+ },
+ "editable": true,
+ "gnetId": null,
+ "graphTooltip": 0,
+ "id": null,
+ "links": [],
+ "panels": [],
+ "schemaVersion": 19,
+ "style": "dark",
+ "tags": [],
+ "templating": {
+ "list": []
+ },
+ "time": {
+ "from": "now-6h",
+ "to": "now"
+ },
+ "timepicker": {
+ "refresh_intervals": ["5s"]
+ },
+ "timezone": "",
+ "title": "Dummy Dashboard",
+ "uid": "IdcYQooWk",
+ "version": 1
+ }
+ datasource: Prometheus
diff --git a/agw-deployer/helm/charts/grafana/ci/with-dashboard-values.yaml b/agw-deployer/helm/charts/grafana/ci/with-dashboard-values.yaml
new file mode 100644
index 0000000..7b662c5
--- /dev/null
+++ b/agw-deployer/helm/charts/grafana/ci/with-dashboard-values.yaml
@@ -0,0 +1,19 @@
+dashboards:
+ my-provider:
+ my-awesome-dashboard:
+ gnetId: 10000
+ revision: 1
+ datasource: Prometheus
+dashboardProviders:
+ dashboardproviders.yaml:
+ apiVersion: 1
+ providers:
+ - name: 'my-provider'
+ orgId: 1
+ folder: ''
+ type: file
+ updateIntervalSeconds: 10
+ disableDeletion: true
+ editable: true
+ options:
+ path: /var/lib/grafana/dashboards/my-provider
diff --git a/agw-deployer/helm/charts/grafana/ci/with-image-renderer-values.yaml b/agw-deployer/helm/charts/grafana/ci/with-image-renderer-values.yaml
new file mode 100644
index 0000000..32f3074
--- /dev/null
+++ b/agw-deployer/helm/charts/grafana/ci/with-image-renderer-values.yaml
@@ -0,0 +1,19 @@
+podLabels:
+ customLableA: Aaaaa
+imageRenderer:
+ enabled: true
+ env:
+ RENDERING_ARGS: --disable-gpu,--window-size=1280x758
+ RENDERING_MODE: clustered
+ podLabels:
+ customLableB: Bbbbb
+ networkPolicy:
+ limitIngress: true
+ limitEgress: true
+ resources:
+ limits:
+ cpu: 1000m
+ memory: 1000Mi
+ requests:
+ cpu: 500m
+ memory: 50Mi
diff --git a/agw-deployer/helm/charts/grafana/dashboards/http-log-byId.json b/agw-deployer/helm/charts/grafana/dashboards/http-log-byId.json
new file mode 100644
index 0000000..4cba3d5
--- /dev/null
+++ b/agw-deployer/helm/charts/grafana/dashboards/http-log-byId.json
@@ -0,0 +1,414 @@
+{
+ "editable": true,
+ "gnetId": null,
+ "graphTooltip": 0,
+ "iteration": 1588086315506,
+ "links": [],
+ "panels": [
+ {
+ "cacheTimeout": null,
+ "columns": [],
+ "datasource": "$datasource",
+ "fontSize": "100%",
+ "gridPos": {
+ "h": 2,
+ "w": 24,
+ "x": 0,
+ "y": 1
+ },
+ "id": 5,
+ "links": [],
+ "options": {},
+ "pageSize": null,
+ "pluginVersion": "6.4.2",
+ "showHeader": true,
+ "sort": {
+ "col": 0,
+ "desc": true
+ },
+ "styles": [
+ {
+ "alias": "Time",
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "pattern": "Time",
+ "type": "date"
+ },
+ {
+ "alias": "Type",
+ "colorMode": null,
+ "colors": [
+ "#C4162A",
+ "rgba(237, 129, 40, 0.89)",
+ "rgba(50, 172, 45, 0.97)"
+ ],
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "decimals": 2,
+ "mappingType": 1,
+ "pattern": "http.direction",
+ "thresholds": [],
+ "type": "string",
+ "unit": "short",
+ "valueMaps": [
+ {
+ "text": "Request",
+ "value": "RX"
+ },
+ {
+ "text": "Notification",
+ "value": "TX"
+ }
+ ]
+ },
+ {
+ "alias": "Id",
+ "colorMode": null,
+ "colors": [
+ "rgba(245, 54, 54, 0.9)",
+ "rgba(237, 129, 40, 0.89)",
+ "rgba(50, 172, 45, 0.97)"
+ ],
+ "decimals": 2,
+ "mappingType": 1,
+ "pattern": "http.id",
+ "thresholds": [],
+ "type": "string",
+ "unit": "short",
+ "valueMaps": []
+ },
+ {
+ "alias": "Service",
+ "colorMode": null,
+ "colors": [
+ "rgba(245, 54, 54, 0.9)",
+ "rgba(237, 129, 40, 0.89)",
+ "rgba(50, 172, 45, 0.97)"
+ ],
+ "decimals": 2,
+ "mappingType": 1,
+ "pattern": "http.logger_name",
+ "thresholds": [],
+ "type": "string",
+ "unit": "short",
+ "valueMaps": []
+ },
+ {
+ "alias": "Method",
+ "colorMode": null,
+ "colors": [
+ "rgba(245, 54, 54, 0.9)",
+ "rgba(237, 129, 40, 0.89)",
+ "rgba(50, 172, 45, 0.97)"
+ ],
+ "decimals": 2,
+ "mappingType": 1,
+ "pattern": "http.method",
+ "thresholds": [],
+ "type": "string",
+ "unit": "short",
+ "valueMaps": []
+ },
+ {
+ "alias": "Endpoint with query parameterers",
+ "colorMode": null,
+ "colors": [
+ "rgba(245, 54, 54, 0.9)",
+ "rgba(237, 129, 40, 0.89)",
+ "rgba(50, 172, 45, 0.97)"
+ ],
+ "decimals": 2,
+ "mappingType": 1,
+ "pattern": "http.url",
+ "thresholds": [],
+ "type": "string",
+ "unit": "short",
+ "valueMaps": []
+ },
+ {
+ "alias": "Response code",
+ "colorMode": null,
+ "colors": [
+ "rgba(245, 54, 54, 0.9)",
+ "rgba(237, 129, 40, 0.89)",
+ "rgba(50, 172, 45, 0.97)"
+ ],
+ "decimals": 2,
+ "mappingType": 1,
+ "pattern": "http.resp_code",
+ "thresholds": [],
+ "type": "string",
+ "unit": "short",
+ "valueMaps": []
+ },
+ {
+ "alias": "Processing Time (us)",
+ "colorMode": null,
+ "colors": [
+ "rgba(245, 54, 54, 0.9)",
+ "rgba(237, 129, 40, 0.89)",
+ "rgba(50, 172, 45, 0.97)"
+ ],
+ "decimals": 2,
+ "mappingType": 1,
+ "pattern": "http.proc_time",
+ "thresholds": [],
+ "type": "string",
+ "unit": "short",
+ "valueMaps": []
+ }
+ ],
+ "targets": [
+ {
+ "groupBy": [],
+ "hide": false,
+ "measurement": "http",
+ "orderByTime": "ASC",
+ "policy": "default",
+ "query": "SELECT id,direction,logger_name,url,method,resp_code,proc_time FROM $database.autogen.http WHERE (\"logger_name\" =~ /^$logger_name$/) AND (\"id\"=$http_log_id)",
+ "rawQuery": true,
+ "refId": "A",
+ "resultFormat": "time_series",
+ "tags": []
+ }
+ ],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "",
+ "transform": "timeseries_to_columns",
+ "type": "table"
+ },
+ {
+ "content": "",
+ "datasource": null,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 3
+ },
+ "id": 30,
+ "mode": "markdown",
+ "options": {},
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Request Body",
+ "type": "text"
+ },
+ {
+ "cacheTimeout": null,
+ "datasource": "$datasource",
+ "description": "",
+ "gridPos": {
+ "h": 5,
+ "w": 24,
+ "x": 0,
+ "y": 4
+ },
+ "id": 31,
+ "links": [],
+ "options": {
+ "showTime": false,
+ "sortOrder": "Descending"
+ },
+ "pluginVersion": "6.5.2",
+ "targets": [
+ {
+ "groupBy": [
+ {
+ "params": [
+ "$__interval"
+ ],
+ "type": "time"
+ },
+ {
+ "params": [
+ "null"
+ ],
+ "type": "fill"
+ }
+ ],
+ "measurement": "http",
+ "orderByTime": "ASC",
+ "policy": "default",
+ "query": "SELECT body FROM $database.autogen.http WHERE (\"logger_name\" =~ /^$logger_name$/) AND (\"id\"=$http_log_id)",
+ "rawQuery": true,
+ "refId": "A",
+ "resultFormat": "table"
+ }
+ ],
+ "thresholds": "",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "",
+ "type": "logs"
+ },
+ {
+ "content": "",
+ "datasource": null,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 9
+ },
+ "id": 32,
+ "mode": "markdown",
+ "options": {},
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Response Body",
+ "type": "text"
+ },
+ {
+ "cacheTimeout": null,
+ "datasource": "$datasource",
+ "description": "",
+ "gridPos": {
+ "h": 5,
+ "w": 24,
+ "x": 0,
+ "y": 10
+ },
+ "id": 33,
+ "links": [],
+ "options": {
+ "showTime": false,
+ "sortOrder": "Descending"
+ },
+ "pluginVersion": "6.5.2",
+ "targets": [
+ {
+ "groupBy": [
+ {
+ "params": [
+ "$__interval"
+ ],
+ "type": "time"
+ },
+ {
+ "params": [
+ "null"
+ ],
+ "type": "fill"
+ }
+ ],
+ "measurement": "http",
+ "orderByTime": "ASC",
+ "policy": "default",
+ "query": "SELECT resp_body FROM $database.autogen.http WHERE (\"logger_name\" =~ /^$logger_name$/) AND (\"id\"=$http_log_id)",
+ "rawQuery": true,
+ "refId": "A",
+ "resultFormat": "table"
+ }
+ ],
+ "thresholds": "",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "",
+ "type": "logs"
+ }
+ ],
+ "refresh": "",
+ "schemaVersion": 21,
+ "style": "dark",
+ "tags": [],
+ "templating": {
+ "list": [
+ {
+ "current": {
+ "text": "meep-influxdb",
+ "value": "meep-influxdb"
+ },
+ "hide": 0,
+ "includeAll": false,
+ "label": "",
+ "multi": false,
+ "name": "datasource",
+ "options": [],
+ "query": "influxdb",
+ "refresh": 1,
+ "regex": "",
+ "skipUrlSync": false,
+ "type": "datasource"
+ },
+ {
+ "allValue": null,
+ "current": {
+ "text": "demo1",
+ "value": "demo1"
+ },
+ "datasource": "$datasource",
+ "definition": "show databases",
+ "hide": 0,
+ "includeAll": false,
+ "label": null,
+ "multi": false,
+ "name": "database",
+ "options": [],
+ "query": "show databases",
+ "refresh": 1,
+ "regex": "",
+ "skipUrlSync": false,
+ "sort": 0,
+ "tagValuesQuery": "",
+ "tags": [],
+ "tagsQuery": "",
+ "type": "query",
+ "useTags": false
+ },
+ {
+ "allValue": "ALL",
+ "current": {
+ "text": "ALL",
+ "value": "*"
+ },
+ "datasource": "$datasource",
+ "definition": "show tag values on $database from http with key = \"logger_name\"",
+ "hide": 0,
+ "includeAll": false,
+ "label": "service",
+ "multi": false,
+ "name": "logger_name",
+ "options": [],
+ "query": "show tag values on $database from http with key = \"logger_name\"",
+ "refresh": 1,
+ "regex": "",
+ "skipUrlSync": false,
+ "sort": 0,
+ "tagValuesQuery": "",
+ "tags": [],
+ "tagsQuery": "",
+ "type": "query",
+ "useTags": false
+ },
+ {
+ "allValue": "ALL",
+ "current": {
+ "text": "ALL",
+ "value": "*"
+ },
+ "datasource": "$datasource",
+ "definition": "show http log id selected",
+ "hide": 0,
+ "includeAll": false,
+ "label": "http log Id",
+ "multi": false,
+ "name": "http_log_id",
+ "options": [],
+ "query": "SELECT id FROM $database.autogen.http WHERE (\"logger_name\" =~ /^$logger_name$/) ORDER BY time desc LIMIT 100",
+ "refresh": 1,
+ "regex": "",
+ "skipUrlSync": false,
+ "sort": 0,
+ "tagValuesQuery": "",
+ "tags": [],
+ "tagsQuery": "",
+ "type": "query",
+ "useTags": false
+ }
+ ]
+ },
+ "timezone": "",
+ "title": "Http REST API single log details",
+ "uid": "4",
+ "version": 1
+}
\ No newline at end of file
diff --git a/agw-deployer/helm/charts/grafana/dashboards/http-loggers.json b/agw-deployer/helm/charts/grafana/dashboards/http-loggers.json
new file mode 100644
index 0000000..8f3c25c
--- /dev/null
+++ b/agw-deployer/helm/charts/grafana/dashboards/http-loggers.json
@@ -0,0 +1,267 @@
+{
+ "editable": true,
+ "gnetId": null,
+ "graphTooltip": 0,
+ "iteration": 1588000376431,
+ "links": [],
+ "panels": [
+ {
+ "cacheTimeout": null,
+ "columns": [],
+ "datasource": "$datasource",
+ "fontSize": "100%",
+ "gridPos": {
+ "h": 20,
+ "w": 24,
+ "x": 0,
+ "y": 3
+ },
+ "id": 4,
+ "links": [],
+ "options": {},
+ "pageSize": null,
+ "pluginVersion": "6.4.2",
+ "showHeader": true,
+ "sort": {
+ "col": 0,
+ "desc": true
+ },
+ "styles": [
+ {
+ "alias": "Time",
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "pattern": "Time",
+ "type": "date"
+ },
+ {
+ "alias": "Type",
+ "colorMode": null,
+ "colors": [
+ "#C4162A",
+ "rgba(237, 129, 40, 0.89)",
+ "rgba(50, 172, 45, 0.97)"
+ ],
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "decimals": 2,
+ "mappingType": 1,
+ "pattern": "http.direction",
+ "thresholds": [],
+ "type": "string",
+ "unit": "short",
+ "valueMaps": [
+ {
+ "text": "Request",
+ "value": "RX"
+ },
+ {
+ "text": "Notification",
+ "value": "TX"
+ }
+ ]
+ },
+ {
+ "alias": "Id",
+ "colorMode": null,
+ "colors": [
+ "rgba(245, 54, 54, 0.9)",
+ "rgba(237, 129, 40, 0.89)",
+ "rgba(50, 172, 45, 0.97)"
+ ],
+ "decimals": 2,
+ "link": true,
+ "linkTargetBlank":true,
+ "linkTooltip": "get details",
+ "linkUrl":"d/4/http-rest-api-single-log-details?orgId=1&var-database=$database&var-logger_name=${__cell_3}&theme=light&refresh=1d&var-http_log_id=${__cell}",
+ "mappingType": 1,
+ "pattern": "http.id",
+ "thresholds": [],
+ "type": "string",
+ "unit": "short",
+ "valueMaps": []
+ },
+ {
+ "alias": "Service",
+ "colorMode": null,
+ "colors": [
+ "rgba(245, 54, 54, 0.9)",
+ "rgba(237, 129, 40, 0.89)",
+ "rgba(50, 172, 45, 0.97)"
+ ],
+ "decimals": 2,
+ "mappingType": 1,
+ "pattern": "http.logger_name",
+ "thresholds": [],
+ "type": "string",
+ "unit": "short",
+ "valueMaps": []
+ },
+ {
+ "alias": "Endpoint",
+ "colorMode": null,
+ "colors": [
+ "rgba(245, 54, 54, 0.9)",
+ "rgba(237, 129, 40, 0.89)",
+ "rgba(50, 172, 45, 0.97)"
+ ],
+ "decimals": 2,
+ "mappingType": 1,
+ "pattern": "http.endpoint",
+ "thresholds": [],
+ "type": "string",
+ "unit": "short",
+ "valueMaps": []
+ },
+ {
+ "alias": "Response code",
+ "colorMode": null,
+ "colors": [
+ "rgba(245, 54, 54, 0.9)",
+ "rgba(237, 129, 40, 0.89)",
+ "rgba(50, 172, 45, 0.97)"
+ ],
+ "decimals": 2,
+ "mappingType": 1,
+ "pattern": "http.resp_code",
+ "thresholds": [],
+ "type": "string",
+ "unit": "short",
+ "valueMaps": []
+ },
+ {
+ "alias": "Processing Time (us)",
+ "colorMode": null,
+ "colors": [
+ "rgba(245, 54, 54, 0.9)",
+ "rgba(237, 129, 40, 0.89)",
+ "rgba(50, 172, 45, 0.97)"
+ ],
+ "decimals": 2,
+ "mappingType": 1,
+ "pattern": "http.proc_time",
+ "thresholds": [],
+ "type": "string",
+ "unit": "short",
+ "valueMaps": []
+ }
+ ],
+ "targets": [
+ {
+ "groupBy": [],
+ "hide": false,
+ "measurement": "http",
+ "orderByTime": "ASC",
+ "policy": "default",
+ "query": "SELECT id,direction,logger_name,endpoint,resp_code,proc_time FROM $database.autogen.http WHERE (\"logger_name\" =~ /^$logger_name$/) AND $timeFilter ORDER BY time desc LIMIT 100",
+ "rawQuery": true,
+ "refId": "A",
+ "resultFormat": "time_series",
+ "tags": []
+ }
+ ],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Http logs",
+ "transform": "timeseries_to_columns",
+ "type": "table"
+ }
+ ],
+ "refresh": "1s",
+ "schemaVersion": 21,
+ "style": "dark",
+ "tags": [],
+ "templating": {
+ "list": [
+ {
+ "current": {
+ "text": "meep-influxdb",
+ "value": "meep-influxdb"
+ },
+ "hide": 0,
+ "includeAll": false,
+ "label": "",
+ "multi": false,
+ "name": "datasource",
+ "options": [],
+ "query": "influxdb",
+ "refresh": 1,
+ "regex": "",
+ "skipUrlSync": false,
+ "type": "datasource"
+ },
+ {
+ "allValue": null,
+ "current": {
+ "text": "demo1",
+ "value": "demo1"
+ },
+ "datasource": "$datasource",
+ "definition": "show databases",
+ "hide": 0,
+ "includeAll": false,
+ "label": null,
+ "multi": false,
+ "name": "database",
+ "options": [],
+ "query": "show databases",
+ "refresh": 1,
+ "regex": "",
+ "skipUrlSync": false,
+ "sort": 0,
+ "tagValuesQuery": "",
+ "tags": [],
+ "tagsQuery": "",
+ "type": "query",
+ "useTags": false
+ },
+ {
+ "allValue": "ALL",
+ "current": {
+ "text": "ALL",
+ "value": "*"
+ },
+ "datasource": "$datasource",
+ "definition": "show tag values on $database from http with key = \"logger_name\"",
+ "hide": 0,
+ "includeAll": false,
+ "label": "service",
+ "multi": true,
+ "name": "logger_name",
+ "options": [],
+ "query": "show tag values on $database from http with key = \"logger_name\"",
+ "refresh": 1,
+ "regex": "",
+ "skipUrlSync": false,
+ "sort": 0,
+ "tagValuesQuery": "",
+ "tags": [],
+ "tagsQuery": "",
+ "type": "query",
+ "useTags": false
+ }
+ ]
+ },
+ "time": {
+ "from": "now-1m",
+ "to": "now"
+ },
+ "timepicker": {
+ "hidden": false,
+ "refresh_intervals": [
+ "1s",
+ "5s",
+ "10s",
+ "30s",
+ "1m",
+ "5m",
+ "15m",
+ "30m",
+ "1h",
+ "2h",
+ "1d"
+ ]
+ },
+ "timezone": "",
+ "title": "Http REST API logs aggregation",
+ "uid": "3",
+ "version": 1
+}
diff --git a/agw-deployer/helm/charts/grafana/dashboards/kubelet.json b/agw-deployer/helm/charts/grafana/dashboards/kubelet.json
new file mode 100644
index 0000000..0300f59
--- /dev/null
+++ b/agw-deployer/helm/charts/grafana/dashboards/kubelet.json
@@ -0,0 +1,2212 @@
+{
+ "__inputs": [],
+ "__requires": [],
+ "annotations": {
+ "list": []
+ },
+ "editable": false,
+ "gnetId": null,
+ "graphTooltip": 0,
+ "hideControls": false,
+ "id": null,
+ "links": [],
+ "refresh": "10s",
+ "rows": [
+ {
+ "collapse": false,
+ "collapsed": false,
+ "panels": [
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": false,
+ "colors": ["#299c46", "rgba(237, 129, 40, 0.89)", "#d44a3a"],
+ "datasource": "$datasource",
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {},
+ "id": 2,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "span": 2,
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(up{cluster=\"$cluster\", job=\"kubelet\", metrics_path=\"/metrics\"})",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "",
+ "title": "Up",
+ "tooltip": {
+ "shared": false
+ },
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "min"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": false,
+ "colors": ["#299c46", "rgba(237, 129, 40, 0.89)", "#d44a3a"],
+ "datasource": "$datasource",
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {},
+ "id": 3,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "span": 2,
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(kubelet_running_pods{cluster=\"$cluster\", job=\"kubelet\", metrics_path=\"/metrics\", instance=~\"$instance\"})",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{instance}}",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "",
+ "title": "Running Pods",
+ "tooltip": {
+ "shared": false
+ },
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "min"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": false,
+ "colors": ["#299c46", "rgba(237, 129, 40, 0.89)", "#d44a3a"],
+ "datasource": "$datasource",
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {},
+ "id": 4,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "span": 2,
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(kubelet_running_containers{cluster=\"$cluster\", job=\"kubelet\", metrics_path=\"/metrics\", instance=~\"$instance\"})",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{instance}}",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "",
+ "title": "Running Container",
+ "tooltip": {
+ "shared": false
+ },
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "min"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": false,
+ "colors": ["#299c46", "rgba(237, 129, 40, 0.89)", "#d44a3a"],
+ "datasource": "$datasource",
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {},
+ "id": 5,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "span": 2,
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(volume_manager_total_volumes{cluster=\"$cluster\", job=\"kubelet\", metrics_path=\"/metrics\", instance=~\"$instance\", state=\"actual_state_of_world\"})",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{instance}}",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "",
+ "title": "Actual Volume Count",
+ "tooltip": {
+ "shared": false
+ },
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "min"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": false,
+ "colors": ["#299c46", "rgba(237, 129, 40, 0.89)", "#d44a3a"],
+ "datasource": "$datasource",
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {},
+ "id": 6,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "span": 2,
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(volume_manager_total_volumes{cluster=\"$cluster\", job=\"kubelet\", metrics_path=\"/metrics\", instance=~\"$instance\",state=\"desired_state_of_world\"})",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{instance}}",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "",
+ "title": "Desired Volume Count",
+ "tooltip": {
+ "shared": false
+ },
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "min"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": false,
+ "colors": ["#299c46", "rgba(237, 129, 40, 0.89)", "#d44a3a"],
+ "datasource": "$datasource",
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {},
+ "id": 7,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "span": 2,
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(rate(kubelet_node_config_error{cluster=\"$cluster\", job=\"kubelet\", metrics_path=\"/metrics\", instance=~\"$instance\"}[5m]))",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{instance}}",
+ "refId": "A"
+ }
+ ],
+ "thresholds": "",
+ "title": "Config Error Count",
+ "tooltip": {
+ "shared": false
+ },
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "min"
+ }
+ ],
+ "repeat": null,
+ "repeatIteration": null,
+ "repeatRowId": null,
+ "showTitle": false,
+ "title": "Dashboard Row",
+ "titleSize": "h6",
+ "type": "row"
+ },
+ {
+ "collapse": false,
+ "collapsed": false,
+ "panels": [
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {},
+ "id": 8,
+ "legend": {
+ "alignAsTable": true,
+ "avg": false,
+ "current": true,
+ "max": false,
+ "min": false,
+ "rightSide": true,
+ "show": true,
+ "sideWidth": null,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "repeat": null,
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "span": 6,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "sum(rate(kubelet_runtime_operations_total{cluster=\"$cluster\",job=\"kubelet\", metrics_path=\"/metrics\",instance=~\"$instance\"}[5m])) by (operation_type, instance)",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{instance}} {{operation_type}}",
+ "refId": "A"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Operation Rate",
+ "tooltip": {
+ "shared": false,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "ops",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "ops",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ }
+ ]
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {},
+ "id": 9,
+ "legend": {
+ "alignAsTable": true,
+ "avg": false,
+ "current": true,
+ "max": false,
+ "min": false,
+ "rightSide": true,
+ "show": true,
+ "sideWidth": null,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "repeat": null,
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "span": 6,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "sum(rate(kubelet_runtime_operations_errors_total{cluster=\"$cluster\",job=\"kubelet\", metrics_path=\"/metrics\",instance=~\"$instance\"}[5m])) by (instance, operation_type)",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{instance}} {{operation_type}}",
+ "refId": "A"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Operation Error Rate",
+ "tooltip": {
+ "shared": false,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "ops",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "ops",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ }
+ ]
+ }
+ ],
+ "repeat": null,
+ "repeatIteration": null,
+ "repeatRowId": null,
+ "showTitle": false,
+ "title": "Dashboard Row",
+ "titleSize": "h6",
+ "type": "row"
+ },
+ {
+ "collapse": false,
+ "collapsed": false,
+ "panels": [
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {},
+ "id": 10,
+ "legend": {
+ "alignAsTable": true,
+ "avg": false,
+ "current": true,
+ "max": false,
+ "min": false,
+ "rightSide": true,
+ "show": true,
+ "sideWidth": null,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "repeat": null,
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "span": 12,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "histogram_quantile(0.99, sum(rate(kubelet_runtime_operations_duration_seconds_bucket{cluster=\"$cluster\",job=\"kubelet\", metrics_path=\"/metrics\",instance=~\"$instance\"}[5m])) by (instance, operation_type, le))",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{instance}} {{operation_type}}",
+ "refId": "A"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Operation duration 99th quantile",
+ "tooltip": {
+ "shared": false,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "s",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "s",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ }
+ ]
+ }
+ ],
+ "repeat": null,
+ "repeatIteration": null,
+ "repeatRowId": null,
+ "showTitle": false,
+ "title": "Dashboard Row",
+ "titleSize": "h6",
+ "type": "row"
+ },
+ {
+ "collapse": false,
+ "collapsed": false,
+ "panels": [
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {},
+ "id": 11,
+ "legend": {
+ "alignAsTable": true,
+ "avg": false,
+ "current": true,
+ "max": false,
+ "min": false,
+ "rightSide": true,
+ "show": true,
+ "sideWidth": null,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "repeat": null,
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "span": 6,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "sum(rate(kubelet_pod_start_duration_seconds_count{cluster=\"$cluster\",job=\"kubelet\", metrics_path=\"/metrics\",instance=~\"$instance\"}[5m])) by (instance)",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{instance}} pod",
+ "refId": "A"
+ },
+ {
+ "expr": "sum(rate(kubelet_pod_worker_duration_seconds_count{cluster=\"$cluster\",job=\"kubelet\", metrics_path=\"/metrics\",instance=~\"$instance\"}[5m])) by (instance)",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{instance}} worker",
+ "refId": "B"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Pod Start Rate",
+ "tooltip": {
+ "shared": false,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "ops",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "ops",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ }
+ ]
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {},
+ "id": 12,
+ "legend": {
+ "alignAsTable": true,
+ "avg": false,
+ "current": true,
+ "max": false,
+ "min": false,
+ "rightSide": true,
+ "show": true,
+ "sideWidth": null,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "repeat": null,
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "span": 6,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "histogram_quantile(0.99, sum(rate(kubelet_pod_start_duration_seconds_count{cluster=\"$cluster\",job=\"kubelet\", metrics_path=\"/metrics\",instance=~\"$instance\"}[5m])) by (instance, le))",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{instance}} pod",
+ "refId": "A"
+ },
+ {
+ "expr": "histogram_quantile(0.99, sum(rate(kubelet_pod_worker_duration_seconds_bucket{cluster=\"$cluster\",job=\"kubelet\", metrics_path=\"/metrics\",instance=~\"$instance\"}[5m])) by (instance, le))",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{instance}} worker",
+ "refId": "B"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Pod Start Duration",
+ "tooltip": {
+ "shared": false,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "s",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "s",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ }
+ ]
+ }
+ ],
+ "repeat": null,
+ "repeatIteration": null,
+ "repeatRowId": null,
+ "showTitle": false,
+ "title": "Dashboard Row",
+ "titleSize": "h6",
+ "type": "row"
+ },
+ {
+ "collapse": false,
+ "collapsed": false,
+ "panels": [
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {},
+ "id": 13,
+ "legend": {
+ "alignAsTable": true,
+ "avg": false,
+ "current": true,
+ "hideEmpty": true,
+ "hideZero": true,
+ "max": false,
+ "min": false,
+ "rightSide": true,
+ "show": true,
+ "sideWidth": null,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "repeat": null,
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "span": 6,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "sum(rate(storage_operation_duration_seconds_count{cluster=\"$cluster\",job=\"kubelet\", metrics_path=\"/metrics\",instance=~\"$instance\"}[5m])) by (instance, operation_name, volume_plugin)",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{instance}} {{operation_name}} {{volume_plugin}}",
+ "refId": "A"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Storage Operation Rate",
+ "tooltip": {
+ "shared": false,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "ops",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "ops",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ }
+ ]
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {},
+ "id": 14,
+ "legend": {
+ "alignAsTable": true,
+ "avg": false,
+ "current": true,
+ "hideEmpty": true,
+ "hideZero": true,
+ "max": false,
+ "min": false,
+ "rightSide": true,
+ "show": true,
+ "sideWidth": null,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "repeat": null,
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "span": 6,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "sum(rate(storage_operation_errors_total{cluster=\"$cluster\",job=\"kubelet\", metrics_path=\"/metrics\",instance=~\"$instance\"}[5m])) by (instance, operation_name, volume_plugin)",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{instance}} {{operation_name}} {{volume_plugin}}",
+ "refId": "A"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Storage Operation Error Rate",
+ "tooltip": {
+ "shared": false,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "ops",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "ops",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ }
+ ]
+ }
+ ],
+ "repeat": null,
+ "repeatIteration": null,
+ "repeatRowId": null,
+ "showTitle": false,
+ "title": "Dashboard Row",
+ "titleSize": "h6",
+ "type": "row"
+ },
+ {
+ "collapse": false,
+ "collapsed": false,
+ "panels": [
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {},
+ "id": 15,
+ "legend": {
+ "alignAsTable": true,
+ "avg": false,
+ "current": true,
+ "hideEmpty": true,
+ "hideZero": true,
+ "max": false,
+ "min": false,
+ "rightSide": true,
+ "show": true,
+ "sideWidth": null,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "repeat": null,
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "span": 12,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "histogram_quantile(0.99, sum(rate(storage_operation_duration_seconds_bucket{cluster=\"$cluster\", job=\"kubelet\", metrics_path=\"/metrics\", instance=~\"$instance\"}[5m])) by (instance, operation_name, volume_plugin, le))",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{instance}} {{operation_name}} {{volume_plugin}}",
+ "refId": "A"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Storage Operation Duration 99th quantile",
+ "tooltip": {
+ "shared": false,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "s",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "s",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ }
+ ]
+ }
+ ],
+ "repeat": null,
+ "repeatIteration": null,
+ "repeatRowId": null,
+ "showTitle": false,
+ "title": "Dashboard Row",
+ "titleSize": "h6",
+ "type": "row"
+ },
+ {
+ "collapse": false,
+ "collapsed": false,
+ "panels": [
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {},
+ "id": 16,
+ "legend": {
+ "alignAsTable": true,
+ "avg": false,
+ "current": true,
+ "max": false,
+ "min": false,
+ "rightSide": true,
+ "show": true,
+ "sideWidth": null,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "repeat": null,
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "span": 6,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "sum(rate(kubelet_cgroup_manager_duration_seconds_count{cluster=\"$cluster\", job=\"kubelet\", metrics_path=\"/metrics\", instance=~\"$instance\"}[5m])) by (instance, operation_type)",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{operation_type}}",
+ "refId": "A"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Cgroup manager operation rate",
+ "tooltip": {
+ "shared": false,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "ops",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "ops",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ }
+ ]
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {},
+ "id": 17,
+ "legend": {
+ "alignAsTable": true,
+ "avg": false,
+ "current": true,
+ "max": false,
+ "min": false,
+ "rightSide": true,
+ "show": true,
+ "sideWidth": null,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "repeat": null,
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "span": 6,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "histogram_quantile(0.99, sum(rate(kubelet_cgroup_manager_duration_seconds_bucket{cluster=\"$cluster\", job=\"kubelet\", metrics_path=\"/metrics\", instance=~\"$instance\"}[5m])) by (instance, operation_type, le))",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{instance}} {{operation_type}}",
+ "refId": "A"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Cgroup manager 99th quantile",
+ "tooltip": {
+ "shared": false,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "s",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "s",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ }
+ ]
+ }
+ ],
+ "repeat": null,
+ "repeatIteration": null,
+ "repeatRowId": null,
+ "showTitle": false,
+ "title": "Dashboard Row",
+ "titleSize": "h6",
+ "type": "row"
+ },
+ {
+ "collapse": false,
+ "collapsed": false,
+ "panels": [
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "description": "Pod lifecycle event generator",
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {},
+ "id": 18,
+ "legend": {
+ "alignAsTable": true,
+ "avg": false,
+ "current": true,
+ "max": false,
+ "min": false,
+ "rightSide": true,
+ "show": true,
+ "sideWidth": null,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "repeat": null,
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "span": 6,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "sum(rate(kubelet_pleg_relist_duration_seconds_count{cluster=\"$cluster\", job=\"kubelet\", metrics_path=\"/metrics\", instance=~\"$instance\"}[5m])) by (instance)",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{instance}}",
+ "refId": "A"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "PLEG relist rate",
+ "tooltip": {
+ "shared": false,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "ops",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "ops",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ }
+ ]
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {},
+ "id": 19,
+ "legend": {
+ "alignAsTable": true,
+ "avg": false,
+ "current": true,
+ "max": false,
+ "min": false,
+ "rightSide": true,
+ "show": true,
+ "sideWidth": null,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "repeat": null,
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "span": 6,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "histogram_quantile(0.99, sum(rate(kubelet_pleg_relist_interval_seconds_bucket{cluster=\"$cluster\",job=\"kubelet\", metrics_path=\"/metrics\",instance=~\"$instance\"}[5m])) by (instance, le))",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{instance}}",
+ "refId": "A"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "PLEG relist interval",
+ "tooltip": {
+ "shared": false,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "s",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "s",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ }
+ ]
+ }
+ ],
+ "repeat": null,
+ "repeatIteration": null,
+ "repeatRowId": null,
+ "showTitle": false,
+ "title": "Dashboard Row",
+ "titleSize": "h6",
+ "type": "row"
+ },
+ {
+ "collapse": false,
+ "collapsed": false,
+ "panels": [
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {},
+ "id": 20,
+ "legend": {
+ "alignAsTable": true,
+ "avg": false,
+ "current": true,
+ "max": false,
+ "min": false,
+ "rightSide": true,
+ "show": true,
+ "sideWidth": null,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "repeat": null,
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "span": 12,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "histogram_quantile(0.99, sum(rate(kubelet_pleg_relist_duration_seconds_bucket{cluster=\"$cluster\",job=\"kubelet\", metrics_path=\"/metrics\",instance=~\"$instance\"}[5m])) by (instance, le))",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{instance}}",
+ "refId": "A"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "PLEG relist duration",
+ "tooltip": {
+ "shared": false,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "s",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "s",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ }
+ ]
+ }
+ ],
+ "repeat": null,
+ "repeatIteration": null,
+ "repeatRowId": null,
+ "showTitle": false,
+ "title": "Dashboard Row",
+ "titleSize": "h6",
+ "type": "row"
+ },
+ {
+ "collapse": false,
+ "collapsed": false,
+ "panels": [
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {},
+ "id": 21,
+ "legend": {
+ "alignAsTable": false,
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "rightSide": false,
+ "show": true,
+ "sideWidth": null,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "repeat": null,
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "span": 12,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "sum(rate(rest_client_requests_total{cluster=\"$cluster\",job=\"kubelet\", metrics_path=\"/metrics\", instance=~\"$instance\",code=~\"2..\"}[5m]))",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "2xx",
+ "refId": "A"
+ },
+ {
+ "expr": "sum(rate(rest_client_requests_total{cluster=\"$cluster\",job=\"kubelet\", metrics_path=\"/metrics\", instance=~\"$instance\",code=~\"3..\"}[5m]))",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "3xx",
+ "refId": "B"
+ },
+ {
+ "expr": "sum(rate(rest_client_requests_total{cluster=\"$cluster\",job=\"kubelet\", metrics_path=\"/metrics\", instance=~\"$instance\",code=~\"4..\"}[5m]))",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "4xx",
+ "refId": "C"
+ },
+ {
+ "expr": "sum(rate(rest_client_requests_total{cluster=\"$cluster\",job=\"kubelet\", metrics_path=\"/metrics\", instance=~\"$instance\",code=~\"5..\"}[5m]))",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "5xx",
+ "refId": "D"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "RPC Rate",
+ "tooltip": {
+ "shared": false,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "ops",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "ops",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ }
+ ]
+ }
+ ],
+ "repeat": null,
+ "repeatIteration": null,
+ "repeatRowId": null,
+ "showTitle": false,
+ "title": "Dashboard Row",
+ "titleSize": "h6",
+ "type": "row"
+ },
+ {
+ "collapse": false,
+ "collapsed": false,
+ "panels": [
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {},
+ "id": 22,
+ "legend": {
+ "alignAsTable": true,
+ "avg": false,
+ "current": true,
+ "max": false,
+ "min": false,
+ "rightSide": true,
+ "show": true,
+ "sideWidth": null,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "repeat": null,
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "span": 12,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "histogram_quantile(0.99, sum(rate(rest_client_request_duration_seconds_bucket{cluster=\"$cluster\",job=\"kubelet\", metrics_path=\"/metrics\", instance=~\"$instance\"}[5m])) by (instance, verb, url, le))",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{instance}} {{verb}} {{url}}",
+ "refId": "A"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Request duration 99th quantile",
+ "tooltip": {
+ "shared": false,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "s",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "s",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ }
+ ]
+ }
+ ],
+ "repeat": null,
+ "repeatIteration": null,
+ "repeatRowId": null,
+ "showTitle": false,
+ "title": "Dashboard Row",
+ "titleSize": "h6",
+ "type": "row"
+ },
+ {
+ "collapse": false,
+ "collapsed": false,
+ "panels": [
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {},
+ "id": 23,
+ "legend": {
+ "alignAsTable": false,
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "rightSide": false,
+ "show": true,
+ "sideWidth": null,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "repeat": null,
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "span": 4,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "process_resident_memory_bytes{cluster=\"$cluster\",job=\"kubelet\", metrics_path=\"/metrics\",instance=~\"$instance\"}",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{instance}}",
+ "refId": "A"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Memory",
+ "tooltip": {
+ "shared": false,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "bytes",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "bytes",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ }
+ ]
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {},
+ "id": 24,
+ "legend": {
+ "alignAsTable": false,
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "rightSide": false,
+ "show": true,
+ "sideWidth": null,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "repeat": null,
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "span": 4,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "rate(process_cpu_seconds_total{cluster=\"$cluster\",job=\"kubelet\", metrics_path=\"/metrics\",instance=~\"$instance\"}[5m])",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{instance}}",
+ "refId": "A"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "CPU usage",
+ "tooltip": {
+ "shared": false,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ }
+ ]
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fill": 1,
+ "fillGradient": 0,
+ "gridPos": {},
+ "id": 25,
+ "legend": {
+ "alignAsTable": false,
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "rightSide": false,
+ "show": true,
+ "sideWidth": null,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "repeat": null,
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "span": 4,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "go_goroutines{cluster=\"$cluster\",job=\"kubelet\", metrics_path=\"/metrics\",instance=~\"$instance\"}",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{instance}}",
+ "refId": "A"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Goroutines",
+ "tooltip": {
+ "shared": false,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ }
+ ]
+ }
+ ],
+ "repeat": null,
+ "repeatIteration": null,
+ "repeatRowId": null,
+ "showTitle": false,
+ "title": "Dashboard Row",
+ "titleSize": "h6",
+ "type": "row"
+ }
+ ],
+ "schemaVersion": 14,
+ "style": "dark",
+ "tags": ["kubernetes-mixin"],
+ "templating": {
+ "list": [
+ {
+ "current": {
+ "text": "default",
+ "value": "default"
+ },
+ "hide": 0,
+ "label": null,
+ "name": "datasource",
+ "options": [],
+ "query": "prometheus",
+ "refresh": 1,
+ "regex": "",
+ "type": "datasource"
+ },
+ {
+ "allValue": null,
+ "current": {},
+ "datasource": "$datasource",
+ "hide": 2,
+ "includeAll": false,
+ "label": "cluster",
+ "multi": false,
+ "name": "cluster",
+ "options": [],
+ "query": "label_values(kube_pod_info, cluster)",
+ "refresh": 2,
+ "regex": "",
+ "sort": 1,
+ "tagValuesQuery": "",
+ "tags": [],
+ "tagsQuery": "",
+ "type": "query",
+ "useTags": false
+ },
+ {
+ "allValue": null,
+ "current": {},
+ "datasource": "$datasource",
+ "hide": 0,
+ "includeAll": true,
+ "label": null,
+ "multi": false,
+ "name": "instance",
+ "options": [],
+ "query": "label_values(kubelet_runtime_operations_total{cluster=\"$cluster\", job=\"kubelet\", metrics_path=\"/metrics\"}, instance)",
+ "refresh": 2,
+ "regex": "",
+ "sort": 1,
+ "tagValuesQuery": "",
+ "tags": [],
+ "tagsQuery": "",
+ "type": "query",
+ "useTags": false
+ }
+ ]
+ },
+ "time": {
+ "from": "now-1h",
+ "to": "now"
+ },
+ "timepicker": {
+ "refresh_intervals": [
+ "5s",
+ "10s",
+ "30s",
+ "1m",
+ "5m",
+ "15m",
+ "30m",
+ "1h",
+ "2h",
+ "1d"
+ ],
+ "time_options": ["5m", "15m", "1h", "6h", "12h", "24h", "2d", "7d", "30d"]
+ },
+ "timezone": "UTC",
+ "title": "Kubernetes / Kubelet",
+ "uid": "k8s-kubelet",
+ "version": 0
+}
diff --git a/agw-deployer/helm/charts/grafana/dashboards/network-metrics-aggregation.json b/agw-deployer/helm/charts/grafana/dashboards/network-metrics-aggregation.json
new file mode 100644
index 0000000..5117a50
--- /dev/null
+++ b/agw-deployer/helm/charts/grafana/dashboards/network-metrics-aggregation.json
@@ -0,0 +1,771 @@
+{
+ "annotations": {
+ "list": [
+ {
+ "builtIn": 1,
+ "datasource": "$datasource",
+ "enable": true,
+ "hide": false,
+ "iconColor": "#3274D9",
+ "limit": 100,
+ "name": "Mobility Events",
+ "query": "SELECT type,description from $database.autogen.events WHERE type='MOBILITY' AND $timeFilter ORDER BY time ASC LIMIT 100",
+ "showIn": 0,
+ "tagsColumn": "type",
+ "textColumn": "",
+ "type": "dashboard"
+ },
+ {
+ "builtIn": 1,
+ "datasource": "$datasource",
+ "enable": true,
+ "hide": false,
+ "iconColor": "#FF780A",
+ "name": "Net Char Events",
+ "query": "SELECT type,description from $database.autogen.events WHERE type='NETWORK-CHARACTERISTICS-UPDATE' AND $timeFilter ORDER BY time ASC LIMIT 100",
+ "showIn": 0,
+ "tagsColumn": "type",
+ "textColumn": "",
+ "type": "dashboard"
+ },
+ {
+ "builtIn": 1,
+ "datasource": "$datasource",
+ "enable": true,
+ "hide": false,
+ "iconColor": "#A352CC",
+ "name": "PDU Session Events",
+ "query": "SELECT type,description from $database.autogen.events WHERE type='PDU-SESSION' AND $timeFilter ORDER BY time ASC LIMIT 100",
+ "showIn": 0,
+ "tagsColumn": "type",
+ "textColumn": "",
+ "type": "dashboard"
+ },
+ {
+ "builtIn": 1,
+ "datasource": "$datasource",
+ "enable": true,
+ "hide": false,
+ "iconColor": "#E02F44",
+ "name": "Scenario Update Events",
+ "query": "SELECT type,description from $database.autogen.events WHERE type='SCENARIO-UPDATE' AND $timeFilter ORDER BY time ASC LIMIT 100",
+ "showIn": 0,
+ "tagsColumn": "type",
+ "textColumn": "",
+ "type": "dashboard"
+ }
+ ]
+ },
+ "editable": true,
+ "gnetId": null,
+ "graphTooltip": 0,
+ "iteration": 1619633087561,
+ "links": [],
+ "panels": [
+ {
+ "collapsed": false,
+ "datasource": null,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 0
+ },
+ "id": 18,
+ "panels": [],
+ "title": "Inter-process Latency Aggregation",
+ "type": "row"
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "cacheTimeout": null,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "description": "Shows latency & Throughput between source & destination applications",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {},
+ "links": []
+ },
+ "overrides": []
+ },
+ "fill": 0,
+ "fillGradient": 1,
+ "gridPos": {
+ "h": 10,
+ "w": 24,
+ "x": 0,
+ "y": 1
+ },
+ "hiddenSeries": false,
+ "id": 2,
+ "interval": "",
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 2,
+ "links": [],
+ "nullPointMode": "connected",
+ "options": {
+ "alertThreshold": true
+ },
+ "percentage": false,
+ "pluginVersion": "7.3.5",
+ "pointradius": 2,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "alias": "[[tag_dest]]",
+ "groupBy": [
+ {
+ "params": [
+ "1s"
+ ],
+ "type": "time"
+ },
+ {
+ "params": [
+ "null"
+ ],
+ "type": "fill"
+ }
+ ],
+ "hide": false,
+ "measurement": "/^$scenario$/",
+ "orderByTime": "ASC",
+ "policy": "default",
+ "query": "SELECT lat FROM $database.autogen.network WHERE (\"src\" =~ /^$src$/) AND $timeFilter GROUP BY dest",
+ "rawQuery": true,
+ "refId": "A",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "lat"
+ ],
+ "type": "field"
+ },
+ {
+ "params": [],
+ "type": "mean"
+ }
+ ]
+ ],
+ "tags": [
+ {
+ "key": "src",
+ "operator": "=~",
+ "value": "/^$src$/"
+ },
+ {
+ "condition": "AND",
+ "key": "dest",
+ "operator": "=~",
+ "value": "/^$dest$/"
+ }
+ ]
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Latencies",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": "Latency (ms)",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": "Throughput (Mbps)",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "collapsed": false,
+ "datasource": null,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 11
+ },
+ "id": 20,
+ "panels": [],
+ "title": "Inter-process Throughput Aggregation",
+ "type": "row"
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "cacheTimeout": null,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "description": "Shows Up-Link Throughput from selected source",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {},
+ "links": []
+ },
+ "overrides": []
+ },
+ "fill": 0,
+ "fillGradient": 4,
+ "gridPos": {
+ "h": 9,
+ "w": 12,
+ "x": 0,
+ "y": 12
+ },
+ "hiddenSeries": false,
+ "id": 15,
+ "interval": "",
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 2,
+ "links": [],
+ "nullPointMode": "connected",
+ "options": {
+ "alertThreshold": true
+ },
+ "percentage": false,
+ "pluginVersion": "7.3.5",
+ "pointradius": 2,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "alias": "[[tag_dest]]",
+ "groupBy": [
+ {
+ "params": [
+ "$__interval"
+ ],
+ "type": "time"
+ },
+ {
+ "params": [
+ "null"
+ ],
+ "type": "fill"
+ }
+ ],
+ "hide": false,
+ "measurement": "network",
+ "orderByTime": "ASC",
+ "policy": "default",
+ "query": "SELECT ul FROM $database.autogen.network WHERE (\"src\" =~ /^$src$/) AND $timeFilter GROUP BY dest",
+ "rawQuery": true,
+ "refId": "B",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "ul"
+ ],
+ "type": "field"
+ },
+ {
+ "params": [],
+ "type": "mean"
+ }
+ ]
+ ],
+ "tags": [
+ {
+ "key": "src",
+ "operator": "=~",
+ "value": "/^$src$/"
+ },
+ {
+ "condition": "AND",
+ "key": "dest",
+ "operator": "=~",
+ "value": "/^$dest$/"
+ }
+ ]
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Up-Link",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "decimals": 2,
+ "format": "short",
+ "label": "Throughput (Mbps)",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": "Throughput (Mbps)",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "cacheTimeout": null,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "description": "Shows Down-Link Throughput to selected source",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {},
+ "links": []
+ },
+ "overrides": []
+ },
+ "fill": 0,
+ "fillGradient": 4,
+ "gridPos": {
+ "h": 9,
+ "w": 12,
+ "x": 12,
+ "y": 12
+ },
+ "hiddenSeries": false,
+ "id": 16,
+ "interval": "",
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 2,
+ "links": [],
+ "nullPointMode": "connected",
+ "options": {
+ "alertThreshold": true
+ },
+ "percentage": false,
+ "pluginVersion": "7.3.5",
+ "pointradius": 2,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "alias": "[[tag_dest]]",
+ "groupBy": [
+ {
+ "params": [
+ "$__interval"
+ ],
+ "type": "time"
+ },
+ {
+ "params": [
+ "null"
+ ],
+ "type": "fill"
+ }
+ ],
+ "hide": false,
+ "measurement": "network",
+ "orderByTime": "ASC",
+ "policy": "default",
+ "query": "SELECT dl FROM $database.autogen.network WHERE (\"src\" =~ /^$src$/) AND $timeFilter GROUP BY dest",
+ "rawQuery": true,
+ "refId": "C",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "dl"
+ ],
+ "type": "field"
+ },
+ {
+ "params": [],
+ "type": "mean"
+ }
+ ]
+ ],
+ "tags": [
+ {
+ "key": "src",
+ "operator": "=~",
+ "value": "/^$src$/"
+ },
+ {
+ "condition": "AND",
+ "key": "dest",
+ "operator": "=~",
+ "value": "/^$dest$/"
+ }
+ ]
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Down-Link",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "decimals": 2,
+ "format": "short",
+ "label": "Throughput (Mbps)",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": "Throughput (Mbps)",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "collapsed": false,
+ "datasource": null,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 21
+ },
+ "id": 22,
+ "panels": [],
+ "title": "Events",
+ "type": "row"
+ },
+ {
+ "cacheTimeout": null,
+ "columns": [],
+ "datasource": "$datasource",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "fontSize": "100%",
+ "gridPos": {
+ "h": 6,
+ "w": 24,
+ "x": 0,
+ "y": 22
+ },
+ "id": 4,
+ "links": [],
+ "pageSize": null,
+ "pluginVersion": "6.4.2",
+ "showHeader": true,
+ "sort": {
+ "col": 0,
+ "desc": true
+ },
+ "styles": [
+ {
+ "alias": "Time",
+ "align": "auto",
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "pattern": "Time",
+ "type": "date"
+ },
+ {
+ "alias": "Type",
+ "align": "auto",
+ "colorMode": null,
+ "colors": [
+ "#C4162A",
+ "rgba(237, 129, 40, 0.89)",
+ "rgba(50, 172, 45, 0.97)"
+ ],
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "decimals": 2,
+ "mappingType": 1,
+ "pattern": "events.type",
+ "thresholds": [],
+ "type": "string",
+ "unit": "short",
+ "valueMaps": [
+ {
+ "text": "Net Char",
+ "value": "NETWORK-CHARACTERISTICS-UPDATE"
+ },
+ {
+ "text": "Mobility",
+ "value": "MOBILITY"
+ },
+ {
+ "text": "PDU Session",
+ "value": "PDU-SESSION"
+ },
+ {
+ "text": "Scenario",
+ "value": "SCENARIO-UPDATE"
+ }
+ ]
+ },
+ {
+ "alias": "Description",
+ "align": "auto",
+ "colorMode": null,
+ "colors": [
+ "rgba(245, 54, 54, 0.9)",
+ "rgba(237, 129, 40, 0.89)",
+ "rgba(50, 172, 45, 0.97)"
+ ],
+ "decimals": 2,
+ "mappingType": 1,
+ "pattern": "events.description",
+ "thresholds": [],
+ "type": "string",
+ "unit": "short",
+ "valueMaps": []
+ }
+ ],
+ "targets": [
+ {
+ "groupBy": [],
+ "hide": false,
+ "measurement": "events",
+ "orderByTime": "ASC",
+ "policy": "default",
+ "query": "SELECT type,description FROM $database.autogen.events WHERE $timeFilter ORDER BY time desc LIMIT 100",
+ "rawQuery": true,
+ "refId": "A",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "event"
+ ],
+ "type": "field"
+ }
+ ]
+ ],
+ "tags": []
+ }
+ ],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Events",
+ "transform": "timeseries_to_columns",
+ "type": "table-old"
+ }
+ ],
+ "refresh": "1s",
+ "schemaVersion": 26,
+ "style": "dark",
+ "tags": [],
+ "templating": {
+ "list": [
+ {
+ "current": {
+ "selected": false,
+ "text": "meep-influxdb",
+ "value": "meep-influxdb"
+ },
+ "error": null,
+ "hide": 0,
+ "includeAll": false,
+ "label": "",
+ "multi": false,
+ "name": "datasource",
+ "options": [],
+ "query": "influxdb",
+ "refresh": 1,
+ "regex": "",
+ "skipUrlSync": false,
+ "type": "datasource"
+ },
+ {
+ "allValue": null,
+ "current": {
+ "selected": false,
+ "text": "_internal",
+ "value": "_internal"
+ },
+ "datasource": "$datasource",
+ "definition": "show databases",
+ "error": null,
+ "hide": 0,
+ "includeAll": false,
+ "label": null,
+ "multi": false,
+ "name": "database",
+ "options": [],
+ "query": "show databases",
+ "refresh": 1,
+ "regex": "",
+ "skipUrlSync": false,
+ "sort": 0,
+ "tagValuesQuery": "",
+ "tags": [],
+ "tagsQuery": "",
+ "type": "query",
+ "useTags": false
+ },
+ {
+ "allValue": null,
+ "current": {
+ "isNone": true,
+ "selected": false,
+ "text": "None",
+ "value": ""
+ },
+ "datasource": "$datasource",
+ "definition": "show tag values on $database from network with key = \"src\"",
+ "error": null,
+ "hide": 0,
+ "includeAll": false,
+ "label": "",
+ "multi": false,
+ "name": "src",
+ "options": [],
+ "query": "show tag values on $database from network with key = \"src\"",
+ "refresh": 1,
+ "regex": "",
+ "skipUrlSync": false,
+ "sort": 0,
+ "tagValuesQuery": "",
+ "tags": [],
+ "tagsQuery": "",
+ "type": "query",
+ "useTags": false
+ }
+ ]
+ },
+ "time": {
+ "from": "now-1m",
+ "to": "now"
+ },
+ "timepicker": {
+ "hidden": false,
+ "refresh_intervals": [
+ "1s",
+ "5s",
+ "10s",
+ "30s",
+ "1m",
+ "5m",
+ "15m",
+ "30m",
+ "1h",
+ "2h",
+ "1d"
+ ]
+ },
+ "timezone": "",
+ "title": "Network Metrics Aggregation",
+ "uid": "2",
+ "version": 3
+}
diff --git a/agw-deployer/helm/charts/grafana/dashboards/network-metrics-point-to-point.json b/agw-deployer/helm/charts/grafana/dashboards/network-metrics-point-to-point.json
new file mode 100644
index 0000000..9dbdb0b
--- /dev/null
+++ b/agw-deployer/helm/charts/grafana/dashboards/network-metrics-point-to-point.json
@@ -0,0 +1,921 @@
+{
+ "annotations": {
+ "list": [
+ {
+ "builtIn": 1,
+ "datasource": "$datasource",
+ "enable": true,
+ "hide": false,
+ "iconColor": "rgba(0, 211, 255, 1)",
+ "limit": 100,
+ "name": "Mobility Events",
+ "query": "SELECT type,description from $database.autogen.events WHERE type='MOBILITY' AND $timeFilter ORDER BY time ASC LIMIT 100",
+ "showIn": 0,
+ "tagsColumn": "type",
+ "textColumn": "",
+ "type": "dashboard"
+ },
+ {
+ "datasource": "$datasource",
+ "enable": true,
+ "hide": false,
+ "iconColor": "#FF9830",
+ "name": "Net Char Events",
+ "query": "SELECT type,description from $database.autogen.events WHERE type='NETWORK-CHARACTERISTICS-UPDATE' AND $timeFilter ORDER BY time ASC LIMIT 100",
+ "showIn": 0,
+ "tagsColumn": "type"
+ }
+ ]
+ },
+ "editable": true,
+ "gnetId": null,
+ "graphTooltip": 0,
+ "id": 1,
+ "iteration": 1581094956679,
+ "links": [],
+ "panels": [
+ {
+ "content": "\n\n",
+ "datasource": null,
+ "gridPos": {
+ "h": 1,
+ "w": 8,
+ "x": 0,
+ "y": 0
+ },
+ "id": 14,
+ "mode": "markdown",
+ "options": {},
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Latency",
+ "type": "text"
+ },
+ {
+ "content": "",
+ "datasource": null,
+ "gridPos": {
+ "h": 1,
+ "w": 16,
+ "x": 8,
+ "y": 0
+ },
+ "id": 12,
+ "mode": "markdown",
+ "options": {},
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Throughput",
+ "type": "text"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": false,
+ "colors": [
+ "#299c46",
+ "rgba(237, 129, 40, 0.89)",
+ "#F2495C"
+ ],
+ "datasource": "$datasource",
+ "decimals": null,
+ "description": "",
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 8,
+ "x": 0,
+ "y": 1
+ },
+ "id": 8,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "options": {},
+ "pluginVersion": "6.5.2",
+ "postfix": " ms",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "groupBy": [
+ {
+ "params": [
+ "$__interval"
+ ],
+ "type": "time"
+ },
+ {
+ "params": [
+ "null"
+ ],
+ "type": "fill"
+ }
+ ],
+ "measurement": "network",
+ "orderByTime": "ASC",
+ "policy": "default",
+ "query": "SELECT \"lat\" FROM $database.autogen.network WHERE (\"src\" =~ /^$src$/ AND \"dest\" =~ /^$dest$/) AND $timeFilter",
+ "rawQuery": true,
+ "refId": "A",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "lat"
+ ],
+ "type": "field"
+ }
+ ]
+ ],
+ "tags": [
+ {
+ "key": "src",
+ "operator": "=~",
+ "value": "/^$src$/"
+ },
+ {
+ "condition": "AND",
+ "key": "dest",
+ "operator": "=~",
+ "value": "/^$dest$/"
+ }
+ ]
+ }
+ ],
+ "thresholds": "",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "RTT",
+ "type": "singlestat",
+ "valueFontSize": "100%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": false,
+ "colors": [
+ "#299c46",
+ "rgba(237, 129, 40, 0.89)",
+ "#F2495C"
+ ],
+ "datasource": "$datasource",
+ "decimals": 2,
+ "description": "",
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 8,
+ "x": 8,
+ "y": 1
+ },
+ "id": 10,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "options": {},
+ "pluginVersion": "6.5.2",
+ "postfix": " Mbps",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "groupBy": [
+ {
+ "params": [
+ "$__interval"
+ ],
+ "type": "time"
+ },
+ {
+ "params": [
+ "null"
+ ],
+ "type": "fill"
+ }
+ ],
+ "measurement": "network",
+ "orderByTime": "ASC",
+ "policy": "default",
+ "query": "SELECT \"ul\" FROM $database.autogen.network WHERE (\"src\" =~ /^$src$/ AND \"dest\" =~ /^$dest$/) AND $timeFilter",
+ "rawQuery": true,
+ "refId": "A",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "lat"
+ ],
+ "type": "field"
+ }
+ ]
+ ],
+ "tags": [
+ {
+ "key": "src",
+ "operator": "=~",
+ "value": "/^$src$/"
+ },
+ {
+ "condition": "AND",
+ "key": "dest",
+ "operator": "=~",
+ "value": "/^$dest$/"
+ }
+ ]
+ }
+ ],
+ "thresholds": "",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "UL",
+ "type": "singlestat",
+ "valueFontSize": "100%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": false,
+ "colors": [
+ "#299c46",
+ "rgba(237, 129, 40, 0.89)",
+ "#F2495C"
+ ],
+ "datasource": "$datasource",
+ "decimals": 2,
+ "description": "",
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 8,
+ "x": 16,
+ "y": 1
+ },
+ "id": 9,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "options": {},
+ "pluginVersion": "6.5.2",
+ "postfix": " Mbps",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "groupBy": [
+ {
+ "params": [
+ "$__interval"
+ ],
+ "type": "time"
+ },
+ {
+ "params": [
+ "null"
+ ],
+ "type": "fill"
+ }
+ ],
+ "measurement": "network",
+ "orderByTime": "ASC",
+ "policy": "default",
+ "query": "SELECT \"dl\" FROM $database.autogen.network WHERE (\"src\" =~ /^$src$/ AND \"dest\" =~ /^$dest$/) AND $timeFilter",
+ "rawQuery": true,
+ "refId": "A",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "lat"
+ ],
+ "type": "field"
+ }
+ ]
+ ],
+ "tags": [
+ {
+ "key": "src",
+ "operator": "=~",
+ "value": "/^$src$/"
+ },
+ {
+ "condition": "AND",
+ "key": "dest",
+ "operator": "=~",
+ "value": "/^$dest$/"
+ }
+ ]
+ }
+ ],
+ "thresholds": "",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "DL",
+ "type": "singlestat",
+ "valueFontSize": "100%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "cacheTimeout": null,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "description": "Shows latency & Throughput between source & destination applications",
+ "fill": 2,
+ "fillGradient": 4,
+ "gridPos": {
+ "h": 11,
+ "w": 24,
+ "x": 0,
+ "y": 4
+ },
+ "hiddenSeries": false,
+ "id": 2,
+ "interval": "",
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 2,
+ "links": [],
+ "nullPointMode": "connected",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pluginVersion": "6.4.2",
+ "pointradius": 2,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "alias": "Latency",
+ "groupBy": [
+ {
+ "params": [
+ "1s"
+ ],
+ "type": "time"
+ },
+ {
+ "params": [
+ "null"
+ ],
+ "type": "fill"
+ }
+ ],
+ "measurement": "/^$scenario$/",
+ "orderByTime": "ASC",
+ "policy": "default",
+ "query": "SELECT mean(\"lat\") FROM $database.autogen.network WHERE (\"src\" =~ /^$src$/ AND \"dest\" =~ /^$dest$/) AND $timeFilter GROUP BY time(1s)",
+ "rawQuery": true,
+ "refId": "A",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "lat"
+ ],
+ "type": "field"
+ },
+ {
+ "params": [],
+ "type": "mean"
+ }
+ ]
+ ],
+ "tags": [
+ {
+ "key": "src",
+ "operator": "=~",
+ "value": "/^$src$/"
+ },
+ {
+ "condition": "AND",
+ "key": "dest",
+ "operator": "=~",
+ "value": "/^$dest$/"
+ }
+ ]
+ },
+ {
+ "alias": "UL Throughput",
+ "groupBy": [
+ {
+ "params": [
+ "$__interval"
+ ],
+ "type": "time"
+ },
+ {
+ "params": [
+ "null"
+ ],
+ "type": "fill"
+ }
+ ],
+ "measurement": "network",
+ "orderByTime": "ASC",
+ "policy": "default",
+ "query": "SELECT mean(\"ul\") FROM $database.autogen.network WHERE (\"src\" =~ /^$src$/ AND \"dest\" =~ /^$dest$/) AND $timeFilter GROUP BY time(1s)",
+ "rawQuery": true,
+ "refId": "B",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "ul"
+ ],
+ "type": "field"
+ },
+ {
+ "params": [],
+ "type": "mean"
+ }
+ ]
+ ],
+ "tags": [
+ {
+ "key": "src",
+ "operator": "=~",
+ "value": "/^$src$/"
+ },
+ {
+ "condition": "AND",
+ "key": "dest",
+ "operator": "=~",
+ "value": "/^$dest$/"
+ }
+ ]
+ },
+ {
+ "alias": "DL Throughput",
+ "groupBy": [
+ {
+ "params": [
+ "$__interval"
+ ],
+ "type": "time"
+ },
+ {
+ "params": [
+ "null"
+ ],
+ "type": "fill"
+ }
+ ],
+ "measurement": "network",
+ "orderByTime": "ASC",
+ "policy": "default",
+ "query": "SELECT mean(\"dl\") FROM $database.autogen.network WHERE (\"src\" =~ /^$src$/ AND \"dest\" =~ /^$dest$/) AND $timeFilter GROUP BY time(1s)",
+ "rawQuery": true,
+ "refId": "C",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "dl"
+ ],
+ "type": "field"
+ },
+ {
+ "params": [],
+ "type": "mean"
+ }
+ ]
+ ],
+ "tags": [
+ {
+ "key": "src",
+ "operator": "=~",
+ "value": "/^$src$/"
+ },
+ {
+ "condition": "AND",
+ "key": "dest",
+ "operator": "=~",
+ "value": "/^$dest$/"
+ }
+ ]
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Latency, UL & DL Throughput",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": "Latency (ms)",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": "Throughput (Mbps)",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "cacheTimeout": null,
+ "columns": [],
+ "datasource": "$datasource",
+ "fontSize": "100%",
+ "gridPos": {
+ "h": 6,
+ "w": 24,
+ "x": 0,
+ "y": 15
+ },
+ "id": 4,
+ "links": [],
+ "options": {},
+ "pageSize": null,
+ "pluginVersion": "6.4.2",
+ "showHeader": true,
+ "sort": {
+ "col": 0,
+ "desc": true
+ },
+ "styles": [
+ {
+ "alias": "Time",
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "pattern": "Time",
+ "type": "date"
+ },
+ {
+ "alias": "Type",
+ "colorMode": null,
+ "colors": [
+ "#C4162A",
+ "rgba(237, 129, 40, 0.89)",
+ "rgba(50, 172, 45, 0.97)"
+ ],
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "decimals": 2,
+ "mappingType": 1,
+ "pattern": "events.type",
+ "thresholds": [],
+ "type": "string",
+ "unit": "short",
+ "valueMaps": [
+ {
+ "text": "Net Char",
+ "value": "NETWORK-CHARACTERISTICS-UPDATE"
+ },
+ {
+ "text": "Mobility",
+ "value": "MOBILITY"
+ }
+ ]
+ },
+ {
+ "alias": "Description",
+ "colorMode": null,
+ "colors": [
+ "rgba(245, 54, 54, 0.9)",
+ "rgba(237, 129, 40, 0.89)",
+ "rgba(50, 172, 45, 0.97)"
+ ],
+ "decimals": 2,
+ "mappingType": 1,
+ "pattern": "events.description",
+ "thresholds": [],
+ "type": "string",
+ "unit": "short",
+ "valueMaps": []
+ }
+ ],
+ "targets": [
+ {
+ "groupBy": [],
+ "hide": false,
+ "measurement": "events",
+ "orderByTime": "ASC",
+ "policy": "default",
+ "query": "SELECT type,description FROM $database.autogen.events WHERE $timeFilter ORDER BY time desc LIMIT 100",
+ "rawQuery": true,
+ "refId": "A",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "event"
+ ],
+ "type": "field"
+ }
+ ]
+ ],
+ "tags": []
+ }
+ ],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Events",
+ "transform": "timeseries_to_columns",
+ "type": "table"
+ }
+ ],
+ "refresh": "1s",
+ "schemaVersion": 21,
+ "style": "dark",
+ "tags": [],
+ "templating": {
+ "list": [
+ {
+ "current": {
+ "text": "meep-influxdb",
+ "value": "meep-influxdb"
+ },
+ "hide": 0,
+ "includeAll": false,
+ "label": "",
+ "multi": false,
+ "name": "datasource",
+ "options": [],
+ "query": "influxdb",
+ "refresh": 1,
+ "regex": "",
+ "skipUrlSync": false,
+ "type": "datasource"
+ },
+ {
+ "allValue": null,
+ "current": {
+ "text": "demo1",
+ "value": "demo1"
+ },
+ "datasource": "$datasource",
+ "definition": "show databases",
+ "hide": 0,
+ "includeAll": false,
+ "label": null,
+ "multi": false,
+ "name": "database",
+ "options": [],
+ "query": "show databases",
+ "refresh": 1,
+ "regex": "",
+ "skipUrlSync": false,
+ "sort": 0,
+ "tagValuesQuery": "",
+ "tags": [],
+ "tagsQuery": "",
+ "type": "query",
+ "useTags": false
+ },
+ {
+ "allValue": null,
+ "current": {
+ "text": "ue1-iperf",
+ "value": "ue1-iperf"
+ },
+ "datasource": "$datasource",
+ "definition": "show tag values on $database from network with key = \"src\"",
+ "hide": 0,
+ "includeAll": false,
+ "label": "",
+ "multi": false,
+ "name": "src",
+ "options": [],
+ "query": "show tag values on $database from network with key = \"src\"",
+ "refresh": 1,
+ "regex": "",
+ "skipUrlSync": false,
+ "sort": 0,
+ "tagValuesQuery": "",
+ "tags": [],
+ "tagsQuery": "",
+ "type": "query",
+ "useTags": false
+ },
+ {
+ "allValue": null,
+ "current": {
+ "text": "zone1-fog1-iperf",
+ "value": "zone1-fog1-iperf"
+ },
+ "datasource": "$datasource",
+ "definition": "show tag values on $database from network with key = \"dest\"",
+ "hide": 0,
+ "includeAll": false,
+ "label": "",
+ "multi": false,
+ "name": "dest",
+ "options": [],
+ "query": "show tag values on $database from network with key = \"dest\"",
+ "refresh": 1,
+ "regex": "",
+ "skipUrlSync": false,
+ "sort": 0,
+ "tagValuesQuery": "",
+ "tags": [],
+ "tagsQuery": "",
+ "type": "query",
+ "useTags": false
+ }
+ ]
+ },
+ "time": {
+ "from": "now-1m",
+ "to": "now"
+ },
+ "timepicker": {
+ "hidden": false,
+ "refresh_intervals": [
+ "1s",
+ "5s",
+ "10s",
+ "30s",
+ "1m",
+ "5m",
+ "15m",
+ "30m",
+ "1h",
+ "2h",
+ "1d"
+ ]
+ },
+ "timezone": "",
+ "title": "Network Metrics Point-to-Point",
+ "uid": "1",
+ "version": 5
+}
\ No newline at end of file
diff --git a/agw-deployer/helm/charts/grafana/dashboards/platform-advantedge-thanos.json b/agw-deployer/helm/charts/grafana/dashboards/platform-advantedge-thanos.json
new file mode 100644
index 0000000..8ba90bd
--- /dev/null
+++ b/agw-deployer/helm/charts/grafana/dashboards/platform-advantedge-thanos.json
@@ -0,0 +1,1116 @@
+{
+ "annotations": {
+ "list": [
+ {
+ "builtIn": 1,
+ "datasource": "-- Grafana --",
+ "enable": true,
+ "hide": true,
+ "iconColor": "rgba(0, 211, 255, 1)",
+ "name": "Annotations & Alerts",
+ "type": "dashboard"
+ }
+ ]
+ },
+ "editable": true,
+ "gnetId": null,
+ "graphTooltip": 0,
+ "id": 9,
+ "iteration": 1633697259754,
+ "links": [],
+ "panels": [
+ {
+ "collapsed": false,
+ "datasource": null,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 0
+ },
+ "id": 91,
+ "panels": [],
+ "title": "Sandbox Metrics",
+ "type": "row"
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "meep-influxdb",
+ "decimals": 2,
+ "fieldConfig": {
+ "defaults": {
+ "custom": {},
+ "displayName": "Sbox Creation Time",
+ "unit": "s"
+ },
+ "overrides": []
+ },
+ "fill": 1,
+ "fillGradient": 7,
+ "gridPos": {
+ "h": 7,
+ "w": 10,
+ "x": 0,
+ "y": 1
+ },
+ "hiddenSeries": false,
+ "id": 93,
+ "interval": "",
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": false,
+ "hideEmpty": false,
+ "hideZero": false,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": false,
+ "linewidth": 2,
+ "nullPointMode": "null",
+ "options": {
+ "alertThreshold": true
+ },
+ "percentage": false,
+ "pluginVersion": "7.3.5",
+ "pointradius": 2,
+ "points": true,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "alias": "",
+ "groupBy": [
+ {
+ "params": [
+ "$__interval"
+ ],
+ "type": "time"
+ },
+ {
+ "params": [
+ "null"
+ ],
+ "type": "fill"
+ }
+ ],
+ "hide": false,
+ "orderByTime": "ASC",
+ "policy": "default",
+ "query": "SELECT createtime FROM global_sandbox_metrics.autogen.sbox WHERE $timeFilter",
+ "rawQuery": true,
+ "refId": "A",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "value"
+ ],
+ "type": "field"
+ }
+ ]
+ ],
+ "tags": []
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Sandbox Creation Time",
+ "tooltip": {
+ "shared": false,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "decimals": 0,
+ "format": "s",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "datasource": "Thanos",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {},
+ "decimals": 0,
+ "mappings": [],
+ "noValue": "0",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ }
+ ]
+ },
+ "unit": "s"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 7,
+ "w": 4,
+ "x": 10,
+ "y": 1
+ },
+ "id": 95,
+ "options": {
+ "colorMode": "value",
+ "graphMode": "area",
+ "justifyMode": "auto",
+ "orientation": "auto",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "textMode": "value"
+ },
+ "pluginVersion": "7.3.5",
+ "targets": [
+ {
+ "expr": "sum(increase(mon_engine_sbox_create_duration_sum{replica=~\"$replica\"}[$__range])) / sum(increase(mon_engine_sbox_create_duration_count{replica=~\"$replica\"}[$__range]))",
+ "instant": true,
+ "interval": "",
+ "intervalFactor": 1,
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Average Sandbox Creation Time",
+ "type": "stat"
+ },
+ {
+ "datasource": "Thanos",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {},
+ "decimals": 0,
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "dark-green",
+ "value": null
+ },
+ {
+ "color": "light-green",
+ "value": 0
+ }
+ ]
+ }
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 7,
+ "w": 10,
+ "x": 14,
+ "y": 1
+ },
+ "id": 97,
+ "options": {
+ "displayMode": "gradient",
+ "orientation": "auto",
+ "reduceOptions": {
+ "calcs": [
+ "max"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showUnfilled": true
+ },
+ "pluginVersion": "7.3.5",
+ "targets": [
+ {
+ "expr": "sum by (le) (increase(mon_engine_sbox_create_duration_bucket{replica=~\"$replica\"}[$__range]))",
+ "format": "heatmap",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "{{le}}",
+ "refId": "A"
+ }
+ ],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Sandbox Creation Time Distribution (seconds)",
+ "transformations": [],
+ "type": "bargauge"
+ },
+ {
+ "collapsed": false,
+ "datasource": null,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 8
+ },
+ "id": 37,
+ "panels": [],
+ "title": "Platform API Requests & Notifications",
+ "type": "row"
+ },
+ {
+ "datasource": null,
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 1,
+ "w": 12,
+ "x": 0,
+ "y": 9
+ },
+ "id": 78,
+ "options": {
+ "content": "",
+ "mode": "markdown"
+ },
+ "pluginVersion": "7.3.5",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Requests",
+ "type": "text"
+ },
+ {
+ "datasource": null,
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 1,
+ "w": 12,
+ "x": 12,
+ "y": 9
+ },
+ "id": 79,
+ "options": {
+ "content": "",
+ "mode": "markdown"
+ },
+ "pluginVersion": "7.3.5",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Notifications",
+ "type": "text"
+ },
+ {
+ "datasource": "Thanos",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {},
+ "decimals": 0,
+ "mappings": [],
+ "noValue": "0",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "blue",
+ "value": null
+ }
+ ]
+ }
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 5,
+ "w": 4,
+ "x": 0,
+ "y": 10
+ },
+ "id": 55,
+ "options": {
+ "colorMode": "value",
+ "graphMode": "area",
+ "justifyMode": "auto",
+ "orientation": "auto",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "textMode": "value"
+ },
+ "pluginVersion": "7.3.5",
+ "targets": [
+ {
+ "expr": "sum((max_over_time(metrics_http_request_duration_count{replica=~\"$replica\",svc=~\"$service\"}[$__range]) - metrics_http_request_duration_count{replica=~\"$replica\",svc=~\"$service\"} offset $__range) or (max_over_time(metrics_http_request_duration_count{replica=~\"$replica\",svc=~\"$service\"}[$__range]) unless metrics_http_request_duration_count{replica=~\"$replica\",svc=~\"$service\"} offset $__range)) or vector(0)",
+ "instant": true,
+ "interval": "",
+ "intervalFactor": 1,
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Total Requests",
+ "type": "stat"
+ },
+ {
+ "datasource": "Thanos",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {},
+ "decimals": 0,
+ "mappings": [],
+ "noValue": "0",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "dark-blue",
+ "value": null
+ },
+ {
+ "color": "blue",
+ "value": 0
+ }
+ ]
+ }
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 5,
+ "w": 8,
+ "x": 4,
+ "y": 10
+ },
+ "id": 77,
+ "options": {
+ "displayMode": "gradient",
+ "orientation": "horizontal",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showUnfilled": true
+ },
+ "pluginVersion": "7.3.5",
+ "targets": [
+ {
+ "expr": "sum((max_over_time(metrics_http_request_duration_count{replica=~\"$replica\",svc=~\"$service\",status=~\"2.*\"}[$__range]) - metrics_http_request_duration_count{replica=~\"$replica\",svc=~\"$service\",status=~\"2.*\"} offset $__range) or (max_over_time(metrics_http_request_duration_count{replica=~\"$replica\",svc=~\"$service\",status=~\"2.*\"}[$__range]) unless metrics_http_request_duration_count{replica=~\"$replica\",svc=~\"$service\",status=~\"2.*\"} offset $__range)) or vector(0)",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "2xx",
+ "refId": "B"
+ },
+ {
+ "expr": "sum((max_over_time(metrics_http_request_duration_count{replica=~\"$replica\",svc=~\"$service\",status=~\"3.*\"}[$__range]) - metrics_http_request_duration_count{replica=~\"$replica\",svc=~\"$service\",status=~\"3.*\"} offset $__range) or (max_over_time(metrics_http_request_duration_count{replica=~\"$replica\",svc=~\"$service\",status=~\"3.*\"}[$__range]) unless metrics_http_request_duration_count{replica=~\"$replica\",svc=~\"$service\",status=~\"3.*\"} offset $__range)) or vector(0)",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "3xx",
+ "refId": "C"
+ },
+ {
+ "expr": "sum((max_over_time(metrics_http_request_duration_count{replica=~\"$replica\",svc=~\"$service\",status=~\"4.*\"}[$__range]) - metrics_http_request_duration_count{replica=~\"$replica\",svc=~\"$service\",status=~\"4.*\"} offset $__range) or (max_over_time(metrics_http_request_duration_count{replica=~\"$replica\",svc=~\"$service\",status=~\"4.*\"}[$__range]) unless metrics_http_request_duration_count{replica=~\"$replica\",svc=~\"$service\",status=~\"4.*\"} offset $__range)) or vector(0)",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "4xx",
+ "refId": "D"
+ },
+ {
+ "expr": "sum((max_over_time(metrics_http_request_duration_count{replica=~\"$replica\",svc=~\"$service\",status=~\"5.*\"}[$__range]) - metrics_http_request_duration_count{replica=~\"$replica\",svc=~\"$service\",status=~\"5.*\"} offset $__range) or (max_over_time(metrics_http_request_duration_count{replica=~\"$replica\",svc=~\"$service\",status=~\"5.*\"}[$__range]) unless metrics_http_request_duration_count{replica=~\"$replica\",svc=~\"$service\",status=~\"5.*\"} offset $__range)) or vector(0)",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "5xx",
+ "refId": "E"
+ }
+ ],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Request Response Codes",
+ "type": "bargauge"
+ },
+ {
+ "datasource": "Thanos",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {},
+ "decimals": 0,
+ "mappings": [],
+ "noValue": "0",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "purple",
+ "value": null
+ }
+ ]
+ }
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 5,
+ "w": 4,
+ "x": 12,
+ "y": 10
+ },
+ "id": 85,
+ "options": {
+ "colorMode": "value",
+ "graphMode": "area",
+ "justifyMode": "auto",
+ "orientation": "auto",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "textMode": "value"
+ },
+ "pluginVersion": "7.3.5",
+ "targets": [
+ {
+ "expr": "sum((max_over_time(metrics_http_notification_duration_count{replica=~\"$replica\",svc=~\"$service\"}[$__range]) - metrics_http_notification_duration_count{replica=~\"$replica\",svc=~\"$service\"} offset $__range) or (max_over_time(metrics_http_notification_duration_count{replica=~\"$replica\",svc=~\"$service\"}[$__range]) unless metrics_http_notification_duration_count{replica=~\"$replica\",svc=~\"$service\"} offset $__range)) or vector(0)",
+ "instant": true,
+ "interval": "",
+ "intervalFactor": 1,
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Total Notifications",
+ "type": "stat"
+ },
+ {
+ "datasource": "Thanos",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {},
+ "decimals": 0,
+ "mappings": [],
+ "noValue": "0",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "dark-purple",
+ "value": null
+ },
+ {
+ "color": "purple",
+ "value": 0
+ }
+ ]
+ }
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 5,
+ "w": 8,
+ "x": 16,
+ "y": 10
+ },
+ "id": 86,
+ "options": {
+ "displayMode": "gradient",
+ "orientation": "horizontal",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showUnfilled": true
+ },
+ "pluginVersion": "7.3.5",
+ "targets": [
+ {
+ "expr": "sum((max_over_time(metrics_http_notification_duration_count{replica=~\"$replica\",svc=~\"$service\",status=~\"2.*\"}[$__range]) - metrics_http_notification_duration_count{replica=~\"$replica\",svc=~\"$service\",status=~\"2.*\"} offset $__range) or (max_over_time(metrics_http_notification_duration_count{replica=~\"$replica\",svc=~\"$service\",status=~\"2.*\"}[$__range]) unless metrics_http_notification_duration_count{replica=~\"$replica\",svc=~\"$service\",status=~\"2.*\"} offset $__range)) or vector(0)",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "2xx",
+ "refId": "B"
+ },
+ {
+ "expr": "sum((max_over_time(metrics_http_notification_duration_count{replica=~\"$replica\",svc=~\"$service\",status=~\"3.*\"}[$__range]) - metrics_http_notification_duration_count{replica=~\"$replica\",svc=~\"$service\",status=~\"3.*\"} offset $__range) or (max_over_time(metrics_http_notification_duration_count{replica=~\"$replica\",svc=~\"$service\",status=~\"3.*\"}[$__range]) unless metrics_http_notification_duration_count{replica=~\"$replica\",svc=~\"$service\",status=~\"3.*\"} offset $__range)) or vector(0)",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "3xx",
+ "refId": "C"
+ },
+ {
+ "expr": "sum((max_over_time(metrics_http_notification_duration_count{replica=~\"$replica\",svc=~\"$service\",status=~\"4.*\"}[$__range]) - metrics_http_notification_duration_count{replica=~\"$replica\",svc=~\"$service\",status=~\"4.*\"} offset $__range) or (max_over_time(metrics_http_notification_duration_count{replica=~\"$replica\",svc=~\"$service\",status=~\"4.*\"}[$__range]) unless metrics_http_notification_duration_count{replica=~\"$replica\",svc=~\"$service\",status=~\"4.*\"} offset $__range)) or vector(0)",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "4xx",
+ "refId": "D"
+ },
+ {
+ "expr": "sum((max_over_time(metrics_http_notification_duration_count{replica=~\"$replica\",svc=~\"$service\",status=~\"5.*\"}[$__range]) - metrics_http_notification_duration_count{replica=~\"$replica\",svc=~\"$service\",status=~\"5.*\"} offset $__range) or (max_over_time(metrics_http_notification_duration_count{replica=~\"$replica\",svc=~\"$service\",status=~\"5.*\"}[$__range]) unless metrics_http_notification_duration_count{replica=~\"$replica\",svc=~\"$service\",status=~\"5.*\"} offset $__range)) or vector(0)",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "5xx",
+ "refId": "E"
+ }
+ ],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Notification Response Codes",
+ "type": "bargauge"
+ },
+ {
+ "datasource": "Thanos",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {
+ "align": "left",
+ "filterable": false
+ },
+ "decimals": 0,
+ "displayName": "${__series.name}",
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "dark-blue",
+ "value": null
+ },
+ {
+ "color": "blue",
+ "value": 0
+ }
+ ]
+ }
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 9,
+ "w": 12,
+ "x": 0,
+ "y": 15
+ },
+ "id": 30,
+ "options": {
+ "displayMode": "gradient",
+ "orientation": "horizontal",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showUnfilled": true
+ },
+ "pluginVersion": "7.3.5",
+ "targets": [
+ {
+ "expr": "topk(10, sort_desc(sum by (svc,path,method)((max_over_time(metrics_http_request_duration_count{replica=~\"$replica\",svc=~\"$service\"}[$__range]) - metrics_http_request_duration_count{replica=~\"$replica\",svc=~\"$service\"} offset $__range) or (max_over_time(metrics_http_request_duration_count{replica=~\"$replica\",svc=~\"$service\"}[$__range]) unless metrics_http_request_duration_count{replica=~\"$replica\",svc=~\"$service\"} offset $__range))))",
+ "format": "time_series",
+ "instant": true,
+ "interval": "",
+ "intervalFactor": 1,
+ "legendFormat": "{{method}} {{path}}",
+ "refId": "A"
+ }
+ ],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Top 10 Requests",
+ "type": "bargauge"
+ },
+ {
+ "datasource": "Thanos",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {
+ "align": "left",
+ "filterable": false
+ },
+ "decimals": 0,
+ "displayName": "${__series.name}",
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "dark-purple",
+ "value": null
+ },
+ {
+ "color": "purple",
+ "value": 0
+ }
+ ]
+ }
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "method"
+ },
+ "properties": [
+ {
+ "id": "custom.width",
+ "value": 121
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Time"
+ },
+ "properties": [
+ {
+ "id": "custom.width",
+ "value": 166
+ }
+ ]
+ }
+ ]
+ },
+ "gridPos": {
+ "h": 9,
+ "w": 12,
+ "x": 12,
+ "y": 15
+ },
+ "id": 87,
+ "options": {
+ "displayMode": "gradient",
+ "orientation": "horizontal",
+ "reduceOptions": {
+ "calcs": [
+ "mean"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showUnfilled": true
+ },
+ "pluginVersion": "7.3.5",
+ "targets": [
+ {
+ "expr": "topk(10, sort_desc(sum by (svc,notif)((max_over_time(metrics_http_notification_duration_count{replica=~\"$replica\",svc=~\"$service\"}[$__range]) - metrics_http_notification_duration_count{replica=~\"$replica\",svc=~\"$service\"} offset $__range) or (max_over_time(metrics_http_notification_duration_count{replica=~\"$replica\",svc=~\"$service\"}[$__range]) unless metrics_http_notification_duration_count{replica=~\"$replica\",svc=~\"$service\"} offset $__range))))",
+ "format": "time_series",
+ "instant": true,
+ "interval": "",
+ "intervalFactor": 1,
+ "legendFormat": "{{svc}} | {{notif}}",
+ "refId": "A"
+ }
+ ],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Top 10 Notifications",
+ "type": "bargauge"
+ },
+ {
+ "datasource": "Thanos",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {},
+ "decimals": 0,
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "dark-blue",
+ "value": null
+ },
+ {
+ "color": "blue",
+ "value": 0
+ }
+ ]
+ }
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 6,
+ "w": 12,
+ "x": 0,
+ "y": 24
+ },
+ "id": 33,
+ "options": {
+ "displayMode": "gradient",
+ "orientation": "auto",
+ "reduceOptions": {
+ "calcs": [
+ "max"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showUnfilled": true
+ },
+ "pluginVersion": "7.3.5",
+ "targets": [
+ {
+ "expr": "sum by (le) ((max_over_time(metrics_http_request_duration_bucket{replica=~\"$replica\",svc=~\"$service\"}[$__range]) - metrics_http_request_duration_bucket{replica=~\"$replica\",svc=~\"$service\"} offset $__range) or (max_over_time(metrics_http_request_duration_bucket{replica=~\"$replica\",svc=~\"$service\"}[$__range]) unless metrics_http_request_duration_bucket{replica=~\"$replica\",svc=~\"$service\"} offset $__range))",
+ "format": "heatmap",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "{{le}}",
+ "refId": "A"
+ }
+ ],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Request Duration Distribution (ms)",
+ "transformations": [],
+ "type": "bargauge"
+ },
+ {
+ "datasource": "Thanos",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {},
+ "decimals": 0,
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "dark-purple",
+ "value": null
+ },
+ {
+ "color": "purple",
+ "value": 0
+ }
+ ]
+ }
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 6,
+ "w": 12,
+ "x": 12,
+ "y": 24
+ },
+ "id": 88,
+ "options": {
+ "displayMode": "gradient",
+ "orientation": "auto",
+ "reduceOptions": {
+ "calcs": [
+ "max"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showUnfilled": true
+ },
+ "pluginVersion": "7.3.5",
+ "targets": [
+ {
+ "expr": "sum by (le) ((max_over_time(metrics_http_notification_duration_bucket{replica=~\"$replica\",svc=~\"$service\"}[$__range]) - metrics_http_notification_duration_bucket{replica=~\"$replica\",svc=~\"$service\"} offset $__range) or (max_over_time(metrics_http_notification_duration_bucket{replica=~\"$replica\",svc=~\"$service\"}[$__range]) unless metrics_http_notification_duration_bucket{replica=~\"$replica\",svc=~\"$service\"} offset $__range))",
+ "format": "heatmap",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "{{le}}",
+ "refId": "A"
+ }
+ ],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Notification Processing Time Distribution (ms)",
+ "transformations": [],
+ "type": "bargauge"
+ },
+ {
+ "datasource": "Thanos",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {
+ "align": "left",
+ "filterable": false
+ },
+ "decimals": 0,
+ "displayName": "${__series.name}",
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "dark-blue",
+ "value": null
+ },
+ {
+ "color": "blue",
+ "value": 0
+ }
+ ]
+ },
+ "unit": "ms"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 9,
+ "w": 12,
+ "x": 0,
+ "y": 30
+ },
+ "id": 38,
+ "options": {
+ "displayMode": "gradient",
+ "orientation": "horizontal",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showUnfilled": true
+ },
+ "pluginVersion": "7.3.5",
+ "targets": [
+ {
+ "expr": "topk(10, sort_desc(rate(metrics_http_request_duration_sum{replica=~\"$replica\",svc=~\"$service\"}[$__range]) / rate(metrics_http_request_duration_count{replica=~\"$replica\",svc!=\"Auth Service\"}[$__range])))",
+ "format": "time_series",
+ "instant": true,
+ "interval": "",
+ "intervalFactor": 1,
+ "legendFormat": "{{method}} {{path}}",
+ "refId": "A"
+ }
+ ],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Top 10 Highest Average Request Processing Time",
+ "type": "bargauge"
+ },
+ {
+ "datasource": "Thanos",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {
+ "align": "left",
+ "filterable": false
+ },
+ "decimals": 0,
+ "displayName": "${__series.name}",
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "dark-purple",
+ "value": null
+ },
+ {
+ "color": "purple",
+ "value": 0
+ }
+ ]
+ },
+ "unit": "ms"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 9,
+ "w": 12,
+ "x": 12,
+ "y": 30
+ },
+ "id": 89,
+ "options": {
+ "displayMode": "gradient",
+ "orientation": "horizontal",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showUnfilled": true
+ },
+ "pluginVersion": "7.3.5",
+ "targets": [
+ {
+ "expr": "topk(10, sort_desc(avg by (svc,notif) (rate(metrics_http_notification_duration_sum{replica=~\"$replica\",svc=~\"$service\"}[$__range]) / rate(metrics_http_notification_duration_count{replica=~\"$replica\",svc=~\"$service\"}[$__range]))))",
+ "format": "time_series",
+ "instant": true,
+ "interval": "",
+ "intervalFactor": 1,
+ "legendFormat": "{{svc}} | {{notif}}",
+ "refId": "A"
+ }
+ ],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Top 5 Highest Average Notification Processing Times",
+ "type": "bargauge"
+ }
+ ],
+ "refresh": "",
+ "schemaVersion": 26,
+ "style": "dark",
+ "tags": [],
+ "templating": {
+ "list": [
+ {
+ "allValue": "",
+ "current": {
+ "selected": true,
+ "tags": [],
+ "text": [
+ "All"
+ ],
+ "value": [
+ "$__all"
+ ]
+ },
+ "datasource": "Thanos",
+ "definition": "label_values(metrics_http_request_duration_count, svc)",
+ "error": null,
+ "hide": 0,
+ "includeAll": true,
+ "label": "Service",
+ "multi": true,
+ "name": "service",
+ "options": [],
+ "query": "label_values(metrics_http_request_duration_count, svc)",
+ "refresh": 2,
+ "regex": "",
+ "skipUrlSync": false,
+ "sort": 1,
+ "tagValuesQuery": "",
+ "tags": [],
+ "tagsQuery": "",
+ "type": "query",
+ "useTags": false
+ },
+ {
+ "allValue": null,
+ "current": {
+ "selected": true,
+ "tags": [],
+ "text": [
+ "All"
+ ],
+ "value": [
+ "$__all"
+ ]
+ },
+ "datasource": "Thanos",
+ "definition": "label_values(metrics_http_request_duration_count, replica) ",
+ "error": null,
+ "hide": 0,
+ "includeAll": true,
+ "label": "Instance",
+ "multi": true,
+ "name": "replica",
+ "options": [],
+ "query": "label_values(metrics_http_request_duration_count, replica) ",
+ "refresh": 2,
+ "regex": "",
+ "skipUrlSync": false,
+ "sort": 2,
+ "tagValuesQuery": "",
+ "tags": [],
+ "tagsQuery": "",
+ "type": "query",
+ "useTags": false
+ }
+ ]
+ },
+ "time": {
+ "from": "now-24h",
+ "to": "now"
+ },
+ "timepicker": {
+ "refresh_intervals": [
+ "5s",
+ "10s",
+ "15s",
+ "30s",
+ "1m",
+ "5m",
+ "15m",
+ "30m",
+ "1h",
+ "2h",
+ "1d"
+ ]
+ },
+ "timezone": "",
+ "title": "Platform (AdvantEDGE)",
+ "uid": "platform-advantedge",
+ "version": 3
+}
+
diff --git a/agw-deployer/helm/charts/grafana/dashboards/platform-advantedge.json b/agw-deployer/helm/charts/grafana/dashboards/platform-advantedge.json
new file mode 100644
index 0000000..eaec53f
--- /dev/null
+++ b/agw-deployer/helm/charts/grafana/dashboards/platform-advantedge.json
@@ -0,0 +1,1116 @@
+{
+ "annotations": {
+ "list": [
+ {
+ "builtIn": 1,
+ "datasource": "-- Grafana --",
+ "enable": true,
+ "hide": true,
+ "iconColor": "rgba(0, 211, 255, 1)",
+ "name": "Annotations & Alerts",
+ "type": "dashboard"
+ }
+ ]
+ },
+ "editable": true,
+ "gnetId": null,
+ "graphTooltip": 0,
+ "id": 9,
+ "iteration": 1633697259754,
+ "links": [],
+ "panels": [
+ {
+ "collapsed": false,
+ "datasource": null,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 0
+ },
+ "id": 91,
+ "panels": [],
+ "title": "Sandbox Metrics",
+ "type": "row"
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "meep-influxdb",
+ "decimals": 2,
+ "fieldConfig": {
+ "defaults": {
+ "custom": {},
+ "displayName": "Sbox Creation Time",
+ "unit": "s"
+ },
+ "overrides": []
+ },
+ "fill": 1,
+ "fillGradient": 7,
+ "gridPos": {
+ "h": 7,
+ "w": 10,
+ "x": 0,
+ "y": 1
+ },
+ "hiddenSeries": false,
+ "id": 93,
+ "interval": "",
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": false,
+ "hideEmpty": false,
+ "hideZero": false,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": false,
+ "linewidth": 2,
+ "nullPointMode": "null",
+ "options": {
+ "alertThreshold": true
+ },
+ "percentage": false,
+ "pluginVersion": "7.3.5",
+ "pointradius": 2,
+ "points": true,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "alias": "",
+ "groupBy": [
+ {
+ "params": [
+ "$__interval"
+ ],
+ "type": "time"
+ },
+ {
+ "params": [
+ "null"
+ ],
+ "type": "fill"
+ }
+ ],
+ "hide": false,
+ "orderByTime": "ASC",
+ "policy": "default",
+ "query": "SELECT createtime FROM global_sandbox_metrics.autogen.sbox WHERE $timeFilter",
+ "rawQuery": true,
+ "refId": "A",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "value"
+ ],
+ "type": "field"
+ }
+ ]
+ ],
+ "tags": []
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Sandbox Creation Time",
+ "tooltip": {
+ "shared": false,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "decimals": 0,
+ "format": "s",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "datasource": "Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {},
+ "decimals": 0,
+ "mappings": [],
+ "noValue": "0",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ }
+ ]
+ },
+ "unit": "s"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 7,
+ "w": 4,
+ "x": 10,
+ "y": 1
+ },
+ "id": 95,
+ "options": {
+ "colorMode": "value",
+ "graphMode": "area",
+ "justifyMode": "auto",
+ "orientation": "auto",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "textMode": "value"
+ },
+ "pluginVersion": "7.3.5",
+ "targets": [
+ {
+ "expr": "sum(increase(mon_engine_sbox_create_duration_sum{replica=~\"$replica\"}[$__range])) / sum(increase(mon_engine_sbox_create_duration_count{replica=~\"$replica\"}[$__range]))",
+ "instant": true,
+ "interval": "",
+ "intervalFactor": 1,
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Average Sandbox Creation Time",
+ "type": "stat"
+ },
+ {
+ "datasource": "Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {},
+ "decimals": 0,
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "dark-green",
+ "value": null
+ },
+ {
+ "color": "light-green",
+ "value": 0
+ }
+ ]
+ }
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 7,
+ "w": 10,
+ "x": 14,
+ "y": 1
+ },
+ "id": 97,
+ "options": {
+ "displayMode": "gradient",
+ "orientation": "auto",
+ "reduceOptions": {
+ "calcs": [
+ "max"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showUnfilled": true
+ },
+ "pluginVersion": "7.3.5",
+ "targets": [
+ {
+ "expr": "sum by (le) (increase(mon_engine_sbox_create_duration_bucket{replica=~\"$replica\"}[$__range]))",
+ "format": "heatmap",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "{{le}}",
+ "refId": "A"
+ }
+ ],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Sandbox Creation Time Distribution (seconds)",
+ "transformations": [],
+ "type": "bargauge"
+ },
+ {
+ "collapsed": false,
+ "datasource": null,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 8
+ },
+ "id": 37,
+ "panels": [],
+ "title": "Platform API Requests & Notifications",
+ "type": "row"
+ },
+ {
+ "datasource": null,
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 1,
+ "w": 12,
+ "x": 0,
+ "y": 9
+ },
+ "id": 78,
+ "options": {
+ "content": "",
+ "mode": "markdown"
+ },
+ "pluginVersion": "7.3.5",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Requests",
+ "type": "text"
+ },
+ {
+ "datasource": null,
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 1,
+ "w": 12,
+ "x": 12,
+ "y": 9
+ },
+ "id": 79,
+ "options": {
+ "content": "",
+ "mode": "markdown"
+ },
+ "pluginVersion": "7.3.5",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Notifications",
+ "type": "text"
+ },
+ {
+ "datasource": "Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {},
+ "decimals": 0,
+ "mappings": [],
+ "noValue": "0",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "blue",
+ "value": null
+ }
+ ]
+ }
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 5,
+ "w": 4,
+ "x": 0,
+ "y": 10
+ },
+ "id": 55,
+ "options": {
+ "colorMode": "value",
+ "graphMode": "area",
+ "justifyMode": "auto",
+ "orientation": "auto",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "textMode": "value"
+ },
+ "pluginVersion": "7.3.5",
+ "targets": [
+ {
+ "expr": "sum((max_over_time(metrics_http_request_duration_count{replica=~\"$replica\",svc=~\"$service\"}[$__range]) - metrics_http_request_duration_count{replica=~\"$replica\",svc=~\"$service\"} offset $__range) or (max_over_time(metrics_http_request_duration_count{replica=~\"$replica\",svc=~\"$service\"}[$__range]) unless metrics_http_request_duration_count{replica=~\"$replica\",svc=~\"$service\"} offset $__range)) or vector(0)",
+ "instant": true,
+ "interval": "",
+ "intervalFactor": 1,
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Total Requests",
+ "type": "stat"
+ },
+ {
+ "datasource": "Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {},
+ "decimals": 0,
+ "mappings": [],
+ "noValue": "0",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "dark-blue",
+ "value": null
+ },
+ {
+ "color": "blue",
+ "value": 0
+ }
+ ]
+ }
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 5,
+ "w": 8,
+ "x": 4,
+ "y": 10
+ },
+ "id": 77,
+ "options": {
+ "displayMode": "gradient",
+ "orientation": "horizontal",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showUnfilled": true
+ },
+ "pluginVersion": "7.3.5",
+ "targets": [
+ {
+ "expr": "sum((max_over_time(metrics_http_request_duration_count{replica=~\"$replica\",svc=~\"$service\",status=~\"2.*\"}[$__range]) - metrics_http_request_duration_count{replica=~\"$replica\",svc=~\"$service\",status=~\"2.*\"} offset $__range) or (max_over_time(metrics_http_request_duration_count{replica=~\"$replica\",svc=~\"$service\",status=~\"2.*\"}[$__range]) unless metrics_http_request_duration_count{replica=~\"$replica\",svc=~\"$service\",status=~\"2.*\"} offset $__range)) or vector(0)",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "2xx",
+ "refId": "B"
+ },
+ {
+ "expr": "sum((max_over_time(metrics_http_request_duration_count{replica=~\"$replica\",svc=~\"$service\",status=~\"3.*\"}[$__range]) - metrics_http_request_duration_count{replica=~\"$replica\",svc=~\"$service\",status=~\"3.*\"} offset $__range) or (max_over_time(metrics_http_request_duration_count{replica=~\"$replica\",svc=~\"$service\",status=~\"3.*\"}[$__range]) unless metrics_http_request_duration_count{replica=~\"$replica\",svc=~\"$service\",status=~\"3.*\"} offset $__range)) or vector(0)",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "3xx",
+ "refId": "C"
+ },
+ {
+ "expr": "sum((max_over_time(metrics_http_request_duration_count{replica=~\"$replica\",svc=~\"$service\",status=~\"4.*\"}[$__range]) - metrics_http_request_duration_count{replica=~\"$replica\",svc=~\"$service\",status=~\"4.*\"} offset $__range) or (max_over_time(metrics_http_request_duration_count{replica=~\"$replica\",svc=~\"$service\",status=~\"4.*\"}[$__range]) unless metrics_http_request_duration_count{replica=~\"$replica\",svc=~\"$service\",status=~\"4.*\"} offset $__range)) or vector(0)",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "4xx",
+ "refId": "D"
+ },
+ {
+ "expr": "sum((max_over_time(metrics_http_request_duration_count{replica=~\"$replica\",svc=~\"$service\",status=~\"5.*\"}[$__range]) - metrics_http_request_duration_count{replica=~\"$replica\",svc=~\"$service\",status=~\"5.*\"} offset $__range) or (max_over_time(metrics_http_request_duration_count{replica=~\"$replica\",svc=~\"$service\",status=~\"5.*\"}[$__range]) unless metrics_http_request_duration_count{replica=~\"$replica\",svc=~\"$service\",status=~\"5.*\"} offset $__range)) or vector(0)",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "5xx",
+ "refId": "E"
+ }
+ ],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Request Response Codes",
+ "type": "bargauge"
+ },
+ {
+ "datasource": "Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {},
+ "decimals": 0,
+ "mappings": [],
+ "noValue": "0",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "purple",
+ "value": null
+ }
+ ]
+ }
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 5,
+ "w": 4,
+ "x": 12,
+ "y": 10
+ },
+ "id": 85,
+ "options": {
+ "colorMode": "value",
+ "graphMode": "area",
+ "justifyMode": "auto",
+ "orientation": "auto",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "textMode": "value"
+ },
+ "pluginVersion": "7.3.5",
+ "targets": [
+ {
+ "expr": "sum((max_over_time(metrics_http_notification_duration_count{replica=~\"$replica\",svc=~\"$service\"}[$__range]) - metrics_http_notification_duration_count{replica=~\"$replica\",svc=~\"$service\"} offset $__range) or (max_over_time(metrics_http_notification_duration_count{replica=~\"$replica\",svc=~\"$service\"}[$__range]) unless metrics_http_notification_duration_count{replica=~\"$replica\",svc=~\"$service\"} offset $__range)) or vector(0)",
+ "instant": true,
+ "interval": "",
+ "intervalFactor": 1,
+ "legendFormat": "",
+ "refId": "A"
+ }
+ ],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Total Notifications",
+ "type": "stat"
+ },
+ {
+ "datasource": "Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {},
+ "decimals": 0,
+ "mappings": [],
+ "noValue": "0",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "dark-purple",
+ "value": null
+ },
+ {
+ "color": "purple",
+ "value": 0
+ }
+ ]
+ }
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 5,
+ "w": 8,
+ "x": 16,
+ "y": 10
+ },
+ "id": 86,
+ "options": {
+ "displayMode": "gradient",
+ "orientation": "horizontal",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showUnfilled": true
+ },
+ "pluginVersion": "7.3.5",
+ "targets": [
+ {
+ "expr": "sum((max_over_time(metrics_http_notification_duration_count{replica=~\"$replica\",svc=~\"$service\",status=~\"2.*\"}[$__range]) - metrics_http_notification_duration_count{replica=~\"$replica\",svc=~\"$service\",status=~\"2.*\"} offset $__range) or (max_over_time(metrics_http_notification_duration_count{replica=~\"$replica\",svc=~\"$service\",status=~\"2.*\"}[$__range]) unless metrics_http_notification_duration_count{replica=~\"$replica\",svc=~\"$service\",status=~\"2.*\"} offset $__range)) or vector(0)",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "2xx",
+ "refId": "B"
+ },
+ {
+ "expr": "sum((max_over_time(metrics_http_notification_duration_count{replica=~\"$replica\",svc=~\"$service\",status=~\"3.*\"}[$__range]) - metrics_http_notification_duration_count{replica=~\"$replica\",svc=~\"$service\",status=~\"3.*\"} offset $__range) or (max_over_time(metrics_http_notification_duration_count{replica=~\"$replica\",svc=~\"$service\",status=~\"3.*\"}[$__range]) unless metrics_http_notification_duration_count{replica=~\"$replica\",svc=~\"$service\",status=~\"3.*\"} offset $__range)) or vector(0)",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "3xx",
+ "refId": "C"
+ },
+ {
+ "expr": "sum((max_over_time(metrics_http_notification_duration_count{replica=~\"$replica\",svc=~\"$service\",status=~\"4.*\"}[$__range]) - metrics_http_notification_duration_count{replica=~\"$replica\",svc=~\"$service\",status=~\"4.*\"} offset $__range) or (max_over_time(metrics_http_notification_duration_count{replica=~\"$replica\",svc=~\"$service\",status=~\"4.*\"}[$__range]) unless metrics_http_notification_duration_count{replica=~\"$replica\",svc=~\"$service\",status=~\"4.*\"} offset $__range)) or vector(0)",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "4xx",
+ "refId": "D"
+ },
+ {
+ "expr": "sum((max_over_time(metrics_http_notification_duration_count{replica=~\"$replica\",svc=~\"$service\",status=~\"5.*\"}[$__range]) - metrics_http_notification_duration_count{replica=~\"$replica\",svc=~\"$service\",status=~\"5.*\"} offset $__range) or (max_over_time(metrics_http_notification_duration_count{replica=~\"$replica\",svc=~\"$service\",status=~\"5.*\"}[$__range]) unless metrics_http_notification_duration_count{replica=~\"$replica\",svc=~\"$service\",status=~\"5.*\"} offset $__range)) or vector(0)",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "5xx",
+ "refId": "E"
+ }
+ ],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Notification Response Codes",
+ "type": "bargauge"
+ },
+ {
+ "datasource": "Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {
+ "align": "left",
+ "filterable": false
+ },
+ "decimals": 0,
+ "displayName": "${__series.name}",
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "dark-blue",
+ "value": null
+ },
+ {
+ "color": "blue",
+ "value": 0
+ }
+ ]
+ }
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 9,
+ "w": 12,
+ "x": 0,
+ "y": 15
+ },
+ "id": 30,
+ "options": {
+ "displayMode": "gradient",
+ "orientation": "horizontal",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showUnfilled": true
+ },
+ "pluginVersion": "7.3.5",
+ "targets": [
+ {
+ "expr": "topk(10, sort_desc(sum by (svc,path,method)((max_over_time(metrics_http_request_duration_count{replica=~\"$replica\",svc=~\"$service\"}[$__range]) - metrics_http_request_duration_count{replica=~\"$replica\",svc=~\"$service\"} offset $__range) or (max_over_time(metrics_http_request_duration_count{replica=~\"$replica\",svc=~\"$service\"}[$__range]) unless metrics_http_request_duration_count{replica=~\"$replica\",svc=~\"$service\"} offset $__range))))",
+ "format": "time_series",
+ "instant": true,
+ "interval": "",
+ "intervalFactor": 1,
+ "legendFormat": "{{method}} {{path}}",
+ "refId": "A"
+ }
+ ],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Top 10 Requests",
+ "type": "bargauge"
+ },
+ {
+ "datasource": "Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {
+ "align": "left",
+ "filterable": false
+ },
+ "decimals": 0,
+ "displayName": "${__series.name}",
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "dark-purple",
+ "value": null
+ },
+ {
+ "color": "purple",
+ "value": 0
+ }
+ ]
+ }
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "method"
+ },
+ "properties": [
+ {
+ "id": "custom.width",
+ "value": 121
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Time"
+ },
+ "properties": [
+ {
+ "id": "custom.width",
+ "value": 166
+ }
+ ]
+ }
+ ]
+ },
+ "gridPos": {
+ "h": 9,
+ "w": 12,
+ "x": 12,
+ "y": 15
+ },
+ "id": 87,
+ "options": {
+ "displayMode": "gradient",
+ "orientation": "horizontal",
+ "reduceOptions": {
+ "calcs": [
+ "mean"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showUnfilled": true
+ },
+ "pluginVersion": "7.3.5",
+ "targets": [
+ {
+ "expr": "topk(10, sort_desc(sum by (svc,notif)((max_over_time(metrics_http_notification_duration_count{replica=~\"$replica\",svc=~\"$service\"}[$__range]) - metrics_http_notification_duration_count{replica=~\"$replica\",svc=~\"$service\"} offset $__range) or (max_over_time(metrics_http_notification_duration_count{replica=~\"$replica\",svc=~\"$service\"}[$__range]) unless metrics_http_notification_duration_count{replica=~\"$replica\",svc=~\"$service\"} offset $__range))))",
+ "format": "time_series",
+ "instant": true,
+ "interval": "",
+ "intervalFactor": 1,
+ "legendFormat": "{{svc}} | {{notif}}",
+ "refId": "A"
+ }
+ ],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Top 10 Notifications",
+ "type": "bargauge"
+ },
+ {
+ "datasource": "Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {},
+ "decimals": 0,
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "dark-blue",
+ "value": null
+ },
+ {
+ "color": "blue",
+ "value": 0
+ }
+ ]
+ }
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 6,
+ "w": 12,
+ "x": 0,
+ "y": 24
+ },
+ "id": 33,
+ "options": {
+ "displayMode": "gradient",
+ "orientation": "auto",
+ "reduceOptions": {
+ "calcs": [
+ "max"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showUnfilled": true
+ },
+ "pluginVersion": "7.3.5",
+ "targets": [
+ {
+ "expr": "sum by (le) ((max_over_time(metrics_http_request_duration_bucket{replica=~\"$replica\",svc=~\"$service\"}[$__range]) - metrics_http_request_duration_bucket{replica=~\"$replica\",svc=~\"$service\"} offset $__range) or (max_over_time(metrics_http_request_duration_bucket{replica=~\"$replica\",svc=~\"$service\"}[$__range]) unless metrics_http_request_duration_bucket{replica=~\"$replica\",svc=~\"$service\"} offset $__range))",
+ "format": "heatmap",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "{{le}}",
+ "refId": "A"
+ }
+ ],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Request Duration Distribution (ms)",
+ "transformations": [],
+ "type": "bargauge"
+ },
+ {
+ "datasource": "Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {},
+ "decimals": 0,
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "dark-purple",
+ "value": null
+ },
+ {
+ "color": "purple",
+ "value": 0
+ }
+ ]
+ }
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 6,
+ "w": 12,
+ "x": 12,
+ "y": 24
+ },
+ "id": 88,
+ "options": {
+ "displayMode": "gradient",
+ "orientation": "auto",
+ "reduceOptions": {
+ "calcs": [
+ "max"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showUnfilled": true
+ },
+ "pluginVersion": "7.3.5",
+ "targets": [
+ {
+ "expr": "sum by (le) ((max_over_time(metrics_http_notification_duration_bucket{replica=~\"$replica\",svc=~\"$service\"}[$__range]) - metrics_http_notification_duration_bucket{replica=~\"$replica\",svc=~\"$service\"} offset $__range) or (max_over_time(metrics_http_notification_duration_bucket{replica=~\"$replica\",svc=~\"$service\"}[$__range]) unless metrics_http_notification_duration_bucket{replica=~\"$replica\",svc=~\"$service\"} offset $__range))",
+ "format": "heatmap",
+ "instant": true,
+ "interval": "",
+ "legendFormat": "{{le}}",
+ "refId": "A"
+ }
+ ],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Notification Processing Time Distribution (ms)",
+ "transformations": [],
+ "type": "bargauge"
+ },
+ {
+ "datasource": "Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {
+ "align": "left",
+ "filterable": false
+ },
+ "decimals": 0,
+ "displayName": "${__series.name}",
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "dark-blue",
+ "value": null
+ },
+ {
+ "color": "blue",
+ "value": 0
+ }
+ ]
+ },
+ "unit": "ms"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 9,
+ "w": 12,
+ "x": 0,
+ "y": 30
+ },
+ "id": 38,
+ "options": {
+ "displayMode": "gradient",
+ "orientation": "horizontal",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showUnfilled": true
+ },
+ "pluginVersion": "7.3.5",
+ "targets": [
+ {
+ "expr": "topk(10, sort_desc(rate(metrics_http_request_duration_sum{replica=~\"$replica\",svc=~\"$service\"}[$__range]) / rate(metrics_http_request_duration_count{replica=~\"$replica\",svc!=\"Auth Service\"}[$__range])))",
+ "format": "time_series",
+ "instant": true,
+ "interval": "",
+ "intervalFactor": 1,
+ "legendFormat": "{{method}} {{path}}",
+ "refId": "A"
+ }
+ ],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Top 10 Highest Average Request Processing Time",
+ "type": "bargauge"
+ },
+ {
+ "datasource": "Prometheus",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {
+ "align": "left",
+ "filterable": false
+ },
+ "decimals": 0,
+ "displayName": "${__series.name}",
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "dark-purple",
+ "value": null
+ },
+ {
+ "color": "purple",
+ "value": 0
+ }
+ ]
+ },
+ "unit": "ms"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 9,
+ "w": 12,
+ "x": 12,
+ "y": 30
+ },
+ "id": 89,
+ "options": {
+ "displayMode": "gradient",
+ "orientation": "horizontal",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showUnfilled": true
+ },
+ "pluginVersion": "7.3.5",
+ "targets": [
+ {
+ "expr": "topk(10, sort_desc(avg by (svc,notif) (rate(metrics_http_notification_duration_sum{replica=~\"$replica\",svc=~\"$service\"}[$__range]) / rate(metrics_http_notification_duration_count{replica=~\"$replica\",svc=~\"$service\"}[$__range]))))",
+ "format": "time_series",
+ "instant": true,
+ "interval": "",
+ "intervalFactor": 1,
+ "legendFormat": "{{svc}} | {{notif}}",
+ "refId": "A"
+ }
+ ],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Top 5 Highest Average Notification Processing Times",
+ "type": "bargauge"
+ }
+ ],
+ "refresh": "",
+ "schemaVersion": 26,
+ "style": "dark",
+ "tags": [],
+ "templating": {
+ "list": [
+ {
+ "allValue": "",
+ "current": {
+ "selected": true,
+ "tags": [],
+ "text": [
+ "All"
+ ],
+ "value": [
+ "$__all"
+ ]
+ },
+ "datasource": "Prometheus",
+ "definition": "label_values(metrics_http_request_duration_count, svc)",
+ "error": null,
+ "hide": 0,
+ "includeAll": true,
+ "label": "Service",
+ "multi": true,
+ "name": "service",
+ "options": [],
+ "query": "label_values(metrics_http_request_duration_count, svc)",
+ "refresh": 2,
+ "regex": "",
+ "skipUrlSync": false,
+ "sort": 1,
+ "tagValuesQuery": "",
+ "tags": [],
+ "tagsQuery": "",
+ "type": "query",
+ "useTags": false
+ },
+ {
+ "allValue": null,
+ "current": {
+ "selected": true,
+ "tags": [],
+ "text": [
+ "All"
+ ],
+ "value": [
+ "$__all"
+ ]
+ },
+ "datasource": "Prometheus",
+ "definition": "label_values(metrics_http_request_duration_count, replica) ",
+ "error": null,
+ "hide": 0,
+ "includeAll": true,
+ "label": "Instance",
+ "multi": true,
+ "name": "replica",
+ "options": [],
+ "query": "label_values(metrics_http_request_duration_count, replica) ",
+ "refresh": 2,
+ "regex": "",
+ "skipUrlSync": false,
+ "sort": 2,
+ "tagValuesQuery": "",
+ "tags": [],
+ "tagsQuery": "",
+ "type": "query",
+ "useTags": false
+ }
+ ]
+ },
+ "time": {
+ "from": "now-24h",
+ "to": "now"
+ },
+ "timepicker": {
+ "refresh_intervals": [
+ "5s",
+ "10s",
+ "15s",
+ "30s",
+ "1m",
+ "5m",
+ "15m",
+ "30m",
+ "1h",
+ "2h",
+ "1d"
+ ]
+ },
+ "timezone": "",
+ "title": "Platform (AdvantEDGE)",
+ "uid": "platform-advantedge",
+ "version": 3
+}
+
diff --git a/agw-deployer/helm/charts/grafana/dashboards/platform-k8s.json b/agw-deployer/helm/charts/grafana/dashboards/platform-k8s.json
new file mode 100644
index 0000000..76e77ab
--- /dev/null
+++ b/agw-deployer/helm/charts/grafana/dashboards/platform-k8s.json
@@ -0,0 +1,2549 @@
+{
+ "annotations": {
+ "list": [
+ {
+ "builtIn": 1,
+ "datasource": "-- Grafana --",
+ "enable": true,
+ "hide": true,
+ "iconColor": "rgba(0, 211, 255, 1)",
+ "name": "Annotations & Alerts",
+ "type": "dashboard"
+ }
+ ]
+ },
+ "editable": true,
+ "gnetId": null,
+ "graphTooltip": 0,
+ "id": 11,
+ "iteration": 1613707884149,
+ "links": [],
+ "panels": [
+ {
+ "collapsed": false,
+ "datasource": null,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 0
+ },
+ "id": 17,
+ "panels": [],
+ "repeat": null,
+ "title": "CPU Usage",
+ "type": "row"
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": false,
+ "colors": [
+ "#299c46",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "fill": 1,
+ "format": "percentunit",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 5,
+ "w": 5,
+ "x": 0,
+ "y": 1
+ },
+ "id": 1,
+ "interval": null,
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "null as zero",
+ "nullText": null,
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "stack": false,
+ "steppedLine": false,
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_rate{cluster=\"$cluster\", namespace=\"$namespace\"}) / sum(kube_pod_container_resource_requests_cpu_cores{cluster=\"$cluster\", namespace=\"$namespace\"})",
+ "format": "time_series",
+ "instant": true,
+ "intervalFactor": 2,
+ "refId": "A"
+ }
+ ],
+ "thresholds": "70,80",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "CPU Utilisation (from requests)",
+ "tooltip": {
+ "shared": false,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "avg",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ]
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "fill": 10,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 19,
+ "x": 5,
+ "y": 1
+ },
+ "hiddenSeries": false,
+ "id": 5,
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 0,
+ "links": [],
+ "nullPointMode": "null as zero",
+ "options": {
+ "alertThreshold": true
+ },
+ "percentage": false,
+ "pluginVersion": "7.3.5",
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [
+ {
+ "alias": "quota - requests",
+ "color": "#F2495C",
+ "dashes": true,
+ "fill": 0,
+ "hideTooltip": true,
+ "legend": false,
+ "linewidth": 2,
+ "stack": false
+ },
+ {
+ "alias": "quota - limits",
+ "color": "#FF9830",
+ "dashes": true,
+ "fill": 0,
+ "hideTooltip": true,
+ "legend": false,
+ "linewidth": 2,
+ "stack": false
+ }
+ ],
+ "spaceLength": 10,
+ "stack": true,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_rate{cluster=\"$cluster\", namespace=\"$namespace\"}) by (pod)",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{pod}}",
+ "legendLink": null,
+ "refId": "A",
+ "step": 10
+ },
+ {
+ "expr": "scalar(kube_resourcequota{cluster=\"$cluster\", namespace=\"$namespace\", type=\"hard\",resource=\"requests.cpu\"})",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "quota - requests",
+ "legendLink": null,
+ "refId": "B",
+ "step": 10
+ },
+ {
+ "expr": "scalar(kube_resourcequota{cluster=\"$cluster\", namespace=\"$namespace\", type=\"hard\",resource=\"limits.cpu\"})",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "quota - limits",
+ "legendLink": null,
+ "refId": "C",
+ "step": 10
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "CPU Usage",
+ "tooltip": {
+ "shared": false,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": false,
+ "colors": [
+ "#299c46",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "fill": 1,
+ "format": "percentunit",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 5,
+ "w": 5,
+ "x": 0,
+ "y": 6
+ },
+ "id": 2,
+ "interval": null,
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "null as zero",
+ "nullText": null,
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "stack": false,
+ "steppedLine": false,
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_rate{cluster=\"$cluster\", namespace=\"$namespace\"}) / sum(kube_pod_container_resource_limits_cpu_cores{cluster=\"$cluster\", namespace=\"$namespace\"})",
+ "format": "time_series",
+ "instant": true,
+ "intervalFactor": 2,
+ "refId": "A"
+ }
+ ],
+ "thresholds": "70,80",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "CPU Utilisation (from limits)",
+ "tooltip": {
+ "shared": false,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "avg",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ]
+ },
+ {
+ "collapsed": true,
+ "datasource": null,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 11
+ },
+ "id": 16,
+ "panels": [
+ {
+ "aliasColors": {},
+ "bars": false,
+ "columns": [],
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "fill": 1,
+ "fontSize": "100%",
+ "gridPos": {
+ "h": 6,
+ "w": 24,
+ "x": 0,
+ "y": 12
+ },
+ "id": 6,
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null as zero",
+ "pageSize": null,
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "showHeader": true,
+ "sort": {
+ "col": 0,
+ "desc": true
+ },
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "styles": [
+ {
+ "alias": "Time",
+ "align": "auto",
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "pattern": "Time",
+ "type": "hidden"
+ },
+ {
+ "alias": "CPU Usage",
+ "align": "auto",
+ "colorMode": null,
+ "colors": [],
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "decimals": 2,
+ "link": false,
+ "linkTargetBlank": false,
+ "linkTooltip": "Drill down",
+ "linkUrl": "",
+ "pattern": "Value #A",
+ "thresholds": [],
+ "type": "number",
+ "unit": "short"
+ },
+ {
+ "alias": "CPU Requests",
+ "align": "auto",
+ "colorMode": null,
+ "colors": [],
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "decimals": 2,
+ "link": false,
+ "linkTargetBlank": false,
+ "linkTooltip": "Drill down",
+ "linkUrl": "",
+ "pattern": "Value #B",
+ "thresholds": [],
+ "type": "number",
+ "unit": "short"
+ },
+ {
+ "alias": "CPU Requests %",
+ "align": "auto",
+ "colorMode": null,
+ "colors": [],
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "decimals": 2,
+ "link": false,
+ "linkTargetBlank": false,
+ "linkTooltip": "Drill down",
+ "linkUrl": "",
+ "pattern": "Value #C",
+ "thresholds": [],
+ "type": "number",
+ "unit": "percentunit"
+ },
+ {
+ "alias": "CPU Limits",
+ "align": "auto",
+ "colorMode": null,
+ "colors": [],
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "decimals": 2,
+ "link": false,
+ "linkTargetBlank": false,
+ "linkTooltip": "Drill down",
+ "linkUrl": "",
+ "pattern": "Value #D",
+ "thresholds": [],
+ "type": "number",
+ "unit": "short"
+ },
+ {
+ "alias": "CPU Limits %",
+ "align": "auto",
+ "colorMode": null,
+ "colors": [],
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "decimals": 2,
+ "link": false,
+ "linkTargetBlank": false,
+ "linkTooltip": "Drill down",
+ "linkUrl": "",
+ "pattern": "Value #E",
+ "thresholds": [],
+ "type": "number",
+ "unit": "percentunit"
+ },
+ {
+ "alias": "Pod",
+ "align": "auto",
+ "colorMode": null,
+ "colors": [],
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "decimals": 2,
+ "link": true,
+ "linkTargetBlank": false,
+ "linkTooltip": "Drill down",
+ "linkUrl": "./d/6581e46e4e5c7ba40a07646395ef7b23/k8s-resources-pod?var-datasource=$datasource&var-cluster=$cluster&var-namespace=$namespace&var-pod=$__cell",
+ "pattern": "pod",
+ "thresholds": [],
+ "type": "number",
+ "unit": "short"
+ },
+ {
+ "alias": "",
+ "align": "auto",
+ "colorMode": null,
+ "colors": [],
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "decimals": 2,
+ "pattern": "/.*/",
+ "thresholds": [],
+ "type": "string",
+ "unit": "short"
+ }
+ ],
+ "targets": [
+ {
+ "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_rate{cluster=\"$cluster\", namespace=\"$namespace\"}) by (pod)",
+ "format": "table",
+ "instant": true,
+ "intervalFactor": 2,
+ "legendFormat": "",
+ "refId": "A",
+ "step": 10
+ },
+ {
+ "expr": "sum(kube_pod_container_resource_requests_cpu_cores{cluster=\"$cluster\", namespace=\"$namespace\"}) by (pod)",
+ "format": "table",
+ "instant": true,
+ "intervalFactor": 2,
+ "legendFormat": "",
+ "refId": "B",
+ "step": 10
+ },
+ {
+ "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_rate{cluster=\"$cluster\", namespace=\"$namespace\"}) by (pod) / sum(kube_pod_container_resource_requests_cpu_cores{cluster=\"$cluster\", namespace=\"$namespace\"}) by (pod)",
+ "format": "table",
+ "instant": true,
+ "intervalFactor": 2,
+ "legendFormat": "",
+ "refId": "C",
+ "step": 10
+ },
+ {
+ "expr": "sum(kube_pod_container_resource_limits_cpu_cores{cluster=\"$cluster\", namespace=\"$namespace\"}) by (pod)",
+ "format": "table",
+ "instant": true,
+ "intervalFactor": 2,
+ "legendFormat": "",
+ "refId": "D",
+ "step": 10
+ },
+ {
+ "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_rate{cluster=\"$cluster\", namespace=\"$namespace\"}) by (pod) / sum(kube_pod_container_resource_limits_cpu_cores{cluster=\"$cluster\", namespace=\"$namespace\"}) by (pod)",
+ "format": "table",
+ "instant": true,
+ "intervalFactor": 2,
+ "legendFormat": "",
+ "refId": "E",
+ "step": 10
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "CPU Quota",
+ "tooltip": {
+ "shared": false,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "transform": "table",
+ "type": "table-old",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ]
+ }
+ ],
+ "repeat": null,
+ "title": "CPU Quota",
+ "type": "row"
+ },
+ {
+ "collapsed": false,
+ "datasource": null,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 12
+ },
+ "id": 19,
+ "panels": [],
+ "repeat": null,
+ "title": "Memory Usage",
+ "type": "row"
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": false,
+ "colors": [
+ "#299c46",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "fill": 1,
+ "format": "percentunit",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 5,
+ "w": 5,
+ "x": 0,
+ "y": 13
+ },
+ "id": 3,
+ "interval": null,
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "null as zero",
+ "nullText": null,
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "stack": false,
+ "steppedLine": false,
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(container_memory_working_set_bytes{cluster=\"$cluster\", namespace=\"$namespace\",container!=\"\", image!=\"\"}) / sum(kube_pod_container_resource_requests_memory_bytes{namespace=\"$namespace\"})",
+ "format": "time_series",
+ "instant": true,
+ "intervalFactor": 2,
+ "refId": "A"
+ }
+ ],
+ "thresholds": "70,80",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Memory Utilization (from requests)",
+ "tooltip": {
+ "shared": false,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "avg",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ]
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "fill": 10,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 19,
+ "x": 5,
+ "y": 13
+ },
+ "hiddenSeries": false,
+ "id": 7,
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 0,
+ "links": [],
+ "nullPointMode": "null as zero",
+ "options": {
+ "alertThreshold": true
+ },
+ "percentage": false,
+ "pluginVersion": "7.3.5",
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [
+ {
+ "alias": "quota - requests",
+ "color": "#F2495C",
+ "dashes": true,
+ "fill": 0,
+ "hideTooltip": true,
+ "legend": false,
+ "linewidth": 2,
+ "stack": false
+ },
+ {
+ "alias": "quota - limits",
+ "color": "#FF9830",
+ "dashes": true,
+ "fill": 0,
+ "hideTooltip": true,
+ "legend": false,
+ "linewidth": 2,
+ "stack": false
+ }
+ ],
+ "spaceLength": 10,
+ "stack": true,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "sum(container_memory_working_set_bytes{cluster=\"$cluster\", namespace=\"$namespace\", container!=\"\", image!=\"\"}) by (pod)",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{pod}}",
+ "legendLink": null,
+ "refId": "A",
+ "step": 10
+ },
+ {
+ "expr": "scalar(kube_resourcequota{cluster=\"$cluster\", namespace=\"$namespace\", type=\"hard\",resource=\"requests.memory\"})",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "quota - requests",
+ "legendLink": null,
+ "refId": "B",
+ "step": 10
+ },
+ {
+ "expr": "scalar(kube_resourcequota{cluster=\"$cluster\", namespace=\"$namespace\", type=\"hard\",resource=\"limits.memory\"})",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "quota - limits",
+ "legendLink": null,
+ "refId": "C",
+ "step": 10
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Memory Usage (w/o cache)",
+ "tooltip": {
+ "shared": false,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "bytes",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": false,
+ "colors": [
+ "#299c46",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "fill": 1,
+ "format": "percentunit",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 5,
+ "w": 5,
+ "x": 0,
+ "y": 18
+ },
+ "id": 4,
+ "interval": null,
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "null as zero",
+ "nullText": null,
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "stack": false,
+ "steppedLine": false,
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(container_memory_working_set_bytes{cluster=\"$cluster\", namespace=\"$namespace\",container!=\"\", image!=\"\"}) / sum(kube_pod_container_resource_limits_memory_bytes{namespace=\"$namespace\"})",
+ "format": "time_series",
+ "instant": true,
+ "intervalFactor": 2,
+ "refId": "A"
+ }
+ ],
+ "thresholds": "70,80",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Memory Utilisation (from limits)",
+ "tooltip": {
+ "shared": false,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "avg",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ]
+ },
+ {
+ "collapsed": true,
+ "datasource": null,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 23
+ },
+ "id": 20,
+ "panels": [
+ {
+ "aliasColors": {},
+ "bars": false,
+ "columns": [],
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "fill": 1,
+ "fontSize": "100%",
+ "gridPos": {
+ "h": 7,
+ "w": 24,
+ "x": 0,
+ "y": 24
+ },
+ "id": 8,
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null as zero",
+ "pageSize": null,
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "showHeader": true,
+ "sort": {
+ "col": 2,
+ "desc": true
+ },
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "styles": [
+ {
+ "alias": "Time",
+ "align": "auto",
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "pattern": "Time",
+ "type": "hidden"
+ },
+ {
+ "alias": "Memory Usage",
+ "align": "auto",
+ "colorMode": null,
+ "colors": [],
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "decimals": 2,
+ "link": false,
+ "linkTargetBlank": false,
+ "linkTooltip": "Drill down",
+ "linkUrl": "",
+ "pattern": "Value #A",
+ "thresholds": [],
+ "type": "number",
+ "unit": "bytes"
+ },
+ {
+ "alias": "Memory Requests",
+ "align": "auto",
+ "colorMode": null,
+ "colors": [],
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "decimals": 2,
+ "link": false,
+ "linkTargetBlank": false,
+ "linkTooltip": "Drill down",
+ "linkUrl": "",
+ "pattern": "Value #B",
+ "thresholds": [],
+ "type": "number",
+ "unit": "bytes"
+ },
+ {
+ "alias": "Memory Requests %",
+ "align": "auto",
+ "colorMode": null,
+ "colors": [],
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "decimals": 2,
+ "link": false,
+ "linkTargetBlank": false,
+ "linkTooltip": "Drill down",
+ "linkUrl": "",
+ "pattern": "Value #C",
+ "thresholds": [],
+ "type": "number",
+ "unit": "percentunit"
+ },
+ {
+ "alias": "Memory Limits",
+ "align": "auto",
+ "colorMode": null,
+ "colors": [],
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "decimals": 2,
+ "link": false,
+ "linkTargetBlank": false,
+ "linkTooltip": "Drill down",
+ "linkUrl": "",
+ "pattern": "Value #D",
+ "thresholds": [],
+ "type": "number",
+ "unit": "bytes"
+ },
+ {
+ "alias": "Memory Limits %",
+ "align": "auto",
+ "colorMode": null,
+ "colors": [],
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "decimals": 2,
+ "link": false,
+ "linkTargetBlank": false,
+ "linkTooltip": "Drill down",
+ "linkUrl": "",
+ "pattern": "Value #E",
+ "thresholds": [],
+ "type": "number",
+ "unit": "percentunit"
+ },
+ {
+ "alias": "Memory Usage (RSS)",
+ "align": "auto",
+ "colorMode": null,
+ "colors": [],
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "decimals": 2,
+ "link": false,
+ "linkTargetBlank": false,
+ "linkTooltip": "Drill down",
+ "linkUrl": "",
+ "pattern": "Value #F",
+ "thresholds": [],
+ "type": "number",
+ "unit": "bytes"
+ },
+ {
+ "alias": "Memory Usage (Cache)",
+ "align": "auto",
+ "colorMode": null,
+ "colors": [],
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "decimals": 2,
+ "link": false,
+ "linkTargetBlank": false,
+ "linkTooltip": "Drill down",
+ "linkUrl": "",
+ "pattern": "Value #G",
+ "thresholds": [],
+ "type": "number",
+ "unit": "bytes"
+ },
+ {
+ "alias": "Memory Usage (Swap)",
+ "align": "auto",
+ "colorMode": null,
+ "colors": [],
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "decimals": 2,
+ "link": false,
+ "linkTargetBlank": false,
+ "linkTooltip": "Drill down",
+ "linkUrl": "",
+ "pattern": "Value #H",
+ "thresholds": [],
+ "type": "number",
+ "unit": "bytes"
+ },
+ {
+ "alias": "Pod",
+ "align": "auto",
+ "colorMode": null,
+ "colors": [],
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "decimals": 2,
+ "link": true,
+ "linkTargetBlank": false,
+ "linkTooltip": "Drill down",
+ "linkUrl": "./d/6581e46e4e5c7ba40a07646395ef7b23/k8s-resources-pod?var-datasource=$datasource&var-cluster=$cluster&var-namespace=$namespace&var-pod=$__cell",
+ "pattern": "pod",
+ "thresholds": [],
+ "type": "number",
+ "unit": "short"
+ },
+ {
+ "alias": "",
+ "align": "auto",
+ "colorMode": null,
+ "colors": [],
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "decimals": 2,
+ "pattern": "/.*/",
+ "thresholds": [],
+ "type": "string",
+ "unit": "short"
+ }
+ ],
+ "targets": [
+ {
+ "expr": "sum(container_memory_working_set_bytes{cluster=\"$cluster\", namespace=\"$namespace\",container!=\"\", image!=\"\"}) by (pod)",
+ "format": "table",
+ "instant": true,
+ "intervalFactor": 2,
+ "legendFormat": "",
+ "refId": "A",
+ "step": 10
+ },
+ {
+ "expr": "sum(kube_pod_container_resource_requests_memory_bytes{cluster=\"$cluster\", namespace=\"$namespace\"}) by (pod)",
+ "format": "table",
+ "instant": true,
+ "intervalFactor": 2,
+ "legendFormat": "",
+ "refId": "B",
+ "step": 10
+ },
+ {
+ "expr": "sum(container_memory_working_set_bytes{cluster=\"$cluster\", namespace=\"$namespace\",container!=\"\", image!=\"\"}) by (pod) / sum(kube_pod_container_resource_requests_memory_bytes{namespace=\"$namespace\"}) by (pod)",
+ "format": "table",
+ "instant": true,
+ "intervalFactor": 2,
+ "legendFormat": "",
+ "refId": "C",
+ "step": 10
+ },
+ {
+ "expr": "sum(kube_pod_container_resource_limits_memory_bytes{cluster=\"$cluster\", namespace=\"$namespace\"}) by (pod)",
+ "format": "table",
+ "instant": true,
+ "intervalFactor": 2,
+ "legendFormat": "",
+ "refId": "D",
+ "step": 10
+ },
+ {
+ "expr": "sum(container_memory_working_set_bytes{cluster=\"$cluster\", namespace=\"$namespace\",container!=\"\", image!=\"\"}) by (pod) / sum(kube_pod_container_resource_limits_memory_bytes{namespace=\"$namespace\"}) by (pod)",
+ "format": "table",
+ "instant": true,
+ "intervalFactor": 2,
+ "legendFormat": "",
+ "refId": "E",
+ "step": 10
+ },
+ {
+ "expr": "sum(container_memory_rss{cluster=\"$cluster\", namespace=\"$namespace\",container!=\"\"}) by (pod)",
+ "format": "table",
+ "instant": true,
+ "intervalFactor": 2,
+ "legendFormat": "",
+ "refId": "F",
+ "step": 10
+ },
+ {
+ "expr": "sum(container_memory_cache{cluster=\"$cluster\", namespace=\"$namespace\",container!=\"\"}) by (pod)",
+ "format": "table",
+ "instant": true,
+ "intervalFactor": 2,
+ "legendFormat": "",
+ "refId": "G",
+ "step": 10
+ },
+ {
+ "expr": "sum(container_memory_swap{cluster=\"$cluster\", namespace=\"$namespace\",container!=\"\"}) by (pod)",
+ "format": "table",
+ "instant": true,
+ "intervalFactor": 2,
+ "legendFormat": "",
+ "refId": "H",
+ "step": 10
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Memory Quota",
+ "tooltip": {
+ "shared": false,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "transform": "table",
+ "type": "table-old",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ]
+ }
+ ],
+ "repeat": null,
+ "title": "Memory Quota",
+ "type": "row"
+ },
+ {
+ "collapsed": true,
+ "datasource": null,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 24
+ },
+ "id": 22,
+ "panels": [
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "fill": 10,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 8,
+ "w": 12,
+ "x": 0,
+ "y": 25
+ },
+ "hiddenSeries": false,
+ "id": 10,
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 0,
+ "links": [],
+ "nullPointMode": "null as zero",
+ "options": {
+ "alertThreshold": true
+ },
+ "percentage": false,
+ "pluginVersion": "7.3.5",
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": true,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "sum(irate(container_network_receive_bytes_total{cluster=\"$cluster\", namespace=~\"$namespace\"}[$__rate_interval])) by (pod)",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{pod}}",
+ "legendLink": null,
+ "refId": "A",
+ "step": 10
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Receive Bandwidth",
+ "tooltip": {
+ "shared": false,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "Bps",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "fill": 10,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 8,
+ "w": 12,
+ "x": 12,
+ "y": 25
+ },
+ "hiddenSeries": false,
+ "id": 11,
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 0,
+ "links": [],
+ "nullPointMode": "null as zero",
+ "options": {
+ "alertThreshold": true
+ },
+ "percentage": false,
+ "pluginVersion": "7.3.5",
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": true,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "sum(irate(container_network_transmit_bytes_total{cluster=\"$cluster\", namespace=~\"$namespace\"}[$__rate_interval])) by (pod)",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{pod}}",
+ "legendLink": null,
+ "refId": "A",
+ "step": 10
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Transmit Bandwidth",
+ "tooltip": {
+ "shared": false,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "Bps",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ }
+ ],
+ "repeat": null,
+ "title": "Network Usage",
+ "type": "row"
+ },
+ {
+ "collapsed": true,
+ "datasource": null,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 25
+ },
+ "id": 24,
+ "panels": [
+ {
+ "aliasColors": {},
+ "bars": false,
+ "columns": [],
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "fill": 1,
+ "fontSize": "100%",
+ "gridPos": {
+ "h": 8,
+ "w": 24,
+ "x": 0,
+ "y": 34
+ },
+ "id": 9,
+ "interval": "1m",
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null as zero",
+ "pageSize": null,
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "showHeader": true,
+ "sort": {
+ "col": 0,
+ "desc": true
+ },
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "styles": [
+ {
+ "alias": "Time",
+ "align": "auto",
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "pattern": "Time",
+ "type": "hidden"
+ },
+ {
+ "alias": "Current Receive Bandwidth",
+ "align": "auto",
+ "colorMode": null,
+ "colors": [],
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "decimals": 2,
+ "link": false,
+ "linkTargetBlank": false,
+ "linkTooltip": "Drill down",
+ "linkUrl": "",
+ "pattern": "Value #A",
+ "thresholds": [],
+ "type": "number",
+ "unit": "Bps"
+ },
+ {
+ "alias": "Current Transmit Bandwidth",
+ "align": "auto",
+ "colorMode": null,
+ "colors": [],
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "decimals": 2,
+ "link": false,
+ "linkTargetBlank": false,
+ "linkTooltip": "Drill down",
+ "linkUrl": "",
+ "pattern": "Value #B",
+ "thresholds": [],
+ "type": "number",
+ "unit": "Bps"
+ },
+ {
+ "alias": "Rate of Received Packets",
+ "align": "auto",
+ "colorMode": null,
+ "colors": [],
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "decimals": 2,
+ "link": false,
+ "linkTargetBlank": false,
+ "linkTooltip": "Drill down",
+ "linkUrl": "",
+ "pattern": "Value #C",
+ "thresholds": [],
+ "type": "number",
+ "unit": "pps"
+ },
+ {
+ "alias": "Rate of Transmitted Packets",
+ "align": "auto",
+ "colorMode": null,
+ "colors": [],
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "decimals": 2,
+ "link": false,
+ "linkTargetBlank": false,
+ "linkTooltip": "Drill down",
+ "linkUrl": "",
+ "pattern": "Value #D",
+ "thresholds": [],
+ "type": "number",
+ "unit": "pps"
+ },
+ {
+ "alias": "Rate of Received Packets Dropped",
+ "align": "auto",
+ "colorMode": null,
+ "colors": [],
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "decimals": 2,
+ "link": false,
+ "linkTargetBlank": false,
+ "linkTooltip": "Drill down",
+ "linkUrl": "",
+ "pattern": "Value #E",
+ "thresholds": [],
+ "type": "number",
+ "unit": "pps"
+ },
+ {
+ "alias": "Rate of Transmitted Packets Dropped",
+ "align": "auto",
+ "colorMode": null,
+ "colors": [],
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "decimals": 2,
+ "link": false,
+ "linkTargetBlank": false,
+ "linkTooltip": "Drill down",
+ "linkUrl": "",
+ "pattern": "Value #F",
+ "thresholds": [],
+ "type": "number",
+ "unit": "pps"
+ },
+ {
+ "alias": "Pod",
+ "align": "auto",
+ "colorMode": null,
+ "colors": [],
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "decimals": 2,
+ "link": true,
+ "linkTargetBlank": false,
+ "linkTooltip": "Drill down to pods",
+ "linkUrl": "./d/6581e46e4e5c7ba40a07646395ef7b23/k8s-resources-pod?var-datasource=$datasource&var-cluster=$cluster&var-namespace=$namespace&var-pod=$__cell",
+ "pattern": "pod",
+ "thresholds": [],
+ "type": "number",
+ "unit": "short"
+ },
+ {
+ "alias": "",
+ "align": "auto",
+ "colorMode": null,
+ "colors": [],
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "decimals": 2,
+ "pattern": "/.*/",
+ "thresholds": [],
+ "type": "string",
+ "unit": "short"
+ }
+ ],
+ "targets": [
+ {
+ "expr": "sum(irate(container_network_receive_bytes_total{cluster=\"$cluster\", namespace=~\"$namespace\"}[$__rate_interval])) by (pod)",
+ "format": "table",
+ "instant": true,
+ "intervalFactor": 2,
+ "legendFormat": "",
+ "refId": "A",
+ "step": 10
+ },
+ {
+ "expr": "sum(irate(container_network_transmit_bytes_total{cluster=\"$cluster\", namespace=~\"$namespace\"}[$__rate_interval])) by (pod)",
+ "format": "table",
+ "instant": true,
+ "intervalFactor": 2,
+ "legendFormat": "",
+ "refId": "B",
+ "step": 10
+ },
+ {
+ "expr": "sum(irate(container_network_receive_packets_total{cluster=\"$cluster\", namespace=~\"$namespace\"}[$__rate_interval])) by (pod)",
+ "format": "table",
+ "instant": true,
+ "intervalFactor": 2,
+ "legendFormat": "",
+ "refId": "C",
+ "step": 10
+ },
+ {
+ "expr": "sum(irate(container_network_transmit_packets_total{cluster=\"$cluster\", namespace=~\"$namespace\"}[$__rate_interval])) by (pod)",
+ "format": "table",
+ "instant": true,
+ "intervalFactor": 2,
+ "legendFormat": "",
+ "refId": "D",
+ "step": 10
+ },
+ {
+ "expr": "sum(irate(container_network_receive_packets_dropped_total{cluster=\"$cluster\", namespace=~\"$namespace\"}[$__rate_interval])) by (pod)",
+ "format": "table",
+ "instant": true,
+ "intervalFactor": 2,
+ "legendFormat": "",
+ "refId": "E",
+ "step": 10
+ },
+ {
+ "expr": "sum(irate(container_network_transmit_packets_dropped_total{cluster=\"$cluster\", namespace=~\"$namespace\"}[$__rate_interval])) by (pod)",
+ "format": "table",
+ "instant": true,
+ "intervalFactor": 2,
+ "legendFormat": "",
+ "refId": "F",
+ "step": 10
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Current Network Usage",
+ "tooltip": {
+ "shared": false,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "transform": "table",
+ "type": "table-old",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ]
+ }
+ ],
+ "title": "Network Quota",
+ "type": "row"
+ },
+ {
+ "collapsed": true,
+ "datasource": null,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 26
+ },
+ "id": 21,
+ "panels": [
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "fill": 10,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 8,
+ "w": 12,
+ "x": 0,
+ "y": 35
+ },
+ "hiddenSeries": false,
+ "id": 12,
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 0,
+ "links": [],
+ "nullPointMode": "null as zero",
+ "options": {
+ "alertThreshold": true
+ },
+ "percentage": false,
+ "pluginVersion": "7.3.5",
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": true,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "sum(irate(container_network_receive_packets_total{cluster=\"$cluster\", namespace=~\"$namespace\"}[$__rate_interval])) by (pod)",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{pod}}",
+ "legendLink": null,
+ "refId": "A",
+ "step": 10
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Rate of Received Packets",
+ "tooltip": {
+ "shared": false,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "Bps",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "fill": 10,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 8,
+ "w": 12,
+ "x": 12,
+ "y": 35
+ },
+ "hiddenSeries": false,
+ "id": 13,
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 0,
+ "links": [],
+ "nullPointMode": "null as zero",
+ "options": {
+ "alertThreshold": true
+ },
+ "percentage": false,
+ "pluginVersion": "7.3.5",
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": true,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "sum(irate(container_network_transmit_packets_total{cluster=\"$cluster\", namespace=~\"$namespace\"}[$__rate_interval])) by (pod)",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{pod}}",
+ "legendLink": null,
+ "refId": "A",
+ "step": 10
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Rate of Transmitted Packets",
+ "tooltip": {
+ "shared": false,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "Bps",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "fill": 10,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 8,
+ "w": 12,
+ "x": 0,
+ "y": 43
+ },
+ "hiddenSeries": false,
+ "id": 14,
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 0,
+ "links": [],
+ "nullPointMode": "null as zero",
+ "options": {
+ "alertThreshold": true
+ },
+ "percentage": false,
+ "pluginVersion": "7.3.5",
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": true,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "sum(irate(container_network_receive_packets_dropped_total{cluster=\"$cluster\", namespace=~\"$namespace\"}[$__rate_interval])) by (pod)",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{pod}}",
+ "legendLink": null,
+ "refId": "A",
+ "step": 10
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Rate of Received Packets Dropped",
+ "tooltip": {
+ "shared": false,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "Bps",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "fill": 10,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 8,
+ "w": 12,
+ "x": 12,
+ "y": 43
+ },
+ "hiddenSeries": false,
+ "id": 15,
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 0,
+ "links": [],
+ "nullPointMode": "null as zero",
+ "options": {
+ "alertThreshold": true
+ },
+ "percentage": false,
+ "pluginVersion": "7.3.5",
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": true,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "sum(irate(container_network_transmit_packets_dropped_total{cluster=\"$cluster\", namespace=~\"$namespace\"}[$__rate_interval])) by (pod)",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{pod}}",
+ "legendLink": null,
+ "refId": "A",
+ "step": 10
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Rate of Transmitted Packets Dropped",
+ "tooltip": {
+ "shared": false,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "Bps",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ }
+ ],
+ "repeat": null,
+ "title": "Network Packets",
+ "type": "row"
+ }
+ ],
+ "refresh": "10s",
+ "schemaVersion": 26,
+ "style": "dark",
+ "tags": [],
+ "templating": {
+ "list": [
+ {
+ "current": {
+ "selected": false,
+ "text": "Prometheus",
+ "value": "Prometheus"
+ },
+ "error": null,
+ "hide": 0,
+ "includeAll": false,
+ "label": null,
+ "multi": false,
+ "name": "datasource",
+ "options": [],
+ "query": "prometheus",
+ "queryValue": "",
+ "refresh": 1,
+ "regex": "",
+ "skipUrlSync": false,
+ "type": "datasource"
+ },
+ {
+ "allValue": null,
+ "current": {
+ "isNone": true,
+ "selected": false,
+ "text": "None",
+ "value": ""
+ },
+ "datasource": "$datasource",
+ "definition": "",
+ "error": null,
+ "hide": 2,
+ "includeAll": false,
+ "label": null,
+ "multi": false,
+ "name": "cluster",
+ "options": [],
+ "query": "label_values(kube_pod_info, cluster)",
+ "refresh": 1,
+ "regex": "",
+ "skipUrlSync": false,
+ "sort": 1,
+ "tagValuesQuery": "",
+ "tags": [],
+ "tagsQuery": "",
+ "type": "query",
+ "useTags": false
+ },
+ {
+ "allValue": null,
+ "current": {
+ "selected": false,
+ "text": "default",
+ "value": "default"
+ },
+ "datasource": "$datasource",
+ "definition": "",
+ "error": null,
+ "hide": 0,
+ "includeAll": false,
+ "label": null,
+ "multi": false,
+ "name": "namespace",
+ "options": [],
+ "query": "label_values(kube_pod_info{cluster=\"$cluster\"}, namespace)",
+ "refresh": 1,
+ "regex": "",
+ "skipUrlSync": false,
+ "sort": 1,
+ "tagValuesQuery": "",
+ "tags": [],
+ "tagsQuery": "",
+ "type": "query",
+ "useTags": false
+ }
+ ]
+ },
+ "time": {
+ "from": "now-24h",
+ "to": "now"
+ },
+ "timepicker": {
+ "refresh_intervals": [
+ "5s",
+ "10s",
+ "30s",
+ "1m",
+ "5m",
+ "15m",
+ "30m",
+ "1h",
+ "2h",
+ "1d"
+ ],
+ "time_options": [
+ "5m",
+ "15m",
+ "1h",
+ "6h",
+ "12h",
+ "24h",
+ "2d",
+ "7d",
+ "30d"
+ ]
+ },
+ "timezone": "",
+ "title": "Platform (Kubernetes)",
+ "uid": "platform-k8s",
+ "version": 11
+}
diff --git a/agw-deployer/helm/charts/grafana/dashboards/prometheus.json b/agw-deployer/helm/charts/grafana/dashboards/prometheus.json
new file mode 100644
index 0000000..68e5050
--- /dev/null
+++ b/agw-deployer/helm/charts/grafana/dashboards/prometheus.json
@@ -0,0 +1,1054 @@
+{
+ "annotations": {
+ "list": []
+ },
+ "editable": true,
+ "gnetId": null,
+ "graphTooltip": 0,
+ "hideControls": false,
+ "links": [],
+ "refresh": "10s",
+ "rows": [
+ {
+ "collapse": false,
+ "height": "250px",
+ "panels": [
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fill": 1,
+ "id": 1,
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null as zero",
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "span": 12,
+ "stack": false,
+ "steppedLine": false,
+ "styles": [
+ {
+ "alias": "Time",
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "pattern": "Time",
+ "type": "hidden"
+ },
+ {
+ "alias": "Count",
+ "colorMode": null,
+ "colors": [],
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "decimals": 2,
+ "link": false,
+ "linkTargetBlank": false,
+ "linkTooltip": "Drill down",
+ "linkUrl": "",
+ "pattern": "Value #A",
+ "thresholds": [],
+ "type": "hidden",
+ "unit": "short"
+ },
+ {
+ "alias": "Uptime",
+ "colorMode": null,
+ "colors": [],
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "decimals": 2,
+ "link": false,
+ "linkTargetBlank": false,
+ "linkTooltip": "Drill down",
+ "linkUrl": "",
+ "pattern": "Value #B",
+ "thresholds": [],
+ "type": "number",
+ "unit": "short"
+ },
+ {
+ "alias": "Instance",
+ "colorMode": null,
+ "colors": [],
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "decimals": 2,
+ "link": false,
+ "linkTargetBlank": false,
+ "linkTooltip": "Drill down",
+ "linkUrl": "",
+ "pattern": "instance",
+ "thresholds": [],
+ "type": "number",
+ "unit": "short"
+ },
+ {
+ "alias": "Job",
+ "colorMode": null,
+ "colors": [],
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "decimals": 2,
+ "link": false,
+ "linkTargetBlank": false,
+ "linkTooltip": "Drill down",
+ "linkUrl": "",
+ "pattern": "job",
+ "thresholds": [],
+ "type": "number",
+ "unit": "short"
+ },
+ {
+ "alias": "Version",
+ "colorMode": null,
+ "colors": [],
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "decimals": 2,
+ "link": false,
+ "linkTargetBlank": false,
+ "linkTooltip": "Drill down",
+ "linkUrl": "",
+ "pattern": "version",
+ "thresholds": [],
+ "type": "number",
+ "unit": "short"
+ },
+ {
+ "alias": "",
+ "colorMode": null,
+ "colors": [],
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "decimals": 2,
+ "pattern": "/.*/",
+ "thresholds": [],
+ "type": "string",
+ "unit": "short"
+ }
+ ],
+ "targets": [
+ {
+ "expr": "count by (job, instance, version) (prometheus_build_info{job=~\"$job\", instance=~\"$instance\"})",
+ "format": "table",
+ "instant": true,
+ "intervalFactor": 2,
+ "legendFormat": "",
+ "refId": "A",
+ "step": 10
+ },
+ {
+ "expr": "max by (job, instance) (time() - process_start_time_seconds{job=~\"$job\", instance=~\"$instance\"})",
+ "format": "table",
+ "instant": true,
+ "intervalFactor": 2,
+ "legendFormat": "",
+ "refId": "B",
+ "step": 10
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Prometheus Stats",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "transform": "table",
+ "type": "table",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ]
+ }
+ ],
+ "repeat": null,
+ "repeatIteration": null,
+ "repeatRowId": null,
+ "showTitle": true,
+ "title": "Prometheus Stats",
+ "titleSize": "h6"
+ },
+ {
+ "collapse": false,
+ "height": "250px",
+ "panels": [
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fill": 1,
+ "id": 2,
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null as zero",
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "span": 6,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "sum(rate(prometheus_target_sync_length_seconds_sum{job=~\"$job\",instance=~\"$instance\"}[5m])) by (scrape_job) * 1e3",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{scrape_job}}",
+ "legendLink": null,
+ "step": 10
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Target Sync",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "ms",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ]
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fill": 10,
+ "id": 3,
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 0,
+ "links": [],
+ "nullPointMode": "null as zero",
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "span": 6,
+ "stack": true,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "sum(prometheus_sd_discovered_targets{job=~\"$job\",instance=~\"$instance\"})",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "Targets",
+ "legendLink": null,
+ "step": 10
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Targets",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ]
+ }
+ ],
+ "repeat": null,
+ "repeatIteration": null,
+ "repeatRowId": null,
+ "showTitle": true,
+ "title": "Discovery",
+ "titleSize": "h6"
+ },
+ {
+ "collapse": false,
+ "height": "250px",
+ "panels": [
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fill": 1,
+ "id": 4,
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null as zero",
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "span": 4,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "rate(prometheus_target_interval_length_seconds_sum{job=~\"$job\",instance=~\"$instance\"}[5m]) / rate(prometheus_target_interval_length_seconds_count{job=~\"$job\",instance=~\"$instance\"}[5m]) * 1e3",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{interval}} configured",
+ "legendLink": null,
+ "step": 10
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Average Scrape Interval Duration",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "ms",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ]
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fill": 10,
+ "id": 5,
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 0,
+ "links": [],
+ "nullPointMode": "null as zero",
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "span": 4,
+ "stack": true,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "sum by (job) (rate(prometheus_target_scrapes_exceeded_sample_limit_total[1m]))",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "exceeded sample limit: {{job}}",
+ "legendLink": null,
+ "step": 10
+ },
+ {
+ "expr": "sum by (job) (rate(prometheus_target_scrapes_sample_duplicate_timestamp_total[1m]))",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "duplicate timestamp: {{job}}",
+ "legendLink": null,
+ "step": 10
+ },
+ {
+ "expr": "sum by (job) (rate(prometheus_target_scrapes_sample_out_of_bounds_total[1m]))",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "out of bounds: {{job}}",
+ "legendLink": null,
+ "step": 10
+ },
+ {
+ "expr": "sum by (job) (rate(prometheus_target_scrapes_sample_out_of_order_total[1m]))",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "out of order: {{job}}",
+ "legendLink": null,
+ "step": 10
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Scrape failures",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ]
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fill": 10,
+ "id": 6,
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 0,
+ "links": [],
+ "nullPointMode": "null as zero",
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "span": 4,
+ "stack": true,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "rate(prometheus_tsdb_head_samples_appended_total{job=~\"$job\",instance=~\"$instance\"}[5m])",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{job}} {{instance}}",
+ "legendLink": null,
+ "step": 10
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Appended Samples",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ]
+ }
+ ],
+ "repeat": null,
+ "repeatIteration": null,
+ "repeatRowId": null,
+ "showTitle": true,
+ "title": "Retrieval",
+ "titleSize": "h6"
+ },
+ {
+ "collapse": false,
+ "height": "250px",
+ "panels": [
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fill": 10,
+ "id": 7,
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 0,
+ "links": [],
+ "nullPointMode": "null as zero",
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "span": 6,
+ "stack": true,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "prometheus_tsdb_head_series{job=~\"$job\",instance=~\"$instance\"}",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{job}} {{instance}} head series",
+ "legendLink": null,
+ "step": 10
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Head Series",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ]
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fill": 10,
+ "id": 8,
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 0,
+ "links": [],
+ "nullPointMode": "null as zero",
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "span": 6,
+ "stack": true,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "prometheus_tsdb_head_chunks{job=~\"$job\",instance=~\"$instance\"}",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{job}} {{instance}} head chunks",
+ "legendLink": null,
+ "step": 10
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Head Chunks",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ]
+ }
+ ],
+ "repeat": null,
+ "repeatIteration": null,
+ "repeatRowId": null,
+ "showTitle": true,
+ "title": "Storage",
+ "titleSize": "h6"
+ },
+ {
+ "collapse": false,
+ "height": "250px",
+ "panels": [
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fill": 10,
+ "id": 9,
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 0,
+ "links": [],
+ "nullPointMode": "null as zero",
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "span": 6,
+ "stack": true,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "rate(prometheus_engine_query_duration_seconds_count{job=~\"$job\",instance=~\"$instance\",slice=\"inner_eval\"}[5m])",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{job}} {{instance}}",
+ "legendLink": null,
+ "step": 10
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Query Rate",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ]
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fill": 10,
+ "id": 10,
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 0,
+ "links": [],
+ "nullPointMode": "null as zero",
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "span": 6,
+ "stack": true,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "max by (slice) (prometheus_engine_query_duration_seconds{quantile=\"0.9\",job=~\"$job\",instance=~\"$instance\"}) * 1e3",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{slice}}",
+ "legendLink": null,
+ "step": 10
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Stage Duration",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "ms",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ]
+ }
+ ],
+ "repeat": null,
+ "repeatIteration": null,
+ "repeatRowId": null,
+ "showTitle": true,
+ "title": "Query",
+ "titleSize": "h6"
+ }
+ ],
+ "schemaVersion": 14,
+ "style": "dark",
+ "tags": [],
+ "templating": {
+ "list": [
+ {
+ "current": {
+ "text": "default",
+ "value": "default"
+ },
+ "hide": 0,
+ "label": null,
+ "name": "datasource",
+ "options": [],
+ "query": "prometheus",
+ "refresh": 1,
+ "regex": "",
+ "type": "datasource"
+ },
+ {
+ "allValue": null,
+ "current": {
+ "selected": true,
+ "text": "All",
+ "value": "$__all"
+ },
+ "datasource": "$datasource",
+ "hide": 0,
+ "includeAll": true,
+ "label": "job",
+ "multi": true,
+ "name": "job",
+ "options": [],
+ "query": "label_values(prometheus_build_info, job)",
+ "refresh": 1,
+ "regex": "",
+ "sort": 2,
+ "tagValuesQuery": "",
+ "tags": [],
+ "tagsQuery": "",
+ "type": "query",
+ "useTags": false
+ },
+ {
+ "allValue": null,
+ "current": {
+ "selected": true,
+ "text": "All",
+ "value": "$__all"
+ },
+ "datasource": "$datasource",
+ "hide": 0,
+ "includeAll": true,
+ "label": "instance",
+ "multi": true,
+ "name": "instance",
+ "options": [],
+ "query": "label_values(prometheus_build_info, instance)",
+ "refresh": 1,
+ "regex": "",
+ "sort": 2,
+ "tagValuesQuery": "",
+ "tags": [],
+ "tagsQuery": "",
+ "type": "query",
+ "useTags": false
+ }
+ ]
+ },
+ "time": {
+ "from": "now-1h",
+ "to": "now"
+ },
+ "timepicker": {
+ "refresh_intervals": [
+ "5s",
+ "10s",
+ "30s",
+ "1m",
+ "5m",
+ "15m",
+ "30m",
+ "1h",
+ "2h",
+ "1d"
+ ],
+ "time_options": ["5m", "15m", "1h", "6h", "12h", "24h", "2d", "7d", "30d"]
+ },
+ "timezone": "utc",
+ "title": "Prometheus Overview",
+ "uid": "prometheus",
+ "version": 0
+}
diff --git a/agw-deployer/helm/charts/grafana/dashboards/runtime-environment-k8s-cluster.json b/agw-deployer/helm/charts/grafana/dashboards/runtime-environment-k8s-cluster.json
new file mode 100644
index 0000000..e0421ca
--- /dev/null
+++ b/agw-deployer/helm/charts/grafana/dashboards/runtime-environment-k8s-cluster.json
@@ -0,0 +1,2942 @@
+{
+ "annotations": {
+ "list": [
+ {
+ "builtIn": 1,
+ "datasource": "-- Grafana --",
+ "enable": true,
+ "hide": true,
+ "iconColor": "rgba(0, 211, 255, 1)",
+ "name": "Annotations & Alerts",
+ "type": "dashboard"
+ }
+ ]
+ },
+ "editable": true,
+ "gnetId": null,
+ "graphTooltip": 0,
+ "id": 12,
+ "iteration": 1613707692101,
+ "links": [],
+ "panels": [
+ {
+ "collapsed": false,
+ "datasource": null,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 0
+ },
+ "id": 21,
+ "panels": [],
+ "repeat": null,
+ "title": "CPU",
+ "type": "row"
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": false,
+ "colors": [
+ "#299c46",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "fill": 1,
+ "format": "percentunit",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 5,
+ "x": 0,
+ "y": 1
+ },
+ "id": 1,
+ "interval": "1m",
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "null as zero",
+ "nullText": null,
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "stack": false,
+ "steppedLine": false,
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "1 - avg(rate(node_cpu_seconds_total{mode=\"idle\", cluster=\"$cluster\"}[$__rate_interval]))",
+ "format": "time_series",
+ "instant": true,
+ "intervalFactor": 2,
+ "refId": "A"
+ }
+ ],
+ "thresholds": "70,80",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "CPU Utilisation",
+ "tooltip": {
+ "shared": false,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "avg",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ]
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "fill": 10,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 9,
+ "w": 19,
+ "x": 5,
+ "y": 1
+ },
+ "hiddenSeries": false,
+ "id": 7,
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 0,
+ "links": [],
+ "nullPointMode": "null as zero",
+ "options": {
+ "alertThreshold": true
+ },
+ "percentage": false,
+ "pluginVersion": "7.3.5",
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": true,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_rate{cluster=\"$cluster\"}) by (namespace)",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{namespace}}",
+ "legendLink": null,
+ "refId": "A",
+ "step": 10
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "CPU Usage",
+ "tooltip": {
+ "shared": false,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": false,
+ "colors": [
+ "#299c46",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "fill": 1,
+ "format": "percentunit",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 5,
+ "x": 0,
+ "y": 4
+ },
+ "id": 2,
+ "interval": null,
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "null as zero",
+ "nullText": null,
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "stack": false,
+ "steppedLine": false,
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(kube_pod_container_resource_requests_cpu_cores{cluster=\"$cluster\"}) / sum(kube_node_status_allocatable_cpu_cores{cluster=\"$cluster\"})",
+ "format": "time_series",
+ "instant": true,
+ "intervalFactor": 2,
+ "refId": "A"
+ }
+ ],
+ "thresholds": "70,80",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "CPU Requests Commitment",
+ "tooltip": {
+ "shared": false,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "avg",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ]
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": false,
+ "colors": [
+ "#299c46",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "fill": 1,
+ "format": "percentunit",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 5,
+ "x": 0,
+ "y": 7
+ },
+ "id": 3,
+ "interval": null,
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "null as zero",
+ "nullText": null,
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "stack": false,
+ "steppedLine": false,
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(kube_pod_container_resource_limits_cpu_cores{cluster=\"$cluster\"}) / sum(kube_node_status_allocatable_cpu_cores{cluster=\"$cluster\"})",
+ "format": "time_series",
+ "instant": true,
+ "intervalFactor": 2,
+ "refId": "A"
+ }
+ ],
+ "thresholds": "70,80",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "CPU Limits Commitment",
+ "tooltip": {
+ "shared": false,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "avg",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ]
+ },
+ {
+ "collapsed": true,
+ "datasource": null,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 10
+ },
+ "id": 22,
+ "panels": [
+ {
+ "aliasColors": {},
+ "bars": false,
+ "columns": [],
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "fill": 1,
+ "fontSize": "100%",
+ "gridPos": {
+ "h": 7,
+ "w": 24,
+ "x": 0,
+ "y": 2
+ },
+ "id": 8,
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null as zero",
+ "pageSize": null,
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "showHeader": true,
+ "sort": {
+ "col": 0,
+ "desc": true
+ },
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "styles": [
+ {
+ "alias": "Time",
+ "align": "auto",
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "pattern": "Time",
+ "type": "hidden"
+ },
+ {
+ "alias": "Pods",
+ "align": "auto",
+ "colorMode": null,
+ "colors": [],
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "decimals": 0,
+ "link": true,
+ "linkTargetBlank": false,
+ "linkTooltip": "Drill down to pods",
+ "linkUrl": "./d/85a562078cdf77779eaa1add43ccec1e/k8s-resources-namespace?var-datasource=$datasource&var-cluster=$cluster&var-namespace=$__cell_1",
+ "pattern": "Value #A",
+ "thresholds": [],
+ "type": "number",
+ "unit": "short"
+ },
+ {
+ "alias": "Workloads",
+ "align": "auto",
+ "colorMode": null,
+ "colors": [],
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "decimals": 0,
+ "link": true,
+ "linkTargetBlank": false,
+ "linkTooltip": "Drill down to workloads",
+ "linkUrl": "./d/a87fb0d919ec0ea5f6543124e16c42a5/k8s-resources-workloads-namespace?var-datasource=$datasource&var-cluster=$cluster&var-namespace=$__cell_1",
+ "pattern": "Value #B",
+ "thresholds": [],
+ "type": "number",
+ "unit": "short"
+ },
+ {
+ "alias": "CPU Usage",
+ "align": "auto",
+ "colorMode": null,
+ "colors": [],
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "decimals": 2,
+ "link": false,
+ "linkTargetBlank": false,
+ "linkTooltip": "Drill down",
+ "linkUrl": "",
+ "pattern": "Value #C",
+ "thresholds": [],
+ "type": "number",
+ "unit": "short"
+ },
+ {
+ "alias": "CPU Requests",
+ "align": "auto",
+ "colorMode": null,
+ "colors": [],
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "decimals": 2,
+ "link": false,
+ "linkTargetBlank": false,
+ "linkTooltip": "Drill down",
+ "linkUrl": "",
+ "pattern": "Value #D",
+ "thresholds": [],
+ "type": "number",
+ "unit": "short"
+ },
+ {
+ "alias": "CPU Requests %",
+ "align": "auto",
+ "colorMode": null,
+ "colors": [],
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "decimals": 2,
+ "link": false,
+ "linkTargetBlank": false,
+ "linkTooltip": "Drill down",
+ "linkUrl": "",
+ "pattern": "Value #E",
+ "thresholds": [],
+ "type": "number",
+ "unit": "percentunit"
+ },
+ {
+ "alias": "CPU Limits",
+ "align": "auto",
+ "colorMode": null,
+ "colors": [],
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "decimals": 2,
+ "link": false,
+ "linkTargetBlank": false,
+ "linkTooltip": "Drill down",
+ "linkUrl": "",
+ "pattern": "Value #F",
+ "thresholds": [],
+ "type": "number",
+ "unit": "short"
+ },
+ {
+ "alias": "CPU Limits %",
+ "align": "auto",
+ "colorMode": null,
+ "colors": [],
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "decimals": 2,
+ "link": false,
+ "linkTargetBlank": false,
+ "linkTooltip": "Drill down",
+ "linkUrl": "",
+ "pattern": "Value #G",
+ "thresholds": [],
+ "type": "number",
+ "unit": "percentunit"
+ },
+ {
+ "alias": "Namespace",
+ "align": "auto",
+ "colorMode": null,
+ "colors": [],
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "decimals": 2,
+ "link": true,
+ "linkTargetBlank": false,
+ "linkTooltip": "Drill down to pods",
+ "linkUrl": "./d/85a562078cdf77779eaa1add43ccec1e/k8s-resources-namespace?var-datasource=$datasource&var-cluster=$cluster&var-namespace=$__cell",
+ "pattern": "namespace",
+ "thresholds": [],
+ "type": "number",
+ "unit": "short"
+ },
+ {
+ "alias": "",
+ "align": "auto",
+ "colorMode": null,
+ "colors": [],
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "decimals": 2,
+ "pattern": "/.*/",
+ "thresholds": [],
+ "type": "string",
+ "unit": "short"
+ }
+ ],
+ "targets": [
+ {
+ "expr": "sum(kube_pod_owner{cluster=\"$cluster\"}) by (namespace)",
+ "format": "table",
+ "instant": true,
+ "intervalFactor": 2,
+ "legendFormat": "",
+ "refId": "A",
+ "step": 10
+ },
+ {
+ "expr": "count(avg(namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\"}) by (workload, namespace)) by (namespace)",
+ "format": "table",
+ "instant": true,
+ "intervalFactor": 2,
+ "legendFormat": "",
+ "refId": "B",
+ "step": 10
+ },
+ {
+ "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_rate{cluster=\"$cluster\"}) by (namespace)",
+ "format": "table",
+ "instant": true,
+ "intervalFactor": 2,
+ "legendFormat": "",
+ "refId": "C",
+ "step": 10
+ },
+ {
+ "expr": "sum(kube_pod_container_resource_requests_cpu_cores{cluster=\"$cluster\"}) by (namespace)",
+ "format": "table",
+ "instant": true,
+ "intervalFactor": 2,
+ "legendFormat": "",
+ "refId": "D",
+ "step": 10
+ },
+ {
+ "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_rate{cluster=\"$cluster\"}) by (namespace) / sum(kube_pod_container_resource_requests_cpu_cores{cluster=\"$cluster\"}) by (namespace)",
+ "format": "table",
+ "instant": true,
+ "intervalFactor": 2,
+ "legendFormat": "",
+ "refId": "E",
+ "step": 10
+ },
+ {
+ "expr": "sum(kube_pod_container_resource_limits_cpu_cores{cluster=\"$cluster\"}) by (namespace)",
+ "format": "table",
+ "instant": true,
+ "intervalFactor": 2,
+ "legendFormat": "",
+ "refId": "F",
+ "step": 10
+ },
+ {
+ "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_rate{cluster=\"$cluster\"}) by (namespace) / sum(kube_pod_container_resource_limits_cpu_cores{cluster=\"$cluster\"}) by (namespace)",
+ "format": "table",
+ "instant": true,
+ "intervalFactor": 2,
+ "legendFormat": "",
+ "refId": "G",
+ "step": 10
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "CPU Quota",
+ "tooltip": {
+ "shared": false,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "transform": "table",
+ "type": "table-old",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ]
+ }
+ ],
+ "repeat": null,
+ "title": "CPU Quota",
+ "type": "row"
+ },
+ {
+ "collapsed": false,
+ "datasource": null,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 11
+ },
+ "id": 23,
+ "panels": [],
+ "repeat": null,
+ "title": "Memory",
+ "type": "row"
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": false,
+ "colors": [
+ "#299c46",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "fill": 1,
+ "format": "percentunit",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 5,
+ "x": 0,
+ "y": 12
+ },
+ "id": 4,
+ "interval": null,
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "null as zero",
+ "nullText": null,
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "stack": false,
+ "steppedLine": false,
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "1 - sum(:node_memory_MemAvailable_bytes:sum{cluster=\"$cluster\"}) / sum(kube_node_status_allocatable_memory_bytes{cluster=\"$cluster\"})",
+ "format": "time_series",
+ "instant": true,
+ "intervalFactor": 2,
+ "refId": "A"
+ }
+ ],
+ "thresholds": "70,80",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Memory Utilisation",
+ "tooltip": {
+ "shared": false,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "avg",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ]
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "fill": 10,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 9,
+ "w": 19,
+ "x": 5,
+ "y": 12
+ },
+ "hiddenSeries": false,
+ "id": 9,
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 0,
+ "links": [],
+ "nullPointMode": "null as zero",
+ "options": {
+ "alertThreshold": true
+ },
+ "percentage": false,
+ "pluginVersion": "7.3.5",
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": true,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "sum(container_memory_rss{cluster=\"$cluster\", container!=\"\"}) by (namespace)",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{namespace}}",
+ "legendLink": null,
+ "refId": "A",
+ "step": 10
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Memory Usage (w/o cache)",
+ "tooltip": {
+ "shared": false,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "bytes",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": false,
+ "colors": [
+ "#299c46",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "fill": 1,
+ "format": "percentunit",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 5,
+ "x": 0,
+ "y": 15
+ },
+ "id": 5,
+ "interval": null,
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "null as zero",
+ "nullText": null,
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "stack": false,
+ "steppedLine": false,
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(kube_pod_container_resource_requests_memory_bytes{cluster=\"$cluster\"}) / sum(kube_node_status_allocatable_memory_bytes{cluster=\"$cluster\"})",
+ "format": "time_series",
+ "instant": true,
+ "intervalFactor": 2,
+ "refId": "A"
+ }
+ ],
+ "thresholds": "70,80",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Memory Requests Commitment",
+ "tooltip": {
+ "shared": false,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "avg",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ]
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": false,
+ "colors": [
+ "#299c46",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "fill": 1,
+ "format": "percentunit",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 5,
+ "x": 0,
+ "y": 18
+ },
+ "id": 6,
+ "interval": null,
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "null as zero",
+ "nullText": null,
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "stack": false,
+ "steppedLine": false,
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "sum(kube_pod_container_resource_limits_memory_bytes{cluster=\"$cluster\"}) / sum(kube_node_status_allocatable_memory_bytes{cluster=\"$cluster\"})",
+ "format": "time_series",
+ "instant": true,
+ "intervalFactor": 2,
+ "refId": "A"
+ }
+ ],
+ "thresholds": "70,80",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Memory Limits Commitment",
+ "tooltip": {
+ "shared": false,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "avg",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ]
+ },
+ {
+ "collapsed": true,
+ "datasource": null,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 21
+ },
+ "id": 20,
+ "panels": [
+ {
+ "aliasColors": {},
+ "bars": false,
+ "columns": [],
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "fill": 1,
+ "fontSize": "100%",
+ "gridPos": {
+ "h": 7,
+ "w": 24,
+ "x": 0,
+ "y": 22
+ },
+ "id": 10,
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null as zero",
+ "pageSize": null,
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "showHeader": true,
+ "sort": {
+ "col": 0,
+ "desc": true
+ },
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "styles": [
+ {
+ "alias": "Time",
+ "align": "auto",
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "pattern": "Time",
+ "type": "hidden"
+ },
+ {
+ "alias": "Pods",
+ "align": "auto",
+ "colorMode": null,
+ "colors": [],
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "decimals": 0,
+ "link": true,
+ "linkTargetBlank": false,
+ "linkTooltip": "Drill down to pods",
+ "linkUrl": "./d/85a562078cdf77779eaa1add43ccec1e/k8s-resources-namespace?var-datasource=$datasource&var-cluster=$cluster&var-namespace=$__cell_1",
+ "pattern": "Value #A",
+ "thresholds": [],
+ "type": "number",
+ "unit": "short"
+ },
+ {
+ "alias": "Workloads",
+ "align": "auto",
+ "colorMode": null,
+ "colors": [],
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "decimals": 0,
+ "link": true,
+ "linkTargetBlank": false,
+ "linkTooltip": "Drill down to workloads",
+ "linkUrl": "./d/a87fb0d919ec0ea5f6543124e16c42a5/k8s-resources-workloads-namespace?var-datasource=$datasource&var-cluster=$cluster&var-namespace=$__cell_1",
+ "pattern": "Value #B",
+ "thresholds": [],
+ "type": "number",
+ "unit": "short"
+ },
+ {
+ "alias": "Memory Usage",
+ "align": "auto",
+ "colorMode": null,
+ "colors": [],
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "decimals": 2,
+ "link": false,
+ "linkTargetBlank": false,
+ "linkTooltip": "Drill down",
+ "linkUrl": "",
+ "pattern": "Value #C",
+ "thresholds": [],
+ "type": "number",
+ "unit": "bytes"
+ },
+ {
+ "alias": "Memory Requests",
+ "align": "auto",
+ "colorMode": null,
+ "colors": [],
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "decimals": 2,
+ "link": false,
+ "linkTargetBlank": false,
+ "linkTooltip": "Drill down",
+ "linkUrl": "",
+ "pattern": "Value #D",
+ "thresholds": [],
+ "type": "number",
+ "unit": "bytes"
+ },
+ {
+ "alias": "Memory Requests %",
+ "align": "auto",
+ "colorMode": null,
+ "colors": [],
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "decimals": 2,
+ "link": false,
+ "linkTargetBlank": false,
+ "linkTooltip": "Drill down",
+ "linkUrl": "",
+ "pattern": "Value #E",
+ "thresholds": [],
+ "type": "number",
+ "unit": "percentunit"
+ },
+ {
+ "alias": "Memory Limits",
+ "align": "auto",
+ "colorMode": null,
+ "colors": [],
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "decimals": 2,
+ "link": false,
+ "linkTargetBlank": false,
+ "linkTooltip": "Drill down",
+ "linkUrl": "",
+ "pattern": "Value #F",
+ "thresholds": [],
+ "type": "number",
+ "unit": "bytes"
+ },
+ {
+ "alias": "Memory Limits %",
+ "align": "auto",
+ "colorMode": null,
+ "colors": [],
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "decimals": 2,
+ "link": false,
+ "linkTargetBlank": false,
+ "linkTooltip": "Drill down",
+ "linkUrl": "",
+ "pattern": "Value #G",
+ "thresholds": [],
+ "type": "number",
+ "unit": "percentunit"
+ },
+ {
+ "alias": "Namespace",
+ "align": "auto",
+ "colorMode": null,
+ "colors": [],
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "decimals": 2,
+ "link": true,
+ "linkTargetBlank": false,
+ "linkTooltip": "Drill down to pods",
+ "linkUrl": "./d/85a562078cdf77779eaa1add43ccec1e/k8s-resources-namespace?var-datasource=$datasource&var-cluster=$cluster&var-namespace=$__cell",
+ "pattern": "namespace",
+ "thresholds": [],
+ "type": "number",
+ "unit": "short"
+ },
+ {
+ "alias": "",
+ "align": "auto",
+ "colorMode": null,
+ "colors": [],
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "decimals": 2,
+ "pattern": "/.*/",
+ "thresholds": [],
+ "type": "string",
+ "unit": "short"
+ }
+ ],
+ "targets": [
+ {
+ "expr": "sum(kube_pod_owner{cluster=\"$cluster\"}) by (namespace)",
+ "format": "table",
+ "instant": true,
+ "intervalFactor": 2,
+ "legendFormat": "",
+ "refId": "A",
+ "step": 10
+ },
+ {
+ "expr": "count(avg(namespace_workload_pod:kube_pod_owner:relabel{cluster=\"$cluster\"}) by (workload, namespace)) by (namespace)",
+ "format": "table",
+ "instant": true,
+ "intervalFactor": 2,
+ "legendFormat": "",
+ "refId": "B",
+ "step": 10
+ },
+ {
+ "expr": "sum(container_memory_rss{cluster=\"$cluster\", container!=\"\"}) by (namespace)",
+ "format": "table",
+ "instant": true,
+ "intervalFactor": 2,
+ "legendFormat": "",
+ "refId": "C",
+ "step": 10
+ },
+ {
+ "expr": "sum(kube_pod_container_resource_requests_memory_bytes{cluster=\"$cluster\"}) by (namespace)",
+ "format": "table",
+ "instant": true,
+ "intervalFactor": 2,
+ "legendFormat": "",
+ "refId": "D",
+ "step": 10
+ },
+ {
+ "expr": "sum(container_memory_rss{cluster=\"$cluster\", container!=\"\"}) by (namespace) / sum(kube_pod_container_resource_requests_memory_bytes{cluster=\"$cluster\"}) by (namespace)",
+ "format": "table",
+ "instant": true,
+ "intervalFactor": 2,
+ "legendFormat": "",
+ "refId": "E",
+ "step": 10
+ },
+ {
+ "expr": "sum(kube_pod_container_resource_limits_memory_bytes{cluster=\"$cluster\"}) by (namespace)",
+ "format": "table",
+ "instant": true,
+ "intervalFactor": 2,
+ "legendFormat": "",
+ "refId": "F",
+ "step": 10
+ },
+ {
+ "expr": "sum(container_memory_rss{cluster=\"$cluster\", container!=\"\"}) by (namespace) / sum(kube_pod_container_resource_limits_memory_bytes{cluster=\"$cluster\"}) by (namespace)",
+ "format": "table",
+ "instant": true,
+ "intervalFactor": 2,
+ "legendFormat": "",
+ "refId": "G",
+ "step": 10
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Requests by Namespace",
+ "tooltip": {
+ "shared": false,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "transform": "table",
+ "type": "table-old",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ]
+ }
+ ],
+ "repeat": null,
+ "title": "Memory Requests",
+ "type": "row"
+ },
+ {
+ "collapsed": true,
+ "datasource": null,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 22
+ },
+ "id": 29,
+ "panels": [
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "fill": 10,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 8,
+ "w": 12,
+ "x": 0,
+ "y": 23
+ },
+ "hiddenSeries": false,
+ "id": 13,
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 0,
+ "links": [],
+ "nullPointMode": "null as zero",
+ "options": {
+ "alertThreshold": true
+ },
+ "percentage": false,
+ "pluginVersion": "7.3.5",
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": true,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "sum(irate(container_network_transmit_bytes_total{cluster=\"$cluster\", namespace=~\".+\"}[$__rate_interval])) by (namespace)",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{namespace}}",
+ "legendLink": null,
+ "refId": "A",
+ "step": 10
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Transmit Bandwidth",
+ "tooltip": {
+ "shared": false,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "Bps",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "fill": 10,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 8,
+ "w": 12,
+ "x": 12,
+ "y": 23
+ },
+ "hiddenSeries": false,
+ "id": 12,
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 0,
+ "links": [],
+ "nullPointMode": "null as zero",
+ "options": {
+ "alertThreshold": true
+ },
+ "percentage": false,
+ "pluginVersion": "7.3.5",
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": true,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "sum(irate(container_network_receive_bytes_total{cluster=\"$cluster\", namespace=~\".+\"}[$__rate_interval])) by (namespace)",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{namespace}}",
+ "legendLink": null,
+ "refId": "A",
+ "step": 10
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Receive Bandwidth",
+ "tooltip": {
+ "shared": false,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "Bps",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "fill": 10,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 7,
+ "w": 12,
+ "x": 0,
+ "y": 31
+ },
+ "hiddenSeries": false,
+ "id": 15,
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 0,
+ "links": [],
+ "nullPointMode": "null as zero",
+ "options": {
+ "alertThreshold": true
+ },
+ "percentage": false,
+ "pluginVersion": "7.3.5",
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": true,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "avg(irate(container_network_transmit_bytes_total{cluster=\"$cluster\", namespace=~\".+\"}[$__rate_interval])) by (namespace)",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{namespace}}",
+ "legendLink": null,
+ "refId": "A",
+ "step": 10
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Average Container Bandwidth by Namespace: Transmitted",
+ "tooltip": {
+ "shared": false,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "Bps",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "fill": 10,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 7,
+ "w": 12,
+ "x": 12,
+ "y": 31
+ },
+ "hiddenSeries": false,
+ "id": 14,
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 0,
+ "links": [],
+ "nullPointMode": "null as zero",
+ "options": {
+ "alertThreshold": true
+ },
+ "percentage": false,
+ "pluginVersion": "7.3.5",
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": true,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "avg(irate(container_network_receive_bytes_total{cluster=\"$cluster\", namespace=~\".+\"}[$__rate_interval])) by (namespace)",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{namespace}}",
+ "legendLink": null,
+ "refId": "A",
+ "step": 10
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Average Container Bandwidth by Namespace: Received",
+ "tooltip": {
+ "shared": false,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "Bps",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "columns": [],
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "fill": 1,
+ "fontSize": "100%",
+ "gridPos": {
+ "h": 7,
+ "w": 24,
+ "x": 0,
+ "y": 38
+ },
+ "id": 11,
+ "interval": "1m",
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null as zero",
+ "pageSize": null,
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "showHeader": true,
+ "sort": {
+ "col": 0,
+ "desc": true
+ },
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "styles": [
+ {
+ "alias": "Time",
+ "align": "auto",
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "pattern": "Time",
+ "type": "hidden"
+ },
+ {
+ "alias": "Current Receive Bandwidth",
+ "align": "auto",
+ "colorMode": null,
+ "colors": [],
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "decimals": 2,
+ "link": false,
+ "linkTargetBlank": false,
+ "linkTooltip": "Drill down",
+ "linkUrl": "",
+ "pattern": "Value #A",
+ "thresholds": [],
+ "type": "number",
+ "unit": "Bps"
+ },
+ {
+ "alias": "Current Transmit Bandwidth",
+ "align": "auto",
+ "colorMode": null,
+ "colors": [],
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "decimals": 2,
+ "link": false,
+ "linkTargetBlank": false,
+ "linkTooltip": "Drill down",
+ "linkUrl": "",
+ "pattern": "Value #B",
+ "thresholds": [],
+ "type": "number",
+ "unit": "Bps"
+ },
+ {
+ "alias": "Rate of Received Packets",
+ "align": "auto",
+ "colorMode": null,
+ "colors": [],
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "decimals": 2,
+ "link": false,
+ "linkTargetBlank": false,
+ "linkTooltip": "Drill down",
+ "linkUrl": "",
+ "pattern": "Value #C",
+ "thresholds": [],
+ "type": "number",
+ "unit": "pps"
+ },
+ {
+ "alias": "Rate of Transmitted Packets",
+ "align": "auto",
+ "colorMode": null,
+ "colors": [],
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "decimals": 2,
+ "link": false,
+ "linkTargetBlank": false,
+ "linkTooltip": "Drill down",
+ "linkUrl": "",
+ "pattern": "Value #D",
+ "thresholds": [],
+ "type": "number",
+ "unit": "pps"
+ },
+ {
+ "alias": "Rate of Received Packets Dropped",
+ "align": "auto",
+ "colorMode": null,
+ "colors": [],
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "decimals": 2,
+ "link": false,
+ "linkTargetBlank": false,
+ "linkTooltip": "Drill down",
+ "linkUrl": "",
+ "pattern": "Value #E",
+ "thresholds": [],
+ "type": "number",
+ "unit": "pps"
+ },
+ {
+ "alias": "Rate of Transmitted Packets Dropped",
+ "align": "auto",
+ "colorMode": null,
+ "colors": [],
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "decimals": 2,
+ "link": false,
+ "linkTargetBlank": false,
+ "linkTooltip": "Drill down",
+ "linkUrl": "",
+ "pattern": "Value #F",
+ "thresholds": [],
+ "type": "number",
+ "unit": "pps"
+ },
+ {
+ "alias": "Namespace",
+ "align": "auto",
+ "colorMode": null,
+ "colors": [],
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "decimals": 2,
+ "link": true,
+ "linkTargetBlank": false,
+ "linkTooltip": "Drill down to pods",
+ "linkUrl": "./d/85a562078cdf77779eaa1add43ccec1e/k8s-resources-namespace?var-datasource=$datasource&var-cluster=$cluster&var-namespace=$__cell",
+ "pattern": "namespace",
+ "thresholds": [],
+ "type": "number",
+ "unit": "short"
+ },
+ {
+ "alias": "",
+ "align": "auto",
+ "colorMode": null,
+ "colors": [],
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "decimals": 2,
+ "pattern": "/.*/",
+ "thresholds": [],
+ "type": "string",
+ "unit": "short"
+ }
+ ],
+ "targets": [
+ {
+ "expr": "sum(irate(container_network_receive_bytes_total{cluster=\"$cluster\", namespace=~\".+\"}[$__rate_interval])) by (namespace)",
+ "format": "table",
+ "instant": true,
+ "intervalFactor": 2,
+ "legendFormat": "",
+ "refId": "A",
+ "step": 10
+ },
+ {
+ "expr": "sum(irate(container_network_transmit_bytes_total{cluster=\"$cluster\", namespace=~\".+\"}[$__rate_interval])) by (namespace)",
+ "format": "table",
+ "instant": true,
+ "intervalFactor": 2,
+ "legendFormat": "",
+ "refId": "B",
+ "step": 10
+ },
+ {
+ "expr": "sum(irate(container_network_receive_packets_total{cluster=\"$cluster\", namespace=~\".+\"}[$__rate_interval])) by (namespace)",
+ "format": "table",
+ "instant": true,
+ "intervalFactor": 2,
+ "legendFormat": "",
+ "refId": "C",
+ "step": 10
+ },
+ {
+ "expr": "sum(irate(container_network_transmit_packets_total{cluster=\"$cluster\", namespace=~\".+\"}[$__rate_interval])) by (namespace)",
+ "format": "table",
+ "instant": true,
+ "intervalFactor": 2,
+ "legendFormat": "",
+ "refId": "D",
+ "step": 10
+ },
+ {
+ "expr": "sum(irate(container_network_receive_packets_dropped_total{cluster=\"$cluster\", namespace=~\".+\"}[$__rate_interval])) by (namespace)",
+ "format": "table",
+ "instant": true,
+ "intervalFactor": 2,
+ "legendFormat": "",
+ "refId": "E",
+ "step": 10
+ },
+ {
+ "expr": "sum(irate(container_network_transmit_packets_dropped_total{cluster=\"$cluster\", namespace=~\".+\"}[$__rate_interval])) by (namespace)",
+ "format": "table",
+ "instant": true,
+ "intervalFactor": 2,
+ "legendFormat": "",
+ "refId": "F",
+ "step": 10
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Current Network Usage",
+ "tooltip": {
+ "shared": false,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "transform": "table",
+ "type": "table-old",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ]
+ }
+ ],
+ "repeat": null,
+ "title": "Network Usage",
+ "type": "row"
+ },
+ {
+ "collapsed": true,
+ "datasource": null,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 23
+ },
+ "id": 32,
+ "panels": [
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "fill": 10,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 7,
+ "w": 12,
+ "x": 0,
+ "y": 53
+ },
+ "hiddenSeries": false,
+ "id": 17,
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 0,
+ "links": [],
+ "nullPointMode": "null as zero",
+ "options": {
+ "alertThreshold": true
+ },
+ "percentage": false,
+ "pluginVersion": "7.3.5",
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": true,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "sum(irate(container_network_transmit_packets_total{cluster=\"$cluster\", namespace=~\".+\"}[$__rate_interval])) by (namespace)",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{namespace}}",
+ "legendLink": null,
+ "refId": "A",
+ "step": 10
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Rate of Transmitted Packets",
+ "tooltip": {
+ "shared": false,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "Bps",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "fill": 10,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 7,
+ "w": 12,
+ "x": 12,
+ "y": 53
+ },
+ "hiddenSeries": false,
+ "id": 16,
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 0,
+ "links": [],
+ "nullPointMode": "null as zero",
+ "options": {
+ "alertThreshold": true
+ },
+ "percentage": false,
+ "pluginVersion": "7.3.5",
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": true,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "sum(irate(container_network_receive_packets_total{cluster=\"$cluster\", namespace=~\".+\"}[$__rate_interval])) by (namespace)",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{namespace}}",
+ "legendLink": null,
+ "refId": "A",
+ "step": 10
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Rate of Received Packets",
+ "tooltip": {
+ "shared": false,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "Bps",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "fill": 10,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 7,
+ "w": 12,
+ "x": 0,
+ "y": 60
+ },
+ "hiddenSeries": false,
+ "id": 18,
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 0,
+ "links": [],
+ "nullPointMode": "null as zero",
+ "options": {
+ "alertThreshold": true
+ },
+ "percentage": false,
+ "pluginVersion": "7.3.5",
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": true,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "sum(irate(container_network_receive_packets_dropped_total{cluster=\"$cluster\", namespace=~\".+\"}[$__rate_interval])) by (namespace)",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{namespace}}",
+ "legendLink": null,
+ "refId": "A",
+ "step": 10
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Rate of Received Packets Dropped",
+ "tooltip": {
+ "shared": false,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "Bps",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "fill": 10,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 7,
+ "w": 12,
+ "x": 12,
+ "y": 60
+ },
+ "hiddenSeries": false,
+ "id": 19,
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 0,
+ "links": [],
+ "nullPointMode": "null as zero",
+ "options": {
+ "alertThreshold": true
+ },
+ "percentage": false,
+ "pluginVersion": "7.3.5",
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": true,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "sum(irate(container_network_transmit_packets_dropped_total{cluster=\"$cluster\", namespace=~\".+\"}[$__rate_interval])) by (namespace)",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{namespace}}",
+ "legendLink": null,
+ "refId": "A",
+ "step": 10
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Rate of Transmitted Packets Dropped",
+ "tooltip": {
+ "shared": false,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "Bps",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ }
+ ],
+ "repeat": null,
+ "title": "Network Packets",
+ "type": "row"
+ }
+ ],
+ "refresh": "10s",
+ "schemaVersion": 26,
+ "style": "dark",
+ "tags": [],
+ "templating": {
+ "list": [
+ {
+ "current": {
+ "selected": false,
+ "text": "Prometheus",
+ "value": "Prometheus"
+ },
+ "error": null,
+ "hide": 0,
+ "includeAll": false,
+ "label": null,
+ "multi": false,
+ "name": "datasource",
+ "options": [],
+ "query": "prometheus",
+ "queryValue": "",
+ "refresh": 1,
+ "regex": "",
+ "skipUrlSync": false,
+ "type": "datasource"
+ },
+ {
+ "allValue": null,
+ "current": {
+ "isNone": true,
+ "selected": false,
+ "text": "None",
+ "value": ""
+ },
+ "datasource": "$datasource",
+ "definition": "",
+ "error": null,
+ "hide": 2,
+ "includeAll": false,
+ "label": null,
+ "multi": false,
+ "name": "cluster",
+ "options": [],
+ "query": "label_values(node_cpu_seconds_total, cluster)",
+ "refresh": 2,
+ "regex": "",
+ "skipUrlSync": false,
+ "sort": 1,
+ "tagValuesQuery": "",
+ "tags": [],
+ "tagsQuery": "",
+ "type": "query",
+ "useTags": false
+ }
+ ]
+ },
+ "time": {
+ "from": "now-24h",
+ "to": "now"
+ },
+ "timepicker": {
+ "refresh_intervals": [
+ "5s",
+ "10s",
+ "30s",
+ "1m",
+ "5m",
+ "15m",
+ "30m",
+ "1h",
+ "2h",
+ "1d"
+ ],
+ "time_options": [
+ "5m",
+ "15m",
+ "1h",
+ "6h",
+ "12h",
+ "24h",
+ "2d",
+ "7d",
+ "30d"
+ ]
+ },
+ "timezone": "",
+ "title": "Runtime Environment (Kubernetes Cluster)",
+ "uid": "runtime-environment-k8s-cluster",
+ "version": 5
+}
diff --git a/agw-deployer/helm/charts/grafana/dashboards/runtime-environment-node.json b/agw-deployer/helm/charts/grafana/dashboards/runtime-environment-node.json
new file mode 100644
index 0000000..893af5d
--- /dev/null
+++ b/agw-deployer/helm/charts/grafana/dashboards/runtime-environment-node.json
@@ -0,0 +1,13621 @@
+{
+ "annotations": {
+ "list": [
+ {
+ "builtIn": 1,
+ "datasource": "-- Grafana --",
+ "enable": true,
+ "hide": true,
+ "iconColor": "rgba(0, 211, 255, 1)",
+ "name": "Annotations & Alerts",
+ "type": "dashboard"
+ }
+ ]
+ },
+ "editable": true,
+ "gnetId": 1860,
+ "graphTooltip": 0,
+ "id": 10,
+ "iteration": 1613430348938,
+ "links": [],
+ "panels": [
+ {
+ "collapsed": false,
+ "datasource": "Prometheus",
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 0
+ },
+ "id": 261,
+ "panels": [],
+ "repeat": null,
+ "title": "Quick CPU / Mem / Disk",
+ "type": "row"
+ },
+ {
+ "cacheTimeout": null,
+ "datasource": "Prometheus",
+ "description": "Busy state of all CPU cores together",
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "custom": {},
+ "mappings": [
+ {
+ "id": 0,
+ "op": "=",
+ "text": "N/A",
+ "type": 1,
+ "value": "null"
+ }
+ ],
+ "max": 100,
+ "min": 0,
+ "nullValueMode": "null",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "rgba(50, 172, 45, 0.97)",
+ "value": null
+ },
+ {
+ "color": "rgba(237, 129, 40, 0.89)",
+ "value": 85
+ },
+ {
+ "color": "rgba(245, 54, 54, 0.9)",
+ "value": 95
+ }
+ ]
+ },
+ "unit": "percent"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 3,
+ "x": 0,
+ "y": 1
+ },
+ "id": 20,
+ "links": [],
+ "options": {
+ "orientation": "horizontal",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showThresholdLabels": false,
+ "showThresholdMarkers": true
+ },
+ "pluginVersion": "7.3.5",
+ "targets": [
+ {
+ "expr": "(((count(count(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}) by (cpu))) - avg(sum by (mode)(irate(node_cpu_seconds_total{mode='idle',instance=\"$node\",job=\"$job\"}[5m])))) * 100) / count(count(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}) by (cpu))",
+ "hide": false,
+ "intervalFactor": 1,
+ "legendFormat": "",
+ "refId": "A",
+ "step": 900
+ }
+ ],
+ "title": "CPU Busy",
+ "type": "gauge"
+ },
+ {
+ "cacheTimeout": null,
+ "datasource": "Prometheus",
+ "description": "Busy state of all CPU cores together (5 min average)",
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "custom": {},
+ "mappings": [
+ {
+ "id": 0,
+ "op": "=",
+ "text": "N/A",
+ "type": 1,
+ "value": "null"
+ }
+ ],
+ "max": 100,
+ "min": 0,
+ "nullValueMode": "null",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "rgba(50, 172, 45, 0.97)",
+ "value": null
+ },
+ {
+ "color": "rgba(237, 129, 40, 0.89)",
+ "value": 85
+ },
+ {
+ "color": "rgba(245, 54, 54, 0.9)",
+ "value": 95
+ }
+ ]
+ },
+ "unit": "percent"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 3,
+ "x": 3,
+ "y": 1
+ },
+ "id": 155,
+ "links": [],
+ "options": {
+ "orientation": "horizontal",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showThresholdLabels": false,
+ "showThresholdMarkers": true
+ },
+ "pluginVersion": "7.3.5",
+ "targets": [
+ {
+ "expr": "avg(node_load5{instance=\"$node\",job=\"$job\"}) / count(count(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}) by (cpu)) * 100",
+ "format": "time_series",
+ "hide": false,
+ "intervalFactor": 1,
+ "refId": "A",
+ "step": 900
+ }
+ ],
+ "title": "Sys Load (5m avg)",
+ "type": "gauge"
+ },
+ {
+ "cacheTimeout": null,
+ "datasource": "Prometheus",
+ "description": "Busy state of all CPU cores together (15 min average)",
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "custom": {},
+ "mappings": [
+ {
+ "id": 0,
+ "op": "=",
+ "text": "N/A",
+ "type": 1,
+ "value": "null"
+ }
+ ],
+ "max": 100,
+ "min": 0,
+ "nullValueMode": "null",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "rgba(50, 172, 45, 0.97)",
+ "value": null
+ },
+ {
+ "color": "rgba(237, 129, 40, 0.89)",
+ "value": 85
+ },
+ {
+ "color": "rgba(245, 54, 54, 0.9)",
+ "value": 95
+ }
+ ]
+ },
+ "unit": "percent"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 3,
+ "x": 6,
+ "y": 1
+ },
+ "id": 19,
+ "links": [],
+ "options": {
+ "orientation": "horizontal",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showThresholdLabels": false,
+ "showThresholdMarkers": true
+ },
+ "pluginVersion": "7.3.5",
+ "targets": [
+ {
+ "expr": "avg(node_load15{instance=\"$node\",job=\"$job\"}) / count(count(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}) by (cpu)) * 100",
+ "hide": false,
+ "intervalFactor": 1,
+ "refId": "A",
+ "step": 900
+ }
+ ],
+ "title": "Sys Load (15m avg)",
+ "type": "gauge"
+ },
+ {
+ "cacheTimeout": null,
+ "datasource": "Prometheus",
+ "description": "Non available RAM memory",
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "custom": {},
+ "decimals": 0,
+ "mappings": [],
+ "max": 100,
+ "min": 0,
+ "nullValueMode": "null",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "rgba(50, 172, 45, 0.97)",
+ "value": null
+ },
+ {
+ "color": "rgba(237, 129, 40, 0.89)",
+ "value": 80
+ },
+ {
+ "color": "rgba(245, 54, 54, 0.9)",
+ "value": 90
+ }
+ ]
+ },
+ "unit": "percent"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 3,
+ "x": 9,
+ "y": 1
+ },
+ "hideTimeOverride": false,
+ "id": 16,
+ "links": [],
+ "options": {
+ "orientation": "horizontal",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showThresholdLabels": false,
+ "showThresholdMarkers": true
+ },
+ "pluginVersion": "7.3.5",
+ "targets": [
+ {
+ "expr": "((node_memory_MemTotal_bytes{instance=\"$node\",job=\"$job\"} - node_memory_MemFree_bytes{instance=\"$node\",job=\"$job\"}) / (node_memory_MemTotal_bytes{instance=\"$node\",job=\"$job\"} )) * 100",
+ "format": "time_series",
+ "hide": true,
+ "intervalFactor": 1,
+ "refId": "A",
+ "step": 900
+ },
+ {
+ "expr": "100 - ((node_memory_MemAvailable_bytes{instance=\"$node\",job=\"$job\"} * 100) / node_memory_MemTotal_bytes{instance=\"$node\",job=\"$job\"})",
+ "format": "time_series",
+ "hide": false,
+ "intervalFactor": 1,
+ "refId": "B",
+ "step": 900
+ }
+ ],
+ "title": "RAM Used",
+ "type": "gauge"
+ },
+ {
+ "cacheTimeout": null,
+ "datasource": "Prometheus",
+ "description": "Used Swap",
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "custom": {},
+ "mappings": [
+ {
+ "id": 0,
+ "op": "=",
+ "text": "N/A",
+ "type": 1,
+ "value": "null"
+ }
+ ],
+ "max": 100,
+ "min": 0,
+ "nullValueMode": "null",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "rgba(50, 172, 45, 0.97)",
+ "value": null
+ },
+ {
+ "color": "rgba(237, 129, 40, 0.89)",
+ "value": 10
+ },
+ {
+ "color": "rgba(245, 54, 54, 0.9)",
+ "value": 25
+ }
+ ]
+ },
+ "unit": "percent"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 3,
+ "x": 12,
+ "y": 1
+ },
+ "id": 21,
+ "links": [],
+ "options": {
+ "orientation": "horizontal",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showThresholdLabels": false,
+ "showThresholdMarkers": true
+ },
+ "pluginVersion": "7.3.5",
+ "targets": [
+ {
+ "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",
+ "intervalFactor": 1,
+ "refId": "A",
+ "step": 900
+ }
+ ],
+ "title": "SWAP Used",
+ "type": "gauge"
+ },
+ {
+ "cacheTimeout": null,
+ "datasource": "Prometheus",
+ "description": "Used Root FS",
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "custom": {},
+ "mappings": [
+ {
+ "id": 0,
+ "op": "=",
+ "text": "N/A",
+ "type": 1,
+ "value": "null"
+ }
+ ],
+ "max": 100,
+ "min": 0,
+ "nullValueMode": "null",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "rgba(50, 172, 45, 0.97)",
+ "value": null
+ },
+ {
+ "color": "rgba(237, 129, 40, 0.89)",
+ "value": 80
+ },
+ {
+ "color": "rgba(245, 54, 54, 0.9)",
+ "value": 90
+ }
+ ]
+ },
+ "unit": "percent"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 3,
+ "x": 15,
+ "y": 1
+ },
+ "id": 154,
+ "links": [],
+ "options": {
+ "orientation": "horizontal",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showThresholdLabels": false,
+ "showThresholdMarkers": true
+ },
+ "pluginVersion": "7.3.5",
+ "targets": [
+ {
+ "expr": "100 - ((node_filesystem_avail_bytes{instance=\"$node\",job=\"$job\",mountpoint=\"/\",fstype!=\"rootfs\"} * 100) / node_filesystem_size_bytes{instance=\"$node\",job=\"$job\",mountpoint=\"/\",fstype!=\"rootfs\"})",
+ "format": "time_series",
+ "intervalFactor": 1,
+ "refId": "A",
+ "step": 900
+ }
+ ],
+ "title": "Root FS Used",
+ "type": "gauge"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": false,
+ "colors": [
+ "rgba(245, 54, 54, 0.9)",
+ "rgba(237, 129, 40, 0.89)",
+ "rgba(50, 172, 45, 0.97)"
+ ],
+ "datasource": "Prometheus",
+ "description": "Total number of CPU cores",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "short",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 2,
+ "w": 2,
+ "x": 18,
+ "y": 1
+ },
+ "id": 14,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "maxPerRow": 6,
+ "nullPointMode": "null",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "count(count(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}) by (cpu))",
+ "interval": "",
+ "intervalFactor": 1,
+ "legendFormat": "",
+ "refId": "A",
+ "step": 900
+ }
+ ],
+ "thresholds": "",
+ "title": "CPU Cores",
+ "type": "singlestat",
+ "valueFontSize": "50%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": false,
+ "colors": [
+ "rgba(245, 54, 54, 0.9)",
+ "rgba(237, 129, 40, 0.89)",
+ "rgba(50, 172, 45, 0.97)"
+ ],
+ "datasource": "Prometheus",
+ "decimals": 1,
+ "description": "System uptime",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "s",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 2,
+ "w": 4,
+ "x": 20,
+ "y": 1
+ },
+ "hideTimeOverride": true,
+ "id": 15,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "null",
+ "nullText": null,
+ "postfix": "s",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "node_time_seconds{instance=\"$node\",job=\"$job\"} - node_boot_time_seconds{instance=\"$node\",job=\"$job\"}",
+ "intervalFactor": 2,
+ "refId": "A",
+ "step": 1800
+ }
+ ],
+ "thresholds": "",
+ "title": "Uptime",
+ "type": "singlestat",
+ "valueFontSize": "50%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": false,
+ "colors": [
+ "rgba(50, 172, 45, 0.97)",
+ "rgba(237, 129, 40, 0.89)",
+ "rgba(245, 54, 54, 0.9)"
+ ],
+ "datasource": "Prometheus",
+ "decimals": 0,
+ "description": "Total RootFS",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "bytes",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 2,
+ "w": 2,
+ "x": 18,
+ "y": 3
+ },
+ "id": 23,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "maxPerRow": 6,
+ "nullPointMode": "null",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "node_filesystem_size_bytes{instance=\"$node\",job=\"$job\",mountpoint=\"/\",fstype!=\"rootfs\"}",
+ "format": "time_series",
+ "hide": false,
+ "intervalFactor": 1,
+ "refId": "A",
+ "step": 900
+ }
+ ],
+ "thresholds": "70,90",
+ "title": "RootFS Total",
+ "type": "singlestat",
+ "valueFontSize": "50%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": false,
+ "colors": [
+ "rgba(245, 54, 54, 0.9)",
+ "rgba(237, 129, 40, 0.89)",
+ "rgba(50, 172, 45, 0.97)"
+ ],
+ "datasource": "Prometheus",
+ "decimals": 0,
+ "description": "Total RAM",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "bytes",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 2,
+ "w": 2,
+ "x": 20,
+ "y": 3
+ },
+ "id": 75,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "maxPerRow": 6,
+ "nullPointMode": "null",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "70%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "node_memory_MemTotal_bytes{instance=\"$node\",job=\"$job\"}",
+ "intervalFactor": 1,
+ "refId": "A",
+ "step": 900
+ }
+ ],
+ "thresholds": "",
+ "title": "RAM Total",
+ "type": "singlestat",
+ "valueFontSize": "50%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": false,
+ "colors": [
+ "rgba(245, 54, 54, 0.9)",
+ "rgba(237, 129, 40, 0.89)",
+ "rgba(50, 172, 45, 0.97)"
+ ],
+ "datasource": "Prometheus",
+ "decimals": 0,
+ "description": "Total SWAP",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "bytes",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 2,
+ "w": 2,
+ "x": 22,
+ "y": 3
+ },
+ "id": 18,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "maxPerRow": 6,
+ "nullPointMode": "null",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "70%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "node_memory_SwapTotal_bytes{instance=\"$node\",job=\"$job\"}",
+ "intervalFactor": 1,
+ "refId": "A",
+ "step": 900
+ }
+ ],
+ "thresholds": "",
+ "title": "SWAP Total",
+ "type": "singlestat",
+ "valueFontSize": "50%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "collapsed": false,
+ "datasource": "Prometheus",
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 5
+ },
+ "id": 263,
+ "panels": [],
+ "repeat": null,
+ "title": "Basic CPU / Mem / Net / Disk",
+ "type": "row"
+ },
+ {
+ "aliasColors": {
+ "Busy": "#EAB839",
+ "Busy Iowait": "#890F02",
+ "Busy other": "#1F78C1",
+ "Idle": "#052B51",
+ "Idle - Waiting for something to happen": "#052B51",
+ "guest": "#9AC48A",
+ "idle": "#052B51",
+ "iowait": "#EAB839",
+ "irq": "#BF1B00",
+ "nice": "#C15C17",
+ "softirq": "#E24D42",
+ "steal": "#FCE2DE",
+ "system": "#508642",
+ "user": "#5195CE"
+ },
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "decimals": 2,
+ "description": "Basic CPU info",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {},
+ "links": []
+ },
+ "overrides": []
+ },
+ "fill": 4,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 7,
+ "w": 12,
+ "x": 0,
+ "y": 6
+ },
+ "hiddenSeries": false,
+ "id": 77,
+ "legend": {
+ "alignAsTable": false,
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "rightSide": false,
+ "show": true,
+ "sideWidth": 250,
+ "sort": null,
+ "sortDesc": null,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "maxPerRow": 6,
+ "nullPointMode": "null",
+ "options": {
+ "alertThreshold": true
+ },
+ "percentage": true,
+ "pluginVersion": "7.3.5",
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [
+ {
+ "alias": "Busy Iowait",
+ "color": "#890F02"
+ },
+ {
+ "alias": "Idle",
+ "color": "#7EB26D"
+ },
+ {
+ "alias": "Busy System",
+ "color": "#EAB839"
+ },
+ {
+ "alias": "Busy User",
+ "color": "#0A437C"
+ },
+ {
+ "alias": "Busy Other",
+ "color": "#6D1F62"
+ }
+ ],
+ "spaceLength": 10,
+ "stack": true,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "sum by (instance)(irate(node_cpu_seconds_total{mode=\"system\",instance=\"$node\",job=\"$job\"}[5m])) * 100",
+ "format": "time_series",
+ "hide": false,
+ "intervalFactor": 2,
+ "legendFormat": "Busy System",
+ "refId": "A",
+ "step": 240
+ },
+ {
+ "expr": "sum by (instance)(irate(node_cpu_seconds_total{mode='user',instance=\"$node\",job=\"$job\"}[5m])) * 100",
+ "format": "time_series",
+ "hide": false,
+ "intervalFactor": 2,
+ "legendFormat": "Busy User",
+ "refId": "B",
+ "step": 240
+ },
+ {
+ "expr": "sum by (instance)(irate(node_cpu_seconds_total{mode='iowait',instance=\"$node\",job=\"$job\"}[5m])) * 100",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "Busy Iowait",
+ "refId": "C",
+ "step": 240
+ },
+ {
+ "expr": "sum by (instance)(irate(node_cpu_seconds_total{mode=~\".*irq\",instance=\"$node\",job=\"$job\"}[5m])) * 100",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "Busy IRQs",
+ "refId": "D",
+ "step": 240
+ },
+ {
+ "expr": "sum (irate(node_cpu_seconds_total{mode!='idle',mode!='user',mode!='system',mode!='iowait',mode!='irq',mode!='softirq',instance=\"$node\",job=\"$job\"}[5m])) * 100",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "Busy Other",
+ "refId": "E",
+ "step": 240
+ },
+ {
+ "expr": "sum by (mode)(irate(node_cpu_seconds_total{mode='idle',instance=\"$node\",job=\"$job\"}[5m])) * 100",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "Idle",
+ "refId": "F",
+ "step": 240
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "CPU Basic",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": "",
+ "logBase": 1,
+ "max": "100",
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {
+ "Apps": "#629E51",
+ "Buffers": "#614D93",
+ "Cache": "#6D1F62",
+ "Cached": "#511749",
+ "Committed": "#508642",
+ "Free": "#0A437C",
+ "Hardware Corrupted - Amount of RAM that the kernel identified as corrupted / not working": "#CFFAFF",
+ "Inactive": "#584477",
+ "PageTables": "#0A50A1",
+ "Page_Tables": "#0A50A1",
+ "RAM_Free": "#E0F9D7",
+ "SWAP Used": "#BF1B00",
+ "Slab": "#806EB7",
+ "Slab_Cache": "#E0752D",
+ "Swap": "#BF1B00",
+ "Swap Used": "#BF1B00",
+ "Swap_Cache": "#C15C17",
+ "Swap_Free": "#2F575E",
+ "Unused": "#EAB839"
+ },
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "decimals": 2,
+ "description": "Basic memory usage",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {},
+ "links": []
+ },
+ "overrides": []
+ },
+ "fill": 4,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 7,
+ "w": 12,
+ "x": 12,
+ "y": 6
+ },
+ "hiddenSeries": false,
+ "id": 78,
+ "legend": {
+ "alignAsTable": false,
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "rightSide": false,
+ "show": true,
+ "sideWidth": 350,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "maxPerRow": 6,
+ "nullPointMode": "null",
+ "options": {
+ "alertThreshold": true
+ },
+ "percentage": false,
+ "pluginVersion": "7.3.5",
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [
+ {
+ "alias": "RAM Total",
+ "color": "#E0F9D7",
+ "fill": 0,
+ "stack": false
+ },
+ {
+ "alias": "RAM Cache + Buffer",
+ "color": "#052B51"
+ },
+ {
+ "alias": "RAM Free",
+ "color": "#7EB26D"
+ },
+ {
+ "alias": "Avaliable",
+ "color": "#DEDAF7",
+ "fill": 0,
+ "stack": false
+ }
+ ],
+ "spaceLength": 10,
+ "stack": true,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "node_memory_MemTotal_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "hide": false,
+ "intervalFactor": 2,
+ "legendFormat": "RAM Total",
+ "refId": "A",
+ "step": 240
+ },
+ {
+ "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\"})",
+ "format": "time_series",
+ "hide": false,
+ "intervalFactor": 2,
+ "legendFormat": "RAM Used",
+ "refId": "B",
+ "step": 240
+ },
+ {
+ "expr": "node_memory_Cached_bytes{instance=\"$node\",job=\"$job\"} + node_memory_Buffers_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "RAM Cache + Buffer",
+ "refId": "C",
+ "step": 240
+ },
+ {
+ "expr": "node_memory_MemFree_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "RAM Free",
+ "refId": "D",
+ "step": 240
+ },
+ {
+ "expr": "(node_memory_SwapTotal_bytes{instance=\"$node\",job=\"$job\"} - node_memory_SwapFree_bytes{instance=\"$node\",job=\"$job\"})",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "SWAP Used",
+ "refId": "E",
+ "step": 240
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Memory Basic",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "bytes",
+ "label": "",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {
+ "Recv_bytes_eth2": "#7EB26D",
+ "Recv_bytes_lo": "#0A50A1",
+ "Recv_drop_eth2": "#6ED0E0",
+ "Recv_drop_lo": "#E0F9D7",
+ "Recv_errs_eth2": "#BF1B00",
+ "Recv_errs_lo": "#CCA300",
+ "Trans_bytes_eth2": "#7EB26D",
+ "Trans_bytes_lo": "#0A50A1",
+ "Trans_drop_eth2": "#6ED0E0",
+ "Trans_drop_lo": "#E0F9D7",
+ "Trans_errs_eth2": "#BF1B00",
+ "Trans_errs_lo": "#CCA300",
+ "recv_bytes_lo": "#0A50A1",
+ "recv_drop_eth0": "#99440A",
+ "recv_drop_lo": "#967302",
+ "recv_errs_eth0": "#BF1B00",
+ "recv_errs_lo": "#890F02",
+ "trans_bytes_eth0": "#7EB26D",
+ "trans_bytes_lo": "#0A50A1",
+ "trans_drop_eth0": "#99440A",
+ "trans_drop_lo": "#967302",
+ "trans_errs_eth0": "#BF1B00",
+ "trans_errs_lo": "#890F02"
+ },
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "description": "Basic network info per interface",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {},
+ "links": []
+ },
+ "overrides": []
+ },
+ "fill": 4,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 7,
+ "w": 12,
+ "x": 0,
+ "y": 13
+ },
+ "hiddenSeries": false,
+ "id": 74,
+ "legend": {
+ "alignAsTable": false,
+ "avg": false,
+ "current": false,
+ "hideEmpty": false,
+ "hideZero": false,
+ "max": false,
+ "min": false,
+ "rightSide": false,
+ "show": true,
+ "sort": "current",
+ "sortDesc": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "options": {
+ "alertThreshold": true
+ },
+ "percentage": false,
+ "pluginVersion": "7.3.5",
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [
+ {
+ "alias": "/.*trans.*/",
+ "transform": "negative-Y"
+ }
+ ],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "irate(node_network_receive_bytes_total{instance=\"$node\",job=\"$job\"}[5m])*8",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "recv {{device}}",
+ "refId": "A",
+ "step": 240
+ },
+ {
+ "expr": "irate(node_network_transmit_bytes_total{instance=\"$node\",job=\"$job\"}[5m])*8",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "trans {{device}} ",
+ "refId": "B",
+ "step": 240
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Network Traffic Basic",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "bps",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "pps",
+ "label": "",
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "decimals": 3,
+ "description": "Disk space used of all filesystems mounted",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {},
+ "links": []
+ },
+ "overrides": []
+ },
+ "fill": 4,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 7,
+ "w": 12,
+ "x": 12,
+ "y": 13
+ },
+ "height": "",
+ "hiddenSeries": false,
+ "id": 152,
+ "legend": {
+ "alignAsTable": false,
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "rightSide": false,
+ "show": true,
+ "sort": "current",
+ "sortDesc": false,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "maxPerRow": 6,
+ "nullPointMode": "null",
+ "options": {
+ "alertThreshold": true
+ },
+ "percentage": false,
+ "pluginVersion": "7.3.5",
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "100 - ((node_filesystem_avail_bytes{instance=\"$node\",job=\"$job\",device!~'rootfs'} * 100) / node_filesystem_size_bytes{instance=\"$node\",job=\"$job\",device!~'rootfs'})",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{mountpoint}}",
+ "refId": "A",
+ "step": 240
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Disk Space Used Basic",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "percent",
+ "label": null,
+ "logBase": 1,
+ "max": "100",
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "collapsed": true,
+ "datasource": "Prometheus",
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 20
+ },
+ "id": 265,
+ "panels": [
+ {
+ "aliasColors": {
+ "Idle - Waiting for something to happen": "#052B51",
+ "guest": "#9AC48A",
+ "idle": "#052B51",
+ "iowait": "#EAB839",
+ "irq": "#BF1B00",
+ "nice": "#C15C17",
+ "softirq": "#E24D42",
+ "steal": "#FCE2DE",
+ "system": "#508642",
+ "user": "#5195CE"
+ },
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "decimals": 2,
+ "description": "",
+ "fill": 4,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 12,
+ "w": 12,
+ "x": 0,
+ "y": 21
+ },
+ "hiddenSeries": false,
+ "id": 3,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "sideWidth": 250,
+ "sort": null,
+ "sortDesc": null,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "maxPerRow": 6,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": true,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "repeat": null,
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": true,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "sum by (mode)(irate(node_cpu_seconds_total{mode=\"system\",instance=\"$node\",job=\"$job\"}[5m])) * 100",
+ "format": "time_series",
+ "interval": "10s",
+ "intervalFactor": 2,
+ "legendFormat": "System - Processes executing in kernel mode",
+ "refId": "A",
+ "step": 20
+ },
+ {
+ "expr": "sum by (mode)(irate(node_cpu_seconds_total{mode='user',instance=\"$node\",job=\"$job\"}[5m])) * 100",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "User - Normal processes executing in user mode",
+ "refId": "B",
+ "step": 240
+ },
+ {
+ "expr": "sum by (mode)(irate(node_cpu_seconds_total{mode='nice',instance=\"$node\",job=\"$job\"}[5m])) * 100",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "Nice - Niced processes executing in user mode",
+ "refId": "C",
+ "step": 240
+ },
+ {
+ "expr": "sum by (mode)(irate(node_cpu_seconds_total{mode='idle',instance=\"$node\",job=\"$job\"}[5m])) * 100",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "Idle - Waiting for something to happen",
+ "refId": "D",
+ "step": 240
+ },
+ {
+ "expr": "sum by (mode)(irate(node_cpu_seconds_total{mode='iowait',instance=\"$node\",job=\"$job\"}[5m])) * 100",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "Iowait - Waiting for I/O to complete",
+ "refId": "E",
+ "step": 240
+ },
+ {
+ "expr": "sum by (mode)(irate(node_cpu_seconds_total{mode='irq',instance=\"$node\",job=\"$job\"}[5m])) * 100",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "Irq - Servicing interrupts",
+ "refId": "F",
+ "step": 240
+ },
+ {
+ "expr": "sum by (mode)(irate(node_cpu_seconds_total{mode='softirq',instance=\"$node\",job=\"$job\"}[5m])) * 100",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "Softirq - Servicing softirqs",
+ "refId": "G",
+ "step": 240
+ },
+ {
+ "expr": "sum by (mode)(irate(node_cpu_seconds_total{mode='steal',instance=\"$node\",job=\"$job\"}[5m])) * 100",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "Steal - Time spent in other operating systems when running in a virtualized environment",
+ "refId": "H",
+ "step": 240
+ },
+ {
+ "expr": "sum by (mode)(irate(node_cpu_seconds_total{mode='guest',instance=\"$node\",job=\"$job\"}[5m])) * 100",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "Guest - Time spent running a virtual CPU for a guest operating system",
+ "refId": "I",
+ "step": 240
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "CPU",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": "percentage",
+ "logBase": 1,
+ "max": "100",
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {
+ "Apps": "#629E51",
+ "Buffers": "#614D93",
+ "Cache": "#6D1F62",
+ "Cached": "#511749",
+ "Committed": "#508642",
+ "Free": "#0A437C",
+ "Hardware Corrupted - Amount of RAM that the kernel identified as corrupted / not working": "#CFFAFF",
+ "Inactive": "#584477",
+ "PageTables": "#0A50A1",
+ "Page_Tables": "#0A50A1",
+ "RAM_Free": "#E0F9D7",
+ "Slab": "#806EB7",
+ "Slab_Cache": "#E0752D",
+ "Swap": "#BF1B00",
+ "Swap - Swap memory usage": "#BF1B00",
+ "Swap_Cache": "#C15C17",
+ "Swap_Free": "#2F575E",
+ "Unused": "#EAB839",
+ "Unused - Free memory unassigned": "#052B51"
+ },
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "decimals": 2,
+ "description": "",
+ "fill": 4,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 12,
+ "w": 12,
+ "x": 12,
+ "y": 21
+ },
+ "hiddenSeries": false,
+ "id": 24,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "sideWidth": 350,
+ "sort": null,
+ "sortDesc": null,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "maxPerRow": 6,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [
+ {
+ "alias": "/.*Hardware Corrupted - *./",
+ "stack": false
+ }
+ ],
+ "spaceLength": 10,
+ "stack": true,
+ "steppedLine": false,
+ "targets": [
+ {
+ "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\"}",
+ "format": "time_series",
+ "hide": false,
+ "intervalFactor": 2,
+ "legendFormat": "Apps - Memory used by user-space applications",
+ "refId": "A",
+ "step": 240
+ },
+ {
+ "expr": "node_memory_PageTables_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "hide": false,
+ "intervalFactor": 2,
+ "legendFormat": "PageTables - Memory used to map between virtual and physical memory addresses",
+ "refId": "B",
+ "step": 240
+ },
+ {
+ "expr": "node_memory_SwapCached_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "SwapCache - Memory that keeps track of pages that have been fetched from swap but not yet been modified",
+ "refId": "C",
+ "step": 240
+ },
+ {
+ "expr": "node_memory_Slab_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "hide": false,
+ "intervalFactor": 2,
+ "legendFormat": "Slab - Memory used by the kernel to cache data structures for its own use (caches like inode, dentry, etc)",
+ "refId": "D",
+ "step": 240
+ },
+ {
+ "expr": "node_memory_Cached_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "hide": false,
+ "intervalFactor": 2,
+ "legendFormat": "Cache - Parked file data (file content) cache",
+ "refId": "E",
+ "step": 240
+ },
+ {
+ "expr": "node_memory_Buffers_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "hide": false,
+ "intervalFactor": 2,
+ "legendFormat": "Buffers - Block device (e.g. harddisk) cache",
+ "refId": "F",
+ "step": 240
+ },
+ {
+ "expr": "node_memory_MemFree_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "hide": false,
+ "intervalFactor": 2,
+ "legendFormat": "Unused - Free memory unassigned",
+ "refId": "G",
+ "step": 240
+ },
+ {
+ "expr": "(node_memory_SwapTotal_bytes{instance=\"$node\",job=\"$job\"} - node_memory_SwapFree_bytes{instance=\"$node\",job=\"$job\"})",
+ "format": "time_series",
+ "hide": false,
+ "intervalFactor": 2,
+ "legendFormat": "Swap - Swap space used",
+ "refId": "H",
+ "step": 240
+ },
+ {
+ "expr": "node_memory_HardwareCorrupted_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "hide": false,
+ "intervalFactor": 2,
+ "legendFormat": "Hardware Corrupted - Amount of RAM that the kernel identified as corrupted / not working",
+ "refId": "I",
+ "step": 240
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Memory Stack",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "bytes",
+ "label": "bytes",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {
+ "receive_packets_eth0": "#7EB26D",
+ "receive_packets_lo": "#E24D42",
+ "transmit_packets_eth0": "#7EB26D",
+ "transmit_packets_lo": "#E24D42"
+ },
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "fill": 4,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 12,
+ "w": 12,
+ "x": 0,
+ "y": 33
+ },
+ "hiddenSeries": false,
+ "id": 84,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [
+ {
+ "alias": "/.*Trans.*/",
+ "transform": "negative-Y"
+ }
+ ],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "irate(node_network_receive_bytes_total{instance=\"$node\",job=\"$job\"}[5m])*8",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{device}} - Receive",
+ "refId": "A",
+ "step": 240
+ },
+ {
+ "expr": "irate(node_network_transmit_bytes_total{instance=\"$node\",job=\"$job\"}[5m])*8",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{device}} - Transmit",
+ "refId": "B",
+ "step": 240
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Network Traffic",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "bps",
+ "label": "bits out (-) / in (+)",
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "decimals": 3,
+ "description": "",
+ "fill": 4,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 12,
+ "w": 12,
+ "x": 12,
+ "y": 33
+ },
+ "height": "",
+ "hiddenSeries": false,
+ "id": 156,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "sort": "current",
+ "sortDesc": false,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "maxPerRow": 6,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "node_filesystem_size_bytes{instance=\"$node\",job=\"$job\",device!~'rootfs'} - node_filesystem_avail_bytes{instance=\"$node\",job=\"$job\",device!~'rootfs'}",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{mountpoint}}",
+ "refId": "A",
+ "step": 240
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Disk Space Used",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "bytes",
+ "label": "bytes",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "description": "",
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 12,
+ "w": 12,
+ "x": 0,
+ "y": 45
+ },
+ "hiddenSeries": false,
+ "id": 229,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "hideZero": true,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "maxPerRow": 6,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [
+ {
+ "alias": "/.*Read.*/",
+ "transform": "negative-Y"
+ },
+ {
+ "alias": "/.*sda_.*/",
+ "color": "#7EB26D"
+ },
+ {
+ "alias": "/.*sdb_.*/",
+ "color": "#EAB839"
+ },
+ {
+ "alias": "/.*sdc_.*/",
+ "color": "#6ED0E0"
+ },
+ {
+ "alias": "/.*sdd_.*/",
+ "color": "#EF843C"
+ },
+ {
+ "alias": "/.*sde_.*/",
+ "color": "#E24D42"
+ },
+ {
+ "alias": "/.*sda1.*/",
+ "color": "#584477"
+ },
+ {
+ "alias": "/.*sda2_.*/",
+ "color": "#BA43A9"
+ },
+ {
+ "alias": "/.*sda3_.*/",
+ "color": "#F4D598"
+ },
+ {
+ "alias": "/.*sdb1.*/",
+ "color": "#0A50A1"
+ },
+ {
+ "alias": "/.*sdb2.*/",
+ "color": "#BF1B00"
+ },
+ {
+ "alias": "/.*sdb2.*/",
+ "color": "#BF1B00"
+ },
+ {
+ "alias": "/.*sdb3.*/",
+ "color": "#E0752D"
+ },
+ {
+ "alias": "/.*sdc1.*/",
+ "color": "#962D82"
+ },
+ {
+ "alias": "/.*sdc2.*/",
+ "color": "#614D93"
+ },
+ {
+ "alias": "/.*sdc3.*/",
+ "color": "#9AC48A"
+ },
+ {
+ "alias": "/.*sdd1.*/",
+ "color": "#65C5DB"
+ },
+ {
+ "alias": "/.*sdd2.*/",
+ "color": "#F9934E"
+ },
+ {
+ "alias": "/.*sdd3.*/",
+ "color": "#EA6460"
+ },
+ {
+ "alias": "/.*sde1.*/",
+ "color": "#E0F9D7"
+ },
+ {
+ "alias": "/.*sdd2.*/",
+ "color": "#FCEACA"
+ },
+ {
+ "alias": "/.*sde3.*/",
+ "color": "#F9E2D2"
+ }
+ ],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "irate(node_disk_reads_completed_total{instance=\"$node\",job=\"$job\",device=~\"$diskdevices\"}[5m])",
+ "intervalFactor": 4,
+ "legendFormat": "{{device}} - Reads completed",
+ "refId": "A",
+ "step": 480
+ },
+ {
+ "expr": "irate(node_disk_writes_completed_total{instance=\"$node\",job=\"$job\",device=~\"$diskdevices\"}[5m])",
+ "intervalFactor": 2,
+ "legendFormat": "{{device}} - Writes completed",
+ "refId": "B",
+ "step": 240
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Disk IOps",
+ "tooltip": {
+ "shared": false,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "iops",
+ "label": "IO read (-) / write (+)",
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {
+ "io time": "#890F02"
+ },
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "decimals": 3,
+ "description": "",
+ "fill": 4,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 12,
+ "w": 12,
+ "x": 12,
+ "y": 45
+ },
+ "hiddenSeries": false,
+ "id": 42,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "sort": null,
+ "sortDesc": null,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "maxPerRow": 6,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [
+ {
+ "alias": "/.*read*./",
+ "transform": "negative-Y"
+ },
+ {
+ "alias": "/.*sda.*/",
+ "color": "#7EB26D"
+ },
+ {
+ "alias": "/.*sdb.*/",
+ "color": "#EAB839"
+ },
+ {
+ "alias": "/.*sdc.*/",
+ "color": "#6ED0E0"
+ },
+ {
+ "alias": "/.*sdd.*/",
+ "color": "#EF843C"
+ },
+ {
+ "alias": "/.*sde.*/",
+ "color": "#E24D42"
+ }
+ ],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "irate(node_disk_read_bytes_total{instance=\"$node\",job=\"$job\",device=~\"$diskdevices\"}[5m])",
+ "format": "time_series",
+ "hide": false,
+ "intervalFactor": 2,
+ "legendFormat": "{{device}} - Successfully read bytes",
+ "refId": "A",
+ "step": 240
+ },
+ {
+ "expr": "irate(node_disk_written_bytes_total{instance=\"$node\",job=\"$job\",device=~\"$diskdevices\"}[5m])",
+ "format": "time_series",
+ "hide": false,
+ "intervalFactor": 2,
+ "legendFormat": "{{device}} - Successfully written bytes",
+ "refId": "B",
+ "step": 240
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "I/O Usage Read / Write",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": false,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "bytes",
+ "label": "bytes read (-) / write (+)",
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "ms",
+ "label": "",
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {
+ "io time": "#890F02"
+ },
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "decimals": 3,
+ "description": "",
+ "fill": 4,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 12,
+ "w": 12,
+ "x": 0,
+ "y": 57
+ },
+ "hiddenSeries": false,
+ "id": 127,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "sort": null,
+ "sortDesc": null,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "maxPerRow": 6,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "irate(node_disk_io_time_seconds_total{instance=\"$node\",job=\"$job\",device=~\"$diskdevices\"} [5m])",
+ "format": "time_series",
+ "hide": false,
+ "intervalFactor": 2,
+ "legendFormat": "{{device}} - Time spent doing I/Os",
+ "refId": "A",
+ "step": 240
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "I/O Usage Times",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": false,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "s",
+ "label": "time",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "s",
+ "label": "",
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ }
+ ],
+ "repeat": null,
+ "title": "CPU / Memory / Net / Disk",
+ "type": "row"
+ },
+ {
+ "collapsed": true,
+ "datasource": "Prometheus",
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 21
+ },
+ "id": 266,
+ "panels": [
+ {
+ "aliasColors": {
+ "Apps": "#629E51",
+ "Buffers": "#614D93",
+ "Cache": "#6D1F62",
+ "Cached": "#511749",
+ "Committed": "#508642",
+ "Free": "#0A437C",
+ "Hardware Corrupted - Amount of RAM that the kernel identified as corrupted / not working": "#CFFAFF",
+ "Inactive": "#584477",
+ "PageTables": "#0A50A1",
+ "Page_Tables": "#0A50A1",
+ "RAM_Free": "#E0F9D7",
+ "Slab": "#806EB7",
+ "Slab_Cache": "#E0752D",
+ "Swap": "#BF1B00",
+ "Swap_Cache": "#C15C17",
+ "Swap_Free": "#2F575E",
+ "Unused": "#EAB839"
+ },
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "decimals": 2,
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 0,
+ "y": 70
+ },
+ "hiddenSeries": false,
+ "id": 136,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "sideWidth": 350,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "maxPerRow": 2,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": true,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "node_memory_Inactive_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "Inactive - Memory which has been less recently used. It is more eligible to be reclaimed for other purposes",
+ "refId": "A",
+ "step": 4
+ },
+ {
+ "expr": "node_memory_Active_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "Active - Memory that has been used more recently and usually not reclaimed unless absolutely necessary",
+ "refId": "B",
+ "step": 4
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Memory Active / Inactive",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "cumulative"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "bytes",
+ "label": "bytes",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {
+ "Apps": "#629E51",
+ "Buffers": "#614D93",
+ "Cache": "#6D1F62",
+ "Cached": "#511749",
+ "Committed": "#508642",
+ "Free": "#0A437C",
+ "Hardware Corrupted - Amount of RAM that the kernel identified as corrupted / not working": "#CFFAFF",
+ "Inactive": "#584477",
+ "PageTables": "#0A50A1",
+ "Page_Tables": "#0A50A1",
+ "RAM_Free": "#E0F9D7",
+ "Slab": "#806EB7",
+ "Slab_Cache": "#E0752D",
+ "Swap": "#BF1B00",
+ "Swap_Cache": "#C15C17",
+ "Swap_Free": "#2F575E",
+ "Unused": "#EAB839"
+ },
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "decimals": 2,
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 12,
+ "y": 70
+ },
+ "hiddenSeries": false,
+ "id": 135,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "sideWidth": 350,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "maxPerRow": 6,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [
+ {
+ "alias": "/.*Committed_AS - *./"
+ },
+ {
+ "alias": "/.*CommitLimit - *./",
+ "color": "#BF1B00",
+ "fill": 0
+ }
+ ],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "node_memory_Committed_AS_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "Committed_AS - Amount of memory presently allocated on the system",
+ "refId": "A",
+ "step": 4
+ },
+ {
+ "expr": "node_memory_CommitLimit_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "CommitLimit - Amount of memory currently available to be allocated on the system",
+ "refId": "B",
+ "step": 4
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Memory Commited",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "cumulative"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "bytes",
+ "label": "bytes",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {
+ "Apps": "#629E51",
+ "Buffers": "#614D93",
+ "Cache": "#6D1F62",
+ "Cached": "#511749",
+ "Committed": "#508642",
+ "Free": "#0A437C",
+ "Hardware Corrupted - Amount of RAM that the kernel identified as corrupted / not working": "#CFFAFF",
+ "Inactive": "#584477",
+ "PageTables": "#0A50A1",
+ "Page_Tables": "#0A50A1",
+ "RAM_Free": "#E0F9D7",
+ "Slab": "#806EB7",
+ "Slab_Cache": "#E0752D",
+ "Swap": "#BF1B00",
+ "Swap_Cache": "#C15C17",
+ "Swap_Free": "#2F575E",
+ "Unused": "#EAB839"
+ },
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "decimals": 2,
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 0,
+ "y": 80
+ },
+ "hiddenSeries": false,
+ "id": 191,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "sideWidth": 350,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "maxPerRow": 6,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": true,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "node_memory_Inactive_file_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "hide": false,
+ "intervalFactor": 2,
+ "legendFormat": "Inactive_file - File-backed memory on inactive LRU list",
+ "refId": "A",
+ "step": 4
+ },
+ {
+ "expr": "node_memory_Inactive_anon_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "hide": false,
+ "intervalFactor": 2,
+ "legendFormat": "Inactive_anon - Anonymous and swap cache on inactive LRU list, including tmpfs (shmem)",
+ "refId": "B",
+ "step": 4
+ },
+ {
+ "expr": "node_memory_Active_file_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "hide": false,
+ "intervalFactor": 2,
+ "legendFormat": "Active_file - File-backed memory on active LRU list",
+ "refId": "C",
+ "step": 4
+ },
+ {
+ "expr": "node_memory_Active_anon_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "hide": false,
+ "intervalFactor": 2,
+ "legendFormat": "Active_anon - Anonymous and swap cache on active least-recently-used (LRU) list, including tmpfs",
+ "refId": "D",
+ "step": 4
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Memory Active / Inactive Detail",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "cumulative"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "bytes",
+ "label": "bytes",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "bytes",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {
+ "Active": "#99440A",
+ "Buffers": "#58140C",
+ "Cache": "#6D1F62",
+ "Cached": "#511749",
+ "Committed": "#508642",
+ "Dirty": "#6ED0E0",
+ "Free": "#B7DBAB",
+ "Inactive": "#EA6460",
+ "Mapped": "#052B51",
+ "PageTables": "#0A50A1",
+ "Page_Tables": "#0A50A1",
+ "Slab_Cache": "#EAB839",
+ "Swap": "#BF1B00",
+ "Swap_Cache": "#C15C17",
+ "Total": "#511749",
+ "Total RAM": "#052B51",
+ "Total RAM + Swap": "#052B51",
+ "Total Swap": "#614D93",
+ "VmallocUsed": "#EA6460"
+ },
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "decimals": 2,
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 12,
+ "y": 80
+ },
+ "hiddenSeries": false,
+ "id": 130,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "sideWidth": null,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "maxPerRow": 2,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "node_memory_Writeback_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "Writeback - Memory which is actively being written back to disk",
+ "refId": "A",
+ "step": 4
+ },
+ {
+ "expr": "node_memory_WritebackTmp_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "WritebackTmp - Memory used by FUSE for temporary writeback buffers",
+ "refId": "B",
+ "step": 4
+ },
+ {
+ "expr": "node_memory_Dirty_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "Dirty - Memory which is waiting to get written back to the disk",
+ "refId": "C",
+ "step": 4
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Memory Writeback and Dirty",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "bytes",
+ "label": "bytes",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {
+ "Apps": "#629E51",
+ "Buffers": "#614D93",
+ "Cache": "#6D1F62",
+ "Cached": "#511749",
+ "Committed": "#508642",
+ "Free": "#0A437C",
+ "Hardware Corrupted - Amount of RAM that the kernel identified as corrupted / not working": "#CFFAFF",
+ "Inactive": "#584477",
+ "PageTables": "#0A50A1",
+ "Page_Tables": "#0A50A1",
+ "RAM_Free": "#E0F9D7",
+ "Slab": "#806EB7",
+ "Slab_Cache": "#E0752D",
+ "Swap": "#BF1B00",
+ "Swap_Cache": "#C15C17",
+ "Swap_Free": "#2F575E",
+ "Unused": "#EAB839"
+ },
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "decimals": 2,
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 0,
+ "y": 90
+ },
+ "hiddenSeries": false,
+ "id": 138,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "sideWidth": 350,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "maxPerRow": 6,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [
+ {
+ "alias": "ShmemHugePages - Memory used by shared memory (shmem) and tmpfs allocated with huge pages",
+ "fill": 0
+ },
+ {
+ "alias": "ShmemHugePages - Memory used by shared memory (shmem) and tmpfs allocated with huge pages",
+ "fill": 0
+ }
+ ],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "node_memory_Mapped_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "Mapped - Used memory in mapped pages files which have been mmaped, such as libraries",
+ "refId": "A",
+ "step": 4
+ },
+ {
+ "expr": "node_memory_Shmem_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "Shmem - Used shared memory (shared between several processes, thus including RAM disks)",
+ "refId": "B",
+ "step": 4
+ },
+ {
+ "expr": "node_memory_ShmemHugePages_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "ShmemHugePages - Memory used by shared memory (shmem) and tmpfs allocated with huge pages",
+ "refId": "C",
+ "step": 4
+ },
+ {
+ "expr": "node_memory_ShmemPmdMapped_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "ShmemPmdMapped - Ammount of shared (shmem/tmpfs) memory backed by huge pages",
+ "refId": "D",
+ "step": 4
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Memory Shared and Mapped",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "cumulative"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "bytes",
+ "label": "bytes",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {
+ "Active": "#99440A",
+ "Buffers": "#58140C",
+ "Cache": "#6D1F62",
+ "Cached": "#511749",
+ "Committed": "#508642",
+ "Dirty": "#6ED0E0",
+ "Free": "#B7DBAB",
+ "Inactive": "#EA6460",
+ "Mapped": "#052B51",
+ "PageTables": "#0A50A1",
+ "Page_Tables": "#0A50A1",
+ "Slab_Cache": "#EAB839",
+ "Swap": "#BF1B00",
+ "Swap_Cache": "#C15C17",
+ "Total": "#511749",
+ "Total RAM": "#052B51",
+ "Total RAM + Swap": "#052B51",
+ "Total Swap": "#614D93",
+ "VmallocUsed": "#EA6460"
+ },
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "decimals": 2,
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 12,
+ "y": 90
+ },
+ "hiddenSeries": false,
+ "id": 131,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "sideWidth": null,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "maxPerRow": 2,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": true,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "node_memory_SUnreclaim_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "SUnreclaim - Part of Slab, that cannot be reclaimed on memory pressure",
+ "refId": "A",
+ "step": 4
+ },
+ {
+ "expr": "node_memory_SReclaimable_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "SReclaimable - Part of Slab, that might be reclaimed, such as caches",
+ "refId": "B",
+ "step": 4
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Memory Slab",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "bytes",
+ "label": "bytes",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {
+ "Active": "#99440A",
+ "Buffers": "#58140C",
+ "Cache": "#6D1F62",
+ "Cached": "#511749",
+ "Committed": "#508642",
+ "Dirty": "#6ED0E0",
+ "Free": "#B7DBAB",
+ "Inactive": "#EA6460",
+ "Mapped": "#052B51",
+ "PageTables": "#0A50A1",
+ "Page_Tables": "#0A50A1",
+ "Slab_Cache": "#EAB839",
+ "Swap": "#BF1B00",
+ "Swap_Cache": "#C15C17",
+ "Total": "#511749",
+ "Total RAM": "#052B51",
+ "Total RAM + Swap": "#052B51",
+ "VmallocUsed": "#EA6460"
+ },
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "decimals": 2,
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 0,
+ "y": 100
+ },
+ "hiddenSeries": false,
+ "id": 70,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "sideWidth": null,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "maxPerRow": 6,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "node_memory_VmallocChunk_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "hide": false,
+ "intervalFactor": 2,
+ "legendFormat": "VmallocChunk - Largest contigious block of vmalloc area which is free",
+ "refId": "A",
+ "step": 4
+ },
+ {
+ "expr": "node_memory_VmallocTotal_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "hide": false,
+ "intervalFactor": 2,
+ "legendFormat": "VmallocTotal - Total size of vmalloc memory area",
+ "refId": "B",
+ "step": 4
+ },
+ {
+ "expr": "node_memory_VmallocUsed_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "hide": false,
+ "intervalFactor": 2,
+ "legendFormat": "VmallocUsed - Amount of vmalloc area which is used",
+ "refId": "C",
+ "step": 4
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Memory Vmalloc",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "bytes",
+ "label": "bytes",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {
+ "Apps": "#629E51",
+ "Buffers": "#614D93",
+ "Cache": "#6D1F62",
+ "Cached": "#511749",
+ "Committed": "#508642",
+ "Free": "#0A437C",
+ "Hardware Corrupted - Amount of RAM that the kernel identified as corrupted / not working": "#CFFAFF",
+ "Inactive": "#584477",
+ "PageTables": "#0A50A1",
+ "Page_Tables": "#0A50A1",
+ "RAM_Free": "#E0F9D7",
+ "Slab": "#806EB7",
+ "Slab_Cache": "#E0752D",
+ "Swap": "#BF1B00",
+ "Swap_Cache": "#C15C17",
+ "Swap_Free": "#2F575E",
+ "Unused": "#EAB839"
+ },
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "decimals": 2,
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 12,
+ "y": 100
+ },
+ "hiddenSeries": false,
+ "id": 159,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "sideWidth": 350,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "maxPerRow": 6,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "node_memory_Bounce_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "Bounce - Memory used for block device bounce buffers",
+ "refId": "A",
+ "step": 4
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Memory Bounce",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "cumulative"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "bytes",
+ "label": "bytes",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {
+ "Active": "#99440A",
+ "Buffers": "#58140C",
+ "Cache": "#6D1F62",
+ "Cached": "#511749",
+ "Committed": "#508642",
+ "Dirty": "#6ED0E0",
+ "Free": "#B7DBAB",
+ "Inactive": "#EA6460",
+ "Mapped": "#052B51",
+ "PageTables": "#0A50A1",
+ "Page_Tables": "#0A50A1",
+ "Slab_Cache": "#EAB839",
+ "Swap": "#BF1B00",
+ "Swap_Cache": "#C15C17",
+ "Total": "#511749",
+ "Total RAM": "#052B51",
+ "Total RAM + Swap": "#052B51",
+ "VmallocUsed": "#EA6460"
+ },
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "decimals": 2,
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 0,
+ "y": 110
+ },
+ "hiddenSeries": false,
+ "id": 129,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "sideWidth": null,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "maxPerRow": 6,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [
+ {
+ "alias": "/.*Inactive *./",
+ "transform": "negative-Y"
+ }
+ ],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "node_memory_AnonHugePages_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "AnonHugePages - Memory in anonymous huge pages",
+ "refId": "A",
+ "step": 4
+ },
+ {
+ "expr": "node_memory_AnonPages_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "AnonPages - Memory in user pages not backed by files",
+ "refId": "B",
+ "step": 4
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Memory Anonymous",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "bytes",
+ "label": "bytes",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {
+ "Apps": "#629E51",
+ "Buffers": "#614D93",
+ "Cache": "#6D1F62",
+ "Cached": "#511749",
+ "Committed": "#508642",
+ "Free": "#0A437C",
+ "Hardware Corrupted - Amount of RAM that the kernel identified as corrupted / not working": "#CFFAFF",
+ "Inactive": "#584477",
+ "PageTables": "#0A50A1",
+ "Page_Tables": "#0A50A1",
+ "RAM_Free": "#E0F9D7",
+ "Slab": "#806EB7",
+ "Slab_Cache": "#E0752D",
+ "Swap": "#BF1B00",
+ "Swap_Cache": "#C15C17",
+ "Swap_Free": "#2F575E",
+ "Unused": "#EAB839"
+ },
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "decimals": 2,
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 12,
+ "y": 110
+ },
+ "hiddenSeries": false,
+ "id": 160,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "sideWidth": 350,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "maxPerRow": 2,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "node_memory_KernelStack_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "KernelStack - Kernel memory stack. This is not reclaimable",
+ "refId": "A",
+ "step": 4
+ },
+ {
+ "expr": "node_memory_Percpu_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "PerCPU - Per CPU memory allocated dynamically by loadable modules",
+ "refId": "B",
+ "step": 4
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Memory Kernel / CPU",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "cumulative"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "bytes",
+ "label": "bytes",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {
+ "Active": "#99440A",
+ "Buffers": "#58140C",
+ "Cache": "#6D1F62",
+ "Cached": "#511749",
+ "Committed": "#508642",
+ "Dirty": "#6ED0E0",
+ "Free": "#B7DBAB",
+ "Inactive": "#EA6460",
+ "Mapped": "#052B51",
+ "PageTables": "#0A50A1",
+ "Page_Tables": "#0A50A1",
+ "Slab_Cache": "#EAB839",
+ "Swap": "#BF1B00",
+ "Swap_Cache": "#C15C17",
+ "Total": "#511749",
+ "Total RAM": "#806EB7",
+ "Total RAM + Swap": "#806EB7",
+ "VmallocUsed": "#EA6460"
+ },
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "decimals": 2,
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 0,
+ "y": 120
+ },
+ "hiddenSeries": false,
+ "id": 140,
+ "legend": {
+ "alignAsTable": true,
+ "avg": false,
+ "current": true,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "sideWidth": null,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "maxPerRow": 6,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "node_memory_HugePages_Free{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "HugePages_Free - Huge pages in the pool that are not yet allocated",
+ "refId": "A",
+ "step": 4
+ },
+ {
+ "expr": "node_memory_HugePages_Rsvd{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "HugePages_Rsvd - Huge pages for which a commitment to allocate from the pool has been made, but no allocation has yet been made",
+ "refId": "B",
+ "step": 4
+ },
+ {
+ "expr": "node_memory_HugePages_Surp{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "HugePages_Surp - Huge pages in the pool above the value in /proc/sys/vm/nr_hugepages",
+ "refId": "C",
+ "step": 4
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Memory HugePages Counter",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": "pages",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": "",
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {
+ "Active": "#99440A",
+ "Buffers": "#58140C",
+ "Cache": "#6D1F62",
+ "Cached": "#511749",
+ "Committed": "#508642",
+ "Dirty": "#6ED0E0",
+ "Free": "#B7DBAB",
+ "Inactive": "#EA6460",
+ "Mapped": "#052B51",
+ "PageTables": "#0A50A1",
+ "Page_Tables": "#0A50A1",
+ "Slab_Cache": "#EAB839",
+ "Swap": "#BF1B00",
+ "Swap_Cache": "#C15C17",
+ "Total": "#511749",
+ "Total RAM": "#806EB7",
+ "Total RAM + Swap": "#806EB7",
+ "VmallocUsed": "#EA6460"
+ },
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "decimals": 2,
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 12,
+ "y": 120
+ },
+ "hiddenSeries": false,
+ "id": 71,
+ "legend": {
+ "alignAsTable": true,
+ "avg": false,
+ "current": true,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "sideWidth": null,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "maxPerRow": 2,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "node_memory_HugePages_Total{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "HugePages - Total size of the pool of huge pages",
+ "refId": "A",
+ "step": 4
+ },
+ {
+ "expr": "node_memory_Hugepagesize_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "Hugepagesize - Huge Page size",
+ "refId": "B",
+ "step": 4
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Memory HugePages Size",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "bytes",
+ "label": "bytes",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": "",
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {
+ "Active": "#99440A",
+ "Buffers": "#58140C",
+ "Cache": "#6D1F62",
+ "Cached": "#511749",
+ "Committed": "#508642",
+ "Dirty": "#6ED0E0",
+ "Free": "#B7DBAB",
+ "Inactive": "#EA6460",
+ "Mapped": "#052B51",
+ "PageTables": "#0A50A1",
+ "Page_Tables": "#0A50A1",
+ "Slab_Cache": "#EAB839",
+ "Swap": "#BF1B00",
+ "Swap_Cache": "#C15C17",
+ "Total": "#511749",
+ "Total RAM": "#052B51",
+ "Total RAM + Swap": "#052B51",
+ "VmallocUsed": "#EA6460"
+ },
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "decimals": 2,
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 0,
+ "y": 130
+ },
+ "hiddenSeries": false,
+ "id": 128,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": false,
+ "hideEmpty": false,
+ "hideZero": false,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "sideWidth": null,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "maxPerRow": 6,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "node_memory_DirectMap1G_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "DirectMap1G - Amount of pages mapped as this size",
+ "refId": "A",
+ "step": 4
+ },
+ {
+ "expr": "node_memory_DirectMap2M_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "DirectMap2M - Amount of pages mapped as this size",
+ "refId": "B",
+ "step": 4
+ },
+ {
+ "expr": "node_memory_DirectMap4k_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "DirectMap4K - Amount of pages mapped as this size",
+ "refId": "C",
+ "step": 4
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Memory DirectMap",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "bytes",
+ "label": "bytes",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {
+ "Apps": "#629E51",
+ "Buffers": "#614D93",
+ "Cache": "#6D1F62",
+ "Cached": "#511749",
+ "Committed": "#508642",
+ "Free": "#0A437C",
+ "Hardware Corrupted - Amount of RAM that the kernel identified as corrupted / not working": "#CFFAFF",
+ "Inactive": "#584477",
+ "PageTables": "#0A50A1",
+ "Page_Tables": "#0A50A1",
+ "RAM_Free": "#E0F9D7",
+ "Slab": "#806EB7",
+ "Slab_Cache": "#E0752D",
+ "Swap": "#BF1B00",
+ "Swap_Cache": "#C15C17",
+ "Swap_Free": "#2F575E",
+ "Unused": "#EAB839"
+ },
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "decimals": 2,
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 12,
+ "y": 130
+ },
+ "hiddenSeries": false,
+ "id": 137,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "sideWidth": 350,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "maxPerRow": 6,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "node_memory_Unevictable_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "Unevictable - Amount of unevictable memory that can't be swapped out for a variety of reasons",
+ "refId": "A",
+ "step": 4
+ },
+ {
+ "expr": "node_memory_Mlocked_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "MLocked - Size of pages locked to memory using the mlock() system call",
+ "refId": "B",
+ "step": 4
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Memory Unevictable and MLocked",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "cumulative"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "bytes",
+ "label": "bytes",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {
+ "Active": "#99440A",
+ "Buffers": "#58140C",
+ "Cache": "#6D1F62",
+ "Cached": "#511749",
+ "Committed": "#508642",
+ "Dirty": "#6ED0E0",
+ "Free": "#B7DBAB",
+ "Inactive": "#EA6460",
+ "Mapped": "#052B51",
+ "PageTables": "#0A50A1",
+ "Page_Tables": "#0A50A1",
+ "Slab_Cache": "#EAB839",
+ "Swap": "#BF1B00",
+ "Swap_Cache": "#C15C17",
+ "Total": "#511749",
+ "Total RAM": "#052B51",
+ "Total RAM + Swap": "#052B51",
+ "Total Swap": "#614D93",
+ "VmallocUsed": "#EA6460"
+ },
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "decimals": 2,
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 0,
+ "y": 140
+ },
+ "hiddenSeries": false,
+ "id": 132,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "sideWidth": null,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "maxPerRow": 6,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "node_memory_NFS_Unstable_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "NFS Unstable - Memory in NFS pages sent to the server, but not yet commited to the storage",
+ "refId": "A",
+ "step": 4
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Memory NFS",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "bytes",
+ "label": "bytes",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ }
+ ],
+ "repeat": null,
+ "title": "Memory Meminfo",
+ "type": "row"
+ },
+ {
+ "collapsed": true,
+ "datasource": "Prometheus",
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 22
+ },
+ "id": 267,
+ "panels": [
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 0,
+ "y": 23
+ },
+ "hiddenSeries": false,
+ "id": 176,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "maxPerRow": 6,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [
+ {
+ "alias": "/.*out/",
+ "transform": "negative-Y"
+ }
+ ],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "irate(node_vmstat_pgpgin{instance=\"$node\",job=\"$job\"}[5m])",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "Pagesin - Page in operations",
+ "refId": "A",
+ "step": 4
+ },
+ {
+ "expr": "irate(node_vmstat_pgpgout{instance=\"$node\",job=\"$job\"}[5m])",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "Pagesout - Page out operations",
+ "refId": "B",
+ "step": 4
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Memory Pages In / Out",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": "pages out (-) / in (+)",
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 12,
+ "y": 23
+ },
+ "hiddenSeries": false,
+ "id": 22,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "maxPerRow": 6,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [
+ {
+ "alias": "/.*out/",
+ "transform": "negative-Y"
+ }
+ ],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "irate(node_vmstat_pswpin{instance=\"$node\",job=\"$job\"}[5m])",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "Pswpin - Pages swapped in",
+ "refId": "A",
+ "step": 4
+ },
+ {
+ "expr": "irate(node_vmstat_pswpout{instance=\"$node\",job=\"$job\"}[5m])",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "Pswpout - Pages swapped out",
+ "refId": "B",
+ "step": 4
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Memory Pages Swap In / Out",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": "pages out (-) / in (+)",
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {
+ "Apps": "#629E51",
+ "Buffers": "#614D93",
+ "Cache": "#6D1F62",
+ "Cached": "#511749",
+ "Committed": "#508642",
+ "Free": "#0A437C",
+ "Hardware Corrupted - Amount of RAM that the kernel identified as corrupted / not working": "#CFFAFF",
+ "Inactive": "#584477",
+ "PageTables": "#0A50A1",
+ "Page_Tables": "#0A50A1",
+ "RAM_Free": "#E0F9D7",
+ "Slab": "#806EB7",
+ "Slab_Cache": "#E0752D",
+ "Swap": "#BF1B00",
+ "Swap_Cache": "#C15C17",
+ "Swap_Free": "#2F575E",
+ "Unused": "#EAB839"
+ },
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "decimals": 2,
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 0,
+ "y": 33
+ },
+ "hiddenSeries": false,
+ "id": 175,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "sideWidth": 350,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "maxPerRow": 6,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [
+ {
+ "alias": "Pgfault - Page major and minor fault operations",
+ "fill": 0,
+ "stack": false
+ }
+ ],
+ "spaceLength": 10,
+ "stack": true,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "irate(node_vmstat_pgfault{instance=\"$node\",job=\"$job\"}[5m])",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "Pgfault - Page major and minor fault operations",
+ "refId": "A",
+ "step": 4
+ },
+ {
+ "expr": "irate(node_vmstat_pgmajfault{instance=\"$node\",job=\"$job\"}[5m])",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "Pgmajfault - Major page fault operations",
+ "refId": "B",
+ "step": 4
+ },
+ {
+ "expr": "irate(node_vmstat_pgfault{instance=\"$node\",job=\"$job\"}[5m]) - irate(node_vmstat_pgmajfault{instance=\"$node\",job=\"$job\"}[5m])",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "Pgminfault - Minor page fault operations",
+ "refId": "C",
+ "step": 4
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Memory Page Faults",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "cumulative"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": "faults",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {
+ "Active": "#99440A",
+ "Buffers": "#58140C",
+ "Cache": "#6D1F62",
+ "Cached": "#511749",
+ "Committed": "#508642",
+ "Dirty": "#6ED0E0",
+ "Free": "#B7DBAB",
+ "Inactive": "#EA6460",
+ "Mapped": "#052B51",
+ "PageTables": "#0A50A1",
+ "Page_Tables": "#0A50A1",
+ "Slab_Cache": "#EAB839",
+ "Swap": "#BF1B00",
+ "Swap_Cache": "#C15C17",
+ "Total": "#511749",
+ "Total RAM": "#052B51",
+ "Total RAM + Swap": "#052B51",
+ "Total Swap": "#614D93",
+ "VmallocUsed": "#EA6460"
+ },
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "decimals": 2,
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 12,
+ "y": 33
+ },
+ "hiddenSeries": false,
+ "id": 307,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "sideWidth": null,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "maxPerRow": 6,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "irate(node_vmstat_oom_kill{instance=\"$node\",job=\"$job\"}[5m])",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "oom killer invocations ",
+ "refId": "A",
+ "step": 4
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "OOM Killer",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": "counter",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ }
+ ],
+ "repeat": null,
+ "title": "Memory Vmstat",
+ "type": "row"
+ },
+ {
+ "collapsed": true,
+ "datasource": "Prometheus",
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 23
+ },
+ "id": 293,
+ "panels": [
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "description": "",
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 0,
+ "y": 24
+ },
+ "hiddenSeries": false,
+ "id": 260,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "max": true,
+ "min": true,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [
+ {
+ "alias": "/.*Variation*./",
+ "color": "#890F02"
+ }
+ ],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "node_timex_estimated_error_seconds{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "hide": false,
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "Estimated error in seconds",
+ "refId": "A",
+ "step": 240
+ },
+ {
+ "expr": "node_timex_offset_seconds{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "hide": false,
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "Time offset in between local system and reference clock",
+ "refId": "B",
+ "step": 240
+ },
+ {
+ "expr": "node_timex_maxerror_seconds{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "hide": false,
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "Maximum error in seconds",
+ "refId": "C",
+ "step": 240
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Time Syncronized Drift",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "s",
+ "label": "seconds",
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": "counter",
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "description": "",
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 12,
+ "y": 24
+ },
+ "hiddenSeries": false,
+ "id": 291,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "max": true,
+ "min": true,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "node_timex_loop_time_constant{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "Phase-locked loop time adjust",
+ "refId": "A",
+ "step": 240
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Time PLL Adjust",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": "counter",
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "description": "",
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 0,
+ "y": 34
+ },
+ "hiddenSeries": false,
+ "id": 168,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "max": true,
+ "min": true,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [
+ {
+ "alias": "/.*Variation*./",
+ "color": "#890F02"
+ }
+ ],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "node_timex_sync_status{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "Is clock synchronized to a reliable server (1 = yes, 0 = no)",
+ "refId": "A",
+ "step": 240
+ },
+ {
+ "expr": "node_timex_frequency_adjustment_ratio{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "Local clock frequency adjustment",
+ "refId": "B",
+ "step": 240
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Time Syncronized Status",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": "counter",
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "description": "",
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 12,
+ "y": 34
+ },
+ "hiddenSeries": false,
+ "id": 294,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "max": true,
+ "min": true,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "node_timex_tick_seconds{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "Seconds between clock ticks",
+ "refId": "A",
+ "step": 240
+ },
+ {
+ "expr": "node_timex_tai_offset_seconds{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "International Atomic Time (TAI) offset",
+ "refId": "B",
+ "step": 240
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Time Misc",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "s",
+ "label": "seconds",
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ }
+ ],
+ "title": "System Timesync",
+ "type": "row"
+ },
+ {
+ "collapsed": true,
+ "datasource": "Prometheus",
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 24
+ },
+ "id": 312,
+ "panels": [
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 0,
+ "y": 7
+ },
+ "hiddenSeries": false,
+ "id": 62,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "max": true,
+ "min": true,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "maxPerRow": 6,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "node_procs_blocked{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "Processes blocked waiting for I/O to complete",
+ "refId": "A",
+ "step": 240
+ },
+ {
+ "expr": "node_procs_running{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "Processes in runnable state",
+ "refId": "B",
+ "step": 240
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Processes Status",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": "counter",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 12,
+ "y": 7
+ },
+ "hiddenSeries": false,
+ "id": 315,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "max": true,
+ "min": true,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "maxPerRow": 6,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": true,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "node_processes_state{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "{{ state }}",
+ "refId": "A",
+ "step": 240
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Processes State",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": "counter",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 0,
+ "y": 17
+ },
+ "hiddenSeries": false,
+ "id": 148,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "max": true,
+ "min": true,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "maxPerRow": 6,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "irate(node_forks_total{instance=\"$node\",job=\"$job\"}[5m])",
+ "format": "time_series",
+ "hide": false,
+ "intervalFactor": 2,
+ "legendFormat": "Processes forks second",
+ "refId": "A",
+ "step": 240
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Processes Forks",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": "forks / sec",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 12,
+ "y": 17
+ },
+ "hiddenSeries": false,
+ "id": 149,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "max": true,
+ "min": true,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [
+ {
+ "alias": "/.*Max.*/",
+ "fill": 0
+ }
+ ],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "irate(process_virtual_memory_bytes{instance=\"$node\",job=\"$job\"}[5m])",
+ "hide": false,
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "Processes virtual memory size in bytes",
+ "refId": "A",
+ "step": 240
+ },
+ {
+ "expr": "process_resident_memory_max_bytes{instance=\"$node\",job=\"$job\"}",
+ "hide": false,
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "Maximum amount of virtual memory available in bytes",
+ "refId": "B",
+ "step": 240
+ },
+ {
+ "expr": "irate(process_virtual_memory_bytes{instance=\"$node\",job=\"$job\"}[5m])",
+ "hide": false,
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "Processes virtual memory size in bytes",
+ "refId": "C",
+ "step": 240
+ },
+ {
+ "expr": "irate(process_virtual_memory_max_bytes{instance=\"$node\",job=\"$job\"}[5m])",
+ "hide": false,
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "Maximum amount of virtual memory available in bytes",
+ "refId": "D",
+ "step": 240
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Processes Memory",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "decbytes",
+ "label": "bytes",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 0,
+ "y": 27
+ },
+ "hiddenSeries": false,
+ "id": 313,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "max": true,
+ "min": true,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "maxPerRow": 6,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [
+ {
+ "alias": "PIDs limit",
+ "color": "#F2495C",
+ "fill": 0
+ }
+ ],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "node_processes_pids{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "Number of PIDs",
+ "refId": "A",
+ "step": 240
+ },
+ {
+ "expr": "node_processes_max_processes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "PIDs limit",
+ "refId": "B",
+ "step": 240
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "PIDs Number and Limit",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": "counter",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 12,
+ "y": 27
+ },
+ "hiddenSeries": false,
+ "id": 305,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "max": true,
+ "min": true,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "maxPerRow": 6,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [
+ {
+ "alias": "/.*waiting.*/",
+ "transform": "negative-Y"
+ }
+ ],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "irate(node_schedstat_running_seconds_total{instance=\"$node\",job=\"$job\"}[5m])",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "CPU {{ cpu }} - seconds spent running a process",
+ "refId": "A",
+ "step": 240
+ },
+ {
+ "expr": "irate(node_schedstat_waiting_seconds_total{instance=\"$node\",job=\"$job\"}[5m])",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "CPU {{ cpu }} - seconds spent by processing waiting for this CPU",
+ "refId": "B",
+ "step": 240
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Process schedule stats Running / Waiting",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "s",
+ "label": "seconds",
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 12,
+ "y": 37
+ },
+ "hiddenSeries": false,
+ "id": 314,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "max": true,
+ "min": true,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "maxPerRow": 6,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [
+ {
+ "alias": "Threads limit",
+ "color": "#F2495C",
+ "fill": 0
+ }
+ ],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "node_processes_threads{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "Allocated threads",
+ "refId": "A",
+ "step": 240
+ },
+ {
+ "expr": "node_processes_max_threads{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "Threads limit",
+ "refId": "B",
+ "step": 240
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Threads Number and Limit",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": "counter",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ }
+ ],
+ "title": "System Processes",
+ "type": "row"
+ },
+ {
+ "collapsed": true,
+ "datasource": "Prometheus",
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 25
+ },
+ "id": 269,
+ "panels": [
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 0,
+ "y": 8
+ },
+ "hiddenSeries": false,
+ "id": 8,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "max": true,
+ "min": true,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "maxPerRow": 6,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "repeat": null,
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "irate(node_context_switches_total{instance=\"$node\",job=\"$job\"}[5m])",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "Context switches",
+ "refId": "A",
+ "step": 240
+ },
+ {
+ "expr": "irate(node_intr_total{instance=\"$node\",job=\"$job\"}[5m])",
+ "format": "time_series",
+ "hide": false,
+ "intervalFactor": 2,
+ "legendFormat": "Interrupts",
+ "refId": "B",
+ "step": 240
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Context Switches / Interrupts",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": "counter",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 12,
+ "y": 8
+ },
+ "hiddenSeries": false,
+ "id": 7,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "max": true,
+ "min": true,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "maxPerRow": 6,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "repeat": null,
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "node_load1{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "intervalFactor": 4,
+ "legendFormat": "Load 1m",
+ "refId": "A",
+ "step": 480
+ },
+ {
+ "expr": "node_load5{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "intervalFactor": 4,
+ "legendFormat": "Load 5m",
+ "refId": "B",
+ "step": 480
+ },
+ {
+ "expr": "node_load15{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "intervalFactor": 4,
+ "legendFormat": "Load 15m",
+ "refId": "C",
+ "step": 480
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "System Load",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": "counter",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 0,
+ "y": 18
+ },
+ "hiddenSeries": false,
+ "id": 259,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "max": true,
+ "min": true,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [
+ {
+ "alias": "/.*Critical*./",
+ "color": "#E24D42",
+ "fill": 0
+ },
+ {
+ "alias": "/.*Max*./",
+ "color": "#EF843C",
+ "fill": 0
+ }
+ ],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "irate(node_interrupts_total{instance=\"$node\",job=\"$job\"}[5m])",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "{{ type }} - {{ info }}",
+ "refId": "A",
+ "step": 240
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Interrupts Detail",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": "counter",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 12,
+ "y": 18
+ },
+ "hiddenSeries": false,
+ "id": 306,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "max": true,
+ "min": true,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "maxPerRow": 6,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "irate(node_schedstat_timeslices_total{instance=\"$node\",job=\"$job\"}[5m])",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "CPU {{ cpu }}",
+ "refId": "A",
+ "step": 240
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Schedule timeslices executed by each cpu",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": "counter",
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 0,
+ "y": 28
+ },
+ "hiddenSeries": false,
+ "id": 151,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "max": true,
+ "min": true,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "maxPerRow": 6,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "node_entropy_available_bits{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "Entropy available to random number generators",
+ "refId": "A",
+ "step": 240
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Entropy",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": "counter",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 12,
+ "y": 28
+ },
+ "hiddenSeries": false,
+ "id": 308,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "max": true,
+ "min": true,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "maxPerRow": 6,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "irate(process_cpu_seconds_total{instance=\"$node\",job=\"$job\"}[5m])",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "Time spent",
+ "refId": "A",
+ "step": 240
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "CPU time spent in user and system contexts",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "s",
+ "label": "seconds",
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 0,
+ "y": 38
+ },
+ "hiddenSeries": false,
+ "id": 64,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "max": true,
+ "min": true,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [
+ {
+ "alias": "/.*Max*./",
+ "color": "#890F02",
+ "fill": 0
+ }
+ ],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "process_max_fds{instance=\"$node\",job=\"$job\"}",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "Maximum open file descriptors",
+ "refId": "A",
+ "step": 240
+ },
+ {
+ "expr": "process_open_fds{instance=\"$node\",job=\"$job\"}",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "Open file descriptors",
+ "refId": "B",
+ "step": 240
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "File Descriptors",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": "counter",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ }
+ ],
+ "repeat": null,
+ "title": "System Misc",
+ "type": "row"
+ },
+ {
+ "collapsed": true,
+ "datasource": "Prometheus",
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 26
+ },
+ "id": 304,
+ "panels": [
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 0,
+ "y": 26
+ },
+ "hiddenSeries": false,
+ "id": 158,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "max": true,
+ "min": true,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [
+ {
+ "alias": "/.*Critical*./",
+ "color": "#E24D42",
+ "fill": 0
+ },
+ {
+ "alias": "/.*Max*./",
+ "color": "#EF843C",
+ "fill": 0
+ }
+ ],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "node_hwmon_temp_celsius{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "{{ chip }} {{ sensor }} temp",
+ "refId": "A",
+ "step": 240
+ },
+ {
+ "expr": "node_hwmon_temp_crit_alarm_celsius{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "hide": true,
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "{{ chip }} {{ sensor }} Critical Alarm",
+ "refId": "B",
+ "step": 240
+ },
+ {
+ "expr": "node_hwmon_temp_crit_celsius{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "{{ chip }} {{ sensor }} Critical",
+ "refId": "C",
+ "step": 240
+ },
+ {
+ "expr": "node_hwmon_temp_crit_hyst_celsius{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "hide": true,
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "{{ chip }} {{ sensor }} Critical Historical",
+ "refId": "D",
+ "step": 240
+ },
+ {
+ "expr": "node_hwmon_temp_max_celsius{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "hide": true,
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "{{ chip }} {{ sensor }} Max",
+ "refId": "E",
+ "step": 240
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Hardware temperature monitor",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "celsius",
+ "label": "temperature",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 12,
+ "y": 26
+ },
+ "hiddenSeries": false,
+ "id": 300,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "max": true,
+ "min": true,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [
+ {
+ "alias": "/.*Max*./",
+ "color": "#EF843C",
+ "fill": 0
+ }
+ ],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "node_cooling_device_cur_state{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "hide": false,
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "Current {{ name }} in {{ type }}",
+ "refId": "A",
+ "step": 240
+ },
+ {
+ "expr": "node_cooling_device_max_state{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "Max {{ name }} in {{ type }}",
+ "refId": "B",
+ "step": 240
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Throttle cooling device",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": "counter",
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 0,
+ "y": 36
+ },
+ "hiddenSeries": false,
+ "id": 302,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "max": true,
+ "min": true,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "node_power_supply_online{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "hide": false,
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "{{ power_supply }} online",
+ "refId": "A",
+ "step": 240
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Power supply",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": "counter",
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ }
+ ],
+ "title": "Hardware Misc",
+ "type": "row"
+ },
+ {
+ "collapsed": true,
+ "datasource": "Prometheus",
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 27
+ },
+ "id": 296,
+ "panels": [
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 0,
+ "y": 10
+ },
+ "hiddenSeries": false,
+ "id": 297,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "max": true,
+ "min": true,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "irate(node_systemd_socket_accepted_connections_total{instance=\"$node\",job=\"$job\"}[5m])",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "{{ name }} Connections",
+ "refId": "A",
+ "step": 240
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Systemd Sockets",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": "counter",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 12,
+ "y": 10
+ },
+ "hiddenSeries": false,
+ "id": 298,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "max": true,
+ "min": true,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [
+ {
+ "alias": "Failed",
+ "color": "#F2495C"
+ },
+ {
+ "alias": "Inactive",
+ "color": "#FF9830"
+ },
+ {
+ "alias": "Active",
+ "color": "#73BF69"
+ },
+ {
+ "alias": "Deactivating",
+ "color": "#FFCB7D"
+ },
+ {
+ "alias": "Activating",
+ "color": "#C8F2C2"
+ }
+ ],
+ "spaceLength": 10,
+ "stack": true,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "node_systemd_units{instance=\"$node\",job=\"$job\",state=\"activating\"}",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "Activating",
+ "refId": "A",
+ "step": 240
+ },
+ {
+ "expr": "node_systemd_units{instance=\"$node\",job=\"$job\",state=\"active\"}",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "Active",
+ "refId": "B",
+ "step": 240
+ },
+ {
+ "expr": "node_systemd_units{instance=\"$node\",job=\"$job\",state=\"deactivating\"}",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "Deactivating",
+ "refId": "C",
+ "step": 240
+ },
+ {
+ "expr": "node_systemd_units{instance=\"$node\",job=\"$job\",state=\"failed\"}",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "Failed",
+ "refId": "D",
+ "step": 240
+ },
+ {
+ "expr": "node_systemd_units{instance=\"$node\",job=\"$job\",state=\"inactive\"}",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "Inactive",
+ "refId": "E",
+ "step": 240
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Systemd Units State",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": "counter",
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ }
+ ],
+ "title": "Systemd",
+ "type": "row"
+ },
+ {
+ "collapsed": true,
+ "datasource": "Prometheus",
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 28
+ },
+ "id": 270,
+ "panels": [
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "description": "",
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 0,
+ "y": 29
+ },
+ "hiddenSeries": false,
+ "id": 9,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "hideZero": true,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "maxPerRow": 6,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "repeat": null,
+ "seriesOverrides": [
+ {
+ "alias": "/.*Read.*/",
+ "transform": "negative-Y"
+ },
+ {
+ "alias": "/.*sda_.*/",
+ "color": "#7EB26D"
+ },
+ {
+ "alias": "/.*sdb_.*/",
+ "color": "#EAB839"
+ },
+ {
+ "alias": "/.*sdc_.*/",
+ "color": "#6ED0E0"
+ },
+ {
+ "alias": "/.*sdd_.*/",
+ "color": "#EF843C"
+ },
+ {
+ "alias": "/.*sde_.*/",
+ "color": "#E24D42"
+ },
+ {
+ "alias": "/.*sda1.*/",
+ "color": "#584477"
+ },
+ {
+ "alias": "/.*sda2_.*/",
+ "color": "#BA43A9"
+ },
+ {
+ "alias": "/.*sda3_.*/",
+ "color": "#F4D598"
+ },
+ {
+ "alias": "/.*sdb1.*/",
+ "color": "#0A50A1"
+ },
+ {
+ "alias": "/.*sdb2.*/",
+ "color": "#BF1B00"
+ },
+ {
+ "alias": "/.*sdb3.*/",
+ "color": "#E0752D"
+ },
+ {
+ "alias": "/.*sdc1.*/",
+ "color": "#962D82"
+ },
+ {
+ "alias": "/.*sdc2.*/",
+ "color": "#614D93"
+ },
+ {
+ "alias": "/.*sdc3.*/",
+ "color": "#9AC48A"
+ },
+ {
+ "alias": "/.*sdd1.*/",
+ "color": "#65C5DB"
+ },
+ {
+ "alias": "/.*sdd2.*/",
+ "color": "#F9934E"
+ },
+ {
+ "alias": "/.*sdd3.*/",
+ "color": "#EA6460"
+ },
+ {
+ "alias": "/.*sde1.*/",
+ "color": "#E0F9D7"
+ },
+ {
+ "alias": "/.*sdd2.*/",
+ "color": "#FCEACA"
+ },
+ {
+ "alias": "/.*sde3.*/",
+ "color": "#F9E2D2"
+ }
+ ],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "irate(node_disk_reads_completed_total{instance=\"$node\",job=\"$job\"}[5m])",
+ "intervalFactor": 4,
+ "legendFormat": "{{device}} - Reads completed",
+ "refId": "A",
+ "step": 8
+ },
+ {
+ "expr": "irate(node_disk_writes_completed_total{instance=\"$node\",job=\"$job\"}[5m])",
+ "intervalFactor": 2,
+ "legendFormat": "{{device}} - Writes completed",
+ "refId": "B",
+ "step": 4
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Disk IOps Completed",
+ "tooltip": {
+ "shared": false,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "iops",
+ "label": "IO read (-) / write (+)",
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "description": "",
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 12,
+ "y": 29
+ },
+ "hiddenSeries": false,
+ "id": 33,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "hideZero": true,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "maxPerRow": 6,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [
+ {
+ "alias": "/.*Read.*/",
+ "transform": "negative-Y"
+ },
+ {
+ "alias": "/.*sda_.*/",
+ "color": "#7EB26D"
+ },
+ {
+ "alias": "/.*sdb_.*/",
+ "color": "#EAB839"
+ },
+ {
+ "alias": "/.*sdc_.*/",
+ "color": "#6ED0E0"
+ },
+ {
+ "alias": "/.*sdd_.*/",
+ "color": "#EF843C"
+ },
+ {
+ "alias": "/.*sde_.*/",
+ "color": "#E24D42"
+ },
+ {
+ "alias": "/.*sda1.*/",
+ "color": "#584477"
+ },
+ {
+ "alias": "/.*sda2_.*/",
+ "color": "#BA43A9"
+ },
+ {
+ "alias": "/.*sda3_.*/",
+ "color": "#F4D598"
+ },
+ {
+ "alias": "/.*sdb1.*/",
+ "color": "#0A50A1"
+ },
+ {
+ "alias": "/.*sdb2.*/",
+ "color": "#BF1B00"
+ },
+ {
+ "alias": "/.*sdb3.*/",
+ "color": "#E0752D"
+ },
+ {
+ "alias": "/.*sdc1.*/",
+ "color": "#962D82"
+ },
+ {
+ "alias": "/.*sdc2.*/",
+ "color": "#614D93"
+ },
+ {
+ "alias": "/.*sdc3.*/",
+ "color": "#9AC48A"
+ },
+ {
+ "alias": "/.*sdd1.*/",
+ "color": "#65C5DB"
+ },
+ {
+ "alias": "/.*sdd2.*/",
+ "color": "#F9934E"
+ },
+ {
+ "alias": "/.*sdd3.*/",
+ "color": "#EA6460"
+ },
+ {
+ "alias": "/.*sde1.*/",
+ "color": "#E0F9D7"
+ },
+ {
+ "alias": "/.*sdd2.*/",
+ "color": "#FCEACA"
+ },
+ {
+ "alias": "/.*sde3.*/",
+ "color": "#F9E2D2"
+ }
+ ],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "irate(node_disk_read_bytes_total{instance=\"$node\",job=\"$job\"}[5m])",
+ "format": "time_series",
+ "intervalFactor": 4,
+ "legendFormat": "{{device}} - Read bytes",
+ "refId": "A",
+ "step": 8
+ },
+ {
+ "expr": "irate(node_disk_written_bytes_total{instance=\"$node\",job=\"$job\"}[5m])",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{device}} - Written bytes",
+ "refId": "B",
+ "step": 4
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Disk R/W Data",
+ "tooltip": {
+ "shared": false,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "Bps",
+ "label": "bytes read (-) / write (+)",
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "description": "",
+ "fill": 3,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 0,
+ "y": 39
+ },
+ "hiddenSeries": false,
+ "id": 37,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "hideZero": true,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "sort": "current",
+ "sortDesc": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "maxPerRow": 6,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [
+ {
+ "alias": "/.*Read.*/",
+ "transform": "negative-Y"
+ },
+ {
+ "alias": "/.*sda_.*/",
+ "color": "#7EB26D"
+ },
+ {
+ "alias": "/.*sdb_.*/",
+ "color": "#EAB839"
+ },
+ {
+ "alias": "/.*sdc_.*/",
+ "color": "#6ED0E0"
+ },
+ {
+ "alias": "/.*sdd_.*/",
+ "color": "#EF843C"
+ },
+ {
+ "alias": "/.*sde_.*/",
+ "color": "#E24D42"
+ },
+ {
+ "alias": "/.*sda1.*/",
+ "color": "#584477"
+ },
+ {
+ "alias": "/.*sda2_.*/",
+ "color": "#BA43A9"
+ },
+ {
+ "alias": "/.*sda3_.*/",
+ "color": "#F4D598"
+ },
+ {
+ "alias": "/.*sdb1.*/",
+ "color": "#0A50A1"
+ },
+ {
+ "alias": "/.*sdb2.*/",
+ "color": "#BF1B00"
+ },
+ {
+ "alias": "/.*sdb3.*/",
+ "color": "#E0752D"
+ },
+ {
+ "alias": "/.*sdc1.*/",
+ "color": "#962D82"
+ },
+ {
+ "alias": "/.*sdc2.*/",
+ "color": "#614D93"
+ },
+ {
+ "alias": "/.*sdc3.*/",
+ "color": "#9AC48A"
+ },
+ {
+ "alias": "/.*sdd1.*/",
+ "color": "#65C5DB"
+ },
+ {
+ "alias": "/.*sdd2.*/",
+ "color": "#F9934E"
+ },
+ {
+ "alias": "/.*sdd3.*/",
+ "color": "#EA6460"
+ },
+ {
+ "alias": "/.*sde1.*/",
+ "color": "#E0F9D7"
+ },
+ {
+ "alias": "/.*sdd2.*/",
+ "color": "#FCEACA"
+ },
+ {
+ "alias": "/.*sde3.*/",
+ "color": "#F9E2D2"
+ }
+ ],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "irate(node_disk_read_time_seconds_total{instance=\"$node\",job=\"$job\"}[5m])",
+ "hide": false,
+ "intervalFactor": 4,
+ "legendFormat": "{{device}} - Read time",
+ "refId": "A",
+ "step": 8
+ },
+ {
+ "expr": "irate(node_disk_write_time_seconds_total{instance=\"$node\",job=\"$job\"}[5m])",
+ "hide": false,
+ "intervalFactor": 2,
+ "legendFormat": "{{device}} - Write time",
+ "refId": "B",
+ "step": 4
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Disk R/W Time",
+ "tooltip": {
+ "shared": false,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "s",
+ "label": "time. read (-) / write (+)",
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "description": "",
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 12,
+ "y": 39
+ },
+ "hiddenSeries": false,
+ "id": 35,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "hideZero": true,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "sort": "current",
+ "sortDesc": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "maxPerRow": 6,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [
+ {
+ "alias": "/.*sda_.*/",
+ "color": "#7EB26D"
+ },
+ {
+ "alias": "/.*sdb_.*/",
+ "color": "#EAB839"
+ },
+ {
+ "alias": "/.*sdc_.*/",
+ "color": "#6ED0E0"
+ },
+ {
+ "alias": "/.*sdd_.*/",
+ "color": "#EF843C"
+ },
+ {
+ "alias": "/.*sde_.*/",
+ "color": "#E24D42"
+ },
+ {
+ "alias": "/.*sda1.*/",
+ "color": "#584477"
+ },
+ {
+ "alias": "/.*sda2_.*/",
+ "color": "#BA43A9"
+ },
+ {
+ "alias": "/.*sda3_.*/",
+ "color": "#F4D598"
+ },
+ {
+ "alias": "/.*sdb1.*/",
+ "color": "#0A50A1"
+ },
+ {
+ "alias": "/.*sdb2.*/",
+ "color": "#BF1B00"
+ },
+ {
+ "alias": "/.*sdb3.*/",
+ "color": "#E0752D"
+ },
+ {
+ "alias": "/.*sdc1.*/",
+ "color": "#962D82"
+ },
+ {
+ "alias": "/.*sdc2.*/",
+ "color": "#614D93"
+ },
+ {
+ "alias": "/.*sdc3.*/",
+ "color": "#9AC48A"
+ },
+ {
+ "alias": "/.*sdd1.*/",
+ "color": "#65C5DB"
+ },
+ {
+ "alias": "/.*sdd2.*/",
+ "color": "#F9934E"
+ },
+ {
+ "alias": "/.*sdd3.*/",
+ "color": "#EA6460"
+ },
+ {
+ "alias": "/.*sde1.*/",
+ "color": "#E0F9D7"
+ },
+ {
+ "alias": "/.*sdd2.*/",
+ "color": "#FCEACA"
+ },
+ {
+ "alias": "/.*sde3.*/",
+ "color": "#F9E2D2"
+ }
+ ],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "irate(node_disk_io_time_weighted_seconds_total{instance=\"$node\",job=\"$job\"}[5m])",
+ "intervalFactor": 4,
+ "legendFormat": "{{device}} - IO time weighted",
+ "refId": "A",
+ "step": 8
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Disk IOs Weighted",
+ "tooltip": {
+ "shared": false,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "s",
+ "label": "time",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "description": "",
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 0,
+ "y": 49
+ },
+ "hiddenSeries": false,
+ "id": 133,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "hideZero": true,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "sort": "current",
+ "sortDesc": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "maxPerRow": 6,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [
+ {
+ "alias": "/.*Read.*/",
+ "transform": "negative-Y"
+ },
+ {
+ "alias": "/.*sda_.*/",
+ "color": "#7EB26D"
+ },
+ {
+ "alias": "/.*sdb_.*/",
+ "color": "#EAB839"
+ },
+ {
+ "alias": "/.*sdc_.*/",
+ "color": "#6ED0E0"
+ },
+ {
+ "alias": "/.*sdd_.*/",
+ "color": "#EF843C"
+ },
+ {
+ "alias": "/.*sde_.*/",
+ "color": "#E24D42"
+ },
+ {
+ "alias": "/.*sda1.*/",
+ "color": "#584477"
+ },
+ {
+ "alias": "/.*sda2_.*/",
+ "color": "#BA43A9"
+ },
+ {
+ "alias": "/.*sda3_.*/",
+ "color": "#F4D598"
+ },
+ {
+ "alias": "/.*sdb1.*/",
+ "color": "#0A50A1"
+ },
+ {
+ "alias": "/.*sdb2.*/",
+ "color": "#BF1B00"
+ },
+ {
+ "alias": "/.*sdb3.*/",
+ "color": "#E0752D"
+ },
+ {
+ "alias": "/.*sdc1.*/",
+ "color": "#962D82"
+ },
+ {
+ "alias": "/.*sdc2.*/",
+ "color": "#614D93"
+ },
+ {
+ "alias": "/.*sdc3.*/",
+ "color": "#9AC48A"
+ },
+ {
+ "alias": "/.*sdd1.*/",
+ "color": "#65C5DB"
+ },
+ {
+ "alias": "/.*sdd2.*/",
+ "color": "#F9934E"
+ },
+ {
+ "alias": "/.*sdd3.*/",
+ "color": "#EA6460"
+ },
+ {
+ "alias": "/.*sde1.*/",
+ "color": "#E0F9D7"
+ },
+ {
+ "alias": "/.*sdd2.*/",
+ "color": "#FCEACA"
+ },
+ {
+ "alias": "/.*sde3.*/",
+ "color": "#F9E2D2"
+ }
+ ],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "irate(node_disk_reads_merged_total{instance=\"$node\",job=\"$job\"}[5m])",
+ "intervalFactor": 2,
+ "legendFormat": "{{device}} - Read merged",
+ "refId": "A",
+ "step": 4
+ },
+ {
+ "expr": "irate(node_disk_writes_merged_total{instance=\"$node\",job=\"$job\"}[5m])",
+ "intervalFactor": 2,
+ "legendFormat": "{{device}} - Write merged",
+ "refId": "B",
+ "step": 4
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Disk R/W Merged",
+ "tooltip": {
+ "shared": false,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "iops",
+ "label": "I/Os",
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "description": "",
+ "fill": 3,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 12,
+ "y": 49
+ },
+ "hiddenSeries": false,
+ "id": 36,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "hideZero": true,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "sort": "current",
+ "sortDesc": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "maxPerRow": 6,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [
+ {
+ "alias": "/.*sda_.*/",
+ "color": "#7EB26D"
+ },
+ {
+ "alias": "/.*sdb_.*/",
+ "color": "#EAB839"
+ },
+ {
+ "alias": "/.*sdc_.*/",
+ "color": "#6ED0E0"
+ },
+ {
+ "alias": "/.*sdd_.*/",
+ "color": "#EF843C"
+ },
+ {
+ "alias": "/.*sde_.*/",
+ "color": "#E24D42"
+ },
+ {
+ "alias": "/.*sda1.*/",
+ "color": "#584477"
+ },
+ {
+ "alias": "/.*sda2_.*/",
+ "color": "#BA43A9"
+ },
+ {
+ "alias": "/.*sda3_.*/",
+ "color": "#F4D598"
+ },
+ {
+ "alias": "/.*sdb1.*/",
+ "color": "#0A50A1"
+ },
+ {
+ "alias": "/.*sdb2.*/",
+ "color": "#BF1B00"
+ },
+ {
+ "alias": "/.*sdb3.*/",
+ "color": "#E0752D"
+ },
+ {
+ "alias": "/.*sdc1.*/",
+ "color": "#962D82"
+ },
+ {
+ "alias": "/.*sdc2.*/",
+ "color": "#614D93"
+ },
+ {
+ "alias": "/.*sdc3.*/",
+ "color": "#9AC48A"
+ },
+ {
+ "alias": "/.*sdd1.*/",
+ "color": "#65C5DB"
+ },
+ {
+ "alias": "/.*sdd2.*/",
+ "color": "#F9934E"
+ },
+ {
+ "alias": "/.*sdd3.*/",
+ "color": "#EA6460"
+ },
+ {
+ "alias": "/.*sde1.*/",
+ "color": "#E0F9D7"
+ },
+ {
+ "alias": "/.*sdd2.*/",
+ "color": "#FCEACA"
+ },
+ {
+ "alias": "/.*sde3.*/",
+ "color": "#F9E2D2"
+ }
+ ],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "irate(node_disk_io_time_seconds_total{instance=\"$node\",job=\"$job\"}[5m])",
+ "intervalFactor": 4,
+ "legendFormat": "{{device}} - IO time",
+ "refId": "A",
+ "step": 8
+ },
+ {
+ "expr": "irate(node_disk_discard_time_seconds_total{instance=\"$node\",job=\"$job\"}[5m])",
+ "interval": "",
+ "intervalFactor": 4,
+ "legendFormat": "{{device}} - discard time",
+ "refId": "B",
+ "step": 8
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Time Spent Doing I/Os",
+ "tooltip": {
+ "shared": false,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "s",
+ "label": "time",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "description": "",
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 0,
+ "y": 59
+ },
+ "hiddenSeries": false,
+ "id": 34,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "hideZero": true,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "sort": "current",
+ "sortDesc": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "maxPerRow": 6,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [
+ {
+ "alias": "/.*sda_.*/",
+ "color": "#7EB26D"
+ },
+ {
+ "alias": "/.*sdb_.*/",
+ "color": "#EAB839"
+ },
+ {
+ "alias": "/.*sdc_.*/",
+ "color": "#6ED0E0"
+ },
+ {
+ "alias": "/.*sdd_.*/",
+ "color": "#EF843C"
+ },
+ {
+ "alias": "/.*sde_.*/",
+ "color": "#E24D42"
+ },
+ {
+ "alias": "/.*sda1.*/",
+ "color": "#584477"
+ },
+ {
+ "alias": "/.*sda2_.*/",
+ "color": "#BA43A9"
+ },
+ {
+ "alias": "/.*sda3_.*/",
+ "color": "#F4D598"
+ },
+ {
+ "alias": "/.*sdb1.*/",
+ "color": "#0A50A1"
+ },
+ {
+ "alias": "/.*sdb2.*/",
+ "color": "#BF1B00"
+ },
+ {
+ "alias": "/.*sdb3.*/",
+ "color": "#E0752D"
+ },
+ {
+ "alias": "/.*sdc1.*/",
+ "color": "#962D82"
+ },
+ {
+ "alias": "/.*sdc2.*/",
+ "color": "#614D93"
+ },
+ {
+ "alias": "/.*sdc3.*/",
+ "color": "#9AC48A"
+ },
+ {
+ "alias": "/.*sdd1.*/",
+ "color": "#65C5DB"
+ },
+ {
+ "alias": "/.*sdd2.*/",
+ "color": "#F9934E"
+ },
+ {
+ "alias": "/.*sdd3.*/",
+ "color": "#EA6460"
+ },
+ {
+ "alias": "/.*sde1.*/",
+ "color": "#E0F9D7"
+ },
+ {
+ "alias": "/.*sdd2.*/",
+ "color": "#FCEACA"
+ },
+ {
+ "alias": "/.*sde3.*/",
+ "color": "#F9E2D2"
+ }
+ ],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "irate(node_disk_io_now{instance=\"$node\",job=\"$job\"}[5m])",
+ "intervalFactor": 4,
+ "legendFormat": "{{device}} - IO now",
+ "refId": "A",
+ "step": 8
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Disk IOs Current in Progress",
+ "tooltip": {
+ "shared": false,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "iops",
+ "label": "I/Os",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "description": "",
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 12,
+ "y": 59
+ },
+ "hiddenSeries": false,
+ "id": 301,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "hideZero": true,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "maxPerRow": 6,
+ "nullPointMode": "null as zero",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [
+ {
+ "alias": "/.*sda_.*/",
+ "color": "#7EB26D"
+ },
+ {
+ "alias": "/.*sdb_.*/",
+ "color": "#EAB839"
+ },
+ {
+ "alias": "/.*sdc_.*/",
+ "color": "#6ED0E0"
+ },
+ {
+ "alias": "/.*sdd_.*/",
+ "color": "#EF843C"
+ },
+ {
+ "alias": "/.*sde_.*/",
+ "color": "#E24D42"
+ },
+ {
+ "alias": "/.*sda1.*/",
+ "color": "#584477"
+ },
+ {
+ "alias": "/.*sda2_.*/",
+ "color": "#BA43A9"
+ },
+ {
+ "alias": "/.*sda3_.*/",
+ "color": "#F4D598"
+ },
+ {
+ "alias": "/.*sdb1.*/",
+ "color": "#0A50A1"
+ },
+ {
+ "alias": "/.*sdb2.*/",
+ "color": "#BF1B00"
+ },
+ {
+ "alias": "/.*sdb3.*/",
+ "color": "#E0752D"
+ },
+ {
+ "alias": "/.*sdc1.*/",
+ "color": "#962D82"
+ },
+ {
+ "alias": "/.*sdc2.*/",
+ "color": "#614D93"
+ },
+ {
+ "alias": "/.*sdc3.*/",
+ "color": "#9AC48A"
+ },
+ {
+ "alias": "/.*sdd1.*/",
+ "color": "#65C5DB"
+ },
+ {
+ "alias": "/.*sdd2.*/",
+ "color": "#F9934E"
+ },
+ {
+ "alias": "/.*sdd3.*/",
+ "color": "#EA6460"
+ },
+ {
+ "alias": "/.*sde1.*/",
+ "color": "#E0F9D7"
+ },
+ {
+ "alias": "/.*sdd2.*/",
+ "color": "#FCEACA"
+ },
+ {
+ "alias": "/.*sde3.*/",
+ "color": "#F9E2D2"
+ }
+ ],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "irate(node_disk_discards_completed_total{instance=\"$node\",job=\"$job\"}[5m])",
+ "interval": "",
+ "intervalFactor": 4,
+ "legendFormat": "{{device}} - Discards completed",
+ "refId": "A",
+ "step": 8
+ },
+ {
+ "expr": "irate(node_disk_discards_merged_total{instance=\"$node\",job=\"$job\"}[5m])",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "{{device}} - Discards merged",
+ "refId": "B",
+ "step": 4
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Disk IOps Discards completed / merged",
+ "tooltip": {
+ "shared": false,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "iops",
+ "label": "IOs",
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ }
+ ],
+ "repeat": null,
+ "title": "Storage Disk",
+ "type": "row"
+ },
+ {
+ "collapsed": true,
+ "datasource": "Prometheus",
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 29
+ },
+ "id": 271,
+ "panels": [
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "decimals": 3,
+ "description": "",
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 0,
+ "y": 78
+ },
+ "hiddenSeries": false,
+ "id": 43,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "maxPerRow": 6,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "node_filesystem_avail_bytes{instance=\"$node\",job=\"$job\",device!~'rootfs'}",
+ "format": "time_series",
+ "hide": false,
+ "intervalFactor": 2,
+ "legendFormat": "{{mountpoint}} - Available",
+ "metric": "",
+ "refId": "A",
+ "step": 4
+ },
+ {
+ "expr": "node_filesystem_free_bytes{instance=\"$node\",job=\"$job\",device!~'rootfs'}",
+ "format": "time_series",
+ "hide": true,
+ "intervalFactor": 2,
+ "legendFormat": "{{mountpoint}} - Free",
+ "refId": "B",
+ "step": 2
+ },
+ {
+ "expr": "node_filesystem_size_bytes{instance=\"$node\",job=\"$job\",device!~'rootfs'}",
+ "format": "time_series",
+ "hide": true,
+ "intervalFactor": 2,
+ "legendFormat": "{{mountpoint}} - Size",
+ "refId": "C",
+ "step": 2
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Filesystem space available",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "bytes",
+ "label": "bytes",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "description": "",
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 12,
+ "y": 78
+ },
+ "hiddenSeries": false,
+ "id": 41,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "hideZero": true,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "node_filesystem_files_free{instance=\"$node\",job=\"$job\",device!~'rootfs'}",
+ "format": "time_series",
+ "hide": false,
+ "intervalFactor": 2,
+ "legendFormat": "{{mountpoint}} - Free file nodes",
+ "refId": "A",
+ "step": 4
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "File Nodes Free",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": "file nodes",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "description": "",
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 0,
+ "y": 88
+ },
+ "hiddenSeries": false,
+ "id": 28,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "max": true,
+ "min": true,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "maxPerRow": 6,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "node_filefd_maximum{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "intervalFactor": 4,
+ "legendFormat": "Max open files",
+ "refId": "A",
+ "step": 8
+ },
+ {
+ "expr": "node_filefd_allocated{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "Open files",
+ "refId": "B",
+ "step": 4
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "File Descriptor",
+ "tooltip": {
+ "shared": false,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": "files",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "description": "",
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 12,
+ "y": 88
+ },
+ "hiddenSeries": false,
+ "id": 219,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "hideZero": true,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "node_filesystem_files{instance=\"$node\",job=\"$job\",device!~'rootfs'}",
+ "format": "time_series",
+ "hide": false,
+ "intervalFactor": 2,
+ "legendFormat": "{{mountpoint}} - File nodes total",
+ "refId": "A",
+ "step": 4
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "File Nodes Size",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": "file Nodes",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {
+ "/ ReadOnly": "#890F02"
+ },
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "decimals": null,
+ "description": "",
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 0,
+ "y": 98
+ },
+ "hiddenSeries": false,
+ "id": 44,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "hideEmpty": true,
+ "hideZero": true,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "maxPerRow": 6,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": true,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "node_filesystem_readonly{instance=\"$node\",job=\"$job\",device!~'rootfs'}",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{mountpoint}} - ReadOnly",
+ "refId": "A",
+ "step": 4
+ },
+ {
+ "expr": "node_filesystem_device_error{instance=\"$node\",job=\"$job\",device!~'rootfs',fstype!~'tmpfs'}",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "{{mountpoint}} - Device error",
+ "refId": "B",
+ "step": 4
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Filesystem in ReadOnly / Error",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": "counter",
+ "logBase": 1,
+ "max": "1",
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ }
+ ],
+ "repeat": null,
+ "title": "Storage Filesystem",
+ "type": "row"
+ },
+ {
+ "collapsed": true,
+ "datasource": "Prometheus",
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 30
+ },
+ "id": 272,
+ "panels": [
+ {
+ "aliasColors": {
+ "receive_packets_eth0": "#7EB26D",
+ "receive_packets_lo": "#E24D42",
+ "transmit_packets_eth0": "#7EB26D",
+ "transmit_packets_lo": "#E24D42"
+ },
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 0,
+ "y": 30
+ },
+ "hiddenSeries": false,
+ "id": 60,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "sideWidth": 300,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [
+ {
+ "alias": "/.*Trans.*/",
+ "transform": "negative-Y"
+ }
+ ],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "irate(node_network_receive_packets_total{instance=\"$node\",job=\"$job\"}[5m])",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "{{device}} - Receive",
+ "refId": "A",
+ "step": 4
+ },
+ {
+ "expr": "irate(node_network_transmit_packets_total{instance=\"$node\",job=\"$job\"}[5m])",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "{{device}} - Transmit",
+ "refId": "B",
+ "step": 4
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Network Traffic by Packets",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "pps",
+ "label": "packets out (-) / in (+)",
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 12,
+ "y": 30
+ },
+ "hiddenSeries": false,
+ "id": 142,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "hideEmpty": false,
+ "hideZero": false,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "sideWidth": 300,
+ "sort": "current",
+ "sortDesc": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [
+ {
+ "alias": "/.*Trans.*/",
+ "transform": "negative-Y"
+ }
+ ],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "irate(node_network_receive_errs_total{instance=\"$node\",job=\"$job\"}[5m])",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{device}} - Receive errors",
+ "refId": "A",
+ "step": 4
+ },
+ {
+ "expr": "irate(node_network_transmit_errs_total{instance=\"$node\",job=\"$job\"}[5m])",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{device}} - Rransmit errors",
+ "refId": "B",
+ "step": 4
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Network Traffic Errors",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "pps",
+ "label": "packets out (-) / in (+)",
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 0,
+ "y": 40
+ },
+ "hiddenSeries": false,
+ "id": 143,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "hideEmpty": false,
+ "hideZero": false,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "sideWidth": 300,
+ "sort": "current",
+ "sortDesc": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [
+ {
+ "alias": "/.*Trans.*/",
+ "transform": "negative-Y"
+ }
+ ],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "irate(node_network_receive_drop_total{instance=\"$node\",job=\"$job\"}[5m])",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{device}} - Receive drop",
+ "refId": "A",
+ "step": 4
+ },
+ {
+ "expr": "irate(node_network_transmit_drop_total{instance=\"$node\",job=\"$job\"}[5m])",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{device}} - Transmit drop",
+ "refId": "B",
+ "step": 4
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Network Traffic Drop",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "pps",
+ "label": "packets out (-) / in (+)",
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 12,
+ "y": 40
+ },
+ "hiddenSeries": false,
+ "id": 141,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "hideEmpty": false,
+ "hideZero": false,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "sideWidth": 300,
+ "sort": "current",
+ "sortDesc": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [
+ {
+ "alias": "/.*Trans.*/",
+ "transform": "negative-Y"
+ }
+ ],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "irate(node_network_receive_compressed_total{instance=\"$node\",job=\"$job\"}[5m])",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{device}} - Receive compressed",
+ "refId": "A",
+ "step": 4
+ },
+ {
+ "expr": "irate(node_network_transmit_compressed_total{instance=\"$node\",job=\"$job\"}[5m])",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{device}} - Transmit compressed",
+ "refId": "B",
+ "step": 4
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Network Traffic Compressed",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "pps",
+ "label": "packets out (-) / in (+)",
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 0,
+ "y": 50
+ },
+ "hiddenSeries": false,
+ "id": 146,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "hideEmpty": false,
+ "hideZero": false,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "sideWidth": 300,
+ "sort": "current",
+ "sortDesc": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [
+ {
+ "alias": "/.*Trans.*/",
+ "transform": "negative-Y"
+ }
+ ],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "irate(node_network_receive_multicast_total{instance=\"$node\",job=\"$job\"}[5m])",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{device}} - Receive multicast",
+ "refId": "A",
+ "step": 4
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Network Traffic Multicast",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "pps",
+ "label": "packets out (-) / in (+)",
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 12,
+ "y": 50
+ },
+ "hiddenSeries": false,
+ "id": 144,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "hideEmpty": false,
+ "hideZero": false,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "sideWidth": 300,
+ "sort": "current",
+ "sortDesc": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [
+ {
+ "alias": "/.*Trans.*/",
+ "transform": "negative-Y"
+ }
+ ],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "irate(node_network_receive_fifo_total{instance=\"$node\",job=\"$job\"}[5m])",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{device}} - Receive fifo",
+ "refId": "A",
+ "step": 4
+ },
+ {
+ "expr": "irate(node_network_transmit_fifo_total{instance=\"$node\",job=\"$job\"}[5m])",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{device}} - Transmit fifo",
+ "refId": "B",
+ "step": 4
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Network Traffic Fifo",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "pps",
+ "label": "packets out (-) / in (+)",
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 0,
+ "y": 60
+ },
+ "hiddenSeries": false,
+ "id": 145,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "hideEmpty": false,
+ "hideZero": false,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "sideWidth": 300,
+ "sort": "current",
+ "sortDesc": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [
+ {
+ "alias": "/.*Trans.*/",
+ "transform": "negative-Y"
+ }
+ ],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "irate(node_network_receive_frame_total{instance=\"$node\",job=\"$job\"}[5m])",
+ "format": "time_series",
+ "hide": false,
+ "intervalFactor": 2,
+ "legendFormat": "{{device}} - Receive frame",
+ "refId": "A",
+ "step": 4
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Network Traffic Frame",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "pps",
+ "label": "packets out (-) / in (+)",
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 12,
+ "y": 60
+ },
+ "hiddenSeries": false,
+ "id": 231,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "hideEmpty": false,
+ "hideZero": false,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "sideWidth": 300,
+ "sort": "current",
+ "sortDesc": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "irate(node_network_transmit_carrier_total{instance=\"$node\",job=\"$job\"}[5m])",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{device}} - Statistic transmit_carrier",
+ "refId": "A",
+ "step": 4
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Network Traffic Carrier",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": "counter",
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 0,
+ "y": 70
+ },
+ "hiddenSeries": false,
+ "id": 232,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "hideEmpty": false,
+ "hideZero": false,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "sideWidth": 300,
+ "sort": "current",
+ "sortDesc": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [
+ {
+ "alias": "/.*Trans.*/",
+ "transform": "negative-Y"
+ }
+ ],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "irate(node_network_transmit_colls_total{instance=\"$node\",job=\"$job\"}[5m])",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{device}} - Transmit colls",
+ "refId": "A",
+ "step": 4
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Network Traffic Colls",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": "counter",
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 12,
+ "y": 70
+ },
+ "hiddenSeries": false,
+ "id": 61,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [
+ {
+ "alias": "NF conntrack limit",
+ "color": "#890F02",
+ "fill": 0
+ }
+ ],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "node_nf_conntrack_entries{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "NF conntrack entries",
+ "refId": "A",
+ "step": 4
+ },
+ {
+ "expr": "node_nf_conntrack_entries_limit{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "NF conntrack limit",
+ "refId": "B",
+ "step": 4
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "NF Contrack",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": "entries",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 0,
+ "y": 80
+ },
+ "hiddenSeries": false,
+ "id": 230,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "node_arp_entries{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{ device }} - ARP entries",
+ "refId": "A",
+ "step": 4
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "ARP Entries",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": "Entries",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 12,
+ "y": 80
+ },
+ "hiddenSeries": false,
+ "id": 288,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 1,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "node_network_mtu_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{ device }} - Bytes",
+ "refId": "A",
+ "step": 4
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "MTU",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "decimals": 0,
+ "format": "bytes",
+ "label": "bytes",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 0,
+ "y": 90
+ },
+ "hiddenSeries": false,
+ "id": 280,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 1,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "node_network_speed_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{ device }} - Speed",
+ "refId": "A",
+ "step": 4
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Speed",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "decimals": 0,
+ "format": "bytes",
+ "label": "bytes",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 12,
+ "y": 90
+ },
+ "hiddenSeries": false,
+ "id": 289,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 1,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "node_network_transmit_queue_length{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{ device }} - Interface transmit queue length",
+ "refId": "A",
+ "step": 4
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Queue Length",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "decimals": 0,
+ "format": "none",
+ "label": "packets",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 0,
+ "y": 100
+ },
+ "hiddenSeries": false,
+ "id": 290,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "hideEmpty": false,
+ "hideZero": false,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "sideWidth": 300,
+ "sort": "current",
+ "sortDesc": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [
+ {
+ "alias": "/.*Dropped.*/",
+ "transform": "negative-Y"
+ }
+ ],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "irate(node_softnet_processed_total{instance=\"$node\",job=\"$job\"}[5m])",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "CPU {{cpu}} - Processed",
+ "refId": "A",
+ "step": 4
+ },
+ {
+ "expr": "irate(node_softnet_dropped_total{instance=\"$node\",job=\"$job\"}[5m])",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "CPU {{cpu}} - Dropped",
+ "refId": "B",
+ "step": 4
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Softnet Packets",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": "packetes drop (-) / process (+)",
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 12,
+ "y": 100
+ },
+ "hiddenSeries": false,
+ "id": 310,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "hideEmpty": false,
+ "hideZero": false,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "sideWidth": 300,
+ "sort": "current",
+ "sortDesc": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "irate(node_softnet_times_squeezed_total{instance=\"$node\",job=\"$job\"}[5m])",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "CPU {{cpu}} - Squeezed",
+ "refId": "A",
+ "step": 4
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Softnet Out of Quota",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": "counter",
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 0,
+ "y": 110
+ },
+ "hiddenSeries": false,
+ "id": 309,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "hideEmpty": false,
+ "hideZero": false,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "sideWidth": 300,
+ "sort": "current",
+ "sortDesc": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "node_network_up{operstate=\"up\",instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "{{interface}} - Operational state UP",
+ "refId": "A",
+ "step": 4
+ },
+ {
+ "expr": "node_network_carrier{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "instant": false,
+ "legendFormat": "{{device}} - Physical link state",
+ "refId": "B"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Network Operational Status",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": "counter",
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ }
+ ],
+ "repeat": null,
+ "title": "Network Traffic",
+ "type": "row"
+ },
+ {
+ "collapsed": true,
+ "datasource": "Prometheus",
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 31
+ },
+ "id": 273,
+ "panels": [
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 0,
+ "y": 13
+ },
+ "hiddenSeries": false,
+ "id": 63,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "hideEmpty": false,
+ "hideZero": false,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "sideWidth": 300,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "node_sockstat_TCP_alloc{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "TCP_alloc - Allocated sockets",
+ "refId": "A",
+ "step": 240
+ },
+ {
+ "expr": "node_sockstat_TCP_inuse{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "TCP_inuse - Tcp sockets currently in use",
+ "refId": "B",
+ "step": 240
+ },
+ {
+ "expr": "node_sockstat_TCP_mem{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "hide": true,
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "TCP_mem - Used memory for tcp",
+ "refId": "C",
+ "step": 240
+ },
+ {
+ "expr": "node_sockstat_TCP_orphan{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "TCP_orphan - Orphan sockets",
+ "refId": "D",
+ "step": 240
+ },
+ {
+ "expr": "node_sockstat_TCP_tw{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "TCP_tw - Sockets wating close",
+ "refId": "E",
+ "step": 240
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Sockstat TCP",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": "counter",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 12,
+ "y": 13
+ },
+ "hiddenSeries": false,
+ "id": 124,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "hideEmpty": false,
+ "hideZero": false,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "sideWidth": 300,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "node_sockstat_UDPLITE_inuse{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "UDPLITE_inuse - Udplite sockets currently in use",
+ "refId": "A",
+ "step": 240
+ },
+ {
+ "expr": "node_sockstat_UDP_inuse{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "UDP_inuse - Udp sockets currently in use",
+ "refId": "B",
+ "step": 240
+ },
+ {
+ "expr": "node_sockstat_UDP_mem{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "UDP_mem - Used memory for udp",
+ "refId": "C",
+ "step": 240
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Sockstat UDP",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": "counter",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 0,
+ "y": 23
+ },
+ "hiddenSeries": false,
+ "id": 126,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "hideEmpty": false,
+ "hideZero": false,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "sideWidth": 300,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "node_sockstat_sockets_used{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "Sockets_used - Sockets currently in use",
+ "refId": "A",
+ "step": 240
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Sockstat Used",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": "sockets",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 12,
+ "y": 23
+ },
+ "hiddenSeries": false,
+ "id": 220,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "hideEmpty": false,
+ "hideZero": false,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "sideWidth": 300,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "node_sockstat_TCP_mem_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "mem_bytes - TCP sockets in that state",
+ "refId": "A",
+ "step": 240
+ },
+ {
+ "expr": "node_sockstat_UDP_mem_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "mem_bytes - UDP sockets in that state",
+ "refId": "B",
+ "step": 240
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Sockstat Memory Size",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "bytes",
+ "label": "bytes",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 0,
+ "y": 33
+ },
+ "hiddenSeries": false,
+ "id": 125,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "hideEmpty": false,
+ "hideZero": false,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "sideWidth": 300,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "node_sockstat_FRAG_inuse{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "FRAG_inuse - Frag sockets currently in use",
+ "refId": "A",
+ "step": 240
+ },
+ {
+ "expr": "node_sockstat_FRAG_memory{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "FRAG_memory - Used memory for frag",
+ "refId": "B",
+ "step": 240
+ },
+ {
+ "expr": "node_sockstat_RAW_inuse{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "RAW_inuse - Raw sockets currently in use",
+ "refId": "C",
+ "step": 240
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Sockstat FRAG / RAW",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": "counter",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ }
+ ],
+ "repeat": null,
+ "title": "Network Sockstat",
+ "type": "row"
+ },
+ {
+ "collapsed": true,
+ "datasource": "Prometheus",
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 32
+ },
+ "id": 274,
+ "panels": [
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 0,
+ "y": 32
+ },
+ "height": "",
+ "hiddenSeries": false,
+ "id": 221,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "hideEmpty": false,
+ "hideZero": false,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "sideWidth": 300,
+ "sort": "current",
+ "sortDesc": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "maxPerRow": 12,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [
+ {
+ "alias": "/.*Out.*/",
+ "transform": "negative-Y"
+ }
+ ],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "irate(node_netstat_IpExt_InOctets{instance=\"$node\",job=\"$job\"}[5m])",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "InOctets - Received octets",
+ "refId": "A",
+ "step": 4
+ },
+ {
+ "expr": "irate(node_netstat_IpExt_OutOctets{instance=\"$node\",job=\"$job\"}[5m])",
+ "format": "time_series",
+ "intervalFactor": 2,
+ "legendFormat": "OutOctets - Sent octets",
+ "refId": "B",
+ "step": 4
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Netstat IP In / Out Octets",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": "octects out (-) / in (+)",
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 12,
+ "y": 32
+ },
+ "height": "",
+ "hiddenSeries": false,
+ "id": 81,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "hideEmpty": false,
+ "hideZero": false,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "sideWidth": 300,
+ "sort": "current",
+ "sortDesc": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "irate(node_netstat_Ip_Forwarding{instance=\"$node\",job=\"$job\"}[5m])",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "Forwarding - IP forwarding",
+ "refId": "A",
+ "step": 4
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Netstat IP Forwarding",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": "datagrams",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "decimals": null,
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 0,
+ "y": 42
+ },
+ "height": "",
+ "hiddenSeries": false,
+ "id": 115,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "hideZero": false,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "sort": "current",
+ "sortDesc": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "maxPerRow": 12,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [
+ {
+ "alias": "/.*Out.*/",
+ "transform": "negative-Y"
+ }
+ ],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "irate(node_netstat_Icmp_InMsgs{instance=\"$node\",job=\"$job\"}[5m])",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "InMsgs - Messages which the entity received. Note that this counter includes all those counted by icmpInErrors",
+ "refId": "A",
+ "step": 4
+ },
+ {
+ "expr": "irate(node_netstat_Icmp_OutMsgs{instance=\"$node\",job=\"$job\"}[5m])",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "OutMsgs - Messages which this entity attempted to send. Note that this counter includes all those counted by icmpOutErrors",
+ "refId": "B",
+ "step": 4
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "ICMP In / Out",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": "messages out (-) / in (+)",
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "decimals": null,
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 12,
+ "y": 42
+ },
+ "height": "",
+ "hiddenSeries": false,
+ "id": 50,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "hideZero": false,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "sort": "current",
+ "sortDesc": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "maxPerRow": 12,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [
+ {
+ "alias": "/.*Out.*/",
+ "transform": "negative-Y"
+ }
+ ],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "irate(node_netstat_Icmp_InErrors{instance=\"$node\",job=\"$job\"}[5m])",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "InErrors - Messages which the entity received but determined as having ICMP-specific errors (bad ICMP checksums, bad length, etc.)",
+ "refId": "A",
+ "step": 4
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "ICMP Errors",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": "messages out (-) / in (+)",
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "decimals": null,
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 0,
+ "y": 52
+ },
+ "height": "",
+ "hiddenSeries": false,
+ "id": 55,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "hideZero": false,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "sort": "current",
+ "sortDesc": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "maxPerRow": 12,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [
+ {
+ "alias": "/.*Out.*/",
+ "transform": "negative-Y"
+ },
+ {
+ "alias": "/.*Snd.*/",
+ "transform": "negative-Y"
+ }
+ ],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "irate(node_netstat_Udp_InDatagrams{instance=\"$node\",job=\"$job\"}[5m])",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "InDatagrams - Datagrams received",
+ "refId": "A",
+ "step": 4
+ },
+ {
+ "expr": "irate(node_netstat_Udp_OutDatagrams{instance=\"$node\",job=\"$job\"}[5m])",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "OutDatagrams - Datagrams sent",
+ "refId": "B",
+ "step": 4
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "UDP In / Out",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": "datagrams out (-) / in (+)",
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 12,
+ "y": 52
+ },
+ "height": "",
+ "hiddenSeries": false,
+ "id": 109,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "hideZero": false,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "sort": "current",
+ "sortDesc": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "maxPerRow": 12,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "irate(node_netstat_Udp_InErrors{instance=\"$node\",job=\"$job\"}[5m])",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "InErrors - UDP Datagrams that could not be delivered to an application",
+ "refId": "A",
+ "step": 4
+ },
+ {
+ "expr": "irate(node_netstat_Udp_NoPorts{instance=\"$node\",job=\"$job\"}[5m])",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "NoPorts - UDP Datagrams received on a port with no listener",
+ "refId": "B",
+ "step": 4
+ },
+ {
+ "expr": "irate(node_netstat_UdpLite_InErrors{instance=\"$node\",job=\"$job\"}[5m])",
+ "interval": "",
+ "legendFormat": "InErrors Lite - UDPLite Datagrams that could not be delivered to an application",
+ "refId": "C"
+ },
+ {
+ "expr": "irate(node_netstat_Udp_RcvbufErrors{instance=\"$node\",job=\"$job\"}[5m])",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "RcvbufErrors - UDP buffer errors received",
+ "refId": "D",
+ "step": 4
+ },
+ {
+ "expr": "irate(node_netstat_Udp_SndbufErrors{instance=\"$node\",job=\"$job\"}[5m])",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "SndbufErrors - UDP buffer errors send",
+ "refId": "E",
+ "step": 4
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "UDP Errors",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": "datagrams",
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "decimals": null,
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 0,
+ "y": 62
+ },
+ "height": "",
+ "hiddenSeries": false,
+ "id": 299,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "hideZero": false,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "sort": "current",
+ "sortDesc": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "maxPerRow": 12,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [
+ {
+ "alias": "/.*Out.*/",
+ "transform": "negative-Y"
+ },
+ {
+ "alias": "/.*Snd.*/",
+ "transform": "negative-Y"
+ }
+ ],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "irate(node_netstat_Tcp_InSegs{instance=\"$node\",job=\"$job\"}[5m])",
+ "format": "time_series",
+ "instant": false,
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "InSegs - Segments received, including those received in error. This count includes segments received on currently established connections",
+ "refId": "A",
+ "step": 4
+ },
+ {
+ "expr": "irate(node_netstat_Tcp_OutSegs{instance=\"$node\",job=\"$job\"}[5m])",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "OutSegs - Segments sent, including those on current connections but excluding those containing only retransmitted octets",
+ "refId": "B",
+ "step": 4
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "TCP In / Out",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": "datagrams out (-) / in (+)",
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "description": "",
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 12,
+ "y": 62
+ },
+ "height": "",
+ "hiddenSeries": false,
+ "id": 104,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "hideEmpty": false,
+ "hideZero": false,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "sort": "current",
+ "sortDesc": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "maxPerRow": 12,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "irate(node_netstat_TcpExt_ListenOverflows{instance=\"$node\",job=\"$job\"}[5m])",
+ "format": "time_series",
+ "hide": false,
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "ListenOverflows - Times the listen queue of a socket overflowed",
+ "refId": "A",
+ "step": 4
+ },
+ {
+ "expr": "irate(node_netstat_TcpExt_ListenDrops{instance=\"$node\",job=\"$job\"}[5m])",
+ "format": "time_series",
+ "hide": false,
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "ListenDrops - SYNs to LISTEN sockets ignored",
+ "refId": "B",
+ "step": 4
+ },
+ {
+ "expr": "irate(node_netstat_TcpExt_TCPSynRetrans{instance=\"$node\",job=\"$job\"}[5m])",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "TCPSynRetrans - SYN-SYN/ACK retransmits to break down retransmissions in SYN, fast/timeout retransmits",
+ "refId": "C",
+ "step": 4
+ },
+ {
+ "expr": "irate(node_netstat_Tcp_RetransSegs{instance=\"$node\",job=\"$job\"}[5m])",
+ "interval": "",
+ "legendFormat": "RetransSegs - Segments retransmitted - that is, the number of TCP segments transmitted containing one or more previously transmitted octets",
+ "refId": "D"
+ },
+ {
+ "expr": "irate(node_netstat_Tcp_InErrs{instance=\"$node\",job=\"$job\"}[5m])",
+ "interval": "",
+ "legendFormat": "InErrs - Segments received in error (e.g., bad TCP checksums)",
+ "refId": "E"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "TCP Errors",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": "counter",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 0,
+ "y": 72
+ },
+ "height": "",
+ "hiddenSeries": false,
+ "id": 85,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "hideZero": false,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "sortDesc": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "maxPerRow": 12,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [
+ {
+ "alias": "/.*MaxConn *./",
+ "color": "#890F02",
+ "fill": 0
+ }
+ ],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "node_netstat_Tcp_CurrEstab{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "hide": false,
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "CurrEstab - TCP connections for which the current state is either ESTABLISHED or CLOSE- WAIT",
+ "refId": "A",
+ "step": 4
+ },
+ {
+ "expr": "node_netstat_Tcp_MaxConn{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "hide": false,
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "MaxConn - Limit on the total number of TCP connections the entity can support (Dinamic is \"-1\")",
+ "refId": "B",
+ "step": 4
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "TCP Connections",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": "connections",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "description": "",
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 12,
+ "y": 72
+ },
+ "height": "",
+ "hiddenSeries": false,
+ "id": 91,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "hideEmpty": false,
+ "hideZero": false,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "sort": "current",
+ "sortDesc": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "maxPerRow": 12,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [
+ {
+ "alias": "/.*Sent.*/",
+ "transform": "negative-Y"
+ }
+ ],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "irate(node_netstat_TcpExt_SyncookiesFailed{instance=\"$node\",job=\"$job\"}[5m])",
+ "format": "time_series",
+ "hide": false,
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "SyncookiesFailed - Invalid SYN cookies received",
+ "refId": "A",
+ "step": 4
+ },
+ {
+ "expr": "irate(node_netstat_TcpExt_SyncookiesRecv{instance=\"$node\",job=\"$job\"}[5m])",
+ "format": "time_series",
+ "hide": false,
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "SyncookiesRecv - SYN cookies received",
+ "refId": "B",
+ "step": 4
+ },
+ {
+ "expr": "irate(node_netstat_TcpExt_SyncookiesSent{instance=\"$node\",job=\"$job\"}[5m])",
+ "format": "time_series",
+ "hide": false,
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "SyncookiesSent - SYN cookies sent",
+ "refId": "C",
+ "step": 4
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "TCP SynCookie",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": "counter out (-) / in (+)",
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 0,
+ "y": 82
+ },
+ "height": "",
+ "hiddenSeries": false,
+ "id": 82,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "hideZero": false,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "sortDesc": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "maxPerRow": 12,
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "irate(node_netstat_Tcp_ActiveOpens{instance=\"$node\",job=\"$job\"}[5m])",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "ActiveOpens - TCP connections that have made a direct transition to the SYN-SENT state from the CLOSED state",
+ "refId": "A",
+ "step": 4
+ },
+ {
+ "expr": "irate(node_netstat_Tcp_PassiveOpens{instance=\"$node\",job=\"$job\"}[5m])",
+ "format": "time_series",
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "PassiveOpens - TCP connections that have made a direct transition to the SYN-RCVD state from the LISTEN state",
+ "refId": "B",
+ "step": 4
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "TCP Direct Transition",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": "connections",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ }
+ ],
+ "repeat": null,
+ "title": "Network Netstat",
+ "type": "row"
+ },
+ {
+ "collapsed": true,
+ "datasource": "Prometheus",
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 33
+ },
+ "id": 279,
+ "panels": [
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "description": "",
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 0,
+ "y": 54
+ },
+ "hiddenSeries": false,
+ "id": 40,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "max": true,
+ "min": true,
+ "show": true,
+ "sort": "current",
+ "sortDesc": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": true,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "node_scrape_collector_duration_seconds{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "hide": false,
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "{{collector}} - Scrape duration",
+ "refId": "A",
+ "step": 4
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Node Exporter Scrape Time",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "s",
+ "label": "seconds",
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Prometheus",
+ "description": "",
+ "fill": 2,
+ "fillGradient": 0,
+ "gridPos": {
+ "h": 10,
+ "w": 12,
+ "x": 12,
+ "y": 54
+ },
+ "hiddenSeries": false,
+ "id": 157,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "max": true,
+ "min": true,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "options": {
+ "dataLinks": []
+ },
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [
+ {
+ "alias": "/.*error.*/",
+ "color": "#F2495C",
+ "transform": "negative-Y"
+ }
+ ],
+ "spaceLength": 10,
+ "stack": true,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "node_scrape_collector_success{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "hide": false,
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "{{collector}} - Scrape success",
+ "refId": "A",
+ "step": 4
+ },
+ {
+ "expr": "node_textfile_scrape_error{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "hide": false,
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "{{collector}} - Scrape textfile error (1 = true)",
+ "refId": "B",
+ "step": 4
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Node Exporter Scrape",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": "counter",
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ }
+ ],
+ "repeat": null,
+ "title": "Node Exporter",
+ "type": "row"
+ }
+ ],
+ "refresh": "30s",
+ "schemaVersion": 26,
+ "style": "dark",
+ "tags": [],
+ "templating": {
+ "list": [
+ {
+ "current": {
+ "selected": false,
+ "text": "default",
+ "value": "default"
+ },
+ "error": null,
+ "hide": 0,
+ "includeAll": false,
+ "label": "datasource",
+ "multi": false,
+ "name": "DS_PROMETHEUS",
+ "options": [],
+ "query": "prometheus",
+ "refresh": 1,
+ "regex": "",
+ "skipUrlSync": false,
+ "type": "datasource"
+ },
+ {
+ "allValue": null,
+ "current": {
+ "selected": false,
+ "text": "meep-prometheus-node-exporter",
+ "value": "meep-prometheus-node-exporter"
+ },
+ "datasource": "Prometheus",
+ "definition": "",
+ "error": null,
+ "hide": 0,
+ "includeAll": false,
+ "label": "Job",
+ "multi": false,
+ "name": "job",
+ "options": [],
+ "query": "label_values(node_uname_info, job)",
+ "refresh": 1,
+ "regex": "",
+ "skipUrlSync": false,
+ "sort": 1,
+ "tagValuesQuery": "",
+ "tags": [],
+ "tagsQuery": "",
+ "type": "query",
+ "useTags": false
+ },
+ {
+ "allValue": null,
+ "current": {
+ "selected": false,
+ "text": "10.190.114.150:9100",
+ "value": "10.190.114.150:9100"
+ },
+ "datasource": "Prometheus",
+ "definition": "label_values(node_uname_info{job=\"$job\"}, instance)",
+ "error": null,
+ "hide": 0,
+ "includeAll": false,
+ "label": "Host:",
+ "multi": false,
+ "name": "node",
+ "options": [],
+ "query": "label_values(node_uname_info{job=\"$job\"}, instance)",
+ "refresh": 1,
+ "regex": "",
+ "skipUrlSync": false,
+ "sort": 1,
+ "tagValuesQuery": "",
+ "tags": [],
+ "tagsQuery": "",
+ "type": "query",
+ "useTags": false
+ },
+ {
+ "allValue": null,
+ "current": {
+ "selected": false,
+ "text": "[a-z]+|nvme[0-9]+n[0-9]+",
+ "value": "[a-z]+|nvme[0-9]+n[0-9]+"
+ },
+ "error": null,
+ "hide": 2,
+ "includeAll": false,
+ "label": null,
+ "multi": false,
+ "name": "diskdevices",
+ "options": [
+ {
+ "selected": true,
+ "text": "[a-z]+|nvme[0-9]+n[0-9]+",
+ "value": "[a-z]+|nvme[0-9]+n[0-9]+"
+ }
+ ],
+ "query": "[a-z]+|nvme[0-9]+n[0-9]+",
+ "skipUrlSync": false,
+ "type": "custom"
+ }
+ ]
+ },
+ "time": {
+ "from": "now-24h",
+ "to": "now"
+ },
+ "timepicker": {
+ "refresh_intervals": [
+ "5s",
+ "10s",
+ "30s",
+ "1m",
+ "5m",
+ "15m",
+ "30m",
+ "1h",
+ "2h",
+ "1d"
+ ],
+ "time_options": [
+ "5m",
+ "15m",
+ "1h",
+ "6h",
+ "12h",
+ "24h",
+ "2d",
+ "7d",
+ "30d"
+ ]
+ },
+ "timezone": "browser",
+ "title": "Runtime Environment (Node)",
+ "uid": "runtime-environment-node",
+ "version": 1
+}
\ No newline at end of file
diff --git a/agw-deployer/helm/charts/grafana/dashboards/wireless-metrics-aggregation.json b/agw-deployer/helm/charts/grafana/dashboards/wireless-metrics-aggregation.json
new file mode 100644
index 0000000..361c08d
--- /dev/null
+++ b/agw-deployer/helm/charts/grafana/dashboards/wireless-metrics-aggregation.json
@@ -0,0 +1,933 @@
+{
+ "annotations": {
+ "list": [
+ {
+ "builtIn": 1,
+ "datasource": "$datasource",
+ "enable": true,
+ "hide": false,
+ "iconColor": "#3274D9",
+ "limit": 100,
+ "name": "Mobility Events",
+ "query": "SELECT type,description from $database.autogen.events WHERE type='MOBILITY' AND $timeFilter ORDER BY time ASC LIMIT 100",
+ "showIn": 0,
+ "tagsColumn": "type",
+ "textColumn": "",
+ "type": "dashboard"
+ },
+ {
+ "builtIn": 1,
+ "datasource": "$datasource",
+ "enable": true,
+ "hide": false,
+ "iconColor": "#FF780A",
+ "name": "Net Char Events",
+ "query": "SELECT type,description from $database.autogen.events WHERE type='NETWORK-CHARACTERISTICS-UPDATE' AND $timeFilter ORDER BY time ASC LIMIT 100",
+ "showIn": 0,
+ "tagsColumn": "type",
+ "textColumn": "",
+ "type": "dashboard"
+ },
+ {
+ "builtIn": 1,
+ "datasource": "$datasource",
+ "enable": true,
+ "hide": false,
+ "iconColor": "#A352CC",
+ "name": "PDU Session Events",
+ "query": "SELECT type,description from $database.autogen.events WHERE type='PDU-SESSION' AND $timeFilter ORDER BY time ASC LIMIT 100",
+ "showIn": 0,
+ "tagsColumn": "type",
+ "textColumn": "",
+ "type": "dashboard"
+ },
+ {
+ "builtIn": 1,
+ "datasource": "$datasource",
+ "enable": true,
+ "hide": false,
+ "iconColor": "#E02F44",
+ "name": "Scenario Update Events",
+ "query": "SELECT type,description from $database.autogen.events WHERE type='SCENARIO-UPDATE' AND $timeFilter ORDER BY time ASC LIMIT 100",
+ "showIn": 0,
+ "tagsColumn": "type",
+ "textColumn": "",
+ "type": "dashboard"
+ }
+ ]
+ },
+ "editable": true,
+ "gnetId": null,
+ "graphTooltip": 0,
+ "iteration": 1621447328946,
+ "links": [],
+ "panels": [
+ {
+ "collapsed": false,
+ "datasource": null,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 0
+ },
+ "id": 18,
+ "panels": [],
+ "title": "Signals Aggregation",
+ "type": "row"
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "cacheTimeout": null,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "description": "Shows RSRPs between source physical location & destination network locations",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {},
+ "links": []
+ },
+ "overrides": []
+ },
+ "fill": 0,
+ "fillGradient": 1,
+ "gridPos": {
+ "h": 10,
+ "w": 24,
+ "x": 0,
+ "y": 1
+ },
+ "hiddenSeries": false,
+ "id": 2,
+ "interval": "",
+ "legend": {
+ "avg": false,
+ "current": false,
+ "hideEmpty": false,
+ "hideZero": true,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 2,
+ "links": [],
+ "nullPointMode": "null",
+ "options": {
+ "alertThreshold": true
+ },
+ "percentage": false,
+ "pluginVersion": "7.3.5",
+ "pointradius": 2,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "alias": "[[tag_dest]]",
+ "groupBy": [
+ {
+ "params": [
+ "1s"
+ ],
+ "type": "time"
+ },
+ {
+ "params": [
+ "null"
+ ],
+ "type": "fill"
+ }
+ ],
+ "hide": false,
+ "measurement": "/^$scenario$/",
+ "orderByTime": "ASC",
+ "policy": "default",
+ "query": "SELECT mean(\"rsrp\") FROM $database.autogen.gis WHERE (\"src\" =~ /^$src$/) AND $timeFilter GROUP BY dest, time(1s)",
+ "rawQuery": true,
+ "refId": "A",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "lat"
+ ],
+ "type": "field"
+ },
+ {
+ "params": [],
+ "type": "mean"
+ }
+ ]
+ ],
+ "tags": [
+ {
+ "key": "src",
+ "operator": "=~",
+ "value": "/^$src$/"
+ },
+ {
+ "condition": "AND",
+ "key": "dest",
+ "operator": "=~",
+ "value": "/^$dest$/"
+ }
+ ]
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "RSRPs (4G / 5G)",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": "Signal (Mapping)",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": "Throughput (Mbps)",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "cacheTimeout": null,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "description": "Shows RSRQs between source physical location & destination network locations",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {},
+ "links": []
+ },
+ "overrides": []
+ },
+ "fill": 0,
+ "fillGradient": 1,
+ "gridPos": {
+ "h": 10,
+ "w": 24,
+ "x": 0,
+ "y": 11
+ },
+ "hiddenSeries": false,
+ "id": 26,
+ "interval": "",
+ "legend": {
+ "avg": false,
+ "current": false,
+ "hideZero": true,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 2,
+ "links": [],
+ "nullPointMode": "null",
+ "options": {
+ "alertThreshold": true
+ },
+ "percentage": false,
+ "pluginVersion": "7.3.5",
+ "pointradius": 2,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "alias": "[[tag_dest]]",
+ "groupBy": [
+ {
+ "params": [
+ "1s"
+ ],
+ "type": "time"
+ },
+ {
+ "params": [
+ "null"
+ ],
+ "type": "fill"
+ }
+ ],
+ "hide": false,
+ "measurement": "/^$scenario$/",
+ "orderByTime": "ASC",
+ "policy": "default",
+ "query": "SELECT mean(\"rsrq\") FROM $database.autogen.gis WHERE (\"src\" =~ /^$src$/) AND $timeFilter GROUP BY dest, time(1s)",
+ "rawQuery": true,
+ "refId": "A",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "lat"
+ ],
+ "type": "field"
+ },
+ {
+ "params": [],
+ "type": "mean"
+ }
+ ]
+ ],
+ "tags": [
+ {
+ "key": "src",
+ "operator": "=~",
+ "value": "/^$src$/"
+ },
+ {
+ "condition": "AND",
+ "key": "dest",
+ "operator": "=~",
+ "value": "/^$dest$/"
+ }
+ ]
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "RSRQs (4G / 5G)",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": "Signal (Mapping)",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": "Throughput (Mbps)",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "cacheTimeout": null,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "description": "Shows RSSIs between source physical location & destination network locations",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {},
+ "links": []
+ },
+ "overrides": []
+ },
+ "fill": 0,
+ "fillGradient": 1,
+ "gridPos": {
+ "h": 10,
+ "w": 24,
+ "x": 0,
+ "y": 21
+ },
+ "hiddenSeries": false,
+ "id": 24,
+ "interval": "",
+ "legend": {
+ "avg": false,
+ "current": false,
+ "hideZero": true,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 2,
+ "links": [],
+ "nullPointMode": "null",
+ "options": {
+ "alertThreshold": true
+ },
+ "percentage": false,
+ "pluginVersion": "7.3.5",
+ "pointradius": 2,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "alias": "[[tag_dest]]",
+ "groupBy": [
+ {
+ "params": [
+ "1s"
+ ],
+ "type": "time"
+ },
+ {
+ "params": [
+ "null"
+ ],
+ "type": "fill"
+ }
+ ],
+ "hide": false,
+ "measurement": "/^$scenario$/",
+ "orderByTime": "ASC",
+ "policy": "default",
+ "query": "SELECT mean(\"rssi\") FROM $database.autogen.gis WHERE (\"src\" =~ /^$src$/) AND $timeFilter GROUP BY dest, time(1s)",
+ "rawQuery": true,
+ "refId": "A",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "lat"
+ ],
+ "type": "field"
+ },
+ {
+ "params": [],
+ "type": "mean"
+ }
+ ]
+ ],
+ "tags": [
+ {
+ "key": "src",
+ "operator": "=~",
+ "value": "/^$src$/"
+ },
+ {
+ "condition": "AND",
+ "key": "dest",
+ "operator": "=~",
+ "value": "/^$dest$/"
+ }
+ ]
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "RSSIs (WIFI)",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": "Signal (Mapping)",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": "Throughput (Mbps)",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "collapsed": false,
+ "datasource": null,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 31
+ },
+ "id": 20,
+ "panels": [],
+ "title": "Distance Aggregation",
+ "type": "row"
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "cacheTimeout": null,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "description": "Shows distances between source physical location & destination network locations",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {},
+ "links": []
+ },
+ "overrides": []
+ },
+ "fill": 0,
+ "fillGradient": 1,
+ "gridPos": {
+ "h": 10,
+ "w": 24,
+ "x": 0,
+ "y": 32
+ },
+ "hiddenSeries": false,
+ "id": 28,
+ "interval": "",
+ "legend": {
+ "avg": false,
+ "current": false,
+ "hideZero": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 2,
+ "links": [],
+ "nullPointMode": "null",
+ "options": {
+ "alertThreshold": true
+ },
+ "percentage": false,
+ "pluginVersion": "7.3.5",
+ "pointradius": 2,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "alias": "[[tag_dest]]",
+ "groupBy": [
+ {
+ "params": [
+ "1s"
+ ],
+ "type": "time"
+ },
+ {
+ "params": [
+ "null"
+ ],
+ "type": "fill"
+ }
+ ],
+ "hide": false,
+ "measurement": "/^$scenario$/",
+ "orderByTime": "ASC",
+ "policy": "default",
+ "query": "SELECT mean(\"dist\") FROM $database.autogen.gis WHERE (\"src\" =~ /^$src$/) AND $timeFilter GROUP BY dest, time(1s)",
+ "rawQuery": true,
+ "refId": "A",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "lat"
+ ],
+ "type": "field"
+ },
+ {
+ "params": [],
+ "type": "mean"
+ }
+ ]
+ ],
+ "tags": [
+ {
+ "key": "src",
+ "operator": "=~",
+ "value": "/^$src$/"
+ },
+ {
+ "condition": "AND",
+ "key": "dest",
+ "operator": "=~",
+ "value": "/^$dest$/"
+ }
+ ]
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Distances",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": "Distance (Meters)",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": "Throughput (Mbps)",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": false
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "collapsed": false,
+ "datasource": null,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 42
+ },
+ "id": 22,
+ "panels": [],
+ "title": "Events",
+ "type": "row"
+ },
+ {
+ "cacheTimeout": null,
+ "columns": [],
+ "datasource": "$datasource",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "fontSize": "100%",
+ "gridPos": {
+ "h": 6,
+ "w": 24,
+ "x": 0,
+ "y": 43
+ },
+ "id": 4,
+ "links": [],
+ "pageSize": null,
+ "pluginVersion": "6.4.2",
+ "showHeader": true,
+ "sort": {
+ "col": 0,
+ "desc": true
+ },
+ "styles": [
+ {
+ "alias": "Time",
+ "align": "auto",
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "pattern": "Time",
+ "type": "date"
+ },
+ {
+ "alias": "Type",
+ "align": "auto",
+ "colorMode": null,
+ "colors": [
+ "#C4162A",
+ "rgba(237, 129, 40, 0.89)",
+ "rgba(50, 172, 45, 0.97)"
+ ],
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "decimals": 2,
+ "mappingType": 1,
+ "pattern": "events.type",
+ "thresholds": [],
+ "type": "string",
+ "unit": "short",
+ "valueMaps": [
+ {
+ "text": "Net Char",
+ "value": "NETWORK-CHARACTERISTICS-UPDATE"
+ },
+ {
+ "text": "Mobility",
+ "value": "MOBILITY"
+ },
+ {
+ "text": "PDU Session",
+ "value": "PDU-SESSION"
+ },
+ {
+ "text": "Scenario",
+ "value": "SCENARIO-UPDATE"
+ }
+ ]
+ },
+ {
+ "alias": "Description",
+ "align": "auto",
+ "colorMode": null,
+ "colors": [
+ "rgba(245, 54, 54, 0.9)",
+ "rgba(237, 129, 40, 0.89)",
+ "rgba(50, 172, 45, 0.97)"
+ ],
+ "decimals": 2,
+ "mappingType": 1,
+ "pattern": "events.description",
+ "thresholds": [],
+ "type": "string",
+ "unit": "short",
+ "valueMaps": []
+ }
+ ],
+ "targets": [
+ {
+ "groupBy": [],
+ "hide": false,
+ "measurement": "events",
+ "orderByTime": "ASC",
+ "policy": "default",
+ "query": "SELECT type,description FROM $database.autogen.events WHERE $timeFilter AND (\"src\" =~ /^$src$/) ORDER BY time desc LIMIT 100",
+ "rawQuery": true,
+ "refId": "A",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "event"
+ ],
+ "type": "field"
+ }
+ ]
+ ],
+ "tags": [
+ {
+ "key": "src",
+ "operator": "=~",
+ "value": "/^$src$/"
+ },
+ {
+ "condition": "AND",
+ "key": "dest",
+ "operator": "=~",
+ "value": "/^$dest$/"
+ }
+ ]
+ }
+ ],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Events",
+ "transform": "timeseries_to_columns",
+ "type": "table-old"
+ }
+ ],
+ "refresh": "1s",
+ "schemaVersion": 26,
+ "style": "dark",
+ "tags": [],
+ "templating": {
+ "list": [
+ {
+ "current": {
+ "selected": false,
+ "text": "meep-influxdb",
+ "value": "meep-influxdb"
+ },
+ "error": null,
+ "hide": 0,
+ "includeAll": false,
+ "label": "",
+ "multi": false,
+ "name": "datasource",
+ "options": [],
+ "query": "influxdb",
+ "refresh": 1,
+ "regex": "",
+ "skipUrlSync": false,
+ "type": "datasource"
+ },
+ {
+ "allValue": null,
+ "current": {
+ "selected": false,
+ "text": "_internal",
+ "value": "_internal"
+ },
+ "datasource": "$datasource",
+ "definition": "show databases",
+ "error": null,
+ "hide": 0,
+ "includeAll": false,
+ "label": null,
+ "multi": false,
+ "name": "database",
+ "options": [],
+ "query": "show databases",
+ "refresh": 1,
+ "regex": "",
+ "skipUrlSync": false,
+ "sort": 0,
+ "tagValuesQuery": "",
+ "tags": [],
+ "tagsQuery": "",
+ "type": "query",
+ "useTags": false
+ },
+ {
+ "allValue": null,
+ "current": {
+ "isNone": true,
+ "selected": false,
+ "text": "None",
+ "value": ""
+ },
+ "datasource": "$datasource",
+ "definition": "",
+ "error": null,
+ "hide": 0,
+ "includeAll": false,
+ "label": "",
+ "multi": false,
+ "name": "src",
+ "options": [],
+ "query": "show tag values on $database from gis with key = \"src\"",
+ "refresh": 2,
+ "regex": "",
+ "skipUrlSync": false,
+ "sort": 0,
+ "tagValuesQuery": "",
+ "tags": [],
+ "tagsQuery": "",
+ "type": "query",
+ "useTags": false
+ }
+ ]
+ },
+ "time": {
+ "from": "now-1m",
+ "to": "now"
+ },
+ "timepicker": {
+ "hidden": false,
+ "refresh_intervals": [
+ "1s",
+ "5s",
+ "10s",
+ "30s",
+ "1m",
+ "5m",
+ "15m",
+ "30m",
+ "1h",
+ "2h",
+ "1d"
+ ]
+ },
+ "timezone": "",
+ "title": "Wireless Metrics Aggregation",
+ "uid": "6",
+ "version": 6
+}
+
diff --git a/agw-deployer/helm/charts/grafana/dashboards/wireless-metrics-point-to-point.json b/agw-deployer/helm/charts/grafana/dashboards/wireless-metrics-point-to-point.json
new file mode 100644
index 0000000..6df098d
--- /dev/null
+++ b/agw-deployer/helm/charts/grafana/dashboards/wireless-metrics-point-to-point.json
@@ -0,0 +1,1148 @@
+{
+ "annotations": {
+ "list": [
+ {
+ "builtIn": 1,
+ "datasource": "$datasource",
+ "enable": true,
+ "hide": false,
+ "iconColor": "rgba(0, 211, 255, 1)",
+ "limit": 100,
+ "name": "Mobility Events",
+ "query": "SELECT type,description from $database.autogen.events WHERE type='MOBILITY' AND $timeFilter ORDER BY time ASC LIMIT 100",
+ "showIn": 0,
+ "tagsColumn": "type",
+ "textColumn": "",
+ "type": "dashboard"
+ },
+ {
+ "datasource": "$datasource",
+ "enable": true,
+ "hide": false,
+ "iconColor": "#FF9830",
+ "name": "Net Char Events",
+ "query": "SELECT type,description from $database.autogen.events WHERE type='NETWORK-CHARACTERISTICS-UPDATE' AND $timeFilter ORDER BY time ASC LIMIT 100",
+ "showIn": 0,
+ "tagsColumn": "type"
+ }
+ ]
+ },
+ "editable": true,
+ "gnetId": null,
+ "graphTooltip": 0,
+ "iteration": 1621449565579,
+ "links": [],
+ "panels": [
+ {
+ "datasource": null,
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 1,
+ "w": 15,
+ "x": 0,
+ "y": 0
+ },
+ "id": 14,
+ "options": {
+ "content": "\n\n",
+ "mode": "markdown"
+ },
+ "pluginVersion": "7.3.5",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Signals",
+ "type": "text"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": false,
+ "colors": [
+ "#299c46",
+ "rgba(237, 129, 40, 0.89)",
+ "#F2495C"
+ ],
+ "datasource": "$datasource",
+ "decimals": 2,
+ "description": "",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 9,
+ "x": 15,
+ "y": 0
+ },
+ "id": 9,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "pluginVersion": "6.5.2",
+ "postfix": " m",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "groupBy": [
+ {
+ "params": [
+ "$__interval"
+ ],
+ "type": "time"
+ },
+ {
+ "params": [
+ "null"
+ ],
+ "type": "fill"
+ }
+ ],
+ "measurement": "gis",
+ "orderByTime": "ASC",
+ "policy": "default",
+ "query": "SELECT \"dist\" FROM $database.autogen.gis WHERE (\"src\" =~ /^$src$/ AND \"dest\" =~ /^$dest$/) AND $timeFilter",
+ "rawQuery": true,
+ "refId": "A",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "lat"
+ ],
+ "type": "field"
+ }
+ ]
+ ],
+ "tags": [
+ {
+ "key": "src",
+ "operator": "=~",
+ "value": "/^$src$/"
+ },
+ {
+ "condition": "AND",
+ "key": "dest",
+ "operator": "=~",
+ "value": "/^$dest$/"
+ }
+ ]
+ }
+ ],
+ "thresholds": "",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Distance",
+ "type": "singlestat",
+ "valueFontSize": "100%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": false,
+ "colors": [
+ "#299c46",
+ "rgba(237, 129, 40, 0.89)",
+ "#F2495C"
+ ],
+ "datasource": "$datasource",
+ "decimals": null,
+ "description": "",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 5,
+ "x": 0,
+ "y": 1
+ },
+ "id": 8,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "pluginVersion": "6.5.2",
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "groupBy": [
+ {
+ "params": [
+ "$__interval"
+ ],
+ "type": "time"
+ },
+ {
+ "params": [
+ "null"
+ ],
+ "type": "fill"
+ }
+ ],
+ "measurement": "gis",
+ "orderByTime": "ASC",
+ "policy": "default",
+ "query": "SELECT \"rsrp\" FROM $database.autogen.gis WHERE (\"src\" =~ /^$src$/ AND \"dest\" =~ /^$dest$/) AND $timeFilter",
+ "rawQuery": true,
+ "refId": "A",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "lat"
+ ],
+ "type": "field"
+ }
+ ]
+ ],
+ "tags": [
+ {
+ "key": "src",
+ "operator": "=~",
+ "value": "/^$src$/"
+ },
+ {
+ "condition": "AND",
+ "key": "dest",
+ "operator": "=~",
+ "value": "/^$dest$/"
+ }
+ ]
+ }
+ ],
+ "thresholds": "",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "RSRP (4G / 5G)",
+ "type": "singlestat",
+ "valueFontSize": "100%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": false,
+ "colors": [
+ "#299c46",
+ "rgba(237, 129, 40, 0.89)",
+ "#F2495C"
+ ],
+ "datasource": "$datasource",
+ "decimals": 0,
+ "description": "",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 5,
+ "x": 5,
+ "y": 1
+ },
+ "id": 10,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "pluginVersion": "6.5.2",
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "groupBy": [
+ {
+ "params": [
+ "$__interval"
+ ],
+ "type": "time"
+ },
+ {
+ "params": [
+ "null"
+ ],
+ "type": "fill"
+ }
+ ],
+ "measurement": "gis",
+ "orderByTime": "ASC",
+ "policy": "default",
+ "query": "SELECT \"rsrq\" FROM $database.autogen.gis WHERE (\"src\" =~ /^$src$/ AND \"dest\" =~ /^$dest$/) AND $timeFilter",
+ "rawQuery": true,
+ "refId": "A",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "lat"
+ ],
+ "type": "field"
+ }
+ ]
+ ],
+ "tags": [
+ {
+ "key": "src",
+ "operator": "=~",
+ "value": "/^$src$/"
+ },
+ {
+ "condition": "AND",
+ "key": "dest",
+ "operator": "=~",
+ "value": "/^$dest$/"
+ }
+ ]
+ }
+ ],
+ "thresholds": "",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "RSRQ (4G / 5G)",
+ "type": "singlestat",
+ "valueFontSize": "100%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": false,
+ "colors": [
+ "#299c46",
+ "rgba(237, 129, 40, 0.89)",
+ "#F2495C"
+ ],
+ "datasource": "$datasource",
+ "decimals": 0,
+ "description": "",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 3,
+ "w": 5,
+ "x": 10,
+ "y": 1
+ },
+ "id": 16,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "pluginVersion": "6.5.2",
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false,
+ "ymax": null,
+ "ymin": null
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "groupBy": [
+ {
+ "params": [
+ "$__interval"
+ ],
+ "type": "time"
+ },
+ {
+ "params": [
+ "null"
+ ],
+ "type": "fill"
+ }
+ ],
+ "measurement": "gis",
+ "orderByTime": "ASC",
+ "policy": "default",
+ "query": "SELECT \"rssi\" FROM $database.autogen.gis WHERE (\"src\" =~ /^$src$/ AND \"dest\" =~ /^$dest$/) AND $timeFilter",
+ "rawQuery": true,
+ "refId": "A",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "lat"
+ ],
+ "type": "field"
+ }
+ ]
+ ],
+ "tags": [
+ {
+ "key": "src",
+ "operator": "=~",
+ "value": "/^$src$/"
+ },
+ {
+ "condition": "AND",
+ "key": "dest",
+ "operator": "=~",
+ "value": "/^$dest$/"
+ }
+ ]
+ }
+ ],
+ "thresholds": "",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "RSSI (WIFI)",
+ "type": "singlestat",
+ "valueFontSize": "100%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "cacheTimeout": null,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "$datasource",
+ "description": "Shows RSRP, RSRQ, RSSI & DIstance between source physical location & destination network location",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {},
+ "links": []
+ },
+ "overrides": []
+ },
+ "fill": 2,
+ "fillGradient": 4,
+ "gridPos": {
+ "h": 11,
+ "w": 24,
+ "x": 0,
+ "y": 4
+ },
+ "hiddenSeries": false,
+ "id": 2,
+ "interval": "",
+ "legend": {
+ "avg": false,
+ "current": false,
+ "hideZero": true,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 2,
+ "links": [],
+ "nullPointMode": "null",
+ "options": {
+ "alertThreshold": true
+ },
+ "percentage": false,
+ "pluginVersion": "7.3.5",
+ "pointradius": 2,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "alias": "RSRP",
+ "groupBy": [
+ {
+ "params": [
+ "1s"
+ ],
+ "type": "time"
+ },
+ {
+ "params": [
+ "null"
+ ],
+ "type": "fill"
+ }
+ ],
+ "measurement": "gis",
+ "orderByTime": "ASC",
+ "policy": "default",
+ "query": "SELECT mean(\"rsrp\") FROM $database.autogen.gis WHERE (\"src\" =~ /^$src$/ AND \"dest\" =~ /^$dest$/) AND $timeFilter GROUP BY time(1s)",
+ "rawQuery": true,
+ "refId": "A",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "lat"
+ ],
+ "type": "field"
+ },
+ {
+ "params": [],
+ "type": "mean"
+ }
+ ]
+ ],
+ "tags": [
+ {
+ "key": "src",
+ "operator": "=~",
+ "value": "/^$src$/"
+ },
+ {
+ "condition": "AND",
+ "key": "dest",
+ "operator": "=~",
+ "value": "/^$dest$/"
+ }
+ ]
+ },
+ {
+ "alias": "RSRQ",
+ "groupBy": [
+ {
+ "params": [
+ "$__interval"
+ ],
+ "type": "time"
+ },
+ {
+ "params": [
+ "null"
+ ],
+ "type": "fill"
+ }
+ ],
+ "measurement": "gis",
+ "orderByTime": "ASC",
+ "policy": "default",
+ "query": "SELECT mean(\"rsrq\") FROM $database.autogen.gis WHERE (\"src\" =~ /^$src$/ AND \"dest\" =~ /^$dest$/) AND $timeFilter GROUP BY time(1s)",
+ "rawQuery": true,
+ "refId": "B",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "ul"
+ ],
+ "type": "field"
+ },
+ {
+ "params": [],
+ "type": "mean"
+ }
+ ]
+ ],
+ "tags": [
+ {
+ "key": "src",
+ "operator": "=~",
+ "value": "/^$src$/"
+ },
+ {
+ "condition": "AND",
+ "key": "dest",
+ "operator": "=~",
+ "value": "/^$dest$/"
+ }
+ ]
+ },
+ {
+ "alias": "RSSI",
+ "groupBy": [
+ {
+ "params": [
+ "$__interval"
+ ],
+ "type": "time"
+ },
+ {
+ "params": [
+ "null"
+ ],
+ "type": "fill"
+ }
+ ],
+ "measurement": "gis",
+ "orderByTime": "ASC",
+ "policy": "default",
+ "query": "SELECT mean(\"rssi\") FROM $database.autogen.gis WHERE (\"src\" =~ /^$src$/ AND \"dest\" =~ /^$dest$/) AND $timeFilter GROUP BY time(1s)",
+ "rawQuery": true,
+ "refId": "C",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "dl"
+ ],
+ "type": "field"
+ },
+ {
+ "params": [],
+ "type": "mean"
+ }
+ ]
+ ],
+ "tags": [
+ {
+ "key": "src",
+ "operator": "=~",
+ "value": "/^$src$/"
+ },
+ {
+ "condition": "AND",
+ "key": "dest",
+ "operator": "=~",
+ "value": "/^$dest$/"
+ }
+ ]
+ },
+ {
+ "alias": "Distance",
+ "groupBy": [
+ {
+ "params": [
+ "$__interval"
+ ],
+ "type": "time"
+ },
+ {
+ "params": [
+ "null"
+ ],
+ "type": "fill"
+ }
+ ],
+ "orderByTime": "ASC",
+ "policy": "default",
+ "query": "SELECT mean(\"dist\") FROM $database.autogen.gis WHERE (\"src\" =~ /^$src$/ AND \"dest\" =~ /^$dest$/) AND $timeFilter GROUP BY time(1s)",
+ "rawQuery": true,
+ "refId": "D",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "value"
+ ],
+ "type": "field"
+ },
+ {
+ "params": [],
+ "type": "mean"
+ }
+ ]
+ ],
+ "tags": [
+ {
+ "key": "src",
+ "operator": "=~",
+ "value": "/^$src$/"
+ },
+ {
+ "condition": "AND",
+ "key": "dest",
+ "operator": "=~",
+ "value": "/^$dest$/"
+ }
+ ]
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "RSRP, RSRQ, RSSI & Distance",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": "Signal (Mapping)",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": "Distance (Meters)",
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "cacheTimeout": null,
+ "columns": [],
+ "datasource": "$datasource",
+ "fieldConfig": {
+ "defaults": {
+ "custom": {}
+ },
+ "overrides": []
+ },
+ "fontSize": "100%",
+ "gridPos": {
+ "h": 6,
+ "w": 24,
+ "x": 0,
+ "y": 15
+ },
+ "id": 4,
+ "links": [],
+ "pageSize": null,
+ "pluginVersion": "6.4.2",
+ "showHeader": true,
+ "sort": {
+ "col": 0,
+ "desc": true
+ },
+ "styles": [
+ {
+ "alias": "Time",
+ "align": "auto",
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "pattern": "Time",
+ "type": "date"
+ },
+ {
+ "alias": "Type",
+ "align": "auto",
+ "colorMode": null,
+ "colors": [
+ "#C4162A",
+ "rgba(237, 129, 40, 0.89)",
+ "rgba(50, 172, 45, 0.97)"
+ ],
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "decimals": 2,
+ "mappingType": 1,
+ "pattern": "events.type",
+ "thresholds": [],
+ "type": "string",
+ "unit": "short",
+ "valueMaps": [
+ {
+ "text": "Net Char",
+ "value": "NETWORK-CHARACTERISTICS-UPDATE"
+ },
+ {
+ "text": "Mobility",
+ "value": "MOBILITY"
+ }
+ ]
+ },
+ {
+ "alias": "Description",
+ "align": "auto",
+ "colorMode": null,
+ "colors": [
+ "rgba(245, 54, 54, 0.9)",
+ "rgba(237, 129, 40, 0.89)",
+ "rgba(50, 172, 45, 0.97)"
+ ],
+ "decimals": 2,
+ "mappingType": 1,
+ "pattern": "events.description",
+ "thresholds": [],
+ "type": "string",
+ "unit": "short",
+ "valueMaps": []
+ }
+ ],
+ "targets": [
+ {
+ "groupBy": [],
+ "hide": false,
+ "measurement": "events",
+ "orderByTime": "ASC",
+ "policy": "default",
+ "query": "SELECT type,description FROM $database.autogen.events WHERE (\"src\" =~ /^$src$/ AND (\"dest\" =~ /^$dest$/ OR \"dest\" = \"\")) AND $timeFilter ORDER BY time desc LIMIT 100",
+ "rawQuery": true,
+ "refId": "A",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "event"
+ ],
+ "type": "field"
+ }
+ ]
+ ],
+ "tags": [
+ {
+ "key": "src",
+ "operator": "=~",
+ "value": "/^$src$/"
+ },
+ {
+ "condition": "AND",
+ "key": "dest",
+ "operator": "=~",
+ "value": "/^$dest$/"
+ }
+ ]
+ }
+ ],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Events",
+ "transform": "timeseries_to_columns",
+ "type": "table-old"
+ }
+ ],
+ "refresh": "1s",
+ "schemaVersion": 26,
+ "style": "dark",
+ "tags": [],
+ "templating": {
+ "list": [
+ {
+ "current": {
+ "selected": false,
+ "text": "meep-influxdb",
+ "value": "meep-influxdb"
+ },
+ "error": null,
+ "hide": 0,
+ "includeAll": false,
+ "label": "",
+ "multi": false,
+ "name": "datasource",
+ "options": [],
+ "query": "influxdb",
+ "refresh": 1,
+ "regex": "",
+ "skipUrlSync": false,
+ "type": "datasource"
+ },
+ {
+ "allValue": null,
+ "current": {
+ "selected": false,
+ "text": "demo1",
+ "value": "demo1"
+ },
+ "datasource": "$datasource",
+ "definition": "show databases",
+ "error": null,
+ "hide": 0,
+ "includeAll": false,
+ "label": null,
+ "multi": false,
+ "name": "database",
+ "options": [],
+ "query": "show databases",
+ "refresh": 1,
+ "regex": "",
+ "skipUrlSync": false,
+ "sort": 0,
+ "tagValuesQuery": "",
+ "tags": [],
+ "tagsQuery": "",
+ "type": "query",
+ "useTags": false
+ },
+ {
+ "allValue": null,
+ "current": {
+ "isNone": true,
+ "selected": false,
+ "text": "None",
+ "value": ""
+ },
+ "datasource": "$datasource",
+ "definition": "",
+ "error": null,
+ "hide": 0,
+ "includeAll": false,
+ "label": "",
+ "multi": false,
+ "name": "src",
+ "options": [],
+ "query": "show tag values on $database from gis with key = \"src\"",
+ "refresh": 2,
+ "regex": "",
+ "skipUrlSync": false,
+ "sort": 0,
+ "tagValuesQuery": "",
+ "tags": [],
+ "tagsQuery": "",
+ "type": "query",
+ "useTags": false
+ },
+ {
+ "allValue": null,
+ "current": {
+ "isNone": true,
+ "selected": false,
+ "text": "None",
+ "value": ""
+ },
+ "datasource": "$datasource",
+ "definition": "",
+ "error": null,
+ "hide": 0,
+ "includeAll": false,
+ "label": "",
+ "multi": false,
+ "name": "dest",
+ "options": [],
+ "query": "show tag values on $database from gis with key = \"dest\"",
+ "refresh": 2,
+ "regex": "",
+ "skipUrlSync": false,
+ "sort": 0,
+ "tagValuesQuery": "",
+ "tags": [],
+ "tagsQuery": "",
+ "type": "query",
+ "useTags": false
+ }
+ ]
+ },
+ "time": {
+ "from": "now-1m",
+ "to": "now"
+ },
+ "timepicker": {
+ "hidden": false,
+ "refresh_intervals": [
+ "1s",
+ "5s",
+ "10s",
+ "30s",
+ "1m",
+ "5m",
+ "15m",
+ "30m",
+ "1h",
+ "2h",
+ "1d"
+ ]
+ },
+ "timezone": "",
+ "title": "Wireless Metrics Point-to-Point",
+ "uid": "5",
+ "version": 7
+}
+
diff --git a/agw-deployer/helm/charts/grafana/templates/NOTES.txt b/agw-deployer/helm/charts/grafana/templates/NOTES.txt
new file mode 100644
index 0000000..1fc8436
--- /dev/null
+++ b/agw-deployer/helm/charts/grafana/templates/NOTES.txt
@@ -0,0 +1,54 @@
+1. Get your '{{ .Values.adminUser }}' user password by running:
+
+ kubectl get secret --namespace {{ template "grafana.namespace" . }} {{ template "grafana.fullname" . }} -o jsonpath="{.data.admin-password}" | base64 --decode ; echo
+
+2. The Grafana server can be accessed via port {{ .Values.service.port }} on the following DNS name from within your cluster:
+
+ {{ template "grafana.fullname" . }}.{{ template "grafana.namespace" . }}.svc.cluster.local
+{{ if .Values.ingress.enabled }}
+ If you bind grafana to 80, please update values in values.yaml and reinstall:
+ ```
+ securityContext:
+ runAsUser: 0
+ runAsGroup: 0
+ fsGroup: 0
+
+ command:
+ - "setcap"
+ - "'cap_net_bind_service=+ep'"
+ - "/usr/sbin/grafana-server &&"
+ - "sh"
+ - "/run.sh"
+ ```
+ Details refer to https://grafana.com/docs/installation/configuration/#http-port.
+ Or grafana would always crash.
+
+ From outside the cluster, the server URL(s) are:
+{{- range .Values.ingress.hosts }}
+ http://{{ . }}
+{{- end }}
+{{ else }}
+ Get the Grafana URL to visit by running these commands in the same shell:
+{{ if contains "NodePort" .Values.service.type -}}
+ export NODE_PORT=$(kubectl get --namespace {{ template "grafana.namespace" . }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ template "grafana.fullname" . }})
+ export NODE_IP=$(kubectl get nodes --namespace {{ template "grafana.namespace" . }} -o jsonpath="{.items[0].status.addresses[0].address}")
+ echo http://$NODE_IP:$NODE_PORT
+{{ else if contains "LoadBalancer" .Values.service.type -}}
+ NOTE: It may take a few minutes for the LoadBalancer IP to be available.
+ You can watch the status of by running 'kubectl get svc --namespace {{ template "grafana.namespace" . }} -w {{ template "grafana.fullname" . }}'
+ export SERVICE_IP=$(kubectl get svc --namespace {{ template "grafana.namespace" . }} {{ template "grafana.fullname" . }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
+ http://$SERVICE_IP:{{ .Values.service.port -}}
+{{ else if contains "ClusterIP" .Values.service.type }}
+ export POD_NAME=$(kubectl get pods --namespace {{ template "grafana.namespace" . }} -l "app.kubernetes.io/name={{ template "grafana.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}")
+ kubectl --namespace {{ template "grafana.namespace" . }} port-forward $POD_NAME 3000
+{{- end }}
+{{- end }}
+
+3. Login with the password from step 1 and the username: {{ .Values.adminUser }}
+
+{{- if not .Values.persistence.enabled }}
+#################################################################################
+###### WARNING: Persistence is disabled!!! You will lose your data when #####
+###### the Grafana pod is terminated. #####
+#################################################################################
+{{- end }}
diff --git a/agw-deployer/helm/charts/grafana/templates/_helpers.tpl b/agw-deployer/helm/charts/grafana/templates/_helpers.tpl
new file mode 100644
index 0000000..a4b53f3
--- /dev/null
+++ b/agw-deployer/helm/charts/grafana/templates/_helpers.tpl
@@ -0,0 +1,117 @@
+{{/* vim: set filetype=mustache: */}}
+{{/*
+Expand the name of the chart.
+*/}}
+{{- define "grafana.name" -}}
+{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+{{/*
+Create a default fully qualified app name.
+We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
+If release name contains chart name it will be used as a full name.
+*/}}
+{{- define "grafana.fullname" -}}
+{{- if .Values.fullnameOverride -}}
+{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}}
+{{- else -}}
+{{- $name := default .Chart.Name .Values.nameOverride -}}
+{{- if contains $name .Release.Name -}}
+{{- .Release.Name | trunc 63 | trimSuffix "-" -}}
+{{- else -}}
+{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Create chart name and version as used by the chart label.
+*/}}
+{{- define "grafana.chart" -}}
+{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+{{/*
+Create the name of the service account
+*/}}
+{{- define "grafana.serviceAccountName" -}}
+{{- if .Values.serviceAccount.create -}}
+ {{ default (include "grafana.fullname" .) .Values.serviceAccount.name }}
+{{- else -}}
+ {{ default "default" .Values.serviceAccount.name }}
+{{- end -}}
+{{- end -}}
+
+{{- define "grafana.serviceAccountNameTest" -}}
+{{- if .Values.serviceAccount.create -}}
+ {{ default (print (include "grafana.fullname" .) "-test") .Values.serviceAccount.nameTest }}
+{{- else -}}
+ {{ default "default" .Values.serviceAccount.nameTest }}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Allow the release namespace to be overridden for multi-namespace deployments in combined charts
+*/}}
+{{- define "grafana.namespace" -}}
+ {{- if .Values.namespaceOverride -}}
+ {{- .Values.namespaceOverride -}}
+ {{- else -}}
+ {{- .Release.Namespace -}}
+ {{- end -}}
+{{- end -}}
+
+{{/*
+Common labels
+*/}}
+{{- define "grafana.labels" -}}
+helm.sh/chart: {{ include "grafana.chart" . }}
+{{ include "grafana.selectorLabels" . }}
+{{- if or .Chart.AppVersion .Values.image.tag }}
+app.kubernetes.io/version: {{ .Values.image.tag | default .Chart.AppVersion | quote }}
+{{- end }}
+app.kubernetes.io/managed-by: {{ .Release.Service }}
+{{- end -}}
+
+{{/*
+Selector labels
+*/}}
+{{- define "grafana.selectorLabels" -}}
+app.kubernetes.io/name: {{ include "grafana.name" . }}
+app.kubernetes.io/instance: {{ .Release.Name }}
+app: {{ include "grafana.name" . }}
+chart: {{ include "grafana.chart" . }}
+release: {{ .Release.Name }}
+heritage: {{ .Release.Service }}
+{{- end -}}
+
+{{/*
+Common labels
+*/}}
+{{- define "grafana.imageRenderer.labels" -}}
+helm.sh/chart: {{ include "grafana.chart" . }}
+{{ include "grafana.imageRenderer.selectorLabels" . }}
+{{- if or .Chart.AppVersion .Values.image.tag }}
+app.kubernetes.io/version: {{ .Values.image.tag | default .Chart.AppVersion | quote }}
+{{- end }}
+app.kubernetes.io/managed-by: {{ .Release.Service }}
+{{- end -}}
+
+{{/*
+Selector labels ImageRenderer
+*/}}
+{{- define "grafana.imageRenderer.selectorLabels" -}}
+app.kubernetes.io/name: {{ include "grafana.name" . }}-image-renderer
+app.kubernetes.io/instance: {{ .Release.Name }}
+{{- end -}}
+
+{{/*
+Return the appropriate apiVersion for rbac.
+*/}}
+{{- define "rbac.apiVersion" -}}
+{{- if .Capabilities.APIVersions.Has "rbac.authorization.k8s.io/v1" }}
+{{- print "rbac.authorization.k8s.io/v1" -}}
+{{- else -}}
+{{- print "rbac.authorization.k8s.io/v1beta1" -}}
+{{- end -}}
+{{- end -}}
diff --git a/agw-deployer/helm/charts/grafana/templates/_pod.tpl b/agw-deployer/helm/charts/grafana/templates/_pod.tpl
new file mode 100644
index 0000000..493bb9d
--- /dev/null
+++ b/agw-deployer/helm/charts/grafana/templates/_pod.tpl
@@ -0,0 +1,479 @@
+
+{{- define "grafana.pod" -}}
+{{- if .Values.schedulerName }}
+schedulerName: "{{ .Values.schedulerName }}"
+{{- end }}
+serviceAccountName: {{ template "grafana.serviceAccountName" . }}
+{{- if .Values.securityContext }}
+securityContext:
+{{ toYaml .Values.securityContext | indent 2 }}
+{{- end }}
+{{- if .Values.hostAliases }}
+hostAliases:
+{{ toYaml .Values.hostAliases | indent 2 }}
+{{- end }}
+{{- if .Values.priorityClassName }}
+priorityClassName: {{ .Values.priorityClassName }}
+{{- end }}
+{{- if ( or .Values.persistence.enabled .Values.dashboards .Values.sidecar.datasources.enabled .Values.sidecar.notifiers.enabled .Values.extraInitContainers) }}
+initContainers:
+{{- end }}
+{{- if ( and .Values.persistence.enabled .Values.initChownData.enabled ) }}
+ - name: init-chown-data
+ {{- if .Values.initChownData.image.sha }}
+ image: "{{ .Values.initChownData.image.repository }}:{{ .Values.initChownData.image.tag }}@sha256:{{ .Values.initChownData.image.sha }}"
+ {{- else }}
+ image: "{{ .Values.initChownData.image.repository }}:{{ .Values.initChownData.image.tag }}"
+ {{- end }}
+ imagePullPolicy: {{ .Values.initChownData.image.pullPolicy }}
+ securityContext:
+ runAsNonRoot: false
+ runAsUser: 0
+ command: ["chown", "-R", "{{ .Values.securityContext.runAsUser }}:{{ .Values.securityContext.runAsGroup }}", "/var/lib/grafana"]
+ resources:
+{{ toYaml .Values.initChownData.resources | indent 6 }}
+ volumeMounts:
+ - name: storage
+ mountPath: "/var/lib/grafana"
+{{- if .Values.persistence.subPath }}
+ subPath: {{ .Values.persistence.subPath }}
+{{- end }}
+{{- end }}
+{{- if .Values.dashboards }}
+ - name: download-dashboards
+ {{- if .Values.downloadDashboardsImage.sha }}
+ image: "{{ .Values.downloadDashboardsImage.repository }}:{{ .Values.downloadDashboardsImage.tag }}@sha256:{{ .Values.downloadDashboardsImage.sha }}"
+ {{- else }}
+ image: "{{ .Values.downloadDashboardsImage.repository }}:{{ .Values.downloadDashboardsImage.tag }}"
+ {{- end }}
+ imagePullPolicy: {{ .Values.downloadDashboardsImage.pullPolicy }}
+ command: ["/bin/sh"]
+ args: [ "-c", "mkdir -p /var/lib/grafana/dashboards/default && /bin/sh /etc/grafana/download_dashboards.sh" ]
+ resources:
+{{ toYaml .Values.downloadDashboards.resources | indent 6 }}
+ env:
+{{- range $key, $value := .Values.downloadDashboards.env }}
+ - name: "{{ $key }}"
+ value: "{{ $value }}"
+{{- end }}
+ volumeMounts:
+ - name: config
+ mountPath: "/etc/grafana/download_dashboards.sh"
+ subPath: download_dashboards.sh
+ - name: storage
+ mountPath: "/var/lib/grafana"
+{{- if .Values.persistence.subPath }}
+ subPath: {{ .Values.persistence.subPath }}
+{{- end }}
+ {{- range .Values.extraSecretMounts }}
+ - name: {{ .name }}
+ mountPath: {{ .mountPath }}
+ readOnly: {{ .readOnly }}
+ {{- end }}
+{{- end }}
+{{- if .Values.sidecar.datasources.enabled }}
+ - name: {{ template "grafana.name" . }}-sc-datasources
+ {{- if .Values.sidecar.image.sha }}
+ image: "{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}@sha256:{{ .Values.sidecar.image.sha }}"
+ {{- else }}
+ image: "{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}"
+ {{- end }}
+ imagePullPolicy: {{ .Values.sidecar.imagePullPolicy }}
+ env:
+ - name: METHOD
+ value: LIST
+ - name: LABEL
+ value: "{{ .Values.sidecar.datasources.label }}"
+ {{- if .Values.sidecar.datasources.labelValue }}
+ - name: LABEL_VALUE
+ value: {{ quote .Values.sidecar.datasources.labelValue }}
+ {{- end }}
+ - name: FOLDER
+ value: "/etc/grafana/provisioning/datasources"
+ - name: RESOURCE
+ value: "both"
+ {{- if .Values.sidecar.enableUniqueFilenames }}
+ - name: UNIQUE_FILENAMES
+ value: "{{ .Values.sidecar.enableUniqueFilenames }}"
+ {{- end }}
+ {{- if .Values.sidecar.datasources.searchNamespace }}
+ - name: NAMESPACE
+ value: "{{ .Values.sidecar.datasources.searchNamespace }}"
+ {{- end }}
+ {{- if .Values.sidecar.skipTlsVerify }}
+ - name: SKIP_TLS_VERIFY
+ value: "{{ .Values.sidecar.skipTlsVerify }}"
+ {{- end }}
+ resources:
+{{ toYaml .Values.sidecar.resources | indent 6 }}
+ volumeMounts:
+ - name: sc-datasources-volume
+ mountPath: "/etc/grafana/provisioning/datasources"
+{{- end}}
+{{- if .Values.sidecar.notifiers.enabled }}
+ - name: {{ template "grafana.name" . }}-sc-notifiers
+ {{- if .Values.sidecar.image.sha }}
+ image: "{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}@sha256:{{ .Values.sidecar.image.sha }}"
+ {{- else }}
+ image: "{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}"
+ {{- end }}
+ imagePullPolicy: {{ .Values.sidecar.imagePullPolicy }}
+ env:
+ - name: METHOD
+ value: LIST
+ - name: LABEL
+ value: "{{ .Values.sidecar.notifiers.label }}"
+ - name: FOLDER
+ value: "/etc/grafana/provisioning/notifiers"
+ - name: RESOURCE
+ value: "both"
+ {{- if .Values.sidecar.enableUniqueFilenames }}
+ - name: UNIQUE_FILENAMES
+ value: "{{ .Values.sidecar.enableUniqueFilenames }}"
+ {{- end }}
+ {{- if .Values.sidecar.notifiers.searchNamespace }}
+ - name: NAMESPACE
+ value: "{{ .Values.sidecar.notifiers.searchNamespace }}"
+ {{- end }}
+ {{- if .Values.sidecar.skipTlsVerify }}
+ - name: SKIP_TLS_VERIFY
+ value: "{{ .Values.sidecar.skipTlsVerify }}"
+ {{- end }}
+ resources:
+{{ toYaml .Values.sidecar.resources | indent 6 }}
+ volumeMounts:
+ - name: sc-notifiers-volume
+ mountPath: "/etc/grafana/provisioning/notifiers"
+{{- end}}
+{{- if .Values.extraInitContainers }}
+{{ toYaml .Values.extraInitContainers | indent 2 }}
+{{- end }}
+{{- if .Values.image.pullSecrets }}
+imagePullSecrets:
+{{- range .Values.image.pullSecrets }}
+ - name: {{ . }}
+{{- end}}
+{{- end }}
+containers:
+{{- if .Values.sidecar.dashboards.enabled }}
+ - name: {{ template "grafana.name" . }}-sc-dashboard
+ {{- if .Values.sidecar.image.sha }}
+ image: "{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}@sha256:{{ .Values.sidecar.image.sha }}"
+ {{- else }}
+ image: "{{ .Values.sidecar.image.repository }}:{{ .Values.sidecar.image.tag }}"
+ {{- end }}
+ imagePullPolicy: {{ .Values.sidecar.imagePullPolicy }}
+ env:
+ - name: METHOD
+ value: {{ .Values.sidecar.dashboards.watchMethod }}
+ - name: LABEL
+ value: "{{ .Values.sidecar.dashboards.label }}"
+ {{- if .Values.sidecar.dashboards.labelValue }}
+ - name: LABEL_VALUE
+ value: {{ quote .Values.sidecar.dashboards.labelValue }}
+ {{- end }}
+ - name: FOLDER
+ value: "{{ .Values.sidecar.dashboards.folder }}{{- with .Values.sidecar.dashboards.defaultFolderName }}/{{ . }}{{- end }}"
+ - name: RESOURCE
+ value: "both"
+ {{- if .Values.sidecar.enableUniqueFilenames }}
+ - name: UNIQUE_FILENAMES
+ value: "{{ .Values.sidecar.enableUniqueFilenames }}"
+ {{- end }}
+ {{- if .Values.sidecar.dashboards.searchNamespace }}
+ - name: NAMESPACE
+ value: "{{ .Values.sidecar.dashboards.searchNamespace }}"
+ {{- end }}
+ {{- if .Values.sidecar.skipTlsVerify }}
+ - name: SKIP_TLS_VERIFY
+ value: "{{ .Values.sidecar.skipTlsVerify }}"
+ {{- end }}
+ {{- if .Values.sidecar.dashboards.folderAnnotation }}
+ - name: FOLDER_ANNOTATION
+ value: "{{ .Values.sidecar.dashboards.folderAnnotation }}"
+ {{- end }}
+ resources:
+{{ toYaml .Values.sidecar.resources | indent 6 }}
+ volumeMounts:
+ - name: sc-dashboard-volume
+ mountPath: {{ .Values.sidecar.dashboards.folder | quote }}
+{{- end}}
+ - name: {{ .Chart.Name }}
+ {{- if .Values.image.sha }}
+ image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}@sha256:{{ .Values.image.sha }}"
+ {{- else }}
+ image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
+ {{- end }}
+ imagePullPolicy: {{ .Values.image.pullPolicy }}
+ {{- if .Values.command }}
+ command:
+ {{- range .Values.command }}
+ - {{ . }}
+ {{- end }}
+ {{- end}}
+{{- if .Values.containerSecurityContext }}
+ securityContext:
+{{- toYaml .Values.containerSecurityContext | nindent 6 }}
+{{- end }}
+ volumeMounts:
+ - name: config
+ mountPath: "/etc/grafana/grafana.ini"
+ subPath: grafana.ini
+ {{- if .Values.ldap.enabled }}
+ - name: ldap
+ mountPath: "/etc/grafana/ldap.toml"
+ subPath: ldap.toml
+ {{- end }}
+ {{- range .Values.extraConfigmapMounts }}
+ - name: {{ .name }}
+ mountPath: {{ .mountPath }}
+ subPath: {{ .subPath | default "" }}
+ readOnly: {{ .readOnly }}
+ {{- end }}
+ - name: storage
+ mountPath: "/var/lib/grafana"
+{{- if .Values.persistence.subPath }}
+ subPath: {{ .Values.persistence.subPath }}
+{{- end }}
+{{- if .Values.dashboards }}
+{{- range $provider, $dashboards := .Values.dashboards }}
+{{- range $key, $value := $dashboards }}
+{{- if (or (hasKey $value "json") (hasKey $value "file")) }}
+ - name: dashboards-{{ $provider }}
+ mountPath: "/var/lib/grafana/dashboards/{{ $provider }}/{{ $key }}.json"
+ subPath: "{{ $key }}.json"
+{{- end }}
+{{- end }}
+{{- end }}
+{{- end -}}
+{{- if .Values.dashboardsConfigMaps }}
+{{- range (keys .Values.dashboardsConfigMaps | sortAlpha) }}
+ - name: dashboards-{{ . }}
+ mountPath: "/var/lib/grafana/dashboards/{{ . }}"
+{{- end }}
+{{- end }}
+{{- if .Values.datasources }}
+ - name: config
+ mountPath: "/etc/grafana/provisioning/datasources/datasources.yaml"
+ subPath: datasources.yaml
+{{- end }}
+{{- if .Values.notifiers }}
+ - name: config
+ mountPath: "/etc/grafana/provisioning/notifiers/notifiers.yaml"
+ subPath: notifiers.yaml
+{{- end }}
+{{- if .Values.dashboardProviders }}
+ - name: config
+ mountPath: "/etc/grafana/provisioning/dashboards/dashboardproviders.yaml"
+ subPath: dashboardproviders.yaml
+{{- end }}
+{{- if .Values.sidecar.dashboards.enabled }}
+ - name: sc-dashboard-volume
+ mountPath: {{ .Values.sidecar.dashboards.folder | quote }}
+{{ if .Values.sidecar.dashboards.SCProvider }}
+ - name: sc-dashboard-provider
+ mountPath: "/etc/grafana/provisioning/dashboards/sc-dashboardproviders.yaml"
+ subPath: provider.yaml
+{{- end}}
+{{- end}}
+{{- if .Values.sidecar.datasources.enabled }}
+ - name: sc-datasources-volume
+ mountPath: "/etc/grafana/provisioning/datasources"
+{{- end}}
+{{- if .Values.sidecar.notifiers.enabled }}
+ - name: sc-notifiers-volume
+ mountPath: "/etc/grafana/provisioning/notifiers"
+{{- end}}
+ {{- range .Values.extraSecretMounts }}
+ - name: {{ .name }}
+ mountPath: {{ .mountPath }}
+ readOnly: {{ .readOnly }}
+ subPath: {{ .subPath | default "" }}
+ {{- end }}
+ {{- range .Values.extraVolumeMounts }}
+ - name: {{ .name }}
+ mountPath: {{ .mountPath }}
+ subPath: {{ .subPath | default "" }}
+ readOnly: {{ .readOnly }}
+ {{- end }}
+ {{- range .Values.extraEmptyDirMounts }}
+ - name: {{ .name }}
+ mountPath: {{ .mountPath }}
+ {{- end }}
+ ports:
+ - name: {{ .Values.service.portName }}
+ containerPort: {{ .Values.service.port }}
+ protocol: TCP
+ - name: {{ .Values.podPortName }}
+ containerPort: 3000
+ protocol: TCP
+ env:
+ {{- if not .Values.env.GF_SECURITY_ADMIN_USER }}
+ - name: GF_SECURITY_ADMIN_USER
+ valueFrom:
+ secretKeyRef:
+ name: {{ .Values.admin.existingSecret | default (include "grafana.fullname" .) }}
+ key: {{ .Values.admin.userKey | default "admin-user" }}
+ {{- end }}
+ {{- if and (not .Values.env.GF_SECURITY_ADMIN_PASSWORD) (not .Values.env.GF_SECURITY_ADMIN_PASSWORD__FILE) }}
+ - name: GF_SECURITY_ADMIN_PASSWORD
+ valueFrom:
+ secretKeyRef:
+ name: {{ .Values.admin.existingSecret | default (include "grafana.fullname" .) }}
+ key: {{ .Values.admin.passwordKey | default "admin-password" }}
+ {{- end }}
+ {{- if .Values.plugins }}
+ - name: GF_INSTALL_PLUGINS
+ valueFrom:
+ configMapKeyRef:
+ name: {{ template "grafana.fullname" . }}
+ key: plugins
+ {{- end }}
+ {{- if .Values.smtp.existingSecret }}
+ - name: GF_SMTP_USER
+ valueFrom:
+ secretKeyRef:
+ name: {{ .Values.smtp.existingSecret }}
+ key: {{ .Values.smtp.userKey | default "user" }}
+ - name: GF_SMTP_PASSWORD
+ valueFrom:
+ secretKeyRef:
+ name: {{ .Values.smtp.existingSecret }}
+ key: {{ .Values.smtp.passwordKey | default "password" }}
+ {{- end }}
+ {{ if .Values.imageRenderer.enabled }}
+ - name: GF_RENDERING_SERVER_URL
+ value: http://{{ template "grafana.fullname" . }}-image-renderer.{{ template "grafana.namespace" . }}:{{ .Values.imageRenderer.service.port }}/render
+ - name: GF_RENDERING_CALLBACK_URL
+ value: http://{{ template "grafana.fullname" . }}.{{ template "grafana.namespace" . }}:{{ .Values.service.port }}/
+ {{ end }}
+ {{- range $key, $value := .Values.envValueFrom }}
+ - name: {{ $key | quote }}
+ valueFrom:
+{{ toYaml $value | indent 10 }}
+ {{- end }}
+{{- range $key, $value := .Values.env }}
+ - name: "{{ tpl $key $ }}"
+ value: "{{ tpl (print $value) $ }}"
+{{- end }}
+ {{- if .Values.envFromSecret }}
+ envFrom:
+ - secretRef:
+ name: {{ tpl .Values.envFromSecret . }}
+ {{- end }}
+ {{- if .Values.envRenderSecret }}
+ envFrom:
+ - secretRef:
+ name: {{ template "grafana.fullname" . }}-env
+ {{- end }}
+ livenessProbe:
+{{ toYaml .Values.livenessProbe | indent 6 }}
+ readinessProbe:
+{{ toYaml .Values.readinessProbe | indent 6 }}
+ resources:
+{{ toYaml .Values.resources | indent 6 }}
+{{- with .Values.extraContainers }}
+{{ tpl . $ | indent 2 }}
+{{- end }}
+{{- with .Values.nodeSelector }}
+nodeSelector:
+{{ toYaml . | indent 2 }}
+{{- end }}
+{{- with .Values.affinity }}
+affinity:
+{{ toYaml . | indent 2 }}
+{{- end }}
+{{- with .Values.tolerations }}
+tolerations:
+{{ toYaml . | indent 2 }}
+{{- end }}
+volumes:
+ - name: config
+ configMap:
+ name: {{ template "grafana.fullname" . }}
+{{- range .Values.extraConfigmapMounts }}
+ - name: {{ .name }}
+ configMap:
+ name: {{ .configMap }}
+{{- end }}
+ {{- if .Values.dashboards }}
+ {{- range (keys .Values.dashboards | sortAlpha) }}
+ - name: dashboards-{{ . }}
+ configMap:
+ name: {{ template "grafana.fullname" $ }}-dashboards-{{ . }}
+ {{- end }}
+ {{- end }}
+ {{- if .Values.dashboardsConfigMaps }}
+ {{ $root := . }}
+ {{- range $provider, $name := .Values.dashboardsConfigMaps }}
+ - name: dashboards-{{ $provider }}
+ configMap:
+ name: {{ tpl $name $root }}
+ {{- end }}
+ {{- end }}
+ {{- if .Values.ldap.enabled }}
+ - name: ldap
+ secret:
+ {{- if .Values.ldap.existingSecret }}
+ secretName: {{ .Values.ldap.existingSecret }}
+ {{- else }}
+ secretName: {{ template "grafana.fullname" . }}
+ {{- end }}
+ items:
+ - key: ldap-toml
+ path: ldap.toml
+ {{- end }}
+{{- if and .Values.persistence.enabled (eq .Values.persistence.type "pvc") }}
+ - name: storage
+ persistentVolumeClaim:
+ claimName: {{ .Values.persistence.existingClaim | default (include "grafana.fullname" .) }}
+{{- else if and .Values.persistence.enabled (eq .Values.persistence.type "statefulset") }}
+# nothing
+{{- else }}
+ - name: storage
+ emptyDir: {}
+{{- end -}}
+{{- if .Values.sidecar.dashboards.enabled }}
+ - name: sc-dashboard-volume
+ emptyDir: {}
+{{- if .Values.sidecar.dashboards.SCProvider }}
+ - name: sc-dashboard-provider
+ configMap:
+ name: {{ template "grafana.fullname" . }}-config-dashboards
+{{- end }}
+{{- end }}
+{{- if .Values.sidecar.datasources.enabled }}
+ - name: sc-datasources-volume
+ emptyDir: {}
+{{- end -}}
+{{- if .Values.sidecar.notifiers.enabled }}
+ - name: sc-notifiers-volume
+ emptyDir: {}
+{{- end -}}
+{{- range .Values.extraSecretMounts }}
+{{- if .secretName }}
+ - name: {{ .name }}
+ secret:
+ secretName: {{ .secretName }}
+ defaultMode: {{ .defaultMode }}
+{{- else if .projected }}
+ - name: {{ .name }}
+ projected: {{- toYaml .projected | nindent 6 }}
+{{- else if .csi }}
+ - name: {{ .name }}
+ csi: {{- toYaml .csi | nindent 6 }}
+{{- end }}
+{{- end }}
+{{- range .Values.extraVolumeMounts }}
+ - name: {{ .name }}
+ persistentVolumeClaim:
+ claimName: {{ .existingClaim }}
+{{- end }}
+{{- range .Values.extraEmptyDirMounts }}
+ - name: {{ .name }}
+ emptyDir: {}
+{{- end -}}
+{{- if .Values.extraContainerVolumes }}
+{{ toYaml .Values.extraContainerVolumes | indent 2 }}
+{{- end }}
+{{- end }}
diff --git a/agw-deployer/helm/charts/grafana/templates/clusterrole.yaml b/agw-deployer/helm/charts/grafana/templates/clusterrole.yaml
new file mode 100644
index 0000000..f09e065
--- /dev/null
+++ b/agw-deployer/helm/charts/grafana/templates/clusterrole.yaml
@@ -0,0 +1,25 @@
+{{- if and .Values.rbac.create (not .Values.rbac.namespaced) (not .Values.rbac.useExistingRole) }}
+kind: ClusterRole
+apiVersion: rbac.authorization.k8s.io/v1
+metadata:
+ labels:
+ {{- include "grafana.labels" . | nindent 4 }}
+{{- with .Values.annotations }}
+ annotations:
+{{ toYaml . | indent 4 }}
+{{- end }}
+ name: {{ template "grafana.fullname" . }}-clusterrole
+{{- if or .Values.sidecar.dashboards.enabled (or .Values.sidecar.datasources.enabled .Values.rbac.extraClusterRoleRules) }}
+rules:
+{{- if or .Values.sidecar.dashboards.enabled .Values.sidecar.datasources.enabled }}
+- apiGroups: [""] # "" indicates the core API group
+ resources: ["configmaps", "secrets"]
+ verbs: ["get", "watch", "list"]
+{{- end}}
+{{- with .Values.rbac.extraClusterRoleRules }}
+{{ toYaml . | indent 0 }}
+{{- end}}
+{{- else }}
+rules: []
+{{- end}}
+{{- end}}
diff --git a/agw-deployer/helm/charts/grafana/templates/clusterrolebinding.yaml b/agw-deployer/helm/charts/grafana/templates/clusterrolebinding.yaml
new file mode 100644
index 0000000..4accbfa
--- /dev/null
+++ b/agw-deployer/helm/charts/grafana/templates/clusterrolebinding.yaml
@@ -0,0 +1,24 @@
+{{- if and .Values.rbac.create (not .Values.rbac.namespaced) }}
+kind: ClusterRoleBinding
+apiVersion: rbac.authorization.k8s.io/v1
+metadata:
+ name: {{ template "grafana.fullname" . }}-clusterrolebinding
+ labels:
+ {{- include "grafana.labels" . | nindent 4 }}
+{{- with .Values.annotations }}
+ annotations:
+{{ toYaml . | indent 4 }}
+{{- end }}
+subjects:
+ - kind: ServiceAccount
+ name: {{ template "grafana.serviceAccountName" . }}
+ namespace: {{ template "grafana.namespace" . }}
+roleRef:
+ kind: ClusterRole
+{{- if (not .Values.rbac.useExistingRole) }}
+ name: {{ template "grafana.fullname" . }}-clusterrole
+{{- else }}
+ name: {{ .Values.rbac.useExistingRole }}
+{{- end }}
+ apiGroup: rbac.authorization.k8s.io
+{{- end -}}
diff --git a/agw-deployer/helm/charts/grafana/templates/configmap-dashboard-provider.yaml b/agw-deployer/helm/charts/grafana/templates/configmap-dashboard-provider.yaml
new file mode 100644
index 0000000..65d7385
--- /dev/null
+++ b/agw-deployer/helm/charts/grafana/templates/configmap-dashboard-provider.yaml
@@ -0,0 +1,29 @@
+{{- if .Values.sidecar.dashboards.enabled }}
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ labels:
+ {{- include "grafana.labels" . | nindent 4 }}
+{{- with .Values.annotations }}
+ annotations:
+{{ toYaml . | indent 4 }}
+{{- end }}
+ name: {{ template "grafana.fullname" . }}-config-dashboards
+ namespace: {{ template "grafana.namespace" . }}
+data:
+ provider.yaml: |-
+ apiVersion: 1
+ providers:
+ - name: '{{ .Values.sidecar.dashboards.provider.name }}'
+ orgId: {{ .Values.sidecar.dashboards.provider.orgid }}
+ {{- if not .Values.sidecar.dashboards.provider.foldersFromFilesStructure }}
+ folder: '{{ .Values.sidecar.dashboards.provider.folder }}'
+ {{- end}}
+ type: {{ .Values.sidecar.dashboards.provider.type }}
+ disableDeletion: {{ .Values.sidecar.dashboards.provider.disableDelete }}
+ allowUiUpdates: {{ .Values.sidecar.dashboards.provider.allowUiUpdates }}
+ updateIntervalSeconds: {{ .Values.sidecar.dashboards.provider.updateIntervalSeconds | default 30 }}
+ options:
+ foldersFromFilesStructure: {{ .Values.sidecar.dashboards.provider.foldersFromFilesStructure }}
+ path: {{ .Values.sidecar.dashboards.folder }}{{- with .Values.sidecar.dashboards.defaultFolderName }}/{{ . }}{{- end }}
+{{- end}}
diff --git a/agw-deployer/helm/charts/grafana/templates/configmap.yaml b/agw-deployer/helm/charts/grafana/templates/configmap.yaml
new file mode 100644
index 0000000..a9fdc3a
--- /dev/null
+++ b/agw-deployer/helm/charts/grafana/templates/configmap.yaml
@@ -0,0 +1,69 @@
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: {{ template "grafana.fullname" . }}
+ namespace: {{ template "grafana.namespace" . }}
+ labels:
+ {{- include "grafana.labels" . | nindent 4 }}
+data:
+{{- if .Values.plugins }}
+ plugins: {{ join "," .Values.plugins }}
+{{- end }}
+ grafana.ini: |
+{{- range $key, $value := index .Values "grafana.ini" }}
+ [{{ $key }}]
+ {{- range $elem, $elemVal := $value }}
+ {{ $elem }} = {{ $elemVal }}
+ {{- end }}
+{{- end }}
+
+{{- if .Values.datasources }}
+{{ $root := . }}
+ {{- range $key, $value := .Values.datasources }}
+ {{ $key }}: |
+{{ tpl (toYaml $value | indent 4) $root }}
+ {{- end -}}
+{{- end -}}
+
+{{- if .Values.notifiers }}
+ {{- range $key, $value := .Values.notifiers }}
+ {{ $key }}: |
+{{ toYaml $value | indent 4 }}
+ {{- end -}}
+{{- end -}}
+
+{{- if .Values.dashboardProviders }}
+ {{- range $key, $value := .Values.dashboardProviders }}
+ {{ $key }}: |
+{{ toYaml $value | indent 4 }}
+ {{- end -}}
+{{- end -}}
+
+{{- if .Values.dashboards }}
+ download_dashboards.sh: |
+ #!/usr/bin/env sh
+ set -euf
+ {{- if .Values.dashboardProviders }}
+ {{- range $key, $value := .Values.dashboardProviders }}
+ {{- range $value.providers }}
+ mkdir -p {{ .options.path }}
+ {{- end }}
+ {{- end }}
+ {{- end }}
+
+ {{- range $provider, $dashboards := .Values.dashboards }}
+ {{- range $key, $value := $dashboards }}
+ {{- if (or (hasKey $value "gnetId") (hasKey $value "url")) }}
+ curl -skf \
+ --connect-timeout 60 \
+ --max-time 60 \
+ {{- if not $value.b64content }}
+ -H "Accept: application/json" \
+ -H "Content-Type: application/json;charset=UTF-8" \
+ {{ end }}
+ {{- if $value.url -}}"{{ $value.url }}"{{- else -}}"https://grafana.com/api/dashboards/{{ $value.gnetId }}/revisions/{{- if $value.revision -}}{{ $value.revision }}{{- else -}}1{{- end -}}/download"{{- end -}}{{ if $value.datasource }} | sed '/-- .* --/! s/"datasource":.*,/"datasource": "{{ $value.datasource }}",/g'{{ end }}{{- if $value.b64content -}} | base64 -d {{- end -}} \
+ > "/var/lib/grafana/dashboards/{{ $provider }}/{{ $key }}.json"
+ {{- end -}}
+ {{- end }}
+ {{- end }}
+{{- end }}
diff --git a/agw-deployer/helm/charts/grafana/templates/dashboards-json-configmap.yaml b/agw-deployer/helm/charts/grafana/templates/dashboards-json-configmap.yaml
new file mode 100644
index 0000000..59e0be6
--- /dev/null
+++ b/agw-deployer/helm/charts/grafana/templates/dashboards-json-configmap.yaml
@@ -0,0 +1,35 @@
+{{- if .Values.dashboards }}
+{{ $files := .Files }}
+{{- range $provider, $dashboards := .Values.dashboards }}
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: {{ template "grafana.fullname" $ }}-dashboards-{{ $provider }}
+ namespace: {{ template "grafana.namespace" $ }}
+ labels:
+ {{- include "grafana.labels" $ | nindent 4 }}
+ dashboard-provider: {{ $provider }}
+{{- if $dashboards }}
+data:
+{{- $dashboardFound := false }}
+{{- range $key, $value := $dashboards }}
+{{- if (or (hasKey $value "json") (hasKey $value "file")) }}
+{{- $dashboardFound = true }}
+{{ print $key | indent 2 }}.json:
+{{- if hasKey $value "json" }}
+ |-
+{{ $value.json | indent 6 }}
+{{- end }}
+{{- if hasKey $value "file" }}
+{{ toYaml ( $files.Get $value.file ) | indent 4}}
+{{- end }}
+{{- end }}
+{{- end }}
+{{- if not $dashboardFound }}
+ {}
+{{- end }}
+{{- end }}
+---
+{{- end }}
+
+{{- end }}
diff --git a/agw-deployer/helm/charts/grafana/templates/deployment.yaml b/agw-deployer/helm/charts/grafana/templates/deployment.yaml
new file mode 100644
index 0000000..4d77794
--- /dev/null
+++ b/agw-deployer/helm/charts/grafana/templates/deployment.yaml
@@ -0,0 +1,48 @@
+{{ if (or (not .Values.persistence.enabled) (eq .Values.persistence.type "pvc")) }}
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: {{ template "grafana.fullname" . }}
+ namespace: {{ template "grafana.namespace" . }}
+ labels:
+ {{- include "grafana.labels" . | nindent 4 }}
+{{- if .Values.labels }}
+{{ toYaml .Values.labels | indent 4 }}
+{{- end }}
+{{- with .Values.annotations }}
+ annotations:
+{{ toYaml . | indent 4 }}
+{{- end }}
+spec:
+ replicas: {{ .Values.replicas }}
+ revisionHistoryLimit: {{ .Values.revisionHistoryLimit }}
+ selector:
+ matchLabels:
+ {{- include "grafana.selectorLabels" . | nindent 6 }}
+{{- with .Values.deploymentStrategy }}
+ strategy:
+{{ toYaml . | trim | indent 4 }}
+{{- end }}
+ template:
+ metadata:
+ labels:
+ {{- include "grafana.selectorLabels" . | nindent 8 }}
+{{- with .Values.podLabels }}
+{{ toYaml . | indent 8 }}
+{{- end }}
+ annotations:
+ checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }}
+ checksum/dashboards-json-config: {{ include (print $.Template.BasePath "/dashboards-json-configmap.yaml") . | sha256sum }}
+ checksum/sc-dashboard-provider-config: {{ include (print $.Template.BasePath "/configmap-dashboard-provider.yaml") . | sha256sum }}
+{{- if or (and (not .Values.admin.existingSecret) (not .Values.env.GF_SECURITY_ADMIN_PASSWORD__FILE) (not .Values.env.GF_SECURITY_ADMIN_PASSWORD)) (and .Values.ldap.enabled (not .Values.ldap.existingSecret)) }}
+ checksum/secret: {{ include (print $.Template.BasePath "/secret.yaml") . | sha256sum }}
+{{- end }}
+{{- if .Values.envRenderSecret }}
+ checksum/secret-env: {{ include (print $.Template.BasePath "/secret-env.yaml") . | sha256sum }}
+{{- end }}
+{{- with .Values.podAnnotations }}
+{{ toYaml . | indent 8 }}
+{{- end }}
+ spec:
+ {{- include "grafana.pod" . | nindent 6 }}
+{{- end }}
diff --git a/agw-deployer/helm/charts/grafana/templates/headless-service.yaml b/agw-deployer/helm/charts/grafana/templates/headless-service.yaml
new file mode 100644
index 0000000..2fa816e
--- /dev/null
+++ b/agw-deployer/helm/charts/grafana/templates/headless-service.yaml
@@ -0,0 +1,18 @@
+{{- if and .Values.persistence.enabled (not .Values.persistence.existingClaim) (eq .Values.persistence.type "statefulset")}}
+apiVersion: v1
+kind: Service
+metadata:
+ name: {{ template "grafana.fullname" . }}-headless
+ namespace: {{ template "grafana.namespace" . }}
+ labels:
+ {{- include "grafana.labels" . | nindent 4 }}
+{{- with .Values.annotations }}
+ annotations:
+{{ toYaml . | indent 4 }}
+{{- end }}
+spec:
+ clusterIP: None
+ selector:
+ {{- include "grafana.selectorLabels" . | nindent 4 }}
+ type: ClusterIP
+{{- end }}
diff --git a/agw-deployer/helm/charts/grafana/templates/image-renderer-deployment.yaml b/agw-deployer/helm/charts/grafana/templates/image-renderer-deployment.yaml
new file mode 100644
index 0000000..2ab9f5e
--- /dev/null
+++ b/agw-deployer/helm/charts/grafana/templates/image-renderer-deployment.yaml
@@ -0,0 +1,115 @@
+{{ if .Values.imageRenderer.enabled }}
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: {{ template "grafana.fullname" . }}-image-renderer
+ namespace: {{ template "grafana.namespace" . }}
+ labels:
+ {{- include "grafana.imageRenderer.labels" . | nindent 4 }}
+{{- if .Values.imageRenderer.labels }}
+{{ toYaml .Values.imageRenderer.labels | indent 4 }}
+{{- end }}
+{{- with .Values.imageRenderer.annotations }}
+ annotations:
+{{ toYaml . | indent 4 }}
+{{- end }}
+spec:
+ replicas: {{ .Values.imageRenderer.replicas }}
+ revisionHistoryLimit: {{ .Values.imageRenderer.revisionHistoryLimit }}
+ selector:
+ matchLabels:
+ {{- include "grafana.imageRenderer.selectorLabels" . | nindent 6 }}
+{{- with .Values.imageRenderer.deploymentStrategy }}
+ strategy:
+{{ toYaml . | trim | indent 4 }}
+{{- end }}
+ template:
+ metadata:
+ labels:
+ {{- include "grafana.imageRenderer.selectorLabels" . | nindent 8 }}
+{{- with .Values.imageRenderer.podLabels }}
+{{ toYaml . | indent 8 }}
+{{- end }}
+ annotations:
+ checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }}
+{{- with .Values.imageRenderer.podAnnotations }}
+{{ toYaml . | indent 8 }}
+{{- end }}
+ spec:
+
+ {{- if .Values.imageRenderer.schedulerName }}
+ schedulerName: "{{ .Values.imageRenderer.schedulerName }}"
+ {{- end }}
+ {{- if .Values.imageRenderer.serviceAccountName }}
+ serviceAccountName: "{{ .Values.imageRenderer.serviceAccountName }}"
+ {{- end }}
+ {{- if .Values.imageRenderer.securityContext }}
+ securityContext:
+ {{ toYaml .Values.imageRenderer.securityContext | indent 2 }}
+ {{- end }}
+ {{- if .Values.imageRenderer.hostAliases }}
+ hostAliases:
+ {{ toYaml .Values.imageRenderer.hostAliases | indent 2 }}
+ {{- end }}
+ {{- if .Values.imageRenderer.priorityClassName }}
+ priorityClassName: {{ .Values.imageRenderer.priorityClassName }}
+ {{- end }}
+ {{- if .Values.imageRenderer.image.pullSecrets }}
+ imagePullSecrets:
+ {{- range .Values.imageRenderer.image.pullSecrets }}
+ - name: {{ . }}
+ {{- end}}
+ {{- end }}
+ containers:
+ - name: {{ .Chart.Name }}-image-renderer
+ {{- if .Values.imageRenderer.image.sha }}
+ image: "{{ .Values.imageRenderer.image.repository }}:{{ .Values.imageRenderer.image.tag }}@sha256:{{ .Values.imageRenderer.image.sha }}"
+ {{- else }}
+ image: "{{ .Values.imageRenderer.image.repository }}:{{ .Values.imageRenderer.image.tag }}"
+ {{- end }}
+ imagePullPolicy: {{ .Values.imageRenderer.image.pullPolicy }}
+ {{- if .Values.imageRenderer.command }}
+ command:
+ {{- range .Values.imageRenderer.command }}
+ - {{ . }}
+ {{- end }}
+ {{- end}}
+ ports:
+ - name: {{ .Values.imageRenderer.service.portName }}
+ containerPort: {{ .Values.imageRenderer.service.port }}
+ protocol: TCP
+ env:
+ - name: HTTP_PORT
+ value: {{ .Values.imageRenderer.service.port | quote }}
+ {{- range $key, $value := .Values.imageRenderer.env }}
+ - name: {{ $key | quote }}
+ value: {{ $value | quote }}
+ {{- end }}
+ securityContext:
+ capabilities:
+ drop: ['all']
+ allowPrivilegeEscalation: false
+ readOnlyRootFilesystem: true
+ volumeMounts:
+ - mountPath: /tmp
+ name: image-renderer-tmpfs
+ {{- with .Values.imageRenderer.resources }}
+ resources:
+{{ toYaml . | indent 12 }}
+ {{- end }}
+ {{- with .Values.imageRenderer.nodeSelector }}
+ nodeSelector:
+{{ toYaml . | indent 8 }}
+ {{- end }}
+ {{- with .Values.imageRenderer.affinity }}
+ affinity:
+{{ toYaml . | indent 8 }}
+ {{- end }}
+ {{- with .Values.imageRenderer.tolerations }}
+ tolerations:
+{{ toYaml . | indent 8 }}
+ {{- end }}
+ volumes:
+ - name: image-renderer-tmpfs
+ emptyDir: {}
+{{- end }}
diff --git a/agw-deployer/helm/charts/grafana/templates/image-renderer-network-policy.yaml b/agw-deployer/helm/charts/grafana/templates/image-renderer-network-policy.yaml
new file mode 100644
index 0000000..f8ca73a
--- /dev/null
+++ b/agw-deployer/helm/charts/grafana/templates/image-renderer-network-policy.yaml
@@ -0,0 +1,76 @@
+{{- if and (.Values.imageRenderer.enabled) (.Values.imageRenderer.networkPolicy.limitIngress) }}
+---
+apiVersion: networking.k8s.io/v1
+kind: NetworkPolicy
+metadata:
+ name: {{ template "grafana.fullname" . }}-image-renderer-ingress
+ namespace: {{ template "grafana.namespace" . }}
+ annotations:
+ comment: Limit image-renderer ingress traffic from grafana
+spec:
+ podSelector:
+ matchLabels:
+ {{- include "grafana.imageRenderer.selectorLabels" . | nindent 6 }}
+ {{- if .Values.imageRenderer.podLabels }}
+ {{ toYaml .Values.imageRenderer.podLabels | nindent 6 }}
+ {{- end }}
+
+ policyTypes:
+ - Ingress
+ ingress:
+ - ports:
+ - port: {{ .Values.imageRenderer.service.port }}
+ protocol: TCP
+ from:
+ - namespaceSelector:
+ matchLabels:
+ name: {{ template "grafana.namespace" . }}
+ podSelector:
+ matchLabels:
+ {{- include "grafana.selectorLabels" . | nindent 14 }}
+ {{- if .Values.podLabels }}
+ {{ toYaml .Values.podLabels | nindent 14 }}
+ {{- end }}
+{{ end }}
+
+{{- if and (.Values.imageRenderer.enabled) (.Values.imageRenderer.networkPolicy.limitEgress) }}
+---
+apiVersion: networking.k8s.io/v1
+kind: NetworkPolicy
+metadata:
+ name: {{ template "grafana.fullname" . }}-image-renderer-egress
+ namespace: {{ template "grafana.namespace" . }}
+ annotations:
+ comment: Limit image-renderer egress traffic to grafana
+spec:
+ podSelector:
+ matchLabels:
+ {{- include "grafana.imageRenderer.selectorLabels" . | nindent 6 }}
+ {{- if .Values.imageRenderer.podLabels }}
+ {{ toYaml .Values.imageRenderer.podLabels | nindent 6 }}
+ {{- end }}
+
+ policyTypes:
+ - Egress
+ egress:
+ # allow dns resolution
+ - ports:
+ - port: 53
+ protocol: UDP
+ - port: 53
+ protocol: TCP
+ # talk only to grafana
+ - ports:
+ - port: {{ .Values.service.port }}
+ protocol: TCP
+ to:
+ - namespaceSelector:
+ matchLabels:
+ name: {{ template "grafana.namespace" . }}
+ podSelector:
+ matchLabels:
+ {{- include "grafana.selectorLabels" . | nindent 14 }}
+ {{- if .Values.podLabels }}
+ {{ toYaml .Values.podLabels | nindent 14 }}
+ {{- end }}
+{{ end }}
diff --git a/agw-deployer/helm/charts/grafana/templates/image-renderer-service.yaml b/agw-deployer/helm/charts/grafana/templates/image-renderer-service.yaml
new file mode 100644
index 0000000..f5d3eb0
--- /dev/null
+++ b/agw-deployer/helm/charts/grafana/templates/image-renderer-service.yaml
@@ -0,0 +1,28 @@
+{{ if .Values.imageRenderer.enabled }}
+apiVersion: v1
+kind: Service
+metadata:
+ name: {{ template "grafana.fullname" . }}-image-renderer
+ namespace: {{ template "grafana.namespace" . }}
+ labels:
+ {{- include "grafana.imageRenderer.labels" . | nindent 4 }}
+{{- if .Values.imageRenderer.service.labels }}
+{{ toYaml .Values.imageRenderer.service.labels | indent 4 }}
+{{- end }}
+{{- with .Values.imageRenderer.service.annotations }}
+ annotations:
+{{ toYaml . | indent 4 }}
+{{- end }}
+spec:
+ type: ClusterIP
+ {{- if .Values.imageRenderer.service.clusterIP }}
+ clusterIP: {{ .Values.imageRenderer.service.clusterIP }}
+ {{end}}
+ ports:
+ - name: {{ .Values.imageRenderer.service.portName }}
+ port: {{ .Values.imageRenderer.service.port }}
+ protocol: TCP
+ targetPort: {{ .Values.imageRenderer.service.targetPort }}
+ selector:
+ {{- include "grafana.imageRenderer.selectorLabels" . | nindent 4 }}
+{{ end }}
diff --git a/agw-deployer/helm/charts/grafana/templates/ingress.yaml b/agw-deployer/helm/charts/grafana/templates/ingress.yaml
new file mode 100644
index 0000000..710b82d
--- /dev/null
+++ b/agw-deployer/helm/charts/grafana/templates/ingress.yaml
@@ -0,0 +1,58 @@
+{{- if .Values.ingress.enabled -}}
+{{- $fullName := include "grafana.fullname" . -}}
+{{- $servicePort := .Values.service.port -}}
+{{- $ingressPath := .Values.ingress.path -}}
+{{- $extraPaths := .Values.ingress.extraPaths -}}
+{{- if .Capabilities.APIVersions.Has "networking.k8s.io/v1beta1" }}
+apiVersion: networking.k8s.io/v1beta1
+{{ else }}
+apiVersion: extensions/v1beta1
+{{ end -}}
+kind: Ingress
+metadata:
+ name: {{ $fullName }}
+ namespace: {{ template "grafana.namespace" . }}
+ labels:
+ {{- include "grafana.labels" . | nindent 4 }}
+{{- if .Values.ingress.labels }}
+{{ toYaml .Values.ingress.labels | indent 4 }}
+{{- end }}
+ {{- if .Values.ingress.annotations }}
+ annotations:
+ {{- range $key, $value := .Values.ingress.annotations }}
+ {{ $key }}: {{ tpl $value $ | quote }}
+ {{- end }}
+ {{- end }}
+spec:
+ {{- if .Values.ingress.ingressClassName }}
+ ingressClassName: {{ .Values.ingress.ingressClassName }}
+ {{- end -}}
+{{- if .Values.ingress.tls }}
+ tls:
+{{ tpl (toYaml .Values.ingress.tls) $ | indent 4 }}
+{{- end }}
+ rules:
+ {{- if .Values.ingress.hosts }}
+ {{- range .Values.ingress.hosts }}
+ - host: {{ tpl . $}}
+ http:
+ paths:
+{{ if $extraPaths }}
+{{ toYaml $extraPaths | indent 10 }}
+{{- end }}
+ - path: {{ $ingressPath }}
+ backend:
+ serviceName: {{ $fullName }}
+ servicePort: {{ $servicePort }}
+ {{- end }}
+ {{- else }}
+ - http:
+ paths:
+ - backend:
+ serviceName: {{ $fullName }}
+ servicePort: {{ $servicePort }}
+ {{- if $ingressPath }}
+ path: {{ $ingressPath }}
+ {{- end }}
+ {{- end -}}
+{{- end }}
diff --git a/agw-deployer/helm/charts/grafana/templates/poddisruptionbudget.yaml b/agw-deployer/helm/charts/grafana/templates/poddisruptionbudget.yaml
new file mode 100644
index 0000000..61813a4
--- /dev/null
+++ b/agw-deployer/helm/charts/grafana/templates/poddisruptionbudget.yaml
@@ -0,0 +1,22 @@
+{{- if .Values.podDisruptionBudget }}
+apiVersion: policy/v1beta1
+kind: PodDisruptionBudget
+metadata:
+ name: {{ template "grafana.fullname" . }}
+ namespace: {{ template "grafana.namespace" . }}
+ labels:
+ {{- include "grafana.labels" . | nindent 4 }}
+{{- if .Values.labels }}
+{{ toYaml .Values.labels | indent 4 }}
+{{- end }}
+spec:
+{{- if .Values.podDisruptionBudget.minAvailable }}
+ minAvailable: {{ .Values.podDisruptionBudget.minAvailable }}
+{{- end }}
+{{- if .Values.podDisruptionBudget.maxUnavailable }}
+ maxUnavailable: {{ .Values.podDisruptionBudget.maxUnavailable }}
+{{- end }}
+ selector:
+ matchLabels:
+ {{- include "grafana.selectorLabels" . | nindent 6 }}
+{{- end }}
diff --git a/agw-deployer/helm/charts/grafana/templates/podsecuritypolicy.yaml b/agw-deployer/helm/charts/grafana/templates/podsecuritypolicy.yaml
new file mode 100644
index 0000000..88bf64c
--- /dev/null
+++ b/agw-deployer/helm/charts/grafana/templates/podsecuritypolicy.yaml
@@ -0,0 +1,53 @@
+{{- if .Values.rbac.pspEnabled }}
+apiVersion: policy/v1beta1
+kind: PodSecurityPolicy
+metadata:
+ name: {{ template "grafana.fullname" . }}
+ namespace: {{ template "grafana.namespace" . }}
+ labels:
+ {{- include "grafana.labels" . | nindent 4 }}
+ annotations:
+ seccomp.security.alpha.kubernetes.io/allowedProfileNames: 'docker/default,runtime/default'
+ seccomp.security.alpha.kubernetes.io/defaultProfileName: 'docker/default'
+ {{- if .Values.rbac.pspUseAppArmor }}
+ apparmor.security.beta.kubernetes.io/allowedProfileNames: 'runtime/default'
+ apparmor.security.beta.kubernetes.io/defaultProfileName: 'runtime/default'
+ {{- end }}
+spec:
+ privileged: false
+ allowPrivilegeEscalation: false
+ requiredDropCapabilities:
+ # Default set from Docker, without DAC_OVERRIDE or CHOWN
+ - FOWNER
+ - FSETID
+ - KILL
+ - SETGID
+ - SETUID
+ - SETPCAP
+ - NET_BIND_SERVICE
+ - NET_RAW
+ - SYS_CHROOT
+ - MKNOD
+ - AUDIT_WRITE
+ - SETFCAP
+ volumes:
+ - 'configMap'
+ - 'emptyDir'
+ - 'projected'
+ - 'csi'
+ - 'secret'
+ - 'downwardAPI'
+ - 'persistentVolumeClaim'
+ hostNetwork: false
+ hostIPC: false
+ hostPID: false
+ runAsUser:
+ rule: 'RunAsAny'
+ seLinux:
+ rule: 'RunAsAny'
+ supplementalGroups:
+ rule: 'RunAsAny'
+ fsGroup:
+ rule: 'RunAsAny'
+ readOnlyRootFilesystem: false
+{{- end }}
diff --git a/agw-deployer/helm/charts/grafana/templates/pv.yaml b/agw-deployer/helm/charts/grafana/templates/pv.yaml
new file mode 100644
index 0000000..913264c
--- /dev/null
+++ b/agw-deployer/helm/charts/grafana/templates/pv.yaml
@@ -0,0 +1,20 @@
+{{- if and .Values.persistence.enabled (not .Values.persistence.existingClaim) (eq .Values.persistence.type "pvc") .Values.persistentVolume.enabled}}
+apiVersion: v1
+kind: PersistentVolume
+metadata:
+ name: {{ template "grafana.fullname" . }}
+ namespace: {{ template "grafana.namespace" . }}
+ labels:
+ {{- include "grafana.labels" . | nindent 4 }}
+spec:
+ capacity:
+ storage: {{ .Values.persistentVolume.size }}
+ accessModes:
+ {{- range .Values.persistentVolume.accessModes }}
+ - {{ . | quote }}
+ {{- end }}
+ persistentVolumeReclaimPolicy: {{ .Values.persistentVolume.reclaimPolicy }}
+ hostPath:
+ path: "{{.Values.persistentVolume.location}}"
+ storageClassName: {{ template "grafana.fullname" . }}
+{{- end }}
\ No newline at end of file
diff --git a/agw-deployer/helm/charts/grafana/templates/pvc.yaml b/agw-deployer/helm/charts/grafana/templates/pvc.yaml
new file mode 100644
index 0000000..98b36a9
--- /dev/null
+++ b/agw-deployer/helm/charts/grafana/templates/pvc.yaml
@@ -0,0 +1,35 @@
+{{- if and .Values.persistence.enabled (not .Values.persistence.existingClaim) (eq .Values.persistence.type "pvc")}}
+apiVersion: v1
+kind: PersistentVolumeClaim
+metadata:
+ name: {{ template "grafana.fullname" . }}
+ namespace: {{ template "grafana.namespace" . }}
+ labels:
+ {{- include "grafana.labels" . | nindent 4 }}
+ {{- with .Values.persistence.annotations }}
+ annotations:
+{{ toYaml . | indent 4 }}
+ {{- end }}
+ {{- with .Values.persistence.finalizers }}
+ finalizers:
+{{ toYaml . | indent 4 }}
+ {{- end }}
+spec:
+ accessModes:
+ {{- range .Values.persistence.accessModes }}
+ - {{ . | quote }}
+ {{- end }}
+ resources:
+ requests:
+ storage: {{ .Values.persistence.size | quote }}
+{{- if (eq "fullname" .Values.persistence.storageClassName) }}
+ storageClassName: "{{ template "grafana.fullname" . }}"
+{{- else }}
+ storageClassName: "{{ .Values.persistence.storageClassName }}"
+{{- end }}
+ {{- with .Values.persistence.selectorLabels }}
+ selector:
+ matchLabels:
+{{ toYaml . | indent 6 }}
+ {{- end }}
+{{- end -}}
diff --git a/agw-deployer/helm/charts/grafana/templates/role.yaml b/agw-deployer/helm/charts/grafana/templates/role.yaml
new file mode 100644
index 0000000..54c3fb0
--- /dev/null
+++ b/agw-deployer/helm/charts/grafana/templates/role.yaml
@@ -0,0 +1,32 @@
+{{- if and .Values.rbac.create (not .Values.rbac.useExistingRole) -}}
+apiVersion: {{ template "rbac.apiVersion" . }}
+kind: Role
+metadata:
+ name: {{ template "grafana.fullname" . }}
+ namespace: {{ template "grafana.namespace" . }}
+ labels:
+ {{- include "grafana.labels" . | nindent 4 }}
+{{- with .Values.annotations }}
+ annotations:
+{{ toYaml . | indent 4 }}
+{{- end }}
+{{- if or .Values.rbac.pspEnabled (and .Values.rbac.namespaced (or .Values.sidecar.dashboards.enabled (or .Values.sidecar.datasources.enabled .Values.rbac.extraRoleRules))) }}
+rules:
+{{- if .Values.rbac.pspEnabled }}
+- apiGroups: ['extensions']
+ resources: ['podsecuritypolicies']
+ verbs: ['use']
+ resourceNames: [{{ template "grafana.fullname" . }}]
+{{- end }}
+{{- if and .Values.rbac.namespaced (or .Values.sidecar.dashboards.enabled .Values.sidecar.datasources.enabled) }}
+- apiGroups: [""] # "" indicates the core API group
+ resources: ["configmaps", "secrets"]
+ verbs: ["get", "watch", "list"]
+{{- end }}
+{{- with .Values.rbac.extraRoleRules }}
+{{ toYaml . | indent 0 }}
+{{- end}}
+{{- else }}
+rules: []
+{{- end }}
+{{- end }}
diff --git a/agw-deployer/helm/charts/grafana/templates/rolebinding.yaml b/agw-deployer/helm/charts/grafana/templates/rolebinding.yaml
new file mode 100644
index 0000000..34f1ad6
--- /dev/null
+++ b/agw-deployer/helm/charts/grafana/templates/rolebinding.yaml
@@ -0,0 +1,25 @@
+{{- if .Values.rbac.create -}}
+apiVersion: {{ template "rbac.apiVersion" . }}
+kind: RoleBinding
+metadata:
+ name: {{ template "grafana.fullname" . }}
+ namespace: {{ template "grafana.namespace" . }}
+ labels:
+ {{- include "grafana.labels" . | nindent 4 }}
+{{- with .Values.annotations }}
+ annotations:
+{{ toYaml . | indent 4 }}
+{{- end }}
+roleRef:
+ apiGroup: rbac.authorization.k8s.io
+ kind: Role
+{{- if (not .Values.rbac.useExistingRole) }}
+ name: {{ template "grafana.fullname" . }}
+{{- else }}
+ name: {{ .Values.rbac.useExistingRole }}
+{{- end }}
+subjects:
+- kind: ServiceAccount
+ name: {{ template "grafana.serviceAccountName" . }}
+ namespace: {{ template "grafana.namespace" . }}
+{{- end -}}
diff --git a/agw-deployer/helm/charts/grafana/templates/secret-env.yaml b/agw-deployer/helm/charts/grafana/templates/secret-env.yaml
new file mode 100644
index 0000000..5c09313
--- /dev/null
+++ b/agw-deployer/helm/charts/grafana/templates/secret-env.yaml
@@ -0,0 +1,14 @@
+{{- if .Values.envRenderSecret }}
+apiVersion: v1
+kind: Secret
+metadata:
+ name: {{ template "grafana.fullname" . }}-env
+ namespace: {{ template "grafana.namespace" . }}
+ labels:
+ {{- include "grafana.labels" . | nindent 4 }}
+type: Opaque
+data:
+{{- range $key, $val := .Values.envRenderSecret }}
+ {{ $key }}: {{ $val | b64enc | quote }}
+{{- end -}}
+{{- end }}
diff --git a/agw-deployer/helm/charts/grafana/templates/secret.yaml b/agw-deployer/helm/charts/grafana/templates/secret.yaml
new file mode 100644
index 0000000..4fdd817
--- /dev/null
+++ b/agw-deployer/helm/charts/grafana/templates/secret.yaml
@@ -0,0 +1,22 @@
+{{- if or (and (not .Values.admin.existingSecret) (not .Values.env.GF_SECURITY_ADMIN_PASSWORD__FILE) (not .Values.env.GF_SECURITY_ADMIN_PASSWORD)) (and .Values.ldap.enabled (not .Values.ldap.existingSecret)) }}
+apiVersion: v1
+kind: Secret
+metadata:
+ name: {{ template "grafana.fullname" . }}
+ namespace: {{ template "grafana.namespace" . }}
+ labels:
+ {{- include "grafana.labels" . | nindent 4 }}
+type: Opaque
+data:
+ {{- if and (not .Values.admin.existingSecret) (not .Values.env.GF_SECURITY_ADMIN_PASSWORD__FILE) (not .Values.env.GF_SECURITY_ADMIN_PASSWORD) }}
+ admin-user: {{ .Values.adminUser | b64enc | quote }}
+ {{- if .Values.adminPassword }}
+ admin-password: {{ .Values.adminPassword | b64enc | quote }}
+ {{- else }}
+ admin-password: {{ randAlphaNum 40 | b64enc | quote }}
+ {{- end }}
+ {{- end }}
+ {{- if not .Values.ldap.existingSecret }}
+ ldap-toml: {{ tpl .Values.ldap.config $ | b64enc | quote }}
+ {{- end }}
+{{- end }}
diff --git a/agw-deployer/helm/charts/grafana/templates/service.yaml b/agw-deployer/helm/charts/grafana/templates/service.yaml
new file mode 100644
index 0000000..2764566
--- /dev/null
+++ b/agw-deployer/helm/charts/grafana/templates/service.yaml
@@ -0,0 +1,50 @@
+apiVersion: v1
+kind: Service
+metadata:
+ name: {{ template "grafana.fullname" . }}
+ namespace: {{ template "grafana.namespace" . }}
+ labels:
+ {{- include "grafana.labels" . | nindent 4 }}
+{{- if .Values.service.labels }}
+{{ toYaml .Values.service.labels | indent 4 }}
+{{- end }}
+{{- with .Values.service.annotations }}
+ annotations:
+{{ toYaml . | indent 4 }}
+{{- end }}
+spec:
+{{- if (or (eq .Values.service.type "ClusterIP") (empty .Values.service.type)) }}
+ type: ClusterIP
+ {{- if .Values.service.clusterIP }}
+ clusterIP: {{ .Values.service.clusterIP }}
+ {{end}}
+{{- else if eq .Values.service.type "LoadBalancer" }}
+ type: {{ .Values.service.type }}
+ {{- if .Values.service.loadBalancerIP }}
+ loadBalancerIP: {{ .Values.service.loadBalancerIP }}
+ {{- end }}
+ {{- if .Values.service.loadBalancerSourceRanges }}
+ loadBalancerSourceRanges:
+{{ toYaml .Values.service.loadBalancerSourceRanges | indent 4 }}
+ {{- end -}}
+{{- else }}
+ type: {{ .Values.service.type }}
+{{- end }}
+{{- if .Values.service.externalIPs }}
+ externalIPs:
+{{ toYaml .Values.service.externalIPs | indent 4 }}
+{{- end }}
+ ports:
+ - name: {{ .Values.service.portName }}
+ port: {{ .Values.service.port }}
+ protocol: TCP
+ targetPort: {{ .Values.service.targetPort }}
+{{ if (and (eq .Values.service.type "NodePort") (not (empty .Values.service.nodePort))) }}
+ nodePort: {{.Values.service.nodePort}}
+{{ end }}
+ {{- if .Values.extraExposePorts }}
+ {{- tpl (toYaml .Values.extraExposePorts) . | indent 4 }}
+ {{- end }}
+ selector:
+ {{- include "grafana.selectorLabels" . | nindent 4 }}
+
diff --git a/agw-deployer/helm/charts/grafana/templates/serviceaccount.yaml b/agw-deployer/helm/charts/grafana/templates/serviceaccount.yaml
new file mode 100644
index 0000000..7576eee
--- /dev/null
+++ b/agw-deployer/helm/charts/grafana/templates/serviceaccount.yaml
@@ -0,0 +1,13 @@
+{{- if .Values.serviceAccount.create }}
+apiVersion: v1
+kind: ServiceAccount
+metadata:
+ labels:
+ {{- include "grafana.labels" . | nindent 4 }}
+{{- with .Values.serviceAccount.annotations }}
+ annotations:
+{{ toYaml . | indent 4 }}
+{{- end }}
+ name: {{ template "grafana.serviceAccountName" . }}
+ namespace: {{ template "grafana.namespace" . }}
+{{- end }}
diff --git a/agw-deployer/helm/charts/grafana/templates/servicemonitor.yaml b/agw-deployer/helm/charts/grafana/templates/servicemonitor.yaml
new file mode 100644
index 0000000..2328852
--- /dev/null
+++ b/agw-deployer/helm/charts/grafana/templates/servicemonitor.yaml
@@ -0,0 +1,40 @@
+{{- if .Values.serviceMonitor.enabled }}
+---
+apiVersion: monitoring.coreos.com/v1
+kind: ServiceMonitor
+metadata:
+ name: {{ template "grafana.fullname" . }}
+ {{- if .Values.serviceMonitor.namespace }}
+ namespace: {{ .Values.serviceMonitor.namespace }}
+ {{- end }}
+ labels:
+ {{- include "grafana.labels" . | nindent 4 }}
+ {{- if .Values.serviceMonitor.labels }}
+ {{- toYaml .Values.serviceMonitor.labels | nindent 4 }}
+ {{- end }}
+spec:
+ endpoints:
+ - interval: {{ .Values.serviceMonitor.interval }}
+ {{- if .Values.serviceMonitor.scrapeTimeout }}
+ scrapeTimeout: {{ .Values.serviceMonitor.scrapeTimeout }}
+ {{- end }}
+ honorLabels: true
+ port: {{ .Values.service.portName }}
+ path: {{ .Values.serviceMonitor.path }}
+ scheme: {{ .Values.serviceMonitor.scheme }}
+ {{- if .Values.serviceMonitor.tlsConfig }}
+ tlsConfig:
+ {{- toYaml .Values.serviceMonitor.tlsConfig | nindent 6 }}
+ {{- end }}
+ {{- if .Values.serviceMonitor.relabelings }}
+ relabelings:
+ {{- toYaml .Values.serviceMonitor.relabelings | nindent 4 }}
+ {{- end }}
+ jobLabel: "{{ .Release.Name }}"
+ selector:
+ matchLabels:
+ {{- include "grafana.selectorLabels" . | nindent 8 }}
+ namespaceSelector:
+ matchNames:
+ - {{ .Release.Namespace }}
+{{- end }}
diff --git a/agw-deployer/helm/charts/grafana/templates/statefulset.yaml b/agw-deployer/helm/charts/grafana/templates/statefulset.yaml
new file mode 100644
index 0000000..b2b4616
--- /dev/null
+++ b/agw-deployer/helm/charts/grafana/templates/statefulset.yaml
@@ -0,0 +1,52 @@
+{{- if and .Values.persistence.enabled (not .Values.persistence.existingClaim) (eq .Values.persistence.type "statefulset")}}
+apiVersion: apps/v1
+kind: StatefulSet
+metadata:
+ name: {{ template "grafana.fullname" . }}
+ namespace: {{ template "grafana.namespace" . }}
+ labels:
+ {{- include "grafana.labels" . | nindent 4 }}
+{{- with .Values.annotations }}
+ annotations:
+{{ toYaml . | indent 4 }}
+{{- end }}
+spec:
+ replicas: {{ .Values.replicas }}
+ selector:
+ matchLabels:
+ {{- include "grafana.selectorLabels" . | nindent 6 }}
+ serviceName: {{ template "grafana.fullname" . }}-headless
+ template:
+ metadata:
+ labels:
+ {{- include "grafana.selectorLabels" . | nindent 8 }}
+{{- with .Values.podLabels }}
+{{ toYaml . | indent 8 }}
+{{- end }}
+ annotations:
+ checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }}
+ checksum/dashboards-json-config: {{ include (print $.Template.BasePath "/dashboards-json-configmap.yaml") . | sha256sum }}
+ checksum/sc-dashboard-provider-config: {{ include (print $.Template.BasePath "/configmap-dashboard-provider.yaml") . | sha256sum }}
+ {{- if or (and (not .Values.admin.existingSecret) (not .Values.env.GF_SECURITY_ADMIN_PASSWORD__FILE) (not .Values.env.GF_SECURITY_ADMIN_PASSWORD)) (and .Values.ldap.enabled (not .Values.ldap.existingSecret)) }}
+ checksum/secret: {{ include (print $.Template.BasePath "/secret.yaml") . | sha256sum }}
+{{- end }}
+{{- with .Values.podAnnotations }}
+{{ toYaml . | indent 8 }}
+{{- end }}
+ spec:
+ {{- include "grafana.pod" . | nindent 6 }}
+ volumeClaimTemplates:
+ - metadata:
+ name: storage
+ spec:
+ accessModes: {{ .Values.persistence.accessModes }}
+ storageClassName: {{ .Values.persistence.storageClassName }}
+ resources:
+ requests:
+ storage: {{ .Values.persistence.size }}
+ {{- with .Values.persistence.selectorLabels }}
+ selector:
+ matchLabels:
+{{ toYaml . | indent 10 }}
+ {{- end }}
+{{- end }}
diff --git a/agw-deployer/helm/charts/grafana/templates/tests/test-configmap.yaml b/agw-deployer/helm/charts/grafana/templates/tests/test-configmap.yaml
new file mode 100644
index 0000000..ff53aaf
--- /dev/null
+++ b/agw-deployer/helm/charts/grafana/templates/tests/test-configmap.yaml
@@ -0,0 +1,17 @@
+{{- if .Values.testFramework.enabled }}
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: {{ template "grafana.fullname" . }}-test
+ namespace: {{ template "grafana.namespace" . }}
+ labels:
+ {{- include "grafana.labels" . | nindent 4 }}
+data:
+ run.sh: |-
+ @test "Test Health" {
+ url="http://{{ template "grafana.fullname" . }}/api/health"
+
+ code=$(wget --server-response --spider --timeout 10 --tries 1 ${url} 2>&1 | awk '/^ HTTP/{print $2}')
+ [ "$code" == "200" ]
+ }
+{{- end }}
diff --git a/agw-deployer/helm/charts/grafana/templates/tests/test-podsecuritypolicy.yaml b/agw-deployer/helm/charts/grafana/templates/tests/test-podsecuritypolicy.yaml
new file mode 100644
index 0000000..1acd651
--- /dev/null
+++ b/agw-deployer/helm/charts/grafana/templates/tests/test-podsecuritypolicy.yaml
@@ -0,0 +1,30 @@
+{{- if and .Values.testFramework.enabled .Values.rbac.pspEnabled }}
+apiVersion: policy/v1beta1
+kind: PodSecurityPolicy
+metadata:
+ name: {{ template "grafana.fullname" . }}-test
+ namespace: {{ template "grafana.namespace" . }}
+ labels:
+ {{- include "grafana.labels" . | nindent 4 }}
+spec:
+ allowPrivilegeEscalation: true
+ privileged: false
+ hostNetwork: false
+ hostIPC: false
+ hostPID: false
+ fsGroup:
+ rule: RunAsAny
+ seLinux:
+ rule: RunAsAny
+ supplementalGroups:
+ rule: RunAsAny
+ runAsUser:
+ rule: RunAsAny
+ volumes:
+ - configMap
+ - downwardAPI
+ - emptyDir
+ - projected
+ - csi
+ - secret
+{{- end }}
diff --git a/agw-deployer/helm/charts/grafana/templates/tests/test-role.yaml b/agw-deployer/helm/charts/grafana/templates/tests/test-role.yaml
new file mode 100644
index 0000000..6b10677
--- /dev/null
+++ b/agw-deployer/helm/charts/grafana/templates/tests/test-role.yaml
@@ -0,0 +1,14 @@
+{{- if and .Values.testFramework.enabled .Values.rbac.pspEnabled -}}
+apiVersion: rbac.authorization.k8s.io/v1
+kind: Role
+metadata:
+ name: {{ template "grafana.fullname" . }}-test
+ namespace: {{ template "grafana.namespace" . }}
+ labels:
+ {{- include "grafana.labels" . | nindent 4 }}
+rules:
+- apiGroups: ['policy']
+ resources: ['podsecuritypolicies']
+ verbs: ['use']
+ resourceNames: [{{ template "grafana.fullname" . }}-test]
+{{- end }}
diff --git a/agw-deployer/helm/charts/grafana/templates/tests/test-rolebinding.yaml b/agw-deployer/helm/charts/grafana/templates/tests/test-rolebinding.yaml
new file mode 100644
index 0000000..58fa5e7
--- /dev/null
+++ b/agw-deployer/helm/charts/grafana/templates/tests/test-rolebinding.yaml
@@ -0,0 +1,17 @@
+{{- if and .Values.testFramework.enabled .Values.rbac.pspEnabled -}}
+apiVersion: rbac.authorization.k8s.io/v1
+kind: RoleBinding
+metadata:
+ name: {{ template "grafana.fullname" . }}-test
+ namespace: {{ template "grafana.namespace" . }}
+ labels:
+ {{- include "grafana.labels" . | nindent 4 }}
+roleRef:
+ apiGroup: rbac.authorization.k8s.io
+ kind: Role
+ name: {{ template "grafana.fullname" . }}-test
+subjects:
+- kind: ServiceAccount
+ name: {{ template "grafana.serviceAccountNameTest" . }}
+ namespace: {{ template "grafana.namespace" . }}
+{{- end }}
diff --git a/agw-deployer/helm/charts/grafana/templates/tests/test-serviceaccount.yaml b/agw-deployer/helm/charts/grafana/templates/tests/test-serviceaccount.yaml
new file mode 100644
index 0000000..5c33507
--- /dev/null
+++ b/agw-deployer/helm/charts/grafana/templates/tests/test-serviceaccount.yaml
@@ -0,0 +1,9 @@
+{{- if and .Values.testFramework.enabled .Values.serviceAccount.create }}
+apiVersion: v1
+kind: ServiceAccount
+metadata:
+ labels:
+ {{- include "grafana.labels" . | nindent 4 }}
+ name: {{ template "grafana.serviceAccountNameTest" . }}
+ namespace: {{ template "grafana.namespace" . }}
+{{- end }}
diff --git a/agw-deployer/helm/charts/grafana/templates/tests/test.yaml b/agw-deployer/helm/charts/grafana/templates/tests/test.yaml
new file mode 100644
index 0000000..cdc86e5
--- /dev/null
+++ b/agw-deployer/helm/charts/grafana/templates/tests/test.yaml
@@ -0,0 +1,48 @@
+{{- if .Values.testFramework.enabled }}
+apiVersion: v1
+kind: Pod
+metadata:
+ name: {{ template "grafana.fullname" . }}-test
+ labels:
+ {{- include "grafana.labels" . | nindent 4 }}
+ annotations:
+ "helm.sh/hook": test-success
+ namespace: {{ template "grafana.namespace" . }}
+spec:
+ serviceAccountName: {{ template "grafana.serviceAccountNameTest" . }}
+ {{- if .Values.testFramework.securityContext }}
+ securityContext: {{ toYaml .Values.testFramework.securityContext | nindent 4 }}
+ {{- end }}
+ {{- if .Values.image.pullSecrets }}
+ imagePullSecrets:
+ {{- range .Values.image.pullSecrets }}
+ - name: {{ . }}
+ {{- end}}
+ {{- end }}
+ {{- with .Values.nodeSelector }}
+ nodeSelector:
+{{ toYaml . | indent 4 }}
+ {{- end }}
+ {{- with .Values.affinity }}
+ affinity:
+{{ toYaml . | indent 4 }}
+ {{- end }}
+ {{- with .Values.tolerations }}
+ tolerations:
+{{ toYaml . | indent 4 }}
+ {{- end }}
+ containers:
+ - name: {{ .Release.Name }}-test
+ image: "{{ .Values.testFramework.image}}:{{ .Values.testFramework.tag }}"
+ imagePullPolicy: "{{ .Values.testFramework.imagePullPolicy}}"
+ command: ["/opt/bats/bin/bats", "-t", "/tests/run.sh"]
+ volumeMounts:
+ - mountPath: /tests
+ name: tests
+ readOnly: true
+ volumes:
+ - name: tests
+ configMap:
+ name: {{ template "grafana.fullname" . }}-test
+ restartPolicy: Never
+{{- end }}
diff --git a/agw-deployer/helm/charts/grafana/values.yaml b/agw-deployer/helm/charts/grafana/values.yaml
new file mode 100644
index 0000000..3dcc0e6
--- /dev/null
+++ b/agw-deployer/helm/charts/grafana/values.yaml
@@ -0,0 +1,714 @@
+rbac:
+ create: true
+ ## Use an existing ClusterRole/Role (depending on rbac.namespaced false/true)
+ # useExistingRole: name-of-some-(cluster)role
+ pspEnabled: true
+ pspUseAppArmor: true
+ namespaced: false
+ extraRoleRules: []
+ # - apiGroups: []
+ # resources: []
+ # verbs: []
+ extraClusterRoleRules: []
+ # - apiGroups: []
+ # resources: []
+ # verbs: []
+serviceAccount:
+ create: true
+ name:
+ nameTest:
+# annotations:
+# eks.amazonaws.com/role-arn: arn:aws:iam::123456789000:role/iam-role-name-here
+
+replicas: 1
+
+## See `kubectl explain poddisruptionbudget.spec` for more
+## ref: https://kubernetes.io/docs/tasks/run-application/configure-pdb/
+podDisruptionBudget: {}
+# minAvailable: 1
+# maxUnavailable: 1
+
+## See `kubectl explain deployment.spec.strategy` for more
+## ref: https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#strategy
+deploymentStrategy:
+ type: RollingUpdate
+
+readinessProbe:
+ httpGet:
+ path: /api/health
+ port: 3000
+
+livenessProbe:
+ httpGet:
+ path: /api/health
+ port: 3000
+ initialDelaySeconds: 60
+ timeoutSeconds: 30
+ failureThreshold: 10
+
+## Use an alternate scheduler, e.g. "stork".
+## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/
+##
+# schedulerName: "default-scheduler"
+
+image:
+ repository: grafana/grafana
+ tag: 7.3.5
+ sha: ""
+ pullPolicy: IfNotPresent
+
+ ## Optionally specify an array of imagePullSecrets.
+ ## Secrets must be manually created in the namespace.
+ ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
+ ##
+ # pullSecrets:
+ # - myRegistrKeySecretName
+
+testFramework:
+ enabled: true
+ image: "bats/bats"
+ tag: "v1.1.0"
+ imagePullPolicy: IfNotPresent
+ securityContext: {}
+
+securityContext:
+ runAsUser: 472
+ runAsGroup: 472
+ fsGroup: 472
+
+containerSecurityContext:
+ {}
+
+extraConfigmapMounts: []
+ # - name: certs-configmap
+ # mountPath: /etc/grafana/ssl/
+ # subPath: certificates.crt # (optional)
+ # configMap: certs-configmap
+ # readOnly: true
+
+
+extraEmptyDirMounts: []
+ # - name: provisioning-notifiers
+ # mountPath: /etc/grafana/provisioning/notifiers
+
+
+## Assign a PriorityClassName to pods if set
+# priorityClassName:
+
+downloadDashboardsImage:
+ repository: curlimages/curl
+ tag: 7.73.0
+ sha: ""
+ pullPolicy: IfNotPresent
+
+downloadDashboards:
+ env: {}
+ resources: {}
+
+## Pod Annotations
+# podAnnotations: {}
+
+## Pod Labels
+# podLabels: {}
+
+podPortName: grafana
+
+## Deployment annotations
+# annotations: {}
+
+## Expose the grafana service to be accessed from outside the cluster (LoadBalancer service).
+## or access it from within the cluster (ClusterIP service). Set the service type and the port to serve it.
+## ref: http://kubernetes.io/docs/user-guide/services/
+##
+service:
+ type: NodePort
+ port: 80
+ targetPort: 3000
+ # targetPort: 4181 To be used with a proxy extraContainer
+ annotations: {}
+ labels: {}
+ portName: service
+
+serviceMonitor:
+ ## If true, a ServiceMonitor CRD is created for a prometheus operator
+ ## https://github.com/coreos/prometheus-operator
+ ##
+ enabled: false
+ path: /metrics
+ # namespace: monitoring (defaults to use the namespace this chart is deployed to)
+ labels: {}
+ interval: 1m
+ scheme: http
+ tlsConfig: {}
+ scrapeTimeout: 30s
+ relabelings: []
+
+extraExposePorts: []
+ # - name: keycloak
+ # port: 8080
+ # targetPort: 8080
+ # type: ClusterIP
+
+# overrides pod.spec.hostAliases in the grafana deployment's pods
+hostAliases: []
+ # - ip: "1.2.3.4"
+ # hostnames:
+ # - "my.host.com"
+
+ingress:
+ enabled: true
+ # For Kubernetes >= 1.18 you should specify the ingress-controller via the field ingressClassName
+ # See https://kubernetes.io/blog/2020/04/02/improvements-to-the-ingress-api-in-kubernetes-1.18/#specifying-the-class-of-an-ingress
+ # ingressClassName: nginx
+ # Values can be templated
+ annotations:
+ kubernetes.io/ingress.class: nginx
+ nginx.ingress.kubernetes.io/rewrite-target: /$2
+ # nginx.ingress.kubernetes.io/auth-url: <-- set by 'meepctl deploy' when auth enabled
+ # kubernetes.io/tls-acme: "true"
+ labels: {}
+ path: /grafana(/|$)(.*)
+ hosts:
+ - ''
+ ## Extra paths to prepend to every host configuration. This is useful when working with annotation based services.
+ extraPaths: []
+ # - path: /*
+ # backend:
+ # serviceName: ssl-redirect
+ # servicePort: use-annotation
+ tls: []
+ # - secretName: chart-example-tls
+ # hosts:
+ # - chart-example.local
+
+resources: {}
+# limits:
+# cpu: 100m
+# memory: 128Mi
+# requests:
+# cpu: 100m
+# memory: 128Mi
+
+## Node labels for pod assignment
+## ref: https://kubernetes.io/docs/user-guide/node-selection/
+#
+nodeSelector: {}
+
+## Tolerations for pod assignment
+## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/
+##
+tolerations: []
+
+## Affinity for pod assignment
+## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity
+##
+affinity:
+ nodeAffinity:
+ requiredDuringSchedulingIgnoredDuringExecution:
+ nodeSelectorTerms:
+ - matchExpressions:
+ - key: node-role.kubernetes.io/master
+ operator: Exists
+
+extraInitContainers: []
+
+## Enable an Specify container in extraContainers. This is meant to allow adding an authentication proxy to a grafana pod
+extraContainers: |
+# - name: proxy
+# image: quay.io/gambol99/keycloak-proxy:latest
+# args:
+# - -provider=github
+# - -client-id=
+# - -client-secret=
+# - -github-org=
+# - -email-domain=*
+# - -cookie-secret=
+# - -http-address=http://0.0.0.0:4181
+# - -upstream-url=http://127.0.0.1:3000
+# ports:
+# - name: proxy-web
+# containerPort: 4181
+
+## Volumes that can be used in init containers that will not be mounted to deployment pods
+extraContainerVolumes: []
+# - name: volume-from-secret
+# secret:
+# secretName: secret-to-mount
+# - name: empty-dir-volume
+# emptyDir: {}
+
+## Enable persistence using Persistent Volume Claims
+## ref: http://kubernetes.io/docs/user-guide/persistent-volumes/
+##
+persistence:
+ type: pvc
+ enabled: true
+ # storageClassName: default
+ accessModes:
+ - ReadWriteOnce
+ size: 10Gi
+ # annotations: {}
+ finalizers:
+ - kubernetes.io/pvc-protection
+ # selectorLabels: {}
+ # subPath: ""
+ # existingClaim:
+ ## If defined, storageClassName:
+ ## If set to "fullname", storageClassName:
+ # storageClassName: default
+ storageClassName: "fullname"
+
+## The storage volume
+persistentVolume:
+ enabled: true
+ accessModes:
+ - ReadWriteOnce
+ size: 10Gi
+ reclaimPolicy: Retain
+ location: "/mnt/playground/grafana"
+
+initChownData:
+ ## If false, data ownership will not be reset at startup
+ ## This allows the prometheus-server to be run with an arbitrary user
+ ##
+ enabled: true
+
+ ## initChownData container image
+ ##
+ image:
+ repository: busybox
+ tag: "1.31.1"
+ sha: ""
+ pullPolicy: IfNotPresent
+
+ ## initChownData resource requests and limits
+ ## Ref: http://kubernetes.io/docs/user-guide/compute-resources/
+ ##
+ resources: {}
+ # limits:
+ # cpu: 100m
+ # memory: 128Mi
+ # requests:
+ # cpu: 100m
+ # memory: 128Mi
+
+
+# Administrator credentials when not using an existing secret (see below)
+adminUser: admin
+adminPassword: admin
+
+# Use an existing secret for the admin user.
+admin:
+ existingSecret: ""
+ userKey: admin-user
+ passwordKey: admin-password
+
+## Define command to be executed at startup by grafana container
+## Needed if using `vault-env` to manage secrets (ref: https://banzaicloud.com/blog/inject-secrets-into-pods-vault/)
+## Default is "run.sh" as defined in grafana's Dockerfile
+# command:
+# - "sh"
+# - "/run.sh"
+
+## Use an alternate scheduler, e.g. "stork".
+## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/
+##
+# schedulerName:
+
+## Extra environment variables that will be pass onto deployment pods
+##
+## to provide grafana with access to CloudWatch on AWS EKS:
+## 1. create an iam role of type "Web identity" with provider oidc.eks.* (note the provider for later)
+## 2. edit the "Trust relationships" of the role, add a line inside the StringEquals clause using the
+## same oidc eks provider as noted before (same as the existing line)
+## also, replace NAMESPACE and prometheus-operator-grafana with the service account namespace and name
+##
+## "oidc.eks.us-east-1.amazonaws.com/id/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:sub": "system:serviceaccount:NAMESPACE:prometheus-operator-grafana",
+##
+## 3. attach a policy to the role, you can use a built in policy called CloudWatchReadOnlyAccess
+## 4. use the following env: (replace 123456789000 and iam-role-name-here with your aws account number and role name)
+##
+## env:
+## AWS_ROLE_ARN: arn:aws:iam::123456789000:role/iam-role-name-here
+## AWS_WEB_IDENTITY_TOKEN_FILE: /var/run/secrets/eks.amazonaws.com/serviceaccount/token
+## AWS_REGION: us-east-1
+##
+## 5. uncomment the EKS section in extraSecretMounts: below
+## 6. uncomment the annotation section in the serviceAccount: above
+## make sure to replace arn:aws:iam::123456789000:role/iam-role-name-here with your role arn
+
+env: {}
+
+## "valueFrom" environment variable references that will be added to deployment pods
+## ref: https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.17/#envvarsource-v1-core
+## Renders in container spec as:
+## env:
+## ...
+## - name:
+## valueFrom:
+##
+envValueFrom: {}
+
+## The name of a secret in the same kubernetes namespace which contain values to be added to the environment
+## This can be useful for auth tokens, etc. Value is templated.
+envFromSecret: ""
+
+## Sensible environment variables that will be rendered as new secret object
+## This can be useful for auth tokens, etc
+envRenderSecret: {}
+
+## Additional grafana server secret mounts
+# Defines additional mounts with secrets. Secrets must be manually created in the namespace.
+extraSecretMounts: []
+ # - name: secret-files
+ # mountPath: /etc/secrets
+ # secretName: grafana-secret-files
+ # readOnly: true
+ # subPath: ""
+ #
+ # for AWS EKS (cloudwatch) use the following (see also instruction in env: above)
+ # - name: aws-iam-token
+ # mountPath: /var/run/secrets/eks.amazonaws.com/serviceaccount
+ # readOnly: true
+ # projected:
+ # defaultMode: 420
+ # sources:
+ # - serviceAccountToken:
+ # audience: sts.amazonaws.com
+ # expirationSeconds: 86400
+ # path: token
+ #
+ # for CSI e.g. Azure Key Vault use the following
+ # - name: secrets-store-inline
+ # mountPath: /run/secrets
+ # readOnly: true
+ # csi:
+ # driver: secrets-store.csi.k8s.io
+ # readOnly: true
+ # volumeAttributes:
+ # secretProviderClass: "akv-grafana-spc"
+ # nodePublishSecretRef: # Only required when using service principal mode
+ # name: grafana-akv-creds # Only required when using service principal mode
+
+## Additional grafana server volume mounts
+# Defines additional volume mounts.
+extraVolumeMounts: []
+ # - name: extra-volume
+ # mountPath: /mnt/volume
+ # readOnly: true
+ # existingClaim: volume-claim
+
+## Pass the plugins you want installed as a list.
+##
+plugins: []
+ # - digrich-bubblechart-panel
+ # - grafana-clock-panel
+
+## Configure grafana datasources
+## ref: http://docs.grafana.org/administration/provisioning/#datasources
+##
+datasources:
+ datasources.yaml:
+ apiVersion: 1
+ datasources:
+ - name: Prometheus
+ type: prometheus
+ url: http://meep-prometheus-prometheus:9090
+ access: proxy
+ isDefault: true
+ - name: Thanos
+ type: prometheus
+ url: http://meep-thanos-query:9090
+ access: proxy
+ jsonData:
+ customQueryParameters: "max_source_resolution=1h"
+ disableMetricsLookup: true
+ - name: meep-influxdb
+ type: influxdb
+ access: proxy
+ database: _internal
+ url: "http://meep-influxdb:8086"
+ jsonData:
+ timeInterval: "10s"
+
+## Configure notifiers
+## ref: http://docs.grafana.org/administration/provisioning/#alert-notification-channels
+##
+notifiers: {}
+# notifiers.yaml:
+# notifiers:
+# - name: email-notifier
+# type: email
+# uid: email1
+# # either:
+# org_id: 1
+# # or
+# org_name: Main Org.
+# is_default: true
+# settings:
+# addresses: an_email_address@example.com
+# delete_notifiers:
+
+## Configure grafana dashboard providers
+## ref: http://docs.grafana.org/administration/provisioning/#dashboards
+##
+## `path` must be /var/lib/grafana/dashboards/
+##
+dashboardProviders:
+ dashboardproviders.yaml:
+ apiVersion: 1
+ providers:
+ - name: 'default'
+ orgId: 1
+ folder: ''
+ type: file
+ disableDeletion: false
+ editable: true
+ options:
+ path: /var/lib/grafana/dashboards/default
+
+## Configure grafana dashboard to import
+## NOTE: To use dashboards you must also enable/configure dashboardProviders
+## ref: https://grafana.com/dashboards
+##
+## dashboards per provider, use provider name as key.
+##
+dashboards:
+ default:
+ # some-dashboard:
+ # json: |
+ # $RAW_JSON
+ # custom-dashboard:
+ # file: dashboards/custom-dashboard.json
+ # prometheus-stats:
+ # gnetId: 2
+ # revision: 2
+ # datasource: Prometheus
+ # local-dashboard:
+ # url: https://example.com/repository/test.json
+ # local-dashboard-base64:
+ # url: https://example.com/repository/test-b64.json
+ # b64content: true
+
+## Reference to external ConfigMap per provider. Use provider name as key and ConfigMap name as value.
+## A provider dashboards must be defined either by external ConfigMaps or in values.yaml, not in both.
+## ConfigMap data example:
+##
+## data:
+## example-dashboard.json: |
+## RAW_JSON
+##
+dashboardsConfigMaps: {}
+# default: ""
+
+## Grafana's primary configuration
+## NOTE: values in map will be converted to ini format
+## ref: http://docs.grafana.org/installation/configuration/
+##
+grafana.ini:
+ paths:
+ data: /var/lib/grafana/data
+ logs: /var/log/grafana
+ plugins: /var/lib/grafana/plugins
+ provisioning: /etc/grafana/provisioning
+ analytics:
+ check_for_updates: true
+ log:
+ mode: console
+ grafana_net:
+ url: https://grafana.net
+ ## grafana Authentication can be enabled with the following values on grafana.ini
+ server:
+ # The full public facing url you use in browser, used for redirects and emails
+ root_url: /grafana/
+ auth:
+ login_cookie_name: grafana_session_updated
+ auth.basic:
+ enabled: true
+ auth.anonymous:
+ enabled: true
+ org_role: Viewer
+ security:
+ allow_embedding: true
+ dashboards:
+ min_refresh_interval: 1s
+ # https://grafana.com/docs/grafana/latest/auth/github/#enable-github-in-grafana
+ # auth.github:
+ # enabled: false
+ # allow_sign_up: false
+ # scopes: user:email,read:org
+ # auth_url: https://github.com/login/oauth/authorize
+ # token_url: https://github.com/login/oauth/access_token
+ # api_url: https://api.github.com/user
+ # team_ids:
+ # allowed_organizations:
+ # client_id:
+ # client_secret:
+## LDAP Authentication can be enabled with the following values on grafana.ini
+## NOTE: Grafana will fail to start if the value for ldap.toml is invalid
+ # auth.ldap:
+ # enabled: true
+ # allow_sign_up: true
+ # config_file: /etc/grafana/ldap.toml
+
+## Grafana's LDAP configuration
+## Templated by the template in _helpers.tpl
+## NOTE: To enable the grafana.ini must be configured with auth.ldap.enabled
+## ref: http://docs.grafana.org/installation/configuration/#auth-ldap
+## ref: http://docs.grafana.org/installation/ldap/#configuration
+ldap:
+ enabled: false
+ # `existingSecret` is a reference to an existing secret containing the ldap configuration
+ # for Grafana in a key `ldap-toml`.
+ existingSecret: ""
+ # `config` is the content of `ldap.toml` that will be stored in the created secret
+ config: ""
+ # config: |-
+ # verbose_logging = true
+
+ # [[servers]]
+ # host = "my-ldap-server"
+ # port = 636
+ # use_ssl = true
+ # start_tls = false
+ # ssl_skip_verify = false
+ # bind_dn = "uid=%s,ou=users,dc=myorg,dc=com"
+
+## Grafana's SMTP configuration
+## NOTE: To enable, grafana.ini must be configured with smtp.enabled
+## ref: http://docs.grafana.org/installation/configuration/#smtp
+smtp:
+ # `existingSecret` is a reference to an existing secret containing the smtp configuration
+ # for Grafana.
+ existingSecret: ""
+ userKey: "user"
+ passwordKey: "password"
+
+## Sidecars that collect the configmaps with specified label and stores the included files them into the respective folders
+## Requires at least Grafana 5 to work and can't be used together with parameters dashboardProviders, datasources and dashboards
+sidecar:
+ image:
+ repository: kiwigrid/k8s-sidecar
+ tag: 1.1.0
+ sha: ""
+ imagePullPolicy: IfNotPresent
+ resources: {}
+# limits:
+# cpu: 100m
+# memory: 100Mi
+# requests:
+# cpu: 50m
+# memory: 50Mi
+ # skipTlsVerify Set to true to skip tls verification for kube api calls
+ # skipTlsVerify: true
+ enableUniqueFilenames: false
+ dashboards:
+ enabled: false
+ SCProvider: true
+ # label that the configmaps with dashboards are marked with
+ label: grafana_dashboard
+ # value of label that the configmaps with dashboards are set to
+ labelValue: null
+ # folder in the pod that should hold the collected dashboards (unless `defaultFolderName` is set)
+ folder: /tmp/dashboards
+ # The default folder name, it will create a subfolder under the `folder` and put dashboards in there instead
+ defaultFolderName: null
+ # If specified, the sidecar will search for dashboard config-maps inside this namespace.
+ # Otherwise the namespace in which the sidecar is running will be used.
+ # It's also possible to specify ALL to search in all namespaces
+ searchNamespace: null
+ # If specified, the sidecar will look for annotation with this name to create folder and put graph here.
+ # You can use this parameter together with `provider.foldersFromFilesStructure`to annotate configmaps and create folder structure.
+ folderAnnotation: null
+ # provider configuration that lets grafana manage the dashboards
+ provider:
+ # name of the provider, should be unique
+ name: sidecarProvider
+ # orgid as configured in grafana
+ orgid: 1
+ # folder in which the dashboards should be imported in grafana
+ folder: ''
+ # type of the provider
+ type: file
+ # disableDelete to activate a import-only behaviour
+ disableDelete: false
+ # allow updating provisioned dashboards from the UI
+ allowUiUpdates: false
+ # allow Grafana to replicate dashboard structure from filesystem
+ foldersFromFilesStructure: false
+ datasources:
+ enabled: false
+ # label that the configmaps with datasources are marked with
+ label: grafana_datasource
+ # value of label that the configmaps with datasources are set to
+ labelValue: null
+ # If specified, the sidecar will search for datasource config-maps inside this namespace.
+ # Otherwise the namespace in which the sidecar is running will be used.
+ # It's also possible to specify ALL to search in all namespaces
+ searchNamespace: null
+ notifiers:
+ enabled: false
+ # label that the configmaps with notifiers are marked with
+ label: grafana_notifier
+ # If specified, the sidecar will search for notifier config-maps inside this namespace.
+ # Otherwise the namespace in which the sidecar is running will be used.
+ # It's also possible to specify ALL to search in all namespaces
+ searchNamespace: null
+
+## Override the deployment namespace
+##
+namespaceOverride: ""
+
+## Number of old ReplicaSets to retain
+##
+revisionHistoryLimit: 10
+
+## Add a seperate remote image renderer deployment/service
+imageRenderer:
+ # Enable the image-renderer deployment & service
+ enabled: false
+ replicas: 1
+ image:
+ # image-renderer Image repository
+ repository: grafana/grafana-image-renderer
+ # image-renderer Image tag
+ tag: latest
+ # image-renderer Image sha (optional)
+ sha: ""
+ # image-renderer ImagePullPolicy
+ pullPolicy: Always
+ # extra environment variables
+ env:
+ HTTP_HOST: "0.0.0.0"
+ # RENDERING_ARGS: --disable-gpu,--window-size=1280x758
+ # RENDERING_MODE: clustered
+ # image-renderer deployment serviceAccount
+ serviceAccountName: ""
+ # image-renderer deployment securityContext
+ securityContext: {}
+ # image-renderer deployment Host Aliases
+ hostAliases: []
+ # image-renderer deployment priority class
+ priorityClassName: ''
+ service:
+ # image-renderer service port name
+ portName: 'http'
+ # image-renderer service port used by both service and deployment
+ port: 8081
+ targetPort: 8081
+ # name of the image-renderer port on the pod
+ podPortName: http
+ # number of image-renderer replica sets to keep
+ revisionHistoryLimit: 10
+ networkPolicy:
+ # Enable a NetworkPolicy to limit inbound traffic to only the created grafana pods
+ limitIngress: true
+ # Enable a NetworkPolicy to limit outbound traffic to only the created grafana pods
+ limitEgress: false
+ resources: {}
+# limits:
+# cpu: 100m
+# memory: 100Mi
+# requests:
+# cpu: 50m
+# memory: 50Mi
diff --git a/agw-deployer/helm/charts/helmfile.yaml b/agw-deployer/helm/charts/helmfile.yaml
new file mode 100644
index 0000000..81b589c
--- /dev/null
+++ b/agw-deployer/helm/charts/helmfile.yaml
@@ -0,0 +1,16 @@
+values:
+- openscout_namespace: openscout
+- openrtist_namespace: openrtist
+releases:
+- name: openscout
+ namespace: {{ .Values.openscout_namespace }}
+ chart: ./openscout
+ installed: true
+ values:
+ - openscout/values_arm64.yaml
+- name: openrtist
+ namespace: {{ .Values.openrtist_namespace }}
+ chart: ./openrtist
+ installed: true
+ values:
+ - openrtist/values.yaml
diff --git a/agw-deployer/helm/charts/influxdb/.helmignore b/agw-deployer/helm/charts/influxdb/.helmignore
new file mode 100644
index 0000000..f0c1319
--- /dev/null
+++ b/agw-deployer/helm/charts/influxdb/.helmignore
@@ -0,0 +1,21 @@
+# Patterns to ignore when building packages.
+# This supports shell glob matching, relative path matching, and
+# negation (prefixed with !). Only one pattern per line.
+.DS_Store
+# Common VCS dirs
+.git/
+.gitignore
+.bzr/
+.bzrignore
+.hg/
+.hgignore
+.svn/
+# Common backup files
+*.swp
+*.bak
+*.tmp
+*~
+# Various IDEs
+.project
+.idea/
+*.tmproj
diff --git a/agw-deployer/helm/charts/influxdb/Chart.yaml b/agw-deployer/helm/charts/influxdb/Chart.yaml
new file mode 100644
index 0000000..b81b8fe
--- /dev/null
+++ b/agw-deployer/helm/charts/influxdb/Chart.yaml
@@ -0,0 +1,22 @@
+apiVersion: v2
+appVersion: 1.8.0
+description: Scalable datastore for metrics, events, and real-time analytics.
+home: https://www.influxdata.com/time-series-platform/influxdb/
+keywords:
+- influxdb
+- database
+- timeseries
+- influxdata
+maintainers:
+- email: rawkode@influxdata.com
+ name: rawkode
+- email: giacomo@influxdata.com
+ name: gitirabassi
+- email: urakiny@gmail.com
+ name: aisuko
+- email: naseem@transit.app
+ name: naseemkullah
+name: influxdb
+sources:
+- https://github.com/influxdata/influxdb
+version: 4.8.10
diff --git a/agw-deployer/helm/charts/influxdb/README.md b/agw-deployer/helm/charts/influxdb/README.md
new file mode 100644
index 0000000..d88db9c
--- /dev/null
+++ b/agw-deployer/helm/charts/influxdb/README.md
@@ -0,0 +1,328 @@
+# InfluxDB Helm chart
+
+[InfluxDB](https://github.com/influxdata/influxdb) is an open source time series database with no external dependencies. It's useful for recording metrics, events, and performing analytics.
+
+The InfluxDB Helm chart uses the [Helm](https://helm.sh) package manager to bootstrap an InfluxDB StatefulSet and service on a [Kubernetes](http://kubernetes.io) cluster.
+
+> **Note:** ### If you're using the InfluxDB Enterprise Helm chart, check out [InfluxDB Enterprise Helm chart](#influxdb-enterprise-helm-chart).
+
+## Prerequisites
+
+- Helm v2 or later
+- Kubernetes 1.4+
+- (Optional) PersistentVolume (PV) provisioner support in the underlying infrastructure
+
+## Install the chart
+
+1. Add the InfluxData Helm repository:
+
+ ```bash
+ helm repo add influxdata https://helm.influxdata.com/
+ ```
+
+2. Run the following command, providing a name for your release:
+
+ ```bash
+ helm upgrade --install my-release influxdata/influxdb
+ ```
+
+ > **Tip**: `--install` can be shortened to `-i`.
+
+ This command deploys InfluxDB on the Kubernetes cluster using the default configuration. To find parameters you can configure during installation, see [Configure the chart](#configure-the-chart).
+
+ > **Tip**: To view all Helm chart releases, run `helm list`.
+
+## Uninstall the chart
+
+To uninstall the `my-release` deployment, use the following command:
+
+```bash
+helm uninstall my-release
+```
+
+This command removes all the Kubernetes components associated with the chart and deletes the release.
+
+## Configure the chart
+
+The following table lists configurable parameters, their descriptions, and their default values stored in `values.yaml`.
+
+| Parameter | Description | Default |
+|---|---|---|
+| image.repository | Image repository url | influxdb |
+| image.tag | Image tag | 1.8.0-alpine |
+| image.pullPolicy | Image pull policy | IfNotPresent |
+| image.pullSecrets | It will store the repository's credentials to pull image | nil |
+| serviceAccount.create | It will create service account | true |
+| serviceAccount.name | Service account name | "" |
+| serviceAccount.annotations | Service account annotations | {} |
+| livenessProbe | Health check for pod | {} |
+| readinessProbe | Health check for pod | {} |
+| startupProbe | Health check for pod | {} |
+| service.type | Kubernetes service type | ClusterIP |
+| service.loadBalancerIP | A user-specified IP address for service type LoadBalancer to use as External IP (if supported) | nil |
+| service.externalIPs | A user-specified list of externalIPs to add to the service | nil |
+| service.externalTrafficPolicy | A user specified external traffic policy | nil |
+| persistence.enabled | Boolean to enable and disable persistance | true |
+| persistence.existingClaim | An existing PersistentVolumeClaim, ignored if enterprise.enabled=true | nil |
+| persistence.storageClass | If set to "-", storageClassName: "", which disables dynamic provisioning. If undefined (the default) or set to null, no storageClassName spec is set, choosing the default provisioner. (gp2 on AWS, standard on GKE, AWS & OpenStack | |
+| persistence.annotations | Annotations for volumeClaimTemplates | nil |
+| persistence.accessMode | Access mode for the volume | ReadWriteOnce |
+| persistence.size | Storage size | 8Gi |
+| podAnnotations | Annotations for pod | {} |
+| podLabels | Labels for pod | {} |
+| ingress.enabled | Boolean flag to enable or disable ingress | false |
+| ingress.tls | Boolean to enable or disable tls for ingress. If enabled provide a secret in `ingress.secretName` containing TLS private key and certificate. | false |
+| ingress.secretName | Kubernetes secret containing TLS private key and certificate. It is `only` required if `ingress.tls` is enabled. | nil |
+| ingress.hostname | Hostname for the ingress | influxdb.foobar.com |
+| annotations | ingress annotations | nil |
+| schedulerName | Use an [alternate scheduler](https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/), e.g. "stork". | nil |
+| nodeSelector | Node labels for pod assignment | {} |
+| affinity | [Affinity](https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity) for pod assignment | {|
+| tolerations | [Tolerations](https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/) for pod assignment | [] |
+| securityContext | [securityContext](https://kubernetes.io/docs/tasks/configure-pod-container/security-context/) for pod | {} |
+| env | environment variables for influxdb container | {} |
+| volumes | `volumes` stanza(s) to be used in the main container | nil |
+| mountPoints | `volumeMount` stanza(s) to be used in the main container | nil |
+| extraContainers | Additional containers to be added to the pod | {} |
+| config.reporting_disabled | [Details](https://docs.influxdata.com/influxdb/v1.7/administration/config/#reporting-disabled-false) | false |
+| config.rpc | RPC address for backup and storage | {} |
+| config.meta | [Details](https://docs.influxdata.com/influxdb/v1.7/administration/config/#meta) | {} |
+| config.data | [Details](https://docs.influxdata.com/influxdb/v1.7/administration/config/#data) | {} |
+| config.coordinator | [Details](https://docs.influxdata.com/influxdb/v1.7/administration/config/#coordinator) | {} |
+| config.retention | [Details](https://docs.influxdata.com/influxdb/v1.7/administration/config/#retention) | {} |
+| config.shard_precreation | [Details](https://docs.influxdata.com/influxdb/v1.7/administration/config/#shard-precreation) | {} |
+| config.monitor | [Details](https://docs.influxdata.com/influxdb/v1.7/administration/config/#monitor) | {} |
+| config.http | [Details](https://docs.influxdata.com/influxdb/v1.7/administration/config/#http) | {} |
+| config.logging | [Details](https://docs.influxdata.com/influxdb/v1.7/administration/config/#logging) | {} |
+| config.subscriber | [Details](https://docs.influxdata.com/influxdb/v1.7/administration/config/#subscriber) | {} |
+| config.graphite | [Details](https://docs.influxdata.com/influxdb/v1.7/administration/config/#graphite) | {} |
+| config.collectd | [Details](https://docs.influxdata.com/influxdb/v1.7/administration/config/#collectd) | {} |
+| config.opentsdb | [Details](https://docs.influxdata.com/influxdb/v1.7/administration/config/#opentsdb) | {} |
+| config.udp | [Details](https://docs.influxdata.com/influxdb/v1.7/administration/config/#udp) | {} |
+| config.continous_queries | [Details](https://docs.influxdata.com/influxdb/v1.7/administration/config/#continuous-queries) | {} |
+| config.tls | [Details](https://docs.influxdata.com/influxdb/v1.7/administration/config/#tls) | {} |
+| initScripts.enabled | Boolean flag to enable and disable initscripts. If the container finds any files with the extensions .sh or .iql inside of the /docker-entrypoint-initdb.d folder, it will execute them. The order they are executed in is determined by the shell. This is usually alphabetical order. | false |
+| initScripts.scripts | Init scripts | {} |
+| backup.enabled | Enable backups, if `true` must configure one of the storage providers | `false` |
+| backup.gcs | Google Cloud Storage config | `nil`
+| backup.azure | Azure Blob Storage config | `nil`
+| backup.s3 | Amazon S3 (or compatible) config | `nil`
+| backup.schedule | Schedule to run jobs in cron format | `0 0 * * *` |
+| backup.startingDeadlineSeconds | Deadline in seconds for starting the job if it misses its scheduled time for any reason | `nil` |
+| backup.annotations | Annotations for backup cronjob | {} |
+| backup.podAnnotations | Annotations for backup cronjob pods | {} |
+| backup.persistence.enabled | Boolean to enable and disable persistance | false |
+| backup.persistence.storageClass | If set to "-", storageClassName: "", which disables dynamic provisioning. If undefined (the default) or set to null, no storageClassName spec is set, choosing the default provisioner. (gp2 on AWS, standard on GKE, AWS & OpenStack | |
+| backup.persistence.annotations | Annotations for volumeClaimTemplates | nil |
+| backup.persistence.accessMode | Access mode for the volume | ReadWriteOnce |
+| backup.persistence.size | Storage size | 8Gi |
+| backup.resources | Resources requests and limits for `backup` pods | `ephemeral-storage: 8Gi` |
+
+To configure the chart, do either of the following:
+
+- Specify each parameter using the `--set key=value[,key=value]` argument to `helm upgrade --install`. For example:
+
+ ```bash
+ helm upgrade --install my-release \
+ --set persistence.enabled=true,persistence.size=200Gi \
+ influxdata/influxdb
+ ```
+
+ This command enables persistence and changes the size of the requested data volume to 200GB.
+
+- Provide a YAML file that specifies the parameter values while installing the chart. For example, use the following command:
+
+ ```bash
+ helm upgrade --install my-release -f values.yaml influxdata/influxdb
+ ```
+
+ > **Tip**: Use the default [values.yaml](values.yaml).
+
+For information about running InfluxDB in Docker, see the [full image documentation](https://hub.docker.com/_/influxdb/).
+
+### InfluxDB Enterprise Helm chart
+
+[InfluxDB Enterprise](https://www.influxdata.com/products/influxdb-enterprise/) includes features designed for production workloads, including high availability and horizontal scaling. InfluxDB Enterprise requires an InfluxDB Enterprise license.
+
+#### Configure the InfluxDB Enterprise chart
+
+To enable InfluxDB Enterprise, set the following keys and values in a values file provided to Helm.
+
+| Key | Description | Recommended value |
+| --- | --- | --- |
+| `livenessProbe.initalDelaySeconds` | Used to allow enough time to join meta nodes to a cluster | `3600` |
+| `image.tag` | Set to a `data` image. See https://hub.docker.com/_/influxdb for details | `data` |
+| `service.ClusterIP` | Use a headless service for StatefulSets | `"None"` |
+| `env.name[_HOSTNAME]` | Used to provide a unique `name.service` for InfluxDB. See [values.yaml]() for an example | `valueFrom.fieldRef.fieldPath: metadata.name` |
+| `enterprise.enabled` | Create StatefulSets for use with `influx-data` and `influx-meta` images | `true` |
+| `enterprise.licensekey` | License for InfluxDB Enterprise | |
+| `enterprise.clusterSize` | Replicas for `influx` StatefulSet | Dependent on license |
+| `enterprise.meta.image.tag` | Set to an `meta` image. See https://hub.docker.com/_/influxdb for details | `meta` |
+| `enterprise.meta.clusterSize` | Replicas for `influxdb-meta` StatefulSet. | `3` |
+| `enterprise.meta.resources` | Resources requests and limits for meta `influxdb-meta` pods | See `values.yaml` |
+
+#### Join pods to InfluxDB Enterprise cluster
+
+Meta and data pods must be joined using the command `influxd-ctl` found on meta pods.
+We recommend running `influxd-ctl` on one and only one meta pod and joining meta pods together before data pods. For each meta pod, run `influxd-ctl`.
+
+In the following examples, we use the pod names `influxdb-meta-0` and `influxdb-0` and the service name `influxdb`.
+
+For example, using the default settings, your script should look something like this:
+
+```shell script
+kubectl exec influxdb-meta-0 influxd-ctl add-meta influxdb-meta-0.influxdb-meta:8091
+```
+
+From the same meta pod, for each data pod, run `influxd-ctl`. With default settings, your script should look something like this:
+
+```shell script
+kubectl exec influxdb-meta-0 influxd-ctl add-data influxdb-0.influxdb:8088
+```
+
+When using `influxd-ctl`, use the appropriate DNS name for your pods, following the naming scheme of `pod.service`.
+
+## Persistence
+
+The [InfluxDB](https://hub.docker.com/_/influxdb/) image stores data in the `/var/lib/influxdb` directory in the container.
+
+If persistence is enabled, a [Persistent Volume](http://kubernetes.io/docs/user-guide/persistent-volumes/) associated with StatefulSet is provisioned. The volume is created using dynamic volume provisioning. In case of a disruption (for example, a node drain), Kubernetes ensures that the same volume is reattached to the Pod, preventing any data loss. However, when persistence is **not enabled**, InfluxDB data is stored in an empty directory, so if a Pod restarts, data is lost.
+
+## Start with authentication
+
+In `values.yaml`, change `.Values.config.http.auth-enabled` to `true`.
+
+> **Note:** To enforce authentication, InfluxDB requires an admin user to be set up. For details, see [Set up authentication](https://docs.influxdata.com/influxdb/v1.2/query_language/authentication_and_authorization/#set-up-authentication).
+
+To handle this set up during startup, enable a job in `values.yaml` by setting `.Values.setDefaultUser.enabled` to `true`.
+
+Make sure to uncomment or configure the job settings after enabling it. If a password is not set, a random password will be generated.
+
+Alternatively, if `.Values.setDefaultUser.user.existingSecret` is set the user and password are obtained from an existing Secret, the expected keys are `influxdb-user` and `influxdb-password`. Use this variable if you need to check in the `values.yaml` in a repository to avoid exposing your secrets.
+
+## Back up and restore
+
+Before proceeding, please read [Backing up and restoring in InfluxDB OSS](https://docs.influxdata.com/influxdb/v1.7/administration/backup_and_restore/). While the chart offers backups by means of the [`backup-cronjob`](./templates/backup-cronjob.yaml), restores do not fall under the chart's scope today but can be achieved by one-off kubernetes jobs.
+
+### Backups
+
+When enabled, the[`backup-cronjob`](./templates/backup-cronjob.yaml) runs on the configured schedule. One can create a job from the backup cronjob on demand as follows:
+
+```sh
+kubectl create job --from=cronjobs/influxdb-backup influx-backup-$(date +%Y%m%d%H%M%S)
+```
+
+#### Backup Storage
+
+The backup process consists of an init-container that writes the backup to a
+local volume, which is by default an `emptyDir`, shared to the runtime container
+which uploads the backup to the configured object store.
+
+In order to avoid filling the node's disk space, it is recommended to set a sufficient
+`ephemeral-storage` request or enable persistence, which allocates a PVC.
+
+Furthermore, if no object store provider is available, one can simply use the
+PVC as the final storage destination when `persistence` is enabled.
+
+### Restores
+
+It is up to the end user to configure their own one-off restore jobs. Below is just an example, which assumes that the backups are stored in GCS and that all dbs in the backup already exist and should be restored. It is to be used as a reference only; configure the init-container and the command and of the `influxdb-restore` container as well as both containers' resources to suit your needs.
+
+```yaml
+apiVersion: batch/v1
+kind: Job
+metadata:
+ generateName: influxdb-restore-
+ namespace: monitoring
+spec:
+ template:
+ spec:
+ volumes:
+ - name: backup
+ emptyDir: {}
+ serviceAccountName: influxdb
+ initContainers:
+ - name: init-gsutil-cp
+ image: google/cloud-sdk:alpine
+ command:
+ - /bin/sh
+ args:
+ - "-c"
+ - |
+ gsutil -m cp -r gs:///* /backup
+ volumeMounts:
+ - name: backup
+ mountPath: /backup
+ resources:
+ requests:
+ cpu: 1
+ memory: 4Gi
+ limits:
+ cpu: 2
+ memory: 8Gi
+ containers:
+ - name: influxdb-restore
+ image: influxdb:1.7-alpine
+ volumeMounts:
+ - name: backup
+ mountPath: /backup
+ command:
+ - /bin/sh
+ args:
+ - "-c"
+ - |
+ #!/bin/sh
+ INFLUXDB_HOST=influxdb.monitoring.svc
+ for db in $(influx -host $INFLUXDB_HOST -execute 'SHOW DATABASES' | tail -n +5); do
+ influxd restore -host $INFLUXDB_HOST:8088 -portable -db "$db" -newdb "$db"_bak /backup
+ done
+ resources:
+ requests:
+ cpu: 100m
+ memory: 128Mi
+ limits:
+ cpu: 500m
+ memory: 512Mi
+ restartPolicy: OnFailure
+```
+
+At which point the data from the new `_bak` dbs would have to be side loaded into the original dbs.
+Please see [InfluxDB documentation for more restore examples](https://docs.influxdata.com/influxdb/v1.7/administration/backup_and_restore/#restore-examples).
+
+## Mounting Extra Volumes
+
+Extra volumes can be mounted by providing the `volumes` and `mountPoints` keys, consistent
+with the behavior of other charts provided by Influxdata.
+
+```yaml
+volumes:
+- name: ssl-cert-volume
+ secret:
+ secretName: secret-name
+mountPoints:
+- name: ssl-cert-volume
+ mountPath: /etc/ssl/certs/selfsigned/
+ readOnly: true
+```
+
+## Upgrading
+
+### From < 1.0.0 To >= 1.0.0
+
+Values `.Values.config.bind_address` and `.Values.exposeRpc` no longer exist. They have been replaced with `.Values.config.rpc.bind_address` and `.Values.config.rpc.enabled` respectively. Please adjust your values file accordingly.
+
+### From < 1.5.0 to >= 2.0.0
+
+The Kubernetes API change to support 1.160 may not be backwards compatible and may require the chart to be uninstalled in order to upgrade. See [this issue](https://github.com/helm/helm/issues/6583) for some background.
+
+### From < 3.0.0 to >= 3.0.0
+
+Since version 3.0.0 this chart uses a StatefulSet instead of a Deployment. As part of this update the existing persistent volume (and all data) is deleted and a new one is created. Make sure to backup and restore the data manually.
+
+### From < 4.0.0 to >= 4.0.0
+
+Labels are changed in accordance with [Kubernetes recommended labels](https://kubernetes.io/docs/concepts/overview/working-with-objects/common-labels/\#labels). This change also removes the ability to configure clusterIP value to avoid `Error: UPGRADE FAILED: failed to replace object: Service "my-influxdb" is invalid: spec.clusterIP: Invalid value: "": field is immutable` type errors. For more information on this error and why it's important to avoid this error, please see [this Github issue](https://github.com/helm/helm/issues/6378#issuecomment-582764215).
+
+Due to the significance of the changes, we recommend uninstalling and reinstalling the chart (although the PVC shouldn't be deleted during this process, we highly recommended backing up your data beforehand).
+
+Check out our [Slack channel](https://www.influxdata.com/slack) for support and information.
diff --git a/agw-deployer/helm/charts/influxdb/files/backup-retention-script.sh b/agw-deployer/helm/charts/influxdb/files/backup-retention-script.sh
new file mode 100644
index 0000000..913794a
--- /dev/null
+++ b/agw-deployer/helm/charts/influxdb/files/backup-retention-script.sh
@@ -0,0 +1,66 @@
+#! /usr/bin/env bash
+
+set -e
+
+# This script wants these variable to be set.
+
+## S3_BUCKET <- The name of the bucket where the backups are stored
+## S3_ENDPOINT <- The endpoint of the S3 service
+## AWS_ACCESS_KEY_ID <- Access credentials
+## AWS_SECRET_ACCESS_KEY <- Access credentials
+## DAYS_TO_RETAIN <- The TTL for the backups === number of backups to keep.
+
+# Sanity check to avoid removing all backups.
+[[ "$DAYS_TO_RETAIN" -lt 1 ]] && DAYS_TO_RETAIN=1
+
+function get_records {
+ before_date="$1"
+
+ aws s3api list-objects \
+ --bucket ${S3_BUCKET} \
+ --endpoint-url ${S3_ENDPOINT} \
+ --query "Contents[?LastModified<='${before_date}'][].{Key: Key}"
+}
+
+function remove_old_backups {
+ before_date=$(date --iso-8601=seconds -d "-${DAYS_TO_RETAIN} days")
+ now=$(date --iso-8601=seconds)
+
+ del_records=$(get_records "${before_date}")
+ all_records=$(get_records "${now}")
+
+ del_paths=()
+ all_paths=()
+
+ function _jq {
+ echo ${row} | base64 --decode | jq -r ${1}
+ }
+
+ for row in $(echo "${del_records}" | jq -r '.[] | @base64'); do
+ del_paths+=($(_jq '.Key'))
+ done
+
+ for row in $(echo "${all_records}" | jq -r '.[] | @base64'); do
+ all_paths+=($(_jq '.Key'))
+ done
+
+ # Number of backups left if all old backups are removed.
+ left=$((${#all_paths[@]} - ${#del_paths[@]}))
+
+ # We ALWAYS keep N backups even if their TTL has expired!
+ if (( ${left} < ${DAYS_TO_RETAIN} )); then
+ num_to_delete=$((${#all_paths[@]} - ${DAYS_TO_RETAIN}))
+ else
+ num_to_delete=${#del_paths[@]}
+ fi
+
+ for path in "${del_paths[@]::${num_to_delete}}"; do
+ aws s3 rm "s3://${S3_BUCKET}/${path}" \
+ --endpoint-url "${S3_ENDPOINT}"
+ done
+}
+
+# Installs jq.
+yum install -y jq
+
+remove_old_backups
diff --git a/agw-deployer/helm/charts/influxdb/templates/NOTES.txt b/agw-deployer/helm/charts/influxdb/templates/NOTES.txt
new file mode 100644
index 0000000..41ffa05
--- /dev/null
+++ b/agw-deployer/helm/charts/influxdb/templates/NOTES.txt
@@ -0,0 +1,42 @@
+InfluxDB can be accessed via port {{ .Values.config.http.bind_address | default 8086 }} on the following DNS name from within your cluster:
+
+ http://{{ include "influxdb.fullname" . }}.{{ .Release.Namespace }}:{{ .Values.config.http.bind_address | default 8086 }}
+
+You can connect to the remote instance with the influx CLI. To forward the API port to localhost:8086, run the following:
+
+ kubectl port-forward --namespace {{ .Release.Namespace }} $(kubectl get pods --namespace {{ .Release.Namespace }} -l app={{ include "influxdb.fullname" . }} -o jsonpath='{ .items[0].metadata.name }') 8086:{{ .Values.config.http.bind_address | default 8086 }}
+
+You can also connect to the influx CLI from inside the container. To open a shell session in the InfluxDB pod, run the following:
+
+ kubectl exec -i -t --namespace {{ .Release.Namespace }} $(kubectl get pods --namespace {{ .Release.Namespace }} -l app={{ include "influxdb.fullname" . }} -o jsonpath='{.items[0].metadata.name}') /bin/sh
+
+To view the logs for the InfluxDB pod, run the following:
+
+ kubectl logs -f --namespace {{ .Release.Namespace }} $(kubectl get pods --namespace {{ .Release.Namespace }} -l app={{ include "influxdb.fullname" . }} -o jsonpath='{ .items[0].metadata.name }')
+
+{{- if .Values.setDefaultUser.enabled }}
+
+To retrieve the default user name:
+
+{{- if .Values.setDefaultUser.user.existingSecret }}
+
+ echo $(kubectl get secret {{ .Values.setDefaultUser.user.existingSecret }} -o "jsonpath={.data['influxdb-user']}" --namespace {{ .Release.Namespace }} | base64 --decode)
+
+{{- else }}
+
+ echo $(kubectl get secret {{ include "influxdb.fullname" . }}-auth -o "jsonpath={.data['influxdb-user']}" --namespace {{ .Release.Namespace }} | base64 --decode)
+
+{{- end }}
+
+To retrieve the default user password:
+
+{{- if .Values.setDefaultUser.user.existingSecret }}
+
+ echo $(kubectl get secret {{ .Values.setDefaultUser.user.existingSecret }} -o "jsonpath={.data['influxdb-password']}" --namespace {{ .Release.Namespace }} | base64 --decode)
+
+{{- else }}
+
+ echo $(kubectl get secret {{ include "influxdb.fullname" . }}-auth -o "jsonpath={.data['influxdb-password']}" --namespace {{ .Release.Namespace }} | base64 --decode)
+
+{{- end }}
+{{- end }}
diff --git a/agw-deployer/helm/charts/influxdb/templates/_helpers.tpl b/agw-deployer/helm/charts/influxdb/templates/_helpers.tpl
new file mode 100644
index 0000000..a983951
--- /dev/null
+++ b/agw-deployer/helm/charts/influxdb/templates/_helpers.tpl
@@ -0,0 +1,65 @@
+{{/* vim: set filetype=mustache: */}}
+{{/*
+Expand the name of the chart.
+*/}}
+{{- define "influxdb.name" -}}
+{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+{{/*
+Create a default fully qualified app name.
+We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
+If release name contains chart name it will be used as a full name.
+*/}}
+{{- define "influxdb.fullname" -}}
+{{- if .Values.fullnameOverride -}}
+{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}}
+{{- else -}}
+{{- $name := default .Chart.Name .Values.nameOverride -}}
+{{- if contains $name .Release.Name -}}
+{{- .Release.Name | trunc 63 | trimSuffix "-" -}}
+{{- else -}}
+{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Create chart name and version as used by the chart label.
+*/}}
+{{- define "influxdb.chart" -}}
+{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+{{/*
+Common labels
+*/}}
+{{- define "influxdb.labels" -}}
+helm.sh/chart: {{ include "influxdb.chart" . }}
+{{ include "influxdb.selectorLabels" . }}
+{{- if .Chart.AppVersion }}
+app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
+{{- end }}
+app.kubernetes.io/managed-by: {{ .Release.Service }}
+{{- end -}}
+
+{{/*
+Selector labels
+*/}}
+{{- define "influxdb.selectorLabels" -}}
+app.kubernetes.io/name: {{ include "influxdb.name" . }}
+app.kubernetes.io/instance: {{ .Release.Name }}
+app: {{ include "influxdb.name" . }}
+release: {{ .Release.Name }}
+{{- end -}}
+
+{{/*
+Create the name of the service account to use
+*/}}
+{{- define "influxdb.serviceAccountName" -}}
+{{- if .Values.serviceAccount.create -}}
+ {{ default (include "influxdb.fullname" .) .Values.serviceAccount.name }}
+{{- else -}}
+ {{ default "default" .Values.serviceAccount.name }}
+{{- end -}}
+{{- end -}}
diff --git a/agw-deployer/helm/charts/influxdb/templates/backup-cronjob.yaml b/agw-deployer/helm/charts/influxdb/templates/backup-cronjob.yaml
new file mode 100644
index 0000000..50ee5ee
--- /dev/null
+++ b/agw-deployer/helm/charts/influxdb/templates/backup-cronjob.yaml
@@ -0,0 +1,158 @@
+{{- if .Values.backup.enabled }}
+apiVersion: batch/v1beta1
+kind: CronJob
+metadata:
+ name: {{ include "influxdb.fullname" . }}-backup
+ labels:
+ {{- include "influxdb.labels" . | nindent 4 }}
+ app.kubernetes.io/component: backup
+ annotations:
+ {{- toYaml .Values.backup.annotations | nindent 4 }}
+spec:
+ schedule: {{ .Values.backup.schedule | quote }}
+ successfulJobsHistoryLimit: 0
+ failedJobsHistoryLimit: 0
+ startingDeadlineSeconds: {{ .Values.backup.startingDeadlineSeconds }}
+ concurrencyPolicy: Forbid
+ jobTemplate:
+ spec:
+ template:
+ metadata:
+ {{- if .Values.backup.podAnnotations }}
+ annotations:
+ {{ toYaml .Values.backup.podAnnotations | nindent 12 }}
+ {{- end }}
+ labels:
+ {{- include "influxdb.selectorLabels" . | nindent 12 }}
+ spec:
+ restartPolicy: OnFailure
+ volumes:
+ - name: backup
+ {{- if .Values.backup.persistence.enabled }}
+ persistentVolumeClaim:
+ claimName: {{ include "influxdb.fullname" . }}-backup
+ {{- else }}
+ emptyDir: {}
+ {{- end }}
+ {{- if .Values.backup.gcs }}
+ {{- if .Values.backup.gcs.serviceAccountSecret }}
+ - name: google-cloud-key
+ secret:
+ secretName: {{ .Values.backup.gcs.serviceAccountSecret | quote }}
+ {{- end }}
+ {{- end }}
+ {{- if .Values.backup.s3 }}
+ {{- if .Values.backup.s3.credentialsSecret }}
+ - name: aws-credentials-secret
+ secret:
+ secretName: {{ .Values.backup.s3.credentialsSecret | quote }}
+ {{- end }}
+ {{- end }}
+ serviceAccountName: {{ include "influxdb.serviceAccountName" . }}
+ initContainers:
+ - name: influxdb-backup
+ image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
+ volumeMounts:
+ - name: backup
+ mountPath: /backup
+ command:
+ - /bin/sh
+ args:
+ - '-c'
+ - |
+ influxd backup \
+ -host {{ include "influxdb.fullname" . }}.{{ .Release.Namespace }}.svc:{{ .Values.config.rpc.bind_address | default 8088 }} \
+ -portable /backup/"$(date +%Y%m%d%H%M%S)"
+ resources:
+ {{- toYaml .Values.backup.resources | nindent 14 }}
+ containers:
+ {{- if .Values.backup.gcs }}
+ - name: gsutil-cp
+ image: google/cloud-sdk:alpine
+ command:
+ - /bin/sh
+ args:
+ - '-c'
+ - '-e'
+ - |
+ if [ -n "$KEY_FILE" ]; then
+ gcloud auth activate-service-account --key-file $KEY_FILE
+ fi
+ gsutil -m cp -r /backup/* "$DST_URL"
+ rm -rf /backup/*
+ volumeMounts:
+ - name: backup
+ mountPath: /backup
+ {{- if .Values.backup.gcs.serviceAccountSecretKey}}
+ - name: google-cloud-key
+ mountPath: /var/secrets/google/
+ {{- end }}
+ env:
+ - name: DST_URL
+ value: {{ .Values.backup.gcs.destination}}
+ {{- if .Values.backup.gcs.serviceAccountSecretKey}}
+ - name: KEY_FILE
+ value: /var/secrets/google/{{ .Values.backup.gcs.serviceAccountSecretKey }}
+ {{- end }}
+ resources:
+ {{- toYaml .Values.backup.resources | nindent 14 }}
+ {{- end }}
+ {{- if .Values.backup.azure }}
+ - name: azure-cli
+ image: microsoft/azure-cli
+ command:
+ - /bin/sh
+ args:
+ - '-c'
+ - '-e'
+ - |
+ az storage container create --name "$DST_CONTAINER"
+ az storage blob upload-batch --destination "$DST_CONTAINER" --destination-path "$DST_PATH" --source "$SRC_URL"
+ rm -rf /backup/*
+ volumeMounts:
+ - name: backup
+ mountPath: /backup
+ env:
+ - name: SRC_URL
+ value: /backup
+ - name: DST_CONTAINER
+ value: {{ .Values.backup.azure.destination_container }}
+ - name: DST_PATH
+ value: {{ .Values.backup.azure.destination_path }}
+ - name: AZURE_STORAGE_CONNECTION_STRING
+ valueFrom:
+ secretKeyRef:
+ name: {{ .Values.backup.azure.storageAccountSecret }}
+ key: connection-string
+ resources:
+ {{- toYaml .Values.backup.resources | nindent 14 }}
+ {{- end }}
+ {{- if .Values.backup.s3 }}
+ - name: aws-cli
+ image: amazon/aws-cli
+ command:
+ - /bin/sh
+ args:
+ - '-c'
+ - '-e'
+ - |
+ aws {{- if .Values.backup.s3.endpointUrl }} --endpoint-url={{ .Values.backup.s3.endpointUrl }} {{- end }} s3 cp --recursive "$SRC_URL" "$DST_URL"
+ rm -rf /backup/*
+ volumeMounts:
+ - name: backup
+ mountPath: /backup
+ {{- if .Values.backup.s3.credentialsSecret}}
+ - name: aws-credentials-secret
+ mountPath: /var/secrets/aws/
+ {{- end }}
+ env:
+ - name: AWS_CONFIG_FILE
+ value: /var/secrets/aws/credentials
+ - name: SRC_URL
+ value: /backup
+ - name: DST_URL
+ value: {{ .Values.backup.s3.destination }}
+ resources:
+ {{- toYaml .Values.backup.resources | nindent 14 }}
+ {{- end }}
+{{- end }}
diff --git a/agw-deployer/helm/charts/influxdb/templates/backup-pvc.yaml b/agw-deployer/helm/charts/influxdb/templates/backup-pvc.yaml
new file mode 100644
index 0000000..ebf4ba1
--- /dev/null
+++ b/agw-deployer/helm/charts/influxdb/templates/backup-pvc.yaml
@@ -0,0 +1,21 @@
+{{- if and .Values.backup.enabled .Values.backup.persistence.enabled }}
+kind: PersistentVolumeClaim
+apiVersion: v1
+metadata:
+ name: {{ include "influxdb.fullname" . }}-backup
+ labels:
+ {{- include "influxdb.labels" . | nindent 4 }}
+spec:
+ accessModes:
+ - {{ .Values.backup.persistence.accessMode | quote }}
+ resources:
+ requests:
+ storage: {{ .Values.backup.persistence.size | quote }}
+{{- if .Values.backup.persistence.storageClass }}
+{{- if (eq "-" .Values.backup.persistence.storageClass) }}
+ storageClassName: ""
+{{- else }}
+ storageClassName: "{{ .Values.backup.persistence.storageClass }}"
+{{- end }}
+{{- end }}
+{{- end }}
diff --git a/agw-deployer/helm/charts/influxdb/templates/backup-retention-configmap.yaml b/agw-deployer/helm/charts/influxdb/templates/backup-retention-configmap.yaml
new file mode 100644
index 0000000..d158eb5
--- /dev/null
+++ b/agw-deployer/helm/charts/influxdb/templates/backup-retention-configmap.yaml
@@ -0,0 +1,11 @@
+{{- if .Values.backupRetention.enabled }}
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: {{ include "influxdb.fullname" . }}-backup-retention
+ labels:
+ {{- include "influxdb.labels" . | nindent 4 }}
+data:
+ backup-retention.sh: |-
+ {{- .Files.Get "files/backup-retention-script.sh" | nindent 4 }}
+{{- end }}
diff --git a/agw-deployer/helm/charts/influxdb/templates/backup-retention-cronjob.yaml b/agw-deployer/helm/charts/influxdb/templates/backup-retention-cronjob.yaml
new file mode 100644
index 0000000..a3b0bc5
--- /dev/null
+++ b/agw-deployer/helm/charts/influxdb/templates/backup-retention-cronjob.yaml
@@ -0,0 +1,77 @@
+{{- if .Values.backupRetention.enabled }}
+apiVersion: batch/v1beta1
+kind: CronJob
+metadata:
+ name: {{ include "influxdb.fullname" . }}-backup-retention
+ labels:
+ {{- include "influxdb.labels" . | nindent 4 }}
+ app.kubernetes.io/component: backup-retention
+ annotations:
+ {{- toYaml .Values.backupRetention.annotations | nindent 4 }}
+spec:
+ schedule: {{ .Values.backupRetention.schedule | quote }}
+ successfulJobsHistoryLimit: 0
+ failedJobsHistoryLimit: 0
+ startingDeadlineSeconds: {{ .Values.backupRetention.startingDeadlineSeconds }}
+ concurrencyPolicy: Forbid
+ jobTemplate:
+ spec:
+ template:
+ metadata:
+ {{- if .Values.backupRetention.podAnnotations }}
+ annotations:
+ {{ toYaml .Values.backupRetention.podAnnotations | nindent 12 }}
+ {{- end }}
+ labels:
+ {{- include "influxdb.selectorLabels" . | nindent 12 }}
+ spec:
+ restartPolicy: OnFailure
+ volumes:
+ - name: scripts
+ configMap:
+ name: {{ include "influxdb.fullname" . }}-backup-retention
+ {{- if .Values.backupRetention.gcs }}
+ {{- if .Values.backupRetention.gcs.serviceAccountSecret }}
+ - name: google-cloud-key
+ secret:
+ secretName: {{ .Values.backupRetention.gcs.serviceAccountSecret | quote }}
+ {{- end }}
+ {{- end }}
+ {{- if .Values.backupRetention.s3 }}
+ {{- if .Values.backupRetention.s3.credentialsSecret }}
+ - name: aws-credentials-secret
+ secret:
+ secretName: {{ .Values.backupRetention.s3.credentialsSecret | quote }}
+ {{- end }}
+ {{- end }}
+ serviceAccountName: {{ include "influxdb.serviceAccountName" . }}
+ containers:
+ {{- if .Values.backupRetention.gcs }}
+ {{- end }}
+ {{- if .Values.backupRetention.azure }}
+ {{- end }}
+ {{- if .Values.backupRetention.s3 }}
+ - name: aws-cli
+ image: amazon/aws-cli
+ command: ['/bin/bash']
+ args: ['/scripts/backup-retention.sh']
+ volumeMounts:
+ - name: scripts
+ mountPath: /scripts
+ {{- if .Values.backupRetention.s3.credentialsSecret}}
+ - name: aws-credentials-secret
+ mountPath: /var/secrets/aws/
+ {{- end }}
+ env:
+ - name: AWS_CONFIG_FILE
+ value: /var/secrets/aws/credentials
+ - name: DAYS_TO_RETAIN
+ value: {{ .Values.backupRetention.daysToRetain | quote }}
+ - name: S3_BUCKET
+ value: {{ .Values.backupRetention.s3.bucketName }}
+ - name: S3_ENDPOINT
+ value: {{ .Values.backupRetention.s3.endpointUrl }}
+ resources:
+ {{- toYaml .Values.backupRetention.resources | nindent 14 }}
+ {{- end }}
+{{- end }}
diff --git a/agw-deployer/helm/charts/influxdb/templates/configmap.yaml b/agw-deployer/helm/charts/influxdb/templates/configmap.yaml
new file mode 100644
index 0000000..f5e99fb
--- /dev/null
+++ b/agw-deployer/helm/charts/influxdb/templates/configmap.yaml
@@ -0,0 +1,194 @@
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: {{ include "influxdb.fullname" . }}
+ labels:
+ {{- include "influxdb.labels" . | nindent 4 }}
+data:
+ influxdb.conf: |+
+ reporting-disabled = {{ .Values.config.reporting_disabled | default false }}
+ bind-address = ":{{ .Values.config.rpc.bind_address | default 8088 }}"
+
+ [meta]
+ dir = "/var/lib/influxdb/meta"
+ {{- range $key, $value := index .Values.config.meta }}
+ {{- $tp := typeOf $value }}
+ {{- if eq $tp "string" }}
+ {{ $key }} = {{ $value | quote }}
+ {{- else }}
+ {{ $key }} = {{ $value }}
+ {{- end }}
+ {{- end }}
+
+ {{- if .Values.enterprise.enabled }}
+ internal-shared-secret = "{{ sha256sum .Values.enterprise.meta.seed }}"
+ meta-auth-enabled = {{ .Values.config.meta.authEnabled }}
+ {{- end }}
+
+ [data]
+ dir = "/var/lib/influxdb/data"
+ wal-dir = "/var/lib/influxdb/wal"
+ {{- range $key, $value := index .Values.config.data }}
+ {{- $tp := typeOf $value }}
+ {{- if eq $tp "string" }}
+ {{ $key }} = {{ $value | quote }}
+ {{- else }}
+ {{ $key }} = {{ $value }}
+ {{- end }}
+ {{- end }}
+
+ [coordinator]
+ {{- range $key, $value := index .Values.config.coordinator }}
+ {{- $tp := typeOf $value }}
+ {{- if eq $tp "string" }}
+ {{ $key }} = {{ $value | quote }}
+ {{- else }}
+ {{ $key }} = {{ $value }}
+ {{- end }}
+ {{- end }}
+
+ [retention]
+ {{- range $key, $value := index .Values.config.retention }}
+ {{- $tp := typeOf $value }}
+ {{- if eq $tp "string" }}
+ {{ $key }} = {{ $value | quote }}
+ {{- else }}
+ {{ $key }} = {{ $value }}
+ {{- end }}
+ {{- end }}
+
+ [shard-precreation]
+ {{- range $key, $value := index .Values.config.shard_precreation }}
+ {{- $tp := typeOf $value }}
+ {{- if eq $tp "string" }}
+ {{ $key }} = {{ $value | quote }}
+ {{- else }}
+ {{ $key }} = {{ $value }}
+ {{- end }}
+ {{- end }}
+
+ [admin]
+ {{- range $key, $value := index .Values.config.admin }}
+ {{- $tp := typeOf $value }}
+ {{- if eq $tp "string" }}
+ {{ $key }} = {{ $value | quote }}
+ {{- else }}
+ {{ $key }} = {{ $value }}
+ {{- end }}
+ {{- end }}
+
+ [monitor]
+ {{- range $key, $value := index .Values.config.monitor }}
+ {{- $tp := typeOf $value }}
+ {{- if eq $tp "string" }}
+ {{ $key }} = {{ $value | quote }}
+ {{- else }}
+ {{ $key }} = {{ $value }}
+ {{- end }}
+ {{- end }}
+
+ [subscriber]
+ {{- range $key, $value := index .Values.config.subscriber }}
+ {{- $tp := typeOf $value }}
+ {{- if eq $tp "string" }}
+ {{ $key }} = {{ $value | quote }}
+ {{- else }}
+ {{ $key }} = {{ $value }}
+ {{- end }}
+ {{- end }}
+
+ [http]
+ {{- range $key, $value := index .Values.config.http }}
+ {{- $tp := typeOf $value }}
+ {{- if eq $tp "string" }}
+ {{ $key }} = {{ $value | quote }}
+ {{- else }}
+ {{ $key }} = {{ $value }}
+ {{- end }}
+ {{- end }}
+
+ # TODO: allow multiple graphite listeners
+
+ [[graphite]]
+ {{- range $key, $value := index .Values.config.graphite }}
+ {{- if ne $key "templates"}}
+ {{- $tp := typeOf $value }}
+ {{- if eq $tp "string" }}
+ {{ $key }} = {{ $value | quote }}
+ {{- else }}
+ {{ $key }} = {{ $value }}
+ {{- end }}
+ {{- end }}
+ {{- end }}
+ {{- if .Values.config.graphite.templates }}
+ templates = [
+ {{- range .Values.config.graphite.templates }}
+ {{ quote . }},
+ {{- end }}
+ ]
+ {{- end }}
+
+ # TODO: allow multiple collectd listeners with templates
+
+ [[collectd]]
+ {{- range $key, $value := index .Values.config.collectd }}
+ {{- $tp := typeOf $value }}
+ {{- if eq $tp "string" }}
+ {{ $key }} = {{ $value | quote }}
+ {{- else }}
+ {{ $key }} = {{ $value }}
+ {{- end }}
+ {{- end }}
+
+ # TODO: allow multiple opentsdb listeners with templates
+
+ [[opentsdb]]
+ {{- range $key, $value := index .Values.config.opentsdb }}
+ {{- $tp := typeOf $value }}
+ {{- if eq $tp "string" }}
+ {{ $key }} = {{ $value | quote }}
+ {{- else }}
+ {{ $key }} = {{ $value }}
+ {{- end }}
+ {{- end }}
+
+ # TODO: allow multiple udp listeners with templates
+
+ [[udp]]
+ {{- range $key, $value := index .Values.config.udp }}
+ {{- $tp := typeOf $value }}
+ {{- if eq $tp "string" }}
+ {{ $key }} = {{ $value | quote }}
+ {{- else }}
+ {{ $key }} = {{ $value }}
+ {{- end }}
+ {{- end }}
+
+ [continuous_queries]
+ {{- range $key, $value := index .Values.config.continuous_queries }}
+ {{- $tp := typeOf $value }}
+ {{- if eq $tp "string" }}
+ {{ $key }} = {{ $value | quote }}
+ {{- else }}
+ {{ $key }} = {{ $value }}
+ {{- end }}
+ {{- end }}
+
+ [logging]
+ {{- range $key, $value := index .Values.config.logging }}
+ {{- $tp := typeOf $value }}
+ {{- if eq $tp "string" }}
+ {{ $key }} = {{ $value | quote }}
+ {{- else }}
+ {{ $key }} = {{ $value }}
+ {{- end }}
+ {{- end }}
+
+ {{ if .Values.enterprise.enabled -}}
+ [enterprise]
+ license-key = {{ .Values.enterprise.licensekey | quote }}
+
+ [hinted-handoff]
+ enabled = true
+ dir = "/var/lib/influxdb/hh"
+ {{- end }}
diff --git a/agw-deployer/helm/charts/influxdb/templates/ingress.yaml b/agw-deployer/helm/charts/influxdb/templates/ingress.yaml
new file mode 100644
index 0000000..45632f6
--- /dev/null
+++ b/agw-deployer/helm/charts/influxdb/templates/ingress.yaml
@@ -0,0 +1,27 @@
+{{- if .Values.ingress.enabled -}}
+apiVersion: networking.k8s.io/v1beta1
+kind: Ingress
+metadata:
+ name: {{ include "influxdb.fullname" . }}
+ labels:
+ {{- include "influxdb.labels" . | nindent 4 }}
+ annotations:
+{{ toYaml .Values.ingress.annotations | indent 4 }}
+spec:
+{{- if .Values.ingress.tls }}
+ tls:
+ - hosts:
+ - {{ .Values.ingress.hostname | quote }}
+ secretName: {{ .Values.ingress.secretName }}
+{{- end }}
+ rules:
+ - http:
+ paths:
+ - path: {{ .Values.ingress.path }}
+ backend:
+ serviceName: {{ template "influxdb.fullname" . }}
+ servicePort: 8086
+ {{- if .Values.ingress.hostname }}
+ host: {{ .Values.ingress.hostname }}
+ {{- end }}
+{{- end -}}
diff --git a/agw-deployer/helm/charts/influxdb/templates/init-config.yaml b/agw-deployer/helm/charts/influxdb/templates/init-config.yaml
new file mode 100644
index 0000000..5f60898
--- /dev/null
+++ b/agw-deployer/helm/charts/influxdb/templates/init-config.yaml
@@ -0,0 +1,10 @@
+{{- if .Values.initScripts.enabled -}}
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: {{ include "influxdb.fullname" . }}-init
+ labels:
+ {{- include "influxdb.labels" . | nindent 4 }}
+data:
+{{ toYaml .Values.initScripts.scripts | indent 2 }}
+{{- end -}}
diff --git a/agw-deployer/helm/charts/influxdb/templates/meta-configmap.yaml b/agw-deployer/helm/charts/influxdb/templates/meta-configmap.yaml
new file mode 100644
index 0000000..8e312d1
--- /dev/null
+++ b/agw-deployer/helm/charts/influxdb/templates/meta-configmap.yaml
@@ -0,0 +1,35 @@
+{{ if .Values.enterprise.enabled -}}
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: {{ include "influxdb.fullname" . }}-meta
+ labels:
+ {{- include "influxdb.labels" . | nindent 4 }}
+ app.kubernetes.io/component: meta
+data:
+ influxdb-meta.conf: |+
+ reporting-disabled = {{ .Values.config.reporting_disabled | default false }}
+ bind-address = ":{{ .Values.config.meta.bind_address | default 8091 }}"
+
+ [enterprise]
+ license-key = {{ .Values.enterprise.licensekey | quote }}
+
+ [meta]
+ dir = "/var/lib/influxdb/meta"
+ {{- range $key, $value := index .Values.config.meta }}
+ {{ $key }} = {{ $value }}
+ {{- end }}
+ {{- if .Values.enterprise.enabled }}
+ meta-auth-enabled = {{ .Values.config.meta.authEnabled }}
+ {{- end }}
+
+ [logging]
+ {{- range $key, $value := index .Values.config.logging }}
+ {{ $key }} = {{ $value }}
+ {{- end }}
+
+ [tls]
+ {{- range $key, $value := index .Values.config.tls }}
+ {{ $key }} = {{ $value }}
+ {{- end }}
+{{- end }}
diff --git a/agw-deployer/helm/charts/influxdb/templates/meta-service.yaml b/agw-deployer/helm/charts/influxdb/templates/meta-service.yaml
new file mode 100644
index 0000000..78d18e5
--- /dev/null
+++ b/agw-deployer/helm/charts/influxdb/templates/meta-service.yaml
@@ -0,0 +1,25 @@
+{{ if .Values.enterprise.enabled -}}
+apiVersion: v1
+kind: Service
+metadata:
+{{- if .Values.service.annotations }}
+ annotations:
+{{ toYaml .Values.service.annotations | indent 4 }}
+{{- end }}
+ name: {{ include "influxdb.fullname" . }}-meta
+ labels:
+ {{- include "influxdb.labels" . | nindent 4 }}
+ app.kubernets.io/component: meta
+spec:
+ type: ClusterIP
+ clusterIP: None
+ # publishNotReadyAddresses is used for service discovery of meta and data nodes by querying the service's SRV record.
+ publishNotReadyAddresses: true
+ ports:
+ - name: meta
+ port: {{ .Values.config.meta.bind_address | default 8091 }}
+ targetPort: meta
+ selector:
+ {{- include "influxdb.selectorLabels" . | nindent 4 }}
+ app.kubernets.io/component: meta
+{{- end }}
diff --git a/agw-deployer/helm/charts/influxdb/templates/meta-statefulset.yaml b/agw-deployer/helm/charts/influxdb/templates/meta-statefulset.yaml
new file mode 100644
index 0000000..16b35c4
--- /dev/null
+++ b/agw-deployer/helm/charts/influxdb/templates/meta-statefulset.yaml
@@ -0,0 +1,132 @@
+{{- if .Values.enterprise.enabled }}
+apiVersion: apps/v1
+kind: StatefulSet
+metadata:
+ name: {{ include "influxdb.fullname" . }}-meta
+ labels:
+ {{- include "influxdb.labels" . | nindent 4 }}
+ app.kubernetes.io/component: meta
+spec:
+ replicas: {{ .Values.enterprise.meta.clusterSize }}
+ selector:
+ matchLabels:
+ {{- include "influxdb.selectorLabels" . | nindent 6 }}
+ app.kubernetes.io/component: meta
+ serviceName: "{{ include "influxdb.fullname" . }}-meta"
+ template:
+ metadata:
+ labels:
+ {{- include "influxdb.selectorLabels" . | nindent 8 }}
+ app.kubernetes.io/component: meta
+ {{- if .Values.podAnnotations }}
+ annotations:
+{{ toYaml .Values.podAnnotations | indent 8 }}
+ {{- end }}
+ spec:
+ {{- if .Values.image.pullSecrets }}
+ imagePullSecrets:
+ {{- range .Values.image.pullSecrets }}
+ - name: {{ . }}
+ {{- end}}
+ {{- end }}
+ serviceAccountName: {{ include "influxdb.serviceAccountName" . }}
+ containers:
+ - name: "{{ include "influxdb.fullname" . }}-meta"
+ image: "{{ .Values.image.repository }}:{{ .Values.enterprise.meta.image.tag }}"
+ imagePullPolicy: {{ .Values.image.pullPolicy | quote }}
+ resources:
+{{ toYaml .Values.enterprise.meta.resources | indent 10 }}
+ ports:
+ - name: udp
+ containerPort: {{ .Values.config.udp.bind_address | default 8089 }}
+ - name: rpc
+ containerPort: {{ .Values.config.rpc.bind_address | default 8088 }}
+ - name: meta
+ containerPort: {{ .Values.config.meta.bind_address | default 8091 }}
+ {{- if .Values.env }}
+ env:
+{{ toYaml .Values.env | indent 10 }}
+ # Values.env's HOSTNAME isn't fundamentally different from $HOSTNAME, but this way we get a distinguished name for InfluxDB at runtime.
+ - name: INFLUXDB_HOSTNAME
+ value: "$(_HOSTNAME).{{ include "influxdb.fullname" . }}-meta"
+ {{- end }}
+ livenessProbe:
+ httpGet:
+ path: {{ .Values.livenessProbe.path | default "/ping" }}
+ port: meta
+ initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds | default 30 }}
+ timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds | default 5 }}
+ readinessProbe:
+ httpGet:
+ path: {{ .Values.readinessProbe.path | default "/ping" }}
+ port: meta
+ initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds | default 5 }}
+ timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds | default 1 }}
+ {{- if .Values.startupProbe.enabled }}
+ startupProbe:
+ httpGet:
+ path: {{ .Values.startupProbe.path | default "/ping" }}
+ port: meta
+ failureThreshold: {{ .Values.startupProbe.failureThreshold | default 6 }}
+ periodSeconds: {{ .Values.startupProbe.periodSeconds | default 5 }}
+ {{- end }}
+ volumeMounts:
+ - name: {{ include "influxdb.fullname" . }}-meta
+ mountPath: /var/lib/influxdb
+ - name: config
+ mountPath: /etc/influxdb
+ {{- if .Values.initScripts.enabled }}
+ - name: init
+ mountPath: /docker-entrypoint-initdb.d
+ {{- end }}
+ volumes:
+ - name: config
+ configMap:
+ name: {{ include "influxdb.fullname" . }}-meta
+ {{- if .Values.initScripts.enabled }}
+ - name: init
+ configMap:
+ name: {{ include "influxdb.fullname" . }}-init
+ {{- end }}
+ {{- if (not .Values.persistence.enabled ) }}
+ - name: {{ include "influxdb.fullname" . }}-meta
+ emptyDir: {}
+ {{- end }}
+ {{- if .Values.schedulerName }}
+ schedulerName: "{{ .Values.schedulerName }}"
+ {{- end }}
+ {{- if .Values.nodeSelector }}
+ nodeSelector:
+{{ toYaml .Values.nodeSelector | indent 8 }}
+ {{- end -}}
+ {{- if .Values.affinity }}
+ affinity:
+{{ toYaml .Values.affinity | indent 8 }}
+ {{- end }}
+ {{- if .Values.tolerations }}
+ tolerations:
+{{ toYaml .Values.tolerations | indent 8 }}
+ {{- end }}
+ {{- if .Values.persistence.enabled }}
+ volumeClaimTemplates:
+ - metadata:
+ name: {{ include "influxdb.fullname" . }}-meta
+ annotations:
+ {{- range $key, $value := .Values.persistence.annotations }}
+ {{ $key }}: "{{ $value }}"
+ {{- end }}
+ spec:
+ accessModes:
+ - {{ .Values.persistence.accessMode | quote}}
+ resources:
+ requests:
+ storage: {{ .Values.persistence.size | quote }}
+ {{- if .Values.persistence.storageClass }}
+ {{- if (eq "-" .Values.persistence.storageClass) }}
+ storageClassName: ""
+ {{- else }}
+ storageClassName: "{{ .Values.persistence.storageClass }}"
+ {{- end }}
+ {{- end }}
+ {{- end }}
+{{- end }}
diff --git a/agw-deployer/helm/charts/influxdb/templates/persistentvolume.yaml b/agw-deployer/helm/charts/influxdb/templates/persistentvolume.yaml
new file mode 100644
index 0000000..5b0ba1c
--- /dev/null
+++ b/agw-deployer/helm/charts/influxdb/templates/persistentvolume.yaml
@@ -0,0 +1,17 @@
+{{- if .Values.persistence.enabled}}
+kind: PersistentVolume
+apiVersion: v1
+metadata:
+ name: {{ template "influxdb.fullname" . }}
+ labels:
+ {{- include "influxdb.labels" . | nindent 4 }}
+spec:
+ capacity:
+ storage: {{ .Values.persistence.size }}
+ accessModes:
+ - {{ .Values.persistence.accessMode | quote}}
+ persistentVolumeReclaimPolicy: {{ .Values.persistence.reclaimPolicy }}
+ hostPath:
+ path: "{{.Values.persistence.location}}"
+ storageClassName: {{ template "influxdb.fullname" . }}
+{{- end }}
diff --git a/agw-deployer/helm/charts/influxdb/templates/persistentvolumeclaim.yaml b/agw-deployer/helm/charts/influxdb/templates/persistentvolumeclaim.yaml
new file mode 100644
index 0000000..9c801e2
--- /dev/null
+++ b/agw-deployer/helm/charts/influxdb/templates/persistentvolumeclaim.yaml
@@ -0,0 +1,31 @@
+{{- if .Values.persistence.enabled -}}
+{{- if not .Values.persistence.existingClaim -}}
+apiVersion: "v1"
+kind: "PersistentVolumeClaim"
+metadata:
+{{- if .Values.persistence.annotations }}
+ annotations:
+{{ toYaml .Values.persistence.annotations | indent 4 }}
+{{- end }}
+ labels:
+ {{- include "influxdb.labels" . | nindent 4 }}
+ name: {{ template "influxdb.fullname" . }}
+spec:
+ accessModes:
+ - {{ .Values.persistence.accessMode | quote}}
+{{- if .Values.persistence.storageClass }}
+{{- if (eq "-" .Values.persistence.storageClass) }}
+ storageClassName: ""
+{{- else }}
+{{- if (eq "fullname" .Values.persistence.storageClass) }}
+ storageClassName: "{{ template "influxdb.fullname" . }}"
+{{- else }}
+ storageClassName: "{{ .Values.persistence.storageClass }}"
+{{- end }}
+{{- end }}
+{{- end }}
+ resources:
+ requests:
+ storage: "{{ .Values.persistence.size }}"
+{{- end -}}
+{{- end -}}
diff --git a/agw-deployer/helm/charts/influxdb/templates/post-install-set-auth.yaml b/agw-deployer/helm/charts/influxdb/templates/post-install-set-auth.yaml
new file mode 100644
index 0000000..aa77667
--- /dev/null
+++ b/agw-deployer/helm/charts/influxdb/templates/post-install-set-auth.yaml
@@ -0,0 +1,49 @@
+{{- if .Values.setDefaultUser.enabled -}}
+apiVersion: batch/v1
+kind: Job
+metadata:
+ name: {{ include "influxdb.fullname" . }}-set-auth
+ labels:
+ {{- include "influxdb.labels" . | nindent 4 }}
+ annotations:
+ "helm.sh/hook": post-install
+ "helm.sh/hook-delete-policy": {{ .Values.setDefaultUser.hookDeletePolicy }}
+spec:
+ activeDeadlineSeconds: {{ .Values.setDefaultUser.activeDeadlineSeconds }}
+ backoffLimit: {{ .Values.setDefaultUser.backoffLimit }}
+ template:
+ metadata:
+ labels:
+ {{- include "influxdb.selectorLabels" . | nindent 8 }}
+ spec:
+ containers:
+ - name: {{ include "influxdb.fullname" . }}-set-auth
+ image: "{{ .Values.setDefaultUser.image }}"
+ env:
+ - name: INFLUXDB_USER
+ valueFrom:
+ secretKeyRef:
+ {{- if .Values.setDefaultUser.user.existingSecret }}
+ name: {{ .Values.setDefaultUser.user.existingSecret -}}
+ {{ else }}
+ name: {{ include "influxdb.fullname" . }}-auth
+ {{- end }}
+ key: influxdb-user
+ - name: INFLUXDB_PASSWORD
+ valueFrom:
+ secretKeyRef:
+ {{- if .Values.setDefaultUser.user.existingSecret }}
+ name: {{ .Values.setDefaultUser.user.existingSecret -}}
+ {{ else }}
+ name: {{ include "influxdb.fullname" . }}-auth
+ {{- end }}
+ key: influxdb-password
+ args:
+ - "/bin/sh"
+ - "-c"
+ - |
+ curl -X POST http://{{ include "influxdb.fullname" . }}:{{ .Values.config.http.bind_address | default 8086 }}/query \
+ --data-urlencode \
+ "q=CREATE USER \"${INFLUXDB_USER}\" WITH PASSWORD '${INFLUXDB_PASSWORD}' {{ .Values.setDefaultUser.user.privileges }}"
+ restartPolicy: {{ .Values.setDefaultUser.restartPolicy }}
+{{- end -}}
diff --git a/agw-deployer/helm/charts/influxdb/templates/secret.yaml b/agw-deployer/helm/charts/influxdb/templates/secret.yaml
new file mode 100644
index 0000000..c6390f1
--- /dev/null
+++ b/agw-deployer/helm/charts/influxdb/templates/secret.yaml
@@ -0,0 +1,17 @@
+{{- if .Values.setDefaultUser.enabled -}}
+{{- if not (.Values.setDefaultUser.user.existingSecret) -}}
+apiVersion: v1
+kind: Secret
+metadata:
+ name: {{ include "influxdb.fullname" . }}-auth
+ labels:
+ {{- include "influxdb.labels" . | nindent 4 }}
+data:
+ {{- if .Values.setDefaultUser.user.password }}
+ influxdb-password: {{ .Values.setDefaultUser.user.password | b64enc | quote }}
+ {{- else }}
+ influxdb-password: {{ randAlphaNum 10 | b64enc | quote }}
+ {{- end }}
+ influxdb-user: {{ .Values.setDefaultUser.user.username | b64enc | quote }}
+{{- end -}}
+{{- end -}}
diff --git a/agw-deployer/helm/charts/influxdb/templates/service.yaml b/agw-deployer/helm/charts/influxdb/templates/service.yaml
new file mode 100644
index 0000000..2eb6566
--- /dev/null
+++ b/agw-deployer/helm/charts/influxdb/templates/service.yaml
@@ -0,0 +1,59 @@
+apiVersion: v1
+kind: Service
+metadata:
+{{- if .Values.service.annotations }}
+ annotations:
+{{ toYaml .Values.service.annotations | indent 4 }}
+{{- end }}
+ name: {{ include "influxdb.fullname" . }}
+ labels:
+ {{- include "influxdb.labels" . | nindent 4 }}
+spec:
+ type: {{ .Values.service.type }}
+ ports:
+ - name: api
+ port: {{ .Values.config.http.bind_address | default 8086 }}
+ targetPort: api
+ {{- if .Values.service.apiNodePort }}
+ nodePort: {{ .Values.service.apiNodePort }}
+ {{- end }}
+ - name: rpc
+ port: {{ .Values.config.rpc.bind_address | default 8088 }}
+ targetPort: rpc
+ {{- if .Values.service.rpcNodePort }}
+ nodePort: {{ .Values.service.rpcNodePort }}
+ {{- end }}
+ {{- if .Values.config.graphite.enabled }}
+ - name: graphite
+ port: {{ .Values.config.graphite.bind_address | default 2003 }}
+ targetPort: graphite
+ {{- end }}
+ {{- if .Values.config.collectd.enabled }}
+ - name: collectd
+ port: {{ .Values.config.collectd.bind_address | default 25826 }}
+ protocol: UDP
+ targetPort: collectd
+ {{- end }}
+ {{- if .Values.config.udp.enabled }}
+ - name: udp
+ port: {{ .Values.config.udp.bind_address | default 8089 }}
+ protocol: UDP
+ targetPort: udp
+ {{- end }}
+ {{- if .Values.config.opentsdb.enabled }}
+ - name: opentsdb
+ port: {{ .Values.config.opentsdb.bind_address | default 4242 }}
+ targetPort: opentsdb
+ {{- end }}
+ selector:
+ {{- include "influxdb.selectorLabels" . | nindent 4 }}
+{{- if .Values.service.loadBalancerIP }}
+ loadBalancerIP: {{ .Values.service.loadBalancerIP }}
+{{- end }}
+{{- if .Values.service.externalIPs }}
+ externalIPs:
+{{ toYaml .Values.service.externalIPs | indent 4 }}
+{{- end }}
+{{- if .Values.service.externalTrafficPolicy }}
+ externalTrafficPolicy: {{ .Values.service.externalTrafficPolicy }}
+{{- end }}
diff --git a/agw-deployer/helm/charts/influxdb/templates/serviceaccount.yaml b/agw-deployer/helm/charts/influxdb/templates/serviceaccount.yaml
new file mode 100644
index 0000000..c496696
--- /dev/null
+++ b/agw-deployer/helm/charts/influxdb/templates/serviceaccount.yaml
@@ -0,0 +1,12 @@
+{{- if .Values.serviceAccount.create -}}
+apiVersion: v1
+kind: ServiceAccount
+metadata:
+ name: {{ include "influxdb.serviceAccountName" . }}
+ labels:
+ {{- include "influxdb.labels" . | nindent 4 }}
+ {{- with .Values.serviceAccount.annotations }}
+ annotations:
+ {{- toYaml . | nindent 4 }}
+ {{- end }}
+{{- end -}}
diff --git a/agw-deployer/helm/charts/influxdb/templates/statefulset.yaml b/agw-deployer/helm/charts/influxdb/templates/statefulset.yaml
new file mode 100644
index 0000000..06d58a4
--- /dev/null
+++ b/agw-deployer/helm/charts/influxdb/templates/statefulset.yaml
@@ -0,0 +1,161 @@
+apiVersion: apps/v1
+kind: StatefulSet
+metadata:
+ name: {{ include "influxdb.fullname" . }}
+ labels:
+ {{- include "influxdb.labels" . | nindent 4 }}
+spec:
+ {{- if .Values.enterprise.enabled }}
+ replicas: {{ .Values.enterprise.clusterSize }}
+ {{ else }}
+ replicas: 1
+ {{- end}}
+ selector:
+ matchLabels:
+ {{- include "influxdb.selectorLabels" . | nindent 6 }}
+ serviceName: "{{ include "influxdb.fullname" . }}"
+ template:
+ metadata:
+ labels:
+ {{- include "influxdb.selectorLabels" . | nindent 8 }}
+ {{- if .Values.podAnnotations }}
+ annotations:
+{{ toYaml .Values.podAnnotations | indent 8 }}
+ {{- end }}
+ spec:
+ {{- if .Values.schedulerName }}
+ schedulerName: "{{ .Values.schedulerName }}"
+ {{- end }}
+ {{- if .Values.nodeSelector }}
+ nodeSelector:
+{{ toYaml .Values.nodeSelector | indent 8 }}
+ {{- end -}}
+ {{- if .Values.affinity }}
+ affinity:
+{{ toYaml .Values.affinity | indent 8 }}
+ {{- end }}
+ {{- if .Values.tolerations }}
+ tolerations:
+{{ toYaml .Values.tolerations | indent 8 }}
+ {{- end }}
+ {{- if .Values.securityContext }}
+ securityContext:
+{{ toYaml .Values.securityContext | indent 8 }}
+ {{- end }}
+ {{- if .Values.image.pullSecrets }}
+ imagePullSecrets:
+ {{- range .Values.image.pullSecrets }}
+ - name: {{ . }}
+ {{- end}}
+ {{- end }}
+ serviceAccountName: {{ include "influxdb.serviceAccountName" . }}
+ containers:
+ - name: {{ include "influxdb.fullname" . }}
+ image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
+ imagePullPolicy: {{ .Values.image.pullPolicy | quote }}
+ resources:
+{{ toYaml .Values.resources | indent 10 }}
+ ports:
+ - name: api
+ containerPort: {{ .Values.config.http.bind_address | default 8086 }}
+ {{- if .Values.config.graphite.enabled }}
+ - name: graphite
+ containerPort: {{ .Values.config.graphite.bind_address | default 2003 }}
+ {{- end }}
+ {{- if .Values.config.collectd.enabled }}
+ - name: collectd
+ containerPort: {{ .Values.config.collectd.bind_address | default 25826 }}
+ protocol: UDP
+ {{- end }}
+ {{- if .Values.config.udp.enabled }}
+ - name: udp
+ containerPort: {{ .Values.config.udp.bind_address | default 8089 }}
+ protocol: UDP
+ {{- end }}
+ {{- if .Values.config.opentsdb.enabled }}
+ - name: opentsdb
+ containerPort: {{ .Values.config.opentsdb.bind_address | default 4242 }}
+ {{- end }}
+ - name: rpc
+ containerPort: {{ .Values.config.rpc.bind_address | default 8088 }}
+ {{- if .Values.enterprise.enabled }}
+ - name: meta
+ containerPort: {{ .Values.config.meta.bind_address | default 8091 }}
+ {{- end }}
+ {{- if .Values.env }}
+ env:
+{{ toYaml .Values.env | indent 10 }}
+ {{- if .Values.enterprise.enabled }}
+ - name: INFLUXDB_HOSTNAME # Values.env's HOSTNAME isn't fundamentally different from $HOSTNAME, but this way weg get a distinguished name at runtime.
+ value: "$(_HOSTNAME).{{ include "influxdb.fullname" . }}"
+ {{- end }}
+ {{- end }}
+ {{- if .Values.envFromSecret }}
+ envFrom:
+ - secretRef:
+ name: {{ .Values.envFromSecret }}
+ {{- end }}
+ livenessProbe:
+ httpGet:
+ path: {{ .Values.livenessProbe.path | default "/ping" }}
+ port: api
+ scheme: {{ .Values.livenessProbe.scheme | default "HTTP" }}
+ initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds | default 30 }}
+ timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds | default 5 }}
+ readinessProbe:
+ httpGet:
+ path: {{ .Values.readinessProbe.path | default "/ping" }}
+ port: api
+ scheme: {{ .Values.readinessProbe.scheme | default "HTTP" }}
+ initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds | default 5 }}
+ timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds | default 1 }}
+ {{- if .Values.startupProbe.enabled }}
+ startupProbe:
+ httpGet:
+ path: {{ .Values.startupProbe.path | default "/ping" }}
+ port: api
+ scheme: {{ .Values.startupProbe.scheme | default "HTTP" }}
+ failureThreshold: {{ .Values.startupProbe.failureThreshold | default 6 }}
+ periodSeconds: {{ .Values.startupProbe.periodSeconds | default 5 }}
+ {{- end }}
+ volumeMounts:
+ - name: {{ include "influxdb.fullname" . }}-data
+ mountPath: /var/lib/influxdb
+ - name: config
+ mountPath: /etc/influxdb
+ {{- if .Values.initScripts.enabled }}
+ - name: init
+ mountPath: /docker-entrypoint-initdb.d
+ {{- end }}
+ {{- if .Values.mountPoints }}
+{{ toYaml .Values.mountPoints | indent 8 }}
+ {{- end }}
+ {{- if .Values.extraContainers }}
+{{ toYaml .Values.extraContainers | indent 6}}
+ {{- end }}
+ volumes:
+ - name: config
+ configMap:
+ name: {{ include "influxdb.fullname" . }}
+ {{- if .Values.initScripts.enabled }}
+ - name: init
+ configMap:
+ name: {{ include "influxdb.fullname" . }}-init
+ {{- end }}
+ {{- if (not .Values.persistence.enabled ) }}
+ - name: {{ include "influxdb.fullname" . }}-data
+ emptyDir: {}
+ {{- else }}
+ - name: {{ include "influxdb.fullname" . }}-data
+ persistentVolumeClaim:
+ claimName: {{ include "influxdb.fullname" . }}
+ {{- end }}
+ # Cannot use existing claim in enterprise mode
+ # {{- if and .Values.persistence.enabled .Values.persistence.existingClaim (not .Values.enterprise.enabled) }}
+ # - name: {{ include "influxdb.fullname" . }}-data
+ # persistentVolumeClaim:
+ # claimName: {{ .Values.persistence.existingClaim }}
+ # {{- end }}
+ {{- if .Values.volumes }}
+{{ toYaml .Values.volumes | indent 6 }}
+ {{- end }}
diff --git a/agw-deployer/helm/charts/influxdb/templates/storageclass.yaml b/agw-deployer/helm/charts/influxdb/templates/storageclass.yaml
new file mode 100644
index 0000000..bee28fd
--- /dev/null
+++ b/agw-deployer/helm/charts/influxdb/templates/storageclass.yaml
@@ -0,0 +1,10 @@
+{{- if .Values.persistence.enabled}}
+kind: StorageClass
+apiVersion: storage.k8s.io/v1
+metadata:
+ name: {{ template "influxdb.fullname" . }}
+ labels:
+ {{- include "influxdb.labels" . | nindent 4 }}
+provisioner: kubernetes.io/no-provisioner
+volumeBindingMode: WaitForFirstConsumer
+{{- end }}
diff --git a/agw-deployer/helm/charts/influxdb/values.yaml b/agw-deployer/helm/charts/influxdb/values.yaml
new file mode 100644
index 0000000..9f5d348
--- /dev/null
+++ b/agw-deployer/helm/charts/influxdb/values.yaml
@@ -0,0 +1,468 @@
+## influxdb image version
+## ref: https://hub.docker.com/r/library/influxdb/tags/
+image:
+ repository: "influxdb"
+ tag: "1.8.0"
+ pullPolicy: IfNotPresent
+ ## If specified, use these secrets to access the images
+ # pullSecrets:
+ # - registry-secret
+
+
+serviceAccount:
+ create: true
+ name:
+ annotations: {}
+
+## Customize liveness, readiness and startup probes
+## ref: https://docs.influxdata.com/influxdb/v1.7/tools/api/#ping-http-endpoint
+## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/
+##
+livenessProbe: {}
+ # path: "/ping"
+ # initialDelaySeconds: 30
+ # timeoutSeconds: 5
+ # scheme: HTTP
+
+readinessProbe: {}
+ # path: "/ping"
+ # initialDelaySeconds: 5
+ # timeoutSeconds: 1
+ # scheme: HTTP
+
+securityContext: {}
+ # runAsUser: 999
+ # runAsGroup: 999
+
+startupProbe:
+ enabled: false
+ # path: "/ping"
+ # failureThreshold: 6
+ # periodSeconds: 5
+ # scheme: HTTP
+
+## Specify a service type
+## NodePort is default
+## ref: http://kubernetes.io/docs/user-guide/services/
+##
+service:
+ ## Add annotations to service
+ # annotations: {}
+ type: NodePort
+ apiNodePort: 30086
+ rpcNodePort: 30088
+ # externalIPs: []
+ # externalTrafficPolicy: ""
+
+## Persist data to a persistent volume
+##
+persistence:
+ enabled: true
+ ## A manually managed Persistent Volume and Claim
+ ## Requires persistence.enabled: true
+ ## If defined, PVC must be created manually before volume will be bound
+ # existingClaim:
+ ## influxdb data Persistent Volume Storage Class
+ ## If defined, storageClassName:
+ ## If set to "-", storageClassName: "", which disables dynamic provisioning
+ ## If undefined (the default) or set to null, no storageClassName spec is
+ ## set, choosing the default provisioner. (gp2 on AWS, standard on
+ ## GKE, AWS & OpenStack)
+ ##
+ storageClass: "fullname"
+ annotations:
+ accessMode: ReadWriteOnce
+ size: 8Gi
+ reclaimPolicy: Retain
+ location: "/mnt/playground/influxdb"
+
+## Deploy InfluxDB Enterprise - License required
+## ref: https://www.influxdata.com/products/influxdb-enterprise/
+enterprise:
+ enabled: false
+ licensekey: {}
+ clusterSize: 4
+ meta:
+ image:
+ ## This image contains the enterprise meta node package for clustering.
+ ## It is meant to be used in conjunction with the influxdb:data package of the same version.
+ ## ref: https://hub.docker.com/_/influxdb
+ tag: meta
+ clusterSize: 3
+ ## seed is hashed and used as `internal-shared-secret` for Meta service.
+ seed: dead-beef-cafe-bae
+ ## Configure resource requests and limits
+ ## ref: http://kubernetes.io/docs/user-guide/compute-resources/
+ resources: {}
+ # resources:
+ # requests:
+ # memory: 512Mi
+ # cpu: 2
+ # limits:
+ # memory: 1Gi
+ # cpu: 4
+
+## Create default user through Kubernetes job
+## Defaults indicated below
+##
+setDefaultUser:
+ enabled: false
+
+ ## Image of the container used for job
+ ## Default: appropriate/curl:latest
+ ##
+ image: appropriate/curl:latest
+
+ ## Deadline for job so it does not retry forever.
+ ## Default: activeDeadline: 300
+ ##
+ activeDeadline: 300
+
+ ## Specify the number of retries before considering job as failed.
+ ## https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/#pod-backoff-failure-policy
+ ##
+ backoffLimit: 6
+
+ ## Hook delete policy for helm.
+ ## Default: hookDeletePolicy: hook-succeeded
+ ##
+ hookDeletePolicy: hook-succeeded
+
+ ## Restart policy for job
+ ## Default: OnFailure
+ restartPolicy: OnFailure
+
+ user:
+
+ ## The user name
+ ## Default: "admin"
+ username: "admin"
+
+ ## User password
+ ## single quotes must be escaped (\')
+ ## Default: (Randomly generated 10 characters of AlphaNum)
+ # password:
+
+ ## The user name and password are obtained from an existing secret. The expected
+ ## keys are `influxdb-user` and `influxdb-password`.
+ ## If set, the username and password values above are ignored.
+ # existingSecret: influxdb-auth
+
+ ## User privileges
+ ## Default: "WITH ALL PRIVILEGES"
+ privileges: "WITH ALL PRIVILEGES"
+
+## Configure resource requests and limits
+## ref: http://kubernetes.io/docs/user-guide/compute-resources/
+resources: {}
+# requests:
+# memory: 256Mi
+# cpu: 0.1
+# limits:
+# memory: 16Gi
+# cpu: 8
+
+# Annotations to be added to InfluxDB pods
+podAnnotations: {}
+
+# Labels to be added to InfluxDB pods
+podLabels: {}
+
+ingress:
+ enabled: false
+ tls: false
+ # secretName: my-tls-cert # only needed if tls above is true
+ hostname: ''
+ annotations:
+ nginx.ingress.kubernetes.io/rewrite-target: /$2
+ # kubernetes.io/ingress.class: "nginx"
+ # kubernetes.io/tls-acme: "true"
+ path: /influxdb(/|$)(.*)
+
+## Add custom volume and volumeMounts
+# volumes:
+# - name: ssl-cert-volume
+# secret:
+# secretName: secret-name
+# mountPoints:
+# - name: ssl-cert-volume
+# mountPath: /etc/ssl/certs/selfsigned/
+# readOnly: true
+
+## Additional containers to be added to the pod.
+extraContainers: {}
+# - name: my-sidecar
+# image: nginx:latest
+
+## Use an alternate scheduler, e.g. "stork".
+## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/
+##
+# schedulerName:
+
+## Node labels for pod assignment
+## Ref: https://kubernetes.io/docs/user-guide/node-selection/
+##
+nodeSelector: {}
+
+## Affinity for pod assignment
+## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity
+##
+affinity:
+ nodeAffinity:
+ requiredDuringSchedulingIgnoredDuringExecution:
+ nodeSelectorTerms:
+ - matchExpressions:
+ - key: node-role.kubernetes.io/master
+ operator: Exists
+
+## Tolerations for pod assignment
+## Ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/
+##
+tolerations: []
+# - key: "key"
+# operator: "Equal|Exists"
+# value: "value"
+# effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)"
+
+## The InfluxDB image uses several environment variables to automatically
+## configure certain parts of the server.
+## Ref: https://hub.docker.com/_/influxdb/
+env: {}
+ # - name: INFLUXDB_DB
+ # value: "demo"
+
+## The name of a secret in the same kubernetes namespace which contain values
+## to be added to the environment.
+## This can be used, for example, to set the INFLUXDB_HTTP_SHARED_SECRET
+## environment variable.
+envFromSecret: {}
+
+## InfluxDB configuration
+## ref: https://docs.influxdata.com/influxdb/v1.7/administration/config
+config:
+ # reporting_disabled: false
+ # rpc: {}
+ # meta: {}
+ # data: {}
+ # coordinator: {}
+ # retention: {}
+ # shard_precreation: {}
+ # admin: {}
+ # monitor: {}
+ # http: {}
+ # logging: {}
+ # subscriber: {}
+ # graphite: {}
+ # collectd: {}
+ # opentsdb: {}
+ # udp: {}
+ # continuous_queries: {}
+ # tls: {}
+ reporting_disabled: false
+ rpc:
+ enabled: true
+ bind_address: 8088
+ meta:
+ retention_autocreate: true
+ logging_enabled: true
+ data:
+ query_log_enabled: true
+ cache_max_memory_size: 1073741824
+ cache_snapshot_memory_size: 26214400
+ cache_snapshot_write_cold_duration: 10m0s
+ compact_full_write_cold_duration: 4h0m0s
+ max_series_per_database: 1000000
+ max_values_per_tag: 100000
+ trace_logging_enabled: false
+ coordinator:
+ write_timeout: 10s
+ max_concurrent_queries: 0
+ query_timeout: 0s
+ log_queries_after: 0s
+ max_select_point: 0
+ max_select_series: 0
+ max_select_buckets: 0
+ retention:
+ enabled: true
+ check_interval: 30m0s
+ shard_precreation:
+ enabled: true
+ check_interval: 10m0s
+ advance_period: 30m0s
+ admin:
+ enabled: false
+ bind_address: 8083
+ https_enabled: false
+ https_certificate: /etc/ssl/influxdb.pem
+ monitor:
+ store_enabled: true
+ store_database: _internal
+ store_interval: 10s
+ http:
+ enabled: true
+ bind_address: 8086
+ auth_enabled: false
+ flux_enabled: true
+ log_enabled: true
+ write_tracing: false
+ pprof_enabled: true
+ https_enabled: false
+ https_certificate: /etc/ssl/influxdb.pem
+ https_private_key: ""
+ max_row_limit: 10000
+ max_connection_limit: 0
+ shared_secret: "beetlejuicebeetlejuicebeetlejuice"
+ realm: InfluxDB
+ unix_socket_enabled: false
+ bind_socket: /var/run/influxdb.sock
+ logging:
+ format: auto
+ level: info
+ supress_logo: false
+ subscriber:
+ enabled: true
+ http_timeout: 30s
+ insecure_skip_verify: false
+ ca_certs: ""
+ write_concurrency: 40
+ write_buffer_size: 1000
+ graphite:
+ enabled: false
+ bind_address: 2003
+ database: graphite
+ retention_policy: autogen
+ protocol: tcp
+ batch_size: 5000
+ batch_pending: 10
+ batch_timeout: 1s
+ consistency_level: one
+ separator: .
+ udp_read_buffer: 0
+ # Uncomment to define graphite templates
+ # templates:
+ # - "graphite.metric.*.*.* measurement.run"
+ collectd:
+ enabled: false
+ bind_address: 25826
+ database: collectd
+ retention_policy: autogen
+ batch_size: 5000
+ batch_pending: 10
+ batch_timeout: 10s
+ read_buffer: 0
+ typesdb: /usr/share/collectd/types.db
+ security_level: none
+ auth_file: /etc/collectd/auth_file
+ opentsdb:
+ enabled: false
+ bind_address: 4242
+ database: opentsdb
+ retention_policy: autogen
+ consistency_level: one
+ tls_enabled: false
+ certificate: /etc/ssl/influxdb.pem
+ batch_size: 1000
+ batch_pending: 5
+ batch_timeout: 1s
+ log_point_errors: true
+ udp:
+ enabled: false
+ bind_address: 8089
+ database: udp
+ retention_policy: autogen
+ batch_size: 5000
+ batch_pending: 10
+ read_buffer: 0
+ batch_timeout: 1s
+ precision: "ns"
+ continuous_queries:
+ log_enabled: true
+ enabled: true
+ run_interval: 1s
+
+# Allow executing custom init scripts
+#
+# If the container finds any files with the extensions .sh or .iql inside of the
+# /docker-entrypoint-initdb.d folder, it will execute them. The order they are
+# executed in is determined by the shell. This is usually alphabetical order.
+initScripts:
+ enabled: false
+ scripts:
+ init.iql: |+
+ CREATE DATABASE "telegraf" WITH DURATION 30d REPLICATION 1 NAME "rp_30d"
+
+backup:
+ enabled: false
+ ## By default emptyDir is used as a transitory volume before uploading to object store.
+ ## As such, ensure that a sufficient ephemeral storage request is set to prevent node disk filling completely.
+ resources:
+ requests:
+ # memory: 512Mi
+ # cpu: 2
+ ephemeral-storage: "8Gi"
+ # limits:
+ # memory: 1Gi
+ # cpu: 4
+ # ephemeral-storage: "16Gi"
+ ## If backup destination is PVC, or want to use intermediate PVC before uploading to object store.
+ persistence:
+ enabled: false
+ ## If defined, storageClassName:
+ ## If set to "-", storageClassName: "", which disables dynamic provisioning
+ ## If undefined (the default) or set to null, no storageClassName spec is
+ ## set, choosing the default provisioner. (gp2 on AWS, standard on
+ ## GKE, AWS & OpenStack)
+ ##
+ # storageClass: "-"
+ annotations:
+ accessMode: ReadWriteOnce
+ size: 8Gi
+ schedule: "0 0 * * *"
+ startingDeadlineSeconds: ""
+ annotations: {}
+ podAnnotations: {}
+
+ ## Google Cloud Storage
+ # gcs:
+ # serviceAccountSecret: influxdb-backup-key
+ # serviceAccountSecretKey: key.json
+ # destination: gs://bucket/influxdb
+
+ ## Azure
+ ## Secret is expected to have connection string stored in `connection-string` field
+ ## Existing container will be used or private one withing storage account will be created.
+ # azure:
+ # storageAccountSecret: influxdb-backup-azure-key
+ # destination_container: influxdb-container
+ # destination_path: ""
+
+ ## Amazon S3 or compatible
+ ## Secret is expected to have AWS (or compatible) credentials stored in `credentials` field.
+ ## Please look at https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html#cli-configure-files-where
+ ## for the credentials format.
+ ## The bucket should already exist.
+ s3:
+ credentialsSecret: meep-influx-objstore-config
+ destination: s3://influx
+ ## Optional. Specify if you're using an alternate S3 endpoint.
+ endpointUrl: ""
+
+backupRetention:
+ enabled: false
+ resources:
+ requests:
+ # memory: 512Mi
+ # cpu: 2
+ # limits:
+ # memory: 1Gi
+ # cpu: 4
+ schedule: "0 0 * * *"
+ startingDeadlineSeconds:
+ annotations: {}
+ podAnnotations: {}
+ daysToRetain: 7
+ s3:
+ credentialsSecret: meep-influx-objstore-config
+ bucketName: influx
+ ## Optional. Specify if you're using an alternate S3 endpoint.
+ endpointUrl: ""
diff --git a/agw-deployer/helm/charts/openrtist/Chart.yaml b/agw-deployer/helm/charts/openrtist/Chart.yaml
new file mode 100644
index 0000000..5822b1f
--- /dev/null
+++ b/agw-deployer/helm/charts/openrtist/Chart.yaml
@@ -0,0 +1,5 @@
+apiVersion: v1
+appVersion: "1.0.0"
+description: Openrtist Helm chart for Kubernetes
+name: openrtist
+version: 1.0.0
diff --git a/agw-deployer/helm/charts/openrtist/templates/.gitignore b/agw-deployer/helm/charts/openrtist/templates/.gitignore
new file mode 100644
index 0000000..97c1f24
--- /dev/null
+++ b/agw-deployer/helm/charts/openrtist/templates/.gitignore
@@ -0,0 +1 @@
+/.deployment.yaml.swp
diff --git a/agw-deployer/helm/charts/openrtist/templates/_helpers.tpl b/agw-deployer/helm/charts/openrtist/templates/_helpers.tpl
new file mode 100644
index 0000000..dccdd8f
--- /dev/null
+++ b/agw-deployer/helm/charts/openrtist/templates/_helpers.tpl
@@ -0,0 +1,32 @@
+{{/* vim: set filetype=mustache: */}}
+{{/*
+Expand the name of the chart.
+*/}}
+{{- define "openrtist.name" -}}
+{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+{{/*
+Create a default fully qualified app name.
+We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
+If release name contains chart name it will be used as a full name.
+*/}}
+{{- define "openrtist.fullname" -}}
+{{- if .Values.fullnameOverride -}}
+{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}}
+{{- else -}}
+{{- $name := default .Chart.Name .Values.nameOverride -}}
+{{- if contains $name .Release.Name -}}
+{{- .Release.Name | trunc 63 | trimSuffix "-" -}}
+{{- else -}}
+{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Create chart name and version as used by the chart label.
+*/}}
+{{- define "openrtist.chart" -}}
+{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
diff --git a/agw-deployer/helm/charts/openrtist/templates/deployment.yaml b/agw-deployer/helm/charts/openrtist/templates/deployment.yaml
new file mode 100644
index 0000000..aeafc9d
--- /dev/null
+++ b/agw-deployer/helm/charts/openrtist/templates/deployment.yaml
@@ -0,0 +1,38 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: {{ template "openrtist.fullname" . }}
+ labels:
+ app: {{ template "openrtist.name" . }}
+ chart: {{ template "openrtist.chart" . }}
+ release: {{ .Release.Name }}
+ heritage: {{ .Release.Service }}
+spec:
+ replicas: {{ .Values.deployment.replicas }}
+ selector:
+ matchLabels:
+ app: {{ template "openrtist.name" . }}
+ release: {{ .Release.Name }}
+ template:
+ metadata:
+ labels:
+ app: {{ template "openrtist.name" . }}
+ release: {{ .Release.Name }}
+ spec:
+ containers:
+ - name: {{ .Chart.Name }}
+ image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
+ imagePullPolicy: {{ .Values.image.pullPolicy }}
+ ports:
+ - containerPort: {{ .Values.service.targetPort }}
+ hostPort: {{ .Values.service.port }}
+ protocol: {{ .Values.deployment.protocol }}
+ # resources:
+ # limits:
+ # nvidia.com/gpu: 1
+ volumeMounts:
+ - name: shared-data
+ mountPath: /usr/share/openrtist
+ volumes:
+ - name: shared-data
+ emptyDir: {}
diff --git a/agw-deployer/helm/charts/openrtist/templates/service.yaml b/agw-deployer/helm/charts/openrtist/templates/service.yaml
new file mode 100644
index 0000000..db6bec6
--- /dev/null
+++ b/agw-deployer/helm/charts/openrtist/templates/service.yaml
@@ -0,0 +1,21 @@
+apiVersion: v1
+kind: Service
+metadata:
+ name: {{ .Values.service.name }}
+ labels:
+ app: {{ template "openrtist.name" . }}
+ chart: {{ template "openrtist.chart" . }}
+ release: {{ .Release.Name }}
+ heritage: {{ .Release.Service }}
+spec:
+ type: {{ .Values.service.type }}
+ selector:
+ app: {{ template "openrtist.name" . }}
+ release: {{ .Release.Name }}
+ ports:
+ - name: port
+ port: {{ .Values.service.port }}
+{{ if eq .Values.service.type "NodePort"}}
+ targetPort: {{ .Values.service.targetPort }}
+ nodePort: {{ .Values.service.nodePort }}
+{{ end }}
diff --git a/agw-deployer/helm/charts/openrtist/values.yaml b/agw-deployer/helm/charts/openrtist/values.yaml
new file mode 100644
index 0000000..1337303
--- /dev/null
+++ b/agw-deployer/helm/charts/openrtist/values.yaml
@@ -0,0 +1,20 @@
+# Default values for openrtist service.
+# This is a YAML-formatted file.
+# Declare variables to be passed into your templates.
+
+deployment:
+ replicas: 1
+ port: 9099
+ protocol: TCP
+
+image:
+ repository: cmusatyalab/openrtist
+ tag: stable
+ pullPolicy: IfNotPresent
+
+service:
+ name: openrtist-svc
+ type: NodePort
+ port: 9098
+ targetPort: 9099
+ nodePort: 30099
diff --git a/agw-deployer/helm/charts/openscout/Chart.yaml b/agw-deployer/helm/charts/openscout/Chart.yaml
new file mode 100644
index 0000000..b1d9097
--- /dev/null
+++ b/agw-deployer/helm/charts/openscout/Chart.yaml
@@ -0,0 +1,5 @@
+apiVersion: v1
+appVersion: "1.0.0"
+description: Openrtist Helm chart for Kubernetes
+name: openscout
+version: 1.0.0
diff --git a/agw-deployer/helm/charts/openscout/openscout.yaml b/agw-deployer/helm/charts/openscout/openscout.yaml
new file mode 100644
index 0000000..edf5c8a
--- /dev/null
+++ b/agw-deployer/helm/charts/openscout/openscout.yaml
@@ -0,0 +1,37 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: {{ template "openscout.fullname" . }}
+ namespace: {{ .Values.namespace }}
+ labels:
+ app: {{ template "openscout.name" . }}
+ chart: {{ template "openscout.chart" . }}
+ release: {{ .Release.Name }}
+ heritage: {{ .Release.Service }}
+spec:
+ replicas: {{ .Values.deployment.replicas }}
+ selector:
+ matchLabels:
+ app: {{ template "openscout.name" . }}
+ release: {{ .Release.Name }}
+ template:
+ metadata:
+ namespace: {{ .Values.namespace }}
+ labels:
+ app: {{ template "openscout.name" . }}
+ release: {{ .Release.Name }}
+ spec:
+ containers:
+ - name: {{ .Values.images.openscout.name }}
+ image: "{{ .Values.images.openscout.repository }}:{{ .Values.images.openscout.tag }}"
+ imagePullPolicy: {{ .Values.images.openscout.pullPolicy }}
+ ports:
+ - containerPort: {{ .Values.deployment.port }}
+ hostPort: {{ .Values.deployment.port }}
+ protocol: {{ .Values.deployment.protocol }}
+ volumeMounts:
+ - name: shared-data
+ mountPath: /usr/share/openscout
+ volumes:
+ - name: shared-data
+ emptyDir: {}
diff --git a/agw-deployer/helm/charts/openscout/templates/_helpers.tpl b/agw-deployer/helm/charts/openscout/templates/_helpers.tpl
new file mode 100644
index 0000000..5314129
--- /dev/null
+++ b/agw-deployer/helm/charts/openscout/templates/_helpers.tpl
@@ -0,0 +1,33 @@
+{{/* vim: set filetype=mustache: */}}
+{{/*
+Expand the name of the chart.
+*/}}
+{{- define "openscout.name" -}}
+{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+{{/*
+Create a default fully qualified app name.
+We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
+If release name contains chart name it will be used as a full name.
+*/}}
+{{- define "openscout.fullname" -}}
+{{- if .Values.fullnameOverride -}}
+{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}}
+{{- else -}}
+{{- $name := default .Chart.Name .Values.nameOverride -}}
+{{- if contains $name .Release.Name -}}
+{{- .Release.Name | trunc 63 | trimSuffix "-" -}}
+{{- else -}}
+{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Create chart name and version as used by the chart label.
+*/}}
+{{- define "openscout.chart" -}}
+{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
diff --git a/agw-deployer/helm/charts/openscout/templates/configMap.yaml b/agw-deployer/helm/charts/openscout/templates/configMap.yaml
new file mode 100644
index 0000000..4c0e9f6
--- /dev/null
+++ b/agw-deployer/helm/charts/openscout/templates/configMap.yaml
@@ -0,0 +1,29 @@
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: logstash-pipeline
+data:
+ openscout-pipeline.cfg: |
+ input {
+ beats {
+ port => "5044"
+ }
+ }
+
+ filter {
+ grok {
+ match => { "message" => "%{DATA:detection_time},%{DATA:client_id},%{NUMBER:latitude:float},%{NUMBER:longitude:float},%{DATA:entity},%{NUMBER:confidence:float},(%{URI:image})?" }
+ }
+ mutate {
+ add_field => {"location" => "%{latitude},%{longitude}"
+ }
+ }
+ }
+
+ output {
+ stdout { codec => rubydebug }
+ elasticsearch {
+ hosts => [ "elasticsearch:9200" ]
+ index => "openscout"
+ }
+ }
\ No newline at end of file
diff --git a/agw-deployer/helm/charts/openscout/templates/elasticsearch-server.yaml b/agw-deployer/helm/charts/openscout/templates/elasticsearch-server.yaml
new file mode 100644
index 0000000..03da3f8
--- /dev/null
+++ b/agw-deployer/helm/charts/openscout/templates/elasticsearch-server.yaml
@@ -0,0 +1,33 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: {{ .Values.images.elasticsearch.name }}
+ labels:
+ app: {{ .Values.images.elasticsearch.name }}
+ chart: {{ .Values.images.elasticsearch.name }}
+ release: {{ .Release.Name }}
+ heritage: {{ .Release.Service }}
+spec:
+ replicas: {{ .Values.deployment.replicas }}
+ selector:
+ matchLabels:
+ app: {{ .Values.images.elasticsearch.name }}
+ release: {{ .Release.Name }}
+ template:
+ metadata:
+ labels:
+ app: {{ .Values.images.elasticsearch.name }}
+ release: {{ .Release.Name }}
+ spec:
+ containers:
+ - name: {{ .Values.images.elasticsearch.name }}
+ image: "{{ .Values.images.elasticsearch.repository }}:{{ .Values.deployment.elkversion }}-{{ .Values.deployment.arch }}"
+ imagePullPolicy: {{ .Values.images.openscout.pullPolicy }}
+ env:
+ - name: discovery.type
+ value: {{ .Values.images.elasticsearch.discoverytype }}
+ ports:
+ - containerPort: {{ .Values.elasticsearchservice.port }}
+ hostPort: {{ .Values.elasticsearchservice.targetPort }}
+ protocol: {{ .Values.deployment.protocol }}
+
diff --git a/agw-deployer/helm/charts/openscout/templates/elasticsearch-service.yaml b/agw-deployer/helm/charts/openscout/templates/elasticsearch-service.yaml
new file mode 100644
index 0000000..78cf40f
--- /dev/null
+++ b/agw-deployer/helm/charts/openscout/templates/elasticsearch-service.yaml
@@ -0,0 +1,17 @@
+apiVersion: v1
+kind: Service
+metadata:
+ name: {{ .Values.elasticsearchservice.name }}
+ labels:
+ app: {{ template "openscout.name" . }}
+ chart: {{ template "openscout.chart" . }}
+ release: {{ .Release.Name }}
+ heritage: {{ .Release.Service }}
+spec:
+ type: {{ .Values.elasticsearchservice.type }}
+ selector:
+ app: {{ .Values.elasticsearchservice.name }}
+ release: {{ .Release.Name }}
+ ports:
+ - name: {{ .Values.elasticsearchservice.name }}
+ port: {{ .Values.elasticsearchservice.port }}
diff --git a/agw-deployer/helm/charts/openscout/templates/gabriel-server.yaml b/agw-deployer/helm/charts/openscout/templates/gabriel-server.yaml
new file mode 100644
index 0000000..a6189e8
--- /dev/null
+++ b/agw-deployer/helm/charts/openscout/templates/gabriel-server.yaml
@@ -0,0 +1,39 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: {{ .Values.images.gabrielserver.name }}
+ labels:
+ app: {{ .Values.images.gabrielserver.name }}
+ chart: {{ .Values.images.gabrielserver.name }}
+ release: {{ .Release.Name }}
+ heritage: {{ .Release.Service }}
+spec:
+ replicas: {{ .Values.deployment.replicas }}
+ selector:
+ matchLabels:
+ app: {{ .Values.images.gabrielserver.name }}
+ release: {{ .Release.Name }}
+ template:
+ metadata:
+ labels:
+ app: {{ .Values.images.gabrielserver.name }}
+ release: {{ .Release.Name }}
+ spec:
+ containers:
+ - name: {{ .Values.images.gabrielserver.name }}
+ image: "{{ .Values.images.openscout.repository }}:{{ .Values.images.openscout.tag }}"
+ imagePullPolicy: {{ .Values.images.openscout.pullPolicy }}
+ command: {{ .Values.images.gabrielserver.command }}
+ ports:
+ - containerPort: {{ .Values.gabrielservice.port }}
+ hostPort: {{ .Values.gabrielservice.targetPort }}
+ protocol: {{ .Values.deployment.protocol }}
+ - containerPort: {{ .Values.openscoutservice.port }}
+ hostPort: {{ .Values.openscoutservice.port }}
+ protocol: {{ .Values.deployment.protocol }}
+ volumeMounts:
+ - name: shared-data
+ mountPath: /usr/share/gabrielserver
+ volumes:
+ - name: shared-data
+ emptyDir: {}
diff --git a/agw-deployer/helm/charts/openscout/templates/gabriel-service.yaml b/agw-deployer/helm/charts/openscout/templates/gabriel-service.yaml
new file mode 100644
index 0000000..55501c4
--- /dev/null
+++ b/agw-deployer/helm/charts/openscout/templates/gabriel-service.yaml
@@ -0,0 +1,23 @@
+apiVersion: v1
+kind: Service
+metadata:
+ name: {{ .Values.gabrielservice.name }}
+ labels:
+ app: {{ template "openscout.name" . }}
+ chart: {{ template "openscout.chart" . }}
+ release: {{ .Release.Name }}
+ heritage: {{ .Release.Service }}
+spec:
+ type: {{ .Values.gabrielservice.type }}
+ selector:
+ app: {{ .Values.gabrielservice.name }}
+ release: {{ .Release.Name }}
+ ports:
+ - name: {{ .Values.gabrielservice.name }}
+ port: {{ .Values.gabrielservice.port }}
+{{ if eq .Values.gabrielservice.type "NodePort"}}
+ targetPort: {{ .Values.gabrielservice.port }}
+ nodePort: {{ .Values.gabrielservice.targetPort }}
+{{ end }}
+ - name: {{ .Values.openscoutservice.name }}
+ port: {{ .Values.openscoutservice.port }}
diff --git a/agw-deployer/helm/charts/openscout/templates/httpd-service.yaml b/agw-deployer/helm/charts/openscout/templates/httpd-service.yaml
new file mode 100644
index 0000000..d89f03e
--- /dev/null
+++ b/agw-deployer/helm/charts/openscout/templates/httpd-service.yaml
@@ -0,0 +1,21 @@
+apiVersion: v1
+kind: Service
+metadata:
+ name: {{ .Values.httpdservice.name }}
+ labels:
+ app: {{ template "openscout.name" . }}
+ chart: {{ template "openscout.chart" . }}
+ release: {{ .Release.Name }}
+ heritage: {{ .Release.Service }}
+spec:
+ type: {{ .Values.httpdservice.type }}
+ selector:
+ app: {{ template "openscout.name" . }}
+ release: {{ .Release.Name }}
+ ports:
+ - name: port
+ port: {{ .Values.httpdservice.port }}
+{{ if eq .Values.httpdservice.type "NodePort"}}
+ targetPort: {{ .Values.httpdservice.port }}
+ nodePort: {{ .Values.httpdservice.nodePort }}
+{{ end }}
diff --git a/agw-deployer/helm/charts/openscout/templates/httpd.yaml b/agw-deployer/helm/charts/openscout/templates/httpd.yaml
new file mode 100644
index 0000000..2b8dd41
--- /dev/null
+++ b/agw-deployer/helm/charts/openscout/templates/httpd.yaml
@@ -0,0 +1,35 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: {{ .Values.images.httpd.name }}
+ labels:
+ app: {{ .Values.images.httpd.name }}
+ chart: {{ .Values.images.httpd.name }}
+ release: {{ .Release.Name }}
+ heritage: {{ .Release.Service }}
+spec:
+ replicas: {{ .Values.deployment.replicas }}
+ selector:
+ matchLabels:
+ app: {{ .Values.images.httpd.name }}
+ release: {{ .Release.Name }}
+ template:
+ metadata:
+ labels:
+ app: {{ .Values.images.httpd.name }}
+ release: {{ .Release.Name }}
+ spec:
+ containers:
+ - name: {{ .Values.images.httpd.name }}
+ image: "{{ .Values.images.httpd.repository }}:{{ .Values.images.httpd.tag }}"
+ imagePullPolicy: {{ .Values.images.openscout.pullPolicy }}
+ ports:
+ - containerPort: {{ .Values.images.httpd.port }}
+ hostPort: {{ .Values.images.httpd.nodePort }}
+ protocol: {{ .Values.deployment.protocol }}
+ volumeMounts:
+ - name: shared-data
+ mountPath: /usr/share/openscout
+ volumes:
+ - name: shared-data
+ emptyDir: {}
diff --git a/agw-deployer/helm/charts/openscout/templates/kibana-server.yaml b/agw-deployer/helm/charts/openscout/templates/kibana-server.yaml
new file mode 100644
index 0000000..b890fcf
--- /dev/null
+++ b/agw-deployer/helm/charts/openscout/templates/kibana-server.yaml
@@ -0,0 +1,30 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: {{ .Values.images.kibana.name }}
+ labels:
+ app: {{ .Values.images.kibana.name }}
+ chart: {{ .Values.images.kibana.name }}
+ release: {{ .Release.Name }}
+ heritage: {{ .Release.Service }}
+spec:
+ replicas: {{ .Values.deployment.replicas }}
+ selector:
+ matchLabels:
+ app: {{ .Values.images.kibana.name }}
+ release: {{ .Release.Name }}
+ template:
+ metadata:
+ labels:
+ app: {{ .Values.images.kibana.name }}
+ release: {{ .Release.Name }}
+ spec:
+ containers:
+ - name: {{ .Values.images.kibana.name }}
+ image: "{{ .Values.images.kibana.repository }}:{{ .Values.deployment.elkversion }}"
+ imagePullPolicy: {{ .Values.images.openscout.pullPolicy }}
+ ports:
+ - containerPort: {{ .Values.kibanaservice.port }}
+ hostPort: {{ .Values.kibanaservice.targetPort }}
+ protocol: {{ .Values.deployment.protocol }}
+
diff --git a/agw-deployer/helm/charts/openscout/templates/kibana-service.yaml b/agw-deployer/helm/charts/openscout/templates/kibana-service.yaml
new file mode 100644
index 0000000..04c7671
--- /dev/null
+++ b/agw-deployer/helm/charts/openscout/templates/kibana-service.yaml
@@ -0,0 +1,17 @@
+apiVersion: v1
+kind: Service
+metadata:
+ name: {{ .Values.kibanaservice.name }}
+ labels:
+ app: {{ template "openscout.name" . }}
+ chart: {{ template "openscout.chart" . }}
+ release: {{ .Release.Name }}
+ heritage: {{ .Release.Service }}
+spec:
+ type: {{ .Values.kibanaservice.type }}
+ selector:
+ app: {{ .Values.kibanaservice.name }}
+ release: {{ .Release.Name }}
+ ports:
+ - name: {{ .Values.kibanaservice.name }}
+ port: {{ .Values.kibanaservice.port }}
diff --git a/agw-deployer/helm/charts/openscout/templates/logstash-server.yaml b/agw-deployer/helm/charts/openscout/templates/logstash-server.yaml
new file mode 100644
index 0000000..2fa6dbd
--- /dev/null
+++ b/agw-deployer/helm/charts/openscout/templates/logstash-server.yaml
@@ -0,0 +1,37 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: {{ .Values.images.logstash.name }}
+ labels:
+ app: {{ .Values.images.logstash.name }}
+ chart: {{ .Values.images.logstash.name }}
+ release: {{ .Release.Name }}
+ heritage: {{ .Release.Service }}
+spec:
+ replicas: {{ .Values.deployment.replicas }}
+ selector:
+ matchLabels:
+ app: {{ .Values.images.logstash.name }}
+ release: {{ .Release.Name }}
+ template:
+ metadata:
+ labels:
+ app: {{ .Values.images.logstash.name }}
+ release: {{ .Release.Name }}
+ spec:
+ containers:
+ - name: {{ .Values.images.logstash.name }}
+ image: "{{ .Values.images.logstash.repository }}:{{ .Values.deployment.elkversion }}"
+ imagePullPolicy: {{ .Values.images.openscout.pullPolicy }}
+ volumeMounts:
+ - mountPath: {{ .Values.volumes.pipeline.mountPath }}
+ name: pipeline
+ ports:
+ - containerPort: {{ .Values.logstashservice.port }}
+ hostPort: {{ .Values.logstashservice.targetPort }}
+ protocol: {{ .Values.deployment.protocol }}
+ volumes:
+ - name: pipeline
+ hostPath:
+ path: {{ .Values.volumes.pipeline.hostPath }}
+
diff --git a/agw-deployer/helm/charts/openscout/templates/logstash-service.yaml b/agw-deployer/helm/charts/openscout/templates/logstash-service.yaml
new file mode 100644
index 0000000..d5c7fd5
--- /dev/null
+++ b/agw-deployer/helm/charts/openscout/templates/logstash-service.yaml
@@ -0,0 +1,17 @@
+apiVersion: v1
+kind: Service
+metadata:
+ name: {{ .Values.logstashservice.name }}
+ labels:
+ app: {{ template "openscout.name" . }}
+ chart: {{ template "openscout.chart" . }}
+ release: {{ .Release.Name }}
+ heritage: {{ .Release.Service }}
+spec:
+ type: {{ .Values.logstashservice.type }}
+ selector:
+ app: {{ .Values.logstashservice.name }}
+ release: {{ .Release.Name }}
+ ports:
+ - name: {{ .Values.logstashservice.name }}
+ port: {{ .Values.logstashservice.port }}
diff --git a/agw-deployer/helm/charts/openscout/templates/openscout-object-engine.yaml b/agw-deployer/helm/charts/openscout/templates/openscout-object-engine.yaml
new file mode 100644
index 0000000..a3a3370
--- /dev/null
+++ b/agw-deployer/helm/charts/openscout/templates/openscout-object-engine.yaml
@@ -0,0 +1,55 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: {{ .Values.images.objectengine.name }}
+ labels:
+ app: {{ .Values.images.objectengine.name }}
+ chart: {{ .Values.images.objectengine.name }}
+ release: {{ .Release.Name }}
+ heritage: {{ .Release.Service }}
+spec:
+ replicas: {{ .Values.deployment.replicas }}
+ selector:
+ matchLabels:
+ app: {{ .Values.images.objectengine.name }}
+ release: {{ .Release.Name }}
+ template:
+ metadata:
+ labels:
+ app: {{ .Values.images.objectengine.name }}
+ release: {{ .Release.Name }}
+ spec:
+ containers:
+ - name: {{ .Values.images.objectengine.name }}
+ image: "{{ .Values.images.openscout.repository }}:{{ .Values.images.openscout.tag }}"
+ imagePullPolicy: {{ .Values.images.openscout.pullPolicy }}
+ command: {{ .Values.images.objectengine.command }}
+ args: {{ .Values.images.objectengine.args }}
+ # command: ["openscout-object-engine", "--model", "coco", "--threshold", "0.7", "--exclude", "1", ""]
+ #ports:
+ # - containerPort: {{ .Values.images.objectengine.port }}
+ # hostPort: {{ .Values.images.objectengine.nodePort }}
+ # protocol: {{ .Values.deployment.protocol }}
+ #resources:
+ #limits:
+ # nvidia.com/gpu: 1
+ volumeMounts:
+ - name: shared-data
+ mountPath: /usr/share/openscout
+ - name: objectengine
+ mountPath: {{ .Values.volumes.objectengine.mountPath }}
+ - name: models
+ mountPath: {{ .Values.volumes.models.mountPath }}
+ env:
+ - name: "WEBSERVER"
+ value: "{{.Values.images.httpd.url}}:{{.Values.images.httpd.nodePort}}"
+ volumes:
+ - name: shared-data
+ emptyDir: {}
+ - name: objectengine
+ hostPath:
+ path: {{ .Values.volumes.objectengine.hostPath }}
+ - name: models
+ hostPath:
+ path: {{ .Values.volumes.models.hostPath }}
+
diff --git a/agw-deployer/helm/charts/openscout/values.yaml b/agw-deployer/helm/charts/openscout/values.yaml
new file mode 100644
index 0000000..73717b7
--- /dev/null
+++ b/agw-deployer/helm/charts/openscout/values.yaml
@@ -0,0 +1,104 @@
+# Default values for openscout service.
+# This is a YAML-formatted file.
+# Declare variables to be passed into your templates.
+
+deployment:
+ replicas: 1
+ port: 9099
+ protocol: TCP
+ elkversion: 8.6.2
+ arch: amd64
+
+images:
+ # Globals
+ openscout:
+ name: openscout
+ repository: cmusatyalab/openscout
+ tag: stable
+ pullPolicy: IfNotPresent
+
+ # For each server
+ gabrielserver:
+ name: gabriel-server
+ command: ["openscout"]
+
+ objectengine:
+ name: openscout-object-engine
+ command: ["openscout-object-engine"]
+ args: ["--model","coco", "--threshold","0.7","--exclude", "1", ""]
+
+ httpd:
+ name: http-server
+ repository: httpd
+ tag: 2.4
+ port: 80
+ url: http://192.168.122.121
+ nodePort: 30082
+
+ elasticsearch:
+ name: elasticsearch
+ repository: docker.elastic.co/elasticsearch/elasticsearch
+ # Tag is elkversion-arch from deployment
+ discoverytype: single-node
+
+ kibana:
+ name: kibana
+ repository: docker.elastic.co/kibana/kibana
+ # Tag is elkversion
+
+ logstash:
+ name: logstash
+ repository: docker.elastic.co/logstash/logstash
+ # Tag is elkversion
+
+# For each volume mount
+volumes:
+ pipeline:
+ hostPath: /opt/openscout/elk/pipeline
+ mountPath: /usr/share/logstash/pipeline
+ objectengine:
+ hostPath: /opt/openscout/openscout-vol
+ mountPath: /openscout/server/images
+ models:
+ hostPath: /opt/openscout/models
+ mountPath: /openscout-server/models
+
+# For each service
+gabrielservice:
+ name: gabriel-server
+ type: ClusterIP
+ port: 5555
+ targetPort: 5555
+
+openscoutservice:
+ name: openscout-service
+ selector: gabriel-server
+ type: ClusterIP
+ port: 9099
+ targetPort: 9099
+ nodePort: 30099
+
+httpdservice:
+ name: httpd
+ type: NodePort
+ port: 80
+ nodePort: 30082
+
+elasticsearchservice:
+ name: elasticsearch
+ type: ClusterIP
+ port: 9200
+ targetPort: 9200
+
+kibanaservice:
+ name: kibana
+ type: ClusterIP
+ port: 5601
+ targetPort: 5601
+
+logstashservice:
+ name: logstash
+ type: ClusterIP
+ port: 5044
+ targetPort: 5044
+
diff --git a/agw-deployer/helm/charts/openscout/values_arm64.yaml b/agw-deployer/helm/charts/openscout/values_arm64.yaml
new file mode 100644
index 0000000..8ddf565
--- /dev/null
+++ b/agw-deployer/helm/charts/openscout/values_arm64.yaml
@@ -0,0 +1,104 @@
+# Default values for openscout service.
+# This is a YAML-formatted file.
+# Declare variables to be passed into your templates.
+
+deployment:
+ replicas: 1
+ port: 9099
+ protocol: TCP
+ elkversion: 8.6.2
+ arch: arm64
+
+images:
+ # Globals
+ openscout:
+ name: openscout
+ repository: cmusatyalab/openscout
+ tag: arm64
+ pullPolicy: IfNotPresent
+
+ # For each server
+ gabrielserver:
+ name: gabriel-server
+ command: ["openscout"]
+
+ objectengine:
+ name: openscout-object-engine
+ command: ["openscout-object-engine"]
+ args: ["--model","coco", "--threshold","0.7","--exclude", "1", ""]
+
+ httpd:
+ name: http-server
+ repository: httpd
+ tag: 2.4
+ port: 80
+ url: http://128.2.208.222
+ nodePort: 30082
+
+ elasticsearch:
+ name: elasticsearch
+ repository: docker.elastic.co/elasticsearch/elasticsearch
+ # Tag is elkversion-arch from deployment
+ discoverytype: single-node
+
+ kibana:
+ name: kibana
+ repository: docker.elastic.co/kibana/kibana
+ # Tag is elkversion
+
+ logstash:
+ name: logstash
+ repository: docker.elastic.co/logstash/logstash
+ # Tag is elkversion
+
+# For each volume mount
+volumes:
+ pipeline:
+ hostPath: /opt/openscout/elk/pipeline
+ mountPath: /usr/share/logstash/pipeline
+ objectengine:
+ hostPath: /opt/openscout/openscout-vol
+ mountPath: /openscout/server/images
+ models:
+ hostPath: /opt/openscout/models
+ mountPath: /openscout-server/models
+
+# For each service
+gabrielservice:
+ name: gabriel-server
+ type: ClusterIP
+ port: 5555
+ targetPort: 5555
+
+openscoutservice:
+ name: openscout-service
+ selector: gabriel-server
+ type: ClusterIP
+ port: 9099
+ targetPort: 9099
+ nodePort: 30099
+
+httpdservice:
+ name: httpd
+ type: NodePort
+ port: 80
+ nodePort: 30082
+
+elasticsearchservice:
+ name: elasticsearch
+ type: ClusterIP
+ port: 9200
+ targetPort: 9200
+
+kibanaservice:
+ name: kibana
+ type: ClusterIP
+ port: 5601
+ targetPort: 5601
+
+logstashservice:
+ name: logstash
+ type: ClusterIP
+ port: 5044
+ targetPort: 5044
+
diff --git a/agw-deployer/helm/charts/openscout/values_x86_64.yaml b/agw-deployer/helm/charts/openscout/values_x86_64.yaml
new file mode 100644
index 0000000..6689286
--- /dev/null
+++ b/agw-deployer/helm/charts/openscout/values_x86_64.yaml
@@ -0,0 +1,104 @@
+# Default values for openscout service.
+# This is a YAML-formatted file.
+# Declare variables to be passed into your templates.
+
+deployment:
+ replicas: 1
+ port: 9099
+ protocol: TCP
+ elkversion: 8.6.2
+ arch: amd64
+
+images:
+ # Globals
+ openscout:
+ name: openscout
+ repository: cmusatyalab/openscout
+ tag: stable
+ pullPolicy: IfNotPresent
+
+ # For each server
+ gabrielserver:
+ name: gabriel-server
+ command: ["openscout"]
+
+ objectengine:
+ name: openscout-object-engine
+ command: ["openscout-object-engine"]
+ args: ["--model","coco", "--threshold","0.7","--exclude", "1", ""]
+
+ httpd:
+ name: http-server
+ repository: httpd
+ tag: 2.4
+ port: 80
+ url: http://128.2.208.222
+ nodePort: 30082
+
+ elasticsearch:
+ name: elasticsearch
+ repository: docker.elastic.co/elasticsearch/elasticsearch
+ # Tag is elkversion-arch from deployment
+ discoverytype: single-node
+
+ kibana:
+ name: kibana
+ repository: docker.elastic.co/kibana/kibana
+ # Tag is elkversion
+
+ logstash:
+ name: logstash
+ repository: docker.elastic.co/logstash/logstash
+ # Tag is elkversion
+
+# For each volume mount
+volumes:
+ pipeline:
+ hostPath: /opt/openscout/elk/pipeline
+ mountPath: /usr/share/logstash/pipeline
+ objectengine:
+ hostPath: /opt/openscout/openscout-vol
+ mountPath: /openscout/server/images
+ models:
+ hostPath: /opt/openscout/models
+ mountPath: /openscout-server/models
+
+# For each service
+gabrielservice:
+ name: gabriel-server
+ type: ClusterIP
+ port: 5555
+ targetPort: 5555
+
+openscoutservice:
+ name: openscout-service
+ selector: gabriel-server
+ type: ClusterIP
+ port: 9099
+ targetPort: 9099
+ nodePort: 30099
+
+httpdservice:
+ name: httpd
+ type: NodePort
+ port: 80
+ nodePort: 30082
+
+elasticsearchservice:
+ name: elasticsearch
+ type: ClusterIP
+ port: 9200
+ targetPort: 9200
+
+kibanaservice:
+ name: kibana
+ type: ClusterIP
+ port: 5601
+ targetPort: 5601
+
+logstashservice:
+ name: logstash
+ type: ClusterIP
+ port: 5044
+ targetPort: 5044
+
diff --git a/agw-deployer/helm/charts/orc8r/README.md b/agw-deployer/helm/charts/orc8r/README.md
new file mode 100644
index 0000000..7e59600
--- /dev/null
+++ b/agw-deployer/helm/charts/orc8r/README.md
@@ -0,0 +1 @@
+# README
diff --git a/agw-deployer/helm/charts/webrtc/README.md b/agw-deployer/helm/charts/webrtc/README.md
new file mode 100644
index 0000000..7e59600
--- /dev/null
+++ b/agw-deployer/helm/charts/webrtc/README.md
@@ -0,0 +1 @@
+# README
diff --git a/agw-deployer/lib/__pycache__/.gitignore b/agw-deployer/lib/__pycache__/.gitignore
new file mode 100644
index 0000000..43e0210
--- /dev/null
+++ b/agw-deployer/lib/__pycache__/.gitignore
@@ -0,0 +1,2 @@
+/pyutils.cpython-38.pyc
+/simlogging.cpython-38.pyc
diff --git a/agw-deployer/lib/pyutils.py b/agw-deployer/lib/pyutils.py
new file mode 100644
index 0000000..dcf5244
--- /dev/null
+++ b/agw-deployer/lib/pyutils.py
@@ -0,0 +1,128 @@
+#!/usr/bin/env python3
+import json
+import os
+import sys
+from tqdm import tqdm
+import shlex, subprocess
+import time, datetime
+from subprocess import PIPE
+import logging, logging.config
+
+
+def wait_bar(seconds):
+ wait_range = tqdm(range(seconds))
+ for ii in wait_range:
+ wait_range.refresh()
+ time.sleep(1)
+ wait_range.write("DONE", file=None, end='\n', nolock=False)
+ wait_range.close()
+ print()
+
+def cd(path):
+ os.chdir(path)
+
+def oscmd(cmdstr): # Prints out to console and returns exit status
+ return os.system(cmdstr)
+
+def cmd(cmdstr,removeblank=False): # Returns the output of the command as a list
+ output = os.popen(cmdstr).read().split("\n")
+ if len(output) > 0 and removeblank:
+ output = [ln for ln in output if ln != ""]
+ return output
+
+def cmd0(cmdstr): # Returns first line of output as a string
+ retlst = cmd(cmdstr)
+ return retlst[0].strip()
+
+def cmds(cmdstr): # Returns all output of the command as a string
+ output = os.popen(cmdstr).read()
+ return output
+
+def cmd_subp(cmdstr):
+ args = shlex.split(cmdstr)
+ procdata = subprocess.Popen(args)
+ return procdata
+
+def prtlines(lines):
+ devnull = [print(line) for line in lines]
+
+def cmd_all(cmdstr,output=False):
+ args = shlex.split(cmdstr)
+ procdata = subprocess.run(args,stdout=PIPE,stderr=PIPE)
+ stdout = procdata.stdout.decode('utf-8').split('\n')
+ stderr = procdata.stderr.decode('utf-8').split('\n')
+ stderr = [line for line in stderr if line != ""]
+
+ if output:
+ print("STDOUT")
+ prtlines(stdout)
+ print("STDERR")
+ prtlines(stderr)
+ return {'stdout':stdout,'stderr':stderr }
+
+def humandate(unixtime):
+ retstr = datetime.datetime.fromtimestamp(unixtime).strftime('%Y-%m-%d-%H-%M-%S-%f')
+ return retstr
+
+def humandatenow():
+ retstr = datetime.datetime.now().strftime('%Y-%m-%d-%H-%M-%S-%f')
+ return retstr
+
+def printhumandatenow(prstr=""): print(humandatenow(),prstr)
+
+def getFreeMem(): return int(cmd("free -m")[1].split(" ")[-1])
+
+def getMemUsage(dirlst):
+ # needs to be called with getMemUsage(dir())
+ # These are the usual ipython objects, including this one you are creating
+ ipython_vars = ['In', 'Out', 'exit', 'quit', 'get_ipython', 'ipython_vars']
+ # Get a sorted list of the objects and their sizes
+ retlst = sorted([(x, sys.getsizeof(globals().get(x))) for x in dirlst if not x.startswith('_') and \
+ x not in sys.modules and x not in ipython_vars], key=lambda x: x[1], reverse=True)
+ return retlst
+
+def getLastLine(fn): # Faster than running a commandline
+ with open(fn,'rb') as f:
+ f.seek(-2, os.SEEK_END)
+ while f.read(1) != b'\n':
+ f.seek(-2,os.SEEK_CUR)
+ last_line = f.readline().decode()
+# print(last_line)
+ return last_line
+
+from timeit import timeit
+def timefunc(func,*args,nexp=10,**kwargs):
+ ''' time a function with *args and **kwargs '''
+ def wrapper(func, *args, **kwargs):
+ def wrapped():
+ return func(*args, **kwargs)
+ return wrapped
+ wrapped = wrapper(func,*args,**kwargs)
+ timeret = timeit(wrapped,number=nexp)
+ return timeret
+
+''' JSON '''
+def readJSON(fn):
+ retdict = {}
+ if os.path.isfile(fn):
+ with open(fn,"r") as f:
+ retdict = json.load(f)
+ else:
+ writeJSON(fn,retdict)
+ return retdict
+
+def writeJSON(fn,injson):
+ with open(fn,"w") as f:
+ json.dump(injson,f,indent=4)
+
+''' ZIP '''
+def dunzip(zipfilefull,dstdir="."): # Unzip file to destination directory -- works as pandas.series.apply
+ with zipfile.ZipFile(zipfilefull,"r") as zipd:
+ zipcontents = zipd.namelist()
+ for zipitem in zipcontents:
+ zipdstfile = os.path.join(dstdir,zipitem)
+ if not os.path.exists(zipdstfile):
+ print("Extracting %s from %s to %s" % (zipitem,zipfilefull,dstdir))
+ zipd.extract(zipitem, dstdir)
+ return zipitem # Assumes only one item
+
diff --git a/agw-deployer/lib/simlogging.py b/agw-deployer/lib/simlogging.py
new file mode 100644
index 0000000..d176240
--- /dev/null
+++ b/agw-deployer/lib/simlogging.py
@@ -0,0 +1,65 @@
+import sys, os
+import logging, logging.config
+
+# https://docs.python.org/3/library/logging.config.html#configuration-dictionary-schema
+# https://stackoverflow.com/questions/7507825/where-is-a-complete-example-of-logging-config-dictconfig
+
+def configureLogging(LOGNAME=__name__,LOGFILE='out.log', loglev = logging.DEBUG, coloron=True):
+ fmt = "%(asctime)s [%(levelname)s] %(message)s"
+ class CustomFormatter(logging.Formatter):
+ """Logging Formatter to add colors and count warning / errors"""
+ grey = "\033[37;40m"
+ bold_yellow = "\033[33;1m"
+ red = "\033[31;40m"
+ bold_red = "\033[31;1m"
+ bold_green = "\033[32;1m"
+ reset = "\033[0m"
+
+ FORMATS = {
+ logging.DEBUG: grey + fmt + reset,
+ logging.INFO: bold_green + fmt + reset,
+ logging.WARNING: bold_yellow + fmt + reset,
+ logging.ERROR: bold_red + fmt + reset,
+ logging.CRITICAL: bold_red + fmt + reset
+ }
+ def format(self, record):
+ log_fmt = self.FORMATS.get(record.levelno)
+ formatter = logging.Formatter(log_fmt)
+ return formatter.format(record)
+ logging.config.dictConfig({'version':1,'disable_existing_loggers':True,'propagate':False})
+ selflogger = logging.getLogger(LOGNAME)
+ # selflogger.propagate = False
+ fh = logging.FileHandler(LOGFILE)
+ fh.setLevel(loglev)
+ ch = logging.StreamHandler(sys.stdout)
+ ch.setLevel(loglev)
+ formatter = logging.Formatter(fmt)
+ fh.setFormatter(formatter)
+ if coloron: ch.setFormatter(CustomFormatter())
+ else: ch.setFormatter(formatter)
+ selflogger.addHandler(fh)
+ selflogger.addHandler(ch)
+ selflogger.setLevel(loglev)
+ return selflogger
+
+def getLogger(): return logging.getLogger("__main__")
+
+def mconsole(msg,level='INFO'):
+ tmplogger = getLogger()
+ if level == 'DEBUG': getLogger().debug(msg)
+ elif level == 'ERROR': getLogger().error(msg)
+ elif level == 'WARNING': getLogger().warning(msg)
+ else: getLogger().info(msg)
+
+def batch_console(batchfile=None,batchlist=None,level="INFO"):
+ if batchfile is not None and os.path.isfile(batchfile):
+ with open(batchfile,"r") as f:
+ batchlist = f.readlines()
+ if batchlist is not None:
+ for line in batchlist:
+ mconsole(line.strip('\n'),level=level)
+ else:
+ mconsole("No file or list specified",level="ERROR")
+
+LOGNAME=__name__
+LOGFILE="main.log"
\ No newline at end of file
diff --git a/agw-deployer/logs/.gitignore b/agw-deployer/logs/.gitignore
new file mode 100644
index 0000000..ae0f6c7
--- /dev/null
+++ b/agw-deployer/logs/.gitignore
@@ -0,0 +1 @@
+/agwc_compose.log
diff --git a/agw-deployer/tmp/.gitignore b/agw-deployer/tmp/.gitignore
new file mode 100644
index 0000000..a639650
--- /dev/null
+++ b/agw-deployer/tmp/.gitignore
@@ -0,0 +1,3 @@
+/etchosts
+/control_proxy.yml
+/hosts.yml
diff --git a/orc8r-deployer/README.md b/orc8r-deployer/README.md
new file mode 100644
index 0000000..e0c4a34
--- /dev/null
+++ b/orc8r-deployer/README.md
@@ -0,0 +1,119 @@
+# Orc8r-deployer
+The Orc8r Deployer has two primary approaches:
+
+1. A quick deployer that uses the current magma master branch and standard orc8r artifacts. Use this if you want a standard off-the-shelf Orc8r.
+2. A customized deployer that better allows for deployment-specific modifications. While any modifications are possible in this approach, the primary are likely to be things like use of different helm chart and container images.
+
+## Quick Deployer
+
+This document describes the Quick install process: https://magma.github.io/magma/docs/next/orc8r/deploy_using_ansible
+
+```bash
+sudo bash -c "$(curl -sL https://github.com/magma/magma-deployer/raw/main/deploy-orc8r.sh)"
+```
+
+## Customized Deployer
+
+Many users will like the simplicity of the quick deployer but will need to make some tweaks to the deployment in order to fit their environment and needs. The customized deployer approach let's you do that.
+
+To start the process, create a deployer working environment. Do this from a login other than the `magma` login (e.g., `ubuntu`).
+
+```bash
+# As ubuntu user
+cd ~
+git clone https://github.com/jblakley/magma-deployer # To change after upstreamed
+cd magma-deployer
+git checkout agw-orc8r # To change after upstreamed
+cd orc8r-deployer
+sudo bash ./deploy-orc8r-bootstrap.sh $(cd ..;pwd)
+sudo su - magma
+```
+Before running the next step, check the `hosts.yml` file to make sure that it selects the right interface's IP address. The playbook selects the first interface with an assigned IP address. This may not be correct for your deployment.
+
+```
+# As magma user
+cd ~/magma-deployer/orc8r-deployer
+ansible-playbook deploy-orc8r.yml
+```
+
+The above steps are equivalent to running the quick deployer but set up an environment where you can make modifications and redeploy. Assuming the deployment indicated no errors, you can monitor the startup of the orc8r with:
+
+```
+sudo su - magma
+k9s
+```
+
+You should see all of the orc8r pods eventually reach the `Running` state. Then run the configure step:
+
+```
+cd ~/magma-deployer/orc8r-deployer
+ansible-playbook config-orc8r.yml
+```
+
+You should now be able to access NMS and the magma API. To access NMS and using the values entered when running `deploy-orc8r-bootstrap.sh`, enter `https://.nms.` (e.g., `https://magma-test.nms.magma.local`) into a browser. You should get a browser login that accepts your `NMS email ID` and `NMS pasword` (default: `admin/admin`). To access the API, import `~magma/magma-deployer/secrets/admin-operator.pfx` into your browser and enter `https://api./swagger/v1/ui` into a browser.
+
+At this point, the Orc8r is deployed. Additional activities are either modifications to the deployment or magma and network administration tasks.
+
+### Recovering from deployment failures
+If the kubernetes deployment fails or you want to go back to the pre-kubernetes state of the platform, try the following. This procedure can also be use when you change helm charts or orc8r versions.
+
+```bash
+# Reboot and ...
+# See orc8r-deployer/bin/recover.sh
+sudo su - magma
+cd ~/magma-deployer/orc8r-deployer/rke
+rke remove
+docker stop $(docker ps -a -q)
+docker rm $(docker ps -a -q)
+
+cd ..
+ansible-playbook deploy-orc8r.kml
+```
+
+### Making changes to magma/orc8r
+If you expect to make changes to the magma code itself, now is good time to:
+
+```
+cd ~
+git clone https://github.com/magma/magma
+cd magma/orc8r
+git checkout
+```
+
+#### Making changes to Orc8r Helm Charts
+
+There are a few reasons why you may want to update the helm charts for your orc8r deployment. The most common are likely changing the default container repository or the image tag. The basic steps are:
+
+1. Create your own helm chart repository. Suggest using github for this. [
+2. Make your chart changes.
+3. Package and push your changes to your helm chart repository. ][
+4. Change the repo url in `~/magma-deployer/orc8r-deployer/roles/prerequisites/defaults/main.yml`
+5. Rerun `ansible-playbook deploy-orc8r.yml`
+
+### Making changes to Orc8r containers
+How to build the Orc8r containers is out-of-scope of this project but see this reference ][. If you make changes to the orc8r containers (magmalte, controller, and nginx), you will need to:
+1. Build and push them to a repository.
+2. Update the helm charts to use that repository, image, and tag. See `~/magma/orc8r/cloud/helm/orc8r/values.yaml`
+3. Package and push the helm charts as above.
+4. Redeploy the orchestrator using `ansible-playbook deploy-orc8r.yml`
+
+
+## Other Tips & Tricks
+
+
+
+### K9s for Management
+
+*For a handy, simple kubernetes management tool, try [k9s](https://github.com/derailed/k9s)*
+
+orc8r-deployer installs k9s for amd64 by default but if you want to do it manually, see below.
+
+```bash
+K9SVER=v0.32.5
+ARCH=amd64 # or arm64 or armv7
+wget https://github.com/derailed/k9s/releases/download/${K9SVER}/k9s_Linux_${ARCH}.tar.gz
+tar xvzf k9s_Linux_${ARCH}.tar.gz
+sudo cp k9s /usr/local/bin
+k9s
+```
+
diff --git a/orc8r-deployer/ansible.cfg b/orc8r-deployer/ansible.cfg
new file mode 100644
index 0000000..368b834
--- /dev/null
+++ b/orc8r-deployer/ansible.cfg
@@ -0,0 +1,6 @@
+[defaults]
+inventory = hosts.yml
+fact_caching_timeout = 0
+host_key_checking = False
+deprecation_warnings = False
+callbacks_enabled = profile_roles
diff --git a/orc8r-deployer/bin/recover.sh b/orc8r-deployer/bin/recover.sh
new file mode 100644
index 0000000..310abc0
--- /dev/null
+++ b/orc8r-deployer/bin/recover.sh
@@ -0,0 +1,4 @@
+cd ~/magma-deployer/rke
+rke remove
+docker stop $(docker ps -a -q)
+docker rm $(docker ps -a -q)
diff --git a/orc8r-deployer/bin/update_helm_charts.sh b/orc8r-deployer/bin/update_helm_charts.sh
new file mode 100755
index 0000000..316961b
--- /dev/null
+++ b/orc8r-deployer/bin/update_helm_charts.sh
@@ -0,0 +1,8 @@
+export GITHUB_REPO=magma-charts
+export GITHUB_REPO_URL=https://github.com
+export GITHUB_USERNAME=jblakley
+export MAGMA_ROOT=~/magma
+read -s -p "Enter Github Access Token: " GITHUB_ACCESS_TOKEN
+export GITHUB_ACCESS_TOKEN
+${MAGMA_ROOT}/orc8r/tools/helm/package.sh -d all
+
diff --git a/orc8r-deployer/config-orc8r.yml b/orc8r-deployer/config-orc8r.yml
new file mode 100644
index 0000000..2ace8a8
--- /dev/null
+++ b/orc8r-deployer/config-orc8r.yml
@@ -0,0 +1,5 @@
+---
+- name: Configure Magma Orchestrator
+ hosts: all
+ roles:
+ - role: config
diff --git a/orc8r-deployer/deploy-orc8r.sh b/orc8r-deployer/deploy-orc8r.sh
new file mode 100755
index 0000000..3bb5ad1
--- /dev/null
+++ b/orc8r-deployer/deploy-orc8r.sh
@@ -0,0 +1,118 @@
+#!/usr/bin/env bash
+
+set -e
+
+# Check if the system is Linux
+if [ $(uname) != "Linux" ]; then
+ echo "This script is only for Linux"
+ exit 1
+fi
+
+# Run as root user
+if [ $(id -u) != 0 ]; then
+ echo "Please run as root user"
+ exit 1
+fi
+
+DEFAULT_ORC8R_DOMAIN="magma.local"
+DEFAULT_NMS_ORGANIZATION_NAME="magma-test"
+DEFAULT_NMS_EMAIL_ID_AND_PASSWORD="admin"
+DEFAULT_MAGMA_API_PASSWORD="password"
+DEFAULT_RUN_PLAYBOOK="N"
+DEFAULT_DEPLOYER_PATH="$1"
+DEFAULT_ORC8R_IP=$(hostname -I | awk '{print $1}')
+GITHUB_USERNAME="jblakley"
+GITHUB_DEPLOYER_BRANCH="agw-orc8r"
+# MAGMA_DOCKER_REGISTRY="magmacore"
+MAGMA_DEPLOYER_REPO="magma-deployer"
+MAGMA_USER="magma"
+HOSTS_FILE="hosts.yml"
+
+# Take input from user
+read -p "Your Magma Orchestrator domain name? [${DEFAULT_ORC8R_DOMAIN}]: " ORC8R_DOMAIN
+ORC8R_DOMAIN="${ORC8R_DOMAIN:-${DEFAULT_ORC8R_DOMAIN}}"
+
+read -p "NMS organization(subdomain) name you want? [${DEFAULT_NMS_ORGANIZATION_NAME}]: " NMS_ORGANIZATION_NAME
+NMS_ORGANIZATION_NAME="${NMS_ORGANIZATION_NAME:-${DEFAULT_NMS_ORGANIZATION_NAME}}"
+
+read -p "Set your email ID for NMS? [${DEFAULT_NMS_EMAIL_ID_AND_PASSWORD}]: " NMS_EMAIL_ID
+NMS_EMAIL_ID="${NMS_EMAIL_ID:-${DEFAULT_NMS_EMAIL_ID_AND_PASSWORD}}"
+
+read -p "Set your password for NMS? [${DEFAULT_NMS_EMAIL_ID_AND_PASSWORD}]: " NMS_PASSWORD
+NMS_PASSWORD="${NMS_PASSWORD:-${DEFAULT_NMS_EMAIL_ID_AND_PASSWORD}}"
+
+read -p "Set your password for the API Browser Certificate? [${DEFAULT_MAGMA_API_PASSWORD}]: " MAGMA_API_PASSWORD
+MAGMA_API_PASSWORD="${MAGMA_API_PASSWORD:-${DEFAULT_MAGMA_API_PASSWORD}}"
+
+read -p "Set the Orchestrator IP Address [${DEFAULT_ORC8R_IP}]: " ORC8R_IP
+ORC8R_IP="${ORC8R_IP:-${DEFAULT_ORC8R_IP}}"
+
+read -p "If you've already cloned magma-deployer, enter the path here: [${DEFAULT_DEPLOYER_PATH}]: " DEPLOYER_PATH
+DEPLOYER_PATH="${DEPLOYER_PATH:-${DEFAULT_DEPLOYER_PATH}}"
+
+read -p "Run ansible-playbook deploy-orc8r.sh on completion? [y/N]: [${DEFAULT_RUN_PLAYBOOK}]: " RUN_PLAYBOOK
+RUN_PLAYBOOK="${RUN_PLAYBOOK:-${DEFAULT_RUN_PLAYBOOK}}"
+
+test -d /tmp/magma-deployer/ && rm -rf /tmp/magma-deployer/
+test -d "${DEPLOYER_PATH}" && cp -pr ${DEPLOYER_PATH} /tmp/magma-deployer/
+
+# Add repos for installing yq and ansible
+ls /etc/apt/sources.list.d|grep yq || add-apt-repository --yes ppa:rmescandon/yq
+ls /etc/apt/sources.list.d|grep ansible || add-apt-repository --yes ppa:ansible/ansible
+
+# Install yq and ansible
+which yq || apt install yq -y
+which ansible || apt install ansible -y
+
+# Create magma user and give sudo permissions
+id ${MAGMA_USER} || useradd -m ${MAGMA_USER} -s /bin/bash -G sudo
+grep ${MAGMA_USER} /etc/sudoers || echo "${MAGMA_USER} ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
+
+# switch to magma user
+su - ${MAGMA_USER} -c bash <<_
+echo ENTERING MAGMA USER EXECUTION
+# Genereta SSH key for magma user
+test -f ~/.ssh/id_rsa.pub || ssh-keygen -t rsa -f ~/.ssh/id_rsa -N ''
+test -f ~/.ssh/authorized_keys || cp ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys
+
+test -d "~/magma-deployer" && rm -rf ~/magma-deployer
+
+if test -d /tmp/magma-deployer
+then
+ cp -pr /tmp/magma-deployer ~/
+else
+ # Clone Magma Deployer repo
+ cd ~
+ git clone https://github.com/${GITHUB_USERNAME}/${MAGMA_DEPLOYER_REPO} --depth 1
+fi
+
+cd ~/${MAGMA_DEPLOYER_REPO}
+git checkout "${GITHUB_DEPLOYER_BRANCH}"
+cd orc8r-deployer
+
+# export variables for yq
+export ORC8R_IP=${ORC8R_IP}
+export MAGMA_USER=${MAGMA_USER}
+export ORC8R_DOMAIN=${ORC8R_DOMAIN}
+export NMS_ORGANIZATION_NAME=${NMS_ORGANIZATION_NAME}
+export NMS_EMAIL_ID=${NMS_EMAIL_ID}
+export NMS_PASSWORD=${NMS_PASSWORD}
+export MAGMA_API_PASSWORD=${MAGMA_API_PASSWORD}
+export RUN_PLAYBOOK=${RUN_PLAYBOOK}
+
+# Update values to the config file
+yq e '.all.hosts = env(ORC8R_IP)' -i ${HOSTS_FILE}
+yq e '.all.vars.ansible_user = env(MAGMA_USER)' -i ${HOSTS_FILE}
+yq e '.all.vars.orc8r_domain = env(ORC8R_DOMAIN)' -i ${HOSTS_FILE}
+yq e '.all.vars.nms_org = env(NMS_ORGANIZATION_NAME)' -i ${HOSTS_FILE}
+yq e '.all.vars.nms_id = env(NMS_EMAIL_ID)' -i ${HOSTS_FILE}
+yq e '.all.vars.nms_pass = env(NMS_PASSWORD)' -i ${HOSTS_FILE}
+yq e '.all.vars.magma_api_password = env(MAGMA_API_PASSWORD)' -i ${HOSTS_FILE}
+
+# Deploy Magma Orchestrator
+if [ "${RUN_PLAYBOOK}" = "y" ]; then
+ ansible-playbook deploy-orc8r.yml
+fi
+_
+
+rm -rf /tmp/magma-deployer
diff --git a/deploy-orc8r.yml b/orc8r-deployer/deploy-orc8r.yml
similarity index 100%
rename from deploy-orc8r.yml
rename to orc8r-deployer/deploy-orc8r.yml
diff --git a/fix-elasticsearch.yml b/orc8r-deployer/fix-elasticsearch.yml
similarity index 100%
rename from fix-elasticsearch.yml
rename to orc8r-deployer/fix-elasticsearch.yml
diff --git a/hosts.yml b/orc8r-deployer/hosts.yml
similarity index 100%
rename from hosts.yml
rename to orc8r-deployer/hosts.yml
diff --git a/roles/config/defaults/main.yml b/orc8r-deployer/roles/config/defaults/main.yml
similarity index 100%
rename from roles/config/defaults/main.yml
rename to orc8r-deployer/roles/config/defaults/main.yml
diff --git a/roles/config/tasks/main.yml b/orc8r-deployer/roles/config/tasks/main.yml
similarity index 100%
rename from roles/config/tasks/main.yml
rename to orc8r-deployer/roles/config/tasks/main.yml
diff --git a/roles/dns/defaults/main.yml b/orc8r-deployer/roles/dns/defaults/main.yml
similarity index 100%
rename from roles/dns/defaults/main.yml
rename to orc8r-deployer/roles/dns/defaults/main.yml
diff --git a/orc8r-deployer/roles/dns/tasks/main.yml b/orc8r-deployer/roles/dns/tasks/main.yml
new file mode 100644
index 0000000..f977a14
--- /dev/null
+++ b/orc8r-deployer/roles/dns/tasks/main.yml
@@ -0,0 +1,20 @@
+---
+- name: Update the DNS Values
+ become: yes
+ ansible.builtin.blockinfile:
+ path: /etc/hosts
+ block: |
+ {{ ansible_host }} api.{{ orc8r_domain }}
+ {{ ansible_host }} {{ nms_org }}.nms.{{ orc8r_domain }}
+ {{ ansible_host }} fluentd.{{ orc8r_domain }}
+ {{ ansible_host }} controller.{{ orc8r_domain }}
+ {{ ansible_host }} bootstrapper-controller.{{ orc8r_domain }}
+
+- name: Check these DNS Values
+ debug:
+ msg:
+ - "{{ ansible_host }} api.{{ orc8r_domain }}"
+ - "{{ ansible_host }} *.nms.{{ orc8r_domain }}"
+ - "{{ ansible_host }} fluentd.{{ orc8r_domain }}"
+ - "{{ ansible_host }} controller.{{ orc8r_domain }}"
+ - "{{ ansible_host }} bootstrapper-controller.{{ orc8r_domain }}"
diff --git a/orc8r-deployer/roles/docker/defaults/main.yml b/orc8r-deployer/roles/docker/defaults/main.yml
new file mode 100644
index 0000000..476d017
--- /dev/null
+++ b/orc8r-deployer/roles/docker/defaults/main.yml
@@ -0,0 +1,2 @@
+---
+docker_version: "20.10"
diff --git a/roles/docker/tasks/main.yml b/orc8r-deployer/roles/docker/tasks/main.yml
similarity index 100%
rename from roles/docker/tasks/main.yml
rename to orc8r-deployer/roles/docker/tasks/main.yml
diff --git a/roles/elasticsearch/defaults/main.yml b/orc8r-deployer/roles/elasticsearch/defaults/main.yml
similarity index 100%
rename from roles/elasticsearch/defaults/main.yml
rename to orc8r-deployer/roles/elasticsearch/defaults/main.yml
diff --git a/roles/elasticsearch/tasks/main.yml b/orc8r-deployer/roles/elasticsearch/tasks/main.yml
similarity index 100%
rename from roles/elasticsearch/tasks/main.yml
rename to orc8r-deployer/roles/elasticsearch/tasks/main.yml
diff --git a/roles/fluentd/defaults/main.yml b/orc8r-deployer/roles/fluentd/defaults/main.yml
similarity index 100%
rename from roles/fluentd/defaults/main.yml
rename to orc8r-deployer/roles/fluentd/defaults/main.yml
diff --git a/roles/fluentd/tasks/main.yml b/orc8r-deployer/roles/fluentd/tasks/main.yml
similarity index 100%
rename from roles/fluentd/tasks/main.yml
rename to orc8r-deployer/roles/fluentd/tasks/main.yml
diff --git a/roles/haproxy/defaults/main.yml b/orc8r-deployer/roles/haproxy/defaults/main.yml
similarity index 100%
rename from roles/haproxy/defaults/main.yml
rename to orc8r-deployer/roles/haproxy/defaults/main.yml
diff --git a/roles/haproxy/tasks/main.yml b/orc8r-deployer/roles/haproxy/tasks/main.yml
similarity index 100%
rename from roles/haproxy/tasks/main.yml
rename to orc8r-deployer/roles/haproxy/tasks/main.yml
diff --git a/roles/kubernetes/defaults/main.yml b/orc8r-deployer/roles/kubernetes/defaults/main.yml
similarity index 100%
rename from roles/kubernetes/defaults/main.yml
rename to orc8r-deployer/roles/kubernetes/defaults/main.yml
diff --git a/roles/kubernetes/tasks/install-rke.yml b/orc8r-deployer/roles/kubernetes/tasks/install-rke.yml
similarity index 100%
rename from roles/kubernetes/tasks/install-rke.yml
rename to orc8r-deployer/roles/kubernetes/tasks/install-rke.yml
diff --git a/roles/kubernetes/tasks/main.yml b/orc8r-deployer/roles/kubernetes/tasks/main.yml
similarity index 100%
rename from roles/kubernetes/tasks/main.yml
rename to orc8r-deployer/roles/kubernetes/tasks/main.yml
diff --git a/roles/kubernetes/tasks/setup-ssh-key.yml b/orc8r-deployer/roles/kubernetes/tasks/setup-ssh-key.yml
similarity index 100%
rename from roles/kubernetes/tasks/setup-ssh-key.yml
rename to orc8r-deployer/roles/kubernetes/tasks/setup-ssh-key.yml
diff --git a/roles/kubernetes/templates/cluster.yml.j2 b/orc8r-deployer/roles/kubernetes/templates/cluster.yml.j2
similarity index 100%
rename from roles/kubernetes/templates/cluster.yml.j2
rename to orc8r-deployer/roles/kubernetes/templates/cluster.yml.j2
diff --git a/roles/metallb/defaults/main.yml b/orc8r-deployer/roles/metallb/defaults/main.yml
similarity index 100%
rename from roles/metallb/defaults/main.yml
rename to orc8r-deployer/roles/metallb/defaults/main.yml
diff --git a/roles/metallb/tasks/ec2-ip.yml b/orc8r-deployer/roles/metallb/tasks/ec2-ip.yml
similarity index 100%
rename from roles/metallb/tasks/ec2-ip.yml
rename to orc8r-deployer/roles/metallb/tasks/ec2-ip.yml
diff --git a/roles/metallb/tasks/host-ip.yml b/orc8r-deployer/roles/metallb/tasks/host-ip.yml
similarity index 100%
rename from roles/metallb/tasks/host-ip.yml
rename to orc8r-deployer/roles/metallb/tasks/host-ip.yml
diff --git a/roles/metallb/tasks/ip-pool.yml b/orc8r-deployer/roles/metallb/tasks/ip-pool.yml
similarity index 100%
rename from roles/metallb/tasks/ip-pool.yml
rename to orc8r-deployer/roles/metallb/tasks/ip-pool.yml
diff --git a/roles/metallb/tasks/kind-ip.yml b/orc8r-deployer/roles/metallb/tasks/kind-ip.yml
similarity index 100%
rename from roles/metallb/tasks/kind-ip.yml
rename to orc8r-deployer/roles/metallb/tasks/kind-ip.yml
diff --git a/roles/metallb/tasks/main.yml b/orc8r-deployer/roles/metallb/tasks/main.yml
similarity index 100%
rename from roles/metallb/tasks/main.yml
rename to orc8r-deployer/roles/metallb/tasks/main.yml
diff --git a/roles/metallb/tasks/metallb-speaker.yml b/orc8r-deployer/roles/metallb/tasks/metallb-speaker.yml
similarity index 100%
rename from roles/metallb/tasks/metallb-speaker.yml
rename to orc8r-deployer/roles/metallb/tasks/metallb-speaker.yml
diff --git a/roles/metallb/tasks/metallb.yml b/orc8r-deployer/roles/metallb/tasks/metallb.yml
similarity index 100%
rename from roles/metallb/tasks/metallb.yml
rename to orc8r-deployer/roles/metallb/tasks/metallb.yml
diff --git a/roles/openebs/defaults/main.yml b/orc8r-deployer/roles/openebs/defaults/main.yml
similarity index 100%
rename from roles/openebs/defaults/main.yml
rename to orc8r-deployer/roles/openebs/defaults/main.yml
diff --git a/roles/openebs/tasks/main.yml b/orc8r-deployer/roles/openebs/tasks/main.yml
similarity index 100%
rename from roles/openebs/tasks/main.yml
rename to orc8r-deployer/roles/openebs/tasks/main.yml
diff --git a/orc8r-deployer/roles/orc8r/defaults/main.yml b/orc8r-deployer/roles/orc8r/defaults/main.yml
new file mode 100644
index 0000000..aa99cdf
--- /dev/null
+++ b/orc8r-deployer/roles/orc8r/defaults/main.yml
@@ -0,0 +1,16 @@
+---
+orc8r_domain: "magma.local"
+magma_namespace: "orc8r"
+magma_docker_registry: "linuxfoundation.jfrog.io/magma-docker-test"
+magma_docker_tag: "v1.9"
+magma_directory: "magma-deployer"
+magma_service_type: "ClusterIP"
+orc8r_db_driver: "postgres"
+orc8r_db_name: "magma"
+orc8r_db_host: "postgresql"
+orc8r_db_port: "5432"
+orc8r_db_user: "postgres"
+orc8r_db_pass: "postgres"
+deploy_wifi_orc8r: false
+deploy_domain_proxy: false
+deploy_fbinternal_orc8r: false
diff --git a/orc8r-deployer/roles/orc8r/tasks/cwf-orc8r.yml b/orc8r-deployer/roles/orc8r/tasks/cwf-orc8r.yml
new file mode 100644
index 0000000..d242066
--- /dev/null
+++ b/orc8r-deployer/roles/orc8r/tasks/cwf-orc8r.yml
@@ -0,0 +1,14 @@
+---
+- name: Install CWF Orc8r
+ kubernetes.core.helm:
+ name: cwf-orc8r
+ chart_ref: orc8r/cwf-orc8r
+ release_namespace: "{{ magma_namespace }}"
+ create_namespace: true
+ values:
+ controller:
+ image:
+ repository: "{{ magma_docker_registry }}/controller"
+ tag: "{{ magma_docker_tag }}"
+ env:
+ orc8r_domain_name: "{{ orc8r_domain }}"
diff --git a/orc8r-deployer/roles/orc8r/tasks/domain-proxy.yml b/orc8r-deployer/roles/orc8r/tasks/domain-proxy.yml
new file mode 100644
index 0000000..10bc5af
--- /dev/null
+++ b/orc8r-deployer/roles/orc8r/tasks/domain-proxy.yml
@@ -0,0 +1,57 @@
+---
+- name: Install Domain Proxy
+ kubernetes.core.helm:
+ name: domain-proxy
+ chart_ref: orc8r/domain-proxy
+ release_namespace: "{{ magma_namespace }}"
+ create_namespace: true
+ values:
+ dp:
+ configuration_controller:
+ image:
+ repository: "{{ magma_docker_registry }}/configuration-controller"
+ tag: "{{ magma_docker_tag }}"
+ database:
+ driver: "{{ orc8r_db_driver }}"
+ db: "{{ orc8r_db_name }}"
+ host: "{{ orc8r_db_host }}"
+ port: "{{ orc8r_db_port }}"
+ user: "{{ orc8r_db_user }}"
+ pass: "{{ orc8r_db_pass }}"
+ radio_controller:
+ image:
+ repository: "{{ magma_docker_registry }}/radio-controller"
+ tag: "{{ magma_docker_tag }}"
+ database:
+ driver: "{{ orc8r_db_driver }}"
+ db: "{{ orc8r_db_name }}"
+ host: "{{ orc8r_db_host }}"
+ port: "{{ orc8r_db_port }}"
+ user: "{{ orc8r_db_user }}"
+ pass: "{{ orc8r_db_pass }}"
+ active_mode_controller:
+ image:
+ repository: "{{ magma_docker_registry }}/active-mode-controller"
+ tag: "{{ magma_docker_tag }}"
+ database:
+ driver: "{{ orc8r_db_driver }}"
+ db: "{{ orc8r_db_name }}"
+ host: "{{ orc8r_db_host }}"
+ port: "{{ orc8r_db_port }}"
+ user: "{{ orc8r_db_user }}"
+ pass: "{{ orc8r_db_pass }}"
+ db_service:
+ image:
+ repository: "{{ magma_docker_registry }}/db-service"
+ tag: "{{ magma_docker_tag }}"
+ database:
+ driver: "{{ orc8r_db_driver }}"
+ db: "{{ orc8r_db_name }}"
+ host: "{{ orc8r_db_host }}"
+ port: "{{ orc8r_db_port }}"
+ user: "{{ orc8r_db_user }}"
+ pass: "{{ orc8r_db_pass }}"
+ fluentd:
+ secret:
+ certs:
+ enabled: true
diff --git a/orc8r-deployer/roles/orc8r/tasks/fbinternal-orc8r.yml b/orc8r-deployer/roles/orc8r/tasks/fbinternal-orc8r.yml
new file mode 100644
index 0000000..25b8f57
--- /dev/null
+++ b/orc8r-deployer/roles/orc8r/tasks/fbinternal-orc8r.yml
@@ -0,0 +1,14 @@
+---
+- name: Install Fbinternal Orc8r
+ kubernetes.core.helm:
+ name: fbinternal-orc8r
+ chart_ref: orc8r/fbinternal-orc8r
+ release_namespace: "{{ magma_namespace }}"
+ create_namespace: true
+ values:
+ controller:
+ image:
+ repository: "{{ magma_docker_registry }}/controller"
+ tag: "{{ magma_docker_tag }}"
+ env:
+ orc8r_domain_name: "{{ orc8r_domain }}"
diff --git a/orc8r-deployer/roles/orc8r/tasks/feg-orc8r.yml b/orc8r-deployer/roles/orc8r/tasks/feg-orc8r.yml
new file mode 100644
index 0000000..0c769b4
--- /dev/null
+++ b/orc8r-deployer/roles/orc8r/tasks/feg-orc8r.yml
@@ -0,0 +1,14 @@
+---
+- name: Install FEG Orc8r
+ kubernetes.core.helm:
+ name: feg-orc8r
+ chart_ref: orc8r/feg-orc8r
+ release_namespace: "{{ magma_namespace }}"
+ create_namespace: true
+ values:
+ controller:
+ image:
+ repository: "{{ magma_docker_registry }}/controller"
+ tag: "{{ magma_docker_tag }}"
+ env:
+ orc8r_domain_name: "{{ orc8r_domain }}"
diff --git a/orc8r-deployer/roles/orc8r/tasks/lte-orc8r.yml b/orc8r-deployer/roles/orc8r/tasks/lte-orc8r.yml
new file mode 100644
index 0000000..c9cc181
--- /dev/null
+++ b/orc8r-deployer/roles/orc8r/tasks/lte-orc8r.yml
@@ -0,0 +1,14 @@
+---
+- name: Install LTE Orc8r
+ kubernetes.core.helm:
+ name: lte-orc8r
+ chart_ref: orc8r/lte-orc8r
+ release_namespace: "{{ magma_namespace }}"
+ create_namespace: true
+ values:
+ controller:
+ image:
+ repository: "{{ magma_docker_registry }}/controller"
+ tag: "{{ magma_docker_tag }}"
+ env:
+ orc8r_domain_name: "{{ orc8r_domain }}"
diff --git a/orc8r-deployer/roles/orc8r/tasks/main.yml b/orc8r-deployer/roles/orc8r/tasks/main.yml
new file mode 100644
index 0000000..c4ba390
--- /dev/null
+++ b/orc8r-deployer/roles/orc8r/tasks/main.yml
@@ -0,0 +1,14 @@
+---
+- import_tasks: set-namespace.yml
+- import_tasks: volume-claims.yml
+- import_tasks: register-secrets.yml
+- import_tasks: orc8r.yml
+- import_tasks: lte-orc8r.yml
+- import_tasks: feg-orc8r.yml
+- import_tasks: cwf-orc8r.yml
+- import_tasks: wifi-orc8r.yml
+ when: deploy_wifi_orc8r
+- import_tasks: domain-proxy.yml
+ when: deploy_domain_proxy
+- import_tasks: fbinternal-orc8r.yml
+ when: deploy_fbinternal_orc8r
diff --git a/orc8r-deployer/roles/orc8r/tasks/orc8r.yml b/orc8r-deployer/roles/orc8r/tasks/orc8r.yml
new file mode 100644
index 0000000..b1cb2db
--- /dev/null
+++ b/orc8r-deployer/roles/orc8r/tasks/orc8r.yml
@@ -0,0 +1,121 @@
+---
+- name: Install Orc8r
+ kubernetes.core.helm:
+ name: orc8r
+ chart_ref: orc8r/orc8r
+ release_namespace: "{{ magma_namespace }}"
+ create_namespace: true
+ values:
+ nms:
+ magmalte:
+ image:
+ repository: "{{ magma_docker_registry }}/magmalte"
+ tag: "{{ magma_docker_tag }}"
+ pullPolicy: IfNotPresent
+ env:
+ api_host: orc8r-nginx-proxy
+ mysql_host: "{{ orc8r_db_host }}"
+ mysql_user: "{{ orc8r_db_user }}"
+ mysql_pass: "{{ orc8r_db_pass }}"
+ nginx:
+ image:
+ pullPolicy: IfNotPresent
+ service:
+ type: "{{ magma_service_type }}"
+ secret:
+ certs: orc8r-secrets-certs
+ nginx:
+ replicas: 1
+ image:
+ repository: "{{ magma_docker_registry }}/nginx"
+ tag: "{{ magma_docker_tag }}"
+ spec:
+ hostname: controller.{{ orc8r_domain }}
+ service:
+ type: "{{ magma_service_type }}"
+ controller:
+ replicas: 1
+ image:
+ repository: "{{ magma_docker_registry }}/controller"
+ tag: "{{ magma_docker_tag }}"
+ env:
+ orc8r_domain_name: "{{ orc8r_domain }}"
+ podDisruptionBudget:
+ enabled: true
+ metrics:
+ prometheus:
+ includeOrc8rAlerts: true
+ create: true
+ prometheusCache:
+ create: true
+ limit: 500000
+ prometheusConfigurer:
+ create: true
+ alertmanager:
+ create: true
+ alertmanagerConfigurer:
+ create: true
+ metrics:
+ volumes:
+ prometheusConfig:
+ volumeSpec:
+ persistentVolumeClaim:
+ claimName: promcfg
+ prometheusData:
+ volumeSpec:
+ persistentVolumeClaim:
+ claimName: promdata
+ userGrafana:
+ volumes:
+ datasources:
+ volumeSpec:
+ persistentVolumeClaim:
+ claimName: grafanadatasources
+ dashboardproviders:
+ volumeSpec:
+ persistentVolumeClaim:
+ claimName: grafanaproviders
+ dashboards:
+ volumeSpec:
+ persistentVolumeClaim:
+ claimName: grafanadashboards
+ grafanaData:
+ volumeSpec:
+ persistentVolumeClaim:
+ claimName: grafanadata
+ secrets:
+ create: true
+ docker:
+ registry: docker.io
+ username: username
+ password: password
+ secret:
+ certs:
+ enabled: true
+ files:
+ rootCA.pem: |
+ {{ rootCA_pem['content'] | b64decode }}
+ rootCA.key: |
+ {{ rootCA_key['content'] | b64decode }}
+ controller.crt: |
+ {{ controller_crt['content'] | b64decode }}
+ controller.key: |
+ {{ controller_key['content'] | b64decode }}
+ admin_operator.pem: |
+ {{ admin_operator_pem['content'] | b64decode }}
+ admin_operator.key.pem: |
+ {{ admin_operator_key_pem['content'] | b64decode }}
+ fluentd.pem: |
+ {{ fluentd_pem['content'] | b64decode }}
+ fluentd.key: |
+ {{ fluentd_key['content'] | b64decode }}
+ bootstrapper.key: |
+ {{ bootstrapper_key['content'] | b64decode }}
+ certifier.key: |
+ {{ certifier_key['content'] | b64decode }}
+ certifier.pem: |
+ {{ certifier_pem['content'] | b64decode }}
+ nms_nginx.key.pem: |
+ {{ nms_nginx_key_pem['content'] | b64decode }}
+ nms_nginx.pem: |
+ {{ nms_nginx_pem['content'] | b64decode }}
diff --git a/orc8r-deployer/roles/orc8r/tasks/register-secrets.yml b/orc8r-deployer/roles/orc8r/tasks/register-secrets.yml
new file mode 100644
index 0000000..2828725
--- /dev/null
+++ b/orc8r-deployer/roles/orc8r/tasks/register-secrets.yml
@@ -0,0 +1,65 @@
+---
+- name: Register rootCA.pem
+ slurp:
+ src: "{{ ansible_env.HOME }}/{{ magma_directory }}/secrets/rootCA.pem"
+ register: rootCA_pem
+
+- name: Register rootCA.key
+ slurp:
+ src: "{{ ansible_env.HOME }}/{{ magma_directory }}/secrets/rootCA.key"
+ register: rootCA_key
+
+- name: Register controller.crt
+ slurp:
+ src: "{{ ansible_env.HOME }}/{{ magma_directory }}/secrets/controller.crt"
+ register: controller_crt
+
+- name: Register controller.key
+ slurp:
+ src: "{{ ansible_env.HOME }}/{{ magma_directory }}/secrets/controller.key"
+ register: controller_key
+
+- name: Register admin_operator.pem
+ slurp:
+ src: "{{ ansible_env.HOME }}/{{ magma_directory }}/secrets/admin_operator.pem"
+ register: admin_operator_pem
+
+- name: Register admin_operator.key.pem
+ slurp:
+ src: "{{ ansible_env.HOME }}/{{ magma_directory }}/secrets/admin_operator.key.pem"
+ register: admin_operator_key_pem
+
+- name: Register fluentd.pem
+ slurp:
+ src: "{{ ansible_env.HOME }}/{{ magma_directory }}/secrets/fluentd.pem"
+ register: fluentd_pem
+
+- name: Register fluentd.key
+ slurp:
+ src: "{{ ansible_env.HOME }}/{{ magma_directory }}/secrets/fluentd.key"
+ register: fluentd_key
+
+- name: Register bootstrapper.key
+ slurp:
+ src: "{{ ansible_env.HOME }}/{{ magma_directory }}/secrets/bootstrapper.key"
+ register: bootstrapper_key
+
+- name: Register certifier.key
+ slurp:
+ src: "{{ ansible_env.HOME }}/{{ magma_directory }}/secrets/certifier.key"
+ register: certifier_key
+
+- name: Register certifier.pem
+ slurp:
+ src: "{{ ansible_env.HOME }}/{{ magma_directory }}/secrets/certifier.pem"
+ register: certifier_pem
+
+- name: Register nms_nginx.key.pem
+ slurp:
+ src: "{{ ansible_env.HOME }}/{{ magma_directory }}/secrets/nms_nginx.key.pem"
+ register: nms_nginx_key_pem
+
+- name: Register nms_nginx.pem
+ slurp:
+ src: "{{ ansible_env.HOME }}/{{ magma_directory }}/secrets/nms_nginx.pem"
+ register: nms_nginx_pem
diff --git a/orc8r-deployer/roles/orc8r/tasks/set-namespace.yml b/orc8r-deployer/roles/orc8r/tasks/set-namespace.yml
new file mode 100644
index 0000000..9ad2110
--- /dev/null
+++ b/orc8r-deployer/roles/orc8r/tasks/set-namespace.yml
@@ -0,0 +1,3 @@
+---
+- name: Set {{ magma_namespace }} as default namespace
+ command: kubectl config set-context --current --namespace {{ magma_namespace }}
diff --git a/orc8r-deployer/roles/orc8r/tasks/volume-claims.yml b/orc8r-deployer/roles/orc8r/tasks/volume-claims.yml
new file mode 100644
index 0000000..35ab740
--- /dev/null
+++ b/orc8r-deployer/roles/orc8r/tasks/volume-claims.yml
@@ -0,0 +1,22 @@
+---
+- name: Create Volume Claims for Orchestrator
+ kubernetes.core.k8s:
+ namespace: "{{ magma_namespace }}"
+ definition:
+ apiVersion: v1
+ kind: PersistentVolumeClaim
+ metadata:
+ name: "{{ item.name }}"
+ spec:
+ accessModes:
+ - ReadWriteOnce
+ resources:
+ requests:
+ storage: "{{ item.storage }}"
+ with_items:
+ - { name: "promcfg", storage: "1Gi" }
+ - { name: "promdata", storage: "20Gi" }
+ - { name: "grafanadata", storage: "2Gi" }
+ - { name: "grafanadashboards", storage: "2Gi" }
+ - { name: "grafanaproviders", storage: "100M" }
+ - { name: "grafanadatasources", storage: "100M" }
diff --git a/orc8r-deployer/roles/orc8r/tasks/wifi-orc8r.yml b/orc8r-deployer/roles/orc8r/tasks/wifi-orc8r.yml
new file mode 100644
index 0000000..26ff33c
--- /dev/null
+++ b/orc8r-deployer/roles/orc8r/tasks/wifi-orc8r.yml
@@ -0,0 +1,14 @@
+---
+- name: Install WIFI Orc8r
+ kubernetes.core.helm:
+ name: wifi-orc8r
+ chart_ref: orc8r/wifi-orc8r
+ release_namespace: "{{ magma_namespace }}"
+ create_namespace: true
+ values:
+ controller:
+ image:
+ repository: "{{ magma_docker_registry }}/controller"
+ tag: "{{ magma_docker_tag }}"
+ env:
+ orc8r_domain_name: "{{ orc8r_domain }}"
diff --git a/roles/postgresql/defaults/main.yml b/orc8r-deployer/roles/postgresql/defaults/main.yml
similarity index 100%
rename from roles/postgresql/defaults/main.yml
rename to orc8r-deployer/roles/postgresql/defaults/main.yml
diff --git a/roles/postgresql/tasks/main.yml b/orc8r-deployer/roles/postgresql/tasks/main.yml
similarity index 100%
rename from roles/postgresql/tasks/main.yml
rename to orc8r-deployer/roles/postgresql/tasks/main.yml
diff --git a/roles/prerequisites/defaults/main.yml b/orc8r-deployer/roles/prerequisites/defaults/main.yml
similarity index 57%
rename from roles/prerequisites/defaults/main.yml
rename to orc8r-deployer/roles/prerequisites/defaults/main.yml
index 2ba5c5c..133951b 100644
--- a/roles/prerequisites/defaults/main.yml
+++ b/orc8r-deployer/roles/prerequisites/defaults/main.yml
@@ -3,4 +3,5 @@ rke_version: "v1.4.3"
helm_version: "v3.11.2"
kubectl_version: "v1.26.2"
magma_directory: "magma-deployer"
-orc8r_helm_repo: "https://linuxfoundation.jfrog.io/artifactory/magma-helm-prod"
+orc8r_helm_repo: "https://jblakley.github.io/magma-charts"
+k9s_version: "v0.31.7"
diff --git a/roles/prerequisites/tasks/add-helm-repo.yml b/orc8r-deployer/roles/prerequisites/tasks/add-helm-repo.yml
similarity index 100%
rename from roles/prerequisites/tasks/add-helm-repo.yml
rename to orc8r-deployer/roles/prerequisites/tasks/add-helm-repo.yml
diff --git a/roles/prerequisites/tasks/install-binaries.yml b/orc8r-deployer/roles/prerequisites/tasks/install-binaries.yml
similarity index 80%
rename from roles/prerequisites/tasks/install-binaries.yml
rename to orc8r-deployer/roles/prerequisites/tasks/install-binaries.yml
index 3355d1c..67b68a7 100644
--- a/roles/prerequisites/tasks/install-binaries.yml
+++ b/orc8r-deployer/roles/prerequisites/tasks/install-binaries.yml
@@ -26,3 +26,10 @@
dest: /usr/local/bin/helm
mode: '0755'
remote_src: yes
+
+- name: Download, unzip and install k9s
+ become: yes
+ unarchive:
+ src: https://github.com/derailed/k9s/releases/download/{{ k9s_version }}/k9s_Linux_amd64.tar.gz
+ dest: /usr/local/bin
+ copy: no
diff --git a/roles/prerequisites/tasks/install-packages.yml b/orc8r-deployer/roles/prerequisites/tasks/install-packages.yml
similarity index 100%
rename from roles/prerequisites/tasks/install-packages.yml
rename to orc8r-deployer/roles/prerequisites/tasks/install-packages.yml
diff --git a/roles/prerequisites/tasks/main.yml b/orc8r-deployer/roles/prerequisites/tasks/main.yml
similarity index 100%
rename from roles/prerequisites/tasks/main.yml
rename to orc8r-deployer/roles/prerequisites/tasks/main.yml
diff --git a/orc8r-deployer/roles/prerequisites/tasks/set-operating-system.yml b/orc8r-deployer/roles/prerequisites/tasks/set-operating-system.yml
new file mode 100644
index 0000000..51017a0
--- /dev/null
+++ b/orc8r-deployer/roles/prerequisites/tasks/set-operating-system.yml
@@ -0,0 +1,10 @@
+---
+- name: Set darwin as Operating System
+ when: ansible_distribution == "MacOSX"
+ set_fact:
+ operating_system: "darwin"
+
+- name: Set linux as Operating System
+ when: ansible_distribution != "MacOSX"
+ set_fact:
+ operating_system: "linux"
diff --git a/roles/prometheus_cache_cleanup/defaults/main.yml b/orc8r-deployer/roles/prometheus_cache_cleanup/defaults/main.yml
similarity index 100%
rename from roles/prometheus_cache_cleanup/defaults/main.yml
rename to orc8r-deployer/roles/prometheus_cache_cleanup/defaults/main.yml
diff --git a/roles/prometheus_cache_cleanup/tasks/cronjob.yml b/orc8r-deployer/roles/prometheus_cache_cleanup/tasks/cronjob.yml
similarity index 100%
rename from roles/prometheus_cache_cleanup/tasks/cronjob.yml
rename to orc8r-deployer/roles/prometheus_cache_cleanup/tasks/cronjob.yml
diff --git a/roles/prometheus_cache_cleanup/tasks/main.yml b/orc8r-deployer/roles/prometheus_cache_cleanup/tasks/main.yml
similarity index 100%
rename from roles/prometheus_cache_cleanup/tasks/main.yml
rename to orc8r-deployer/roles/prometheus_cache_cleanup/tasks/main.yml
diff --git a/roles/prometheus_cache_cleanup/tasks/role-binding.yml b/orc8r-deployer/roles/prometheus_cache_cleanup/tasks/role-binding.yml
similarity index 100%
rename from roles/prometheus_cache_cleanup/tasks/role-binding.yml
rename to orc8r-deployer/roles/prometheus_cache_cleanup/tasks/role-binding.yml
diff --git a/roles/prometheus_cache_cleanup/tasks/role.yml b/orc8r-deployer/roles/prometheus_cache_cleanup/tasks/role.yml
similarity index 100%
rename from roles/prometheus_cache_cleanup/tasks/role.yml
rename to orc8r-deployer/roles/prometheus_cache_cleanup/tasks/role.yml
diff --git a/roles/prometheus_cache_cleanup/tasks/service-account.yml b/orc8r-deployer/roles/prometheus_cache_cleanup/tasks/service-account.yml
similarity index 100%
rename from roles/prometheus_cache_cleanup/tasks/service-account.yml
rename to orc8r-deployer/roles/prometheus_cache_cleanup/tasks/service-account.yml
diff --git a/roles/remove_elasticsearch/defaults/main.yml b/orc8r-deployer/roles/remove_elasticsearch/defaults/main.yml
similarity index 100%
rename from roles/remove_elasticsearch/defaults/main.yml
rename to orc8r-deployer/roles/remove_elasticsearch/defaults/main.yml
diff --git a/roles/remove_elasticsearch/tasks/main.yml b/orc8r-deployer/roles/remove_elasticsearch/tasks/main.yml
similarity index 100%
rename from roles/remove_elasticsearch/tasks/main.yml
rename to orc8r-deployer/roles/remove_elasticsearch/tasks/main.yml
diff --git a/roles/secrets/defaults/main.yml b/orc8r-deployer/roles/secrets/defaults/main.yml
similarity index 66%
rename from roles/secrets/defaults/main.yml
rename to orc8r-deployer/roles/secrets/defaults/main.yml
index 65a25fa..b7b2d27 100644
--- a/roles/secrets/defaults/main.yml
+++ b/orc8r-deployer/roles/secrets/defaults/main.yml
@@ -1,4 +1,4 @@
---
orc8r_domain: "magma.local"
magma_directory: "magma-deployer"
-magma_api_password: "password"
+# magma_api_password: "password"
diff --git a/roles/secrets/tasks/admin-operator.yml b/orc8r-deployer/roles/secrets/tasks/admin-operator.yml
similarity index 100%
rename from roles/secrets/tasks/admin-operator.yml
rename to orc8r-deployer/roles/secrets/tasks/admin-operator.yml
diff --git a/roles/secrets/tasks/bootstrapper.yml b/orc8r-deployer/roles/secrets/tasks/bootstrapper.yml
similarity index 100%
rename from roles/secrets/tasks/bootstrapper.yml
rename to orc8r-deployer/roles/secrets/tasks/bootstrapper.yml
diff --git a/roles/secrets/tasks/certifier.yml b/orc8r-deployer/roles/secrets/tasks/certifier.yml
similarity index 100%
rename from roles/secrets/tasks/certifier.yml
rename to orc8r-deployer/roles/secrets/tasks/certifier.yml
diff --git a/roles/secrets/tasks/controller.yml b/orc8r-deployer/roles/secrets/tasks/controller.yml
similarity index 100%
rename from roles/secrets/tasks/controller.yml
rename to orc8r-deployer/roles/secrets/tasks/controller.yml
diff --git a/roles/secrets/tasks/fluentd.yml b/orc8r-deployer/roles/secrets/tasks/fluentd.yml
similarity index 100%
rename from roles/secrets/tasks/fluentd.yml
rename to orc8r-deployer/roles/secrets/tasks/fluentd.yml
diff --git a/roles/secrets/tasks/main.yml b/orc8r-deployer/roles/secrets/tasks/main.yml
similarity index 100%
rename from roles/secrets/tasks/main.yml
rename to orc8r-deployer/roles/secrets/tasks/main.yml
diff --git a/roles/secrets/tasks/nms.yml b/orc8r-deployer/roles/secrets/tasks/nms.yml
similarity index 100%
rename from roles/secrets/tasks/nms.yml
rename to orc8r-deployer/roles/secrets/tasks/nms.yml
diff --git a/roles/secrets/tasks/rootCA.yml b/orc8r-deployer/roles/secrets/tasks/rootCA.yml
similarity index 100%
rename from roles/secrets/tasks/rootCA.yml
rename to orc8r-deployer/roles/secrets/tasks/rootCA.yml
diff --git a/roles/secrets/tasks/setup-secrets.yml b/orc8r-deployer/roles/secrets/tasks/setup-secrets.yml
similarity index 100%
rename from roles/secrets/tasks/setup-secrets.yml
rename to orc8r-deployer/roles/secrets/tasks/setup-secrets.yml
diff --git a/roles/dns/tasks/main.yml b/roles/dns/tasks/main.yml
deleted file mode 100644
index 34ef07a..0000000
--- a/roles/dns/tasks/main.yml
+++ /dev/null
@@ -1,9 +0,0 @@
----
-- name: Update these DNS Values
- debug:
- msg:
- - "{{ ansible_host }} api.{{ orc8r_domain }}"
- - "{{ ansible_host }} *.nms.{{ orc8r_domain }}"
- - "{{ ansible_host }} fluentd.{{ orc8r_domain }}"
- - "{{ ansible_host }} controller.{{ orc8r_domain }}"
- - "{{ ansible_host }} bootstrapper-controller.{{ orc8r_domain }}"
]