From 027439f8b24c98525475e8f90591c70e053b72fe Mon Sep 17 00:00:00 2001 From: Patricia Reinoso Date: Tue, 1 Aug 2023 08:34:41 +0000 Subject: [PATCH] Remove Grafana charm Grafana is replaced by grafana-k8s Change-Id: Ia5f6adb08caa3db899d1d3705086873844578942 Signed-off-by: Patricia Reinoso --- installers/charm/bundles/osm-ha/README.md | 26 +- installers/charm/bundles/osm/README.md | 24 +- installers/charm/grafana/.gitignore | 30 - installers/charm/grafana/.jujuignore | 34 - installers/charm/grafana/.yamllint.yaml | 35 - installers/charm/grafana/README.md | 23 - installers/charm/grafana/charmcraft.yaml | 37 - installers/charm/grafana/config.yaml | 88 - installers/charm/grafana/icon.svg | 12 - installers/charm/grafana/metadata.yaml | 49 - .../charm/grafana/requirements-test.txt | 20 - installers/charm/grafana/requirements.txt | 22 - installers/charm/grafana/src/charm.py | 318 --- installers/charm/grafana/src/pod_spec.py | 398 ---- .../grafana/templates/default_dashboards.yaml | 30 - .../templates/default_datasources.yaml | 34 - .../templates/kafka_exporter_dashboard.json | 609 ----- .../templates/mongodb_exporter_dashboard.json | 938 -------- .../templates/mysql_exporter_dashboard.json | 1145 --------- .../templates/nodes_exporter_dashboard.json | 1965 --------------- .../grafana/templates/summary_dashboard.json | 2112 ----------------- installers/charm/grafana/tests/__init__.py | 40 - installers/charm/grafana/tests/test_charm.py | 703 ------ .../charm/grafana/tests/test_pod_spec.py | 636 ----- installers/charm/grafana/tox.ini | 126 - 25 files changed, 25 insertions(+), 9429 deletions(-) delete mode 100644 installers/charm/grafana/.gitignore delete mode 100644 installers/charm/grafana/.jujuignore delete mode 100644 installers/charm/grafana/.yamllint.yaml delete mode 100644 installers/charm/grafana/README.md delete mode 100644 installers/charm/grafana/charmcraft.yaml delete mode 100644 installers/charm/grafana/config.yaml delete mode 100644 installers/charm/grafana/icon.svg delete mode 100644 installers/charm/grafana/metadata.yaml delete mode 100644 installers/charm/grafana/requirements-test.txt delete mode 100644 installers/charm/grafana/requirements.txt delete mode 100755 installers/charm/grafana/src/charm.py delete mode 100644 installers/charm/grafana/src/pod_spec.py delete mode 100644 installers/charm/grafana/templates/default_dashboards.yaml delete mode 100644 installers/charm/grafana/templates/default_datasources.yaml delete mode 100644 installers/charm/grafana/templates/kafka_exporter_dashboard.json delete mode 100644 installers/charm/grafana/templates/mongodb_exporter_dashboard.json delete mode 100644 installers/charm/grafana/templates/mysql_exporter_dashboard.json delete mode 100644 installers/charm/grafana/templates/nodes_exporter_dashboard.json delete mode 100644 installers/charm/grafana/templates/summary_dashboard.json delete mode 100644 installers/charm/grafana/tests/__init__.py delete mode 100644 installers/charm/grafana/tests/test_charm.py delete mode 100644 installers/charm/grafana/tests/test_pod_spec.py delete mode 100644 installers/charm/grafana/tox.ini diff --git a/installers/charm/bundles/osm-ha/README.md b/installers/charm/bundles/osm-ha/README.md index 05dab9d0..ecb73977 100644 --- a/installers/charm/bundles/osm-ha/README.md +++ b/installers/charm/bundles/osm-ha/README.md @@ -16,22 +16,22 @@ # Installation Go to the [OSM User Guide](https://osm.etsi.org/docs/user-guide/03-installing-osm.html#charmed-installation) for the highly available production-grade deployment. -For a more minimal cluster suitable for testing, deploy the [single instance OSM bundle](https://jaas.ai/osm/bundle). +For a more minimal cluster suitable for testing, deploy the [single instance OSM bundle](https://charmhub.io/osm). # Bundle Components -- [grafana](https://jaas.ai/u/charmed-osm/grafana/0): A CAAS charm to deploy grafana for metrics visualization -- [kafka k8s](https://jaas.ai/u/charmed-osm/kafka-k8s): A CAAS charm to deploy Kafka used as a messaging bus between OSM components -- [lcm](https://jaas.ai/u/charmed-osm/lcm/0): A CAAS charm to deploy OSM's Lifecycle Management (LCM) component responsible for network services orchestration. -- [mariadb k8s](https://jaas.ai/u/charmed-osm/mariadb-k8s): A Juju charm deploying and managing database server (MariaDB) on Kubernetes -- [mon](https://jaas.ai/u/charmed-osm/mon/0): A CAAS charm to deploy OSM's Monitoring Interface (MON) responsible for metrics collection -- [mongodb k8s](https://jaas.ai/u/charmed-osm/mongodb-k8s): A CAAS charm to deploy MongoDB responsible for structuring the data -- [nbi](https://jaas.ai/u/charmed-osm/nbi/5): A juju charm to deploy OSM's Northbound Interface (NBI) on Kubernetes. -- [pol](https://jaas.ai/u/charmed-osm/pol/0): A CAAS charm to deploy OSM's Policy Module (POL) responsible for configuring alarms and actions -- [prometheus](https://jaas.ai/u/charmed-osm/prometheus): A CAAS charm to deploy Prometheus. -- [ro](https://jaas.ai/u/charmed-osm/ro/0): A CAAS charm to deploy OSM's Resource Orchestrator (RO) responsible for the life cycle management of VIM resources. -- [ng-ui](https://jaas.ai/u/charmed-osm/ng-ui): A CAAS charm to deploy OSM's User Interface (UI) -- [zookeeper k8s](https://jaas.ai/u/charmed-osm/zookeeper-k8s): A CAAS charm to deploy zookeeper for distributed synchronization +- [grafana](https://charmhub.io/grafana-k8s): A CAAS charm to deploy grafana for metrics visualization +- [kafka k8s](https://charmhub.io/kafka-k8s): A CAAS charm to deploy Kafka used as a messaging bus between OSM components +- [lcm](https://charmhub.io/osm-lcm): A CAAS charm to deploy OSM's Lifecycle Management (LCM) component responsible for network services orchestration. +- [mariadb k8s](https://charmhub.io/charmed-osm-mariadb-k8s): A Juju charm deploying and managing database server (MariaDB) on Kubernetes +- [mon](https://charmhub.io/osm-mon): A CAAS charm to deploy OSM's Monitoring Interface (MON) responsible for metrics collection +- [mongodb k8s](https://charmhub.io/mongodb-k8s): A CAAS charm to deploy MongoDB responsible for structuring the data +- [nbi](https://charmhub.io/osm-nbi): A juju charm to deploy OSM's Northbound Interface (NBI) on Kubernetes. +- [pol](https://charmhub.io/osm-pol): A CAAS charm to deploy OSM's Policy Module (POL) responsible for configuring alarms and actions +- [prometheus](https://charmhub.io/prometheus-k8s): A CAAS charm to deploy Prometheus. +- [ro](https://charmhub.io/osm-ro): A CAAS charm to deploy OSM's Resource Orchestrator (RO) responsible for the life cycle management of VIM resources. +- [ng-ui](https://charmhub.io/osm-ng-ui): A CAAS charm to deploy OSM's User Interface (UI) +- [zookeeper k8s](https://charmhub.io/zookeeper): A CAAS charm to deploy zookeeper for distributed synchronization # Troubleshooting diff --git a/installers/charm/bundles/osm/README.md b/installers/charm/bundles/osm/README.md index c6fb07fa..4200d98e 100644 --- a/installers/charm/bundles/osm/README.md +++ b/installers/charm/bundles/osm/README.md @@ -35,18 +35,18 @@ Follow the installation steps [here](https://juju.is/tutorials/charmed-osm-get-s # Bundle Components -- [grafana](https://jaas.ai/u/charmed-osm/grafana/0): A CAAS charm to deploy grafana for metrics visualization -- [kafka k8s](https://jaas.ai/u/charmed-osm/kafka-k8s): A CAAS charm to deploy Kafka used as a messaging bus between OSM components -- [lcm](https://jaas.ai/u/charmed-osm/lcm/0): A CAAS charm to deploy OSM's Lifecycle Management (LCM) component responsible for network services orchestration. -- [mariadb k8s](https://jaas.ai/u/charmed-osm/mariadb-k8s): A Juju charm deploying and managing database server (MariaDB) on Kubernetes -- [mon](https://jaas.ai/u/charmed-osm/mon/0): A CAAS charm to deploy OSM's Monitoring Interface (MON) responsible for metrics collection -- [mongodb k8s](https://jaas.ai/u/charmed-osm/mongodb-k8s): A CAAS charm to deploy MongoDB responsible for structuring the data -- [nbi](https://jaas.ai/u/charmed-osm/nbi/5): A juju charm to deploy OSM's Northbound Interface (NBI) on Kubernetes. -- [pol](https://jaas.ai/u/charmed-osm/pol/0): A CAAS charm to deploy OSM's Policy Module (POL) responsible for configuring alarms and actions -- [prometheus](https://jaas.ai/u/charmed-osm/prometheus): A CAAS charm to deploy Prometheus. -- [ro](https://jaas.ai/u/charmed-osm/ro/0): A CAAS charm to deploy OSM's Resource Orchestrator (RO) responsible for the life cycle management of VIM resources. -- [ng-ui](https://jaas.ai/u/charmed-osm/ng-ui): A CAAS charm to deploy OSM's User Interface (UI) -- [zookeeper k8s](https://jaas.ai/u/charmed-osm/zookeeper-k8s): A CAAS charm to deploy zookeeper for distributed synchronization +- [grafana](https://charmhub.io/grafana-k8s): A CAAS charm to deploy grafana for metrics visualization +- [kafka k8s](https://charmhub.io/kafka-k8s): A CAAS charm to deploy Kafka used as a messaging bus between OSM components +- [lcm](https://charmhub.io/osm-lcm): A CAAS charm to deploy OSM's Lifecycle Management (LCM) component responsible for network services orchestration. +- [mariadb k8s](https://charmhub.io/charmed-osm-mariadb-k8s): A Juju charm deploying and managing database server (MariaDB) on Kubernetes +- [mon](https://charmhub.io/osm-mon): A CAAS charm to deploy OSM's Monitoring Interface (MON) responsible for metrics collection +- [mongodb k8s](https://charmhub.io/mongodb-k8s): A CAAS charm to deploy MongoDB responsible for structuring the data +- [nbi](https://charmhub.io/osm-nbi): A juju charm to deploy OSM's Northbound Interface (NBI) on Kubernetes. +- [pol](https://charmhub.io/osm-pol): A CAAS charm to deploy OSM's Policy Module (POL) responsible for configuring alarms and actions +- [prometheus](https://charmhub.io/prometheus-k8s): A CAAS charm to deploy Prometheus. +- [ro](https://charmhub.io/osm-ro): A CAAS charm to deploy OSM's Resource Orchestrator (RO) responsible for the life cycle management of VIM resources. +- [ng-ui](https://charmhub.io/osm-ng-ui): A CAAS charm to deploy OSM's User Interface (UI) +- [zookeeper k8s](https://charmhub.io/zookeeper): A CAAS charm to deploy zookeeper for distributed synchronization # Troubleshooting diff --git a/installers/charm/grafana/.gitignore b/installers/charm/grafana/.gitignore deleted file mode 100644 index 2885df27..00000000 --- a/installers/charm/grafana/.gitignore +++ /dev/null @@ -1,30 +0,0 @@ -# Copyright 2021 Canonical Ltd. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# 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. -# -# For those usages not covered by the Apache License, Version 2.0 please -# contact: legal@canonical.com -# -# To get in touch with the maintainers, please contact: -# osm-charmers@lists.launchpad.net -## - -venv -.vscode -build -*.charm -.coverage -coverage.xml -.stestr -cover -release \ No newline at end of file diff --git a/installers/charm/grafana/.jujuignore b/installers/charm/grafana/.jujuignore deleted file mode 100644 index 3ae3e7dc..00000000 --- a/installers/charm/grafana/.jujuignore +++ /dev/null @@ -1,34 +0,0 @@ -# Copyright 2021 Canonical Ltd. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# 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. -# -# For those usages not covered by the Apache License, Version 2.0 please -# contact: legal@canonical.com -# -# To get in touch with the maintainers, please contact: -# osm-charmers@lists.launchpad.net -## - -venv -.vscode -build -*.charm -.coverage -coverage.xml -.gitignore -.stestr -cover -release -tests/ -requirements* -tox.ini diff --git a/installers/charm/grafana/.yamllint.yaml b/installers/charm/grafana/.yamllint.yaml deleted file mode 100644 index 783a81d3..00000000 --- a/installers/charm/grafana/.yamllint.yaml +++ /dev/null @@ -1,35 +0,0 @@ -# Copyright 2021 Canonical Ltd. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# 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. -# -# For those usages not covered by the Apache License, Version 2.0 please -# contact: legal@canonical.com -# -# To get in touch with the maintainers, please contact: -# osm-charmers@lists.launchpad.net -## - ---- -extends: default - -yaml-files: - - "*.yaml" - - "*.yml" - - ".yamllint" -ignore: | - .tox - cover/ - build/ - venv - release/ - templates/ diff --git a/installers/charm/grafana/README.md b/installers/charm/grafana/README.md deleted file mode 100644 index 1cc1fb7e..00000000 --- a/installers/charm/grafana/README.md +++ /dev/null @@ -1,23 +0,0 @@ - - -# Grafana operator Charm for Kubernetes - -## Requirements diff --git a/installers/charm/grafana/charmcraft.yaml b/installers/charm/grafana/charmcraft.yaml deleted file mode 100644 index 0a285a9d..00000000 --- a/installers/charm/grafana/charmcraft.yaml +++ /dev/null @@ -1,37 +0,0 @@ -# Copyright 2021 Canonical Ltd. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# 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. -# -# For those usages not covered by the Apache License, Version 2.0 please -# contact: legal@canonical.com -# -# To get in touch with the maintainers, please contact: -# osm-charmers@lists.launchpad.net -## - -type: charm -bases: - - build-on: - - name: ubuntu - channel: "20.04" - architectures: ["amd64"] - run-on: - - name: ubuntu - channel: "20.04" - architectures: - - amd64 - - aarch64 - - arm64 -parts: - charm: - build-packages: [git] diff --git a/installers/charm/grafana/config.yaml b/installers/charm/grafana/config.yaml deleted file mode 100644 index 7f97f589..00000000 --- a/installers/charm/grafana/config.yaml +++ /dev/null @@ -1,88 +0,0 @@ -# Copyright 2021 Canonical Ltd. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# 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. -# -# For those usages not covered by the Apache License, Version 2.0 please -# contact: legal@canonical.com -# -# To get in touch with the maintainers, please contact: -# osm-charmers@lists.launchpad.net -## - -options: - max_file_size: - type: int - description: | - The maximum file size, in megabytes. If there is a reverse proxy in front - of Keystone, it may need to be configured to handle the requested size. - Note: if set to 0, there is no limit. - default: 0 - ingress_class: - type: string - description: | - Ingress class name. This is useful for selecting the ingress to be used - in case there are multiple ingresses in the underlying k8s clusters. - ingress_whitelist_source_range: - type: string - description: | - A comma-separated list of CIDRs to store in the - ingress.kubernetes.io/whitelist-source-range annotation. - - This can be used to lock down access to - Keystone based on source IP address. - default: "" - tls_secret_name: - type: string - description: TLS Secret name - default: "" - site_url: - type: string - description: Ingress URL - default: "" - cluster_issuer: - type: string - description: Name of the cluster issuer for TLS certificates - default: "" - osm_dashboards: - type: boolean - description: Enable OSM System monitoring dashboards - default: false - image_pull_policy: - type: string - description: | - ImagePullPolicy configuration for the pod. - Possible values: always, ifnotpresent, never - default: always - mysql_uri: - type: string - description: | - Mysql uri with the following format: - mysql://:@:/ - admin_user: - type: string - description: Admin user - default: admin - log_level: - type: string - description: | - Logging level for Grafana. Options are “debug”, “info”, - “warn”, “error”, and “critical”. - default: info - port: - description: The port grafana-k8s will be listening on - type: int - default: 3000 - security_context: - description: Enables the security context of the pods - type: boolean - default: false diff --git a/installers/charm/grafana/icon.svg b/installers/charm/grafana/icon.svg deleted file mode 100644 index 49c744d4..00000000 --- a/installers/charm/grafana/icon.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/installers/charm/grafana/metadata.yaml b/installers/charm/grafana/metadata.yaml deleted file mode 100644 index 4a74db64..00000000 --- a/installers/charm/grafana/metadata.yaml +++ /dev/null @@ -1,49 +0,0 @@ -# Copyright 2021 Canonical Ltd. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# 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. -# -# For those usages not covered by the Apache License, Version 2.0 please -# contact: legal@canonical.com -# -# To get in touch with the maintainers, please contact: -# osm-charmers@lists.launchpad.net -## - -name: osm-grafana -summary: OSM Grafana -description: | - A CAAS charm to deploy OSM's Grafana. -series: - - kubernetes -tags: - - kubernetes - - osm - - grafana -min-juju-version: 2.8.0 -deployment: - type: stateless - service: cluster -resources: - image: - type: oci-image - description: Ubuntu LTS image for Grafana - upstream-source: "ubuntu/grafana:latest" -requires: - prometheus: - interface: prometheus - db: - interface: mysql - limit: 1 -peers: - cluster: - interface: grafana-cluster diff --git a/installers/charm/grafana/requirements-test.txt b/installers/charm/grafana/requirements-test.txt deleted file mode 100644 index cf61dd4e..00000000 --- a/installers/charm/grafana/requirements-test.txt +++ /dev/null @@ -1,20 +0,0 @@ -# Copyright 2021 Canonical Ltd. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# 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. -# -# For those usages not covered by the Apache License, Version 2.0 please -# contact: legal@canonical.com -# -# To get in touch with the maintainers, please contact: -# osm-charmers@lists.launchpad.net -mock==4.0.3 diff --git a/installers/charm/grafana/requirements.txt b/installers/charm/grafana/requirements.txt deleted file mode 100644 index 1a8928c7..00000000 --- a/installers/charm/grafana/requirements.txt +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright 2021 Canonical Ltd. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# 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. -# -# For those usages not covered by the Apache License, Version 2.0 please -# contact: legal@canonical.com -# -# To get in touch with the maintainers, please contact: -# osm-charmers@lists.launchpad.net -## - -git+https://github.com/charmed-osm/ops-lib-charmed-osm/@master \ No newline at end of file diff --git a/installers/charm/grafana/src/charm.py b/installers/charm/grafana/src/charm.py deleted file mode 100755 index caa02779..00000000 --- a/installers/charm/grafana/src/charm.py +++ /dev/null @@ -1,318 +0,0 @@ -#!/usr/bin/env python3 -# Copyright 2021 Canonical Ltd. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# 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. -# -# For those usages not covered by the Apache License, Version 2.0 please -# contact: legal@canonical.com -# -# To get in touch with the maintainers, please contact: -# osm-charmers@lists.launchpad.net -## - -# pylint: disable=E0213 - -from ipaddress import ip_network -import logging -from pathlib import Path -import secrets -from string import Template -from typing import NoReturn, Optional -from urllib.parse import urlparse - -from ops.main import main -from opslib.osm.charm import CharmedOsmBase, RelationsMissing -from opslib.osm.interfaces.grafana import GrafanaCluster -from opslib.osm.interfaces.mysql import MysqlClient -from opslib.osm.interfaces.prometheus import PrometheusClient -from opslib.osm.pod import ( - ContainerV3Builder, - FilesV3Builder, - IngressResourceV3Builder, - PodRestartPolicy, - PodSpecV3Builder, -) -from opslib.osm.validator import ModelValidator, validator - - -logger = logging.getLogger(__name__) - - -class ConfigModel(ModelValidator): - log_level: str - port: int - admin_user: str - max_file_size: int - osm_dashboards: bool - site_url: Optional[str] - cluster_issuer: Optional[str] - ingress_class: Optional[str] - ingress_whitelist_source_range: Optional[str] - tls_secret_name: Optional[str] - image_pull_policy: str - security_context: bool - - @validator("log_level") - def validate_log_level(cls, v): - allowed_values = ("debug", "info", "warn", "error", "critical") - if v not in allowed_values: - separator = '", "' - raise ValueError( - f'incorrect value. Allowed values are "{separator.join(allowed_values)}"' - ) - return v - - @validator("max_file_size") - def validate_max_file_size(cls, v): - if v < 0: - raise ValueError("value must be equal or greater than 0") - return v - - @validator("site_url") - def validate_site_url(cls, v): - if v: - parsed = urlparse(v) - if not parsed.scheme.startswith("http"): - raise ValueError("value must start with http") - return v - - @validator("ingress_whitelist_source_range") - def validate_ingress_whitelist_source_range(cls, v): - if v: - ip_network(v) - return v - - @validator("image_pull_policy") - def validate_image_pull_policy(cls, v): - values = { - "always": "Always", - "ifnotpresent": "IfNotPresent", - "never": "Never", - } - v = v.lower() - if v not in values.keys(): - raise ValueError("value must be always, ifnotpresent or never") - return values[v] - - -class GrafanaCharm(CharmedOsmBase): - """GrafanaCharm Charm.""" - - def __init__(self, *args) -> NoReturn: - """Prometheus Charm constructor.""" - super().__init__(*args, oci_image="image", mysql_uri=True) - # Initialize relation objects - self.prometheus_client = PrometheusClient(self, "prometheus") - self.grafana_cluster = GrafanaCluster(self, "cluster") - self.mysql_client = MysqlClient(self, "db") - # Observe events - event_observer_mapping = { - self.on["prometheus"].relation_changed: self.configure_pod, - self.on["prometheus"].relation_broken: self.configure_pod, - self.on["db"].relation_changed: self.configure_pod, - self.on["db"].relation_broken: self.configure_pod, - } - for event, observer in event_observer_mapping.items(): - self.framework.observe(event, observer) - - def _build_dashboard_files(self, config: ConfigModel): - files_builder = FilesV3Builder() - files_builder.add_file( - "dashboard_osm.yaml", - Path("templates/default_dashboards.yaml").read_text(), - ) - if config.osm_dashboards: - osm_dashboards_mapping = { - "kafka_exporter_dashboard.json": "templates/kafka_exporter_dashboard.json", - "mongodb_exporter_dashboard.json": "templates/mongodb_exporter_dashboard.json", - "mysql_exporter_dashboard.json": "templates/mysql_exporter_dashboard.json", - "nodes_exporter_dashboard.json": "templates/nodes_exporter_dashboard.json", - "summary_dashboard.json": "templates/summary_dashboard.json", - } - for file_name, path in osm_dashboards_mapping.items(): - files_builder.add_file(file_name, Path(path).read_text()) - return files_builder.build() - - def _build_datasources_files(self): - files_builder = FilesV3Builder() - prometheus_user = self.prometheus_client.user - prometheus_password = self.prometheus_client.password - enable_basic_auth = all([prometheus_user, prometheus_password]) - kwargs = { - "prometheus_host": self.prometheus_client.hostname, - "prometheus_port": self.prometheus_client.port, - "enable_basic_auth": enable_basic_auth, - "user": "", - "password": "", - } - if enable_basic_auth: - kwargs["user"] = f"basic_auth_user: {prometheus_user}" - kwargs[ - "password" - ] = f"secure_json_data:\n basicAuthPassword: {prometheus_password}" - files_builder.add_file( - "datasource_prometheus.yaml", - Template(Path("templates/default_datasources.yaml").read_text()).substitute( - **kwargs - ), - ) - return files_builder.build() - - def _check_missing_dependencies(self, config: ConfigModel, external_db: bool): - missing_relations = [] - - if self.prometheus_client.is_missing_data_in_app(): - missing_relations.append("prometheus") - - if not external_db and self.mysql_client.is_missing_data_in_unit(): - missing_relations.append("db") - - if missing_relations: - raise RelationsMissing(missing_relations) - - def build_pod_spec(self, image_info, **kwargs): - # Validate config - config = ConfigModel(**dict(self.config)) - mysql_config = kwargs["mysql_config"] - if mysql_config.mysql_uri and not self.mysql_client.is_missing_data_in_unit(): - raise Exception("Mysql data cannot be provided via config and relation") - - # Check relations - external_db = True if mysql_config.mysql_uri else False - self._check_missing_dependencies(config, external_db) - - # Get initial password - admin_initial_password = self.grafana_cluster.admin_initial_password - if not admin_initial_password: - admin_initial_password = _generate_random_password() - self.grafana_cluster.set_initial_password(admin_initial_password) - - # Create Builder for the PodSpec - pod_spec_builder = PodSpecV3Builder( - enable_security_context=config.security_context - ) - - # Add secrets to the pod - grafana_secret_name = f"{self.app.name}-admin-secret" - pod_spec_builder.add_secret( - grafana_secret_name, - { - "admin-password": admin_initial_password, - "mysql-url": mysql_config.mysql_uri or self.mysql_client.get_uri(), - "prometheus-user": self.prometheus_client.user, - "prometheus-password": self.prometheus_client.password, - }, - ) - - # Build Container - container_builder = ContainerV3Builder( - self.app.name, - image_info, - config.image_pull_policy, - run_as_non_root=config.security_context, - ) - container_builder.add_port(name=self.app.name, port=config.port) - container_builder.add_http_readiness_probe( - "/api/health", - config.port, - initial_delay_seconds=10, - period_seconds=10, - timeout_seconds=5, - failure_threshold=3, - ) - container_builder.add_http_liveness_probe( - "/api/health", - config.port, - initial_delay_seconds=60, - timeout_seconds=30, - failure_threshold=10, - ) - container_builder.add_volume_config( - "dashboards", - "/etc/grafana/provisioning/dashboards/", - self._build_dashboard_files(config), - ) - container_builder.add_volume_config( - "datasources", - "/etc/grafana/provisioning/datasources/", - self._build_datasources_files(), - ) - container_builder.add_envs( - { - "GF_SERVER_HTTP_PORT": config.port, - "GF_LOG_LEVEL": config.log_level, - "GF_SECURITY_ADMIN_USER": config.admin_user, - } - ) - container_builder.add_secret_envs( - secret_name=grafana_secret_name, - envs={ - "GF_SECURITY_ADMIN_PASSWORD": "admin-password", - "GF_DATABASE_URL": "mysql-url", - "PROMETHEUS_USER": "prometheus-user", - "PROMETHEUS_PASSWORD": "prometheus-password", - }, - ) - container = container_builder.build() - pod_spec_builder.add_container(container) - - # Add Pod restart policy - restart_policy = PodRestartPolicy() - restart_policy.add_secrets(secret_names=(grafana_secret_name,)) - pod_spec_builder.set_restart_policy(restart_policy) - - # Add ingress resources to pod spec if site url exists - if config.site_url: - parsed = urlparse(config.site_url) - annotations = { - "nginx.ingress.kubernetes.io/proxy-body-size": "{}".format( - str(config.max_file_size) + "m" - if config.max_file_size > 0 - else config.max_file_size - ) - } - if config.ingress_class: - annotations["kubernetes.io/ingress.class"] = config.ingress_class - ingress_resource_builder = IngressResourceV3Builder( - f"{self.app.name}-ingress", annotations - ) - - if config.ingress_whitelist_source_range: - annotations[ - "nginx.ingress.kubernetes.io/whitelist-source-range" - ] = config.ingress_whitelist_source_range - - if config.cluster_issuer: - annotations["cert-manager.io/cluster-issuer"] = config.cluster_issuer - - if parsed.scheme == "https": - ingress_resource_builder.add_tls( - [parsed.hostname], config.tls_secret_name - ) - else: - annotations["nginx.ingress.kubernetes.io/ssl-redirect"] = "false" - - ingress_resource_builder.add_rule( - parsed.hostname, self.app.name, config.port - ) - ingress_resource = ingress_resource_builder.build() - pod_spec_builder.add_ingress_resource(ingress_resource) - return pod_spec_builder.build() - - -def _generate_random_password(): - return secrets.token_hex(16) - - -if __name__ == "__main__": - main(GrafanaCharm) diff --git a/installers/charm/grafana/src/pod_spec.py b/installers/charm/grafana/src/pod_spec.py deleted file mode 100644 index 609c466f..00000000 --- a/installers/charm/grafana/src/pod_spec.py +++ /dev/null @@ -1,398 +0,0 @@ -#!/usr/bin/env python3 -# Copyright 2021 Canonical Ltd. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# 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. -# -# For those usages not covered by the Apache License, Version 2.0 please -# contact: legal@canonical.com -# -# To get in touch with the maintainers, please contact: -# osm-charmers@lists.launchpad.net -## - -import logging -from ipaddress import ip_network -from typing import Any, Dict, List -from urllib.parse import urlparse -from pathlib import Path -from string import Template - -logger = logging.getLogger(__name__) - - -def _validate_max_file_size(max_file_size: int, site_url: str) -> bool: - """Validate max_file_size. - - Args: - max_file_size (int): maximum file size allowed. - site_url (str): endpoint url. - - Returns: - bool: True if valid, false otherwise. - """ - if not site_url: - return True - - parsed = urlparse(site_url) - - if not parsed.scheme.startswith("http"): - return True - - if max_file_size is None: - return False - - return max_file_size >= 0 - - -def _validate_ip_network(network: str) -> bool: - """Validate IP network. - - Args: - network (str): IP network range. - - Returns: - bool: True if valid, false otherwise. - """ - if not network: - return True - - try: - ip_network(network) - except ValueError: - return False - - return True - - -def _validate_data(config_data: Dict[str, Any], relation_data: Dict[str, Any]) -> bool: - """Validates passed information. - - Args: - config_data (Dict[str, Any]): configuration information. - relation_data (Dict[str, Any]): relation information - - Raises: - ValueError: when config and/or relation data is not valid. - """ - config_validators = { - "site_url": lambda value, _: isinstance(value, str) - if value is not None - else True, - "max_file_size": lambda value, values: _validate_max_file_size( - value, values.get("site_url") - ), - "ingress_whitelist_source_range": lambda value, _: _validate_ip_network(value), - "tls_secret_name": lambda value, _: isinstance(value, str) - if value is not None - else True, - } - relation_validators = { - "prometheus_hostname": lambda value, _: ( - isinstance(value, str) and len(value) > 0 - ), - "prometheus_port": lambda value, _: ( - isinstance(value, str) and len(value) > 0 and int(value) > 0 - ), - } - problems = [] - - for key, validator in config_validators.items(): - valid = validator(config_data.get(key), config_data) - - if not valid: - problems.append(key) - - for key, validator in relation_validators.items(): - valid = validator(relation_data.get(key), relation_data) - - if not valid: - problems.append(key) - - if len(problems) > 0: - logger.debug(relation_data) - raise ValueError("Errors found in: {}".format(", ".join(problems))) - - return True - - -def _make_pod_ports(port: int) -> List[Dict[str, Any]]: - """Generate pod ports details. - - Args: - port (int): port to expose. - - Returns: - List[Dict[str, Any]]: pod port details. - """ - return [{"name": "grafana", "containerPort": port, "protocol": "TCP"}] - - -def _make_pod_envconfig( - config: Dict[str, Any], relation_state: Dict[str, Any] -) -> Dict[str, Any]: - """Generate pod environment configuration. - - Args: - config (Dict[str, Any]): configuration information. - relation_state (Dict[str, Any]): relation state information. - - Returns: - Dict[str, Any]: pod environment configuration. - """ - envconfig = {} - - return envconfig - - -def _make_pod_ingress_resources( - config: Dict[str, Any], app_name: str, port: int -) -> List[Dict[str, Any]]: - """Generate pod ingress resources. - - Args: - config (Dict[str, Any]): configuration information. - app_name (str): application name. - port (int): port to expose. - - Returns: - List[Dict[str, Any]]: pod ingress resources. - """ - site_url = config.get("site_url") - - if not site_url: - return - - parsed = urlparse(site_url) - - if not parsed.scheme.startswith("http"): - return - - max_file_size = config["max_file_size"] - ingress_whitelist_source_range = config["ingress_whitelist_source_range"] - - annotations = { - "nginx.ingress.kubernetes.io/proxy-body-size": "{}".format( - str(max_file_size) + "m" if max_file_size > 0 else max_file_size - ), - } - - if ingress_whitelist_source_range: - annotations[ - "nginx.ingress.kubernetes.io/whitelist-source-range" - ] = ingress_whitelist_source_range - - ingress_spec_tls = None - - if parsed.scheme == "https": - ingress_spec_tls = [{"hosts": [parsed.hostname]}] - tls_secret_name = config["tls_secret_name"] - if tls_secret_name: - ingress_spec_tls[0]["secretName"] = tls_secret_name - else: - annotations["nginx.ingress.kubernetes.io/ssl-redirect"] = "false" - - ingress = { - "name": "{}-ingress".format(app_name), - "annotations": annotations, - "spec": { - "rules": [ - { - "host": parsed.hostname, - "http": { - "paths": [ - { - "path": "/", - "backend": { - "serviceName": app_name, - "servicePort": port, - }, - } - ] - }, - } - ] - }, - } - if ingress_spec_tls: - ingress["spec"]["tls"] = ingress_spec_tls - - return [ingress] - - -def _make_pod_files( - config: Dict[str, Any], relation: Dict[str, Any] -) -> List[Dict[str, Any]]: - """Generating ConfigMap information - - Args: - config (Dict[str, Any]): configuration information. - relation (Dict[str, Any]): relation information. - - Returns: - List[Dict[str, Any]]: ConfigMap information. - """ - template_data = {**config, **relation} - dashboards = [] - - if config.get("osm_dashboards", False): - dashboards.extend( - [ - { - "path": "kafka_exporter_dashboard.json", - "content": Path("files/kafka_exporter_dashboard.json").read_text(), - }, - { - "path": "mongodb_exporter_dashboard.json", - "content": Path( - "files/mongodb_exporter_dashboard.json" - ).read_text(), - }, - { - "path": "mysql_exporter_dashboard.json", - "content": Path("files/mysql_exporter_dashboard.json").read_text(), - }, - { - "path": "nodes_exporter_dashboard.json", - "content": Path("files/nodes_exporter_dashboard.json").read_text(), - }, - { - "path": "summary_dashboard.json", - "content": Path("files/summary_dashboard.json").read_text(), - }, - ] - ) - - dashboards.append( - { - "path": "dashboard_osm.yaml", - "content": Path("files/default_dashboards.yaml").read_text(), - } - ) - - files = [ - { - "name": "dashboards", - "mountPath": "/etc/grafana/provisioning/dashboards/", - "files": dashboards, - }, - { - "name": "datasources", - "mountPath": "/etc/grafana/provisioning/datasources/", - "files": [ - { - "path": "datasource_prometheus.yaml", - "content": Template( - Path("files/default_dashboards.yaml").read_text() - ).substitute(template_data), - } - ], - }, - ] - - return files - - -def _make_readiness_probe(port: int) -> Dict[str, Any]: - """Generate readiness probe. - - Args: - port (int): service port. - - Returns: - Dict[str, Any]: readiness probe. - """ - return { - "httpGet": { - "path": "/api/health", - "port": port, - }, - "initialDelaySeconds": 10, - "periodSeconds": 10, - "timeoutSeconds": 5, - "successThreshold": 1, - "failureThreshold": 3, - } - - -def _make_liveness_probe(port: int) -> Dict[str, Any]: - """Generate liveness probe. - - Args: - port (int): service port. - - Returns: - Dict[str, Any]: liveness probe. - """ - return { - "httpGet": { - "path": "/api/health", - "port": port, - }, - "initialDelaySeconds": 60, - "timeoutSeconds": 30, - "failureThreshold": 10, - } - - -def make_pod_spec( - image_info: Dict[str, str], - config: Dict[str, Any], - relation_state: Dict[str, Any], - app_name: str = "grafana", - port: int = 3000, -) -> Dict[str, Any]: - """Generate the pod spec information. - - Args: - image_info (Dict[str, str]): Object provided by - OCIImageResource("image").fetch(). - config (Dict[str, Any]): Configuration information. - relation_state (Dict[str, Any]): Relation state information. - app_name (str, optional): Application name. Defaults to "ro". - port (int, optional): Port for the container. Defaults to 9090. - - Returns: - Dict[str, Any]: Pod spec dictionary for the charm. - """ - if not image_info: - return None - - _validate_data(config, relation_state) - - ports = _make_pod_ports(port) - env_config = _make_pod_envconfig(config, relation_state) - files = _make_pod_files(config, relation_state) - readiness_probe = _make_readiness_probe(port) - liveness_probe = _make_liveness_probe(port) - ingress_resources = _make_pod_ingress_resources(config, app_name, port) - - return { - "version": 3, - "containers": [ - { - "name": app_name, - "imageDetails": image_info, - "imagePullPolicy": "Always", - "ports": ports, - "envConfig": env_config, - "volumeConfig": files, - "kubernetes": { - "readinessProbe": readiness_probe, - "livenessProbe": liveness_probe, - }, - } - ], - "kubernetesResources": { - "ingressResources": ingress_resources or [], - }, - } diff --git a/installers/charm/grafana/templates/default_dashboards.yaml b/installers/charm/grafana/templates/default_dashboards.yaml deleted file mode 100644 index a56ea5fe..00000000 --- a/installers/charm/grafana/templates/default_dashboards.yaml +++ /dev/null @@ -1,30 +0,0 @@ -# Copyright 2021 Canonical Ltd. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# 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. -# -# For those usages not covered by the Apache License, Version 2.0 please -# contact: legal@canonical.com -# -# To get in touch with the maintainers, please contact: -# osm-charmers@lists.launchpad.net -## - ---- -apiVersion: 1 -providers: - - name: 'osm' - orgId: 1 - folder: '' - type: file - options: - path: /etc/grafana/provisioning/dashboards/ diff --git a/installers/charm/grafana/templates/default_datasources.yaml b/installers/charm/grafana/templates/default_datasources.yaml deleted file mode 100644 index 88e97dfb..00000000 --- a/installers/charm/grafana/templates/default_datasources.yaml +++ /dev/null @@ -1,34 +0,0 @@ -# Copyright 2021 Canonical Ltd. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# 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. -# -# For those usages not covered by the Apache License, Version 2.0 please -# contact: legal@canonical.com -# -# To get in touch with the maintainers, please contact: -# osm-charmers@lists.launchpad.net -## - ---- -datasources: - - access: proxy - editable: true - is_default: true - name: osm_prometheus - orgId: 1 - type: prometheus - version: 1 - url: http://$prometheus_host:$prometheus_port - basic_auth: $enable_basic_auth - $user - $password diff --git a/installers/charm/grafana/templates/kafka_exporter_dashboard.json b/installers/charm/grafana/templates/kafka_exporter_dashboard.json deleted file mode 100644 index 5b7552ad..00000000 --- a/installers/charm/grafana/templates/kafka_exporter_dashboard.json +++ /dev/null @@ -1,609 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": "-- Grafana --", - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - } - ] - }, - "description": "Kafka resource usage and throughput", - "editable": true, - "gnetId": 7589, - "graphTooltip": 0, - "id": 10, - "iteration": 1578848023483, - "links": [], - "panels": [ - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "prometheus - Juju generated source", - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 10, - "w": 10, - "x": 0, - "y": 0 - }, - "id": 14, - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "max": true, - "min": false, - "rightSide": false, - "show": true, - "sideWidth": 480, - "sort": "max", - "sortDesc": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "connected", - "options": { - "dataLinks": [] - }, - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(kafka_topic_partition_current_offset - kafka_topic_partition_oldest_offset{instance=\"$instance\", topic=~\"$topic\"}) by (topic)", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{topic}}", - "refId": "B" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Messages stored per topic", - "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": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "prometheus - Juju generated source", - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 10, - "w": 10, - "x": 10, - "y": 0 - }, - "id": 12, - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "max": true, - "min": false, - "rightSide": false, - "show": true, - "sideWidth": 480, - "sort": "max", - "sortDesc": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "connected", - "options": { - "dataLinks": [] - }, - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(kafka_consumergroup_lag{instance=\"$instance\",topic=~\"$topic\"}) by (consumergroup, topic) ", - "format": "time_series", - "instant": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": " {{topic}} ({{consumergroup}})", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Lag by Consumer Group", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": "", - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "prometheus - Juju generated source", - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 10, - "w": 10, - "x": 0, - "y": 10 - }, - "id": 16, - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "max": true, - "min": false, - "rightSide": false, - "show": true, - "sideWidth": 480, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "connected", - "options": { - "dataLinks": [] - }, - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(delta(kafka_topic_partition_current_offset{instance=~'$instance', topic=~\"$topic\"}[5m])/5) by (topic)", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{topic}}", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Messages produced per minute", - "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": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "prometheus - Juju generated source", - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 10, - "w": 10, - "x": 10, - "y": 10 - }, - "id": 18, - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "max": true, - "min": false, - "rightSide": false, - "show": true, - "sideWidth": 480, - "sort": "current", - "sortDesc": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "connected", - "options": { - "dataLinks": [] - }, - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(delta(kafka_consumergroup_current_offset{instance=~'$instance',topic=~\"$topic\"}[5m])/5) by (consumergroup, topic)", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": " {{topic}} ({{consumergroup}})", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Messages consumed per minute", - "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": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": true, - "dashLength": 10, - "dashes": false, - "datasource": "prometheus - Juju generated source", - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 20, - "x": 0, - "y": 20 - }, - "id": 8, - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": 420, - "total": false, - "values": true - }, - "lines": false, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "options": { - "dataLinks": [] - }, - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum by(topic) (kafka_topic_partitions{instance=\"$instance\",topic=~\"$topic\"})", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{topic}}", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Partitions per Topic", - "tooltip": { - "shared": false, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "series", - "name": null, - "show": false, - "values": [ - "current" - ] - }, - "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 - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - } - ], - "refresh": "5s", - "schemaVersion": 19, - "style": "dark", - "tags": [], - "templating": { - "list": [ - { - "allValue": null, - "current": { - "text": "osm-kafka-exporter-service", - "value": "osm-kafka-exporter-service" - }, - "datasource": "prometheus - Juju generated source", - "definition": "", - "hide": 0, - "includeAll": false, - "label": "Job", - "multi": false, - "name": "job", - "options": [], - "query": "label_values(kafka_consumergroup_current_offset, job)", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 0, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": null, - "datasource": "prometheus - Juju generated source", - "definition": "", - "hide": 0, - "includeAll": false, - "label": "Instance", - "multi": false, - "name": "instance", - "options": [], - "query": "label_values(kafka_consumergroup_current_offset{job=~\"$job\"}, instance)", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 0, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": null, - "current": { - "tags": [], - "text": "All", - "value": [ - "$__all" - ] - }, - "datasource": "prometheus - Juju generated source", - "definition": "", - "hide": 0, - "includeAll": true, - "label": "Topic", - "multi": true, - "name": "topic", - "options": [], - "query": "label_values(kafka_topic_partition_current_offset{instance='$instance',topic!='__consumer_offsets',topic!='--kafka'}, topic)", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "topic", - "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": "browser", - "title": "Kafka", - "uid": "jwPKIsniz", - "version": 2 -} diff --git a/installers/charm/grafana/templates/mongodb_exporter_dashboard.json b/installers/charm/grafana/templates/mongodb_exporter_dashboard.json deleted file mode 100644 index c6c64c27..00000000 --- a/installers/charm/grafana/templates/mongodb_exporter_dashboard.json +++ /dev/null @@ -1,938 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": "-- Grafana --", - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - } - ] - }, - "description": "MongoDB Prometheus Exporter Dashboard.", - "editable": true, - "gnetId": 2583, - "graphTooltip": 1, - "id": 1, - "iteration": 1615141074039, - "links": [], - "panels": [ - { - "collapsed": false, - "datasource": null, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 0 - }, - "id": 22, - "panels": [], - "repeat": "env", - "title": "Health", - "type": "row" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": true, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "datasource": "prometheus - Juju generated source", - "decimals": null, - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "format": "s", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 4, - "w": 12, - "x": 0, - "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, - "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": "mongodb_ss_uptime{}", - "format": "time_series", - "interval": "", - "intervalFactor": 2, - "legendFormat": "", - "refId": "A", - "step": 1800 - } - ], - "thresholds": "0,360", - "title": "Uptime", - "type": "singlestat", - "valueFontSize": "80%", - "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 - Juju generated source", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "format": "none", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 4, - "w": 12, - "x": 12, - "y": 1 - }, - "id": 1, - "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" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": true, - "lineColor": "rgb(31, 120, 193)", - "show": true - }, - "tableColumn": "", - "targets": [ - { - "expr": "mongodb_ss_connections{conn_type=\"current\"}", - "format": "time_series", - "interval": "", - "intervalFactor": 2, - "legendFormat": "", - "metric": "mongodb_connections", - "refId": "A", - "step": 1800 - } - ], - "thresholds": "", - "title": "Open Connections", - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "avg" - }, - { - "collapsed": false, - "datasource": null, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 5 - }, - "id": 20, - "panels": [], - "repeat": "env", - "title": "Operations", - "type": "row" - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "prometheus - Juju generated source", - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 6, - "w": 10, - "x": 0, - "y": 6 - }, - "hiddenSeries": false, - "id": 7, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "7.4.3", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(mongodb_ss_opcounters[$interval])", - "format": "time_series", - "interval": "", - "intervalFactor": 2, - "legendFormat": "{{legacy_op_type}}", - "refId": "A", - "step": 240 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Query Operations", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "$$hashKey": "object:670", - "format": "ops", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "$$hashKey": "object:671", - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "prometheus - Juju generated source", - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 6, - "w": 8, - "x": 10, - "y": 6 - }, - "hiddenSeries": false, - "id": 9, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "7.4.3", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - { - "alias": "returned", - "yaxis": 1 - } - ], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(mongodb_ss_metrics_document[$interval])", - "format": "time_series", - "interval": "", - "intervalFactor": 2, - "legendFormat": "{{doc_op_type}}", - "refId": "A", - "step": 240 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Document Operations", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "$$hashKey": "object:699", - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "$$hashKey": "object:700", - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "prometheus - Juju generated source", - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 6, - "w": 6, - "x": 18, - "y": 6 - }, - "hiddenSeries": false, - "id": 8, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "7.4.3", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(mongodb_ss_opcounters[$interval])", - "format": "time_series", - "interval": "", - "intervalFactor": 2, - "legendFormat": "{{legacy_op_type}}", - "refId": "A", - "step": 600 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Document Query Executor", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "$$hashKey": "object:728", - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "$$hashKey": "object:729", - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "collapsed": false, - "datasource": null, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 12 - }, - "id": 23, - "panels": [], - "repeat": null, - "title": "Resources", - "type": "row" - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "prometheus - Juju generated source", - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 6, - "w": 12, - "x": 0, - "y": 13 - }, - "hiddenSeries": false, - "id": 4, - "legend": { - "alignAsTable": false, - "avg": false, - "current": true, - "hideEmpty": false, - "hideZero": false, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "7.4.3", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "mongodb_ss_mem_resident", - "format": "time_series", - "interval": "", - "intervalFactor": 2, - "legendFormat": "Resident", - "refId": "A", - "step": 240 - }, - { - "expr": "mongodb_ss_mem_virtual", - "hide": false, - "interval": "", - "legendFormat": "Virtual", - "refId": "B" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Memory", - "tooltip": { - "shared": false, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - "total" - ] - }, - "yaxes": [ - { - "$$hashKey": "object:523", - "format": "decmbytes", - "label": "", - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "$$hashKey": "object:524", - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "prometheus - Juju generated source", - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 6, - "w": 12, - "x": 12, - "y": 13 - }, - "hiddenSeries": false, - "id": 5, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "7.4.3", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(mongodb_ss_network_bytesOut[$interval])", - "format": "time_series", - "interval": "", - "intervalFactor": 2, - "legendFormat": "Out", - "metric": "mongodb_metrics_operation_total", - "refId": "A", - "step": 240 - }, - { - "expr": "rate(mongodb_ss_network_bytesIn[$interval])", - "hide": false, - "interval": "", - "intervalFactor": 2, - "legendFormat": "In", - "refId": "B" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Network I/O", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "$$hashKey": "object:579", - "format": "decbytes", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "$$hashKey": "object:580", - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - } - ], - "refresh": "5s", - "schemaVersion": 27, - "style": "dark", - "tags": [], - "templating": { - "list": [ - { - "allValue": null, - "current": { - "selected": true, - "text": [ - "All" - ], - "value": [ - "$__all" - ] - }, - "datasource": "prometheus - Juju generated source", - "definition": "", - "description": null, - "error": null, - "hide": 0, - "includeAll": true, - "label": "instance", - "multi": true, - "name": "instance", - "options": [], - "query": { - "query": "label_values(mongodb_connections, instance)", - "refId": "prometheus - Juju generated source-instance-Variable-Query" - }, - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "/.*-(.*?)-.*/", - "tags": [], - "tagsQuery": "label_values(mongodb_connections, instance)", - "type": "query", - "useTags": false - }, - { - "auto": true, - "auto_count": 30, - "auto_min": "10s", - "current": { - "selected": false, - "text": "auto", - "value": "$__auto_interval_interval" - }, - "description": null, - "error": null, - "hide": 0, - "label": null, - "name": "interval", - "options": [ - { - "selected": true, - "text": "auto", - "value": "$__auto_interval_interval" - }, - { - "selected": false, - "text": "1m", - "value": "1m" - }, - { - "selected": false, - "text": "10m", - "value": "10m" - }, - { - "selected": false, - "text": "30m", - "value": "30m" - }, - { - "selected": false, - "text": "1h", - "value": "1h" - }, - { - "selected": false, - "text": "6h", - "value": "6h" - }, - { - "selected": false, - "text": "12h", - "value": "12h" - }, - { - "selected": false, - "text": "1d", - "value": "1d" - }, - { - "selected": false, - "text": "7d", - "value": "7d" - }, - { - "selected": false, - "text": "14d", - "value": "14d" - }, - { - "selected": false, - "text": "30d", - "value": "30d" - } - ], - "query": "1m,10m,30m,1h,6h,12h,1d,7d,14d,30d", - "refresh": 2, - "skipUrlSync": false, - "type": "interval" - } - ] - }, - "time": { - "from": "now/d", - "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": "MongoDB", - "uid": "HEK4NbtZk", - "version": 17 -} \ No newline at end of file diff --git a/installers/charm/grafana/templates/mysql_exporter_dashboard.json b/installers/charm/grafana/templates/mysql_exporter_dashboard.json deleted file mode 100644 index 9f9acac3..00000000 --- a/installers/charm/grafana/templates/mysql_exporter_dashboard.json +++ /dev/null @@ -1,1145 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": "-- Grafana --", - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - } - ] - }, - "description": "Mysql dashboard", - "editable": true, - "gnetId": 6239, - "graphTooltip": 0, - "id": 34, - "iteration": 1569307668513, - "links": [], - "panels": [ - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 0 - }, - "id": 17, - "panels": [], - "title": "Global status", - "type": "row" - }, - { - "cacheTimeout": null, - "colorBackground": true, - "colorValue": false, - "colors": [ - "#bf1b00", - "#508642", - "#ef843c" - ], - "datasource": "prometheus - Juju generated source", - "format": "none", - "gauge": { - "maxValue": 1, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 7, - "w": 6, - "x": 0, - "y": 1 - }, - "id": 11, - "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": {}, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": true, - "lineColor": "rgb(31, 120, 193)", - "show": true - }, - "tableColumn": "", - "targets": [ - { - "expr": "mysql_up{release=\"$release\"}", - "format": "time_series", - "intervalFactor": 1, - "refId": "A" - } - ], - "thresholds": "1,2", - "title": "Instance Up", - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": true, - "colorValue": false, - "colors": [ - "#d44a3a", - "rgba(237, 129, 40, 0.89)", - "#508642" - ], - "datasource": "prometheus - Juju generated source", - "format": "s", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 7, - "w": 6, - "x": 6, - "y": 1 - }, - "id": 15, - "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": {}, - "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": true - }, - "tableColumn": "", - "targets": [ - { - "expr": "mysql_global_status_uptime{release=\"$release\"}", - "format": "time_series", - "intervalFactor": 1, - "refId": "A" - } - ], - "thresholds": "25200,32400", - "title": "Uptime", - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "current" - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "prometheus - Juju generated source", - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 12, - "x": 12, - "y": 1 - }, - "id": 29, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "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": "mysql_global_status_max_used_connections{release=\"$release\"}", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "current", - "refId": "A" - }, - { - "expr": "mysql_global_variables_max_connections{release=\"$release\"}", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "Max", - "refId": "B" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Mysql 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": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 8 - }, - "id": 19, - "panels": [], - "title": "I/O", - "type": "row" - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "prometheus - Juju generated source", - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 9, - "w": 12, - "x": 0, - "y": 9 - }, - "id": 5, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "options": { - "dataLinks": [] - }, - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - { - "alias": "write", - "transform": "negative-Y" - } - ], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "irate(mysql_global_status_innodb_data_reads{release=\"$release\"}[10m])", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "reads", - "refId": "A" - }, - { - "expr": "irate(mysql_global_status_innodb_data_writes{release=\"$release\"}[10m])", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "write", - "refId": "B" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "mysql disk reads vs writes", - "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": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "prometheus - Juju generated source", - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 9, - "w": 12, - "x": 12, - "y": 9 - }, - "id": 9, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "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(mysql_global_status_bytes_received{release=\"$release\"}[5m])", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "received", - "refId": "A" - }, - { - "expr": "irate(mysql_global_status_bytes_sent{release=\"$release\"}[5m])", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "sent", - "refId": "B" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "mysql network received vs sent", - "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": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "prometheus - Juju generated source", - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 12, - "x": 0, - "y": 18 - }, - "id": 2, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "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(mysql_global_status_commands_total{release=\"$release\"}[5m]) > 0", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{ command }} - {{ release }}", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Query rates", - "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": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "prometheus - Juju generated source", - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 12, - "x": 12, - "y": 18 - }, - "id": 25, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "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": "mysql_global_status_threads_running{release=\"$release\"} ", - "format": "time_series", - "intervalFactor": 1, - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Running Threads", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": null, - "format": "short", - "label": null, - "logBase": 1, - "max": "15", - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 25 - }, - "id": 21, - "panels": [], - "title": "Errors", - "type": "row" - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "prometheus - Juju generated source", - "description": "The number of connections that were aborted because the client died without closing the connection properly.", - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 9, - "w": 12, - "x": 0, - "y": 26 - }, - "id": 13, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "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": "mysql_global_status_aborted_clients{release=\"$release\"}", - "format": "time_series", - "intervalFactor": 1, - "refId": "B" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Aborted clients", - "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": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "prometheus - Juju generated source", - "description": "The number of failed attempts to connect to the MySQL server.", - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 9, - "w": 12, - "x": 12, - "y": 26 - }, - "id": 4, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "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": "mysql_global_status_aborted_connects{release=\"$release\"}", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "mysql aborted Connects", - "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": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 35 - }, - "id": 23, - "panels": [], - "title": "Disk usage", - "type": "row" - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "prometheus - Juju generated source", - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 9, - "w": 12, - "x": 0, - "y": 36 - }, - "id": 27, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "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": "sum(mysql_info_schema_table_size{component=\"data_length\",release=\"$release\"})", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "Tables", - "refId": "A" - }, - { - "expr": "sum(mysql_info_schema_table_size{component=\"index_length\",release=\"$release\"})", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "Indexes", - "refId": "B" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Disk usage tables / indexes", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "decbytes", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "prometheus - Juju generated source", - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 9, - "w": 12, - "x": 12, - "y": 36 - }, - "id": 7, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "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": "sum(mysql_info_schema_table_rows{release=\"$release\"})", - "format": "time_series", - "intervalFactor": 1, - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Sum of all rows", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": null, - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - } - ], - "schemaVersion": 19, - "style": "dark", - "tags": [ - ], - "templating": { - "list": [ - { - "allValue": null, - "current": { - "isNone": true, - "text": "None", - "value": "" - }, - "datasource": "prometheus - Juju generated source", - "definition": "", - "hide": 0, - "includeAll": false, - "label": null, - "multi": false, - "name": "release", - "options": [], - "query": "label_values(mysql_up,release)", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 0, - "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": "", - "title": "Mysql", - "uid": "6-kPlS7ik", - "version": 1 -} diff --git a/installers/charm/grafana/templates/nodes_exporter_dashboard.json b/installers/charm/grafana/templates/nodes_exporter_dashboard.json deleted file mode 100644 index c67f2030..00000000 --- a/installers/charm/grafana/templates/nodes_exporter_dashboard.json +++ /dev/null @@ -1,1965 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": "-- Grafana --", - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - } - ] - }, - "description": "Physical nodes dashboard", - "editable": true, - "gnetId": 11074, - "graphTooltip": 0, - "id": 4, - "iteration": 1615160452938, - "links": [], - "panels": [ - { - "collapsed": false, - "datasource": null, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 0 - }, - "id": 179, - "panels": [], - "title": "Summary", - "type": "row" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorPostfix": false, - "colorPrefix": false, - "colorValue": true, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "datasource": "prometheus - Juju generated source", - "decimals": 1, - "description": "", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "format": "s", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 6, - "w": 2, - "x": 0, - "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, - "pluginVersion": "6.4.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 - }, - "tableColumn": "", - "targets": [ - { - "expr": "max(system_uptime)", - "format": "time_series", - "hide": false, - "instant": true, - "interval": "", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 40 - } - ], - "thresholds": "1,2", - "title": "System Uptime", - "type": "singlestat", - "valueFontSize": "70%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorPostfix": false, - "colorValue": true, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "datasource": "prometheus - Juju generated source", - "description": "", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "format": "short", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 6, - "w": 2, - "x": 2, - "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": "sum(system_n_cpus)", - "format": "time_series", - "instant": true, - "interval": "", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 20 - } - ], - "thresholds": "1,2", - "title": "CPU Cores", - "type": "singlestat", - "valueFontSize": "70%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": true, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "datasource": "prometheus - Juju generated source", - "decimals": 2, - "description": "", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "format": "bytes", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 6, - "w": 2, - "x": 4, - "y": 1 - }, - "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": "sum(mem_total)", - "format": "time_series", - "instant": true, - "interval": "", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A", - "step": 20 - } - ], - "thresholds": "2,3", - "title": "Total RAM", - "type": "singlestat", - "valueFontSize": "70%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "current" - }, - { - "datasource": "prometheus - Juju generated source", - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "custom": {}, - "displayName": "", - "mappings": [ - { - "from": "", - "id": 1, - "operator": "", - "text": "-", - "to": "", - "type": 1, - "value": "NaN" - } - ], - "max": 100, - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "#EAB839", - "value": 60 - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "percent" - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 18, - "x": 6, - "y": 1 - }, - "id": 177, - "options": { - "displayMode": "lcd", - "orientation": "horizontal", - "reduceOptions": { - "calcs": [ - "last" - ], - "fields": "", - "values": false - }, - "showUnfilled": true, - "text": {} - }, - "pluginVersion": "7.4.3", - "targets": [ - { - "expr": "avg(irate(cpu_usage_system[$__rate_interval]) + irate(cpu_usage_user[$__rate_interval])) * 100", - "hide": false, - "instant": true, - "interval": "", - "legendFormat": "CPU Busy", - "refId": "A" - }, - { - "expr": "avg(irate(cpu_usage_iowait[$__rate_interval])) * 100", - "hide": false, - "instant": true, - "interval": "", - "legendFormat": "Busy Iowait", - "refId": "C" - }, - { - "expr": "avg(mem_used_percent)", - "instant": true, - "interval": "", - "legendFormat": "Used RAM Memory", - "refId": "B" - }, - { - "expr": "avg(disk_used_percent{fstype=\"ext4\"})", - "hide": false, - "instant": true, - "interval": "", - "legendFormat": "Used Max Mount($maxmount)", - "refId": "D" - }, - { - "expr": "avg(swap_used_percent)", - "instant": true, - "interval": "", - "legendFormat": "Used SWAP", - "refId": "E" - } - ], - "timeFrom": null, - "timeShift": null, - "title": "", - "type": "bargauge" - }, - { - "collapsed": true, - "datasource": null, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 7 - }, - "id": 181, - "panels": [ - { - "aliasColors": { - "15分钟": "#6ED0E0", - "1分钟": "#BF1B00", - "5分钟": "#CCA300" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "prometheus - Juju generated source", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 1, - "grid": {}, - "gridPos": { - "h": 10, - "w": 12, - "x": 0, - "y": 2 - }, - "height": "300", - "hiddenSeries": false, - "id": 13, - "legend": { - "alignAsTable": true, - "avg": true, - "current": true, - "max": true, - "min": false, - "rightSide": false, - "show": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 2, - "links": [], - "maxPerRow": 6, - "nullPointMode": "null as zero", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "7.4.3", - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "system_load1", - "format": "time_series", - "instant": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{juju_unit}}_1m", - "metric": "", - "refId": "A", - "step": 20, - "target": "" - }, - { - "expr": "system_load5", - "format": "time_series", - "instant": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{juju_unit}}_5m", - "refId": "B", - "step": 20 - }, - { - "expr": "system_load15", - "format": "time_series", - "instant": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{juju_unit}}_15m", - "refId": "C", - "step": 20 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "System Load", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 2, - "value_type": "cumulative" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "192.168.200.241:9100_Total": "dark-red", - "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 - Juju generated source", - "decimals": 2, - "description": "", - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 10, - "w": 12, - "x": 12, - "y": 2 - }, - "hiddenSeries": false, - "id": 7, - "legend": { - "alignAsTable": true, - "avg": true, - "current": true, - "hideEmpty": true, - "hideZero": true, - "max": true, - "min": false, - "rightSide": false, - "show": true, - "sideWidth": null, - "sort": "current", - "sortDesc": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 2, - "links": [], - "maxPerRow": 6, - "nullPointMode": "null", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "7.4.3", - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "seriesOverrides": [ - { - "alias": "/.*_Total/", - "color": "#C4162A", - "fill": 0 - } - ], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "avg(irate(cpu_usage_system[30m])) by (juju_unit)", - "format": "time_series", - "hide": false, - "instant": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{juju_unit}}_System", - "refId": "A", - "step": 20 - }, - { - "expr": "avg(irate(cpu_usage_user[30m])) by (juju_unit)", - "format": "time_series", - "hide": false, - "intervalFactor": 1, - "legendFormat": "{{juju_unit}}_User", - "refId": "B", - "step": 240 - }, - { - "expr": "avg(irate(cpu_usage_iowait[30m])) by (juju_unit)", - "format": "time_series", - "hide": false, - "instant": false, - "intervalFactor": 1, - "legendFormat": "{{juju_unit}}_Iowait", - "refId": "D", - "step": 240 - }, - { - "expr": "1 - avg(irate(cpu_usage_idle[30m])) by (juju_unit)", - "format": "time_series", - "hide": false, - "intervalFactor": 1, - "legendFormat": "{{juju_unit}}_Total", - "refId": "F", - "step": 240 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "CPU", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 2, - "format": "percentunit", - "label": "", - "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": "CPU", - "type": "row" - }, - { - "collapsed": true, - "datasource": null, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 8 - }, - "id": 183, - "panels": [ - { - "datasource": "prometheus - Juju generated source", - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "custom": { - "align": null, - "filterable": false - }, - "decimals": 2, - "displayName": "", - "mappings": [], - "thresholds": { - "mode": "percentage", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "juju_unit" - }, - "properties": [ - { - "id": "displayName", - "value": "Unit" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "device (lastNotNull)" - }, - "properties": [ - { - "id": "displayName", - "value": "Device" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "fstype (lastNotNull)" - }, - "properties": [ - { - "id": "displayName", - "value": "Filesystem" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "path (lastNotNull)" - }, - "properties": [ - { - "id": "displayName", - "value": "Mounted on" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Value #A (lastNotNull)" - }, - "properties": [ - { - "id": "displayName", - "value": "Avail" - }, - { - "id": "unit", - "value": "decbytes" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Value #B (lastNotNull)" - }, - "properties": [ - { - "id": "displayName", - "value": "Used" - }, - { - "id": "unit", - "value": "percent" - }, - { - "id": "custom.displayMode", - "value": "color-background" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Value #C (lastNotNull)" - }, - "properties": [ - { - "id": "displayName", - "value": "Size" - }, - { - "id": "unit", - "value": "decbytes" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Device" - }, - "properties": [ - { - "id": "custom.width", - "value": 101 - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Filesystem" - }, - "properties": [ - { - "id": "custom.width", - "value": 86 - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Unit" - }, - "properties": [ - { - "id": "custom.width", - "value": 151 - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Mounted on" - }, - "properties": [ - { - "id": "custom.width", - "value": 94 - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Avail" - }, - "properties": [ - { - "id": "custom.width", - "value": 74 - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Used" - }, - "properties": [ - { - "id": "custom.width", - "value": 64 - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Size" - }, - "properties": [ - { - "id": "custom.width", - "value": 86 - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 8, - "x": 0, - "y": 3 - }, - "id": 164, - "links": [], - "options": { - "showHeader": true, - "sortBy": [] - }, - "pluginVersion": "7.4.3", - "targets": [ - { - "expr": "disk_free{fstype=\"ext4\"}", - "format": "table", - "hide": false, - "instant": true, - "interval": "10s", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A" - }, - { - "expr": "disk_used_percent{fstype=\"ext4\"}", - "format": "table", - "hide": false, - "instant": true, - "interval": "", - "intervalFactor": 1, - "legendFormat": "", - "refId": "B" - }, - { - "expr": "disk_total{fstype=\"ext4\"}", - "format": "table", - "hide": false, - "instant": true, - "intervalFactor": 1, - "legendFormat": "", - "refId": "C" - } - ], - "title": "Disk Space Used (EXT4/XFS)", - "transformations": [ - { - "id": "merge", - "options": {} - }, - { - "id": "groupBy", - "options": { - "fields": { - "Value #A": { - "aggregations": [ - "lastNotNull" - ], - "operation": "aggregate" - }, - "Value #B": { - "aggregations": [ - "lastNotNull" - ], - "operation": "aggregate" - }, - "Value #C": { - "aggregations": [ - "lastNotNull" - ], - "operation": "aggregate" - }, - "device": { - "aggregations": [ - "lastNotNull" - ], - "operation": "aggregate" - }, - "fstype": { - "aggregations": [ - "lastNotNull" - ], - "operation": "aggregate" - }, - "juju_unit": { - "aggregations": [], - "operation": "groupby" - }, - "path": { - "aggregations": [ - "lastNotNull" - ], - "operation": "aggregate" - } - } - } - } - ], - "type": "table" - }, - { - "datasource": "prometheus - Juju generated source", - "description": "Per second read / write bytes ", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "Bytes read (-) / write (+)", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 10, - "gradientMode": "opacity", - "hideFrom": { - "graph": false, - "legend": false, - "tooltip": false - }, - "lineInterpolation": "linear", - "lineWidth": 2, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": true - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "Bps" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 8, - "x": 8, - "y": 3 - }, - "id": 168, - "links": [], - "options": { - "graph": {}, - "legend": { - "calcs": [ - "mean", - "max", - "min", - "sum" - ], - "displayMode": "table", - "placement": "bottom" - }, - "tooltipOptions": { - "mode": "single" - } - }, - "pluginVersion": "7.4.3", - "targets": [ - { - "expr": "rate(diskio_read_bytes{name!~\"loop.*\"}[$__rate_interval])", - "format": "time_series", - "hide": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{juju_unit}}_{{name}}_Read bytes", - "refId": "A", - "step": 10 - }, - { - "expr": "irate(diskio_write_bytes{name!~\"loop.*\"}[$__rate_interval])", - "format": "time_series", - "hide": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{juju_unit}}_{{name}}_Written bytes", - "refId": "B", - "step": 10 - } - ], - "timeFrom": null, - "timeShift": null, - "title": "Disk R/W Data", - "type": "timeseries" - }, - { - "aliasColors": { - "Idle - Waiting for something to happen": "#052B51", - "guest": "#9AC48A", - "idle": "#052B51", - "iowait": "#EAB839", - "irq": "#BF1B00", - "nice": "#C15C17", - "sdb_每秒I/O操作%": "#d683ce", - "softirq": "#E24D42", - "steal": "#FCE2DE", - "system": "#508642", - "user": "#5195CE", - "磁盘花费在I/O操作占比": "#ba43a9" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "prometheus - Juju generated source", - "decimals": null, - "description": "The time spent on I/O in the natural time of each second.(wall-clock time)", - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 5, - "gridPos": { - "h": 8, - "w": 8, - "x": 16, - "y": 3 - }, - "hiddenSeries": false, - "id": 175, - "legend": { - "alignAsTable": true, - "avg": true, - "current": true, - "hideEmpty": true, - "hideZero": true, - "max": true, - "min": false, - "rightSide": false, - "show": true, - "sideWidth": null, - "sort": null, - "sortDesc": null, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 2, - "links": [], - "maxPerRow": 6, - "nullPointMode": "null", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "7.4.3", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "irate(diskio_io_time{name!~\"loop.*\"}[$__rate_interval])", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{juju_unit}}_{{name}}_ IO time", - "refId": "C" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Time Spent Doing I/Os", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": null, - "format": "s", - "label": "", - "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": "Disk", - "type": "row" - }, - { - "collapsed": true, - "datasource": null, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 9 - }, - "id": 185, - "panels": [ - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "prometheus - Juju generated source", - "decimals": 2, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 24, - "x": 0, - "y": 12 - }, - "height": "300", - "hiddenSeries": false, - "id": 156, - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "sort": "current", - "sortDesc": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 2, - "links": [], - "nullPointMode": "null", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "7.4.3", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - { - "$$hashKey": "object:2450", - "alias": "/.*_Total/", - "color": "#C4162A", - "fill": 0 - } - ], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "mem_total", - "format": "time_series", - "hide": false, - "instant": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{juju_unit}}_Total", - "refId": "A", - "step": 4 - }, - { - "expr": "mem_used", - "format": "time_series", - "hide": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{juju_unit}}_Used", - "refId": "B", - "step": 4 - }, - { - "expr": "mem_available", - "format": "time_series", - "hide": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{juju_unit}}_Avaliable", - "refId": "F", - "step": 4 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Memory", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "$$hashKey": "object:2459", - "format": "bytes", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "$$hashKey": "object:2460", - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - } - ], - "title": "Memory", - "type": "row" - }, - { - "collapsed": true, - "datasource": null, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 10 - }, - "id": 187, - "panels": [ - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "prometheus - Juju generated source", - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 3, - "gridPos": { - "h": 12, - "w": 12, - "x": 0, - "y": 13 - }, - "height": "300", - "hiddenSeries": false, - "id": 157, - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "hideEmpty": true, - "hideZero": true, - "max": true, - "min": false, - "rightSide": false, - "show": true, - "sort": "current", - "sortDesc": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 2, - "links": [], - "nullPointMode": "null", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "7.4.3", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - { - "$$hashKey": "object:2498", - "alias": "/.*_transmit$/", - "transform": "negative-Y" - } - ], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "irate(net_bytes_recv{interface!~'tap.*|veth.*|br.*|docker.*|virbr*|lo*'}[$__rate_interval])*8", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{juju_unit}}_{{interface}}_receive", - "refId": "A", - "step": 4 - }, - { - "expr": "irate(net_bytes_sent{interface!~'tap.*|veth.*|br.*|docker.*|virbr*|lo*'}[$__rate_interval])*8", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{instance}}_{{device}}_transmit", - "refId": "B", - "step": 4 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Network Traffic", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "$$hashKey": "object:2505", - "format": "bps", - "label": "transmit(-)/receive(+)", - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "$$hashKey": "object:2506", - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "TCP": "#6ED0E0" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "prometheus - Juju generated source", - "description": "TCP_alloc - Allocated sockets\n\nCurrEstab - TCP connections for which the current state is either ESTABLISHED or CLOSE- WAIT\n\nTCP_tw - Sockets wating close\n\nUDP_inuse - Udp sockets currently in use\n\nSockets_used - Sockets currently in use", - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 12, - "w": 12, - "x": 12, - "y": 13 - }, - "height": "300", - "hiddenSeries": false, - "id": 158, - "interval": "", - "legend": { - "alignAsTable": true, - "avg": true, - "current": true, - "hideEmpty": true, - "hideZero": true, - "max": true, - "min": false, - "rightSide": false, - "show": true, - "sort": "current", - "sortDesc": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 2, - "links": [], - "nullPointMode": "null", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "7.4.3", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - { - "$$hashKey": "object:2576", - "alias": "/.*_Sockets_used/", - "color": "#C4162A", - "fill": 0 - } - ], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "netstat_tcp_established", - "format": "time_series", - "hide": false, - "instant": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{juju_unit}}_CurrEstab", - "refId": "A", - "step": 20 - }, - { - "expr": "sockstat_TCP_tw", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{juju_unit}}_TCP_tw", - "refId": "D" - }, - { - "expr": "sockstat_sockets_used", - "interval": "", - "legendFormat": "{{juju_unit}}_Sockets_used", - "refId": "B" - }, - { - "expr": "sockstat_UDP_inuse", - "interval": "", - "legendFormat": "{{juju_unit}}_UDP_inuse", - "refId": "C" - }, - { - "expr": "sockstat_TCP_alloc", - "interval": "", - "legendFormat": "{{juju_unit}}_TCP_alloc", - "refId": "E" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Network Sockstat", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "$$hashKey": "object:2585", - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "$$hashKey": "object:2586", - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - } - ], - "title": "Network", - "type": "row" - } - ], - "refresh": false, - "schemaVersion": 27, - "style": "dark", - "tags": [], - "templating": { - "list": [ - { - "allValue": null, - "current": { - "isNone": true, - "selected": false, - "text": "None", - "value": "" - }, - "datasource": "prometheus - Juju generated source", - "definition": "label_values(node_uname_info, job)", - "description": null, - "error": null, - "hide": 0, - "includeAll": false, - "label": "JOB", - "multi": false, - "name": "job", - "options": [], - "query": { - "query": "label_values(node_uname_info, job)", - "refId": "prometheus - Juju generated source-job-Variable-Query" - }, - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": null, - "current": { - "selected": false, - "text": "All", - "value": "$__all" - }, - "datasource": "prometheus - Juju generated source", - "definition": "label_values(node_uname_info{job=~\"$job\"}, nodename)", - "description": null, - "error": null, - "hide": 0, - "includeAll": true, - "label": "Host", - "multi": true, - "name": "hostname", - "options": [], - "query": { - "query": "label_values(node_uname_info{job=~\"$job\"}, nodename)", - "refId": "prometheus - Juju generated source-hostname-Variable-Query" - }, - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 0, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allFormat": "glob", - "allValue": null, - "current": { - "selected": false, - "text": "All", - "value": "$__all" - }, - "datasource": "prometheus - Juju generated source", - "definition": "label_values(node_uname_info{nodename=~\"$hostname\"},instance)", - "description": null, - "error": null, - "hide": 0, - "includeAll": true, - "label": "IP", - "multi": false, - "multiFormat": "regex values", - "name": "node", - "options": [], - "query": { - "query": "label_values(node_uname_info{nodename=~\"$hostname\"},instance)", - "refId": "prometheus - Juju generated source-node-Variable-Query" - }, - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": null, - "current": { - "isNone": true, - "selected": false, - "text": "None", - "value": "" - }, - "datasource": "prometheus - Juju generated source", - "definition": "", - "description": null, - "error": null, - "hide": 2, - "includeAll": false, - "label": "", - "multi": false, - "name": "maxmount", - "options": [], - "query": { - "query": "query_result(topk(1,sort_desc (max(node_filesystem_size_bytes{instance=~'$node',fstype=~\"ext4|xfs\"}) by (mountpoint))))", - "refId": "prometheus - Juju generated source-maxmount-Variable-Query" - }, - "refresh": 2, - "regex": "/.*\\\"(.*)\\\".*/", - "skipUrlSync": false, - "sort": 0, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allFormat": "glob", - "allValue": null, - "current": { - "isNone": true, - "selected": false, - "text": "None", - "value": "" - }, - "datasource": "prometheus - Juju generated source", - "definition": "", - "description": null, - "error": null, - "hide": 2, - "includeAll": false, - "label": null, - "multi": false, - "multiFormat": "regex values", - "name": "env", - "options": [], - "query": { - "query": "label_values(node_exporter_build_info,env)", - "refId": "prometheus - Juju generated source-env-Variable-Query" - }, - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allFormat": "glob", - "allValue": "", - "current": { - "isNone": true, - "selected": false, - "text": "None", - "value": "" - }, - "datasource": "prometheus - Juju generated source", - "definition": "label_values(node_exporter_build_info{env=~'$env'},name)", - "description": null, - "error": null, - "hide": 2, - "includeAll": false, - "label": "名称", - "multi": true, - "multiFormat": "regex values", - "name": "name", - "options": [], - "query": { - "query": "label_values(node_exporter_build_info{env=~'$env'},name)", - "refId": "prometheus - Juju generated source-name-Variable-Query" - }, - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "/.*/", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - } - ] - }, - "time": { - "from": "now-2d", - "to": "now" - }, - "timepicker": { - "now": true, - "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": "Hosts", - "uid": "ha7fSE0Zz", - "version": 16 -} \ No newline at end of file diff --git a/installers/charm/grafana/templates/summary_dashboard.json b/installers/charm/grafana/templates/summary_dashboard.json deleted file mode 100644 index bf709d63..00000000 --- a/installers/charm/grafana/templates/summary_dashboard.json +++ /dev/null @@ -1,2112 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": "-- Grafana --", - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - } - ] - }, - "description": "OSM status summary", - "editable": true, - "gnetId": 6417, - "graphTooltip": 1, - "id": 5, - "iteration": 1615160504049, - "links": [ - { - "asDropdown": true, - "icon": "external link", - "includeVars": true, - "keepTime": false, - "tags": [], - "title": "Dashboards", - "type": "dashboards" - } - ], - "panels": [ - { - "collapsed": false, - "datasource": null, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 0 - }, - "id": 2, - "panels": [], - "title": "Cluster Health", - "type": "row" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorPrefix": false, - "colorValue": false, - "colors": [ - "#299c46", - "rgba(237, 129, 40, 0.89)", - "#d44a3a" - ], - "datasource": "prometheus - Juju generated source", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "format": "none", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 2, - "w": 12, - "x": 0, - "y": 1 - }, - "id": 26, - "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": " Nodes", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "repeat": null, - "repeatDirection": "h", - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "", - "targets": [ - { - "expr": "sum(kube_node_info)", - "format": "time_series", - "instant": true, - "interval": "", - "intervalFactor": 1, - "legendFormat": "", - "refId": "B" - } - ], - "thresholds": "1", - "title": "", - "type": "singlestat", - "valueFontSize": "70%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "#299c46", - "rgba(237, 129, 40, 0.89)", - "#d44a3a" - ], - "datasource": "prometheus - Juju generated source", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "format": "none", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 2, - "w": 12, - "x": 12, - "y": 1 - }, - "id": 30, - "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": " Pods Running", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(78, 203, 42, 0.28)", - "full": false, - "lineColor": "#629e51", - "show": true - }, - "tableColumn": "", - "targets": [ - { - "expr": "sum(kube_pod_status_phase)", - "format": "time_series", - "instant": true, - "interval": "", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A" - } - ], - "thresholds": "", - "title": "", - "type": "singlestat", - "valueFontSize": "70%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": true, - "colorPrefix": false, - "colorValue": false, - "colors": [ - "#56A64B", - "rgba(237, 129, 40, 0.89)", - "#d44a3a" - ], - "datasource": "prometheus - Juju generated source", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "format": "none", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 2, - "w": 12, - "x": 0, - "y": 3 - }, - "id": 24, - "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": " Nodes Unavailable", - "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": "sum(kube_node_info)-sum(kube_node_status_condition{condition=\"Ready\", status=\"true\"})", - "format": "time_series", - "instant": true, - "intervalFactor": 1, - "refId": "A" - } - ], - "thresholds": "1,1", - "title": "", - "type": "singlestat", - "valueFontSize": "70%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": true, - "colorValue": false, - "colors": [ - "#56A64B", - "rgba(237, 129, 40, 0.89)", - "#d44a3a" - ], - "datasource": "prometheus - Juju generated source", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "format": "none", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 2, - "w": 12, - "x": 12, - "y": 3 - }, - "id": 55, - "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": " Pods not Ready", - "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": [ - { - "expr": "sum(kube_pod_status_phase{phase!=\"Running\"})", - "instant": true, - "interval": "", - "legendFormat": "", - "refId": "A" - } - ], - "thresholds": "1", - "timeFrom": null, - "timeShift": null, - "title": "", - "type": "singlestat", - "valueFontSize": "70%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "avg" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "#299c46", - "rgba(237, 129, 40, 0.89)", - "#d44a3a" - ], - "datasource": "prometheus - Juju generated source", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "format": "percentunit", - "gauge": { - "maxValue": 1, - "minValue": 0, - "show": true, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 4, - "w": 6, - "x": 0, - "y": 5 - }, - "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" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "", - "targets": [ - { - "expr": "sum(kube_pod_info) / sum(kube_node_status_allocatable_pods)", - "format": "time_series", - "intervalFactor": 1, - "refId": "A" - } - ], - "thresholds": "0.7,0.85", - "title": "Pod Usage", - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "#299c46", - "rgba(237, 129, 40, 0.89)", - "#d44a3a" - ], - "datasource": "prometheus - Juju generated source", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "format": "percentunit", - "gauge": { - "maxValue": 1, - "minValue": 0, - "show": true, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 4, - "w": 6, - "x": 6, - "y": 5 - }, - "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" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "", - "targets": [ - { - "expr": "sum(kube_pod_container_resource_requests_cpu_cores) / sum(kube_node_status_allocatable_cpu_cores)", - "format": "time_series", - "instant": true, - "intervalFactor": 1, - "refId": "A" - } - ], - "thresholds": "0.7,0.85", - "title": "CPU Usage", - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "#299c46", - "rgba(237, 129, 40, 0.89)", - "#d44a3a" - ], - "datasource": "prometheus - Juju generated source", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "format": "percentunit", - "gauge": { - "maxValue": 1, - "minValue": 0, - "show": true, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 4, - "w": 6, - "x": 12, - "y": 5 - }, - "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" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "", - "targets": [ - { - "expr": "sum(kube_pod_container_resource_requests_memory_bytes) / sum(kube_node_status_allocatable_memory_bytes)", - "format": "time_series", - "instant": true, - "intervalFactor": 1, - "refId": "A" - } - ], - "thresholds": "0.7,0.85", - "title": "Memory Usage", - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "#73BF69", - "rgba(237, 129, 40, 0.89)", - "#d44a3a" - ], - "datasource": "prometheus - Juju generated source", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "format": "percentunit", - "gauge": { - "maxValue": 1, - "minValue": 0, - "show": true, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 4, - "w": 6, - "x": 18, - "y": 5 - }, - "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" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "", - "targets": [ - { - "expr": "(sum (node_filesystem_size_bytes) - sum (node_filesystem_free_bytes)) / sum (node_filesystem_size_bytes)", - "format": "time_series", - "instant": true, - "intervalFactor": 1, - "refId": "A" - } - ], - "thresholds": "0.7,0.85", - "title": "Disk Usage", - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "current" - }, - { - "collapsed": false, - "datasource": null, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 9 - }, - "id": 61, - "panels": [], - "title": "OSM", - "type": "row" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "#d44a3a", - "rgba(237, 129, 40, 0.89)", - "#299c46" - ], - "datasource": "prometheus - Juju generated source", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "format": "none", - "gauge": { - "maxValue": 1, - "minValue": 0, - "show": true, - "thresholdLabels": false, - "thresholdMarkers": false - }, - "gridPos": { - "h": 4, - "w": 3, - "x": 0, - "y": 10 - }, - "id": 71, - "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" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false, - "ymax": null, - "ymin": null - }, - "tableColumn": "", - "targets": [ - { - "expr": "kube_statefulset_status_replicas_ready{namespace=\"osm\", statefulset=\"prometheus-k8s\"}", - "format": "time_series", - "interval": "", - "legendFormat": "", - "refId": "A" - } - ], - "thresholds": "0,1", - "timeFrom": null, - "timeShift": null, - "title": "Prometheus", - "type": "singlestat", - "valueFontSize": "100%", - "valueMaps": [ - { - "op": "=", - "text": "0", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "#d44a3a", - "rgba(237, 129, 40, 0.89)", - "#299c46" - ], - "datasource": "prometheus - Juju generated source", - "decimals": null, - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "format": "none", - "gauge": { - "maxValue": 1, - "minValue": 0, - "show": true, - "thresholdLabels": false, - "thresholdMarkers": false - }, - "gridPos": { - "h": 4, - "w": 3, - "x": 4, - "y": 10 - }, - "id": 74, - "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" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false, - "ymax": null, - "ymin": null - }, - "tableColumn": "", - "targets": [ - { - "expr": "kube_statefulset_status_replicas_ready{namespace=\"osm\", statefulset=\"mongodb-k8s\"}", - "format": "time_series", - "refId": "A" - } - ], - "thresholds": "0,1", - "timeFrom": null, - "timeShift": null, - "title": "mongo", - "type": "singlestat", - "valueFontSize": "100%", - "valueMaps": [ - { - "op": "=", - "text": "0", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "#d44a3a", - "rgba(237, 129, 40, 0.89)", - "#299c46" - ], - "datasource": "prometheus - Juju generated source", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "format": "none", - "gauge": { - "maxValue": 1, - "minValue": 0, - "show": true, - "thresholdLabels": false, - "thresholdMarkers": false - }, - "gridPos": { - "h": 4, - "w": 3, - "x": 8, - "y": 10 - }, - "id": 72, - "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" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false, - "ymax": null, - "ymin": null - }, - "tableColumn": "", - "targets": [ - { - "expr": "kube_statefulset_status_replicas_ready{namespace=\"osm\", statefulset=\"mariadb-k8s\"}", - "format": "time_series", - "interval": "", - "legendFormat": "", - "refId": "A" - } - ], - "thresholds": "0,1", - "timeFrom": null, - "timeShift": null, - "title": "mysql ", - "type": "singlestat", - "valueFontSize": "100%", - "valueMaps": [ - { - "op": "=", - "text": "0", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "#d44a3a", - "rgba(237, 129, 40, 0.89)", - "#299c46" - ], - "datasource": "prometheus - Juju generated source", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "format": "none", - "gauge": { - "maxValue": 1, - "minValue": 0, - "show": true, - "thresholdLabels": false, - "thresholdMarkers": false - }, - "gridPos": { - "h": 4, - "w": 3, - "x": 12, - "y": 10 - }, - "id": 77, - "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.3.5", - "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": [ - { - "expr": "kube_statefulset_status_replicas_ready{namespace=\"osm\", statefulset=\"ro-k8s\"}", - "format": "time_series", - "instant": true, - "interval": "", - "legendFormat": "", - "refId": "A" - } - ], - "thresholds": "0,1", - "timeFrom": null, - "timeShift": null, - "title": "ro", - "type": "singlestat", - "valueFontSize": "100%", - "valueMaps": [ - { - "op": "=", - "text": "0", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "#d44a3a", - "rgba(237, 129, 40, 0.89)", - "#299c46" - ], - "datasource": "prometheus - Juju generated source", - "decimals": null, - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "format": "none", - "gauge": { - "maxValue": 1, - "minValue": 0, - "show": true, - "thresholdLabels": false, - "thresholdMarkers": false - }, - "gridPos": { - "h": 4, - "w": 3, - "x": 16, - "y": 10 - }, - "id": 73, - "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" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false, - "ymax": null, - "ymin": null - }, - "tableColumn": "", - "targets": [ - { - "expr": "kube_statefulset_status_replicas_ready{namespace=\"osm\", statefulset=\"zookeeper-k8s\"}", - "format": "time_series", - "interval": "", - "legendFormat": "", - "refId": "A" - } - ], - "thresholds": "0,1", - "timeFrom": null, - "timeShift": null, - "title": "zookeeper", - "type": "singlestat", - "valueFontSize": "100%", - "valueMaps": [ - { - "op": "=", - "text": "0", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "#d44a3a", - "rgba(237, 129, 40, 0.89)", - "#299c46" - ], - "datasource": "prometheus - Juju generated source", - "decimals": null, - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "format": "none", - "gauge": { - "maxValue": 1, - "minValue": 0, - "show": true, - "thresholdLabels": false, - "thresholdMarkers": false - }, - "gridPos": { - "h": 4, - "w": 3, - "x": 20, - "y": 10 - }, - "id": 78, - "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" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false, - "ymax": null, - "ymin": null - }, - "tableColumn": "", - "targets": [ - { - "expr": "kube_statefulset_status_replicas_ready{namespace=\"osm\", statefulset=\"kafka-k8s\"}", - "format": "time_series", - "interval": "", - "legendFormat": "", - "refId": "A" - } - ], - "thresholds": "0,1", - "timeFrom": null, - "timeShift": null, - "title": "kafka", - "type": "singlestat", - "valueFontSize": "100%", - "valueMaps": [ - { - "op": "=", - "text": "0", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "#d44a3a", - "rgba(237, 129, 40, 0.89)", - "#299c46" - ], - "datasource": "prometheus - Juju generated source", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "format": "none", - "gauge": { - "maxValue": 1, - "minValue": 0, - "show": true, - "thresholdLabels": false, - "thresholdMarkers": false - }, - "gridPos": { - "h": 4, - "w": 3, - "x": 0, - "y": 14 - }, - "id": 76, - "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.3.5", - "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": [ - { - "expr": "kube_statefulset_status_replicas_ready{namespace=\"osm\", statefulset=\"lcm-k8s\"}", - "format": "time_series", - "instant": true, - "interval": "", - "legendFormat": "", - "refId": "A" - } - ], - "thresholds": "0,1", - "timeFrom": null, - "timeShift": null, - "title": "lcm", - "type": "singlestat", - "valueFontSize": "100%", - "valueMaps": [ - { - "op": "=", - "text": "0", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "#d44a3a", - "rgba(237, 129, 40, 0.89)", - "#299c46" - ], - "datasource": "prometheus - Juju generated source", - "description": "", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "format": "none", - "gauge": { - "maxValue": 1, - "minValue": 0, - "show": true, - "thresholdLabels": false, - "thresholdMarkers": false - }, - "gridPos": { - "h": 4, - "w": 3, - "x": 8, - "y": 14 - }, - "id": 75, - "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.3.5", - "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": [ - { - "expr": "kube_statefulset_status_replicas_ready{namespace=\"osm\", statefulset=\"nbi-k8s\"}", - "format": "time_series", - "instant": true, - "interval": "", - "legendFormat": "", - "refId": "A" - } - ], - "thresholds": "0,1", - "timeFrom": null, - "timeShift": null, - "title": "nbi", - "type": "singlestat", - "valueFontSize": "100%", - "valueMaps": [ - { - "op": "=", - "text": "0", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "#d44a3a", - "rgba(237, 129, 40, 0.89)", - "#299c46" - ], - "datasource": "prometheus - Juju generated source", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "format": "none", - "gauge": { - "maxValue": 1, - "minValue": 0, - "show": true, - "thresholdLabels": false, - "thresholdMarkers": false - }, - "gridPos": { - "h": 4, - "w": 3, - "x": 12, - "y": 14 - }, - "id": 67, - "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.3.5", - "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": [ - { - "expr": "kube_statefulset_status_replicas_ready{namespace=\"osm\", statefulset=\"pol-k8s\"}", - "format": "time_series", - "instant": true, - "interval": "", - "legendFormat": "", - "refId": "A" - } - ], - "thresholds": "0,1", - "timeFrom": null, - "timeShift": null, - "title": "pol", - "type": "singlestat", - "valueFontSize": "100%", - "valueMaps": [ - { - "op": "=", - "text": "0", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "#d44a3a", - "rgba(237, 129, 40, 0.89)", - "#299c46" - ], - "datasource": "prometheus - Juju generated source", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "format": "none", - "gauge": { - "maxValue": 1, - "minValue": 0, - "show": true, - "thresholdLabels": false, - "thresholdMarkers": false - }, - "gridPos": { - "h": 4, - "w": 3, - "x": 16, - "y": 14 - }, - "id": 69, - "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.3.5", - "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": [ - { - "expr": "kube_statefulset_status_replicas_ready{namespace=\"osm\", statefulset=\"mon-k8s\"}", - "instant": true, - "interval": "", - "legendFormat": "", - "refId": "A" - } - ], - "thresholds": "0,1", - "timeFrom": null, - "timeShift": null, - "title": "mon", - "type": "singlestat", - "valueFontSize": "100%", - "valueMaps": [ - { - "op": "=", - "text": "0", - "value": "null" - } - ], - "valueName": "avg" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "#d44a3a", - "rgba(237, 129, 40, 0.89)", - "#299c46" - ], - "datasource": "prometheus - Juju generated source", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "format": "none", - "gauge": { - "maxValue": 1, - "minValue": 0, - "show": true, - "thresholdLabels": false, - "thresholdMarkers": false - }, - "gridPos": { - "h": 4, - "w": 3, - "x": 20, - "y": 14 - }, - "id": 81, - "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.3.5", - "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": [ - { - "expr": "kube_deployment_status_replicas_available{deployment=\"keystone\"}", - "format": "time_series", - "instant": true, - "legendFormat": "", - "refId": "A" - } - ], - "thresholds": "0,1", - "timeFrom": null, - "timeShift": null, - "title": "keystone", - "type": "singlestat", - "valueFontSize": "100%", - "valueMaps": [ - { - "op": "=", - "text": "0", - "value": "null" - } - ], - "valueName": "current" - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "prometheus - Juju generated source", - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 6, - "fillGradient": 0, - "gridPos": { - "h": 9, - "w": 23, - "x": 0, - "y": 18 - }, - "hiddenSeries": false, - "id": 84, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "7.4.3", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum(rate(container_cpu_usage_seconds_total{namespace=\"osm\", pod!~\".*operator.*\"}[$__rate_interval])) by (pod)", - "instant": false, - "interval": "", - "intervalFactor": 4, - "legendFormat": "{{pod}}", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Pod CPU Usage", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "$$hashKey": "object:3755", - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "$$hashKey": "object:3756", - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "prometheus - Juju generated source", - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 6, - "fillGradient": 0, - "gridPos": { - "h": 9, - "w": 23, - "x": 0, - "y": 27 - }, - "hiddenSeries": false, - "id": 85, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "7.4.3", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum(rate(container_memory_working_set_bytes{namespace=\"osm\", pod!~\".*operator.*\"}[$__rate_interval])) by (pod)", - "interval": "", - "intervalFactor": 4, - "legendFormat": "{{pod}}", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Pod Memory Usage", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "$$hashKey": "object:3786", - "format": "decbytes", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "$$hashKey": "object:3787", - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "cacheTimeout": null, - "datasource": null, - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 3, - "x": 21, - "y": 36 - }, - "id": 82, - "links": [], - "options": { - "content": "\n\n\n", - "mode": "markdown" - }, - "pluginVersion": "7.4.3", - "targets": [ - { - "expr": "", - "instant": true, - "refId": "A" - } - ], - "timeFrom": null, - "timeShift": null, - "title": "", - "transparent": true, - "type": "text" - }, - { - "cacheTimeout": null, - "datasource": null, - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 3, - "x": 19, - "y": 40 - }, - "id": 80, - "links": [], - "options": { - "content": "

\n\n\n", - "mode": "html" - }, - "pluginVersion": "7.4.3", - "targets": [ - { - "expr": "", - "instant": true, - "refId": "A" - } - ], - "timeFrom": null, - "timeShift": null, - "title": "", - "transparent": true, - "type": "text" - } - ], - "refresh": "30s", - "schemaVersion": 27, - "style": "dark", - "tags": [], - "templating": { - "list": [ - { - "current": { - "selected": false, - "text": "No data sources found", - "value": "" - }, - "description": null, - "error": null, - "hide": 2, - "includeAll": false, - "label": "", - "multi": false, - "name": "datasource", - "options": [], - "query": "prometheus", - "refresh": 1, - "regex": "/$ds/", - "skipUrlSync": false, - "type": "datasource" - } - ] - }, - "time": { - "from": "now-15m", - "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": "OSM Status Summary", - "uid": "4XuPd2Ii1", - "version": 12 -} \ No newline at end of file diff --git a/installers/charm/grafana/tests/__init__.py b/installers/charm/grafana/tests/__init__.py deleted file mode 100644 index 446d5cee..00000000 --- a/installers/charm/grafana/tests/__init__.py +++ /dev/null @@ -1,40 +0,0 @@ -#!/usr/bin/env python3 -# Copyright 2020 Canonical Ltd. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# 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. -# -# For those usages not covered by the Apache License, Version 2.0 please -# contact: legal@canonical.com -# -# To get in touch with the maintainers, please contact: -# osm-charmers@lists.launchpad.net -## - -"""Init mocking for unit tests.""" - -import sys - - -import mock - - -class OCIImageResourceErrorMock(Exception): - pass - - -sys.path.append("src") - -oci_image = mock.MagicMock() -oci_image.OCIImageResourceError = OCIImageResourceErrorMock -sys.modules["oci_image"] = oci_image -sys.modules["oci_image"].OCIImageResource().fetch.return_value = {} diff --git a/installers/charm/grafana/tests/test_charm.py b/installers/charm/grafana/tests/test_charm.py deleted file mode 100644 index 3bfd69c7..00000000 --- a/installers/charm/grafana/tests/test_charm.py +++ /dev/null @@ -1,703 +0,0 @@ -#!/usr/bin/env python3 -# Copyright 2020 Canonical Ltd. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# 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. -# -# For those usages not covered by the Apache License, Version 2.0 please -# contact: legal@canonical.com -# -# To get in touch with the maintainers, please contact: -# osm-charmers@lists.launchpad.net -## - -import sys -from typing import NoReturn -import unittest -from unittest.mock import patch - -from charm import GrafanaCharm -from ops.model import ActiveStatus, BlockedStatus -from ops.testing import Harness - - -class TestCharm(unittest.TestCase): - """Prometheus Charm unit tests.""" - - def setUp(self) -> NoReturn: - """Test setup""" - self.image_info = sys.modules["oci_image"].OCIImageResource().fetch() - self.harness = Harness(GrafanaCharm) - self.harness.set_leader(is_leader=True) - self.harness.begin() - self.config = { - "max_file_size": 0, - "ingress_whitelist_source_range": "", - "tls_secret_name": "", - "site_url": "https://grafana.192.168.100.100.nip.io", - "cluster_issuer": "vault-issuer", - "osm_dashboards": True, - } - self.harness.update_config(self.config) - - def test_config_changed( - self, - ) -> NoReturn: - """Test ingress resources without HTTP.""" - - self.harness.charm.on.config_changed.emit() - - # Assertions - self.assertIsInstance(self.harness.charm.unit.status, BlockedStatus) - self.assertTrue("prometheus" in self.harness.charm.unit.status.message) - - def test_config_changed_non_leader( - self, - ) -> NoReturn: - """Test ingress resources without HTTP.""" - self.harness.set_leader(is_leader=False) - self.harness.charm.on.config_changed.emit() - - # Assertions - self.assertIsInstance(self.harness.charm.unit.status, ActiveStatus) - - @patch("opslib.osm.interfaces.grafana.GrafanaCluster.set_initial_password") - def test_with_db_relation_and_prometheus(self, _) -> NoReturn: - self.initialize_prometheus_relation() - self.initialize_mysql_relation() - self.assertIsInstance(self.harness.charm.unit.status, ActiveStatus) - - @patch("opslib.osm.interfaces.grafana.GrafanaCluster.set_initial_password") - def test_with_db_config_and_prometheus(self, _) -> NoReturn: - self.initialize_prometheus_relation() - self.initialize_mysql_config() - self.assertIsInstance(self.harness.charm.unit.status, ActiveStatus) - - def test_with_prometheus( - self, - ) -> NoReturn: - """Test to see if prometheus relation is updated.""" - self.initialize_prometheus_relation() - # Verifying status - self.assertIsInstance(self.harness.charm.unit.status, BlockedStatus) - - def test_with_db_config(self) -> NoReturn: - "Test with mysql config" - self.initialize_mysql_config() - # Verifying status - self.assertIsInstance(self.harness.charm.unit.status, BlockedStatus) - - @patch("opslib.osm.interfaces.grafana.GrafanaCluster.set_initial_password") - def test_with_db_relations(self, _) -> NoReturn: - "Test with relations" - self.initialize_mysql_relation() - # Verifying status - self.assertIsInstance(self.harness.charm.unit.status, BlockedStatus) - - def test_exception_db_relation_and_config( - self, - ) -> NoReturn: - "Test with relations and config. Must throw exception" - self.initialize_mysql_config() - self.initialize_mysql_relation() - # Verifying status - self.assertIsInstance(self.harness.charm.unit.status, BlockedStatus) - - def initialize_prometheus_relation(self): - relation_id = self.harness.add_relation("prometheus", "prometheus") - self.harness.add_relation_unit(relation_id, "prometheus/0") - self.harness.update_relation_data( - relation_id, - "prometheus", - {"hostname": "prometheus", "port": 9090}, - ) - - def initialize_mysql_config(self): - self.harness.update_config( - {"mysql_uri": "mysql://grafana:$grafanapw$@host:3606/db"} - ) - - def initialize_mysql_relation(self): - relation_id = self.harness.add_relation("db", "mysql") - self.harness.add_relation_unit(relation_id, "mysql/0") - self.harness.update_relation_data( - relation_id, - "mysql/0", - { - "host": "mysql", - "port": 3306, - "user": "mano", - "password": "manopw", - "root_password": "rootmanopw", - }, - ) - - -if __name__ == "__main__": - unittest.main() - -# class TestCharm(unittest.TestCase): -# """Grafana Charm unit tests.""" - -# def setUp(self) -> NoReturn: -# """Test setup""" -# self.harness = Harness(GrafanaCharm) -# self.harness.set_leader(is_leader=True) -# self.harness.begin() - -# def test_on_start_without_relations(self) -> NoReturn: -# """Test installation without any relation.""" -# self.harness.charm.on.start.emit() - -# # Verifying status -# self.assertIsInstance(self.harness.charm.unit.status, BlockedStatus) - -# # Verifying status message -# self.assertGreater(len(self.harness.charm.unit.status.message), 0) -# self.assertTrue( -# self.harness.charm.unit.status.message.startswith("Waiting for ") -# ) -# self.assertIn("prometheus", self.harness.charm.unit.status.message) -# self.assertTrue(self.harness.charm.unit.status.message.endswith(" relation")) - -# def test_on_start_with_relations_without_http(self) -> NoReturn: -# """Test deployment.""" -# expected_result = { -# "version": 3, -# "containers": [ -# { -# "name": "grafana", -# "imageDetails": self.harness.charm.image.fetch(), -# "imagePullPolicy": "Always", -# "ports": [ -# { -# "name": "grafana", -# "containerPort": 3000, -# "protocol": "TCP", -# } -# ], -# "envConfig": {}, -# "volumeConfig": [ -# { -# "name": "dashboards", -# "mountPath": "/etc/grafana/provisioning/dashboards/", -# "files": [ -# { -# "path": "dashboard-osm.yml", -# "content": ( -# "apiVersion: 1\n" -# "providers:\n" -# " - name: 'osm'\n" -# " orgId: 1\n" -# " folder: ''\n" -# " type: file\n" -# " options:\n" -# " path: /etc/grafana/provisioning/dashboards/\n" -# ), -# }, -# ], -# }, -# { -# "name": "datasources", -# "mountPath": "/etc/grafana/provisioning/datasources/", -# "files": [ -# { -# "path": "datasource-prometheus.yml", -# "content": ( -# "datasources:\n" -# " - access: proxy\n" -# " editable: true\n" -# " is_default: true\n" -# " name: osm_prometheus\n" -# " orgId: 1\n" -# " type: prometheus\n" -# " version: 1\n" -# " url: http://prometheus:9090\n" -# ), -# }, -# ], -# }, -# ], -# "kubernetes": { -# "readinessProbe": { -# "httpGet": { -# "path": "/api/health", -# "port": 3000, -# }, -# "initialDelaySeconds": 10, -# "periodSeconds": 10, -# "timeoutSeconds": 5, -# "successThreshold": 1, -# "failureThreshold": 3, -# }, -# "livenessProbe": { -# "httpGet": { -# "path": "/api/health", -# "port": 3000, -# }, -# "initialDelaySeconds": 60, -# "timeoutSeconds": 30, -# "failureThreshold": 10, -# }, -# }, -# }, -# ], -# "kubernetesResources": {"ingressResources": []}, -# } - -# self.harness.charm.on.start.emit() - -# # Initializing the prometheus relation -# relation_id = self.harness.add_relation("prometheus", "prometheus") -# self.harness.add_relation_unit(relation_id, "prometheus/0") -# self.harness.update_relation_data( -# relation_id, -# "prometheus", -# { -# "hostname": "prometheus", -# "port": "9090", -# }, -# ) - -# # Verifying status -# self.assertNotIsInstance(self.harness.charm.unit.status, BlockedStatus) - -# pod_spec, _ = self.harness.get_pod_spec() - -# self.assertDictEqual(expected_result, pod_spec) - -# def test_ingress_resources_with_http(self) -> NoReturn: -# """Test ingress resources with HTTP.""" -# expected_result = { -# "version": 3, -# "containers": [ -# { -# "name": "grafana", -# "imageDetails": self.harness.charm.image.fetch(), -# "imagePullPolicy": "Always", -# "ports": [ -# { -# "name": "grafana", -# "containerPort": 3000, -# "protocol": "TCP", -# } -# ], -# "envConfig": {}, -# "volumeConfig": [ -# { -# "name": "dashboards", -# "mountPath": "/etc/grafana/provisioning/dashboards/", -# "files": [ -# { -# "path": "dashboard-osm.yml", -# "content": ( -# "apiVersion: 1\n" -# "providers:\n" -# " - name: 'osm'\n" -# " orgId: 1\n" -# " folder: ''\n" -# " type: file\n" -# " options:\n" -# " path: /etc/grafana/provisioning/dashboards/\n" -# ), -# }, -# ], -# }, -# { -# "name": "datasources", -# "mountPath": "/etc/grafana/provisioning/datasources/", -# "files": [ -# { -# "path": "datasource-prometheus.yml", -# "content": ( -# "datasources:\n" -# " - access: proxy\n" -# " editable: true\n" -# " is_default: true\n" -# " name: osm_prometheus\n" -# " orgId: 1\n" -# " type: prometheus\n" -# " version: 1\n" -# " url: http://prometheus:9090\n" -# ), -# }, -# ], -# }, -# ], -# "kubernetes": { -# "readinessProbe": { -# "httpGet": { -# "path": "/api/health", -# "port": 3000, -# }, -# "initialDelaySeconds": 10, -# "periodSeconds": 10, -# "timeoutSeconds": 5, -# "successThreshold": 1, -# "failureThreshold": 3, -# }, -# "livenessProbe": { -# "httpGet": { -# "path": "/api/health", -# "port": 3000, -# }, -# "initialDelaySeconds": 60, -# "timeoutSeconds": 30, -# "failureThreshold": 10, -# }, -# }, -# }, -# ], -# "kubernetesResources": { -# "ingressResources": [ -# { -# "name": "grafana-ingress", -# "annotations": { -# "nginx.ingress.kubernetes.io/proxy-body-size": "0", -# "nginx.ingress.kubernetes.io/ssl-redirect": "false", -# }, -# "spec": { -# "rules": [ -# { -# "host": "grafana", -# "http": { -# "paths": [ -# { -# "path": "/", -# "backend": { -# "serviceName": "grafana", -# "servicePort": 3000, -# }, -# } -# ] -# }, -# } -# ] -# }, -# } -# ], -# }, -# } - -# self.harness.charm.on.start.emit() - -# # Initializing the prometheus relation -# relation_id = self.harness.add_relation("prometheus", "prometheus") -# self.harness.add_relation_unit(relation_id, "prometheus/0") -# self.harness.update_relation_data( -# relation_id, -# "prometheus", -# { -# "hostname": "prometheus", -# "port": "9090", -# }, -# ) - -# self.harness.update_config({"site_url": "http://grafana"}) - -# pod_spec, _ = self.harness.get_pod_spec() - -# self.assertDictEqual(expected_result, pod_spec) - -# def test_ingress_resources_with_https(self) -> NoReturn: -# """Test ingress resources with HTTPS.""" -# expected_result = { -# "version": 3, -# "containers": [ -# { -# "name": "grafana", -# "imageDetails": self.harness.charm.image.fetch(), -# "imagePullPolicy": "Always", -# "ports": [ -# { -# "name": "grafana", -# "containerPort": 3000, -# "protocol": "TCP", -# } -# ], -# "envConfig": {}, -# "volumeConfig": [ -# { -# "name": "dashboards", -# "mountPath": "/etc/grafana/provisioning/dashboards/", -# "files": [ -# { -# "path": "dashboard-osm.yml", -# "content": ( -# "apiVersion: 1\n" -# "providers:\n" -# " - name: 'osm'\n" -# " orgId: 1\n" -# " folder: ''\n" -# " type: file\n" -# " options:\n" -# " path: /etc/grafana/provisioning/dashboards/\n" -# ), -# }, -# ], -# }, -# { -# "name": "datasources", -# "mountPath": "/etc/grafana/provisioning/datasources/", -# "files": [ -# { -# "path": "datasource-prometheus.yml", -# "content": ( -# "datasources:\n" -# " - access: proxy\n" -# " editable: true\n" -# " is_default: true\n" -# " name: osm_prometheus\n" -# " orgId: 1\n" -# " type: prometheus\n" -# " version: 1\n" -# " url: http://prometheus:9090\n" -# ), -# }, -# ], -# }, -# ], -# "kubernetes": { -# "readinessProbe": { -# "httpGet": { -# "path": "/api/health", -# "port": 3000, -# }, -# "initialDelaySeconds": 10, -# "periodSeconds": 10, -# "timeoutSeconds": 5, -# "successThreshold": 1, -# "failureThreshold": 3, -# }, -# "livenessProbe": { -# "httpGet": { -# "path": "/api/health", -# "port": 3000, -# }, -# "initialDelaySeconds": 60, -# "timeoutSeconds": 30, -# "failureThreshold": 10, -# }, -# }, -# }, -# ], -# "kubernetesResources": { -# "ingressResources": [ -# { -# "name": "grafana-ingress", -# "annotations": { -# "nginx.ingress.kubernetes.io/proxy-body-size": "0", -# }, -# "spec": { -# "rules": [ -# { -# "host": "grafana", -# "http": { -# "paths": [ -# { -# "path": "/", -# "backend": { -# "serviceName": "grafana", -# "servicePort": 3000, -# }, -# } -# ] -# }, -# } -# ], -# "tls": [{"hosts": ["grafana"], "secretName": "grafana"}], -# }, -# } -# ], -# }, -# } - -# self.harness.charm.on.start.emit() - -# # Initializing the prometheus relation -# relation_id = self.harness.add_relation("prometheus", "prometheus") -# self.harness.add_relation_unit(relation_id, "prometheus/0") -# self.harness.update_relation_data( -# relation_id, -# "prometheus", -# { -# "hostname": "prometheus", -# "port": "9090", -# }, -# ) - -# self.harness.update_config( -# {"site_url": "https://grafana", "tls_secret_name": "grafana"} -# ) - -# pod_spec, _ = self.harness.get_pod_spec() - -# self.assertDictEqual(expected_result, pod_spec) - -# def test_ingress_resources_with_https_and_ingress_whitelist(self) -> NoReturn: -# """Test ingress resources with HTTPS and ingress whitelist.""" -# expected_result = { -# "version": 3, -# "containers": [ -# { -# "name": "grafana", -# "imageDetails": self.harness.charm.image.fetch(), -# "imagePullPolicy": "Always", -# "ports": [ -# { -# "name": "grafana", -# "containerPort": 3000, -# "protocol": "TCP", -# } -# ], -# "envConfig": {}, -# "volumeConfig": [ -# { -# "name": "dashboards", -# "mountPath": "/etc/grafana/provisioning/dashboards/", -# "files": [ -# { -# "path": "dashboard-osm.yml", -# "content": ( -# "apiVersion: 1\n" -# "providers:\n" -# " - name: 'osm'\n" -# " orgId: 1\n" -# " folder: ''\n" -# " type: file\n" -# " options:\n" -# " path: /etc/grafana/provisioning/dashboards/\n" -# ), -# }, -# ], -# }, -# { -# "name": "datasources", -# "mountPath": "/etc/grafana/provisioning/datasources/", -# "files": [ -# { -# "path": "datasource-prometheus.yml", -# "content": ( -# "datasources:\n" -# " - access: proxy\n" -# " editable: true\n" -# " is_default: true\n" -# " name: osm_prometheus\n" -# " orgId: 1\n" -# " type: prometheus\n" -# " version: 1\n" -# " url: http://prometheus:9090\n" -# ), -# }, -# ], -# }, -# ], -# "kubernetes": { -# "readinessProbe": { -# "httpGet": { -# "path": "/api/health", -# "port": 3000, -# }, -# "initialDelaySeconds": 10, -# "periodSeconds": 10, -# "timeoutSeconds": 5, -# "successThreshold": 1, -# "failureThreshold": 3, -# }, -# "livenessProbe": { -# "httpGet": { -# "path": "/api/health", -# "port": 3000, -# }, -# "initialDelaySeconds": 60, -# "timeoutSeconds": 30, -# "failureThreshold": 10, -# }, -# }, -# }, -# ], -# "kubernetesResources": { -# "ingressResources": [ -# { -# "name": "grafana-ingress", -# "annotations": { -# "nginx.ingress.kubernetes.io/proxy-body-size": "0", -# "nginx.ingress.kubernetes.io/whitelist-source-range": "0.0.0.0/0", -# }, -# "spec": { -# "rules": [ -# { -# "host": "grafana", -# "http": { -# "paths": [ -# { -# "path": "/", -# "backend": { -# "serviceName": "grafana", -# "servicePort": 3000, -# }, -# } -# ] -# }, -# } -# ], -# "tls": [{"hosts": ["grafana"], "secretName": "grafana"}], -# }, -# } -# ], -# }, -# } - -# self.harness.charm.on.start.emit() - -# # Initializing the prometheus relation -# relation_id = self.harness.add_relation("prometheus", "prometheus") -# self.harness.add_relation_unit(relation_id, "prometheus/0") -# self.harness.update_relation_data( -# relation_id, -# "prometheus", -# { -# "hostname": "prometheus", -# "port": "9090", -# }, -# ) - -# self.harness.update_config( -# { -# "site_url": "https://grafana", -# "tls_secret_name": "grafana", -# "ingress_whitelist_source_range": "0.0.0.0/0", -# } -# ) - -# pod_spec, _ = self.harness.get_pod_spec() - -# self.assertDictEqual(expected_result, pod_spec) - -# def test_on_prometheus_unit_relation_changed(self) -> NoReturn: -# """Test to see if prometheus relation is updated.""" -# self.harness.charm.on.start.emit() - -# relation_id = self.harness.add_relation("prometheus", "prometheus") -# self.harness.add_relation_unit(relation_id, "prometheus/0") -# self.harness.update_relation_data( -# relation_id, -# "prometheus", -# {"hostname": "prometheus", "port": 9090}, -# ) - -# # Verifying status -# self.assertNotIsInstance(self.harness.charm.unit.status, BlockedStatus) - - -if __name__ == "__main__": - unittest.main() diff --git a/installers/charm/grafana/tests/test_pod_spec.py b/installers/charm/grafana/tests/test_pod_spec.py deleted file mode 100644 index 88c85d3e..00000000 --- a/installers/charm/grafana/tests/test_pod_spec.py +++ /dev/null @@ -1,636 +0,0 @@ -# #!/usr/bin/env python3 -# # Copyright 2021 Canonical Ltd. -# # -# # Licensed under the Apache License, Version 2.0 (the "License"); you may -# # not use this file except in compliance with the License. You may obtain -# # a copy of the License at -# # -# # http://www.apache.org/licenses/LICENSE-2.0 -# # -# # 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. -# # -# # For those usages not covered by the Apache License, Version 2.0 please -# # contact: legal@canonical.com -# # -# # To get in touch with the maintainers, please contact: -# # osm-charmers@lists.launchpad.net -# ## - -# from typing import NoReturn -# import unittest - -# import pod_spec - - -# class TestPodSpec(unittest.TestCase): -# """Pod spec unit tests.""" - -# def test_make_pod_ports(self) -> NoReturn: -# """Testing make pod ports.""" -# port = 3000 - -# expected_result = [ -# { -# "name": "grafana", -# "containerPort": port, -# "protocol": "TCP", -# } -# ] - -# pod_ports = pod_spec._make_pod_ports(port) - -# self.assertListEqual(expected_result, pod_ports) - -# def test_make_pod_envconfig(self) -> NoReturn: -# """Teting make pod envconfig.""" -# config = {} -# relation_state = { -# "prometheus_hostname": "prometheus", -# "prometheus_port": "9090", -# } - -# expected_result = {} - -# pod_envconfig = pod_spec._make_pod_envconfig(config, relation_state) - -# self.assertDictEqual(expected_result, pod_envconfig) - -# def test_make_pod_ingress_resources_without_site_url(self) -> NoReturn: -# """Testing make pod ingress resources without site_url.""" -# config = {"site_url": ""} -# app_name = "grafana" -# port = 3000 - -# pod_ingress_resources = pod_spec._make_pod_ingress_resources( -# config, app_name, port -# ) - -# self.assertIsNone(pod_ingress_resources) - -# def test_make_pod_ingress_resources(self) -> NoReturn: -# """Testing make pod ingress resources.""" -# config = { -# "site_url": "http://grafana", -# "max_file_size": 0, -# "ingress_whitelist_source_range": "", -# } -# app_name = "grafana" -# port = 3000 - -# expected_result = [ -# { -# "name": f"{app_name}-ingress", -# "annotations": { -# "nginx.ingress.kubernetes.io/proxy-body-size": f"{config['max_file_size']}", -# "nginx.ingress.kubernetes.io/ssl-redirect": "false", -# }, -# "spec": { -# "rules": [ -# { -# "host": app_name, -# "http": { -# "paths": [ -# { -# "path": "/", -# "backend": { -# "serviceName": app_name, -# "servicePort": port, -# }, -# } -# ] -# }, -# } -# ] -# }, -# } -# ] - -# pod_ingress_resources = pod_spec._make_pod_ingress_resources( -# config, app_name, port -# ) - -# self.assertListEqual(expected_result, pod_ingress_resources) - -# def test_make_pod_ingress_resources_with_whitelist_source_range(self) -> NoReturn: -# """Testing make pod ingress resources with whitelist_source_range.""" -# config = { -# "site_url": "http://grafana", -# "max_file_size": 0, -# "ingress_whitelist_source_range": "0.0.0.0/0", -# } -# app_name = "grafana" -# port = 3000 - -# expected_result = [ -# { -# "name": f"{app_name}-ingress", -# "annotations": { -# "nginx.ingress.kubernetes.io/proxy-body-size": f"{config['max_file_size']}", -# "nginx.ingress.kubernetes.io/ssl-redirect": "false", -# "nginx.ingress.kubernetes.io/whitelist-source-range": config[ -# "ingress_whitelist_source_range" -# ], -# }, -# "spec": { -# "rules": [ -# { -# "host": app_name, -# "http": { -# "paths": [ -# { -# "path": "/", -# "backend": { -# "serviceName": app_name, -# "servicePort": port, -# }, -# } -# ] -# }, -# } -# ] -# }, -# } -# ] - -# pod_ingress_resources = pod_spec._make_pod_ingress_resources( -# config, app_name, port -# ) - -# self.assertListEqual(expected_result, pod_ingress_resources) - -# def test_make_pod_ingress_resources_with_https(self) -> NoReturn: -# """Testing make pod ingress resources with HTTPs.""" -# config = { -# "site_url": "https://grafana", -# "max_file_size": 0, -# "ingress_whitelist_source_range": "", -# "tls_secret_name": "", -# } -# app_name = "grafana" -# port = 3000 - -# expected_result = [ -# { -# "name": f"{app_name}-ingress", -# "annotations": { -# "nginx.ingress.kubernetes.io/proxy-body-size": f"{config['max_file_size']}", -# }, -# "spec": { -# "rules": [ -# { -# "host": app_name, -# "http": { -# "paths": [ -# { -# "path": "/", -# "backend": { -# "serviceName": app_name, -# "servicePort": port, -# }, -# } -# ] -# }, -# } -# ], -# "tls": [{"hosts": [app_name]}], -# }, -# } -# ] - -# pod_ingress_resources = pod_spec._make_pod_ingress_resources( -# config, app_name, port -# ) - -# self.assertListEqual(expected_result, pod_ingress_resources) - -# def test_make_pod_ingress_resources_with_https_tls_secret_name(self) -> NoReturn: -# """Testing make pod ingress resources with HTTPs and TLS secret name.""" -# config = { -# "site_url": "https://grafana", -# "max_file_size": 0, -# "ingress_whitelist_source_range": "", -# "tls_secret_name": "secret_name", -# } -# app_name = "grafana" -# port = 3000 - -# expected_result = [ -# { -# "name": f"{app_name}-ingress", -# "annotations": { -# "nginx.ingress.kubernetes.io/proxy-body-size": f"{config['max_file_size']}", -# }, -# "spec": { -# "rules": [ -# { -# "host": app_name, -# "http": { -# "paths": [ -# { -# "path": "/", -# "backend": { -# "serviceName": app_name, -# "servicePort": port, -# }, -# } -# ] -# }, -# } -# ], -# "tls": [ -# {"hosts": [app_name], "secretName": config["tls_secret_name"]} -# ], -# }, -# } -# ] - -# pod_ingress_resources = pod_spec._make_pod_ingress_resources( -# config, app_name, port -# ) - -# self.assertListEqual(expected_result, pod_ingress_resources) - -# def test_make_pod_files(self) -> NoReturn: -# """Testing make pod files.""" -# config = {"osm_dashboards": False} -# relation_state = { -# "prometheus_hostname": "prometheus", -# "prometheus_port": "9090", -# } - -# expected_result = [ -# { -# "name": "dashboards", -# "mountPath": "/etc/grafana/provisioning/dashboards/", -# "files": [ -# { -# "path": "dashboard-osm.yml", -# "content": ( -# "apiVersion: 1\n" -# "providers:\n" -# " - name: 'osm'\n" -# " orgId: 1\n" -# " folder: ''\n" -# " type: file\n" -# " options:\n" -# " path: /etc/grafana/provisioning/dashboards/\n" -# ), -# } -# ], -# }, -# { -# "name": "datasources", -# "mountPath": "/etc/grafana/provisioning/datasources/", -# "files": [ -# { -# "path": "datasource-prometheus.yml", -# "content": ( -# "datasources:\n" -# " - access: proxy\n" -# " editable: true\n" -# " is_default: true\n" -# " name: osm_prometheus\n" -# " orgId: 1\n" -# " type: prometheus\n" -# " version: 1\n" -# " url: http://{}:{}\n".format( -# relation_state.get("prometheus_hostname"), -# relation_state.get("prometheus_port"), -# ) -# ), -# } -# ], -# }, -# ] - -# pod_envconfig = pod_spec._make_pod_files(config, relation_state) -# self.assertListEqual(expected_result, pod_envconfig) - -# def test_make_readiness_probe(self) -> NoReturn: -# """Testing make readiness probe.""" -# port = 3000 - -# expected_result = { -# "httpGet": { -# "path": "/api/health", -# "port": port, -# }, -# "initialDelaySeconds": 10, -# "periodSeconds": 10, -# "timeoutSeconds": 5, -# "successThreshold": 1, -# "failureThreshold": 3, -# } - -# readiness_probe = pod_spec._make_readiness_probe(port) - -# self.assertDictEqual(expected_result, readiness_probe) - -# def test_make_liveness_probe(self) -> NoReturn: -# """Testing make liveness probe.""" -# port = 3000 - -# expected_result = { -# "httpGet": { -# "path": "/api/health", -# "port": port, -# }, -# "initialDelaySeconds": 60, -# "timeoutSeconds": 30, -# "failureThreshold": 10, -# } - -# liveness_probe = pod_spec._make_liveness_probe(port) - -# self.assertDictEqual(expected_result, liveness_probe) - -# def test_make_pod_spec(self) -> NoReturn: -# """Testing make pod spec.""" -# image_info = {"upstream-source": "ubuntu/grafana:latest"} -# config = { -# "site_url": "", -# } -# relation_state = { -# "prometheus_hostname": "prometheus", -# "prometheus_port": "9090", -# } -# app_name = "grafana" -# port = 3000 - -# expected_result = { -# "version": 3, -# "containers": [ -# { -# "name": app_name, -# "imageDetails": image_info, -# "imagePullPolicy": "Always", -# "ports": [ -# { -# "name": app_name, -# "containerPort": port, -# "protocol": "TCP", -# } -# ], -# "envConfig": {}, -# "volumeConfig": [ -# { -# "name": "dashboards", -# "mountPath": "/etc/grafana/provisioning/dashboards/", -# "files": [ -# { -# "path": "dashboard-osm.yml", -# "content": ( -# "apiVersion: 1\n" -# "providers:\n" -# " - name: 'osm'\n" -# " orgId: 1\n" -# " folder: ''\n" -# " type: file\n" -# " options:\n" -# " path: /etc/grafana/provisioning/dashboards/\n" -# ), -# } -# ], -# }, -# { -# "name": "datasources", -# "mountPath": "/etc/grafana/provisioning/datasources/", -# "files": [ -# { -# "path": "datasource-prometheus.yml", -# "content": ( -# "datasources:\n" -# " - access: proxy\n" -# " editable: true\n" -# " is_default: true\n" -# " name: osm_prometheus\n" -# " orgId: 1\n" -# " type: prometheus\n" -# " version: 1\n" -# " url: http://{}:{}\n".format( -# relation_state.get("prometheus_hostname"), -# relation_state.get("prometheus_port"), -# ) -# ), -# } -# ], -# }, -# ], -# "kubernetes": { -# "readinessProbe": { -# "httpGet": { -# "path": "/api/health", -# "port": port, -# }, -# "initialDelaySeconds": 10, -# "periodSeconds": 10, -# "timeoutSeconds": 5, -# "successThreshold": 1, -# "failureThreshold": 3, -# }, -# "livenessProbe": { -# "httpGet": { -# "path": "/api/health", -# "port": port, -# }, -# "initialDelaySeconds": 60, -# "timeoutSeconds": 30, -# "failureThreshold": 10, -# }, -# }, -# } -# ], -# "kubernetesResources": {"ingressResources": []}, -# } - -# spec = pod_spec.make_pod_spec( -# image_info, config, relation_state, app_name, port -# ) - -# self.assertDictEqual(expected_result, spec) - -# def test_make_pod_spec_with_ingress(self) -> NoReturn: -# """Testing make pod spec.""" -# image_info = {"upstream-source": "ubuntu/grafana:latest"} -# config = { -# "site_url": "https://grafana", -# "tls_secret_name": "grafana", -# "max_file_size": 0, -# "ingress_whitelist_source_range": "0.0.0.0/0", -# } -# relation_state = { -# "prometheus_hostname": "prometheus", -# "prometheus_port": "9090", -# } -# app_name = "grafana" -# port = 3000 - -# expected_result = { -# "version": 3, -# "containers": [ -# { -# "name": app_name, -# "imageDetails": image_info, -# "imagePullPolicy": "Always", -# "ports": [ -# { -# "name": app_name, -# "containerPort": port, -# "protocol": "TCP", -# } -# ], -# "envConfig": {}, -# "volumeConfig": [ -# { -# "name": "dashboards", -# "mountPath": "/etc/grafana/provisioning/dashboards/", -# "files": [ -# { -# "path": "dashboard-osm.yml", -# "content": ( -# "apiVersion: 1\n" -# "providers:\n" -# " - name: 'osm'\n" -# " orgId: 1\n" -# " folder: ''\n" -# " type: file\n" -# " options:\n" -# " path: /etc/grafana/provisioning/dashboards/\n" -# ), -# } -# ], -# }, -# { -# "name": "datasources", -# "mountPath": "/etc/grafana/provisioning/datasources/", -# "files": [ -# { -# "path": "datasource-prometheus.yml", -# "content": ( -# "datasources:\n" -# " - access: proxy\n" -# " editable: true\n" -# " is_default: true\n" -# " name: osm_prometheus\n" -# " orgId: 1\n" -# " type: prometheus\n" -# " version: 1\n" -# " url: http://{}:{}\n".format( -# relation_state.get("prometheus_hostname"), -# relation_state.get("prometheus_port"), -# ) -# ), -# } -# ], -# }, -# ], -# "kubernetes": { -# "readinessProbe": { -# "httpGet": { -# "path": "/api/health", -# "port": port, -# }, -# "initialDelaySeconds": 10, -# "periodSeconds": 10, -# "timeoutSeconds": 5, -# "successThreshold": 1, -# "failureThreshold": 3, -# }, -# "livenessProbe": { -# "httpGet": { -# "path": "/api/health", -# "port": port, -# }, -# "initialDelaySeconds": 60, -# "timeoutSeconds": 30, -# "failureThreshold": 10, -# }, -# }, -# } -# ], -# "kubernetesResources": { -# "ingressResources": [ -# { -# "name": "{}-ingress".format(app_name), -# "annotations": { -# "nginx.ingress.kubernetes.io/proxy-body-size": str( -# config.get("max_file_size") -# ), -# "nginx.ingress.kubernetes.io/whitelist-source-range": config.get( -# "ingress_whitelist_source_range" -# ), -# }, -# "spec": { -# "rules": [ -# { -# "host": app_name, -# "http": { -# "paths": [ -# { -# "path": "/", -# "backend": { -# "serviceName": app_name, -# "servicePort": port, -# }, -# } -# ] -# }, -# } -# ], -# "tls": [ -# { -# "hosts": [app_name], -# "secretName": config.get("tls_secret_name"), -# } -# ], -# }, -# } -# ], -# }, -# } - -# spec = pod_spec.make_pod_spec( -# image_info, config, relation_state, app_name, port -# ) - -# self.assertDictEqual(expected_result, spec) - -# def test_make_pod_spec_without_image_info(self) -> NoReturn: -# """Testing make pod spec without image_info.""" -# image_info = None -# config = { -# "site_url": "", -# } -# relation_state = { -# "prometheus_hostname": "prometheus", -# "prometheus_port": "9090", -# } -# app_name = "grafana" -# port = 3000 - -# spec = pod_spec.make_pod_spec( -# image_info, config, relation_state, app_name, port -# ) - -# self.assertIsNone(spec) - -# def test_make_pod_spec_without_relation_state(self) -> NoReturn: -# """Testing make pod spec without relation_state.""" -# image_info = {"upstream-source": "ubuntu/grafana:latest"} -# config = { -# "site_url": "", -# } -# relation_state = {} -# app_name = "grafana" -# port = 3000 - -# with self.assertRaises(ValueError): -# pod_spec.make_pod_spec(image_info, config, relation_state, app_name, port) - - -# if __name__ == "__main__": -# unittest.main() diff --git a/installers/charm/grafana/tox.ini b/installers/charm/grafana/tox.ini deleted file mode 100644 index 58e13a66..00000000 --- a/installers/charm/grafana/tox.ini +++ /dev/null @@ -1,126 +0,0 @@ -# Copyright 2021 Canonical Ltd. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# 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. -# -# For those usages not covered by the Apache License, Version 2.0 please -# contact: legal@canonical.com -# -# To get in touch with the maintainers, please contact: -# osm-charmers@lists.launchpad.net -## -####################################################################################### - -[tox] -envlist = black, cover, flake8, pylint, yamllint, safety -skipsdist = true - -[tox:jenkins] -toxworkdir = /tmp/.tox - -[testenv] -basepython = python3.8 -setenv = VIRTUAL_ENV={envdir} - PYTHONDONTWRITEBYTECODE = 1 -deps = -r{toxinidir}/requirements.txt - - -####################################################################################### -[testenv:black] -deps = black -commands = - black --check --diff src/ tests/ - - -####################################################################################### -[testenv:cover] -deps = {[testenv]deps} - -r{toxinidir}/requirements-test.txt - coverage - nose2 -commands = - sh -c 'rm -f nosetests.xml' - coverage erase - nose2 -C --coverage src - coverage report --omit='*tests*' - coverage html -d ./cover --omit='*tests*' - coverage xml -o coverage.xml --omit=*tests* -whitelist_externals = sh - - -####################################################################################### -[testenv:flake8] -deps = flake8 - flake8-import-order -commands = - flake8 src/ tests/ --exclude=*pod_spec* - - -####################################################################################### -[testenv:pylint] -deps = {[testenv]deps} - -r{toxinidir}/requirements-test.txt - pylint==2.10.2 -commands = - pylint -E src/ tests/ - - -####################################################################################### -[testenv:safety] -setenv = - LC_ALL=C.UTF-8 - LANG=C.UTF-8 -deps = {[testenv]deps} - safety -commands = - - safety check --full-report - - -####################################################################################### -[testenv:yamllint] -deps = {[testenv]deps} - -r{toxinidir}/requirements-test.txt - yamllint -commands = yamllint . - -####################################################################################### -[testenv:build] -passenv=HTTP_PROXY HTTPS_PROXY NO_PROXY -whitelist_externals = - charmcraft - sh -commands = - charmcraft pack - sh -c 'ubuntu_version=20.04; \ - architectures="amd64-aarch64-arm64"; \ - charm_name=`cat metadata.yaml | grep -E "^name: " | cut -f 2 -d " "`; \ - mv $charm_name"_ubuntu-"$ubuntu_version-$architectures.charm $charm_name.charm' - -####################################################################################### -[flake8] -ignore = - W291, - W293, - W503, - E123, - E125, - E226, - E241, -exclude = - .git, - __pycache__, - .tox, -max-line-length = 120 -show-source = True -builtins = _ -max-complexity = 10 -import-order-style = google -- 2.17.1