diff --git a/Makefile b/Makefile index a158bcd53..d89f745b1 100644 --- a/Makefile +++ b/Makefile @@ -23,7 +23,7 @@ help: Makefile ## vendor: Populate vendor directory vendor: - @GO111MODULE=on $(GO) mod vendor + $(GO) mod vendor IMAGE ?= quay.io/3scale/3scale-operator SOURCE_VERSION ?= master @@ -39,6 +39,16 @@ download: @echo Download go.mod dependencies @go mod download +## install-tools: Installing tools from tools.go +install-tools: download + @echo Installing tools from tools.go + @cat tools.go | grep _ | awk -F'"' '{print $$2}' | xargs -tI % go install % + +## assets: Generate embedded assets +assets: install-tools + @echo Generate Go embedded assets files by processing source + $(GO) generate github.com/3scale/3scale-operator/pkg/assets + ## build: Build operator build: $(OPERATOR_SDK) build $(IMAGE):$(VERSION) @@ -111,7 +121,7 @@ endif cd $(PROJECT_PATH)/deploy/olm-catalog && operator-courier verify --ui_validate_io 3scale-operator-master/ ## licenses.xml: Generate licenses.xml file -licenses.xml: +licenses.xml: $(DEPENDENCY_DECISION_FILE) ifndef LICENSEFINDERBINARY $(error "license-finder is not available please install: gem install license_finder --version 5.7.1") endif diff --git a/cmd/manager/main.go b/cmd/manager/main.go index 4ba8b1cca..3104af2e8 100644 --- a/cmd/manager/main.go +++ b/cmd/manager/main.go @@ -14,10 +14,13 @@ import ( "github.com/3scale/3scale-operator/pkg/3scale/amp/product" "github.com/3scale/3scale-operator/pkg/apis" + appsv1alpha1 "github.com/3scale/3scale-operator/pkg/apis/apps/v1alpha1" + "github.com/3scale/3scale-operator/pkg/common" "github.com/3scale/3scale-operator/pkg/controller" "github.com/3scale/3scale-operator/version" - "github.com/prometheus/client_golang/prometheus" + monitoringv1 "github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1" + grafanav1alpha1 "github.com/integr8ly/grafana-operator/v3/pkg/apis/integreatly/v1alpha1" appsv1 "github.com/openshift/api/apps/v1" imagev1 "github.com/openshift/api/image/v1" routev1 "github.com/openshift/api/route/v1" @@ -27,10 +30,12 @@ import ( "github.com/operator-framework/operator-sdk/pkg/log/zap" "github.com/operator-framework/operator-sdk/pkg/metrics" sdkVersion "github.com/operator-framework/operator-sdk/version" + "github.com/prometheus/client_golang/prometheus" "github.com/spf13/pflag" v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/util/intstr" + "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client/config" logf "sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/manager" @@ -127,6 +132,18 @@ func main() { os.Exit(1) } + // Setup Scheme for all monitoring resources + if err := monitoringv1.AddToScheme(mgr.GetScheme()); err != nil { + log.Error(err, "") + os.Exit(1) + } + + // Setup Scheme for all grafana resources + if err := grafanav1alpha1.AddToScheme(mgr.GetScheme()); err != nil { + log.Error(err, "") + os.Exit(1) + } + // Setup Scheme for all resources if err := apis.AddToScheme(mgr.GetScheme()); err != nil { log.Error(err, "") @@ -191,6 +208,12 @@ func addMetrics(ctx context.Context, cfg *rest.Config, namespace string) { log.Info("Could not create metrics Service", "error", err.Error()) } + // Adding the monitoring-key:middleware to the operator service which will get propagated to the serviceMonitor + err = addMonitoringKeyLabelToOperatorService(ctx, cfg, service) + if err != nil { + log.Error(err, "Could not add monitoring-key label to operator metrics Service") + } + // CreateServiceMonitors will automatically create the prometheus-operator ServiceMonitor resources // necessary to configure Prometheus to scrape metrics from this operator. services := []*v1.Service{service} @@ -298,3 +321,30 @@ func filterGKVsFromAddToScheme(gvks []schema.GroupVersionKind) []schema.GroupVer return ownGVKs } + +func addMonitoringKeyLabelToOperatorService(ctx context.Context, cfg *rest.Config, service *v1.Service) error { + if service == nil { + return fmt.Errorf("service doesn't exist") + } + + kclient, err := client.New(cfg, client.Options{}) + if err != nil { + return err + } + + updatedLabels := map[string]string{ + "monitoring-key": common.MonitoringKey, + "app": appsv1alpha1.Default3scaleAppLabel, + } + for k, v := range service.ObjectMeta.Labels { + updatedLabels[k] = v + } + service.ObjectMeta.Labels = updatedLabels + + err = kclient.Update(ctx, service) + if err != nil { + return err + } + + return nil +} diff --git a/deploy/crds/apps.3scale.net_apimanagers_crd.yaml b/deploy/crds/apps.3scale.net_apimanagers_crd.yaml index c579a8b19..35e649c79 100644 --- a/deploy/crds/apps.3scale.net_apimanagers_crd.yaml +++ b/deploy/crds/apps.3scale.net_apimanagers_crd.yaml @@ -4068,6 +4068,11 @@ spec: type: object imageStreamTagImportInsecure: type: boolean + monitoring: + properties: + enabled: + type: boolean + type: object podDisruptionBudget: properties: enabled: diff --git a/deploy/crds/apps.3scale.net_v1alpha1_apimanager_cr_monitoring.yaml b/deploy/crds/apps.3scale.net_v1alpha1_apimanager_cr_monitoring.yaml new file mode 100644 index 000000000..f776a48b9 --- /dev/null +++ b/deploy/crds/apps.3scale.net_v1alpha1_apimanager_cr_monitoring.yaml @@ -0,0 +1,8 @@ +apiVersion: apps.3scale.net/v1alpha1 +kind: APIManager +metadata: + name: example-apimanager-monitoring +spec: + wildcardDomain: example.com + monitoring: + enabled: true diff --git a/deploy/olm-catalog/3scale-operator-master/0.0.0/3scale-operator-master.v0.0.0.clusterserviceversion.yaml b/deploy/olm-catalog/3scale-operator-master/0.0.0/3scale-operator-master.v0.0.0.clusterserviceversion.yaml index d63f59b20..5bae7a058 100644 --- a/deploy/olm-catalog/3scale-operator-master/0.0.0/3scale-operator-master.v0.0.0.clusterserviceversion.yaml +++ b/deploy/olm-catalog/3scale-operator-master/0.0.0/3scale-operator-master.v0.0.0.clusterserviceversion.yaml @@ -62,6 +62,19 @@ metadata: "wildcardDomain": "example.com" } }, + { + "apiVersion": "apps.3scale.net/v1alpha1", + "kind": "APIManager", + "metadata": { + "name": "example-apimanager-monitoring" + }, + "spec": { + "monitoring": { + "enabled": true + }, + "wildcardDomain": "example.com" + } + }, { "apiVersion": "apps.3scale.net/v1alpha1", "kind": "APIManager", @@ -520,13 +533,6 @@ spec: - patch - update - watch - - apiGroups: - - monitoring.coreos.com - resources: - - servicemonitors - verbs: - - get - - create - apiGroups: - apps resourceNames: @@ -662,6 +668,27 @@ spec: - update - watch - delete + - apiGroups: + - monitoring.coreos.com + resources: + - servicemonitors + - prometheusrules + verbs: + - list + - get + - create + - update + - watch + - apiGroups: + - integreatly.org + resources: + - grafanadashboards + verbs: + - get + - list + - create + - update + - watch serviceAccountName: 3scale-operator strategy: deployment installModes: diff --git a/deploy/role.yaml b/deploy/role.yaml index 17f44e247..3430b830f 100644 --- a/deploy/role.yaml +++ b/deploy/role.yaml @@ -41,13 +41,6 @@ rules: - patch - update - watch -- apiGroups: - - monitoring.coreos.com - resources: - - servicemonitors - verbs: - - get - - create - apiGroups: - apps resourceNames: @@ -183,3 +176,24 @@ rules: - update - watch - delete +- apiGroups: + - monitoring.coreos.com + resources: + - servicemonitors + - prometheusrules + verbs: + - list + - get + - create + - update + - watch +- apiGroups: + - integreatly.org + resources: + - grafanadashboards + verbs: + - get + - list + - create + - update + - watch diff --git a/doc/apimanager-reference.md b/doc/apimanager-reference.md index f415a16bf..c7b84656e 100644 --- a/doc/apimanager-reference.md +++ b/doc/apimanager-reference.md @@ -32,6 +32,7 @@ This resource is the resource used to deploy a 3scale API Management solution. | ZyncSpec | `zync` | \*ZyncSpec | No | See [ZyncSpec](#ZyncSpec) reference | Spec of the Zync part | | HighAvailabilitySpec | `highAvailability` | \*HighAvailabilitySpec | No | See [HighAvailabilitySpec](#HighAvailabilitySpec) reference | Spec of the HighAvailability part | | PodDisruptionBudgetSpec | `podDisruptionBudget` | \*PodDisruptionBudgetSpec | No | See [PodDisruptionBudgetSpec](#PodDisruptionBudgetSpec) reference | Spec of the PodDisruptionBudgetSpec part | +| MonitoringSpec | `monitoring` | \*MonitoringSpec | No | Disabled | [MonitoringSpec](#MonitoringSpec) reference | #### ApicastSpec @@ -279,6 +280,11 @@ pre-created by the user: | --- | --- | --- | --- | --- | --- | | Enabled | `enabled` | bool | No | `false` | Enable to automatically create [PodDisruptionBudgets](https://kubernetes.io/docs/concepts/workloads/pods/disruptions/) for components that can scale. Not including any of the databases or redis services.| +#### MonitoringSpec + +| **Field** | **json/yaml field**| **Type** | **Required** | **Default value** | **Description** | +| --- | --- | --- | --- | --- | --- | +| Enabled | `enabled` | bool | No | `false` | [Enable to automatically create monitoring resources](operator-monitoring-resources.md) | #### APIManagerStatus diff --git a/doc/dependency_decisions.yml b/doc/dependency_decisions.yml index fdabdd688..ae185bbcd 100644 --- a/doc/dependency_decisions.yml +++ b/doc/dependency_decisions.yml @@ -179,7 +179,20 @@ - - :license - github.com/evanphx/json-patch - 3-clause BSD License - - :who: + - :who: :why: 3-clause BSD License https://github.com/evanphx/json-patch/blob/master/LICENSE :versions: [] :when: 2019-10-24 09:56:58.733603332 Z +- - :whitelist + - CC0 1.0 Universal + - :who: Jeff Kaufmann and Richard Fontana (Red Hat Legal) + :why: + :versions: [] + :when: 2019-11-26 10:15:34.001520959 Z +- - :license + - github.com/go-bindata/go-bindata + - CC0 1.0 Universal + - :who: + :why: https://github.com/go-bindata/go-bindata/blob/master/LICENSE + :versions: [] + :when: 2020-06-15 09:58:31.161619176 Z diff --git a/doc/operator-monitoring-resources.md b/doc/operator-monitoring-resources.md new file mode 100644 index 000000000..d0ddc32d8 --- /dev/null +++ b/doc/operator-monitoring-resources.md @@ -0,0 +1,51 @@ +# 3scale Monitoring Resources + +The 3scale monitoring resources are (optionally) installed when 3scale is installed on Openshift using the 3scale Operator. + +## Prerequirements + +* [prometheus-operator](https://github.com/coreos/prometheus-operator/tree/master/contrib/kube-prometheus#quickstart) needs to be deployed in the cluster. + +The prometheus operator is an operator that creates, configures, and manages Prometheus clusters atop Kubernetes. It provides `ServiceMonitor` and `PrometheusRule` custom resources required by 3scale monitoring. + +* [grafana-operator](https://github.com/coreos/prometheus-operator/tree/master/contrib/kube-prometheus#quickstart) needs to be deployed in the cluster. + +The grafana operator is an operator for creating and managing Grafana instances. It provides `GrafanaDashboard` custom resources required by 3scale monitoring. + +## Enabling 3scale monitoring + +3scale monitoring is disabled by default. It can be enabled by setting monitoring to `true` in the [APIManager CR](apimanager-reference.md). + +``` +apiVersion: apps.3scale.net/v1alpha1 +kind: APIManager +metadata: + name: apimanager1 +spec: + wildcardDomain: example.com + monitoring: + enabled: true +``` + +## Monitored components + +* Kubernetes resources at namespace level where 3scale is installed +* Apicast Staging +* Apicast Production +* 3scale Backend worker +* 3scale Backend listener +* System sidekiq +* Zync +* Zync-que + +## Exposing monitoring resources + +3scale operator created monitoring resources, i.e. `ServiceMonitor`, `PrometheusRule` and `ServiceMonitor`, will all be labeled with + +``` +monitoring-key: middleware +``` + +Make sure the prometheus services and grafana services created by respective operators are configured to monitor resources with that label. + +Depending on the prometheus and grafana service configuration, the namespace where 3scale is installed might require labels too. Check your monitoring provider configuration like grafana and prometheus servers. diff --git a/doc/operator-user-guide.md b/doc/operator-user-guide.md index cdf9c93a8..2cc34f4ab 100644 --- a/doc/operator-user-guide.md +++ b/doc/operator-user-guide.md @@ -12,6 +12,7 @@ * [PostgreSQL Installation](#postgresql-installation) * [Enabling Pod Disruption Budgets](#enabling-pod-disruption-budgets) * [Setting custom affinity and tolerations](#setting-custom-affinity-and-tolerations) + * [Enabling monitoring resources](operator-monitoring-resources.md) * [Reconciliation](#reconciliation) * [Upgrading 3scale](#upgrading-3scale) * [Feature Operator (in *TechPreview*)](operator-capabilities.md) diff --git a/go.mod b/go.mod index 10a8e0496..bcfe91f4a 100644 --- a/go.mod +++ b/go.mod @@ -4,12 +4,16 @@ go 1.13 require ( github.com/3scale/3scale-porta-go-client v0.0.3 + github.com/Azure/go-autorest v12.2.0+incompatible github.com/RHsyseng/operator-utils v0.0.0-20200204194854-c5b0d8533458 + github.com/coreos/prometheus-operator v0.34.0 github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32 + github.com/go-bindata/go-bindata v3.1.1+incompatible github.com/go-logr/logr v0.1.0 github.com/go-openapi/spec v0.19.4 github.com/go-playground/validator/v10 v10.2.0 github.com/google/go-cmp v0.3.1 + github.com/integr8ly/grafana-operator/v3 v3.1.0 github.com/luci/go-render v0.0.0-20160219211803-9a04cc21af0f github.com/mitchellh/go-homedir v1.1.0 github.com/openshift/api v3.9.1-0.20190924102528-32369d4db2ad+incompatible diff --git a/go.sum b/go.sum index 1edcf7975..9343df9fa 100644 --- a/go.sum +++ b/go.sum @@ -1,14 +1,27 @@ bitbucket.org/bertimus9/systemstat v0.0.0-20180207000608-0eeff89b0690/go.mod h1:Ulb78X89vxKYgdL24HMTiXYHlyHEvruOj1ZPlqeNEZM= +bitbucket.org/ww/goautoneg v0.0.0-20120707110453-75cd24fc2f2c/go.mod h1:1vhO7Mn/FZMgOgDVGLy5X1mE6rq1HbkBdkF/yj8zkcg= bou.ke/monkey v1.0.1/go.mod h1:FgHuK96Rv2Nlf+0u1OOVDpCMdsWyOFmeeketDHE7LIg= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.31.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.35.1/go.mod h1:wfjPZNvXCBYESy3fIynybskMP48KVPrjSPCnXiK7Prg= cloud.google.com/go v0.37.4/go.mod h1:NHPJ89PdicEuT9hdPXMROBD91xc5uRDxsMtSB16k7hw= cloud.google.com/go v0.38.0 h1:ROfEUZz+Gh5pa62DJWXSaonyu3StP6EA6lPEXPI6mCo= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU= +dmitri.shuralyov.com/html/belt v0.0.0-20180602232347-f7d459c86be0/go.mod h1:JLBrvjyP0v+ecvNYvCpyZgu5/xkfAUhi6wJj28eUfSU= +dmitri.shuralyov.com/service/change v0.0.0-20181023043359-a85b471d5412/go.mod h1:a1inKt/atXimZ4Mv927x+r7UpyzRUf4emIoiiSC2TN4= +dmitri.shuralyov.com/state v0.0.0-20180228185332-28bcc343414c/go.mod h1:0PRwlb0D6DFvNNtx+9ybjezNCa8XF0xaYcETyp6rHWU= +git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= github.com/3scale/3scale-porta-go-client v0.0.3 h1:/jcEnBQqBDuJYQKvvmKUw6c4LoF4PWq57EAD4q6HiJ8= github.com/3scale/3scale-porta-go-client v0.0.3/go.mod h1:eXz9JDFNrbJRqJkDs39bMxO+m/L5pz51JMof3A8jQ1k= +github.com/Azure/azure-sdk-for-go v21.4.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-sdk-for-go v32.5.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= +github.com/Azure/go-autorest v11.1.2+incompatible h1:viZ3tV5l4gE2Sw0xrasFHytCGtzYCrT+um/rrSQ1BfA= +github.com/Azure/go-autorest v11.1.2+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest v12.2.0+incompatible h1:2Fxszbg492oAJrcvJlgyVaTqnQYRkxmEK6VPCLLVpBI= +github.com/Azure/go-autorest v12.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest/autorest v0.9.0 h1:MRvx8gncNaXJqOoLmhNjUAKh33JJF8LyxPhomEtOsjs= github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= github.com/Azure/go-autorest/autorest/adal v0.5.0 h1:q2gDruN08/guU9vAjuPWff0+QIrpH6ediguzdAzXAUU= @@ -29,6 +42,7 @@ github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= +github.com/GoogleCloudPlatform/k8s-cloud-provider v0.0.0-20181220005116-f8e995905100/go.mod h1:iroGtC8B3tQiqtds1l+mgk/BBOrxbqjH+eUfFQYRc14= github.com/GoogleCloudPlatform/k8s-cloud-provider v0.0.0-20190822182118-27a4ced34534/go.mod h1:iroGtC8B3tQiqtds1l+mgk/BBOrxbqjH+eUfFQYRc14= github.com/JeffAshton/win_pdh v0.0.0-20161109143554-76bb4ee9f0ab/go.mod h1:3VYc5hodBMJ5+l/7J4xAyMeuM2PNuepvHlGs8yilUCA= github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd/go.mod h1:64YHyfSL2R96J44Nlwm39UHepQbyR5q10x7iYa1ks2E= @@ -36,6 +50,7 @@ github.com/MakeNowJust/heredoc v0.0.0-20171113091838-e9091a26100e/go.mod h1:64YH github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= github.com/Masterminds/semver/v3 v3.0.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= +github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= github.com/Masterminds/sprig/v3 v3.0.0/go.mod h1:NEUY/Qq8Gdm2xgYA+NwJM6wmfdRV9xkh8h/Rld20R0U= github.com/Masterminds/vcs v1.13.0/go.mod h1:N09YCmOQr6RLxC6UNHzuVwAdodYbbnycGHSmwVJjcKA= github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= @@ -63,6 +78,7 @@ github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuy github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/ant31/crd-validation v0.0.0-20180702145049-30f8a35d0ac2/go.mod h1:X0noFIik9YqfhGYBLEHg8LJKEwy7QIitLQuFMpKLcPk= github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= @@ -85,9 +101,11 @@ github.com/bifurcation/mint v0.0.0-20180715133206-93c51c6ce115/go.mod h1:zVt7zX3 github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932/go.mod h1:NOuUCSz6Q9T7+igc/hlvDOUdtWKryOrtFyIVABv/p7k= github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= +github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= github.com/brancz/gojsontoyaml v0.0.0-20190425155809-e8bd32d46b3d/go.mod h1:IyUJYN1gvWjtLF5ZuygmxbnsAyP3aJS6cHzIuZY50B0= github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= github.com/bugsnag/bugsnag-go v1.5.0/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= @@ -103,11 +121,13 @@ github.com/cespare/xxhash/v2 v2.1.0/go.mod h1:dgIUBU3pDso/gPgZ1osOZ0iQf77oPR28Tj github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5/go.mod h1:/iP1qXHoty45bqomnu2LM+VVyAEdWN+vtSHGlQgyxbw= github.com/checkpoint-restore/go-criu v0.0.0-20190109184317-bdb7599cd87b/go.mod h1:TrMrLQfeENAPYPRsJuq3jsqdlRh3lvi6trTZJG8+tho= github.com/cheekybits/genny v0.0.0-20170328200008-9127e812e1e9/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ= +github.com/client9/misspell v0.0.0-20170928000206-9ce5d979ffda/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cloudflare/cfssl v0.0.0-20180726162950-56268a613adf/go.mod h1:yMWuSON2oQp+43nFtAV/uvKQIFpSPerB57DCt9t8sSA= github.com/clusterhq/flocker-go v0.0.0-20160920122132-2b8b7259d313/go.mod h1:P1wt9Z3DP8O6W3rvwCt0REIlshg1InHImaLW0t3ObY0= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/cockroachdb/cockroach-go v0.0.0-20181001143604-e0a95dfd547c/go.mod h1:XGLbWH/ujMcbPbhZq52Nv6UrCghb1yGn//133kEsvDk= +github.com/codedellemc/goscaleio v0.0.0-20170830184815-20e2ce2cf885/go.mod h1:JIHmDHNZO4tmA3y3RHp6+Gap6kFsNf55W9Pn/3YS9IY= github.com/codegangsta/negroni v1.0.0/go.mod h1:v0y3T5G7Y1UlFfyxFn/QLRU4a2EuNau2iZY63YTKWo0= github.com/container-storage-interface/spec v1.1.0/go.mod h1:6URME8mwIBbpVyZV93Ce5St17xBiQJQY67NDsuohiy4= github.com/containerd/console v0.0.0-20170925154832-84eeaae905fa/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= @@ -117,25 +137,36 @@ github.com/containerd/containerd v1.3.0-beta.2.0.20190823190603-4a2f61c4f2b4/go. github.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= github.com/containerd/continuity v0.0.0-20181203112020-004b46473808/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= github.com/containerd/typeurl v0.0.0-20190228175220-2a93cfde8c20/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= +github.com/containernetworking/cni v0.6.0/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= github.com/coredns/corefile-migration v1.0.2/go.mod h1:OFwBp/Wc9dJt5cAZzHWMNhK1r5L0p0jDwIBc6j8NC8E= +github.com/coreos/bbolt v1.3.0/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/bbolt v1.3.1-coreos.6/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= +github.com/coreos/etcd v3.3.9+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/etcd v3.3.12+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/etcd v3.3.15+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= +github.com/coreos/go-semver v0.0.0-20180108230905-e214231b295a/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20181031085051-9002847aa142/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190620071333-e64a0ec8b42a/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/pkg v0.0.0-20180108230652-97fdf19511ea/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/coreos/prometheus-operator v0.29.0/go.mod h1:SO+r5yZUacDFPKHfPoUjI3hMsH+ZUdiuNNhuSq3WoSg= github.com/coreos/prometheus-operator v0.34.0 h1:TF9qaydNeUamLKs0hniaapa4FBz8U8TIlRRtJX987A4= github.com/coreos/prometheus-operator v0.34.0/go.mod h1:Li6rMllG/hYIyXfMuvUwhyC+hqwJVHdsDdP21hypT1M= github.com/coreos/rkt v1.30.0/go.mod h1:O634mlH6U7qk87poQifK6M2rsFNt+FyUTWNMnP1hF1U= +github.com/cpuguy83/go-md2man v1.0.4/go.mod h1:N6JayAiVKtlHSnuTCeuLSQVs75hb8q+dYQLjr7cDsKY= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= +github.com/cyphar/filepath-securejoin v0.0.0-20170720062807-ae69057f2299/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= github.com/cznic/b v0.0.0-20180115125044-35e9bbe41f07/go.mod h1:URriBxXwVq5ijiJ12C7iIZqlA69nTlI+LgI6/pwftG8= github.com/cznic/fileutil v0.0.0-20180108211300-6a051e75936f/go.mod h1:8S58EK26zhXSxzv7NQFpnliaOQsmDUxvoQO3rt154Vg= @@ -147,6 +178,8 @@ github.com/cznic/ql v1.2.0/go.mod h1:FbpzhyZrqr0PVlK6ury+PoW3T0ODUV22OeWIxcaOrSE github.com/cznic/sortutil v0.0.0-20150617083342-4c7342852e65/go.mod h1:q2w6Bg5jeox1B+QkJ6Wp/+Vn0G/bo3f1uY7Fn3vivIQ= github.com/cznic/strutil v0.0.0-20171016134553-529a34b1c186/go.mod h1:AHHPPPXTw0h6pVabbcbyGRK1DckRn7r/STdZEeIDzZc= github.com/cznic/zappy v0.0.0-20160723133515-2533cb5b45cc/go.mod h1:Y1SNZ4dRUOKXshKUbwUapqNncRrho4mkjQebgEHZLj8= +github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c/go.mod h1:Ct2BUK8SB0YC1SMSibvLzxjeJLnrYEVLULFNiHY9YfQ= +github.com/d2g/dhcp4client v0.0.0-20170829104524-6e570ed0a266/go.mod h1:j0hNfjhrt2SxUOw55nL0ATM/z4Yt3t2Kd1mW34z5W5s= github.com/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -160,6 +193,8 @@ github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8 github.com/dhui/dktest v0.3.0/go.mod h1:cyzIUfGsBEbZ6BT7tnXqAShHSXCZhSNmFl70sZ7c1yc= github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= github.com/docker/cli v0.0.0-20190506213505-d88565df0c2d/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/distribution v0.0.0-20170726174610-edc3ab29cdff/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/distribution v2.6.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/distribution v2.7.0+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= @@ -179,18 +214,26 @@ github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5m github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= github.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +github.com/elazarl/go-bindata-assetfs v1.0.0/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4= github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emicklei/go-restful v2.8.0+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emicklei/go-restful v2.8.1+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emicklei/go-restful v2.9.3+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful v2.9.6+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful v2.11.1+incompatible h1:CjKsv3uWcCMvySPQYKxO8XX3f9zD4FeZRsW4G0B4ffE= github.com/emicklei/go-restful v2.11.1+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emicklei/go-restful-swagger12 v0.0.0-20170926063155-7524189396c6/go.mod h1:qr0VowGBT4CS4Q8vFF8BSeKz34PuqKGxs/L0IAQA9DQ= github.com/euank/go-kmsg-parser v2.0.0+incompatible/go.mod h1:MhmAMZ8V4CYH4ybgdRwPr2TU5ThnS43puaKEMpja1uw= +github.com/evanphx/json-patch v0.0.0-20190203023257-5858425f7550/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch v3.0.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v4.1.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v4.5.0+incompatible h1:ouOWdg56aJriqS0huScTkVXPC5IcNrDCXZ6OoTAWu7M= github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d/go.mod h1:ZZMPRZwes7CROmyNKgQzC3XPs6L/G2EJLHddWejkmf4= +github.com/fatih/camelcase v0.0.0-20160318181535-f6a740d52f96/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc= github.com/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc= github.com/fatih/color v1.6.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= @@ -204,12 +247,15 @@ github.com/garyburd/redigo v1.6.0/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05 github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v0.0.0-20180820084758-c7ce16629ff4/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/ghodss/yaml v1.0.1-0.20180820084758-c7ce16629ff4/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32 h1:Mn26/9ZMNWSw9C9ERFA1PUxfmGpolnw2v0bKOREu5ew= github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32/go.mod h1:GIjDIg/heH5DOkXY3YJ/wNhfHsQHoXGjl8G8amsYQ1I= +github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8 h1:DujepqpGd1hyOd7aW59XpK7Qymp8iy83xq74fLr21is= github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= github.com/go-acme/lego v2.5.0+incompatible/go.mod h1:yzMNe9CasVUhkquNvti5nAtPmG94USbYxYrZfTkIn0M= +github.com/go-bindata/go-bindata v3.1.1+incompatible h1:tR4f0e4VTO7LK6B2YWyAoVEzG9ByG1wrXB4TL9+jiYg= github.com/go-bindata/go-bindata v3.1.1+incompatible/go.mod h1:xK8Dsgwmeed+BBsSy2XTopBn/8uK2HWuGSnA11C3Joo= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= @@ -222,50 +268,62 @@ github.com/go-logr/zapr v0.1.1 h1:qXBXPDdNncunGs7XeEpsJt8wCjYBygluzfdLO0G5baE= github.com/go-logr/zapr v0.1.1/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk= github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= +github.com/go-openapi/analysis v0.17.2/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= github.com/go-openapi/analysis v0.19.2 h1:ophLETFestFZHk3ji7niPEL4d466QjW+0Tdg5VyDq7E= github.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= +github.com/go-openapi/errors v0.17.2/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= github.com/go-openapi/errors v0.19.2 h1:a2kIyV3w+OS3S97zxUndRVD46+FhGOUBDFY7nmu4CsY= github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= +github.com/go-openapi/jsonpointer v0.19.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= github.com/go-openapi/jsonpointer v0.19.3 h1:gihV7YNZK1iK6Tgwwsxo2rJbD1GTbdm72325Bq8FI3w= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= +github.com/go-openapi/jsonreference v0.19.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= github.com/go-openapi/jsonreference v0.19.3 h1:5cxNfTy0UVC3X8JL5ymxzyoUZmo8iZb+jeTWn7tUa8o= github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= +github.com/go-openapi/loads v0.17.2/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= github.com/go-openapi/loads v0.19.2 h1:rf5ArTHmIJxyV5Oiks+Su0mUens1+AjpkPoWr5xFRcI= github.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix5jWFxsNPs= github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA= +github.com/go-openapi/runtime v0.17.2/go.mod h1:QO936ZXeisByFmZEO1IS1Dqhtf4QV1sYYFtIq6Ld86Q= github.com/go-openapi/runtime v0.19.0 h1:sU6pp4dSV2sGlNKKyHxZzi1m1kG4WnYtWcJ+HYbygjE= github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64= github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= +github.com/go-openapi/spec v0.17.2/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= +github.com/go-openapi/spec v0.19.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY= github.com/go-openapi/spec v0.19.4 h1:ixzUSnHTd6hCemgtAJgluaTSGYpLNpJY4mA2DIkdOAo= github.com/go-openapi/spec v0.19.4/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= +github.com/go-openapi/strfmt v0.17.2/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= github.com/go-openapi/strfmt v0.19.0 h1:0Dn9qy1G9+UJfRU7TR8bmdGxb4uifB7HNrJjOnV0yPk= github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY= github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= +github.com/go-openapi/swag v0.17.2/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.4/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/validate v0.17.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= +github.com/go-openapi/validate v0.17.2/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= github.com/go-openapi/validate v0.19.2 h1:ky5l57HjyVRrsJfd2+Ro5Z9PjGuKbsmftwyMtk8H7js= github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= @@ -291,9 +349,11 @@ github.com/gobuffalo/packr v1.30.1/go.mod h1:ljMyFO2EcrnzsHsN99cvbq055Y9OhRrIavi github.com/gobuffalo/packr/v2 v2.5.1/go.mod h1:8f9c96ITobJlPzI44jj+4tHnEKNt0xXWSVlXRN9X1Iw= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/gocql/gocql v0.0.0-20190301043612-f6df8288f9b4/go.mod h1:4Fw1eo5iaEhDUs8XyuhSVCVy52Jq3L+/3GJgYkwc+/0= +github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= github.com/godbus/dbus v4.1.0+incompatible/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= github.com/gofrs/flock v0.7.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gogo/protobuf v0.0.0-20171007142547-342cbe0a0415/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= @@ -305,13 +365,16 @@ github.com/golang-migrate/migrate/v4 v4.6.2/go.mod h1:JYi6reN3+Z734VZ0akNuyOJNcr github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20180513044358-24b0969c4cb7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20180924190550-6f2cf27854a4/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20181024230925-c65c006176ff/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191027212112-611e8accdfc9 h1:uHTyIjqVhYRhLbJ8nIiOJHkEZZ+5YoOsAbD3sk82NiE= github.com/golang/groupcache v0.0.0-20191027212112-611e8accdfc9/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E= +github.com/golang/mock v0.0.0-20160127222235-bd3c8e81be01/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.1-0.20190329180013-73dc87cad333/go.mod h1:L3bP22mxdfCUHSUVMs+SPJMx55FrxQew7MSXT11Q86g= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.0.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -327,6 +390,7 @@ github.com/golangplus/fmt v0.0.0-20150411045040-2a5d6d7d2995/go.mod h1:lJgMEyOkY github.com/golangplus/testing v0.0.0-20180327235837-af21d9c3145e/go.mod h1:0AA//k/eakGydO4jKRoRL2j92ZKSzTgj9tclaCrvXHk= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/cadvisor v0.33.2-0.20190411163913-9db8c7dee20a/go.mod h1:1nql6U13uTHaLYB8rLS5x9IJc2qT6Xd/Tr1sTX6NE48= github.com/google/cadvisor v0.34.0/go.mod h1:1nql6U13uTHaLYB8rLS5x9IJc2qT6Xd/Tr1sTX6NE48= github.com/google/certificate-transparency-go v1.0.21/go.mod h1:QeJfpSbVSfYc7RgB3gJFj9cbuQMMchQxrWXz8Ruopmg= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -336,6 +400,7 @@ github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= +github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v1.0.0 h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= @@ -343,14 +408,18 @@ github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OI github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= +github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE08qbEPm1M08qg= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.2.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.3.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.3.1 h1:WeAefnSUHlBb0iJKwxFDZdbfGwkd7xRNuV+IpXMJhYk= github.com/googleapis/gnostic v0.3.1/go.mod h1:on+2t9HRStVgn95RSsFWFz+6Q0Snyqv1awfrALZdbtU= +github.com/gophercloud/gophercloud v0.0.0-20190126172459-c818fa66e4c8/go.mod h1:3WdhXV3rUYy9p6AUW8d94kr+HS62Y4VL9mBnFxsD8q4= github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= github.com/gophercloud/gophercloud v0.2.0 h1:lD2Bce2xBAMNNcFZ0dObTpXkGLlVIb33RPVUNVpw6ic= github.com/gophercloud/gophercloud v0.2.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= @@ -363,6 +432,7 @@ github.com/gorilla/mux v1.7.1/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2z github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gosuri/uitable v0.0.1/go.mod h1:tKR86bXuXPZazfOTG1FIzvjIdXzd0mo4Vtn16vt0PJo= github.com/gregjones/httpcache v0.0.0-20170728041850-787624de3eb7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/gregjones/httpcache v0.0.0-20181110185634-c63ab54fda8f/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/gregjones/httpcache v0.0.0-20190203031600-7a902570cb17/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v0.0.0-20190222133341-cfaf5686ec79/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= @@ -370,8 +440,13 @@ github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmg github.com/grpc-ecosystem/go-grpc-middleware v1.1.0/go.mod h1:f5nM7jw/oeRSadq3xCzHAvxcr8HZnzsqU6ILg/0NiiE= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.3.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= +github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= +github.com/grpc-ecosystem/grpc-gateway v1.5.1/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= +github.com/grpc-ecosystem/grpc-gateway v1.6.3/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= +github.com/grpc-ecosystem/grpc-gateway v1.8.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.4/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-health-probe v0.2.0/go.mod h1:4GVx/bTCtZaSzhjbGueDY5YgBdsmKeVx+LErv/n0L6s= github.com/grpc-ecosystem/grpc-health-probe v0.2.1-0.20181220223928-2bf0a5b182db/go.mod h1:uBKkC2RbarFsvS5jMJHpVhTLvGlGQj9JJwkaePE3FWI= github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -383,8 +458,10 @@ github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.3 h1:YPkqC67at8FYaadspW/6uE0COsBxS2656RLEr8Bppgk= github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/hcl v0.0.0-20160711231752-d8c773c4cba1/go.mod h1:oZtUIOe8dh44I2q6ScRibXws4Ajl+d+nod3AaR9vL5w= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/heketi/heketi v0.0.0-20181109135656-558b29266ce0/go.mod h1:bB9ly3RchcQqsQ9CpyaQwvva7RS5ytVoSoholZQON6o= github.com/heketi/heketi v9.0.0+incompatible/go.mod h1:bB9ly3RchcQqsQ9CpyaQwvva7RS5ytVoSoholZQON6o= github.com/heketi/rest v0.0.0-20180404230133-aa6a65207413/go.mod h1:BeS3M108VzVlmAue3lv2WcGuPAX94/KN63MUURzbYSI= github.com/heketi/tests v0.0.0-20151005000721-f3775cbcefd6/go.mod h1:xGMAM8JLi7UkZt1i4FQeQy0R2T8GLUwQhOP5M1gBhy4= @@ -393,6 +470,7 @@ github.com/helm/helm-2to3 v0.2.0/go.mod h1:jQUVAWB0bM7zNIqKPIfHFzuFSK0kHYovJrjO+ github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huandu/xstrings v1.2.0/go.mod h1:DvyZB1rfVYsBIigL8HwpZgxHwXozlTgGqn63UyNX5k4= +github.com/iancoleman/strcase v0.0.0-20180726023541-3605ed457bf7/go.mod h1:SK73tn/9oHe+/Y0h39VT4UCxmurVJkR5NA7kMEAOgSE= github.com/iancoleman/strcase v0.0.0-20190422225806-e506e3ef7365/go.mod h1:SK73tn/9oHe+/Y0h39VT4UCxmurVJkR5NA7kMEAOgSE= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= @@ -402,8 +480,11 @@ github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJ github.com/improbable-eng/thanos v0.3.2/go.mod h1:GZewVGILKuJVPNRn7L4Zw+7X96qzFOwj63b22xYGXBE= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/integr8ly/grafana-operator/v3 v3.1.0 h1:orj6C9zXuvMdgL9pJp4bWU1XZZ0wT4RyVcFY92DMOf8= +github.com/integr8ly/grafana-operator/v3 v3.1.0/go.mod h1:0WBJ5MjgAgIu9briw0EaDkpXsWIXMoRJKnE/J024+bM= github.com/jackc/fake v0.0.0-20150926172116-812a484cc733/go.mod h1:WrMFNQdiFJ80sQsxDoMokWK1W5TQtxBFNpzWTD84ibQ= github.com/jackc/pgx v3.2.0+incompatible/go.mod h1:0ZGrqGqkRlliWnWB4zKnWtjbSWbGkVEFm4TeybAXq+I= +github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU= github.com/jimstudt/http-authentication v0.0.0-20140401203705-3eca13d6893a/go.mod h1:wK6yTYYcgjHE1Z1QtXACPDjcFJyBskHEdagmnq3vsP8= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af h1:pmfjZENx5imkbgOkpRUYLnmbU7UEFbjtDA2hxJ1ichM= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= @@ -411,15 +492,20 @@ github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhB github.com/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8= github.com/joho/godotenv v1.3.0 h1:Zjp+RcGpHhGlrMbJzXTrZZPrWj+1vfm90La1wgB6Bhc= github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= +github.com/jonboulle/clockwork v0.0.0-20141017032234-72f9bd7c4e0c/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v0.0.0-20180701071628-ab8a2e0c74be/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7 h1:KfgG9LzI+pYjr4xvmz/5H4FXjokeP+rlHLhv3iH62Fo= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jsonnet-bundler/jsonnet-bundler v0.1.0/go.mod h1:YKsSFc9VFhhLITkJS3X2PrRqWG9u2Jq99udTdDjQLfM= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jteeuwen/go-bindata v0.0.0-20151023091102-a0ff2567cfb7/go.mod h1:JVvhzYOiGBnFSYRyV00iY8q7/0PThjIYav1p9h5dmKs= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/kardianos/osext v0.0.0-20150410034420-8fef92e41e22/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8= github.com/kardianos/osext v0.0.0-20170510131534-ae77be60afb1/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8= github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8= github.com/karrick/godirwalk v1.7.5/go.mod h1:2c9FRhkDxdIbgkOnCEvnSWs71Bhugbl46shStcFDJ34= @@ -428,14 +514,19 @@ github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvW github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/konsorten/go-windows-terminal-sequences v0.0.0-20180402223658-b729f2633dfe/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/fs v0.0.0-20131111012553-2788f0dbd169/go.mod h1:glhvuHOU9Hy7/8PwwdtnarXqLagOX0b/TbZx2zLMqEg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.0.0-20140812000539-f31442d60e51/go.mod h1:Bvhd+E3laJ0AVkG0c9rmtZcnhV0HQ3+c3YxxqTvc/gA= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= +github.com/kr/text v0.0.0-20130911015532-6807e777504f/go.mod h1:sjUstKUATFIcff4qlB53Kml0wQPtJVc/3fWrmuUmcfA= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kshvakov/clickhouse v1.3.5/go.mod h1:DMzX7FxRymoNkVgizH0DWAL8Cur7wHLgx3MUnGwJqpE= @@ -444,6 +535,7 @@ github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/libopenstorage/openstorage v0.0.0-20170906232338-093a0c388875/go.mod h1:Sp1sIObHjat1BeXhfMqLZ14wnOzEhNx2YQedreMcUyc= github.com/libopenstorage/openstorage v1.0.0/go.mod h1:Sp1sIObHjat1BeXhfMqLZ14wnOzEhNx2YQedreMcUyc= github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= @@ -454,6 +546,7 @@ github.com/lucas-clemente/quic-go v0.10.2/go.mod h1:hvaRS9IHjFLMq76puFJeWNfmn+H7 github.com/lucas-clemente/quic-go-certificates v0.0.0-20160823095156-d2f86524cced/go.mod h1:NCcRLrOTZbzhZvixZLlERbJtDtYsmMw8Jc4vS8Z0g58= github.com/luci/go-render v0.0.0-20160219211803-9a04cc21af0f h1:WVPqVsbUsrzAebTEgWRAZMdDOfkFx06iyhbIoyMgtkE= github.com/luci/go-render v0.0.0-20160219211803-9a04cc21af0f/go.mod h1:aS446i8akEg0DAtNKTVYpNpLPMc0SzsZ0RtGhjl0uFM= +github.com/magiconair/properties v0.0.0-20160816085511-61b492c03cf4/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= @@ -468,6 +561,7 @@ github.com/maorfr/helm-plugin-utils v0.0.0-20181205064038-588190cb5e3b/go.mod h1 github.com/markbates/inflect v1.0.4 h1:5fh1gzTFhfae06u3hzHYO9xe3l3v3nW5Pwt3naLTP5g= github.com/markbates/inflect v1.0.4/go.mod h1:1fR9+pO2KHEO9ZRtto13gDwwZaAKstQzferVeWqbgNs= github.com/marten-seemann/qtls v0.2.3/go.mod h1:xzjG7avBwGGbdZ8dTGxlBnLArsVKLvwmjgmPuiQEcYk= +github.com/martinlindhe/base36 v0.0.0-20180729042928-5cda0030da17/go.mod h1:+AtEs8xrBpCeYgSLoY/aJ6Wf37jtBuR0s35750M27+8= github.com/martinlindhe/base36 v1.0.0/go.mod h1:+AtEs8xrBpCeYgSLoY/aJ6Wf37jtBuR0s35750M27+8= github.com/mattbaird/jsonpatch v0.0.0-20171005235357-81af80346b1a/go.mod h1:M1qoD/MqPgTZIk0EWKB38wE28ACRfVcn+cU08jyArI0= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= @@ -476,23 +570,31 @@ github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNx github.com/mattn/go-isatty v0.0.6/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-shellwords v0.0.0-20180605041737-f8471b0a71de/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= github.com/mattn/go-shellwords v1.0.5/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/maxbrunsfeld/counterfeiter v0.0.0-20181017030959-1aadac120687/go.mod h1:aoVsckWnsNzazwF2kmD+bzgdr4GBlbK91zsdivQJ2eU= +github.com/maxbrunsfeld/counterfeiter/v6 v6.0.2/go.mod h1:jDaYg8/bmdfygnyq5gnvMRDocYTEcXLPU0bXPtTco58= github.com/maxbrunsfeld/counterfeiter/v6 v6.2.1/go.mod h1:F9YacGpnZbLQMzuPI0rR6op21YvNu/RjL705LJJpM3k= github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2/go.mod h1:eD9eIE7cdwcMi9rYluz88Jz2VyhSmden33/aXg4oVIY= github.com/mesos/mesos-go v0.0.9/go.mod h1:kPYCMQ9gsOXVAle1OsoY4I1+9kPu8GHkf88aV59fDr4= +github.com/mholt/caddy v0.0.0-20180213163048-2de495001514/go.mod h1:Wb1PlT4DAYSqOEd03MsqkdkXnTxA8v9pKjdpxbqM1kY= github.com/mholt/certmagic v0.6.2-0.20190624175158-6a42ef9fe8c2/go.mod h1:g4cOPxcjV0oFq3qwpjSA30LReKD8AoIfwAY9VvG35NY= +github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= +github.com/miekg/dns v0.0.0-20160614162101-5d001d020961/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v0.0.0-20181005163659-0d29b283ac0f/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.3/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.4/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/mindprince/gonvml v0.0.0-20171110221305-fee913ce8fb2/go.mod h1:2eu9pRWp8mo84xCg6KswZ+USQHjwgRhNp06sozOdsTY= +github.com/mistifyio/go-zfs v0.0.0-20151009155749-1b4ae6fb4e77/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= github.com/mistifyio/go-zfs v2.1.1+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= github.com/mitchellh/hashstructure v0.0.0-20170609045927-2bca23e0e452/go.mod h1:QjSHrPWS+BGUVBYkbTZWEnOh3G1DutKwClXU/ABz6AQ= github.com/mitchellh/hashstructure v1.0.0/go.mod h1:QjSHrPWS+BGUVBYkbTZWEnOh3G1DutKwClXU/ABz6AQ= @@ -512,12 +614,15 @@ github.com/morikuni/aec v0.0.0-20170113033406-39771216ff4c/go.mod h1:BbKIizmSmc5 github.com/mrunalp/fileutils v0.0.0-20160930181131-4ee1cc9a8058/go.mod h1:x8F1gnqOkIEiO4rqoeEEEqQbo7HjGMTvyoq3gej4iT0= github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/munnerz/goautoneg v0.0.0-20190414153302-2ae31c8b6b30/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/mvdan/xurls v0.0.0-20160110113200-1b768d7c393a/go.mod h1:tQlNn3BED8bE/15hnSL2HLkDeLWpNPAwtw7wkEq44oU= github.com/mvdan/xurls v1.1.0/go.mod h1:tQlNn3BED8bE/15hnSL2HLkDeLWpNPAwtw7wkEq44oU= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= github.com/nakagami/firebirdsql v0.0.0-20190310045651-3c02a58cfed8/go.mod h1:86wM1zFnC6/uDBfZGNwB65O+pR2OFi5q/YQaEUid1qA= github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= github.com/naoina/toml v0.1.1/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= +github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= +github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -528,30 +633,49 @@ github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W github.com/onsi/ginkgo v1.10.1 h1:q/mM8GF/n0shIN8SaAZ0V+jnLPzen6WIVZdiwrRlMlo= github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v0.0.0-20190113212917-5533ce8a0da3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.3.0/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v1.4.2-0.20180831124310-ae19f1b56d53/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v1.4.2/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.0 h1:XPnZz8VVBHjVsy1vzJmRwIcSwiUO+JFfrv/xGiigmME= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/image-spec v0.0.0-20170604055404-372ad780f634/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/runc v0.0.0-20181113202123-f000fe11ece1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= github.com/opencontainers/runc v1.0.0-rc2.0.20190611121236-6cc515888830/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= github.com/opencontainers/runtime-spec v1.0.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/selinux v0.0.0-20170621221121-4a2974bf1ee9/go.mod h1:+BLncwf63G4dgOzykXAxcmnFlUaOlkDdmw/CqsW6pjs= github.com/opencontainers/selinux v1.2.2/go.mod h1:+BLncwf63G4dgOzykXAxcmnFlUaOlkDdmw/CqsW6pjs= github.com/openshift/api v0.0.0-20190924102528-32369d4db2ad h1:MiZEukiPd7ll8BQDwBfc3LKBxbqyeXIx+wl4CzVj5EQ= github.com/openshift/api v0.0.0-20190924102528-32369d4db2ad/go.mod h1:dh9o4Fs58gpFXGSYfnVxGR9PnV53I8TW84pQaJDdGiY= +github.com/openshift/client-go v0.0.0-20190401163519-84c2b942258a/go.mod h1:6rzn+JTr7+WYS2E1TExP4gByoABxMznR6y2SnUIkmxk= github.com/openshift/client-go v0.0.0-20190923180330-3b6373338c9b h1:E++qQ7W1/EdvuMo+YGVbMPn4HihEp7YT5Rghh0VmA9A= github.com/openshift/client-go v0.0.0-20190923180330-3b6373338c9b/go.mod h1:6rzn+JTr7+WYS2E1TExP4gByoABxMznR6y2SnUIkmxk= github.com/openshift/origin v0.0.0-20160503220234-8f127d736703/go.mod h1:0Rox5r9C8aQn6j1oAOQ0c1uC86mYbUFObzjBRvUKHII= github.com/openshift/prom-label-proxy v0.1.1-0.20191016113035-b8153a7f39f1/go.mod h1:p5MuxzsYP1JPsNGwtjtcgRHHlGziCJJfztff91nNixw= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= github.com/operator-framework/api v0.0.0-20200120235816-80fd2f1a09c9/go.mod h1:S5IdlJvmKkF84K2tBvsrqJbI2FVy03P88R75snpRxJo= +github.com/operator-framework/go-appr v0.0.0-20180917210448-f2aef88446f2/go.mod h1:YNzwUx1i6C4dXWcffyq3yaIb0rh/K8/OvQ4vG0SNlSw= +github.com/operator-framework/operator-lifecycle-manager v0.0.0-20181023032605-e838f7fb2186/go.mod h1:Ma5ZXd4S1vmMyewWlF7aO8CZiokR7Sd8dhSfkGkNU4U= +github.com/operator-framework/operator-lifecycle-manager v0.0.0-20190105193533-81104ffdc4fb/go.mod h1:XMyE4n2opUK4N6L45YGQkXXi8F9fD7XDYFv/CsS6V5I= +github.com/operator-framework/operator-lifecycle-manager v0.0.0-20190125151539-1e295784b30a/go.mod h1:vq6TTFvg6ti1Bn6ACsZneZTmjTsURgDD6tQtVDbEgsU= +github.com/operator-framework/operator-lifecycle-manager v0.0.0-20190605231540-b8a4faf68e36/go.mod h1:HKV3ZB9aOUxRyfM53shoBRtIMP4lg8QRmkW+dmZy+kI= github.com/operator-framework/operator-lifecycle-manager v0.0.0-20191115003340-16619cd27fa5/go.mod h1:zL34MNy92LPutBH5gQK+gGhtgTUlZZX03I2G12vWHF4= +github.com/operator-framework/operator-marketplace v0.0.0-20190216021216-57300a3ef3ba/go.mod h1:msZSL8pXwzQjB+hU+awVrZQw94IwJi3sNZVD3NoESIs= +github.com/operator-framework/operator-registry v1.0.1/go.mod h1:1xEdZjjUg2hPEd52LG3YQ0jtwiwEGdm98S1TH5P4RAA= +github.com/operator-framework/operator-registry v1.0.4/go.mod h1:hve6YwcjM2nGVlscLtNsp9sIIBkNZo6jlJgzWw7vP9s= +github.com/operator-framework/operator-registry v1.1.1/go.mod h1:7D4WEwL+EKti5npUh4/u64DQhawCBRugp8Ql20duUb4= github.com/operator-framework/operator-registry v1.5.1/go.mod h1:agrQlkWOo1q8U1SAaLSS2WQ+Z9vswNT2M2HFib9iuLY= github.com/operator-framework/operator-registry v1.5.3/go.mod h1:agrQlkWOo1q8U1SAaLSS2WQ+Z9vswNT2M2HFib9iuLY= github.com/operator-framework/operator-registry v1.5.7-0.20200121213444-d8e2ec52c19a/go.mod h1:ekexcV4O8YMxdQuPb+Xco7MHfVmRIq7Jvj5e6NU7dHI= +github.com/operator-framework/operator-sdk v0.12.0/go.mod h1:mW8isQxiXlLCVf2E+xqflkQAVLOTbiqjndKdkKIrR0M= github.com/operator-framework/operator-sdk v0.15.2 h1:VlxI0J+HLmMKs5k53drQ/B1AXhyNj0OaD2BbREt8Hnk= github.com/operator-framework/operator-sdk v0.15.2/go.mod h1:RkC5LpluVONa08ORFIIVCYrEr855xG1/NltRL2jQ8qo= github.com/otiai10/copy v1.0.1/go.mod h1:8bMCJrAqOtN/d9oyh5HR7HhLQMvcGMpGdwRDYsfOCHc= @@ -564,17 +688,20 @@ github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtP github.com/pelletier/go-toml v1.0.1/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/petar/GoLLRB v0.0.0-20130427215148-53be0d36a84c/go.mod h1:HUpKUBZnpzkdx0kD/+Yfuft+uD3zHGtXF/XJB14TUr4= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/phayes/freeport v0.0.0-20171002181615-b8543db493a5/go.mod h1:iIss55rKnNBTvrwdmkUpLnDpZoAHvWaiq5+iMmen4AE= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/sftp v0.0.0-20160930220758-4d0e916071f6/go.mod h1:NxmoDg/QLVWluQDUYG7XBZTLUpKeFa8e3aMf1BfjyHk= github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= github.com/pquerna/ffjson v0.0.0-20180717144149-af8b230fcd20/go.mod h1:YARuvh7BUWHNhzDq2OM5tzR2RiCcN2D7sapiKyCel/M= +github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= @@ -588,29 +715,35 @@ github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1: github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4 h1:gQz4mCbXsO+nc9n1hCxHcGA3Zx3Eo+UHZoInFGUIXNM= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.0.0-20190104105734-b1c43a6df3ae/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= github.com/prometheus/common v0.7.0 h1:L+1lyG48J1zAQXA3RBX/nG/B3gjlHq0zTt2tlbJLyCY= github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= +github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190104112138-b1a0a9a36d74/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190129233650-316cf8ccfec5/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= -github.com/prometheus/procfs v0.0.5 h1:3+auTFlqw+ZaQYJARz6ArODtkaIwtvBTx3N2NehQlL8= github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= +github.com/prometheus/procfs v0.0.7 h1:RS5GAlMbnkWkhs4+bPocMTmGjYkuCY5djjqEDdXOhcQ= +github.com/prometheus/procfs v0.0.7/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/prometheus v2.3.2+incompatible/go.mod h1:oAIUtOny2rjMX0OWN5vPR5/q/twIROJvdqnQKDdil/s= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/prometheus/tsdb v0.8.0/go.mod h1:fSI0j+IUQrDd7+ZtR9WKIGtoYAYAJUKcKhYLG25tN4g= github.com/quobyte/api v0.1.2/go.mod h1:jL7lIHrmqQ7yh05OJ+eEEdHr0u/kmT1Ff9iHd+4H6VI= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446/go.mod h1:uYEyJGbgTkfkS4+E/PavXkNJcbFIpEtjt2B0KDQ5+9M= +github.com/robfig/cron v0.0.0-20170309132418-df38d32658d8/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k= github.com/robfig/cron v0.0.0-20170526150127-736158dc09e1/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k= github.com/robfig/cron v1.1.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= @@ -618,17 +751,46 @@ github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.5.0 h1:Usqs0/lDK/NqTkvrmKSwA/3XkZAs7ZAW/eLeQ2MVBTw= github.com/rogpeppe/go-internal v1.5.0/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rubenv/sql-migrate v0.0.0-20191022111038-5cdff0d8cc42/go.mod h1:WS0rl9eEliYI8DPnr3TOwz4439pay+qNgzJoVya/DmY= github.com/rubenv/sql-migrate v0.0.0-20191025130928-9355dd04f4b3/go.mod h1:WS0rl9eEliYI8DPnr3TOwz4439pay+qNgzJoVya/DmY= github.com/rubiojr/go-vhd v0.0.0-20160810183302-0bfd3b39853c/go.mod h1:DM5xW0nvfNNm2uytzsvhI3OnX8uzaRAg8UX/CnDqbto= +github.com/russross/blackfriday v0.0.0-20151117072312-300106c228d5/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday v0.0.0-20170610170232-067529f716f4/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/sclevine/spec v1.0.0/go.mod h1:W4J29eT/Kzv7/b9IWLB055Z+qvVC9vt0Arko24q7p+U= github.com/sclevine/spec v1.2.0/go.mod h1:W4J29eT/Kzv7/b9IWLB055Z+qvVC9vt0Arko24q7p+U= +github.com/seccomp/libseccomp-golang v0.0.0-20150813023252-1b506fc7c24e/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= +github.com/shurcooL/component v0.0.0-20170202220835-f88ec8f54cc4/go.mod h1:XhFIlyj5a1fBNx5aJTbKoIq0mNaPvOagO+HjB3EtxrY= +github.com/shurcooL/events v0.0.0-20181021180414-410e4ca65f48/go.mod h1:5u70Mqkb5O5cxEA8nxTsgrgLehJeAw6Oc4Ab1c/P1HM= +github.com/shurcooL/github_flavored_markdown v0.0.0-20181002035957-2122de532470/go.mod h1:2dOwnU2uBioM+SGy2aZoq1f/Sd1l9OkAeAUvjSyvgU0= +github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= +github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= +github.com/shurcooL/gofontwoff v0.0.0-20180329035133-29b52fc0a18d/go.mod h1:05UtEgK5zq39gLST6uB0cf3NEHjETfB4Fgr3Gx5R9Vw= +github.com/shurcooL/gopherjslib v0.0.0-20160914041154-feb6d3990c2c/go.mod h1:8d3azKNyqcHP1GaQE/c6dDgjkgSx2BZ4IoEi4F1reUI= +github.com/shurcooL/highlight_diff v0.0.0-20170515013008-09bb4053de1b/go.mod h1:ZpfEhSmds4ytuByIcDnOLkTHGUI6KNqRNPDLHDk+mUU= +github.com/shurcooL/highlight_go v0.0.0-20181028180052-98c3abbbae20/go.mod h1:UDKB5a1T23gOMUJrI+uSuH0VRDStOiUVSjBTRDVBVag= +github.com/shurcooL/home v0.0.0-20181020052607-80b7ffcb30f9/go.mod h1:+rgNQw2P9ARFAs37qieuu7ohDNQ3gds9msbT2yn85sg= +github.com/shurcooL/htmlg v0.0.0-20170918183704-d01228ac9e50/go.mod h1:zPn1wHpTIePGnXSHpsVPWEktKXHr6+SS6x/IKRb7cpw= +github.com/shurcooL/httperror v0.0.0-20170206035902-86b7830d14cc/go.mod h1:aYMfkZ6DWSJPJ6c4Wwz3QtW22G7mf/PEgaB9k/ik5+Y= +github.com/shurcooL/httpfs v0.0.0-20171119174359-809beceb2371/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= +github.com/shurcooL/httpgzip v0.0.0-20180522190206-b1c53ac65af9/go.mod h1:919LwcH0M7/W4fcZ0/jy0qGght1GIhqyS/EgWGH2j5Q= +github.com/shurcooL/issues v0.0.0-20181008053335-6292fdc1e191/go.mod h1:e2qWDig5bLteJ4fwvDAc2NHzqFEthkqn7aOZAOpj+PQ= +github.com/shurcooL/issuesapp v0.0.0-20180602232740-048589ce2241/go.mod h1:NPpHK2TI7iSaM0buivtFUc9offApnI0Alt/K8hcHy0I= +github.com/shurcooL/notifications v0.0.0-20181007000457-627ab5aea122/go.mod h1:b5uSkrEVM1jQUspwbixRBhaIjIzL2xazXp6kntxYle0= +github.com/shurcooL/octicon v0.0.0-20181028054416-fa4f57f9efb2/go.mod h1:eWdoE5JD4R5UVWDucdOPg1g2fqQRq78IQa9zlOV1vpQ= +github.com/shurcooL/reactions v0.0.0-20181006231557-f2e0b4ca5b82/go.mod h1:TCR1lToEk4d2s07G3XGfz2QrgHXg4RJBvjrOozvoWfk= +github.com/shurcooL/sanitized_anchor_name v0.0.0-20151028001915-10ef21a441db/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/shurcooL/sanitized_anchor_name v0.0.0-20170918181015-86672fcb3f95/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/shurcooL/users v0.0.0-20180125191416-49c67e49c537/go.mod h1:QJTqeLYEDaXHZDBsXlPCDqdhQuJkuw4NOtaxYe3xii4= +github.com/shurcooL/webdavfs v0.0.0-20170829043945-18c3829fa133/go.mod h1:hKmq5kWdCj2z2KEozexVbfEZIWiTjhE0+UjmZgPqehw= +github.com/sigma/go-inotify v0.0.0-20181102212354-c87b6cf5033d/go.mod h1:stlh9OsqBQSdwxTxX73mu41BBtRbIpZLQ7flcAoxAfo= github.com/sirupsen/logrus v1.0.5/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= +github.com/sirupsen/logrus v1.1.1/go.mod h1:zrgwTnHtNr00buQ1vSptGe8m1f/BbgsPukg8qsT7A+A= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= @@ -637,26 +799,35 @@ github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1 github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.3/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE= +github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v0.0.0-20160816080757-b28a7effac97/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.2.2 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/cast v0.0.0-20160730092037-e31f36ffc91a/go.mod h1:r2rcYCSwa1IExKTDiTfzaxqT2FNHs8hODu4LnUfgKEg= github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.0-20180319062004-c439c4fa0937/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.5 h1:f0B+LkLX6DtmRH1isoNA9VTtNUK9K8xYd28JNNfOv/s= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/jwalterweatherman v0.0.0-20160311093646-33c24e77fb80/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.2/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v0.0.0-20160820190039-7fb2782df3d8/go.mod h1:A8kyI5cUJhb8N+3pkfONlcEcZbueH6nhAm0Fq7SrnBM= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/spf13/viper v1.4.0 h1:yXHLWeravcrgGyFSyCgdYpXQ9dR9c/WED3pg1RhxqEU= github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= +github.com/stevvooe/resumable v0.0.0-20180830230917-22b14a53ba50/go.mod h1:1pdIZTAHUz+HDKDVZ++5xg/duPlhKAIzw9qy42CWYp4= github.com/storageos/go-api v0.0.0-20180912212459-343b3eff91fc/go.mod h1:ZrLn+e0ZuF3Y65PNF6dIwbJPZqfmtCXxFm9ckv0agOY= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -667,16 +838,23 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/syndtr/gocapability v0.0.0-20160928074757-e7cb7fa329f4/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= +github.com/technosophos/moniker v0.0.0-20180509230615-a5dbd03a2245/go.mod h1:O1c8HleITsZqzNZDjSNzirUGsMT0oGu9LhHKoJrqO+A= github.com/thecodeteam/goscaleio v0.1.0/go.mod h1:68sdkZAsK8bvEwBlbQnlLS+xU+hvLYM/iQ8KXej1AwM= github.com/tidwall/pretty v0.0.0-20180105212114-65a9db5fad51/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tmc/grpc-websocket-proxy v0.0.0-20171017195756-830351dc03c6/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/ugorji/go v1.1.1/go.mod h1:hnLbHMwcvSihnDhEfx2/BzKp2xb0Y+ErdfYcrs9tkJQ= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/ugorji/go/codec v0.0.0-20181022190402-e5e69e061d4f/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= github.com/vishvananda/netlink v0.0.0-20171020171820-b2de5d10e38e/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= github.com/vishvananda/netns v0.0.0-20171111001504-be1fbeda1936/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI= github.com/vmware/govmomi v0.20.1/go.mod h1:URlwyTFZX72RmxtxuaFL2Uj3fD1JTvZdx59bHWk6aFU= +github.com/vmware/photon-controller-go-sdk v0.0.0-20170310013346-4a435daef6cc/go.mod h1:e6humHha1ekIwTCm+A5Qed5mG8V4JL+ChHcUOJ+L/8U= +github.com/xanzy/go-cloudstack v0.0.0-20160728180336-1e2cbf647e57/go.mod h1:s3eL3z5pNXF5FVybcT+LIVdId8pYn709yv6v5mrkrQE= github.com/xanzy/go-gitlab v0.15.0/go.mod h1:8zdQa/ri1dfn8eS3Ir1SyfvOKlw7WBJ8DVThkpGiXrs= github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= github.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= @@ -696,6 +874,7 @@ github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wK gitlab.com/nyarla/go-crypt v0.0.0-20160106005555-d9a5dc2b789b/go.mod h1:T3BPAOm2cqquPa0MKWeNkmOM5RQsRhkrwMWonFMN7fE= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.mongodb.org/mongo-driver v1.1.0/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= +go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.21.0 h1:mU6zScU4U1YAFPHEHYk+3JC4SY7JxgkqS10ZOSyksNg= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= @@ -710,8 +889,13 @@ go.uber.org/zap v0.0.0-20180814183419-67bc79d13d15/go.mod h1:vwi/ZaCAaUcBkycHslx go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0 h1:ORx85nbTijNz8ljznvCMR1ZBIPKFn3jQrag10X2AsuM= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= +golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d/go.mod h1:OWs+y06UdEOHN4y+MfF/py+xQ/tYqIWW03b70/CG9Rw= golang.org/x/crypto v0.0.0-20180426230345-b49d69b5da94/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181015023909-0c41d7ab0a0e/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181025213731-e84da0312774/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190123085648-057139ce5d2b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -719,6 +903,7 @@ golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25/go.mod h1:djNgcEr1/C05ACk golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190404164418-38d8ce5564a5/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -732,6 +917,7 @@ golang.org/x/exp v0.0.0-20190312203227-4b39c73a6495/go.mod h1:ZjyILWgesfNpC6sMxT golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20181217174547-8f45f776aaf1/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= @@ -743,7 +929,10 @@ golang.org/x/net v0.0.0-20180112015858-5ccada7d0a7b/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180911220305-26e67e76b6c3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181029044818-c44066c5c816/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181102091132-c10e9556a7bc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181106065722-10aee1819953/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181108082009-03003ca0c849/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -769,11 +958,15 @@ golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20191028085509-fe3aa8a45271 h1:N66aaryRB3Ax92gH0v3hp1QYZ3zWWCCUR/j8Ifh45Ss= golang.org/x/net v0.0.0-20191028085509-fe3aa8a45271/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20181105165119-ca4130e427c7/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 h1:SVwTIAaPC2U/AvvLNZ2a7OVsmBpC8L5BlwK1whH3hm0= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -786,6 +979,8 @@ golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181004145325-8469e314837c/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181023152157-44b849a8bc13/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181029174526-d69651ed3497/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -798,7 +993,9 @@ golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190310054646-10058d7d4faa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190318195719-6c81ef8f67ca/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190426135247-a129542de9ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -814,8 +1011,11 @@ golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fq golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20171227012246-e19ae1496984/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20181227161524-e6919f6577db/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/time v0.0.0-20161028155119-f51c12702a4d/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0 h1:/5xXl8Y5W96D+TtHSlonuFqGHIWVuyCkGJLwGh9JJFs= @@ -825,13 +1025,18 @@ golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGm golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181011152555-a398e557df60/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030000716-a0a13e073c7b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181207222222-4c874b978acb/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190221204921-83362c3779f5/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190320215829-36c10c0a621f/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190425222832-ad9eeb80039a/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= @@ -843,26 +1048,37 @@ golang.org/x/tools v0.0.0-20190624180213-70d37148ca0c/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190706070813-72ffa07ba3db/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= golang.org/x/tools v0.0.0-20191018212557-ed542cd5b28a h1:UuQ+70Pi/ZdWHuP4v457pkXeOynTdgd/4enxeIO/98k= golang.org/x/tools v0.0.0-20191018212557-ed542cd5b28a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7 h1:9zdDQZ7Thm29KFXgAX/+yaf3eVbP7djjWp/dXAppNCc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898 h1:/atklqdjdhuosWIl6AIbOeHJjicWYPqR9bpxqxYG2pA= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gomodules.xyz/jsonpatch/v2 v2.0.1 h1:xyiBuvkD2g5n7cYzx6u2sxQvsAy4QJsZFCzGVdzOXZ0= gomodules.xyz/jsonpatch/v2 v2.0.1/go.mod h1:IhYNNY4jnS53ZnfE4PAmpKtDpTCj1JFXc+3mwe7XcUU= gonum.org/v1/gonum v0.0.0-20190331200053-3d26580ed485/go.mod h1:2ltnJ7xHfj0zHS40VVPYEAAMTa3ZGguvHGBSJeRWqE0= gonum.org/v1/gonum v0.0.0-20190710053202-4340aa3071a0/go.mod h1:03dgh78c4UvU1WksguQ/lvJQXbezKQGJSrwwRq5MraQ= gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= gonum.org/v1/netlib v0.0.0-20190331212654-76723241ea4e/go.mod h1:kS+toOQn6AQKjmKJ7gzohV1XkqsFehRA2FbsbkopSuQ= +google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= +google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= +google.golang.org/api v0.0.0-20181220000619-583d854617af/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= +google.golang.org/api v0.1.0/go.mod h1:UGEZY7KEX120AnNLIHFMKIo4obdJhkp2tPbaPlQx13Y= google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= google.golang.org/api v0.3.2/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.6.1-0.20190607001116-5213b8090861 h1:ppLucX0K/60T3t6LPZQzTOkt5PytkEbQLIaSteq+TpE= google.golang.org/api v0.6.1-0.20190607001116-5213b8090861/go.mod h1:btoxGiFvQNVUZQ8W08zLtrVS08CNpINPEfxXxgJL1Q4= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.5 h1:tycE03LOZYQNhDpS27tcQdAzLCVMaj7QT2SXxebnpCM= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20181016170114-94acd270e44e/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20181029155118-b69ba1387ce2/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20181202183823-bd91e49a0898/go.mod h1:7Ep/1NZk928CDR8SjdVbjWNpdIf6nzjE3BTgJDr2Atg= +google.golang.org/genproto v0.0.0-20190122154452-ba6ebe99b011/go.mod h1:7Ep/1NZk928CDR8SjdVbjWNpdIf6nzjE3BTgJDr2Atg= google.golang.org/genproto v0.0.0-20190128161407-8ac453e89fca/go.mod h1:L3J43x8/uS+qIUoksaLKe6OS3nUKxOKuIFz1sl2/jx4= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190404172233-64821d5d2107/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -872,9 +1088,12 @@ google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRn google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20191028173616-919d9bdd9fe6 h1:UXl+Zk3jqqcbEVV7ace5lrt4YdA4tXiz3f/KbmD29Vo= google.golang.org/genproto v0.0.0-20191028173616-919d9bdd9fe6/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/grpc v1.13.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.19.1/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= @@ -896,9 +1115,11 @@ gopkg.in/inf.v0 v0.9.0/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/mcuadros/go-syslog.v2 v2.2.1/go.mod h1:l5LPIyOOyIdQquNg+oU6Z3524YwrcqEm0aKH+5zpt2U= +gopkg.in/natefinch/lumberjack.v2 v2.0.0-20170531160350-a96e63847dc3/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/square/go-jose.v1 v1.1.2/go.mod h1:QpYS+a4WhS+DTlyQIi6Ka7MS3SuR9a055rgXNEe6EiA= +gopkg.in/square/go-jose.v2 v2.0.0-20180411045311-89060dee6a84/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= @@ -914,6 +1135,7 @@ gopkg.in/yaml.v3 v3.0.0-20190905181640-827449938966/go.mod h1:K4uyk7z7BCEPqu6E+C gotest.tools v2.1.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= gotest.tools/gotestsum v0.3.5/go.mod h1:Mnf3e5FUzXbkCfynWBGOwLssY7gTQgCHObK9tMpAriY= +grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o= helm.sh/helm/v3 v3.0.0/go.mod h1:sI7B9yfvMgxtTPMWdk1jSKJ2aa59UyP9qhPydqW6mgo= helm.sh/helm/v3 v3.0.1/go.mod h1:sI7B9yfvMgxtTPMWdk1jSKJ2aa59UyP9qhPydqW6mgo= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -939,20 +1161,31 @@ k8s.io/code-generator v0.0.0-20191004115455-8e001e5d1894/go.mod h1:mJUgkl06XV4ks k8s.io/component-base v0.0.0-20191016111319-039242c015a9/go.mod h1:SuWowIgd/dtU/m/iv8OD9eOxp3QZBBhTIiWMsBQvKjI= k8s.io/cri-api v0.0.0-20190828162817-608eb1dad4ac/go.mod h1:BvtUaNBr0fEpzb11OfrQiJLsLPtqbmulpo1fPwcpP6Q= k8s.io/csi-translation-lib v0.0.0-20191016115521-756ffa5af0bd/go.mod h1:lf1VBseeLanBpSXD0N9tuPx1ylI8sA0j6f+rckCKiIk= +k8s.io/gengo v0.0.0-20181106084056-51747d6e00da/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20181113154421-fd15ee9cc2f7/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20190116091435-f8a0810f38af/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20190327210449-e17681d19d3a/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20190822140433-26a664648505/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20191010091904-7fa3014cb28f/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/heapster v1.2.0-beta.1/go.mod h1:h1uhptVXMwC8xtZBYsPXKVi8fpdlYkTs6k949KozGrM= +k8s.io/helm v2.15.0+incompatible/go.mod h1:LZzlS4LQBHfciFOurYBFkCMTaZ0D1l+p0teMg7TSULI= k8s.io/helm v2.16.1+incompatible/go.mod h1:LZzlS4LQBHfciFOurYBFkCMTaZ0D1l+p0teMg7TSULI= k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= +k8s.io/klog v0.1.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= +k8s.io/klog v0.2.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= +k8s.io/klog v0.3.1/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.3.3/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.4.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= k8s.io/kube-aggregator v0.0.0-20191016112429-9587704a8ad4/go.mod h1:+aW0UZgSXdTSHTIFnWnueEuXjOqerDUxGIw6Ygr+vYY= k8s.io/kube-controller-manager v0.0.0-20191016114939-2b2b218dc1df/go.mod h1:WgrTcPKYAfNa9C0LV1UeK+XqfbSOUH1WGq/vX5UiW40= +k8s.io/kube-openapi v0.0.0-20181031203759-72693cb1fadd/go.mod h1:BXM9ceUBTj2QnfH2MK1odQs778ajze1RxcmP6S8RVVc= +k8s.io/kube-openapi v0.0.0-20190228160746-b3a7cee44a30/go.mod h1:BXM9ceUBTj2QnfH2MK1odQs778ajze1RxcmP6S8RVVc= k8s.io/kube-openapi v0.0.0-20190320154901-5e45bb682580/go.mod h1:BXM9ceUBTj2QnfH2MK1odQs778ajze1RxcmP6S8RVVc= +k8s.io/kube-openapi v0.0.0-20190401085232-94e1e7b7574c/go.mod h1:BXM9ceUBTj2QnfH2MK1odQs778ajze1RxcmP6S8RVVc= k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= k8s.io/kube-openapi v0.0.0-20190918143330-0270cf2f1c1d h1:Xpe6sK+RY4ZgCTyZ3y273UmFmURhjtoJiwOMbQsXitY= k8s.io/kube-openapi v0.0.0-20190918143330-0270cf2f1c1d/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= @@ -962,13 +1195,19 @@ k8s.io/kube-state-metrics v1.7.2 h1:6vdtgXrrRRMSgnyDmgua+qvgCYv954JNfxXAtDkeLVQ= k8s.io/kube-state-metrics v1.7.2/go.mod h1:U2Y6DRi07sS85rmVPmBFlmv+2peBcL8IWGjM+IjYA/E= k8s.io/kubectl v0.0.0-20191016120415-2ed914427d51/go.mod h1:gL826ZTIfD4vXTGlmzgTbliCAT9NGiqpCqK2aNYv5MQ= k8s.io/kubelet v0.0.0-20191016114556-7841ed97f1b2/go.mod h1:SBvrtLbuePbJygVXGGCMtWKH07+qrN2dE1iMnteSG8E= +k8s.io/kubernetes v1.11.7-beta.0.0.20181219023948-b875d52ea96d/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= +k8s.io/kubernetes v1.11.8-beta.0.0.20190124204751-3a10094374f2/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= +k8s.io/kubernetes v1.14.2/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= +k8s.io/kubernetes v1.15.4/go.mod h1:4Ggyo4AFgjbIzULOminzUJAvgbzY3j5ysXlW/a0PdcQ= k8s.io/kubernetes v1.16.0/go.mod h1:nlP2zevWKRGKuaaVbKIwozU0Rjg9leVDXkL4YTtjmVs= k8s.io/kubernetes v1.16.2/go.mod h1:SmhGgKfQ30imqjFVj8AI+iW+zSyFsswNErKYeTfgoH0= k8s.io/legacy-cloud-providers v0.0.0-20191016115753-cf0698c3a16b/go.mod h1:tKW3pKqdRW8pMveUTpF5pJuCjQxg6a25iLo+Z9BXVH0= k8s.io/metrics v0.0.0-20191016113814-3b1a734dba6e/go.mod h1:ve7/vMWeY5lEBkZf6Bt5TTbGS3b8wAxwGbdXAsufjRs= k8s.io/repo-infra v0.0.0-20181204233714-00fe14e3d1a3/go.mod h1:+G1xBfZDfVFsm1Tj/HNCvg4QqWx8rJ2Fxpqr1rqp/gQ= k8s.io/sample-apiserver v0.0.0-20191016112829-06bb3c9d77c9/go.mod h1:sXltHZrQa4jdKL14nOFRRUhhzpmbnRF0qGuAhRQbaxc= +k8s.io/utils v0.0.0-20190221042446-c2654d5206da/go.mod h1:8k8uAuAQ0rXslZKaEWd0c3oVhZz7sSzSiPnVZayjIX0= k8s.io/utils v0.0.0-20190308190857-21c4ce38f2a7/go.mod h1:8k8uAuAQ0rXslZKaEWd0c3oVhZz7sSzSiPnVZayjIX0= +k8s.io/utils v0.0.0-20190506122338-8fab8cb257d5/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= k8s.io/utils v0.0.0-20190801114015-581e00157fb1/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= k8s.io/utils v0.0.0-20191010214722-8d271d903fe4 h1:Gi+/O1saihwDqnlmC8Vhv1M5Sp4+rbOmK9TbsLn8ZEA= k8s.io/utils v0.0.0-20191010214722-8d271d903fe4/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= @@ -978,14 +1217,20 @@ modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03 modernc.org/strutil v1.0.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs= modernc.org/xc v1.0.0/go.mod h1:mRNCo0bvLjGhHO9WsyuKVU4q0ceiDDDoEeWDJHrNx8I= rsc.io/letsencrypt v0.0.1/go.mod h1:buyQKZ6IXrRnB7TdkHP0RyEybLx18HHyOSoTyoOLqNY= +sigs.k8s.io/controller-runtime v0.1.10/go.mod h1:HFAYoOh6XMV+jKF1UjFwrknPbowfyHEHHRdJMf2jMX8= +sigs.k8s.io/controller-runtime v0.3.0/go.mod h1:Cw6PkEg0Sa7dAYovGT4R0tRkGhHXpYijwNxYhAnAZZk= sigs.k8s.io/controller-runtime v0.4.0 h1:wATM6/m+3w8lj8FXNaO6Fs/rq/vqoOjO1Q116Z9NPsg= sigs.k8s.io/controller-runtime v0.4.0/go.mod h1:ApC79lpY3PHW9xj/w9pj+lYkLgwAAUZwfXkME1Lajns= +sigs.k8s.io/controller-tools v0.2.2/go.mod h1:8SNGuj163x/sMwydREj7ld5mIMJu1cDanIfnx6xsU70= sigs.k8s.io/controller-tools v0.2.4/go.mod h1:m/ztfQNocGYBgTTCmFdnK94uVvgxeZeE3LtJvd/jIzA= sigs.k8s.io/kustomize v2.0.3+incompatible/go.mod h1:MkjgH3RdOWrievjo6c9T245dYlB5QeXV4WCbnt/PEpU= sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= sigs.k8s.io/structured-merge-diff v0.0.0-20190817042607-6149e4549fca/go.mod h1:IIgPezJWb76P0hotTxzDbWsMYB8APh18qZnxkomBpxA= +sigs.k8s.io/testing_frameworks v0.1.1/go.mod h1:VVBKrHmJ6Ekkfz284YKhQePcdycOzNH9qL6ht1zEr/U= sigs.k8s.io/testing_frameworks v0.1.2 h1:vK0+tvjF0BZ/RYFeZ1E6BYBwHJJXhjuZ3TdsEKH+UQM= sigs.k8s.io/testing_frameworks v0.1.2/go.mod h1:ToQrwSC3s8Xf/lADdZp3Mktcql9CG0UAmdJG9th5i0w= sigs.k8s.io/yaml v1.1.0 h1:4A07+ZFc2wgJwo8YNlQpr1rVlgUDlxXHhPJciaPY5gs= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= +sourcegraph.com/sourcegraph/go-diff v0.5.0/go.mod h1:kuch7UrkMzY0X+p9CRK03kfuPQ2zzQcaEFbx8wA8rck= +sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= vbom.ml/util v0.0.0-20160121211510-db5cfe13f5cc/go.mod h1:so/NYdZXCz+E3ZpW0uAoCj6uzU2+8OWDFv/HxUSs7kI= diff --git a/licenses.xml b/licenses.xml index fbeabd69b..c7332d87e 100644 --- a/licenses.xml +++ b/licenses.xml @@ -20,6 +20,16 @@ http://www.apache.org/licenses/LICENSE-2.0.txt + + + github.com/Azure/go-autorest + v12.2.0+incompatible + + + Apache 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + + github.com/Azure/go-autorest/autorest @@ -120,6 +130,16 @@ http://opensource.org/licenses/mit-license + + + github.com/blang/semver + v3.5.1+incompatible + + + MIT + http://opensource.org/licenses/mit-license + + github.com/cespare/xxhash/v2 @@ -210,6 +230,16 @@ http://opensource.org/licenses/BSD-3-Clause + + + github.com/go-bindata/go-bindata + v3.1.1+incompatible + + + CC0 1.0 Universal + http://creativecommons.org/publicdomain/zero/1.0 + + github.com/go-logr/logr @@ -330,6 +360,36 @@ http://www.apache.org/licenses/LICENSE-2.0.txt + + + github.com/go-playground/locales + v0.13.0 + + + MIT + http://opensource.org/licenses/mit-license + + + + + github.com/go-playground/universal-translator + v0.17.0 + + + MIT + http://opensource.org/licenses/mit-license + + + + + github.com/go-playground/validator/v10 + v10.2.0 + + + MIT + http://opensource.org/licenses/mit-license + + github.com/gobuffalo/envy @@ -460,6 +520,16 @@ http://www.apache.org/licenses/LICENSE-2.0.txt + + + github.com/integr8ly/grafana-operator/v3 + v3.1.0 + + + Apache 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + + github.com/joho/godotenv @@ -490,6 +560,16 @@ http://opensource.org/licenses/mit-license + + + github.com/leodido/go-urn + v1.2.0 + + + MIT + http://opensource.org/licenses/mit-license + + github.com/luci/go-render @@ -683,7 +763,7 @@ github.com/prometheus/procfs - v0.0.5 + v0.0.7 Apache 2.0 @@ -883,7 +963,7 @@ golang.org/x/xerrors - v0.0.0-20190717185122-a985d3407aa7 + v0.0.0-20191011141410-1b5146add898 New BSD diff --git a/pkg/3scale/amp/component/apicast.go b/pkg/3scale/amp/component/apicast.go index dec70aee5..4f647909c 100644 --- a/pkg/3scale/amp/component/apicast.go +++ b/pkg/3scale/amp/component/apicast.go @@ -12,6 +12,11 @@ import ( "k8s.io/apimachinery/pkg/util/intstr" ) +const ( + ApicastStagingName = "apicast-staging" + ApicastProductionName = "apicast-production" +) + type Apicast struct { Options *ApicastOptions } @@ -27,7 +32,7 @@ func (apicast *Apicast) StagingService() *v1.Service { APIVersion: "v1", }, ObjectMeta: metav1.ObjectMeta{ - Name: "apicast-staging", + Name: ApicastStagingName, Labels: apicast.Options.CommonStagingLabels, }, Spec: v1.ServiceSpec{ @@ -45,7 +50,7 @@ func (apicast *Apicast) StagingService() *v1.Service { TargetPort: intstr.FromInt(8090), }, }, - Selector: map[string]string{"deploymentConfig": "apicast-staging"}, + Selector: map[string]string{"deploymentConfig": ApicastStagingName}, }, } } @@ -57,7 +62,7 @@ func (apicast *Apicast) ProductionService() *v1.Service { APIVersion: "v1", }, ObjectMeta: metav1.ObjectMeta{ - Name: "apicast-production", + Name: ApicastProductionName, Labels: apicast.Options.CommonProductionLabels, }, Spec: v1.ServiceSpec{ @@ -75,7 +80,7 @@ func (apicast *Apicast) ProductionService() *v1.Service { TargetPort: intstr.FromInt(8090), }, }, - Selector: map[string]string{"deploymentConfig": "apicast-production"}, + Selector: map[string]string{"deploymentConfig": ApicastProductionName}, }, } } @@ -84,13 +89,13 @@ func (apicast *Apicast) StagingDeploymentConfig() *appsv1.DeploymentConfig { return &appsv1.DeploymentConfig{ TypeMeta: metav1.TypeMeta{APIVersion: "apps.openshift.io/v1", Kind: "DeploymentConfig"}, ObjectMeta: metav1.ObjectMeta{ - Name: "apicast-staging", + Name: ApicastStagingName, Labels: apicast.Options.CommonStagingLabels, }, Spec: appsv1.DeploymentConfigSpec{ Replicas: apicast.Options.StagingReplicas, Selector: map[string]string{ - "deploymentConfig": "apicast-staging", + "deploymentConfig": ApicastStagingName, }, Strategy: appsv1.DeploymentStrategy{ RollingParams: &appsv1.RollingDeploymentStrategyParams{ @@ -117,7 +122,7 @@ func (apicast *Apicast) StagingDeploymentConfig() *appsv1.DeploymentConfig { ImageChangeParams: &appsv1.DeploymentTriggerImageChangeParams{ Automatic: true, ContainerNames: []string{ - "apicast-staging", + ApicastStagingName, }, From: v1.ObjectReference{ Kind: "ImageStreamTag", @@ -158,7 +163,7 @@ func (apicast *Apicast) StagingDeploymentConfig() *appsv1.DeploymentConfig { Env: apicast.buildApicastStagingEnv(), Image: "amp-apicast:latest", ImagePullPolicy: v1.PullIfNotPresent, - Name: "apicast-staging", + Name: ApicastStagingName, Resources: apicast.Options.StagingResourceRequirements, LivenessProbe: &v1.Probe{ Handler: v1.Handler{HTTPGet: &v1.HTTPGetAction{ @@ -190,13 +195,13 @@ func (apicast *Apicast) ProductionDeploymentConfig() *appsv1.DeploymentConfig { return &appsv1.DeploymentConfig{ TypeMeta: metav1.TypeMeta{APIVersion: "apps.openshift.io/v1", Kind: "DeploymentConfig"}, ObjectMeta: metav1.ObjectMeta{ - Name: "apicast-production", + Name: ApicastProductionName, Labels: apicast.Options.CommonProductionLabels, }, Spec: appsv1.DeploymentConfigSpec{ Replicas: apicast.Options.ProductionReplicas, Selector: map[string]string{ - "deploymentConfig": "apicast-production", + "deploymentConfig": ApicastProductionName, }, Strategy: appsv1.DeploymentStrategy{ RollingParams: &appsv1.RollingDeploymentStrategyParams{ @@ -224,7 +229,7 @@ func (apicast *Apicast) ProductionDeploymentConfig() *appsv1.DeploymentConfig { Automatic: true, ContainerNames: []string{ "system-master-svc", - "apicast-production", + ApicastProductionName, }, From: v1.ObjectReference{ Kind: "ImageStreamTag", @@ -278,7 +283,7 @@ func (apicast *Apicast) ProductionDeploymentConfig() *appsv1.DeploymentConfig { Env: apicast.buildApicastProductionEnv(), Image: "amp-apicast:latest", ImagePullPolicy: v1.PullIfNotPresent, - Name: "apicast-production", + Name: ApicastProductionName, Resources: apicast.Options.ProductionResourceRequirements, LivenessProbe: &v1.Probe{ Handler: v1.Handler{HTTPGet: &v1.HTTPGetAction{ @@ -307,13 +312,19 @@ func (apicast *Apicast) ProductionDeploymentConfig() *appsv1.DeploymentConfig { } func (apicast *Apicast) buildApicastCommonEnv() []v1.EnvVar { - return []v1.EnvVar{ + result := []v1.EnvVar{ helper.EnvVarFromSecret("THREESCALE_PORTAL_ENDPOINT", "system-master-apicast", SystemSecretSystemMasterApicastProxyConfigsEndpointFieldName), helper.EnvVarFromSecret("BACKEND_ENDPOINT_OVERRIDE", "backend-listener", "service_endpoint"), helper.EnvVarFromConfigMap("APICAST_MANAGEMENT_API", "apicast-environment", "APICAST_MANAGEMENT_API"), helper.EnvVarFromConfigMap("OPENSSL_VERIFY", "apicast-environment", "OPENSSL_VERIFY"), helper.EnvVarFromConfigMap("APICAST_RESPONSE_CODES", "apicast-environment", "APICAST_RESPONSE_CODES"), } + + if apicast.Options.ExtendedMetrics { + result = append(result, helper.EnvVarFromValue("APICAST_EXTENDED_METRICS", "true")) + } + + return result } func (apicast *Apicast) buildApicastStagingEnv() []v1.EnvVar { @@ -363,12 +374,12 @@ func (apicast *Apicast) StagingPodDisruptionBudget() *v1beta1.PodDisruptionBudge APIVersion: "policy/v1beta1", }, ObjectMeta: metav1.ObjectMeta{ - Name: "apicast-staging", + Name: ApicastStagingName, Labels: apicast.Options.CommonStagingLabels, }, Spec: v1beta1.PodDisruptionBudgetSpec{ Selector: &metav1.LabelSelector{ - MatchLabels: map[string]string{"deploymentConfig": "apicast-staging"}, + MatchLabels: map[string]string{"deploymentConfig": ApicastStagingName}, }, MaxUnavailable: &intstr.IntOrString{IntVal: PDB_MAX_UNAVAILABLE_POD_NUMBER}, }, @@ -382,12 +393,12 @@ func (apicast *Apicast) ProductionPodDisruptionBudget() *v1beta1.PodDisruptionBu APIVersion: "policy/v1beta1", }, ObjectMeta: metav1.ObjectMeta{ - Name: "apicast-production", + Name: ApicastProductionName, Labels: apicast.Options.CommonProductionLabels, }, Spec: v1beta1.PodDisruptionBudgetSpec{ Selector: &metav1.LabelSelector{ - MatchLabels: map[string]string{"deploymentConfig": "apicast-production"}, + MatchLabels: map[string]string{"deploymentConfig": ApicastProductionName}, }, MaxUnavailable: &intstr.IntOrString{IntVal: PDB_MAX_UNAVAILABLE_POD_NUMBER}, }, diff --git a/pkg/3scale/amp/component/apicast_monitoring.go b/pkg/3scale/amp/component/apicast_monitoring.go new file mode 100644 index 000000000..8d532f333 --- /dev/null +++ b/pkg/3scale/amp/component/apicast_monitoring.go @@ -0,0 +1,197 @@ +package component + +import ( + "fmt" + + "github.com/3scale/3scale-operator/pkg/assets" + "github.com/3scale/3scale-operator/pkg/common" + monitoringv1 "github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1" + grafanav1alpha1 "github.com/integr8ly/grafana-operator/v3/pkg/apis/integreatly/v1alpha1" + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/intstr" +) + +func (apicast *Apicast) ApicastProductionMonitoringService() *v1.Service { + return &v1.Service{ + TypeMeta: metav1.TypeMeta{ + Kind: "Service", + APIVersion: "v1", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "apicast-production-metrics", + Labels: apicast.Options.ProductionMonitoringLabels, + }, + Spec: v1.ServiceSpec{ + Ports: []v1.ServicePort{ + v1.ServicePort{ + Name: "metrics", + Protocol: v1.ProtocolTCP, + Port: 9421, + TargetPort: intstr.FromInt(9421), + }, + }, + Selector: map[string]string{"deploymentConfig": "apicast-production"}, + }, + } +} + +func (apicast *Apicast) ApicastStagingMonitoringService() *v1.Service { + return &v1.Service{ + TypeMeta: metav1.TypeMeta{ + Kind: "Service", + APIVersion: "v1", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "apicast-staging-metrics", + Labels: apicast.Options.StagingMonitoringLabels, + }, + Spec: v1.ServiceSpec{ + Ports: []v1.ServicePort{ + v1.ServicePort{ + Name: "metrics", + Protocol: v1.ProtocolTCP, + Port: 9421, + TargetPort: intstr.FromInt(9421), + }, + }, + Selector: map[string]string{"deploymentConfig": "apicast-staging"}, + }, + } +} + +func (apicast *Apicast) ApicastProductionServiceMonitor() *monitoringv1.ServiceMonitor { + return &monitoringv1.ServiceMonitor{ + ObjectMeta: metav1.ObjectMeta{ + Name: "apicast-production", + Labels: apicast.Options.ProductionMonitoringLabels, + }, + Spec: monitoringv1.ServiceMonitorSpec{ + Endpoints: []monitoringv1.Endpoint{{ + Port: "metrics", + Path: "/metrics", + Scheme: "http", + }}, + Selector: metav1.LabelSelector{ + MatchLabels: apicast.Options.ProductionMonitoringLabels, + }, + }, + } +} + +func (apicast *Apicast) ApicastStagingServiceMonitor() *monitoringv1.ServiceMonitor { + return &monitoringv1.ServiceMonitor{ + ObjectMeta: metav1.ObjectMeta{ + Name: "apicast-staging", + Labels: apicast.Options.StagingMonitoringLabels, + }, + Spec: monitoringv1.ServiceMonitorSpec{ + Endpoints: []monitoringv1.Endpoint{{ + Port: "metrics", + Path: "/metrics", + Scheme: "http", + }}, + Selector: metav1.LabelSelector{ + MatchLabels: apicast.Options.StagingMonitoringLabels, + }, + }, + } +} + +func ApicastMainAppGrafanaDashboard(ns string) *grafanav1alpha1.GrafanaDashboard { + data := &struct { + Namespace string + }{ + ns, + } + return &grafanav1alpha1.GrafanaDashboard{ + ObjectMeta: metav1.ObjectMeta{ + Name: "apicast-mainapp", + Labels: map[string]string{ + "monitoring-key": common.MonitoringKey, + }, + }, + Spec: grafanav1alpha1.GrafanaDashboardSpec{ + Json: assets.TemplateAsset("monitoring/apicast-grafana-dashboard-1.json.tpl", data), + Name: fmt.Sprintf("%s/apicast-grafana-dashboard-1.json", ns), + }, + } +} + +func ApicastServicesGrafanaDashboard(ns string) *grafanav1alpha1.GrafanaDashboard { + data := &struct { + Namespace string + }{ + ns, + } + return &grafanav1alpha1.GrafanaDashboard{ + ObjectMeta: metav1.ObjectMeta{ + Name: "apicast-services", + Labels: map[string]string{ + "monitoring-key": common.MonitoringKey, + }, + }, + Spec: grafanav1alpha1.GrafanaDashboardSpec{ + Json: assets.TemplateAsset("monitoring/apicast-grafana-dashboard-2.json.tpl", data), + Name: fmt.Sprintf("%s/apicast-grafana-dashboard-2.json", ns), + }, + } +} + +func ApicastPrometheusRules(ns string) *monitoringv1.PrometheusRule { + return &monitoringv1.PrometheusRule{ + ObjectMeta: metav1.ObjectMeta{ + Name: "apicast", + Labels: map[string]string{ + "monitoring-key": common.MonitoringKey, + "prometheus": "application-monitoring", + "role": "alert-rules", + }, + }, + Spec: monitoringv1.PrometheusRuleSpec{ + Groups: []monitoringv1.RuleGroup{ + { + Name: fmt.Sprintf("%s/apicast.rules", ns), + Rules: []monitoringv1.Rule{ + { + Alert: "ApicastRequestTime", + Annotations: map[string]string{ + "summary": "Request on instance {{ $labels.instance }} is taking more than one second to process the requests", + "description": "High number of request taking more than a second to be processed", + }, + Expr: intstr.FromString(fmt.Sprintf(`sum(rate(total_response_time_seconds_bucket{namespace='%s', pod=~'apicast-production.*'}[1m])) - sum(rate(upstream_response_time_seconds_bucket{namespace='%s', pod=~'apicast-production.*'}[1m])) > 1`, ns, ns)), + For: "2m", + Labels: map[string]string{ + "severity": "warning", + }, + }, + { + Alert: "APICastHttp4xxErrorRate", + Annotations: map[string]string{ + "summary": "APICast high HTTP 4XX error rate (instance {{ $labels.instance }})", + "description": "The number of request with 4XX is bigger than the 5% of total request.", + }, + Expr: intstr.FromString(fmt.Sprintf(`sum(rate(apicast_status{namespace='%s', status=~"^4.."}[1m])) / sum(rate(apicast_status{namespace='%s'}[1m])) * 100 > 5`, ns, ns)), + For: "5m", + Labels: map[string]string{ + "severity": "critical", + }, + }, + { + Alert: "APICAstLatencyHigh", + Annotations: map[string]string{ + "summary": "APICast latency high (instance {{ $labels.instance }})", + "description": "APIcast p99 latency is higher than 5 seconds\n VALUE = {{ $value }}\n LABELS: {{ $labels }}", + }, + Expr: intstr.FromString(fmt.Sprintf(`histogram_quantile(0.99, sum(rate(total_response_time_seconds_bucket{namespace='%s',}[30m])) by (le)) > 5`, ns)), + For: "5m", + Labels: map[string]string{ + "severity": "warning", + }, + }, + }, + }, + }, + }, + } +} diff --git a/pkg/3scale/amp/component/apicast_options.go b/pkg/3scale/amp/component/apicast_options.go index 6abd0362b..e74f12c71 100644 --- a/pkg/3scale/amp/component/apicast_options.go +++ b/pkg/3scale/amp/component/apicast_options.go @@ -7,10 +7,11 @@ import ( ) type ApicastOptions struct { - ManagementAPI string `validate:"required"` - OpenSSLVerify string `validate:"required"` - ResponseCodes string `validate:"required"` - ImageTag string `validate:"required"` + ManagementAPI string `validate:"required"` + OpenSSLVerify string `validate:"required"` + ResponseCodes string `validate:"required"` + ImageTag string `validate:"required"` + ExtendedMetrics bool ProductionResourceRequirements v1.ResourceRequirements `validate:"-"` StagingResourceRequirements v1.ResourceRequirements `validate:"-"` ProductionReplicas int32 @@ -24,6 +25,8 @@ type ApicastOptions struct { ProductionTolerations []v1.Toleration `validate:"-"` StagingAffinity *v1.Affinity `validate:"-"` StagingTolerations []v1.Toleration `validate:"-"` + StagingMonitoringLabels map[string]string `validate:"required"` + ProductionMonitoringLabels map[string]string `validate:"required"` } func NewApicastOptions() *ApicastOptions { diff --git a/pkg/3scale/amp/component/backend.go b/pkg/3scale/amp/component/backend.go index 142e4d7aa..bf5565a85 100644 --- a/pkg/3scale/amp/component/backend.go +++ b/pkg/3scale/amp/component/backend.go @@ -2,17 +2,23 @@ package component import ( "fmt" - - "k8s.io/api/policy/v1beta1" + "strconv" "github.com/3scale/3scale-operator/pkg/helper" + appsv1 "github.com/openshift/api/apps/v1" routev1 "github.com/openshift/api/route/v1" v1 "k8s.io/api/core/v1" + "k8s.io/api/policy/v1beta1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/intstr" ) +const ( + BackendListenerName = "backend-listener" + BackendWorkerName = "backend-worker" +) + const ( BackendSecretBackendRedisSecretName = "backend-redis" BackendSecretBackendRedisStorageURLFieldName = "REDIS_STORAGE_URL" @@ -35,6 +41,16 @@ const ( BackendSecretBackendListenerRouteEndpointFieldName = "route_endpoint" ) +const ( + BackendWorkerMetricsPort = 9421 + BackendListenerMetricsPort = 9394 +) + +var ( + BackendWorkerMetricsPortStr = strconv.FormatInt(BackendWorkerMetricsPort, 10) + BackendListenerMetricsPortStr = strconv.FormatInt(BackendListenerMetricsPort, 10) +) + type Backend struct { Options *BackendOptions } @@ -50,7 +66,7 @@ func (backend *Backend) WorkerDeploymentConfig() *appsv1.DeploymentConfig { APIVersion: "apps.openshift.io/v1", }, ObjectMeta: metav1.ObjectMeta{ - Name: "backend-worker", + Name: BackendWorkerName, Labels: backend.Options.CommonWorkerLabels, }, Spec: appsv1.DeploymentConfigSpec{ @@ -76,13 +92,13 @@ func (backend *Backend) WorkerDeploymentConfig() *appsv1.DeploymentConfig { Type: appsv1.DeploymentTriggerOnImageChange, ImageChangeParams: &appsv1.DeploymentTriggerImageChangeParams{ Automatic: true, - ContainerNames: []string{"backend-redis-svc", "backend-worker"}, + ContainerNames: []string{"backend-redis-svc", BackendWorkerName}, From: v1.ObjectReference{ Kind: "ImageStreamTag", Name: fmt.Sprintf("amp-backend:%s", backend.Options.ImageTag)}}}, }, Replicas: backend.Options.WorkerReplicas, - Selector: map[string]string{"deploymentConfig": "backend-worker"}, + Selector: map[string]string{"deploymentConfig": BackendWorkerName}, Template: &v1.PodTemplateSpec{ ObjectMeta: metav1.ObjectMeta{ Labels: backend.Options.WorkerPodTemplateLabels, @@ -104,7 +120,7 @@ func (backend *Backend) WorkerDeploymentConfig() *appsv1.DeploymentConfig { }, Containers: []v1.Container{ v1.Container{ - Name: "backend-worker", + Name: BackendWorkerName, Image: "amp-backend:latest", Args: []string{"bin/3scale_backend_worker", "run"}, Env: backend.buildBackendWorkerEnv(), @@ -199,7 +215,7 @@ func (backend *Backend) ListenerDeploymentConfig() *appsv1.DeploymentConfig { APIVersion: "apps.openshift.io/v1", }, ObjectMeta: metav1.ObjectMeta{ - Name: "backend-listener", + Name: BackendListenerName, Labels: backend.Options.CommonListenerLabels, }, Spec: appsv1.DeploymentConfigSpec{ @@ -225,13 +241,13 @@ func (backend *Backend) ListenerDeploymentConfig() *appsv1.DeploymentConfig { Type: appsv1.DeploymentTriggerOnImageChange, ImageChangeParams: &appsv1.DeploymentTriggerImageChangeParams{ Automatic: true, - ContainerNames: []string{"backend-listener"}, + ContainerNames: []string{BackendListenerName}, From: v1.ObjectReference{ Kind: "ImageStreamTag", Name: fmt.Sprintf("amp-backend:%s", backend.Options.ImageTag)}}}, }, Replicas: backend.Options.ListenerReplicas, - Selector: map[string]string{"deploymentConfig": "backend-listener"}, + Selector: map[string]string{"deploymentConfig": BackendListenerName}, Template: &v1.PodTemplateSpec{ ObjectMeta: metav1.ObjectMeta{ Labels: backend.Options.ListenerPodTemplateLabels, @@ -241,7 +257,7 @@ func (backend *Backend) ListenerDeploymentConfig() *appsv1.DeploymentConfig { Tolerations: backend.Options.ListenerTolerations, Containers: []v1.Container{ v1.Container{ - Name: "backend-listener", + Name: BackendListenerName, Image: "amp-backend:latest", Args: []string{"bin/3scale_backend", "start", "-e", "production", "-p", "3000", "-x", "/dev/stdout"}, Ports: []v1.ContainerPort{ @@ -292,7 +308,7 @@ func (backend *Backend) ListenerService() *v1.Service { APIVersion: "v1", }, ObjectMeta: metav1.ObjectMeta{ - Name: "backend-listener", + Name: BackendListenerName, Labels: backend.Options.CommonListenerLabels, }, Spec: v1.ServiceSpec{ @@ -307,7 +323,7 @@ func (backend *Backend) ListenerService() *v1.Service { }, }, }, - Selector: map[string]string{"deploymentConfig": "backend-listener"}, + Selector: map[string]string{"deploymentConfig": BackendListenerName}, }, } } @@ -326,7 +342,7 @@ func (backend *Backend) ListenerRoute() *routev1.Route { Host: "backend-" + backend.Options.TenantName + "." + backend.Options.WildcardDomain, To: routev1.RouteTargetReference{ Kind: "Service", - Name: "backend-listener", + Name: BackendListenerName, }, Port: &routev1.RoutePort{ TargetPort: intstr.FromString("http"), @@ -395,6 +411,14 @@ func (backend *Backend) buildBackendWorkerEnv() []v1.EnvVar { helper.EnvVarFromSecret("CONFIG_EVENTS_HOOK", "system-events-hook", "URL"), helper.EnvVarFromSecret("CONFIG_EVENTS_HOOK_SHARED_SECRET", "system-events-hook", "PASSWORD"), ) + + if backend.Options.WorkerMetrics { + result = append(result, + v1.EnvVar{Name: "CONFIG_WORKER_PROMETHEUS_METRICS_PORT", Value: BackendWorkerMetricsPortStr}, + v1.EnvVar{Name: "CONFIG_WORKER_PROMETHEUS_METRICS_ENABLED", Value: "true"}, + ) + } + return result } @@ -412,6 +436,13 @@ func (backend *Backend) buildBackendListenerEnv() []v1.EnvVar { helper.EnvVarFromSecret("CONFIG_INTERNAL_API_USER", BackendSecretInternalApiSecretName, BackendSecretInternalApiUsernameFieldName), helper.EnvVarFromSecret("CONFIG_INTERNAL_API_PASSWORD", BackendSecretInternalApiSecretName, BackendSecretInternalApiPasswordFieldName), ) + + if backend.Options.ListenerMetrics { + result = append(result, + v1.EnvVar{Name: "CONFIG_LISTENER_PROMETHEUS_METRICS_PORT", Value: BackendListenerMetricsPortStr}, + v1.EnvVar{Name: "CONFIG_LISTENER_PROMETHEUS_METRICS_ENABLED", Value: "true"}, + ) + } return result } @@ -458,12 +489,12 @@ func (backend *Backend) WorkerPodDisruptionBudget() *v1beta1.PodDisruptionBudget APIVersion: "policy/v1beta1", }, ObjectMeta: metav1.ObjectMeta{ - Name: "backend-worker", + Name: BackendWorkerName, Labels: backend.Options.CommonWorkerLabels, }, Spec: v1beta1.PodDisruptionBudgetSpec{ Selector: &metav1.LabelSelector{ - MatchLabels: map[string]string{"deploymentConfig": "backend-worker"}, + MatchLabels: map[string]string{"deploymentConfig": BackendWorkerName}, }, MaxUnavailable: &intstr.IntOrString{IntVal: PDB_MAX_UNAVAILABLE_POD_NUMBER}, }, @@ -496,12 +527,12 @@ func (backend *Backend) ListenerPodDisruptionBudget() *v1beta1.PodDisruptionBudg APIVersion: "policy/v1beta1", }, ObjectMeta: metav1.ObjectMeta{ - Name: "backend-listener", + Name: BackendListenerName, Labels: backend.Options.CommonListenerLabels, }, Spec: v1beta1.PodDisruptionBudgetSpec{ Selector: &metav1.LabelSelector{ - MatchLabels: map[string]string{"deploymentConfig": "backend-listener"}, + MatchLabels: map[string]string{"deploymentConfig": BackendListenerName}, }, MaxUnavailable: &intstr.IntOrString{IntVal: PDB_MAX_UNAVAILABLE_POD_NUMBER}, }, diff --git a/pkg/3scale/amp/component/backend_monitoring.go b/pkg/3scale/amp/component/backend_monitoring.go new file mode 100644 index 000000000..16b828b3e --- /dev/null +++ b/pkg/3scale/amp/component/backend_monitoring.go @@ -0,0 +1,153 @@ +package component + +import ( + "fmt" + + "github.com/3scale/3scale-operator/pkg/assets" + "github.com/3scale/3scale-operator/pkg/common" + monitoringv1 "github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1" + grafanav1alpha1 "github.com/integr8ly/grafana-operator/v3/pkg/apis/integreatly/v1alpha1" + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/intstr" +) + +func (backend *Backend) BackendListenerMonitoringService() *v1.Service { + return &v1.Service{ + TypeMeta: metav1.TypeMeta{ + Kind: "Service", + APIVersion: "v1", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "backend-listener-metrics", + Labels: backend.Options.ListenerMonitoringLabels, + }, + Spec: v1.ServiceSpec{ + Ports: []v1.ServicePort{ + v1.ServicePort{ + Name: "metrics", + Protocol: v1.ProtocolTCP, + Port: BackendListenerMetricsPort, + TargetPort: intstr.FromInt(BackendListenerMetricsPort), + }, + }, + Selector: map[string]string{"deploymentConfig": "backend-listener"}, + }, + } +} + +func (backend *Backend) BackendListenerServiceMonitor() *monitoringv1.ServiceMonitor { + return &monitoringv1.ServiceMonitor{ + ObjectMeta: metav1.ObjectMeta{ + Name: "backend-listener", + Labels: backend.Options.ListenerMonitoringLabels, + }, + Spec: monitoringv1.ServiceMonitorSpec{ + Endpoints: []monitoringv1.Endpoint{{ + Port: "metrics", + Path: "/metrics", + Scheme: "http", + }}, + Selector: metav1.LabelSelector{ + MatchLabels: backend.Options.ListenerMonitoringLabels, + }, + }, + } +} + +func (backend *Backend) BackendWorkerMonitoringService() *v1.Service { + return &v1.Service{ + TypeMeta: metav1.TypeMeta{ + Kind: "Service", + APIVersion: "v1", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "backend-worker-metrics", + Labels: backend.Options.WorkerMonitoringLabels, + }, + Spec: v1.ServiceSpec{ + Ports: []v1.ServicePort{ + v1.ServicePort{ + Name: "metrics", + Protocol: v1.ProtocolTCP, + Port: BackendWorkerMetricsPort, + TargetPort: intstr.FromInt(BackendWorkerMetricsPort), + }, + }, + Selector: map[string]string{"deploymentConfig": "backend-worker"}, + }, + } +} + +func (backend *Backend) BackendWorkerServiceMonitor() *monitoringv1.ServiceMonitor { + return &monitoringv1.ServiceMonitor{ + ObjectMeta: metav1.ObjectMeta{ + Name: "backend-worker", + Labels: backend.Options.WorkerMonitoringLabels, + }, + Spec: monitoringv1.ServiceMonitorSpec{ + Endpoints: []monitoringv1.Endpoint{{ + Port: "metrics", + Path: "/metrics", + Scheme: "http", + }}, + Selector: metav1.LabelSelector{ + MatchLabels: backend.Options.WorkerMonitoringLabels, + }, + }, + } +} + +func BackendGrafanaDashboard(ns string) *grafanav1alpha1.GrafanaDashboard { + data := &struct { + Namespace string + }{ + ns, + } + return &grafanav1alpha1.GrafanaDashboard{ + ObjectMeta: metav1.ObjectMeta{ + Name: "backend", + Labels: map[string]string{ + "monitoring-key": common.MonitoringKey, + }, + }, + Spec: grafanav1alpha1.GrafanaDashboardSpec{ + Json: assets.TemplateAsset("monitoring/backend-grafana-dashboard-1.json.tpl", data), + Name: fmt.Sprintf("%s/backend-grafana-dashboard-1.json", ns), + }, + } +} + +func BackendWorkerPrometheusRules(ns string) *monitoringv1.PrometheusRule { + return &monitoringv1.PrometheusRule{ + ObjectMeta: metav1.ObjectMeta{ + Name: "backend-worker", + Labels: map[string]string{ + "monitoring-key": common.MonitoringKey, + "prometheus": "application-monitoring", + "role": "alert-rules", + }, + }, + Spec: monitoringv1.PrometheusRuleSpec{ + Groups: []monitoringv1.RuleGroup{ + { + Name: fmt.Sprintf("%s/backend-worker.rules", ns), + Rules: []monitoringv1.Rule{ + { + Alert: "WorkersJobsCountRunningHigh", + Annotations: map[string]string{ + "summary": "{{$labels.container_name}} replica controller on {{$labels.namespace}}: Has more than 10000 jobs processed in the last 5 minutes", + "description": "{{$labels.container_name}} replica controller on {{$labels.namespace}} project: Has more than 1000 jobs processed in the last 5 minutes", + }, + Expr: intstr.FromString(fmt.Sprintf(`sum(avg_over_time(apisonator_worker_job_count{job="backend-worker-monitoring",namespace="%s"} [5m])) > 10000`, ns)), + For: "30m", + Labels: map[string]string{ + "severity": "critical", + }, + }, + }, + }, + }, + }, + } +} diff --git a/pkg/3scale/amp/component/backend_options.go b/pkg/3scale/amp/component/backend_options.go index ea4885c0a..f72422796 100644 --- a/pkg/3scale/amp/component/backend_options.go +++ b/pkg/3scale/amp/component/backend_options.go @@ -40,6 +40,10 @@ type BackendOptions struct { ListenerPodTemplateLabels map[string]string `validate:"required"` WorkerPodTemplateLabels map[string]string `validate:"required"` CronPodTemplateLabels map[string]string `validate:"required"` + ListenerMonitoringLabels map[string]string `validate:"required"` + WorkerMonitoringLabels map[string]string `validate:"required"` + WorkerMetrics bool + ListenerMetrics bool } func NewBackendOptions() *BackendOptions { diff --git a/pkg/3scale/amp/component/generic_monitoring.go b/pkg/3scale/amp/component/generic_monitoring.go new file mode 100644 index 000000000..36b2723a0 --- /dev/null +++ b/pkg/3scale/amp/component/generic_monitoring.go @@ -0,0 +1,151 @@ +package component + +import ( + "fmt" + + "github.com/3scale/3scale-operator/pkg/assets" + "github.com/3scale/3scale-operator/pkg/common" + monitoringv1 "github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1" + grafanav1alpha1 "github.com/integr8ly/grafana-operator/v3/pkg/apis/integreatly/v1alpha1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/intstr" +) + +func KubernetesResourcesByNamespaceGrafanaDashboard(ns string) *grafanav1alpha1.GrafanaDashboard { + data := &struct { + Namespace string + }{ + ns, + } + return &grafanav1alpha1.GrafanaDashboard{ + ObjectMeta: metav1.ObjectMeta{ + Name: "kubernetes-resources-by-namespace", + Labels: map[string]string{ + "monitoring-key": common.MonitoringKey, + }, + }, + Spec: grafanav1alpha1.GrafanaDashboardSpec{ + Json: assets.TemplateAsset("monitoring/kubernetes-resources-by-namespace-grafana-dashboard-1.json.tpl", data), + Name: fmt.Sprintf("%s/kubernetes-resources-by-namespace-grafana-dashboard-1.json", ns), + }, + } +} + +func KubernetesResourcesByPodGrafanaDashboard(ns string) *grafanav1alpha1.GrafanaDashboard { + data := &struct { + Namespace string + }{ + ns, + } + return &grafanav1alpha1.GrafanaDashboard{ + ObjectMeta: metav1.ObjectMeta{ + Name: "kubernetes-resources-by-pod", + Labels: map[string]string{ + "monitoring-key": common.MonitoringKey, + }, + }, + Spec: grafanav1alpha1.GrafanaDashboardSpec{ + Json: assets.TemplateAsset("monitoring/kubernetes-resources-by-pod-grafana-dashboard-1.json.tpl", data), + Name: fmt.Sprintf("%s/kubernetes-resources-by-pod-grafana-dashboard-1.json", ns), + }, + } +} + +func KubeStateMetricsPrometheusRules(ns string) *monitoringv1.PrometheusRule { + return &monitoringv1.PrometheusRule{ + ObjectMeta: metav1.ObjectMeta{ + Name: "threescale-kube-state-metrics", + Labels: map[string]string{ + "monitoring-key": common.MonitoringKey, + "prometheus": "application-monitoring", + "role": "alert-rules", + }, + }, + Spec: monitoringv1.PrometheusRuleSpec{ + Groups: []monitoringv1.RuleGroup{ + { + Name: fmt.Sprintf("%s/threescale-kube-state-metrics.rules", ns), + Rules: []monitoringv1.Rule{ + { + Alert: "ThreescalePodCrashLooping", + Annotations: map[string]string{ + "message": `Pod {{ $labels.namespace }}/{{ $labels.pod }} ({{ $labels.container }}) is restarting {{ printf "%.2f" $value }} times / 5 minutes.`, + }, + Expr: intstr.FromString(fmt.Sprintf(`rate(kube_pod_container_status_restarts_total{namespace="%s",pod=~"(apicast-.*|backend-.*|system-.*|zync-.*)"}[15m]) * 60 * 5 > 0`, ns)), + For: "5m", + Labels: map[string]string{ + "severity": "critical", + }, + }, + { + Alert: "ThreescalePodNotReady", + Annotations: map[string]string{ + "message": `Pod {{ $labels.namespace }}/{{ $labels.pod }} has been in a non-ready state for longer than 5 minutes.`, + }, + Expr: intstr.FromString(fmt.Sprintf(`sum by (namespace, pod) (max by(namespace, pod) (kube_pod_status_phase{namespace="%s",pod=~"(apicast-.*|backend-.*|system-.*|zync-.*)", phase=~"Pending|Unknown"}) * on(namespace, pod) group_left(owner_kind) max by(namespace, pod, owner_kind) (kube_pod_owner{namespace="%s",owner_kind!="Job"})) > 0`, ns, ns)), + For: "5m", + Labels: map[string]string{ + "severity": "critical", + }, + }, + { + Alert: "ThreescaleReplicationControllerReplicasMismatch", + Annotations: map[string]string{ + "message": `ReplicationController {{ $labels.namespace }}/{{ $labels.replicationcontroller }} has not matched the expected number of replicas for longer than 5 minutes.`, + }, + Expr: intstr.FromString(fmt.Sprintf(`kube_replicationcontroller_spec_replicas {namespace="%s",replicationcontroller=~"(apicast-.*|backend-.*|system-.*|zync-.*)"} != kube_replicationcontroller_status_ready_replicas {namespace="%s",replicationcontroller=~"(apicast-.*|backend-.*|system-.*|zync-.*)"}`, ns, ns)), + For: "5m", + Labels: map[string]string{ + "severity": "critical", + }, + }, + { + Alert: "ThreescaleContainerWaiting", + Annotations: map[string]string{ + "message": `Pod {{ $labels.namespace }}/{{ $labels.pod }} container {{ $labels.container }} has been in waiting state for longer than 1 hour.`, + }, + Expr: intstr.FromString(fmt.Sprintf(`sum by (namespace, pod, container) (kube_pod_container_status_waiting_reason{namespace="%s",pod=~"(apicast-.*|backend-.*|system-.*|zync-.*)"}) > 0`, ns)), + For: "1h", + Labels: map[string]string{ + "severity": "warning", + }, + }, + { + Alert: "ThreescaleContainerCPUHigh", + Annotations: map[string]string{ + "message": `Pod {{ $labels.namespace }}/{{ $labels.pod }} container {{ $labels.container }} has High CPU usage for longer than 15 minutes.`, + }, + Expr: intstr.FromString(fmt.Sprintf(`sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_rate{namespace="%s",pod=~"(apicast-.*|backend-.*|system-.*|zync-.*)"}) by (namespace, container, pod) / sum(kube_pod_container_resource_limits_cpu_cores{namespace="%s",pod=~"(apicast-.*|backend-.*|system-.*|zync-.*)"}) by (namespace, container, pod) * 100 > 90`, ns, ns)), + For: "15m", + Labels: map[string]string{ + "severity": "warning", + }, + }, + { + Alert: "ThreescaleContainerMemoryHigh", + Annotations: map[string]string{ + "message": `Pod {{ $labels.namespace }}/{{ $labels.pod }} container {{ $labels.container }} has High Memory usage for longer than 15 minutes.`, + }, + Expr: intstr.FromString(fmt.Sprintf(`sum(container_memory_usage_bytes{namespace="%s",container!="",pod=~"(apicast-.*|backend-.*|system-.*|zync-.*)"}) by(namespace, container, pod) / sum(kube_pod_container_resource_limits_memory_bytes{namespace="%s",pod=~"(apicast-.*|backend-.*|system-.*|zync-.*)"}) by(namespace, container, pod) * 100 > 90`, ns, ns)), + For: "15m", + Labels: map[string]string{ + "severity": "warning", + }, + }, + { + Alert: "ThreescaleContainerCPUThrottlingHigh", + Annotations: map[string]string{ + "message": `{{ $value | humanizePercentage }} throttling of CPU in namespace {{ $labels.namespace }} for container {{ $labels.container }} in pod {{ $labels.pod }}.`, + }, + Expr: intstr.FromString(fmt.Sprintf(`sum(increase(container_cpu_cfs_throttled_periods_total{namespace="%s",container!="",pod=~"(apicast-.*|backend-.*|system-.*|zync-.*)" }[5m])) by (container, pod, namespace) / sum(increase(container_cpu_cfs_periods_total{namespace="%s",pod=~"(apicast-.*|backend-.*|system-.*|zync-.*)"}[5m])) by (container, pod, namespace) > ( 25 / 100 )`, ns, ns)), + For: "15m", + Labels: map[string]string{ + "severity": "warning", + }, + }, + }, + }, + }, + }, + } +} diff --git a/pkg/3scale/amp/component/system_monitoring.go b/pkg/3scale/amp/component/system_monitoring.go new file mode 100644 index 000000000..f7c3db38e --- /dev/null +++ b/pkg/3scale/amp/component/system_monitoring.go @@ -0,0 +1,110 @@ +package component + +import ( + "fmt" + + "github.com/3scale/3scale-operator/pkg/assets" + "github.com/3scale/3scale-operator/pkg/common" + monitoringv1 "github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1" + grafanav1alpha1 "github.com/integr8ly/grafana-operator/v3/pkg/apis/integreatly/v1alpha1" + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/intstr" +) + +func (system *System) SystemSidekiqMonitoringService() *v1.Service { + return &v1.Service{ + TypeMeta: metav1.TypeMeta{ + Kind: "Service", + APIVersion: "v1", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "system-sidekiq-metrics", + Labels: system.Options.SidekiqMonitoringLabels, + }, + Spec: v1.ServiceSpec{ + Ports: []v1.ServicePort{ + v1.ServicePort{ + Name: "metrics", + Protocol: v1.ProtocolTCP, + Port: 9394, + TargetPort: intstr.FromInt(9394), + }, + }, + Selector: map[string]string{"deploymentConfig": "system-sidekiq"}, + }, + } +} + +func (system *System) SystemSidekiqServiceMonitor() *monitoringv1.ServiceMonitor { + return &monitoringv1.ServiceMonitor{ + ObjectMeta: metav1.ObjectMeta{ + Name: "system-sidekiq", + Labels: system.Options.SidekiqMonitoringLabels, + }, + Spec: monitoringv1.ServiceMonitorSpec{ + Endpoints: []monitoringv1.Endpoint{{ + Port: "metrics", + Path: "/metrics", + Scheme: "http", + }}, + Selector: metav1.LabelSelector{ + MatchLabels: system.Options.SidekiqMonitoringLabels, + }, + }, + } +} + +func SystemGrafanaDashboard(ns string) *grafanav1alpha1.GrafanaDashboard { + data := &struct { + Namespace string + }{ + ns, + } + return &grafanav1alpha1.GrafanaDashboard{ + ObjectMeta: metav1.ObjectMeta{ + Name: "system", + Labels: map[string]string{ + "monitoring-key": common.MonitoringKey, + }, + }, + Spec: grafanav1alpha1.GrafanaDashboardSpec{ + Json: assets.TemplateAsset("monitoring/system-grafana-dashboard-1.json.tpl", data), + Name: fmt.Sprintf("%s/system-grafana-dashboard-1.json", ns), + }, + } +} + +func SystemSidekiqPrometheusRules(ns string) *monitoringv1.PrometheusRule { + return &monitoringv1.PrometheusRule{ + ObjectMeta: metav1.ObjectMeta{ + Name: "system-sidekiq", + Labels: map[string]string{ + "monitoring-key": common.MonitoringKey, + "prometheus": "application-monitoring", + "role": "alert-rules", + }, + }, + Spec: monitoringv1.PrometheusRuleSpec{ + Groups: []monitoringv1.RuleGroup{ + { + Name: fmt.Sprintf("%s/system-sidekiq.rules", ns), + Rules: []monitoringv1.Rule{ + { + Alert: "SystemSidekiqZyncRuntime", + Annotations: map[string]string{ + "summary": "Rule example: Zync runtime average more than 300 seconds", + "description": "Rule example: Zync runtime average more than 300 seconds", + }, + Expr: intstr.FromString(fmt.Sprintf(`avg(sidekiq_job_runtime_seconds_sum{queue="zync",worker="ZyncWorker",namespace="%s"}) > 300`, ns)), + For: "10m", + Labels: map[string]string{ + "severity": "critical", + }, + }, + }, + }, + }, + }, + } +} diff --git a/pkg/3scale/amp/component/system_options.go b/pkg/3scale/amp/component/system_options.go index 362dfbcbe..13cdfc97d 100644 --- a/pkg/3scale/amp/component/system_options.go +++ b/pkg/3scale/amp/component/system_options.go @@ -92,6 +92,7 @@ type SystemOptions struct { SphinxPodTemplateLabels map[string]string `validate:"required"` MemcachedLabels map[string]string `validate:"required"` SMTPLabels map[string]string `validate:"required"` + SidekiqMonitoringLabels map[string]string `validate:"required"` } func NewSystemOptions() *SystemOptions { diff --git a/pkg/3scale/amp/component/zync_monitoring.go b/pkg/3scale/amp/component/zync_monitoring.go new file mode 100644 index 000000000..1de40635b --- /dev/null +++ b/pkg/3scale/amp/component/zync_monitoring.go @@ -0,0 +1,207 @@ +package component + +import ( + "fmt" + + "github.com/3scale/3scale-operator/pkg/assets" + "github.com/3scale/3scale-operator/pkg/common" + monitoringv1 "github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1" + grafanav1alpha1 "github.com/integr8ly/grafana-operator/v3/pkg/apis/integreatly/v1alpha1" + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/intstr" +) + +func (zync *Zync) ZyncMonitoringService() *v1.Service { + return &v1.Service{ + TypeMeta: metav1.TypeMeta{ + Kind: "Service", + APIVersion: "v1", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "zync-metrics", + Labels: zync.Options.ZyncMonitoringLabels, + }, + Spec: v1.ServiceSpec{ + Ports: []v1.ServicePort{ + v1.ServicePort{ + Name: "metrics", + Protocol: v1.ProtocolTCP, + Port: 9393, + TargetPort: intstr.FromInt(9393), + }, + }, + Selector: map[string]string{"deploymentConfig": "zync"}, + }, + } +} + +func (zync *Zync) ZyncQueMonitoringService() *v1.Service { + return &v1.Service{ + TypeMeta: metav1.TypeMeta{ + Kind: "Service", + APIVersion: "v1", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "zync-que-metrics", + Labels: zync.Options.ZyncQueMonitoringLabels, + }, + Spec: v1.ServiceSpec{ + Ports: []v1.ServicePort{ + v1.ServicePort{ + Name: "metrics", + Protocol: v1.ProtocolTCP, + Port: 9394, + TargetPort: intstr.FromInt(9394), + }, + }, + Selector: map[string]string{"deploymentConfig": "zync-que"}, + }, + } +} + +func (zync *Zync) ZyncServiceMonitor() *monitoringv1.ServiceMonitor { + return &monitoringv1.ServiceMonitor{ + ObjectMeta: metav1.ObjectMeta{ + Name: "zync", + Labels: zync.Options.ZyncMonitoringLabels, + }, + Spec: monitoringv1.ServiceMonitorSpec{ + Endpoints: []monitoringv1.Endpoint{{ + Port: "metrics", + Path: "/metrics", + Scheme: "http", + }}, + Selector: metav1.LabelSelector{ + MatchLabels: zync.Options.ZyncMonitoringLabels, + }, + }, + } +} + +func (zync *Zync) ZyncQueServiceMonitor() *monitoringv1.ServiceMonitor { + return &monitoringv1.ServiceMonitor{ + ObjectMeta: metav1.ObjectMeta{ + Name: "zync-que", + Labels: zync.Options.ZyncQueMonitoringLabels, + }, + Spec: monitoringv1.ServiceMonitorSpec{ + Endpoints: []monitoringv1.Endpoint{{ + Port: "metrics", + Path: "/metrics", + Scheme: "http", + }}, + Selector: metav1.LabelSelector{ + MatchLabels: zync.Options.ZyncQueMonitoringLabels, + }, + }, + } +} + +func ZyncGrafanaDashboard(ns string) *grafanav1alpha1.GrafanaDashboard { + data := &struct { + Namespace string + }{ + ns, + } + return &grafanav1alpha1.GrafanaDashboard{ + ObjectMeta: metav1.ObjectMeta{ + Name: "zync", + Labels: map[string]string{ + "monitoring-key": common.MonitoringKey, + }, + }, + Spec: grafanav1alpha1.GrafanaDashboardSpec{ + Json: assets.TemplateAsset("monitoring/zync-grafana-dashboard-1.json.tpl", data), + Name: fmt.Sprintf("%s/zync-grafana-dashboard-1.json", ns), + }, + } +} + +func ZyncQueGrafanaDashboard(ns string) *grafanav1alpha1.GrafanaDashboard { + data := &struct { + Namespace string + }{ + ns, + } + return &grafanav1alpha1.GrafanaDashboard{ + ObjectMeta: metav1.ObjectMeta{ + Name: "zync-que", + Labels: map[string]string{ + "monitoring-key": common.MonitoringKey, + }, + }, + Spec: grafanav1alpha1.GrafanaDashboardSpec{ + Json: assets.TemplateAsset("monitoring/zync-que-grafana-dashboard-1.json.tpl", data), + Name: fmt.Sprintf("%s/zync-que-grafana-dashboard-1.json", ns), + }, + } +} + +func ZyncPrometheusRules(ns string) *monitoringv1.PrometheusRule { + return &monitoringv1.PrometheusRule{ + ObjectMeta: metav1.ObjectMeta{ + Name: "zync", + Labels: map[string]string{ + "monitoring-key": common.MonitoringKey, + "prometheus": "application-monitoring", + "role": "alert-rules", + }, + }, + Spec: monitoringv1.PrometheusRuleSpec{ + Groups: []monitoringv1.RuleGroup{ + { + Name: fmt.Sprintf("%s/zync.rules", ns), + Rules: []monitoringv1.Rule{ + { + Alert: "PumaWorkersRunningLow", + Annotations: map[string]string{ + "summary": "{{$labels.container_name}} replica controller on {{$labels.namespace}}: Has less than 5 puma workers in the last 5 minutes", + "description": "{{$labels.container_name}} replica controller on {{$labels.namespace}} project: Has less than 5 puma workers in the last 5 minutes", + }, + Expr: intstr.FromString(fmt.Sprintf(`avg_over_time(puma_running{job="zync-monitoring",namespace="%s"} [5m]) < 5`, ns)), + For: "30m", + Labels: map[string]string{ + "severity": "critical", + }, + }, + }, + }, + }, + }, + } +} + +func ZyncQuePrometheusRules(ns string) *monitoringv1.PrometheusRule { + return &monitoringv1.PrometheusRule{ + ObjectMeta: metav1.ObjectMeta{ + Name: "zync-que", + Labels: map[string]string{ + "monitoring-key": common.MonitoringKey, + "prometheus": "application-monitoring", + "role": "alert-rules", + }, + }, + Spec: monitoringv1.PrometheusRuleSpec{ + Groups: []monitoringv1.RuleGroup{ + { + Name: fmt.Sprintf("%s/zync-que.rules", ns), + Rules: []monitoringv1.Rule{ + { + Alert: "QueWorkersRunningLow", + Annotations: map[string]string{ + "summary": "{{$labels.container_name}} replica controller on {{$labels.namespace}}: Has less than 5 que workers in the last 5 minutes", + "description": "{{$labels.container_name}} replica controller on {{$labels.namespace}} project: Has less than 5 que workers in the last 5 minutes", + }, + Expr: intstr.FromString(fmt.Sprintf(`avg_over_time(que_workers_total{job="zync-que-monitoring",namespace="%s"} [5m]) < 5`, ns)), + For: "30m", + Labels: map[string]string{ + "severity": "critical", + }, + }, + }, + }, + }, + }, + } +} diff --git a/pkg/3scale/amp/component/zync_options.go b/pkg/3scale/amp/component/zync_options.go index a51da84e5..a7012ca7b 100644 --- a/pkg/3scale/amp/component/zync_options.go +++ b/pkg/3scale/amp/component/zync_options.go @@ -37,6 +37,9 @@ type ZyncOptions struct { ZyncPodTemplateLabels map[string]string `validate:"required"` ZyncQuePodTemplateLabels map[string]string `validate:"required"` ZyncDatabasePodTemplateLabels map[string]string `validate:"required"` + + ZyncMonitoringLabels map[string]string `validate:"required"` + ZyncQueMonitoringLabels map[string]string `validate:"required"` } func NewZyncOptions() *ZyncOptions { diff --git a/pkg/3scale/amp/operator/ampimages_reconciler_test.go b/pkg/3scale/amp/operator/ampimages_reconciler_test.go index 41bc017b8..11444ee04 100644 --- a/pkg/3scale/amp/operator/ampimages_reconciler_test.go +++ b/pkg/3scale/amp/operator/ampimages_reconciler_test.go @@ -14,6 +14,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" + fakeclientset "k8s.io/client-go/kubernetes/fake" "k8s.io/client-go/kubernetes/scheme" "sigs.k8s.io/controller-runtime/pkg/client/fake" logf "sigs.k8s.io/controller-runtime/pkg/log" @@ -64,8 +65,8 @@ func TestAMPImagesReconciler(t *testing.T) { // Create a fake client to mock API calls. cl := fake.NewFakeClient(objs...) clientAPIReader := fake.NewFakeClient(objs...) - - baseReconciler := reconcilers.NewBaseReconciler(cl, s, clientAPIReader, ctx, log) + clientset := fakeclientset.NewSimpleClientset() + baseReconciler := reconcilers.NewBaseReconciler(cl, s, clientAPIReader, ctx, log, clientset.Discovery()) baseAPIManagerLogicReconciler := NewBaseAPIManagerLogicReconciler(baseReconciler, apimanager) imagesReconciler := NewAMPImagesReconciler(baseAPIManagerLogicReconciler) diff --git a/pkg/3scale/amp/operator/apicast_options_provider.go b/pkg/3scale/amp/operator/apicast_options_provider.go index 8b5c70b08..11f196fe2 100644 --- a/pkg/3scale/amp/operator/apicast_options_provider.go +++ b/pkg/3scale/amp/operator/apicast_options_provider.go @@ -6,6 +6,7 @@ import ( "github.com/3scale/3scale-operator/pkg/3scale/amp/component" "github.com/3scale/3scale-operator/pkg/3scale/amp/product" + "github.com/3scale/3scale-operator/pkg/common" "github.com/3scale/3scale-operator/pkg/helper" appsv1alpha1 "github.com/3scale/3scale-operator/pkg/apis/apps/v1alpha1" @@ -34,11 +35,14 @@ func (a *ApicastOptionsProvider) GetApicastOptions() (*component.ApicastOptions, a.apicastOptions.ImageTag = product.ThreescaleRelease a.apicastOptions.OpenSSLVerify = strconv.FormatBool(*a.apimanager.Spec.Apicast.OpenSSLVerify) a.apicastOptions.ResponseCodes = strconv.FormatBool(*a.apimanager.Spec.Apicast.IncludeResponseCodes) + a.apicastOptions.ExtendedMetrics = true a.apicastOptions.CommonLabels = a.commonLabels() a.apicastOptions.CommonStagingLabels = a.commonStagingLabels() a.apicastOptions.CommonProductionLabels = a.commonProductionLabels() a.apicastOptions.StagingPodTemplateLabels = a.stagingPodTemplateLabels(imageOpts.ApicastImage) a.apicastOptions.ProductionPodTemplateLabels = a.productionPodTemplateLabels(imageOpts.ApicastImage) + a.apicastOptions.StagingMonitoringLabels = a.stagingMonitoringLabels() + a.apicastOptions.ProductionMonitoringLabels = a.productionMonitoringLabels() a.setResourceRequirementsOptions() a.setNodeAffinityAndTolerationsOptions() @@ -115,3 +119,15 @@ func (a *ApicastOptionsProvider) productionPodTemplateLabels(image string) map[s return labels } + +func (a *ApicastOptionsProvider) stagingMonitoringLabels() map[string]string { + labels := a.commonStagingLabels() + labels["monitoring-key"] = common.MonitoringKey + return labels +} + +func (a *ApicastOptionsProvider) productionMonitoringLabels() map[string]string { + labels := a.commonProductionLabels() + labels["monitoring-key"] = common.MonitoringKey + return labels +} diff --git a/pkg/3scale/amp/operator/apicast_options_provider_test.go b/pkg/3scale/amp/operator/apicast_options_provider_test.go index a4d69219a..eceff9723 100644 --- a/pkg/3scale/amp/operator/apicast_options_provider_test.go +++ b/pkg/3scale/amp/operator/apicast_options_provider_test.go @@ -89,6 +89,25 @@ func testApicastProductionTolerations() []v1.Toleration { return getTestTolerations("apicast-production") } +func testApicastStagingMonitoringLabels() map[string]string { + return map[string]string{ + "app": appLabel, + "threescale_component": "apicast", + "threescale_component_element": "staging", + "monitoring-key": "middleware", + } +} + +func testApicastProductionMonitoringLabels() map[string]string { + return map[string]string{ + "app": appLabel, + "threescale_component": "apicast", + "threescale_component_element": "production", + "monitoring-key": "middleware", + } +} + + func basicApimanagerTestApicastOptions() *appsv1alpha1.APIManager { tmpApicastManagementAPI := apicastManagementAPI tmpOpenSSLVerify := openSSLVerify @@ -117,6 +136,7 @@ func defaultApicastOptions() *component.ApicastOptions { OpenSSLVerify: strconv.FormatBool(openSSLVerify), ResponseCodes: strconv.FormatBool(responseCodes), ImageTag: product.ThreescaleRelease, + ExtendedMetrics: true, ProductionResourceRequirements: component.DefaultProductionResourceRequirements(), StagingResourceRequirements: component.DefaultStagingResourceRequirements(), ProductionReplicas: int32(productionReplicaCount), @@ -126,6 +146,8 @@ func defaultApicastOptions() *component.ApicastOptions { CommonProductionLabels: testApicastProductionLabels(), StagingPodTemplateLabels: testApicastStagingPodLabels(), ProductionPodTemplateLabels: testApicastProductionPodLabels(), + StagingMonitoringLabels: testApicastStagingMonitoringLabels(), + ProductionMonitoringLabels: testApicastProductionMonitoringLabels(), } } diff --git a/pkg/3scale/amp/operator/apicast_reconciler.go b/pkg/3scale/amp/operator/apicast_reconciler.go index 8abc7fc7d..115a6ee60 100644 --- a/pkg/3scale/amp/operator/apicast_reconciler.go +++ b/pkg/3scale/amp/operator/apicast_reconciler.go @@ -7,6 +7,7 @@ import ( appsv1alpha1 "github.com/3scale/3scale-operator/pkg/apis/apps/v1alpha1" "github.com/3scale/3scale-operator/pkg/common" "github.com/3scale/3scale-operator/pkg/reconcilers" + v1 "k8s.io/api/core/v1" "sigs.k8s.io/controller-runtime/pkg/reconcile" ) @@ -96,6 +97,41 @@ func (r *ApicastReconciler) Reconcile() (reconcile.Result, error) { return reconcile.Result{}, err } + err = r.ReconcileMonitoringService(apicast.ApicastStagingMonitoringService(), reconcilers.CreateOnlyMutator) + if err != nil { + return reconcile.Result{}, err + } + + err = r.ReconcileMonitoringService(apicast.ApicastProductionMonitoringService(), reconcilers.CreateOnlyMutator) + if err != nil { + return reconcile.Result{}, err + } + + err = r.ReconcileGrafanaDashboard(component.ApicastMainAppGrafanaDashboard(r.apiManager.Namespace), reconcilers.CreateOnlyMutator) + if err != nil { + return reconcile.Result{}, err + } + + err = r.ReconcileGrafanaDashboard(component.ApicastServicesGrafanaDashboard(r.apiManager.Namespace), reconcilers.CreateOnlyMutator) + if err != nil { + return reconcile.Result{}, err + } + + err = r.ReconcilePrometheusRules(component.ApicastPrometheusRules(r.apiManager.Namespace), reconcilers.CreateOnlyMutator) + if err != nil { + return reconcile.Result{}, err + } + + err = r.ReconcileServiceMonitor(apicast.ApicastProductionServiceMonitor(), reconcilers.CreateOnlyMutator) + if err != nil { + return reconcile.Result{}, err + } + + err = r.ReconcileServiceMonitor(apicast.ApicastStagingServiceMonitor(), reconcilers.CreateOnlyMutator) + if err != nil { + return reconcile.Result{}, err + } + return reconcile.Result{}, nil } diff --git a/pkg/3scale/amp/operator/apicast_reconciler_test.go b/pkg/3scale/amp/operator/apicast_reconciler_test.go index 002efc820..164e41fbc 100644 --- a/pkg/3scale/amp/operator/apicast_reconciler_test.go +++ b/pkg/3scale/amp/operator/apicast_reconciler_test.go @@ -4,17 +4,20 @@ import ( "context" "testing" - "k8s.io/api/policy/v1beta1" - appsv1alpha1 "github.com/3scale/3scale-operator/pkg/apis/apps/v1alpha1" "github.com/3scale/3scale-operator/pkg/reconcilers" + + monitoringv1 "github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1" + grafanav1alpha1 "github.com/integr8ly/grafana-operator/v3/pkg/apis/integreatly/v1alpha1" appsv1 "github.com/openshift/api/apps/v1" imagev1 "github.com/openshift/api/image/v1" routev1 "github.com/openshift/api/route/v1" v1 "k8s.io/api/core/v1" + "k8s.io/api/policy/v1beta1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" + fakeclientset "k8s.io/client-go/kubernetes/fake" "k8s.io/client-go/kubernetes/scheme" "sigs.k8s.io/controller-runtime/pkg/client/fake" logf "sigs.k8s.io/controller-runtime/pkg/log" @@ -78,12 +81,19 @@ func TestApicastReconciler(t *testing.T) { if err != nil { t.Fatal(err) } + if err := monitoringv1.AddToScheme(s); err != nil { + t.Fatal(err) + } + if err := grafanav1alpha1.AddToScheme(s); err != nil { + t.Fatal(err) + } // Create a fake client to mock API calls. cl := fake.NewFakeClient(objs...) clientAPIReader := fake.NewFakeClient(objs...) + clientset := fakeclientset.NewSimpleClientset() - baseReconciler := reconcilers.NewBaseReconciler(cl, s, clientAPIReader, ctx, log) + baseReconciler := reconcilers.NewBaseReconciler(cl, s, clientAPIReader, ctx, log, clientset.Discovery()) baseAPIManagerLogicReconciler := NewBaseAPIManagerLogicReconciler(baseReconciler, apimanager) apicastReconciler := NewApicastReconciler(baseAPIManagerLogicReconciler) diff --git a/pkg/3scale/amp/operator/backend_options_provider.go b/pkg/3scale/amp/operator/backend_options_provider.go index 92ca6719c..677840b14 100644 --- a/pkg/3scale/amp/operator/backend_options_provider.go +++ b/pkg/3scale/amp/operator/backend_options_provider.go @@ -6,6 +6,7 @@ import ( "github.com/3scale/3scale-operator/pkg/3scale/amp/component" "github.com/3scale/3scale-operator/pkg/3scale/amp/product" appsv1alpha1 "github.com/3scale/3scale-operator/pkg/apis/apps/v1alpha1" + "github.com/3scale/3scale-operator/pkg/common" "github.com/3scale/3scale-operator/pkg/helper" v1 "k8s.io/api/core/v1" @@ -55,6 +56,11 @@ func (o *OperatorBackendOptionsProvider) GetBackendOptions() (*component.Backend o.backendOptions.ListenerPodTemplateLabels = o.listenerPodTemplateLabels(imageOpts.BackendImage) o.backendOptions.WorkerPodTemplateLabels = o.workerPodTemplateLabels(imageOpts.BackendImage) o.backendOptions.CronPodTemplateLabels = o.cronPodTemplateLabels(imageOpts.BackendImage) + o.backendOptions.ListenerMonitoringLabels = o.listenerMonitoringLabels() + o.backendOptions.WorkerMonitoringLabels = o.workerMonitoringLabels() + + o.backendOptions.WorkerMetrics = true + o.backendOptions.ListenerMetrics = true err = o.backendOptions.Validate() if err != nil { @@ -230,3 +236,15 @@ func (o *OperatorBackendOptionsProvider) cronPodTemplateLabels(image string) map return labels } + +func (o *OperatorBackendOptionsProvider) listenerMonitoringLabels() map[string]string { + labels := o.commonListenerLabels() + labels["monitoring-key"] = common.MonitoringKey + return labels +} + +func (o *OperatorBackendOptionsProvider) workerMonitoringLabels() map[string]string { + labels := o.commonWorkerLabels() + labels["monitoring-key"] = common.MonitoringKey + return labels +} diff --git a/pkg/3scale/amp/operator/backend_options_provider_test.go b/pkg/3scale/amp/operator/backend_options_provider_test.go index 49f256579..29a3ef203 100644 --- a/pkg/3scale/amp/operator/backend_options_provider_test.go +++ b/pkg/3scale/amp/operator/backend_options_provider_test.go @@ -119,6 +119,25 @@ func testBackendCronTolerations() []v1.Toleration { return getTestTolerations("backend-cron") } +func testBackendMonitoringListenerLabels() map[string]string { + return map[string]string{ + "app": appLabel, + "threescale_component": "backend", + "threescale_component_element": "listener", + "monitoring-key": "middleware", + } +} + +func testBackendMonitoringWorkerLabels() map[string]string { + return map[string]string{ + "app": appLabel, + "threescale_component": "backend", + "threescale_component_element": "worker", + "monitoring-key": "middleware", + } +} + + func getInternalSecret() *v1.Secret { data := map[string]string{ component.BackendSecretInternalApiUsernameFieldName: "someUserName", @@ -188,6 +207,10 @@ func defaultBackendOptions(opts *component.BackendOptions) *component.BackendOpt ListenerPodTemplateLabels: testBackendListenerPodLabels(), WorkerPodTemplateLabels: testBackendWorkerPodLabels(), CronPodTemplateLabels: testBackendCronPodLabels(), + ListenerMonitoringLabels: testBackendMonitoringListenerLabels(), + WorkerMonitoringLabels: testBackendMonitoringWorkerLabels(), + WorkerMetrics: true, + ListenerMetrics: true, } } diff --git a/pkg/3scale/amp/operator/backend_reconciler.go b/pkg/3scale/amp/operator/backend_reconciler.go index df6586da0..f4fdeda62 100644 --- a/pkg/3scale/amp/operator/backend_reconciler.go +++ b/pkg/3scale/amp/operator/backend_reconciler.go @@ -96,6 +96,36 @@ func (r *BackendReconciler) Reconcile() (reconcile.Result, error) { return reconcile.Result{}, err } + err = r.ReconcileMonitoringService(backend.BackendWorkerMonitoringService(), reconcilers.CreateOnlyMutator) + if err != nil { + return reconcile.Result{}, err + } + + err = r.ReconcileServiceMonitor(backend.BackendWorkerServiceMonitor(), reconcilers.CreateOnlyMutator) + if err != nil { + return reconcile.Result{}, err + } + + err = r.ReconcileMonitoringService(backend.BackendListenerMonitoringService(), reconcilers.CreateOnlyMutator) + if err != nil { + return reconcile.Result{}, err + } + + err = r.ReconcileServiceMonitor(backend.BackendListenerServiceMonitor(), reconcilers.CreateOnlyMutator) + if err != nil { + return reconcile.Result{}, err + } + + err = r.ReconcileGrafanaDashboard(component.BackendGrafanaDashboard(r.apiManager.Namespace), reconcilers.CreateOnlyMutator) + if err != nil { + return reconcile.Result{}, err + } + + err = r.ReconcilePrometheusRules(component.BackendWorkerPrometheusRules(r.apiManager.Namespace), reconcilers.CreateOnlyMutator) + if err != nil { + return reconcile.Result{}, err + } + return reconcile.Result{}, nil } diff --git a/pkg/3scale/amp/operator/backend_reconciler_test.go b/pkg/3scale/amp/operator/backend_reconciler_test.go index e64002c49..e6a1eb097 100644 --- a/pkg/3scale/amp/operator/backend_reconciler_test.go +++ b/pkg/3scale/amp/operator/backend_reconciler_test.go @@ -4,18 +4,19 @@ import ( "context" "testing" - "k8s.io/api/policy/v1beta1" - "github.com/3scale/3scale-operator/pkg/3scale/amp/component" appsv1alpha1 "github.com/3scale/3scale-operator/pkg/apis/apps/v1alpha1" "github.com/3scale/3scale-operator/pkg/reconcilers" + appsv1 "github.com/openshift/api/apps/v1" imagev1 "github.com/openshift/api/image/v1" routev1 "github.com/openshift/api/route/v1" v1 "k8s.io/api/core/v1" + "k8s.io/api/policy/v1beta1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" + fakeclientset "k8s.io/client-go/kubernetes/fake" "k8s.io/client-go/kubernetes/scheme" "sigs.k8s.io/controller-runtime/pkg/client/fake" logf "sigs.k8s.io/controller-runtime/pkg/log" @@ -76,8 +77,9 @@ func TestNewBackendReconciler(t *testing.T) { // Create a fake client to mock API calls. cl := fake.NewFakeClient(objs...) clientAPIReader := fake.NewFakeClient(objs...) + clientset := fakeclientset.NewSimpleClientset() - baseReconciler := reconcilers.NewBaseReconciler(cl, s, clientAPIReader, ctx, log) + baseReconciler := reconcilers.NewBaseReconciler(cl, s, clientAPIReader, ctx, log, clientset.Discovery()) BaseAPIManagerLogicReconciler := NewBaseAPIManagerLogicReconciler(baseReconciler, apimanager) backendReconciler := NewBackendReconciler(BaseAPIManagerLogicReconciler) diff --git a/pkg/3scale/amp/operator/base_apimanager_logic_reconciler.go b/pkg/3scale/amp/operator/base_apimanager_logic_reconciler.go index 2dfb446a9..58bd89b5a 100644 --- a/pkg/3scale/amp/operator/base_apimanager_logic_reconciler.go +++ b/pkg/3scale/amp/operator/base_apimanager_logic_reconciler.go @@ -1,18 +1,20 @@ package operator import ( - v1 "k8s.io/api/core/v1" - "k8s.io/api/policy/v1beta1" - appsv1alpha1 "github.com/3scale/3scale-operator/pkg/apis/apps/v1alpha1" "github.com/3scale/3scale-operator/pkg/common" "github.com/3scale/3scale-operator/pkg/helper" "github.com/3scale/3scale-operator/pkg/reconcilers" + "github.com/operator-framework/operator-sdk/pkg/k8sutil" + monitoringv1 "github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1" "github.com/go-logr/logr" + grafanav1alpha1 "github.com/integr8ly/grafana-operator/v3/pkg/apis/integreatly/v1alpha1" appsv1 "github.com/openshift/api/apps/v1" imagev1 "github.com/openshift/api/image/v1" routev1 "github.com/openshift/api/route/v1" + v1 "k8s.io/api/core/v1" + "k8s.io/api/policy/v1beta1" rbacv1 "k8s.io/api/rbac/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" @@ -113,6 +115,81 @@ func (r *BaseAPIManagerLogicReconciler) ReconcileRoleBinding(desired *rbacv1.Rol return r.ReconcileResource(&rbacv1.RoleBinding{}, desired, mutateFn) } +func (r *BaseAPIManagerLogicReconciler) ReconcileMonitoringService(desired *v1.Service, mutateFn reconcilers.MutateFn) error { + if !r.apiManager.IsMonitoringEnabled() { + common.TagObjectToDelete(desired) + } + return r.ReconcileResource(&v1.Service{}, desired, mutateFn) +} + +func (r *BaseAPIManagerLogicReconciler) ReconcileGrafanaDashboard(desired *grafanav1alpha1.GrafanaDashboard, mutateFn reconcilers.MutateFn) error { + kindExists, err := r.hasGrafanaDashboards() + if err != nil { + return err + } + + if !kindExists { + r.Logger().Info("Install grafana-operator in your cluster to create grafanadashboards objects", "Error creating grafanadashboard object", desired.Name) + return nil + } + + if !r.apiManager.IsMonitoringEnabled() { + common.TagObjectToDelete(desired) + } + return r.ReconcileResource(&grafanav1alpha1.GrafanaDashboard{}, desired, mutateFn) +} + +func (r *BaseAPIManagerLogicReconciler) hasGrafanaDashboards() (bool, error) { + return k8sutil.ResourceExists(r.DiscoveryClient(), + grafanav1alpha1.SchemeGroupVersion.String(), + grafanav1alpha1.GrafanaDashboardKind) +} + +func (r *BaseAPIManagerLogicReconciler) ReconcilePrometheusRules(desired *monitoringv1.PrometheusRule, mutateFn reconcilers.MutateFn) error { + kindExists, err := r.hasPrometheusRules() + if err != nil { + return err + } + if !kindExists { + r.Logger().Info("Install prometheus-operator in your cluster to create prometheusrules objects", "Error creating prometheusrule object", desired.Name) + return nil + } + + if !r.apiManager.IsMonitoringEnabled() { + common.TagObjectToDelete(desired) + } + return r.ReconcileResource(&monitoringv1.PrometheusRule{}, desired, mutateFn) +} + +func (r *BaseAPIManagerLogicReconciler) hasPrometheusRules() (bool, error) { + return k8sutil.ResourceExists(r.DiscoveryClient(), + monitoringv1.SchemeGroupVersion.String(), + monitoringv1.PrometheusRuleKind) +} + +func (r *BaseAPIManagerLogicReconciler) ReconcileServiceMonitor(desired *monitoringv1.ServiceMonitor, mutateFn reconcilers.MutateFn) error { + kindExists, err := r.hasServiceMonitors() + if err != nil { + return err + } + + if !kindExists { + r.Logger().Info("Install prometheus-operator in your cluster to create servicemonitor objects", "Error creating servicemonitor object", desired.Name) + return nil + } + + if !r.apiManager.IsMonitoringEnabled() { + common.TagObjectToDelete(desired) + } + return r.ReconcileResource(&monitoringv1.ServiceMonitor{}, desired, mutateFn) +} + +func (r *BaseAPIManagerLogicReconciler) hasServiceMonitors() (bool, error) { + return k8sutil.ResourceExists(r.DiscoveryClient(), + monitoringv1.SchemeGroupVersion.String(), + monitoringv1.ServiceMonitorsKind) +} + func (r *BaseAPIManagerLogicReconciler) ReconcileResource(obj, desired common.KubernetesObject, mutatefn reconcilers.MutateFn) error { desired.SetNamespace(r.apiManager.GetNamespace()) if err := r.setOwnerReference(desired); err != nil { diff --git a/pkg/3scale/amp/operator/base_apimanager_logic_reconciler_test.go b/pkg/3scale/amp/operator/base_apimanager_logic_reconciler_test.go index 68732632b..225c6407d 100644 --- a/pkg/3scale/amp/operator/base_apimanager_logic_reconciler_test.go +++ b/pkg/3scale/amp/operator/base_apimanager_logic_reconciler_test.go @@ -11,6 +11,7 @@ import ( v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" + fakeclientset "k8s.io/client-go/kubernetes/fake" "k8s.io/client-go/kubernetes/scheme" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client/fake" @@ -48,8 +49,9 @@ func TestBaseAPIManagerLogicReconcilerUpdateOwnerRef(t *testing.T) { // Create a fake client to mock API calls. cl := fake.NewFakeClient(objs...) clientAPIReader := fake.NewFakeClient(objs...) + clientset := fakeclientset.NewSimpleClientset() - baseReconciler := reconcilers.NewBaseReconciler(cl, s, clientAPIReader, ctx, log) + baseReconciler := reconcilers.NewBaseReconciler(cl, s, clientAPIReader, ctx, log, clientset.Discovery()) apimanagerLogicReconciler := NewBaseAPIManagerLogicReconciler(baseReconciler, apimanager) desiredConfigmap := &v1.ConfigMap{ diff --git a/pkg/3scale/amp/operator/generic_monitoring_reconciler.go b/pkg/3scale/amp/operator/generic_monitoring_reconciler.go new file mode 100644 index 000000000..721200e34 --- /dev/null +++ b/pkg/3scale/amp/operator/generic_monitoring_reconciler.go @@ -0,0 +1,37 @@ +package operator + +import ( + "github.com/3scale/3scale-operator/pkg/3scale/amp/component" + "github.com/3scale/3scale-operator/pkg/reconcilers" + + "sigs.k8s.io/controller-runtime/pkg/reconcile" +) + +type GenericMonitoringReconciler struct { + *BaseAPIManagerLogicReconciler +} + +func NewGenericMonitoringReconciler(baseAPIManagerLogicReconciler *BaseAPIManagerLogicReconciler) *GenericMonitoringReconciler { + return &GenericMonitoringReconciler{ + BaseAPIManagerLogicReconciler: baseAPIManagerLogicReconciler, + } +} + +func (r *GenericMonitoringReconciler) Reconcile() (reconcile.Result, error) { + err := r.ReconcileGrafanaDashboard(component.KubernetesResourcesByNamespaceGrafanaDashboard(r.apiManager.Namespace), reconcilers.CreateOnlyMutator) + if err != nil { + return reconcile.Result{}, err + } + + err = r.ReconcileGrafanaDashboard(component.KubernetesResourcesByPodGrafanaDashboard(r.apiManager.Namespace), reconcilers.CreateOnlyMutator) + if err != nil { + return reconcile.Result{}, err + } + + err = r.ReconcilePrometheusRules(component.KubeStateMetricsPrometheusRules(r.apiManager.Namespace), reconcilers.CreateOnlyMutator) + if err != nil { + return reconcile.Result{}, err + } + + return reconcile.Result{}, nil +} diff --git a/pkg/3scale/amp/operator/memcached_reconciler_test.go b/pkg/3scale/amp/operator/memcached_reconciler_test.go index 80c3ba076..8375fa535 100644 --- a/pkg/3scale/amp/operator/memcached_reconciler_test.go +++ b/pkg/3scale/amp/operator/memcached_reconciler_test.go @@ -6,9 +6,11 @@ import ( appsv1alpha1 "github.com/3scale/3scale-operator/pkg/apis/apps/v1alpha1" "github.com/3scale/3scale-operator/pkg/reconcilers" + appsv1 "github.com/openshift/api/apps/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" + fakeclientset "k8s.io/client-go/kubernetes/fake" "k8s.io/client-go/kubernetes/scheme" "sigs.k8s.io/controller-runtime/pkg/client/fake" logf "sigs.k8s.io/controller-runtime/pkg/log" @@ -16,7 +18,9 @@ import ( func TestMemcachedDCReconciler(t *testing.T) { log := logf.Log.WithName("operator_test") + ctx := context.TODO() + apimanager := basicApimanager() s := scheme.Scheme s.AddKnownTypes(appsv1alpha1.SchemeGroupVersion, apimanager) @@ -31,8 +35,9 @@ func TestMemcachedDCReconciler(t *testing.T) { // Create a fake client to mock API calls. cl := fake.NewFakeClient(objs...) clientAPIReader := fake.NewFakeClient(objs...) + clientset := fakeclientset.NewSimpleClientset() - baseReconciler := reconcilers.NewBaseReconciler(cl, s, clientAPIReader, ctx, log) + baseReconciler := reconcilers.NewBaseReconciler(cl, s, clientAPIReader, ctx, log, clientset.Discovery()) baseAPIManagerLogicReconciler := NewBaseAPIManagerLogicReconciler(baseReconciler, apimanager) reconciler := NewMemcachedReconciler(baseAPIManagerLogicReconciler) diff --git a/pkg/3scale/amp/operator/redis_reconciler_test.go b/pkg/3scale/amp/operator/redis_reconciler_test.go index 21f6df7dd..683940613 100644 --- a/pkg/3scale/amp/operator/redis_reconciler_test.go +++ b/pkg/3scale/amp/operator/redis_reconciler_test.go @@ -6,12 +6,14 @@ import ( appsv1alpha1 "github.com/3scale/3scale-operator/pkg/apis/apps/v1alpha1" "github.com/3scale/3scale-operator/pkg/reconcilers" + appsv1 "github.com/openshift/api/apps/v1" imagev1 "github.com/openshift/api/image/v1" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" + fakeclientset "k8s.io/client-go/kubernetes/fake" "k8s.io/client-go/kubernetes/scheme" "sigs.k8s.io/controller-runtime/pkg/client/fake" logf "sigs.k8s.io/controller-runtime/pkg/log" @@ -67,8 +69,9 @@ func TestRedisBackendDCReconcilerCreate(t *testing.T) { // Create a fake client to mock API calls. cl := fake.NewFakeClient(objs...) clientAPIReader := fake.NewFakeClient(objs...) + clientset := fakeclientset.NewSimpleClientset() - baseReconciler := reconcilers.NewBaseReconciler(cl, s, clientAPIReader, ctx, log) + baseReconciler := reconcilers.NewBaseReconciler(cl, s, clientAPIReader, ctx, log, clientset.Discovery()) baseAPIManagerLogicReconciler := NewBaseAPIManagerLogicReconciler(baseReconciler, apimanager) reconciler := NewRedisReconciler(baseAPIManagerLogicReconciler) diff --git a/pkg/3scale/amp/operator/system_mysql_image_reconciler_test.go b/pkg/3scale/amp/operator/system_mysql_image_reconciler_test.go index fe9f3cfef..2d5b64aaa 100644 --- a/pkg/3scale/amp/operator/system_mysql_image_reconciler_test.go +++ b/pkg/3scale/amp/operator/system_mysql_image_reconciler_test.go @@ -6,10 +6,12 @@ import ( appsv1alpha1 "github.com/3scale/3scale-operator/pkg/apis/apps/v1alpha1" "github.com/3scale/3scale-operator/pkg/reconcilers" + imagev1 "github.com/openshift/api/image/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" + fakeclientset "k8s.io/client-go/kubernetes/fake" "k8s.io/client-go/kubernetes/scheme" "sigs.k8s.io/controller-runtime/pkg/client/fake" logf "sigs.k8s.io/controller-runtime/pkg/log" @@ -21,7 +23,7 @@ func TestSystemMySQLImageReconciler(t *testing.T) { name = "example-apimanager" namespace = "operator-unittest" trueValue = true - imageUrl = "mysql:test" + imageURL = "mysql:test" log = logf.Log.WithName("operator_test") ) @@ -40,7 +42,7 @@ func TestSystemMySQLImageReconciler(t *testing.T) { System: &appsv1alpha1.SystemSpec{ DatabaseSpec: &appsv1alpha1.SystemDatabaseSpec{ MySQL: &appsv1alpha1.SystemMySQLSpec{ - Image: &imageUrl, + Image: &imageURL, }, }, }, @@ -59,8 +61,9 @@ func TestSystemMySQLImageReconciler(t *testing.T) { // Create a fake client to mock API calls. cl := fake.NewFakeClient(objs...) clientAPIReader := fake.NewFakeClient(objs...) + clientset := fakeclientset.NewSimpleClientset() - baseReconciler := reconcilers.NewBaseReconciler(cl, s, clientAPIReader, ctx, log) + baseReconciler := reconcilers.NewBaseReconciler(cl, s, clientAPIReader, ctx, log, clientset.Discovery()) baseAPIManagerLogicReconciler := NewBaseAPIManagerLogicReconciler(baseReconciler, apimanager) reconciler := NewSystemMySQLImageReconciler(baseAPIManagerLogicReconciler) diff --git a/pkg/3scale/amp/operator/system_options_provider.go b/pkg/3scale/amp/operator/system_options_provider.go index 724129b07..f3ea8705c 100644 --- a/pkg/3scale/amp/operator/system_options_provider.go +++ b/pkg/3scale/amp/operator/system_options_provider.go @@ -6,7 +6,9 @@ import ( "github.com/3scale/3scale-operator/pkg/3scale/amp/component" "github.com/3scale/3scale-operator/pkg/3scale/amp/product" appsv1alpha1 "github.com/3scale/3scale-operator/pkg/apis/apps/v1alpha1" + "github.com/3scale/3scale-operator/pkg/common" "github.com/3scale/3scale-operator/pkg/helper" + v1 "k8s.io/api/core/v1" "sigs.k8s.io/controller-runtime/pkg/client" ) @@ -52,6 +54,7 @@ func (s *SystemOptionsProvider) GetSystemOptions() (*component.SystemOptions, er s.options.SphinxPodTemplateLabels = s.sphinxPodTemplateLabels(imageOpts.SystemImage) s.options.MemcachedLabels = s.memcachedLabels() s.options.SMTPLabels = s.smtpLabels() + s.options.SidekiqMonitoringLabels = s.sidekiqMonitoringLabels() err = s.setSecretBasedOptions() if err != nil { @@ -557,3 +560,9 @@ func (s *SystemOptionsProvider) sphinxPodTemplateLabels(image string) map[string return labels } + +func (s *SystemOptionsProvider) sidekiqMonitoringLabels() map[string]string { + labels := s.commonSidekiqLabels() + labels["monitoring-key"] = common.MonitoringKey + return labels +} diff --git a/pkg/3scale/amp/operator/system_options_provider_test.go b/pkg/3scale/amp/operator/system_options_provider_test.go index 41be01035..653ffb50a 100644 --- a/pkg/3scale/amp/operator/system_options_provider_test.go +++ b/pkg/3scale/amp/operator/system_options_provider_test.go @@ -133,6 +133,14 @@ func testSystemSMTPLabels() map[string]string { "threescale_component_element": "smtp", } } +func testSystemSidekiqMonitoringLabels() map[string]string { + return map[string]string{ + "app": appLabel, + "threescale_component": "system", + "threescale_component_element": "sidekiq", + "monitoring-key": "middleware", + } +} func testSystemAppAffinity() *v1.Affinity { return getTestAffinity("system-app") @@ -319,6 +327,7 @@ func defaultSystemOptions(opts *component.SystemOptions) *component.SystemOption SphinxPodTemplateLabels: testSystemSphinxPodTemplateLabels(), MemcachedLabels: testSystemMemcachedLabels(), SMTPLabels: testSystemSMTPLabels(), + SidekiqMonitoringLabels: testSystemSidekiqMonitoringLabels(), } expectedOpts.ApicastSystemMasterProxyConfigEndpoint = component.DefaultApicastSystemMasterProxyConfigEndpoint(opts.ApicastAccessToken) diff --git a/pkg/3scale/amp/operator/system_postgresql_image_reconciler_test.go b/pkg/3scale/amp/operator/system_postgresql_image_reconciler_test.go index d2101a7bd..97c3adf29 100644 --- a/pkg/3scale/amp/operator/system_postgresql_image_reconciler_test.go +++ b/pkg/3scale/amp/operator/system_postgresql_image_reconciler_test.go @@ -6,10 +6,12 @@ import ( appsv1alpha1 "github.com/3scale/3scale-operator/pkg/apis/apps/v1alpha1" "github.com/3scale/3scale-operator/pkg/reconcilers" + imagev1 "github.com/openshift/api/image/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" + fakeclientset "k8s.io/client-go/kubernetes/fake" "k8s.io/client-go/kubernetes/scheme" "sigs.k8s.io/controller-runtime/pkg/client/fake" logf "sigs.k8s.io/controller-runtime/pkg/log" @@ -21,7 +23,7 @@ func TestSystemPostgreSQLImageReconcilerCreate(t *testing.T) { name = "example-apimanager" namespace = "operator-unittest" trueValue = true - imageUrl = "postgresql:test" + imageURL = "postgresql:test" log = logf.Log.WithName("operator_test") ) @@ -40,7 +42,7 @@ func TestSystemPostgreSQLImageReconcilerCreate(t *testing.T) { System: &appsv1alpha1.SystemSpec{ DatabaseSpec: &appsv1alpha1.SystemDatabaseSpec{ PostgreSQL: &appsv1alpha1.SystemPostgreSQLSpec{ - Image: &imageUrl, + Image: &imageURL, }, }, }, @@ -59,8 +61,9 @@ func TestSystemPostgreSQLImageReconcilerCreate(t *testing.T) { // Create a fake client to mock API calls. cl := fake.NewFakeClient(objs...) clientAPIReader := fake.NewFakeClient(objs...) + clientset := fakeclientset.NewSimpleClientset() - baseReconciler := reconcilers.NewBaseReconciler(cl, s, clientAPIReader, ctx, log) + baseReconciler := reconcilers.NewBaseReconciler(cl, s, clientAPIReader, ctx, log, clientset.Discovery()) baseAPIManagerLogicReconciler := NewBaseAPIManagerLogicReconciler(baseReconciler, apimanager) reconciler := NewSystemPostgreSQLImageReconciler(baseAPIManagerLogicReconciler) diff --git a/pkg/3scale/amp/operator/system_postgresql_reconciler_test.go b/pkg/3scale/amp/operator/system_postgresql_reconciler_test.go index bfcdea3ba..7b13d1a94 100644 --- a/pkg/3scale/amp/operator/system_postgresql_reconciler_test.go +++ b/pkg/3scale/amp/operator/system_postgresql_reconciler_test.go @@ -7,12 +7,14 @@ import ( "github.com/3scale/3scale-operator/pkg/3scale/amp/component" appsv1alpha1 "github.com/3scale/3scale-operator/pkg/apis/apps/v1alpha1" "github.com/3scale/3scale-operator/pkg/reconcilers" + appsv1 "github.com/openshift/api/apps/v1" imagev1 "github.com/openshift/api/image/v1" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" + fakeclientset "k8s.io/client-go/kubernetes/fake" "k8s.io/client-go/kubernetes/scheme" "sigs.k8s.io/controller-runtime/pkg/client/fake" logf "sigs.k8s.io/controller-runtime/pkg/log" @@ -24,7 +26,7 @@ func TestSystemPostgreSQLReconcilerCreate(t *testing.T) { name = "example-apimanager" namespace = "operator-unittest" trueValue = true - imageUrl = "postgresql:test" + imageURL = "postgresql:test" wildcardDomain = "test.3scale.net" tenantName = "someTenant" log = logf.Log.WithName("operator_test") @@ -48,7 +50,7 @@ func TestSystemPostgreSQLReconcilerCreate(t *testing.T) { System: &appsv1alpha1.SystemSpec{ DatabaseSpec: &appsv1alpha1.SystemDatabaseSpec{ PostgreSQL: &appsv1alpha1.SystemPostgreSQLSpec{ - Image: &imageUrl, + Image: &imageURL, }, }, }, @@ -67,8 +69,9 @@ func TestSystemPostgreSQLReconcilerCreate(t *testing.T) { // Create a fake client to mock API calls. cl := fake.NewFakeClient(objs...) clientAPIReader := fake.NewFakeClient(objs...) + clientset := fakeclientset.NewSimpleClientset() - baseReconciler := reconcilers.NewBaseReconciler(cl, s, clientAPIReader, ctx, log) + baseReconciler := reconcilers.NewBaseReconciler(cl, s, clientAPIReader, ctx, log, clientset.Discovery()) baseAPIManagerLogicReconciler := NewBaseAPIManagerLogicReconciler(baseReconciler, apimanager) reconciler := NewSystemPostgreSQLReconciler(baseAPIManagerLogicReconciler) diff --git a/pkg/3scale/amp/operator/system_reconciler.go b/pkg/3scale/amp/operator/system_reconciler.go index 0b9b7274f..caeaed5a4 100644 --- a/pkg/3scale/amp/operator/system_reconciler.go +++ b/pkg/3scale/amp/operator/system_reconciler.go @@ -171,6 +171,26 @@ func (r *SystemReconciler) Reconcile() (reconcile.Result, error) { return reconcile.Result{}, err } + err = r.ReconcileMonitoringService(system.SystemSidekiqMonitoringService(), reconcilers.CreateOnlyMutator) + if err != nil { + return reconcile.Result{}, err + } + + err = r.ReconcileServiceMonitor(system.SystemSidekiqServiceMonitor(), reconcilers.CreateOnlyMutator) + if err != nil { + return reconcile.Result{}, err + } + + err = r.ReconcileGrafanaDashboard(component.SystemGrafanaDashboard(r.apiManager.Namespace), reconcilers.CreateOnlyMutator) + if err != nil { + return reconcile.Result{}, err + } + + err = r.ReconcilePrometheusRules(component.SystemSidekiqPrometheusRules(r.apiManager.Namespace), reconcilers.CreateOnlyMutator) + if err != nil { + return reconcile.Result{}, err + } + return reconcile.Result{}, nil } diff --git a/pkg/3scale/amp/operator/system_reconciler_test.go b/pkg/3scale/amp/operator/system_reconciler_test.go index 3840f38fc..40463a8fb 100644 --- a/pkg/3scale/amp/operator/system_reconciler_test.go +++ b/pkg/3scale/amp/operator/system_reconciler_test.go @@ -4,17 +4,20 @@ import ( "context" "testing" - "k8s.io/api/policy/v1beta1" - "github.com/3scale/3scale-operator/pkg/3scale/amp/component" appsv1alpha1 "github.com/3scale/3scale-operator/pkg/apis/apps/v1alpha1" "github.com/3scale/3scale-operator/pkg/reconcilers" + + monitoringv1 "github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1" + grafanav1alpha1 "github.com/integr8ly/grafana-operator/v3/pkg/apis/integreatly/v1alpha1" appsv1 "github.com/openshift/api/apps/v1" imagev1 "github.com/openshift/api/image/v1" routev1 "github.com/openshift/api/route/v1" v1 "k8s.io/api/core/v1" + "k8s.io/api/policy/v1beta1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" + fakeclientset "k8s.io/client-go/kubernetes/fake" "k8s.io/client-go/kubernetes/scheme" "sigs.k8s.io/controller-runtime/pkg/client/fake" logf "sigs.k8s.io/controller-runtime/pkg/log" @@ -44,12 +47,19 @@ func TestSystemReconcilerCreate(t *testing.T) { if err != nil { t.Fatal(err) } + if err := monitoringv1.AddToScheme(s); err != nil { + t.Fatal(err) + } + if err := grafanav1alpha1.AddToScheme(s); err != nil { + t.Fatal(err) + } // Create a fake client to mock API calls. cl := fake.NewFakeClient(objs...) clientAPIReader := fake.NewFakeClient(objs...) + clientset := fakeclientset.NewSimpleClientset() - baseReconciler := reconcilers.NewBaseReconciler(cl, s, clientAPIReader, ctx, log) + baseReconciler := reconcilers.NewBaseReconciler(cl, s, clientAPIReader, ctx, log, clientset.Discovery()) baseAPIManagerLogicReconciler := NewBaseAPIManagerLogicReconciler(baseReconciler, apimanager) reconciler := NewSystemReconciler(baseAPIManagerLogicReconciler) diff --git a/pkg/3scale/amp/operator/upgrade.go b/pkg/3scale/amp/operator/upgrade.go index 9a3f8a2bd..b0dd98d27 100644 --- a/pkg/3scale/amp/operator/upgrade.go +++ b/pkg/3scale/amp/operator/upgrade.go @@ -36,6 +36,9 @@ func NewUpgradeApiManager(b *reconcilers.BaseReconciler, apiManager *appsv1alpha } func (u *UpgradeApiManager) Upgrade() (reconcile.Result, error) { + // TODO Upgrade should be grouped by component and not by feature. + // Otherwise each component may get multiple update requests. + res, err := u.upgradeImages() if err != nil { return res, fmt.Errorf("Upgrading images: %w", err) @@ -61,6 +64,14 @@ func (u *UpgradeApiManager) Upgrade() (reconcile.Result, error) { return res, nil } + res, err = u.upgradeMonitoringSettings() + if err != nil { + return res, fmt.Errorf("Upgrading monitoring settings: %w", err) + } + if res.Requeue { + return res, nil + } + return reconcile.Result{}, nil } @@ -727,6 +738,162 @@ func (u *UpgradeApiManager) ensurePodTemplateLabels(desired *appsv1.DeploymentCo return updated, nil } +func (u *UpgradeApiManager) upgradeMonitoringSettings() (reconcile.Result, error) { + updated := false + + updatedTmp, err := u.ensureApicastStagingMonitoringSettings() + if err != nil { + return reconcile.Result{}, err + } + updated = updated || updatedTmp + + updatedTmp, err = u.ensureApicastProductionMonitoringSettings() + if err != nil { + return reconcile.Result{}, err + } + updated = updated || updatedTmp + + updatedTmp, err = u.ensureBackendWorkerMonitoringSettings() + if err != nil { + return reconcile.Result{}, err + } + updated = updated || updatedTmp + + updatedTmp, err = u.ensureBackendListenerMonitoringSettings() + if err != nil { + return reconcile.Result{}, err + } + updated = updated || updatedTmp + + return reconcile.Result{Requeue: updated}, nil +} + +func (u *UpgradeApiManager) ensureApicastStagingMonitoringSettings() (bool, error) { + existing := &appsv1.DeploymentConfig{} + err := u.Client().Get(context.TODO(), types.NamespacedName{Name: component.ApicastStagingName, Namespace: u.apiManager.Namespace}, existing) + if err != nil { + return false, err + } + + if len(existing.Spec.Template.Spec.Containers) != 1 { + return false, fmt.Errorf("DeploymentConfig %s spec.template.spec.containers length is %d, should be 1", + component.ApicastStagingName, len(existing.Spec.Template.Spec.Containers)) + } + + update := false + if _, ok := helper.FindEnvVar(existing.Spec.Template.Spec.Containers[0].Env, "APICAST_EXTENDED_METRICS"); !ok { + existing.Spec.Template.Spec.Containers[0].Env = append(existing.Spec.Template.Spec.Containers[0].Env, helper.EnvVarFromValue("APICAST_EXTENDED_METRICS", "true")) + update = true + } + + if update { + u.Logger().Info(fmt.Sprintf("Enabling metrics to DC %s", component.ApicastStagingName)) + err = u.UpdateResource(existing) + if err != nil { + return false, err + } + } + + return update, nil +} + +func (u *UpgradeApiManager) ensureApicastProductionMonitoringSettings() (bool, error) { + existing := &appsv1.DeploymentConfig{} + err := u.Client().Get(context.TODO(), types.NamespacedName{Name: component.ApicastProductionName, Namespace: u.apiManager.Namespace}, existing) + if err != nil { + return false, err + } + + if len(existing.Spec.Template.Spec.Containers) != 1 { + return false, fmt.Errorf("DeploymentConfig %s spec.template.spec.containers length is %d, should be 1", + component.ApicastProductionName, len(existing.Spec.Template.Spec.Containers)) + } + + update := false + if _, ok := helper.FindEnvVar(existing.Spec.Template.Spec.Containers[0].Env, "APICAST_EXTENDED_METRICS"); !ok { + existing.Spec.Template.Spec.Containers[0].Env = append(existing.Spec.Template.Spec.Containers[0].Env, helper.EnvVarFromValue("APICAST_EXTENDED_METRICS", "true")) + update = true + } + + if update { + u.Logger().Info(fmt.Sprintf("Enabling metrics to DC %s", component.ApicastProductionName)) + err = u.UpdateResource(existing) + if err != nil { + return false, err + } + } + + return update, nil +} + +func (u *UpgradeApiManager) ensureBackendWorkerMonitoringSettings() (bool, error) { + existing := &appsv1.DeploymentConfig{} + err := u.Client().Get(context.TODO(), types.NamespacedName{Name: component.BackendWorkerName, Namespace: u.apiManager.Namespace}, existing) + if err != nil { + return false, err + } + + if len(existing.Spec.Template.Spec.Containers) != 1 { + return false, fmt.Errorf("DeploymentConfig %s spec.template.spec.containers length is %d, should be 1", + component.BackendWorkerName, len(existing.Spec.Template.Spec.Containers)) + } + + update := false + if _, ok := helper.FindEnvVar(existing.Spec.Template.Spec.Containers[0].Env, "CONFIG_WORKER_PROMETHEUS_METRICS_PORT"); !ok { + existing.Spec.Template.Spec.Containers[0].Env = append(existing.Spec.Template.Spec.Containers[0].Env, helper.EnvVarFromValue("CONFIG_WORKER_PROMETHEUS_METRICS_PORT", component.BackendWorkerMetricsPortStr)) + update = true + } + + if _, ok := helper.FindEnvVar(existing.Spec.Template.Spec.Containers[0].Env, "CONFIG_WORKER_PROMETHEUS_METRICS_ENABLED"); !ok { + existing.Spec.Template.Spec.Containers[0].Env = append(existing.Spec.Template.Spec.Containers[0].Env, helper.EnvVarFromValue("CONFIG_WORKER_PROMETHEUS_METRICS_ENABLED", "true")) + update = true + } + + if update { + u.Logger().Info(fmt.Sprintf("Enabling metrics to DC %s", component.BackendWorkerName)) + err = u.UpdateResource(existing) + if err != nil { + return false, err + } + } + + return update, nil +} + +func (u *UpgradeApiManager) ensureBackendListenerMonitoringSettings() (bool, error) { + existing := &appsv1.DeploymentConfig{} + err := u.Client().Get(context.TODO(), types.NamespacedName{Name: component.BackendListenerName, Namespace: u.apiManager.Namespace}, existing) + if err != nil { + return false, err + } + + if len(existing.Spec.Template.Spec.Containers) != 1 { + return false, fmt.Errorf("DeploymentConfig %s spec.template.spec.containers length is %d, should be 1", + component.BackendListenerName, len(existing.Spec.Template.Spec.Containers)) + } + + update := false + if _, ok := helper.FindEnvVar(existing.Spec.Template.Spec.Containers[0].Env, "CONFIG_LISTENER_PROMETHEUS_METRICS_PORT"); !ok { + existing.Spec.Template.Spec.Containers[0].Env = append(existing.Spec.Template.Spec.Containers[0].Env, helper.EnvVarFromValue("CONFIG_LISTENER_PROMETHEUS_METRICS_PORT", component.BackendListenerMetricsPortStr)) + update = true + } + + if _, ok := helper.FindEnvVar(existing.Spec.Template.Spec.Containers[0].Env, "CONFIG_LISTENER_PROMETHEUS_METRICS_ENABLED"); !ok { + existing.Spec.Template.Spec.Containers[0].Env = append(existing.Spec.Template.Spec.Containers[0].Env, helper.EnvVarFromValue("CONFIG_LISTENER_PROMETHEUS_METRICS_ENABLED", "true")) + update = true + } + + if update { + u.Logger().Info(fmt.Sprintf("Enabling metrics to DC %s", component.BackendListenerName)) + err = u.UpdateResource(existing) + if err != nil { + return false, err + } + } + + return update, nil +} + func (u *UpgradeApiManager) Logger() logr.Logger { return u.logger } diff --git a/pkg/3scale/amp/operator/zync_options_provider.go b/pkg/3scale/amp/operator/zync_options_provider.go index ffbb2ce67..a1635234c 100644 --- a/pkg/3scale/amp/operator/zync_options_provider.go +++ b/pkg/3scale/amp/operator/zync_options_provider.go @@ -6,7 +6,9 @@ import ( "github.com/3scale/3scale-operator/pkg/3scale/amp/component" "github.com/3scale/3scale-operator/pkg/3scale/amp/product" appsv1alpha1 "github.com/3scale/3scale-operator/pkg/apis/apps/v1alpha1" + "github.com/3scale/3scale-operator/pkg/common" "github.com/3scale/3scale-operator/pkg/helper" + v1 "k8s.io/api/core/v1" "sigs.k8s.io/controller-runtime/pkg/client" ) @@ -58,6 +60,8 @@ func (z *ZyncOptionsProvider) GetZyncOptions() (*component.ZyncOptions, error) { z.zyncOptions.ZyncPodTemplateLabels = z.zyncPodTemplateLabels(imageOpts.ZyncImage) z.zyncOptions.ZyncQuePodTemplateLabels = z.zyncQuePodTemplateLabels(imageOpts.ZyncImage) z.zyncOptions.ZyncDatabasePodTemplateLabels = z.zyncDatabasePodTemplateLabels(imageOpts.ZyncDatabasePostgreSQLImage) + z.zyncOptions.ZyncMonitoringLabels = z.zyncMonitoringLabels() + z.zyncOptions.ZyncQueMonitoringLabels = z.zyncQueMonitoringLabels() err = z.zyncOptions.Validate() if err != nil { @@ -190,3 +194,15 @@ func (z *ZyncOptionsProvider) zyncDatabasePodTemplateLabels(image string) map[st return labels } + +func (z *ZyncOptionsProvider) zyncMonitoringLabels() map[string]string { + labels := z.commonZyncLabels() + labels["monitoring-key"] = common.MonitoringKey + return labels +} + +func (z *ZyncOptionsProvider) zyncQueMonitoringLabels() map[string]string { + labels := z.commonZyncQueLabels() + labels["monitoring-key"] = common.MonitoringKey + return labels +} diff --git a/pkg/3scale/amp/operator/zync_options_provider_test.go b/pkg/3scale/amp/operator/zync_options_provider_test.go index 5682fd35f..8cb248f81 100644 --- a/pkg/3scale/amp/operator/zync_options_provider_test.go +++ b/pkg/3scale/amp/operator/zync_options_provider_test.go @@ -120,6 +120,24 @@ func testZyncDatabaseTolerations() []v1.Toleration { return getTestTolerations("zync-database") } +func testZyncZyncMonitoringLabels() map[string]string { + return map[string]string{ + "app": appLabel, + "threescale_component": "zync", + "threescale_component_element": "zync", + "monitoring-key": "middleware", + } +} + +func testZyncQueMonitoringLabels() map[string]string { + return map[string]string{ + "app": appLabel, + "threescale_component": "zync", + "threescale_component_element": "zync-que", + "monitoring-key": "middleware", + } +} + func getZyncSecret() *v1.Secret { data := map[string]string{ component.ZyncSecretKeyBaseFieldName: zyncSecretKeyBasename, @@ -160,6 +178,8 @@ func defaultZyncOptions(opts *component.ZyncOptions) *component.ZyncOptions { ZyncPodTemplateLabels: testZyncPodTemplateLabels(), ZyncQuePodTemplateLabels: testZyncQuePodTemplateCommonLabels(), ZyncDatabasePodTemplateLabels: testZyncDatabasePodTemplateCommonLabels(), + ZyncMonitoringLabels: testZyncZyncMonitoringLabels(), + ZyncQueMonitoringLabels: testZyncQueMonitoringLabels(), } expectedOpts.DatabaseURL = component.DefaultZyncDatabaseURL(expectedOpts.DatabasePassword) diff --git a/pkg/3scale/amp/operator/zync_reconciler.go b/pkg/3scale/amp/operator/zync_reconciler.go index fc8b6dfe8..6ac92c3e2 100644 --- a/pkg/3scale/amp/operator/zync_reconciler.go +++ b/pkg/3scale/amp/operator/zync_reconciler.go @@ -4,6 +4,7 @@ import ( "github.com/3scale/3scale-operator/pkg/3scale/amp/component" appsv1alpha1 "github.com/3scale/3scale-operator/pkg/apis/apps/v1alpha1" "github.com/3scale/3scale-operator/pkg/reconcilers" + "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/reconcile" ) @@ -90,6 +91,46 @@ func (r *ZyncReconciler) Reconcile() (reconcile.Result, error) { return reconcile.Result{}, err } + err = r.ReconcileMonitoringService(zync.ZyncMonitoringService(), reconcilers.CreateOnlyMutator) + if err != nil { + return reconcile.Result{}, err + } + + err = r.ReconcileMonitoringService(zync.ZyncQueMonitoringService(), reconcilers.CreateOnlyMutator) + if err != nil { + return reconcile.Result{}, err + } + + err = r.ReconcileServiceMonitor(zync.ZyncServiceMonitor(), reconcilers.CreateOnlyMutator) + if err != nil { + return reconcile.Result{}, err + } + + err = r.ReconcileServiceMonitor(zync.ZyncQueServiceMonitor(), reconcilers.CreateOnlyMutator) + if err != nil { + return reconcile.Result{}, err + } + + err = r.ReconcileGrafanaDashboard(component.ZyncGrafanaDashboard(r.apiManager.Namespace), reconcilers.CreateOnlyMutator) + if err != nil { + return reconcile.Result{}, err + } + + err = r.ReconcileGrafanaDashboard(component.ZyncQueGrafanaDashboard(r.apiManager.Namespace), reconcilers.CreateOnlyMutator) + if err != nil { + return reconcile.Result{}, err + } + + err = r.ReconcilePrometheusRules(component.ZyncPrometheusRules(r.apiManager.Namespace), reconcilers.CreateOnlyMutator) + if err != nil { + return reconcile.Result{}, err + } + + err = r.ReconcilePrometheusRules(component.ZyncQuePrometheusRules(r.apiManager.Namespace), reconcilers.CreateOnlyMutator) + if err != nil { + return reconcile.Result{}, err + } + return reconcile.Result{}, nil } diff --git a/pkg/3scale/amp/operator/zync_reconciler_test.go b/pkg/3scale/amp/operator/zync_reconciler_test.go index 4fe5c5de5..5def22939 100644 --- a/pkg/3scale/amp/operator/zync_reconciler_test.go +++ b/pkg/3scale/amp/operator/zync_reconciler_test.go @@ -9,6 +9,9 @@ import ( "github.com/3scale/3scale-operator/pkg/3scale/amp/component" appsv1alpha1 "github.com/3scale/3scale-operator/pkg/apis/apps/v1alpha1" "github.com/3scale/3scale-operator/pkg/reconcilers" + + monitoringv1 "github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1" + grafanav1alpha1 "github.com/integr8ly/grafana-operator/v3/pkg/apis/integreatly/v1alpha1" appsv1 "github.com/openshift/api/apps/v1" imagev1 "github.com/openshift/api/image/v1" routev1 "github.com/openshift/api/route/v1" @@ -17,6 +20,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" + fakeclientset "k8s.io/client-go/kubernetes/fake" "k8s.io/client-go/kubernetes/scheme" "sigs.k8s.io/controller-runtime/pkg/client/fake" logf "sigs.k8s.io/controller-runtime/pkg/log" @@ -72,12 +76,19 @@ func TestNewZyncReconciler(t *testing.T) { if err != nil { t.Fatal(err) } + if err := monitoringv1.AddToScheme(s); err != nil { + t.Fatal(err) + } + if err := grafanav1alpha1.AddToScheme(s); err != nil { + t.Fatal(err) + } // Create a fake client to mock API calls. cl := fake.NewFakeClient(objs...) clientAPIReader := fake.NewFakeClient(objs...) + clientset := fakeclientset.NewSimpleClientset() - baseReconciler := reconcilers.NewBaseReconciler(cl, s, clientAPIReader, ctx, log) + baseReconciler := reconcilers.NewBaseReconciler(cl, s, clientAPIReader, ctx, log, clientset.Discovery()) baseAPIManagerLogicReconciler := NewBaseAPIManagerLogicReconciler(baseReconciler, apimanager) zyncReconciler := NewZyncReconciler(baseAPIManagerLogicReconciler) diff --git a/pkg/3scale/amp/template/adapters/apicast.go b/pkg/3scale/amp/template/adapters/apicast.go index 87f31d691..a369cee07 100644 --- a/pkg/3scale/amp/template/adapters/apicast.go +++ b/pkg/3scale/amp/template/adapters/apicast.go @@ -110,6 +110,9 @@ func (a *Apicast) options() (*component.ApicastOptions, error) { ao.CommonProductionLabels = a.commonProductionLabels() ao.StagingPodTemplateLabels = a.stagingPodTemplateLabels() ao.ProductionPodTemplateLabels = a.productionPodTemplateLabels() + // Not used, can be anything + ao.StagingMonitoringLabels = map[string]string{"a": "a"} + ao.ProductionMonitoringLabels = map[string]string{"a": "a"} err := ao.Validate() return ao, err diff --git a/pkg/3scale/amp/template/adapters/backend.go b/pkg/3scale/amp/template/adapters/backend.go index 84f16b415..3d66e408e 100644 --- a/pkg/3scale/amp/template/adapters/backend.go +++ b/pkg/3scale/amp/template/adapters/backend.go @@ -100,6 +100,9 @@ func (b *Backend) options() (*component.BackendOptions, error) { bo.ListenerPodTemplateLabels = b.listenerPodTemplateLabels() bo.WorkerPodTemplateLabels = b.workerPodTemplateLabels() bo.CronPodTemplateLabels = b.cronPodTemplateLabels() + // Not used, can be anything + bo.ListenerMonitoringLabels = map[string]string{"a": "a"} + bo.WorkerMonitoringLabels = map[string]string{"a": "a"} err := bo.Validate() return bo, err diff --git a/pkg/3scale/amp/template/adapters/system.go b/pkg/3scale/amp/template/adapters/system.go index 3ab0ad27e..59aa35663 100644 --- a/pkg/3scale/amp/template/adapters/system.go +++ b/pkg/3scale/amp/template/adapters/system.go @@ -279,6 +279,8 @@ func (s *System) options() (*component.SystemOptions, error) { o.SphinxPodTemplateLabels = s.sphinxPodTemplateLabels() o.MemcachedLabels = s.memcachedLabels() o.SMTPLabels = s.smtpLabels() + // Not used, can be anything + o.SidekiqMonitoringLabels = map[string]string{"a": "a"} err := o.Validate() return o, err diff --git a/pkg/3scale/amp/template/adapters/zync.go b/pkg/3scale/amp/template/adapters/zync.go index 1e2bd9584..a965d697d 100644 --- a/pkg/3scale/amp/template/adapters/zync.go +++ b/pkg/3scale/amp/template/adapters/zync.go @@ -100,6 +100,9 @@ func (z *Zync) options() (*component.ZyncOptions, error) { zo.ZyncPodTemplateLabels = z.zyncPodTemplateLabels() zo.ZyncQuePodTemplateLabels = z.zyncQuePodTemplateLabels() zo.ZyncDatabasePodTemplateLabels = z.zyncDatabasePodTemplateLabels() + // Not used, can be anything + zo.ZyncMonitoringLabels = map[string]string{"a": "a"} + zo.ZyncQueMonitoringLabels = map[string]string{"a": "a"} zo.AuthenticationToken = "${ZYNC_AUTHENTICATION_TOKEN}" zo.DatabasePassword = "${ZYNC_DATABASE_PASSWORD}" diff --git a/pkg/apis/apps/v1alpha1/apimanager_types.go b/pkg/apis/apps/v1alpha1/apimanager_types.go index b91e25dc4..9476ff675 100644 --- a/pkg/apis/apps/v1alpha1/apimanager_types.go +++ b/pkg/apis/apps/v1alpha1/apimanager_types.go @@ -18,10 +18,10 @@ import ( const ( ThreescaleVersionAnnotation = "apps.3scale.net/apimanager-threescale-version" OperatorVersionAnnotation = "apps.3scale.net/threescale-operator-version" + Default3scaleAppLabel = "3scale-api-management" ) const ( - defaultAppLabel = "3scale-api-management" defaultTenantName = "3scale" defaultImageStreamImportInsecure = false defaultResourceRequirementsEnabled = true @@ -50,6 +50,8 @@ type APIManagerSpec struct { HighAvailability *HighAvailabilitySpec `json:"highAvailability,omitempty"` // +optional PodDisruptionBudget *PodDisruptionBudgetSpec `json:"podDisruptionBudget,omitempty"` + // +optional + Monitoring *MonitoringSpec `json:"monitoring,omitempty"` } // APIManagerStatus defines the observed state of APIManager @@ -419,6 +421,10 @@ type PodDisruptionBudgetSpec struct { Enabled bool `json:"enabled,omitempty"` } +type MonitoringSpec struct { + Enabled bool `json:"enabled,omitempty"` +} + func init() { SchemeBuilder.Register(&APIManager{}, &APIManagerList{}) } @@ -577,7 +583,7 @@ func (apimanager *APIManager) setAPIManagerCommonSpecDefaults() bool { changed := false spec := &apimanager.Spec - tmpDefaultAppLabel := defaultAppLabel + tmpDefaultAppLabel := Default3scaleAppLabel tmpDefaultTenantName := defaultTenantName tmpDefaultImageStreamTagImportInsecure := defaultImageStreamImportInsecure tmpDefaultResourceRequirementsEnabled := defaultResourceRequirementsEnabled @@ -742,3 +748,7 @@ func (apimanager *APIManager) IsSystemMysqlEnabled() bool { apimanager.Spec.System.DatabaseSpec != nil && apimanager.Spec.System.DatabaseSpec.MySQL != nil } + +func (apimanager *APIManager) IsMonitoringEnabled() bool { + return apimanager.Spec.Monitoring != nil && apimanager.Spec.Monitoring.Enabled +} diff --git a/pkg/apis/apps/v1alpha1/apimanager_types_test.go b/pkg/apis/apps/v1alpha1/apimanager_types_test.go index 77b048a92..85ffa6f49 100644 --- a/pkg/apis/apps/v1alpha1/apimanager_types_test.go +++ b/pkg/apis/apps/v1alpha1/apimanager_types_test.go @@ -12,7 +12,7 @@ import ( ) func TestSetDefaults(t *testing.T) { - tmpDefaultAppLabel := defaultAppLabel + tmpDefaultAppLabel := Default3scaleAppLabel tmpDefaultTenantName := defaultTenantName tmpDefaultImageStreamTagImportInsecure := defaultImageStreamImportInsecure tmpDefaultResourceRequirementsEnabled := defaultResourceRequirementsEnabled diff --git a/pkg/apis/apps/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/apps/v1alpha1/zz_generated.deepcopy.go index 05640b658..afc829767 100644 --- a/pkg/apis/apps/v1alpha1/zz_generated.deepcopy.go +++ b/pkg/apis/apps/v1alpha1/zz_generated.deepcopy.go @@ -437,6 +437,11 @@ func (in *APIManagerSpec) DeepCopyInto(out *APIManagerSpec) { *out = new(PodDisruptionBudgetSpec) **out = **in } + if in.Monitoring != nil { + in, out := &in.Monitoring, &out.Monitoring + *out = new(MonitoringSpec) + **out = **in + } return } @@ -800,6 +805,22 @@ func (in *HighAvailabilitySpec) DeepCopy() *HighAvailabilitySpec { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *MonitoringSpec) DeepCopyInto(out *MonitoringSpec) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MonitoringSpec. +func (in *MonitoringSpec) DeepCopy() *MonitoringSpec { + if in == nil { + return nil + } + out := new(MonitoringSpec) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *PersistentVolumeClaimBackupDestination) DeepCopyInto(out *PersistentVolumeClaimBackupDestination) { *out = *in diff --git a/pkg/apis/apps/v1alpha1/zz_generated.openapi.go b/pkg/apis/apps/v1alpha1/zz_generated.openapi.go index 66be7ae02..7c00dac47 100644 --- a/pkg/apis/apps/v1alpha1/zz_generated.openapi.go +++ b/pkg/apis/apps/v1alpha1/zz_generated.openapi.go @@ -11,15 +11,15 @@ import ( func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenAPIDefinition { return map[string]common.OpenAPIDefinition{ - "github.com/3scale/3scale-operator/pkg/apis/apps/v1alpha1.APIManager": schema_pkg_apis_apps_v1alpha1_APIManager(ref), - "github.com/3scale/3scale-operator/pkg/apis/apps/v1alpha1.APIManagerBackup": schema_pkg_apis_apps_v1alpha1_APIManagerBackup(ref), - "github.com/3scale/3scale-operator/pkg/apis/apps/v1alpha1.APIManagerBackupSpec": schema_pkg_apis_apps_v1alpha1_APIManagerBackupSpec(ref), - "github.com/3scale/3scale-operator/pkg/apis/apps/v1alpha1.APIManagerBackupStatus": schema_pkg_apis_apps_v1alpha1_APIManagerBackupStatus(ref), - "github.com/3scale/3scale-operator/pkg/apis/apps/v1alpha1.APIManagerRestore": schema_pkg_apis_apps_v1alpha1_APIManagerRestore(ref), - "github.com/3scale/3scale-operator/pkg/apis/apps/v1alpha1.APIManagerRestoreSpec": schema_pkg_apis_apps_v1alpha1_APIManagerRestoreSpec(ref), - "github.com/3scale/3scale-operator/pkg/apis/apps/v1alpha1.APIManagerRestoreStatus": schema_pkg_apis_apps_v1alpha1_APIManagerRestoreStatus(ref), - "github.com/3scale/3scale-operator/pkg/apis/apps/v1alpha1.APIManagerSpec": schema_pkg_apis_apps_v1alpha1_APIManagerSpec(ref), - "github.com/3scale/3scale-operator/pkg/apis/apps/v1alpha1.APIManagerStatus": schema_pkg_apis_apps_v1alpha1_APIManagerStatus(ref), + "./pkg/apis/apps/v1alpha1.APIManager": schema_pkg_apis_apps_v1alpha1_APIManager(ref), + "./pkg/apis/apps/v1alpha1.APIManagerBackup": schema_pkg_apis_apps_v1alpha1_APIManagerBackup(ref), + "./pkg/apis/apps/v1alpha1.APIManagerBackupSpec": schema_pkg_apis_apps_v1alpha1_APIManagerBackupSpec(ref), + "./pkg/apis/apps/v1alpha1.APIManagerBackupStatus": schema_pkg_apis_apps_v1alpha1_APIManagerBackupStatus(ref), + "./pkg/apis/apps/v1alpha1.APIManagerRestore": schema_pkg_apis_apps_v1alpha1_APIManagerRestore(ref), + "./pkg/apis/apps/v1alpha1.APIManagerRestoreSpec": schema_pkg_apis_apps_v1alpha1_APIManagerRestoreSpec(ref), + "./pkg/apis/apps/v1alpha1.APIManagerRestoreStatus": schema_pkg_apis_apps_v1alpha1_APIManagerRestoreStatus(ref), + "./pkg/apis/apps/v1alpha1.APIManagerSpec": schema_pkg_apis_apps_v1alpha1_APIManagerSpec(ref), + "./pkg/apis/apps/v1alpha1.APIManagerStatus": schema_pkg_apis_apps_v1alpha1_APIManagerStatus(ref), } } @@ -51,19 +51,19 @@ func schema_pkg_apis_apps_v1alpha1_APIManager(ref common.ReferenceCallback) comm }, "spec": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/3scale/3scale-operator/pkg/apis/apps/v1alpha1.APIManagerSpec"), + Ref: ref("./pkg/apis/apps/v1alpha1.APIManagerSpec"), }, }, "status": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/3scale/3scale-operator/pkg/apis/apps/v1alpha1.APIManagerStatus"), + Ref: ref("./pkg/apis/apps/v1alpha1.APIManagerStatus"), }, }, }, }, }, Dependencies: []string{ - "github.com/3scale/3scale-operator/pkg/apis/apps/v1alpha1.APIManagerSpec", "github.com/3scale/3scale-operator/pkg/apis/apps/v1alpha1.APIManagerStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, + "./pkg/apis/apps/v1alpha1.APIManagerSpec", "./pkg/apis/apps/v1alpha1.APIManagerStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, } } @@ -95,19 +95,19 @@ func schema_pkg_apis_apps_v1alpha1_APIManagerBackup(ref common.ReferenceCallback }, "spec": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/3scale/3scale-operator/pkg/apis/apps/v1alpha1.APIManagerBackupSpec"), + Ref: ref("./pkg/apis/apps/v1alpha1.APIManagerBackupSpec"), }, }, "status": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/3scale/3scale-operator/pkg/apis/apps/v1alpha1.APIManagerBackupStatus"), + Ref: ref("./pkg/apis/apps/v1alpha1.APIManagerBackupStatus"), }, }, }, }, }, Dependencies: []string{ - "github.com/3scale/3scale-operator/pkg/apis/apps/v1alpha1.APIManagerBackupSpec", "github.com/3scale/3scale-operator/pkg/apis/apps/v1alpha1.APIManagerBackupStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, + "./pkg/apis/apps/v1alpha1.APIManagerBackupSpec", "./pkg/apis/apps/v1alpha1.APIManagerBackupStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, } } @@ -121,7 +121,7 @@ func schema_pkg_apis_apps_v1alpha1_APIManagerBackupSpec(ref common.ReferenceCall "backupDestination": { SchemaProps: spec.SchemaProps{ Description: "Backup data destination configuration", - Ref: ref("github.com/3scale/3scale-operator/pkg/apis/apps/v1alpha1.APIManagerBackupDestination"), + Ref: ref("./pkg/apis/apps/v1alpha1.APIManagerBackupDestination"), }, }, }, @@ -129,7 +129,7 @@ func schema_pkg_apis_apps_v1alpha1_APIManagerBackupSpec(ref common.ReferenceCall }, }, Dependencies: []string{ - "github.com/3scale/3scale-operator/pkg/apis/apps/v1alpha1.APIManagerBackupDestination"}, + "./pkg/apis/apps/v1alpha1.APIManagerBackupDestination"}, } } @@ -216,19 +216,19 @@ func schema_pkg_apis_apps_v1alpha1_APIManagerRestore(ref common.ReferenceCallbac }, "spec": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/3scale/3scale-operator/pkg/apis/apps/v1alpha1.APIManagerRestoreSpec"), + Ref: ref("./pkg/apis/apps/v1alpha1.APIManagerRestoreSpec"), }, }, "status": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/3scale/3scale-operator/pkg/apis/apps/v1alpha1.APIManagerRestoreStatus"), + Ref: ref("./pkg/apis/apps/v1alpha1.APIManagerRestoreStatus"), }, }, }, }, }, Dependencies: []string{ - "github.com/3scale/3scale-operator/pkg/apis/apps/v1alpha1.APIManagerRestoreSpec", "github.com/3scale/3scale-operator/pkg/apis/apps/v1alpha1.APIManagerRestoreStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, + "./pkg/apis/apps/v1alpha1.APIManagerRestoreSpec", "./pkg/apis/apps/v1alpha1.APIManagerRestoreStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, } } @@ -242,7 +242,7 @@ func schema_pkg_apis_apps_v1alpha1_APIManagerRestoreSpec(ref common.ReferenceCal "restoreSource": { SchemaProps: spec.SchemaProps{ Description: "INSERT ADDITIONAL SPEC FIELDS - desired state of cluster Important: Run \"operator-sdk generate k8s\" to regenerate code after modifying this file Add custom validation using kubebuilder tags: https://book-v1.book.kubebuilder.io/beyond_basics/generating_crd.html", - Ref: ref("github.com/3scale/3scale-operator/pkg/apis/apps/v1alpha1.APIManagerRestoreSource"), + Ref: ref("./pkg/apis/apps/v1alpha1.APIManagerRestoreSource"), }, }, }, @@ -250,7 +250,7 @@ func schema_pkg_apis_apps_v1alpha1_APIManagerRestoreSpec(ref common.ReferenceCal }, }, Dependencies: []string{ - "github.com/3scale/3scale-operator/pkg/apis/apps/v1alpha1.APIManagerRestoreSource"}, + "./pkg/apis/apps/v1alpha1.APIManagerRestoreSource"}, } } @@ -341,32 +341,37 @@ func schema_pkg_apis_apps_v1alpha1_APIManagerSpec(ref common.ReferenceCallback) }, "apicast": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/3scale/3scale-operator/pkg/apis/apps/v1alpha1.ApicastSpec"), + Ref: ref("./pkg/apis/apps/v1alpha1.ApicastSpec"), }, }, "backend": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/3scale/3scale-operator/pkg/apis/apps/v1alpha1.BackendSpec"), + Ref: ref("./pkg/apis/apps/v1alpha1.BackendSpec"), }, }, "system": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/3scale/3scale-operator/pkg/apis/apps/v1alpha1.SystemSpec"), + Ref: ref("./pkg/apis/apps/v1alpha1.SystemSpec"), }, }, "zync": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/3scale/3scale-operator/pkg/apis/apps/v1alpha1.ZyncSpec"), + Ref: ref("./pkg/apis/apps/v1alpha1.ZyncSpec"), }, }, "highAvailability": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/3scale/3scale-operator/pkg/apis/apps/v1alpha1.HighAvailabilitySpec"), + Ref: ref("./pkg/apis/apps/v1alpha1.HighAvailabilitySpec"), }, }, "podDisruptionBudget": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/3scale/3scale-operator/pkg/apis/apps/v1alpha1.PodDisruptionBudgetSpec"), + Ref: ref("./pkg/apis/apps/v1alpha1.PodDisruptionBudgetSpec"), + }, + }, + "monitoring": { + SchemaProps: spec.SchemaProps{ + Ref: ref("./pkg/apis/apps/v1alpha1.MonitoringSpec"), }, }, }, @@ -374,7 +379,7 @@ func schema_pkg_apis_apps_v1alpha1_APIManagerSpec(ref common.ReferenceCallback) }, }, Dependencies: []string{ - "github.com/3scale/3scale-operator/pkg/apis/apps/v1alpha1.ApicastSpec", "github.com/3scale/3scale-operator/pkg/apis/apps/v1alpha1.BackendSpec", "github.com/3scale/3scale-operator/pkg/apis/apps/v1alpha1.HighAvailabilitySpec", "github.com/3scale/3scale-operator/pkg/apis/apps/v1alpha1.PodDisruptionBudgetSpec", "github.com/3scale/3scale-operator/pkg/apis/apps/v1alpha1.SystemSpec", "github.com/3scale/3scale-operator/pkg/apis/apps/v1alpha1.ZyncSpec"}, + "./pkg/apis/apps/v1alpha1.ApicastSpec", "./pkg/apis/apps/v1alpha1.BackendSpec", "./pkg/apis/apps/v1alpha1.HighAvailabilitySpec", "./pkg/apis/apps/v1alpha1.MonitoringSpec", "./pkg/apis/apps/v1alpha1.PodDisruptionBudgetSpec", "./pkg/apis/apps/v1alpha1.SystemSpec", "./pkg/apis/apps/v1alpha1.ZyncSpec"}, } } @@ -391,7 +396,7 @@ func schema_pkg_apis_apps_v1alpha1_APIManagerStatus(ref common.ReferenceCallback Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/3scale/3scale-operator/pkg/apis/apps/v1alpha1.APIManagerCondition"), + Ref: ref("./pkg/apis/apps/v1alpha1.APIManagerCondition"), }, }, }, @@ -408,6 +413,6 @@ func schema_pkg_apis_apps_v1alpha1_APIManagerStatus(ref common.ReferenceCallback }, }, Dependencies: []string{ - "github.com/3scale/3scale-operator/pkg/apis/apps/v1alpha1.APIManagerCondition", "github.com/RHsyseng/operator-utils/pkg/olm.DeploymentStatus"}, + "./pkg/apis/apps/v1alpha1.APIManagerCondition", "github.com/RHsyseng/operator-utils/pkg/olm.DeploymentStatus"}, } } diff --git a/pkg/apis/capabilities/v1alpha1/zz_generated.openapi.go b/pkg/apis/capabilities/v1alpha1/zz_generated.openapi.go index 31c97a064..d433ed7aa 100644 --- a/pkg/apis/capabilities/v1alpha1/zz_generated.openapi.go +++ b/pkg/apis/capabilities/v1alpha1/zz_generated.openapi.go @@ -11,27 +11,27 @@ import ( func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenAPIDefinition { return map[string]common.OpenAPIDefinition{ - "github.com/3scale/3scale-operator/pkg/apis/capabilities/v1alpha1.API": schema_pkg_apis_capabilities_v1alpha1_API(ref), - "github.com/3scale/3scale-operator/pkg/apis/capabilities/v1alpha1.APISpec": schema_pkg_apis_capabilities_v1alpha1_APISpec(ref), - "github.com/3scale/3scale-operator/pkg/apis/capabilities/v1alpha1.APIStatus": schema_pkg_apis_capabilities_v1alpha1_APIStatus(ref), - "github.com/3scale/3scale-operator/pkg/apis/capabilities/v1alpha1.Binding": schema_pkg_apis_capabilities_v1alpha1_Binding(ref), - "github.com/3scale/3scale-operator/pkg/apis/capabilities/v1alpha1.BindingSpec": schema_pkg_apis_capabilities_v1alpha1_BindingSpec(ref), - "github.com/3scale/3scale-operator/pkg/apis/capabilities/v1alpha1.BindingStatus": schema_pkg_apis_capabilities_v1alpha1_BindingStatus(ref), - "github.com/3scale/3scale-operator/pkg/apis/capabilities/v1alpha1.Limit": schema_pkg_apis_capabilities_v1alpha1_Limit(ref), - "github.com/3scale/3scale-operator/pkg/apis/capabilities/v1alpha1.LimitSpec": schema_pkg_apis_capabilities_v1alpha1_LimitSpec(ref), - "github.com/3scale/3scale-operator/pkg/apis/capabilities/v1alpha1.LimitStatus": schema_pkg_apis_capabilities_v1alpha1_LimitStatus(ref), - "github.com/3scale/3scale-operator/pkg/apis/capabilities/v1alpha1.MappingRule": schema_pkg_apis_capabilities_v1alpha1_MappingRule(ref), - "github.com/3scale/3scale-operator/pkg/apis/capabilities/v1alpha1.MappingRuleSpec": schema_pkg_apis_capabilities_v1alpha1_MappingRuleSpec(ref), - "github.com/3scale/3scale-operator/pkg/apis/capabilities/v1alpha1.MappingRuleStatus": schema_pkg_apis_capabilities_v1alpha1_MappingRuleStatus(ref), - "github.com/3scale/3scale-operator/pkg/apis/capabilities/v1alpha1.Metric": schema_pkg_apis_capabilities_v1alpha1_Metric(ref), - "github.com/3scale/3scale-operator/pkg/apis/capabilities/v1alpha1.MetricSpec": schema_pkg_apis_capabilities_v1alpha1_MetricSpec(ref), - "github.com/3scale/3scale-operator/pkg/apis/capabilities/v1alpha1.MetricStatus": schema_pkg_apis_capabilities_v1alpha1_MetricStatus(ref), - "github.com/3scale/3scale-operator/pkg/apis/capabilities/v1alpha1.Plan": schema_pkg_apis_capabilities_v1alpha1_Plan(ref), - "github.com/3scale/3scale-operator/pkg/apis/capabilities/v1alpha1.PlanSpec": schema_pkg_apis_capabilities_v1alpha1_PlanSpec(ref), - "github.com/3scale/3scale-operator/pkg/apis/capabilities/v1alpha1.PlanStatus": schema_pkg_apis_capabilities_v1alpha1_PlanStatus(ref), - "github.com/3scale/3scale-operator/pkg/apis/capabilities/v1alpha1.Tenant": schema_pkg_apis_capabilities_v1alpha1_Tenant(ref), - "github.com/3scale/3scale-operator/pkg/apis/capabilities/v1alpha1.TenantSpec": schema_pkg_apis_capabilities_v1alpha1_TenantSpec(ref), - "github.com/3scale/3scale-operator/pkg/apis/capabilities/v1alpha1.TenantStatus": schema_pkg_apis_capabilities_v1alpha1_TenantStatus(ref), + "./pkg/apis/capabilities/v1alpha1.API": schema_pkg_apis_capabilities_v1alpha1_API(ref), + "./pkg/apis/capabilities/v1alpha1.APISpec": schema_pkg_apis_capabilities_v1alpha1_APISpec(ref), + "./pkg/apis/capabilities/v1alpha1.APIStatus": schema_pkg_apis_capabilities_v1alpha1_APIStatus(ref), + "./pkg/apis/capabilities/v1alpha1.Binding": schema_pkg_apis_capabilities_v1alpha1_Binding(ref), + "./pkg/apis/capabilities/v1alpha1.BindingSpec": schema_pkg_apis_capabilities_v1alpha1_BindingSpec(ref), + "./pkg/apis/capabilities/v1alpha1.BindingStatus": schema_pkg_apis_capabilities_v1alpha1_BindingStatus(ref), + "./pkg/apis/capabilities/v1alpha1.Limit": schema_pkg_apis_capabilities_v1alpha1_Limit(ref), + "./pkg/apis/capabilities/v1alpha1.LimitSpec": schema_pkg_apis_capabilities_v1alpha1_LimitSpec(ref), + "./pkg/apis/capabilities/v1alpha1.LimitStatus": schema_pkg_apis_capabilities_v1alpha1_LimitStatus(ref), + "./pkg/apis/capabilities/v1alpha1.MappingRule": schema_pkg_apis_capabilities_v1alpha1_MappingRule(ref), + "./pkg/apis/capabilities/v1alpha1.MappingRuleSpec": schema_pkg_apis_capabilities_v1alpha1_MappingRuleSpec(ref), + "./pkg/apis/capabilities/v1alpha1.MappingRuleStatus": schema_pkg_apis_capabilities_v1alpha1_MappingRuleStatus(ref), + "./pkg/apis/capabilities/v1alpha1.Metric": schema_pkg_apis_capabilities_v1alpha1_Metric(ref), + "./pkg/apis/capabilities/v1alpha1.MetricSpec": schema_pkg_apis_capabilities_v1alpha1_MetricSpec(ref), + "./pkg/apis/capabilities/v1alpha1.MetricStatus": schema_pkg_apis_capabilities_v1alpha1_MetricStatus(ref), + "./pkg/apis/capabilities/v1alpha1.Plan": schema_pkg_apis_capabilities_v1alpha1_Plan(ref), + "./pkg/apis/capabilities/v1alpha1.PlanSpec": schema_pkg_apis_capabilities_v1alpha1_PlanSpec(ref), + "./pkg/apis/capabilities/v1alpha1.PlanStatus": schema_pkg_apis_capabilities_v1alpha1_PlanStatus(ref), + "./pkg/apis/capabilities/v1alpha1.Tenant": schema_pkg_apis_capabilities_v1alpha1_Tenant(ref), + "./pkg/apis/capabilities/v1alpha1.TenantSpec": schema_pkg_apis_capabilities_v1alpha1_TenantSpec(ref), + "./pkg/apis/capabilities/v1alpha1.TenantStatus": schema_pkg_apis_capabilities_v1alpha1_TenantStatus(ref), } } @@ -63,19 +63,19 @@ func schema_pkg_apis_capabilities_v1alpha1_API(ref common.ReferenceCallback) com }, "spec": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/3scale/3scale-operator/pkg/apis/capabilities/v1alpha1.APISpec"), + Ref: ref("./pkg/apis/capabilities/v1alpha1.APISpec"), }, }, "status": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/3scale/3scale-operator/pkg/apis/capabilities/v1alpha1.APIStatus"), + Ref: ref("./pkg/apis/capabilities/v1alpha1.APIStatus"), }, }, }, }, }, Dependencies: []string{ - "github.com/3scale/3scale-operator/pkg/apis/capabilities/v1alpha1.APISpec", "github.com/3scale/3scale-operator/pkg/apis/capabilities/v1alpha1.APIStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, + "./pkg/apis/capabilities/v1alpha1.APISpec", "./pkg/apis/capabilities/v1alpha1.APIStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, } } @@ -94,7 +94,7 @@ func schema_pkg_apis_capabilities_v1alpha1_APISpec(ref common.ReferenceCallback) }, "integrationMethod": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/3scale/3scale-operator/pkg/apis/capabilities/v1alpha1.IntegrationMethod"), + Ref: ref("./pkg/apis/capabilities/v1alpha1.IntegrationMethod"), }, }, "planSelector": { @@ -112,7 +112,7 @@ func schema_pkg_apis_capabilities_v1alpha1_APISpec(ref common.ReferenceCallback) }, }, Dependencies: []string{ - "github.com/3scale/3scale-operator/pkg/apis/capabilities/v1alpha1.IntegrationMethod", "k8s.io/apimachinery/pkg/apis/meta/v1.LabelSelector"}, + "./pkg/apis/capabilities/v1alpha1.IntegrationMethod", "k8s.io/apimachinery/pkg/apis/meta/v1.LabelSelector"}, } } @@ -155,19 +155,19 @@ func schema_pkg_apis_capabilities_v1alpha1_Binding(ref common.ReferenceCallback) }, "spec": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/3scale/3scale-operator/pkg/apis/capabilities/v1alpha1.BindingSpec"), + Ref: ref("./pkg/apis/capabilities/v1alpha1.BindingSpec"), }, }, "status": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/3scale/3scale-operator/pkg/apis/capabilities/v1alpha1.BindingStatus"), + Ref: ref("./pkg/apis/capabilities/v1alpha1.BindingStatus"), }, }, }, }, }, Dependencies: []string{ - "github.com/3scale/3scale-operator/pkg/apis/capabilities/v1alpha1.BindingSpec", "github.com/3scale/3scale-operator/pkg/apis/capabilities/v1alpha1.BindingStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, + "./pkg/apis/capabilities/v1alpha1.BindingSpec", "./pkg/apis/capabilities/v1alpha1.BindingStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, } } @@ -263,19 +263,19 @@ func schema_pkg_apis_capabilities_v1alpha1_Limit(ref common.ReferenceCallback) c }, "spec": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/3scale/3scale-operator/pkg/apis/capabilities/v1alpha1.LimitSpec"), + Ref: ref("./pkg/apis/capabilities/v1alpha1.LimitSpec"), }, }, "status": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/3scale/3scale-operator/pkg/apis/capabilities/v1alpha1.LimitStatus"), + Ref: ref("./pkg/apis/capabilities/v1alpha1.LimitStatus"), }, }, }, }, }, Dependencies: []string{ - "github.com/3scale/3scale-operator/pkg/apis/capabilities/v1alpha1.LimitSpec", "github.com/3scale/3scale-operator/pkg/apis/capabilities/v1alpha1.LimitStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, + "./pkg/apis/capabilities/v1alpha1.LimitSpec", "./pkg/apis/capabilities/v1alpha1.LimitStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, } } @@ -351,19 +351,19 @@ func schema_pkg_apis_capabilities_v1alpha1_MappingRule(ref common.ReferenceCallb }, "spec": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/3scale/3scale-operator/pkg/apis/capabilities/v1alpha1.MappingRuleSpec"), + Ref: ref("./pkg/apis/capabilities/v1alpha1.MappingRuleSpec"), }, }, "status": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/3scale/3scale-operator/pkg/apis/capabilities/v1alpha1.MappingRuleStatus"), + Ref: ref("./pkg/apis/capabilities/v1alpha1.MappingRuleStatus"), }, }, }, }, }, Dependencies: []string{ - "github.com/3scale/3scale-operator/pkg/apis/capabilities/v1alpha1.MappingRuleSpec", "github.com/3scale/3scale-operator/pkg/apis/capabilities/v1alpha1.MappingRuleStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, + "./pkg/apis/capabilities/v1alpha1.MappingRuleSpec", "./pkg/apis/capabilities/v1alpha1.MappingRuleStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, } } @@ -445,19 +445,19 @@ func schema_pkg_apis_capabilities_v1alpha1_Metric(ref common.ReferenceCallback) }, "spec": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/3scale/3scale-operator/pkg/apis/capabilities/v1alpha1.MetricSpec"), + Ref: ref("./pkg/apis/capabilities/v1alpha1.MetricSpec"), }, }, "status": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/3scale/3scale-operator/pkg/apis/capabilities/v1alpha1.MetricStatus"), + Ref: ref("./pkg/apis/capabilities/v1alpha1.MetricStatus"), }, }, }, }, }, Dependencies: []string{ - "github.com/3scale/3scale-operator/pkg/apis/capabilities/v1alpha1.MetricSpec", "github.com/3scale/3scale-operator/pkg/apis/capabilities/v1alpha1.MetricStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, + "./pkg/apis/capabilities/v1alpha1.MetricSpec", "./pkg/apis/capabilities/v1alpha1.MetricStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, } } @@ -532,19 +532,19 @@ func schema_pkg_apis_capabilities_v1alpha1_Plan(ref common.ReferenceCallback) co }, "spec": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/3scale/3scale-operator/pkg/apis/capabilities/v1alpha1.PlanSpec"), + Ref: ref("./pkg/apis/capabilities/v1alpha1.PlanSpec"), }, }, "status": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/3scale/3scale-operator/pkg/apis/capabilities/v1alpha1.PlanStatus"), + Ref: ref("./pkg/apis/capabilities/v1alpha1.PlanStatus"), }, }, }, }, }, Dependencies: []string{ - "github.com/3scale/3scale-operator/pkg/apis/capabilities/v1alpha1.PlanSpec", "github.com/3scale/3scale-operator/pkg/apis/capabilities/v1alpha1.PlanStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, + "./pkg/apis/capabilities/v1alpha1.PlanSpec", "./pkg/apis/capabilities/v1alpha1.PlanStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, } } @@ -575,7 +575,7 @@ func schema_pkg_apis_capabilities_v1alpha1_PlanSpec(ref common.ReferenceCallback }, "costs": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/3scale/3scale-operator/pkg/apis/capabilities/v1alpha1.PlanCost"), + Ref: ref("./pkg/apis/capabilities/v1alpha1.PlanCost"), }, }, "limitSelector": { @@ -588,7 +588,7 @@ func schema_pkg_apis_capabilities_v1alpha1_PlanSpec(ref common.ReferenceCallback }, }, Dependencies: []string{ - "github.com/3scale/3scale-operator/pkg/apis/capabilities/v1alpha1.PlanCost", "k8s.io/apimachinery/pkg/apis/meta/v1.LabelSelector"}, + "./pkg/apis/capabilities/v1alpha1.PlanCost", "k8s.io/apimachinery/pkg/apis/meta/v1.LabelSelector"}, } } @@ -631,19 +631,19 @@ func schema_pkg_apis_capabilities_v1alpha1_Tenant(ref common.ReferenceCallback) }, "spec": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/3scale/3scale-operator/pkg/apis/capabilities/v1alpha1.TenantSpec"), + Ref: ref("./pkg/apis/capabilities/v1alpha1.TenantSpec"), }, }, "status": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/3scale/3scale-operator/pkg/apis/capabilities/v1alpha1.TenantStatus"), + Ref: ref("./pkg/apis/capabilities/v1alpha1.TenantStatus"), }, }, }, }, }, Dependencies: []string{ - "github.com/3scale/3scale-operator/pkg/apis/capabilities/v1alpha1.TenantSpec", "github.com/3scale/3scale-operator/pkg/apis/capabilities/v1alpha1.TenantStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, + "./pkg/apis/capabilities/v1alpha1.TenantSpec", "./pkg/apis/capabilities/v1alpha1.TenantStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, } } diff --git a/pkg/assets/assets.go b/pkg/assets/assets.go new file mode 100644 index 000000000..694aa93cd --- /dev/null +++ b/pkg/assets/assets.go @@ -0,0 +1,37 @@ +package assets + +import ( + "bytes" + "text/template" +) + +// Important: Run "make assets" to regenerate code after modifying/adding/removing any asset +//go:generate go-bindata --prefix assets -pkg $GOPACKAGE -o bindata.go assets/... + +// SafeStringAsset Returns asset data as string +// panic if not found or any err is detected +func SafeStringAsset(name string) string { + data, err := Asset(name) + if err != nil { + panic(err) + } + + return string(data) +} + +// TemplateAsset Executes one tamplate by applying it to a daata structure. +// panic if not found or any err is detected +func TemplateAsset(name string, data interface{}) string { + tObj, err := template.New(name).Parse(SafeStringAsset(name)) + if err != nil { + panic(err) + } + + var tpl bytes.Buffer + err = tObj.Execute(&tpl, data) + if err != nil { + panic(err) + } + + return tpl.String() +} diff --git a/pkg/assets/assets/monitoring/apicast-grafana-dashboard-1.json.tpl b/pkg/assets/assets/monitoring/apicast-grafana-dashboard-1.json.tpl new file mode 100644 index 000000000..c18490e07 --- /dev/null +++ b/pkg/assets/assets/monitoring/apicast-grafana-dashboard-1.json.tpl @@ -0,0 +1,2689 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "gnetId": null, + "graphTooltip": 0, + "links": [], + "panels": [ + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 20, + "panels": [], + "title": "Application", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 1 + }, + "id": 39, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": {}, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(rate(nginx_http_connections{namespace='$namespace', pod=~'apicast-$env.*'}[1m])) by (state)", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{`{{state}}`}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "HTTP connections (global)", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "decimals": 0, + "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": "$datasource", + "fill": 1, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 1 + }, + "id": 40, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": {}, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(rate(nginx_http_connections{namespace='$namespace', pod=~'$pod'}[1m])) by (pod,state)", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{`{{pod}}`}}: {{`{{state}}`}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "HTTP connections (${pod})", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "decimals": 0, + "format": "short", + "label": "", + "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": "$datasource", + "fill": 1, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 11 + }, + "id": 48, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": {}, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(rate(apicast_status{namespace='$namespace', pod=~'apicast-$env.*', status=~'5.*'}[1m]))", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "5XX", + "refId": "A" + }, + { + "expr": "sum(rate(apicast_status{namespace='$namespace', pod=~'apicast-$env.*', status=~'4.*'}[1m]))", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "4XX", + "refId": "B" + }, + { + "expr": "sum(rate(apicast_status{namespace='$namespace', pod=~'apicast-$env.*', status=~'3.*'}[1m]))", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "3XX", + "refId": "C" + }, + { + "expr": "sum(rate(apicast_status{namespace='$namespace', pod=~'apicast-$env.*', status=~'2.*'}[1m]))", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "2XX", + "refId": "D" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "HTTP status codes (global)", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "decimals": 0, + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "reqps", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 11 + }, + "id": 62, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": {}, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(apicast_status{namespace='$namespace', pod=~'$pod', status=~'5.*'}[1m])", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{`{{pod}}`}}: 5XX", + "refId": "A" + }, + { + "expr": "rate(apicast_status{namespace='$namespace', pod=~'$pod', status=~'4.*'}[1m])", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{`{{pod}}`}}: 4XX", + "refId": "B" + }, + { + "expr": "rate(apicast_status{namespace='$namespace', pod=~'$pod', status=~'3.*'}[1m])", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{`{{pod}}`}}: 3XX", + "refId": "C" + }, + { + "expr": "rate(apicast_status{namespace='$namespace', pod=~'$pod', status=~'2.*'}[1m])", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{`{{pod}}`}}: 2XX", + "refId": "D" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "HTTP status codes (${pod})", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "decimals": 0, + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "reqps", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "gridPos": { + "h": 9, + "w": 24, + "x": 0, + "y": 21 + }, + "id": 46, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": {}, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(rate(upstream_status{namespace='$namespace', pod=~'apicast-$env.*', status=~'5.*'}[1m]))", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "5XX", + "refId": "A" + }, + { + "expr": "sum(rate(upstream_status{namespace='$namespace', pod=~'apicast-$env.*', status=~'4.*'}[1m]))", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "4XX", + "refId": "B" + }, + { + "expr": "sum(rate(upstream_status{namespace='$namespace', pod=~'apicast-$env.*', status=~'3.*'}[1m]))", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "3XX", + "refId": "C" + }, + { + "expr": "sum(rate(upstream_status{namespace='$namespace', pod=~'apicast-$env.*', status=~'2.*'}[1m]))", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "2XX", + "refId": "D" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Upstream status codes", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "decimals": 0, + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "reqps", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 30 + }, + "id": 50, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null as zero", + "options": {}, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "delta(nginx_error_log{namespace='$namespace',pod=~'$pod', level=~'error|crit|alert|emerg'}[1m])", + "format": "time_series", + "interval": "1m", + "intervalFactor": 1, + "legendFormat": "{{`{{pod}}`}}: {{`{{level}}`}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "errors / min (${pod})", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "decimals": 0, + "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 + } + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorPrefix": false, + "colorValue": true, + "colors": [ + "#299c46", + "rgba(237, 129, 40, 0.89)", + "#F2495C" + ], + "datasource": "$datasource", + "decimals": 0, + "format": "none", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 2, + "w": 12, + "x": 12, + "y": 30 + }, + "hideTimeOverride": true, + "id": 42, + "interval": "", + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "options": {}, + "pluginVersion": "6.2.4", + "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(delta(nginx_error_log{namespace='$namespace',pod=~'apicast-$env.*', level=~'error|crit|alert|emerg'}[1h]))", + "format": "time_series", + "intervalFactor": 1, + "refId": "A" + } + ], + "thresholds": "1,10,100", + "timeFrom": "30s", + "timeShift": "30s", + "title": "Total APIcast errors (last hour)", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "0", + "value": "null" + } + ], + "valueName": "current" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": true, + "colors": [ + "#299c46", + "rgba(237, 129, 40, 0.89)", + "#F2495C" + ], + "datasource": "$datasource", + "decimals": 0, + "format": "none", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 2, + "w": 12, + "x": 12, + "y": 32 + }, + "hideTimeOverride": true, + "id": 52, + "interval": "", + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "options": {}, + "pluginVersion": "6.2.4", + "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(delta(nginx_error_log{namespace='$namespace',pod=~'apicast-$env.*', level=~'error|crit|alert|emerg'}[6h]))", + "format": "time_series", + "intervalFactor": 1, + "refId": "A" + } + ], + "thresholds": "1,60,600", + "timeFrom": "30s", + "timeShift": "30s", + "title": "Total APIcast errors (last 6h)", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "0", + "value": "null" + } + ], + "valueName": "current" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": true, + "colors": [ + "#299c46", + "rgba(237, 129, 40, 0.89)", + "#F2495C" + ], + "datasource": "$datasource", + "decimals": 0, + "format": "none", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 2, + "w": 12, + "x": 12, + "y": 34 + }, + "hideTimeOverride": true, + "id": 56, + "interval": "", + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "options": {}, + "pluginVersion": "6.2.4", + "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(delta(nginx_error_log{namespace='$namespace',pod=~'apicast-$env.*', level=~'error|crit|alert|emerg'}[12h]))", + "format": "time_series", + "intervalFactor": 1, + "refId": "A" + } + ], + "thresholds": "1,120,1200", + "timeFrom": "30s", + "timeShift": "30s", + "title": "Total APIcast errors (last 12h)", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "0", + "value": "null" + } + ], + "valueName": "current" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": true, + "colors": [ + "#299c46", + "rgba(237, 129, 40, 0.89)", + "#F2495C" + ], + "datasource": "$datasource", + "decimals": 0, + "format": "none", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 2, + "w": 12, + "x": 12, + "y": 36 + }, + "hideTimeOverride": true, + "id": 54, + "interval": "", + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "options": {}, + "pluginVersion": "6.2.4", + "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(delta(nginx_error_log{namespace='$namespace',pod=~'apicast-$env.*', level=~'error|crit|alert|emerg'}[24h]))", + "format": "time_series", + "intervalFactor": 1, + "refId": "A" + } + ], + "thresholds": "1,240,2400", + "timeFrom": "30s", + "timeShift": "30s", + "title": "Total APIcast errors (last 24h)", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "0", + "value": "null" + } + ], + "valueName": "current" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "gridPos": { + "h": 9, + "w": 24, + "x": 0, + "y": 38 + }, + "id": 59, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": {}, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(rate(threescale_backend_calls{namespace='$namespace', pod=~'apicast-$env.*'}[1m])) by (endpoint, status)", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{`{{endpoint}}`}}: {{`{{status}}`}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "3scale Backend calls", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "decimals": 0, + "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 + } + }, + { + "cacheTimeout": null, + "gridPos": { + "h": 8, + "w": 8, + "x": 0, + "y": 47 + }, + "id": 44, + "interval": "", + "links": [], + "maxPerRow": 3, + "options": { + "displayMode": "lcd", + "fieldOptions": { + "calcs": [ + "mean" + ], + "defaults": { + "max": 100, + "min": 0, + "unit": "percent" + }, + "mappings": [], + "override": {}, + "thresholds": [ + { + "color": "green", + "index": 0, + "value": null + }, + { + "color": "#EAB839", + "index": 1, + "value": 80 + }, + { + "color": "red", + "index": 2, + "value": 90 + } + ], + "values": false + }, + "orientation": "horizontal" + }, + "pluginVersion": "6.2.4", + "repeat": "pod", + "repeatDirection": "h", + "targets": [ + { + "expr": "100 - (openresty_shdict_free_space{namespace='$namespace',pod='$pod'} / openresty_shdict_capacity{namespace='$namespace',pod='$pod'} * 100)", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{`{{dict}}`}}", + "refId": "A" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Used shared dictionaries space ($pod)", + "type": "bargauge" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 55 + }, + "id": 13, + "panels": [], + "title": "Pods", + "type": "row" + }, + { + "cacheTimeout": null, + "colorBackground": true, + "colorValue": false, + "colors": [ + "#F2495C", + "rgba(237, 129, 40, 0.89)", + "#299c46" + ], + "datasource": "$datasource", + "decimals": 0, + "format": "none", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 6, + "x": 0, + "y": 56 + }, + "hideTimeOverride": true, + "id": 30, + "interval": "", + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "options": {}, + "pluginVersion": "6.2.4", + "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_replicationcontroller_status_ready_replicas{namespace='$namespace',replicationcontroller=~'apicast-$env.*'})", + "format": "time_series", + "intervalFactor": 1, + "refId": "A" + } + ], + "thresholds": "1,2", + "timeFrom": "30s", + "timeShift": "30s", + "title": "Running pods", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "0", + "value": "null" + } + ], + "valueName": "avg" + }, + { + "cacheTimeout": null, + "colorBackground": true, + "colorPrefix": false, + "colorValue": false, + "colors": [ + "#299c46", + "rgba(237, 129, 40, 0.89)", + "#F2495C" + ], + "datasource": "$datasource", + "decimals": 0, + "format": "none", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 6, + "x": 6, + "y": 56 + }, + "hideTimeOverride": true, + "id": 32, + "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": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "sum(kube_replicationcontroller_spec_replicas{namespace='$namespace',replicationcontroller=~'apicast-$env.*'}) - sum(kube_replicationcontroller_status_ready_replicas{namespace='$namespace',replicationcontroller=~'apicast-$env.*'})", + "format": "time_series", + "intervalFactor": 1, + "refId": "A" + } + ], + "thresholds": "1,2", + "timeFrom": "30s", + "timeShift": "30s", + "title": "Unavailable pods", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "0", + "value": "null" + } + ], + "valueName": "avg" + }, + { + "cacheTimeout": null, + "colorBackground": true, + "colorValue": false, + "colors": [ + "#F2495C", + "rgba(237, 129, 40, 0.89)", + "#299c46" + ], + "datasource": "$datasource", + "decimals": 0, + "format": "none", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 6, + "x": 12, + "y": 56 + }, + "hideTimeOverride": true, + "id": 37, + "interval": "", + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "options": {}, + "pluginVersion": "6.2.4", + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "count(count(container_memory_usage_bytes{namespace='$namespace',pod=~'apicast-$env.*'}) by (node))", + "format": "time_series", + "intervalFactor": 1, + "refId": "A" + } + ], + "thresholds": "1,2", + "timeFrom": "30s", + "timeShift": "30s", + "title": "Pods distributed on hosts", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "0", + "value": "null" + } + ], + "valueName": "avg" + }, + { + "cacheTimeout": null, + "colorBackground": true, + "colorValue": false, + "colors": [ + "#299c46", + "rgba(237, 129, 40, 0.89)", + "#d44a3a" + ], + "datasource": "$datasource", + "decimals": 0, + "format": "none", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 6, + "x": 18, + "y": 56 + }, + "hideTimeOverride": true, + "id": 36, + "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": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "max(sum(delta(kube_pod_container_status_restarts_total{namespace='$namespace',pod=~'apicast-$env.*'}[5m])) by (pod))", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "", + "refId": "A" + } + ], + "thresholds": "1,2", + "timeFrom": "30s", + "timeShift": "30s", + "title": "Max pods restarts (last 5 minutes)", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "0", + "value": "null" + } + ], + "valueName": "avg" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 59 + }, + "id": 11, + "legend": { + "avg": false, + "current": false, + "hideEmpty": true, + "hideZero": true, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null as zero", + "options": {}, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(kube_replicationcontroller_spec_replicas{namespace='$namespace',replicationcontroller=~'apicast-$env.*'})", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "total-pods", + "legendLink": null, + "refId": "A", + "step": 10 + }, + { + "expr":"sum(kube_replicationcontroller_status_ready_replicas{namespace='$namespace',replicationcontroller=~'apicast-$env.*'})", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "avail-pods", + "refId": "B" + }, + { + "expr": "sum(kube_replicationcontroller_spec_replicas{namespace='$namespace',replicationcontroller=~'apicast-$env.*'}) - sum(kube_replicationcontroller_status_ready_replicas{namespace='$namespace',replicationcontroller=~'apicast-$env.*'})", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "unavail-pods", + "refId": "C" + }, + { + "expr": "count(count(container_memory_usage_bytes{namespace='$namespace',pod=~'apicast-$env.*'}) by (node))", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "used-hosts", + "refId": "D" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Pod count (total, avail, unvail) and pods hosts distribution", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "decimals": 0, + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "gridPos": { + "h": 6, + "w": 24, + "x": 0, + "y": 66 + }, + "id": 9, + "legend": { + "avg": false, + "current": false, + "hideEmpty": true, + "hideZero": true, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": {}, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(delta(kube_pod_container_status_restarts_total{namespace='$namespace',pod=~'apicast-$env.*'}[5m])) by (pod)", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{`{{pod}}`}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Pods restarts (last 5 minutes)", + "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": 72 + }, + "id": 4, + "panels": [], + "repeat": null, + "title": "CPU Usage", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 73 + }, + "id": 0, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null as zero", + "options": {}, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_rate{namespace=~'$namespace', pod=~'apicast-$env.*'}) by (pod)", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{`{{pod}}`}}", + "legendLink": null, + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "CPU Usage", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 80 + }, + "id": 5, + "panels": [], + "repeat": null, + "title": "CPU Quota", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "columns": [], + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "fontSize": "100%", + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 81 + }, + "id": 1, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null as zero", + "options": {}, + "pageSize": null, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "scroll": true, + "seriesOverrides": [], + "showHeader": true, + "sort": { + "col": 1, + "desc": false + }, + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "styles": [ + { + "alias": "Time", + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "pattern": "Time", + "type": "hidden" + }, + { + "alias": "CPU Usage", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #A", + "thresholds": [], + "type": "number", + "unit": "short" + }, + { + "alias": "CPU Requests", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #B", + "thresholds": [], + "type": "number", + "unit": "short" + }, + { + "alias": "CPU Requests %", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #C", + "thresholds": [], + "type": "number", + "unit": "percentunit" + }, + { + "alias": "CPU Limits", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #D", + "thresholds": [], + "type": "number", + "unit": "short" + }, + { + "alias": "CPU Limits %", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #E", + "thresholds": [], + "type": "number", + "unit": "percentunit" + }, + { + "alias": "Pod", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": true, + "linkTooltip": "Drill down", + "linkUrl": "/d/{{ .Namespace }}/{{ .Namespace }}-3scale-kubernetes-compute-resources-pod?var-namespace=$namespace&var-pod=$__cell", + "pattern": "pod", + "thresholds": [], + "type": "number", + "unit": "short" + }, + { + "alias": "", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "pattern": "/.*/", + "thresholds": [], + "type": "string", + "unit": "short" + } + ], + "targets": [ + { + "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_rate{namespace=~'$namespace', pod=~'apicast-$env.*'}) by (pod)", + "format": "table", + "instant": true, + "intervalFactor": 2, + "legendFormat": "", + "refId": "A", + "step": 10 + }, + { + "expr": "sum(kube_pod_container_resource_requests_cpu_cores{namespace=~'$namespace', pod=~'apicast-$env.*'}) by (pod)", + "format": "table", + "instant": true, + "intervalFactor": 2, + "legendFormat": "", + "refId": "B", + "step": 10 + }, + { + "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_rate{namespace=~'$namespace', pod=~'apicast-$env.*'}) by (pod) / sum(kube_pod_container_resource_requests_cpu_cores{namespace=~'$namespace', pod=~'apicast-.*'}) by (pod)", + "format": "table", + "instant": true, + "intervalFactor": 2, + "legendFormat": "", + "refId": "C", + "step": 10 + }, + { + "expr": "sum(kube_pod_container_resource_limits_cpu_cores{namespace=~'$namespace', pod=~'apicast-$env.*'}) by (pod)", + "format": "table", + "instant": true, + "intervalFactor": 2, + "legendFormat": "", + "refId": "D", + "step": 10 + }, + { + "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_rate{namespace=~'$namespace', pod=~'apicast-$env.*'}) by (pod) / sum(kube_pod_container_resource_limits_cpu_cores{namespace=~'$namespace', pod=~'apicast-.*'}) by (pod)", + "format": "table", + "instant": true, + "intervalFactor": 2, + "legendFormat": "", + "refId": "E", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "CPU Quota", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transform": "table", + "type": "table", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 88 + }, + "id": 6, + "panels": [], + "repeat": null, + "title": "Memory Usage", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 89 + }, + "id": 2, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null as zero", + "options": {}, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(container_memory_usage_bytes{namespace=~'$namespace', pod=~'apicast-$env.*', container!=''}) by (pod)", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{`{{pod}}`}}", + "legendLink": null, + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Memory Usage", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 96 + }, + "id": 7, + "panels": [], + "repeat": null, + "title": "Memory Quota", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "columns": [], + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "fontSize": "100%", + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 97 + }, + "id": 3, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null as zero", + "options": {}, + "pageSize": null, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "scroll": true, + "seriesOverrides": [], + "showHeader": true, + "sort": { + "col": 1, + "desc": true + }, + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "styles": [ + { + "alias": "Time", + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "pattern": "Time", + "type": "hidden" + }, + { + "alias": "Memory Usage", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #A", + "thresholds": [], + "type": "number", + "unit": "decbytes" + }, + { + "alias": "Memory Requests", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #B", + "thresholds": [], + "type": "number", + "unit": "decbytes" + }, + { + "alias": "Memory Requests %", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #C", + "thresholds": [], + "type": "number", + "unit": "percentunit" + }, + { + "alias": "Memory Limits", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #D", + "thresholds": [], + "type": "number", + "unit": "decbytes" + }, + { + "alias": "Memory Limits %", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #E", + "thresholds": [], + "type": "number", + "unit": "percentunit" + }, + { + "alias": "Pod", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": true, + "linkTooltip": "Drill down", + "linkUrl": "/d/{{ .Namespace }}/{{ .Namespace }}-3scale-kubernetes-compute-resources-pod?var-namespace=$namespace&var-pod=$__cell", + "pattern": "pod", + "thresholds": [], + "type": "number", + "unit": "short" + }, + { + "alias": "", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "pattern": "/.*/", + "thresholds": [], + "type": "string", + "unit": "short" + } + ], + "targets": [ + { + "expr": "sum(container_memory_usage_bytes{namespace=~'$namespace', pod=~'apicast-$env.*', container!=''}) by (pod)", + "format": "table", + "instant": true, + "intervalFactor": 2, + "legendFormat": "", + "refId": "A", + "step": 10 + }, + { + "expr": "sum(kube_pod_container_resource_requests_memory_bytes{namespace=~'$namespace', pod=~'apicast-$env.*'}) by (pod)", + "format": "table", + "instant": true, + "intervalFactor": 2, + "legendFormat": "", + "refId": "B", + "step": 10 + }, + { + "expr": "sum(container_memory_usage_bytes{namespace=~'$namespace', pod=~'apicast-$env.*', container!=''}) by (pod) / sum(kube_pod_container_resource_requests_memory_bytes{namespace=~'$namespace', pod=~'apicast-.*'}) by (pod)", + "format": "table", + "instant": true, + "intervalFactor": 2, + "legendFormat": "", + "refId": "C", + "step": 10 + }, + { + "expr": "sum(kube_pod_container_resource_limits_memory_bytes{namespace=~'$namespace', pod=~'apicast-$env.*'}) by (pod)", + "format": "table", + "instant": true, + "intervalFactor": 2, + "legendFormat": "", + "refId": "D", + "step": 10 + }, + { + "expr": "sum(container_memory_usage_bytes{namespace=~'$namespace', pod=~'apicast-$env.*', container!=''}) by (pod) / sum(kube_pod_container_resource_limits_memory_bytes{namespace=~'$namespace', pod=~'apicast-.*'}) by (pod)", + "format": "table", + "instant": true, + "intervalFactor": 2, + "legendFormat": "", + "refId": "E", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory Quota", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transform": "table", + "type": "table", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 104 + }, + "id": 15, + "panels": [], + "title": "Network Usage", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "gridPos": { + "h": 6, + "w": 24, + "x": 0, + "y": 105 + }, + "id": 17, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": {}, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(irate(container_network_receive_bytes_total{namespace=~'$namespace', pod=~'apicast-$env.*'}[5m])) by (pod)", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{`{{pod}}`}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Receive Bandwidth", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "decimals": null, + "format": "Bps", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "gridPos": { + "h": 6, + "w": 24, + "x": 0, + "y": 111 + }, + "id": 18, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": {}, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(irate(container_network_transmit_bytes_total{namespace=~'$namespace', pod=~'apicast-$env.*'}[5m])) by (pod)", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{`{{pod}}`}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Transmit Bandwidth", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "Bps", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + } + ], + "refresh": "10s", + "schemaVersion": 18, + "style": "dark", + "tags": [ + "3scale", + "apicast" + ], + "templating": { + "list": [ + { + "hide": 0, + "includeAll": false, + "label": null, + "multi": false, + "name": "datasource", + "options": [], + "query": "prometheus", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "type": "datasource" + }, + { + "allValue": null, + "current": { + "tags": [], + "text": "{{ .Namespace }}", + "value": "{{ .Namespace }}" + }, + "hide": 0, + "includeAll": false, + "label": "namespace", + "multi": false, + "name": "namespace", + "options": [ + { + "selected": true, + "text": "{{ .Namespace }}", + "value": "{{ .Namespace }}" + } + ], + "query": "{{ .Namespace }}", + "skipUrlSync": false, + "type": "custom" + }, + { + "allValue": null, + "current": { + "selected": true, + "text": "production", + "value": "production" + }, + "hide": 0, + "includeAll": false, + "label": "environment", + "multi": false, + "name": "env", + "options": [ + { + "selected": true, + "text": "production", + "value": "production" + }, + { + "selected": false, + "text": "staging", + "value": "staging" + } + ], + "query": "production,staging", + "skipUrlSync": false, + "type": "custom" + }, + { + "allValue": null, + "current": { + "text": "All", + "value": [ + "$__all" + ] + }, + "datasource": "$datasource", + "definition": "label_values(nginx_http_connections{namespace='$namespace', pod=~'apicast-$env.*'}, pod)", + "hide": 0, + "includeAll": true, + "label": null, + "multi": true, + "name": "pod", + "options": [], + "query": "label_values(nginx_http_connections{namespace='$namespace', pod=~'apicast-$env.*'}, pod)", + "refresh": 2, + "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": "{{ .Namespace }}/ 3scale / Apicast" +} \ No newline at end of file diff --git a/pkg/assets/assets/monitoring/apicast-grafana-dashboard-2.json.tpl b/pkg/assets/assets/monitoring/apicast-grafana-dashboard-2.json.tpl new file mode 100644 index 000000000..994e97166 --- /dev/null +++ b/pkg/assets/assets/monitoring/apicast-grafana-dashboard-2.json.tpl @@ -0,0 +1,553 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "gnetId": null, + "graphTooltip": 0, + "links": [], + "panels": [ + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 20, + "panels": [], + "repeat": "service_id", + "title": "$service_id - $service_name", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 1 + }, + "id": 60, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": {}, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(rate(upstream_status{namespace='$namespace', pod=~'apicast-$env.*', service_id='$service_id'}[1m])) by (status)", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{`{{status}}`}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Upstream HTTP status codes (per second rate)", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "decimals": 0, + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "reqps", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "fill": 5, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 1 + }, + "id": 63, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": {}, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "histogram_quantile($percentile/100, sum(rate(total_response_time_seconds_bucket{namespace='$namespace', pod=~'apicast-$env.*', service_id='$service_id'}[1m])) by (le))", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "Total request time", + "refId": "A" + }, + { + "expr": "histogram_quantile($percentile/100, sum(rate(upstream_response_time_seconds_bucket{namespace='$namespace', pod=~'apicast-$env.*', service_id='$service_id'}[1m])) by (le))", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "Upstream request time", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Total request time vs upstream request time (${percentile}th percentile)", + "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": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "cards": { + "cardPadding": null, + "cardRound": null + }, + "color": { + "cardColor": "#73BF69", + "colorScale": "sqrt", + "colorScheme": "interpolateOranges", + "exponent": 0.5, + "mode": "opacity" + }, + "dataFormat": "tsbuckets", + "datasource": "$datasource", + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 11 + }, + "heatmap": {}, + "hideZeroBuckets": false, + "highlightCards": true, + "id": 58, + "legend": { + "show": true + }, + "links": [], + "options": {}, + "reverseYBuckets": false, + "targets": [ + { + "expr": "sum(rate(total_response_time_seconds_bucket{namespace='$namespace', pod=~'apicast-$env-.*', service_id='$service_id'}[1m])) by (le)", + "format": "heatmap", + "instant": false, + "intervalFactor": 10, + "legendFormat": "{{`{{le}}`}}", + "refId": "A" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Response time heatmap (by time bucket)", + "tooltip": { + "show": true, + "showHistogram": true + }, + "type": "heatmap", + "xAxis": { + "show": true + }, + "xBucketNumber": null, + "xBucketSize": null, + "yAxis": { + "decimals": 0, + "format": "s", + "logBase": 1, + "max": null, + "min": null, + "show": true, + "splitFactor": null + }, + "yBucketBound": "auto", + "yBucketNumber": null, + "yBucketSize": null + }, + { + "cards": { + "cardPadding": null, + "cardRound": null + }, + "color": { + "cardColor": "#FADE2A", + "colorScale": "sqrt", + "colorScheme": "interpolateOranges", + "exponent": 0.5, + "mode": "opacity" + }, + "dataFormat": "tsbuckets", + "datasource": "$datasource", + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 11 + }, + "heatmap": {}, + "hideZeroBuckets": false, + "highlightCards": true, + "id": 61, + "legend": { + "show": true + }, + "links": [], + "options": {}, + "reverseYBuckets": false, + "targets": [ + { + "expr": "sum(rate(upstream_response_time_seconds_bucket{namespace='$namespace', pod=~'apicast-$env.*', service_id='$service_id'}[1m])) by (le)", + "format": "heatmap", + "intervalFactor": 10, + "legendFormat": "{{`{{le}}`}}", + "refId": "A" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Upstream response time heatmap (by time bucket)", + "tooltip": { + "show": true, + "showHistogram": true + }, + "type": "heatmap", + "xAxis": { + "show": true + }, + "xBucketNumber": null, + "xBucketSize": null, + "yAxis": { + "decimals": 0, + "format": "s", + "logBase": 1, + "max": null, + "min": null, + "show": true, + "splitFactor": null + }, + "yBucketBound": "auto", + "yBucketNumber": null, + "yBucketSize": null + } + ], + "refresh": "10s", + "schemaVersion": 18, + "style": "dark", + "tags": [ + "3scale", + "apicast" + ], + "templating": { + "list": [ + { + "hide": 0, + "includeAll": false, + "label": null, + "multi": false, + "name": "datasource", + "options": [], + "query": "prometheus", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "type": "datasource" + }, + { + "allValue": null, + "current": { + "tags": [], + "text": "{{ .Namespace }}", + "value": "{{ .Namespace }}" + }, + "hide": 0, + "includeAll": false, + "label": "namespace", + "multi": false, + "name": "namespace", + "options": [ + { + "selected": true, + "text": "{{ .Namespace }}", + "value": "{{ .Namespace }}" + } + ], + "query": "{{ .Namespace }}", + "skipUrlSync": false, + "type": "custom" + }, + { + "allValue": null, + "current": { + "selected": false, + "tags": [], + "text": "production", + "value": "production" + }, + "hide": 0, + "includeAll": false, + "label": "environment", + "multi": false, + "name": "env", + "options": [ + { + "selected": true, + "text": "production", + "value": "production" + }, + { + "selected": false, + "text": "staging", + "value": "staging" + } + ], + "query": "production,staging", + "skipUrlSync": false, + "type": "custom" + }, + { + "allValue": null, + "datasource": "$datasource", + "definition": "label_values(total_response_time_seconds_bucket{namespace='$namespace', pod=~'apicast-$env.*'}, service_id)", + "hide": 0, + "includeAll": false, + "label": "", + "multi": true, + "name": "service_id", + "options": [], + "query": "label_values(total_response_time_seconds_bucket{namespace='$namespace', pod=~'apicast-$env.*'}, service_id)", + "refresh": 2, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "allValue": null, + "current": { + "text": "api", + "value": "api" + }, + "datasource": "$datasource", + "definition": "label_values(total_response_time_seconds_bucket{namespace='$namespace', pod=~'apicast-$env-.*', service_id='$service_id'}, service_system_name)", + "hide": 2, + "includeAll": false, + "label": "", + "multi": true, + "name": "service_name", + "options": [ + { + "selected": true, + "text": "api", + "value": "api" + } + ], + "query": "label_values(total_response_time_seconds_bucket{namespace='$namespace', pod=~'apicast-$env-.*', service_id='$service_id'}, service_system_name)", + "refresh": 0, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "allValue": null, + "current": { + "tags": [], + "text": "95", + "value": "95" + }, + "hide": 0, + "includeAll": false, + "label": null, + "multi": false, + "name": "percentile", + "options": [ + { + "selected": false, + "text": "99", + "value": "99" + }, + { + "selected": true, + "text": "95", + "value": "95" + }, + { + "selected": false, + "text": "90", + "value": "90" + }, + { + "selected": false, + "text": "80", + "value": "80" + }, + { + "selected": false, + "text": "70", + "value": "70" + }, + { + "selected": false, + "text": "50", + "value": "50" + } + ], + "query": "99, 95, 90, 80, 70, 50", + "skipUrlSync": false, + "type": "custom" + } + ] + }, + "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": "{{ .Namespace }} / 3scale / Apicast Services" +} \ No newline at end of file diff --git a/pkg/assets/assets/monitoring/backend-grafana-dashboard-1.json.tpl b/pkg/assets/assets/monitoring/backend-grafana-dashboard-1.json.tpl new file mode 100644 index 000000000..9fa108494 --- /dev/null +++ b/pkg/assets/assets/monitoring/backend-grafana-dashboard-1.json.tpl @@ -0,0 +1,3001 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "gnetId": null, + "graphTooltip": 0, + "id": 1, + "links": [], + "panels": [ + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 20, + "panels": [], + "title": "Listeners", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 1 + }, + "id": 39, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": {}, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(rate(apisonator_listener_response_codes{namespace=\"$namespace\",request_type=\"authorize\"}[1m]))", + "format": "time_series", + "interval": "1m", + "intervalFactor": 10, + "legendFormat": "authorize", + "refId": "A" + }, + { + "expr": "sum(rate(apisonator_listener_response_codes{namespace=\"$namespace\",request_type=\"authrep\"}[1m]))", + "format": "time_series", + "interval": "1m", + "intervalFactor": 10, + "legendFormat": "authrep", + "refId": "B" + }, + { + "expr": "sum(rate(apisonator_listener_response_codes{namespace=\"$namespace\",request_type=\"report\"}[1m]))", + "format": "time_series", + "interval": "1m", + "intervalFactor": 10, + "legendFormat": "report", + "refId": "C" + }, + { + "expr": "sum(rate(apisonator_listener_response_codes{namespace=\"$namespace\",request_type=\"authorize_oauth\"}[1m]))", + "format": "time_series", + "interval": "1m", + "intervalFactor": 10, + "legendFormat": "authorize_oauth", + "refId": "D" + }, + { + "expr": "sum(rate(apisonator_listener_response_codes{namespace=\"$namespace\",request_type=\"authrep_oauth\"}[1m]))", + "format": "time_series", + "interval": "1m", + "intervalFactor": 10, + "legendFormat": "authrep_oauth", + "refId": "E" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Listener requests per second (by request type)", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "decimals": 0, + "format": "reqps", + "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": "$datasource", + "fill": 1, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 1 + }, + "id": 41, + "legend": { + "avg": false, + "current": false, + "hideEmpty": true, + "hideZero": true, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": {}, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(rate(apisonator_listener_response_codes{namespace=\"$namespace\",resp_code=\"2xx\"}[1m]))", + "format": "time_series", + "interval": "1m", + "intervalFactor": 10, + "legendFormat": "2XX", + "refId": "A" + }, + { + "expr": "sum(rate(apisonator_listener_response_codes{namespace=\"$namespace\",resp_code=\"403\"}[1m]))", + "format": "time_series", + "interval": "1m", + "intervalFactor": 10, + "legendFormat": "403", + "refId": "B" + }, + { + "expr": "sum(rate(apisonator_listener_response_codes{namespace=\"$namespace\",resp_code=\"404\"}[1m]))", + "format": "time_series", + "interval": "1m", + "intervalFactor": 10, + "legendFormat": "404", + "refId": "C" + }, + { + "expr": "sum(rate(apisonator_listener_response_codes{namespace=\"$namespace\",resp_code=\"409\"}[1m]))", + "format": "time_series", + "interval": "1m", + "intervalFactor": 10, + "legendFormat": "409", + "refId": "D" + }, + { + "expr": "sum(rate(apisonator_listener_response_codes{namespace=\"$namespace\",resp_code=\"5xx\"}[1m]))", + "format": "time_series", + "interval": "1m", + "intervalFactor": 10, + "legendFormat": "5XX", + "refId": "E" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Listener requests per second (by response code)", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "decimals": 0, + "format": "reqps", + "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": "$datasource", + "fill": 1, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 9 + }, + "id": 43, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": {}, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(rate(apisonator_listener_response_times_seconds_bucket{namespace=\"$namespace\",request_type=\"authorize\"}[1m])) by (le)", + "format": "heatmap", + "interval": "1m", + "intervalFactor": 10, + "legendFormat": "{{`{{ le }}`}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Authorize requests per second (by response time bucket in seconds)", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "decimals": 0, + "format": "reqps", + "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 + } + }, + { + "cards": { + "cardPadding": null, + "cardRound": null + }, + "color": { + "cardColor": "#FADE2A", + "colorScale": "sqrt", + "colorScheme": "interpolateOranges", + "exponent": 0.5, + "mode": "opacity" + }, + "dataFormat": "tsbuckets", + "datasource": "$datasource", + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 9 + }, + "heatmap": {}, + "hideZeroBuckets": false, + "highlightCards": true, + "id": 45, + "legend": { + "show": false + }, + "links": [], + "options": {}, + "reverseYBuckets": false, + "targets": [ + { + "expr": "sum(rate(apisonator_listener_response_times_seconds_bucket{namespace=\"$namespace\",request_type=\"authorize\"}[1m])) by (le)", + "format": "heatmap", + "interval": "1m", + "intervalFactor": 10, + "legendFormat": "{{`{{ le }}`}}", + "refId": "A" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Authorize requests per second heatmap (by response time bucket in seconds)", + "tooltip": { + "show": true, + "showHistogram": false + }, + "type": "heatmap", + "xAxis": { + "show": true + }, + "xBucketNumber": null, + "xBucketSize": null, + "yAxis": { + "decimals": 0, + "format": "s", + "logBase": 1, + "max": null, + "min": null, + "show": true, + "splitFactor": null + }, + "yBucketBound": "auto", + "yBucketNumber": null, + "yBucketSize": null + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 17 + }, + "id": 47, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": {}, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(rate(apisonator_listener_response_times_seconds_bucket{namespace=\"$namespace\",request_type=\"authrep\"}[1m])) by (le)", + "format": "heatmap", + "interval": "1m", + "intervalFactor": 10, + "legendFormat": "{{`{{ le }}`}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Authrep requests per second (by response time bucket in seconds)", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "decimals": 0, + "format": "reqps", + "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 + } + }, + { + "cards": { + "cardPadding": null, + "cardRound": null + }, + "color": { + "cardColor": "#5794F2", + "colorScale": "sqrt", + "colorScheme": "interpolateOranges", + "exponent": 0.5, + "mode": "opacity" + }, + "dataFormat": "tsbuckets", + "datasource": "$datasource", + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 17 + }, + "heatmap": {}, + "hideZeroBuckets": false, + "highlightCards": true, + "id": 59, + "legend": { + "show": false + }, + "links": [], + "options": {}, + "reverseYBuckets": false, + "targets": [ + { + "expr": "sum(rate(apisonator_listener_response_times_seconds_bucket{namespace=\"$namespace\",request_type=\"authrep\"}[1m])) by (le)", + "format": "heatmap", + "interval": "1m", + "intervalFactor": 10, + "legendFormat": "{{`{{ le }}`}}", + "refId": "A" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Authrep requests per second heatmap (by response time bucket in seconds)", + "tooltip": { + "show": true, + "showHistogram": false + }, + "type": "heatmap", + "xAxis": { + "show": true + }, + "xBucketNumber": null, + "xBucketSize": null, + "yAxis": { + "decimals": 0, + "format": "s", + "logBase": 1, + "max": null, + "min": null, + "show": true, + "splitFactor": null + }, + "yBucketBound": "auto", + "yBucketNumber": null, + "yBucketSize": null + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 25 + }, + "id": 50, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": {}, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(rate(apisonator_listener_response_times_seconds_bucket{namespace=\"$namespace\",request_type=\"report\"}[1m])) by (le)", + "format": "heatmap", + "interval": "1m", + "intervalFactor": 10, + "legendFormat": "{{`{{ le }}`}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Report requests per second (by response time bucket in seconds)", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "decimals": 0, + "format": "reqps", + "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 + } + }, + { + "cards": { + "cardPadding": null, + "cardRound": null + }, + "color": { + "cardColor": "#F2495C", + "colorScale": "sqrt", + "colorScheme": "interpolateOranges", + "exponent": 0.5, + "mode": "opacity" + }, + "dataFormat": "tsbuckets", + "datasource": "$datasource", + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 25 + }, + "heatmap": {}, + "hideZeroBuckets": false, + "highlightCards": true, + "id": 58, + "legend": { + "show": false + }, + "links": [], + "options": {}, + "reverseYBuckets": false, + "targets": [ + { + "expr": "sum(rate(apisonator_listener_response_times_seconds_bucket{namespace=\"$namespace\",request_type=\"report\"}[1m])) by (le)", + "format": "heatmap", + "interval": "1m", + "intervalFactor": 10, + "legendFormat": "{{`{{ le }}`}}", + "refId": "A" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Report requests per second heatmap (by response time bucket in seconds)", + "tooltip": { + "show": true, + "showHistogram": false + }, + "type": "heatmap", + "xAxis": { + "show": true + }, + "xBucketNumber": null, + "xBucketSize": null, + "yAxis": { + "decimals": 0, + "format": "s", + "logBase": 1, + "max": null, + "min": null, + "show": true, + "splitFactor": null + }, + "yBucketBound": "auto", + "yBucketNumber": null, + "yBucketSize": null + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 33 + }, + "id": 60, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": {}, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(rate(apisonator_listener_response_times_seconds_bucket{namespace=\"$namespace\",request_type=\"authorize_oauth\"}[1m])) by (le)", + "format": "heatmap", + "interval": "1m", + "intervalFactor": 10, + "legendFormat": "{{`{{ le }}`}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Authorize (oauth) requests per second (by response time bucket in seconds)", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "decimals": 0, + "format": "reqps", + "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 + } + }, + { + "cards": { + "cardPadding": null, + "cardRound": null + }, + "color": { + "cardColor": "#FF9830", + "colorScale": "sqrt", + "colorScheme": "interpolateOranges", + "exponent": 0.5, + "mode": "opacity" + }, + "dataFormat": "tsbuckets", + "datasource": "$datasource", + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 33 + }, + "heatmap": {}, + "hideZeroBuckets": false, + "highlightCards": true, + "id": 61, + "legend": { + "show": false + }, + "links": [], + "options": {}, + "reverseYBuckets": false, + "targets": [ + { + "expr": "sum(rate(apisonator_listener_response_times_seconds_bucket{namespace=\"$namespace\",request_type=\"authorize_oauth\"}[1m])) by (le)", + "format": "heatmap", + "interval": "1m", + "intervalFactor": 10, + "legendFormat": "{{`{{ le }}`}}", + "refId": "A" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Authorize (oauth) requests per second heatmap (by response time bucket in seconds)", + "tooltip": { + "show": true, + "showHistogram": false + }, + "type": "heatmap", + "xAxis": { + "show": true + }, + "xBucketNumber": null, + "xBucketSize": null, + "yAxis": { + "decimals": 0, + "format": "s", + "logBase": 1, + "max": null, + "min": null, + "show": true, + "splitFactor": null + }, + "yBucketBound": "auto", + "yBucketNumber": null, + "yBucketSize": null + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 41 + }, + "id": 62, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": {}, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(rate(apisonator_listener_response_times_seconds_bucket{namespace=\"$namespace\",request_type=\"authrep_oauth\"}[1m])) by (le)", + "format": "heatmap", + "interval": "1m", + "intervalFactor": 10, + "legendFormat": "{{`{{ le }}`}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Authrep (oauth) requests per second (by response time bucket in seconds)", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "decimals": 0, + "format": "reqps", + "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 + } + }, + { + "cards": { + "cardPadding": null, + "cardRound": null + }, + "color": { + "cardColor": "#B877D9", + "colorScale": "sqrt", + "colorScheme": "interpolateOranges", + "exponent": 0.5, + "mode": "opacity" + }, + "dataFormat": "tsbuckets", + "datasource": "$datasource", + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 41 + }, + "heatmap": {}, + "hideZeroBuckets": false, + "highlightCards": true, + "id": 63, + "legend": { + "show": false + }, + "links": [], + "options": {}, + "reverseYBuckets": false, + "targets": [ + { + "expr": "sum(rate(apisonator_listener_response_times_seconds_bucket{namespace=\"$namespace\",request_type=\"authrep_oauth\"}[1m])) by (le)", + "format": "heatmap", + "interval": "1m", + "intervalFactor": 10, + "legendFormat": "{{`{{ le }}`}}", + "refId": "A" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Authrep (oauth) requests per second heatmap (by response time bucket in seconds)", + "tooltip": { + "show": true, + "showHistogram": false + }, + "type": "heatmap", + "xAxis": { + "show": true + }, + "xBucketNumber": null, + "xBucketSize": null, + "yAxis": { + "decimals": 0, + "format": "s", + "logBase": 1, + "max": null, + "min": null, + "show": true, + "splitFactor": null + }, + "yBucketBound": "auto", + "yBucketNumber": null, + "yBucketSize": null + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 49 + }, + "id": 52, + "panels": [], + "title": "Workers", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "gridPos": { + "h": 8, + "w": 24, + "x": 0, + "y": 50 + }, + "id": 49, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": {}, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(rate(apisonator_worker_job_count{namespace=\"$namespace\"} [1m])) by (type)", + "format": "time_series", + "interval": "1m", + "intervalFactor": 10, + "legendFormat": "{{`{{ type }}`}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Jobs per second (by job type)", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "decimals": 0, + "format": "ops", + "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": "$datasource", + "fill": 1, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 58 + }, + "id": 54, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": {}, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(rate(apisonator_worker_job_runtime_seconds_bucket{namespace=\"$namespace\",type=\"ReportJob\"}[1m])) by (le)", + "format": "heatmap", + "interval": "1m", + "intervalFactor": 10, + "legendFormat": "{{`{{ le }}`}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Report jobs per second (by runtime bucket in seconds)", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "decimals": 0, + "format": "ops", + "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 + } + }, + { + "cards": { + "cardPadding": null, + "cardRound": null + }, + "color": { + "cardColor": "#5794F2", + "colorScale": "sqrt", + "colorScheme": "interpolateOranges", + "exponent": 0.5, + "mode": "opacity" + }, + "dataFormat": "tsbuckets", + "datasource": "$datasource", + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 58 + }, + "heatmap": {}, + "hideZeroBuckets": false, + "highlightCards": true, + "id": 55, + "legend": { + "show": false + }, + "links": [], + "options": {}, + "reverseYBuckets": false, + "targets": [ + { + "expr": "sum(rate(apisonator_worker_job_runtime_seconds_bucket{namespace=\"$namespace\",type=\"ReportJob\"}[1m])) by (le)", + "format": "heatmap", + "interval": "1m", + "intervalFactor": 10, + "legendFormat": "{{`{{ le }}`}}", + "refId": "A" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Report jobs per second heatmap (by runtime bucket in seconds)", + "tooltip": { + "show": true, + "showHistogram": false + }, + "type": "heatmap", + "xAxis": { + "show": true + }, + "xBucketNumber": null, + "xBucketSize": null, + "yAxis": { + "decimals": 0, + "format": "s", + "logBase": 1, + "max": null, + "min": null, + "show": true, + "splitFactor": null + }, + "yBucketBound": "auto", + "yBucketNumber": null, + "yBucketSize": null + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 66 + }, + "id": 56, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": {}, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(rate(apisonator_worker_job_runtime_seconds_bucket{namespace=\"$namespace\",type=\"NotifyJob\"}[1m])) by (le)", + "format": "heatmap", + "interval": "1m", + "intervalFactor": 10, + "legendFormat": "{{`{{ le }}`}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Notify jobs per second (by runtime bucket in seconds)", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "decimals": 0, + "format": "ops", + "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 + } + }, + { + "cards": { + "cardPadding": null, + "cardRound": null + }, + "color": { + "cardColor": "#b4ff00", + "colorScale": "sqrt", + "colorScheme": "interpolateOranges", + "exponent": 0.5, + "mode": "opacity" + }, + "dataFormat": "tsbuckets", + "datasource": "$datasource", + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 66 + }, + "heatmap": {}, + "hideZeroBuckets": false, + "highlightCards": true, + "id": 57, + "legend": { + "show": false + }, + "links": [], + "options": {}, + "reverseYBuckets": false, + "targets": [ + { + "expr": "sum(rate(apisonator_worker_job_runtime_seconds_bucket{namespace=\"$namespace\",type=\"NotifyJob\"}[1m])) by (le)", + "format": "heatmap", + "interval": "1m", + "intervalFactor": 10, + "legendFormat": "{{`{{ le }}`}}", + "refId": "A" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Notify jobs per second heatmap (by runtime bucket in seconds)", + "tooltip": { + "show": true, + "showHistogram": false + }, + "type": "heatmap", + "xAxis": { + "show": true + }, + "xBucketNumber": null, + "xBucketSize": null, + "yAxis": { + "decimals": 0, + "format": "s", + "logBase": 1, + "max": null, + "min": null, + "show": true, + "splitFactor": null + }, + "yBucketBound": "auto", + "yBucketNumber": null, + "yBucketSize": null + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 74 + }, + "id": 13, + "panels": [], + "repeat": "deploymentConfig", + "title": "Pods ($deploymentConfig)", + "type": "row" + }, + { + "cacheTimeout": null, + "colorBackground": true, + "colorValue": false, + "colors": [ + "#F2495C", + "rgba(237, 129, 40, 0.89)", + "#299c46" + ], + "datasource": "$datasource", + "decimals": 0, + "format": "none", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 6, + "x": 0, + "y": 75 + }, + "hideTimeOverride": true, + "id": 30, + "interval": "", + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "options": {}, + "pluginVersion": "6.2.4", + "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_replicationcontroller_status_ready_replicas{namespace='$namespace',replicationcontroller=~'$deploymentConfig.*'})", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "", + "refId": "A" + } + ], + "thresholds": "1,2", + "timeFrom": "30s", + "timeShift": "30s", + "title": "Running pods", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "0", + "value": "null" + } + ], + "valueName": "avg" + }, + { + "cacheTimeout": null, + "colorBackground": true, + "colorPrefix": false, + "colorValue": false, + "colors": [ + "#299c46", + "rgba(237, 129, 40, 0.89)", + "#F2495C" + ], + "datasource": "$datasource", + "decimals": 0, + "format": "none", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 6, + "x": 6, + "y": 75 + }, + "hideTimeOverride": true, + "id": 32, + "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": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "sum(kube_replicationcontroller_spec_replicas{namespace='$namespace',replicationcontroller=~'$deploymentConfig.*'}) - sum(kube_replicationcontroller_status_ready_replicas{namespace='$namespace',replicationcontroller=~'$deploymentConfig.*'})", + "format": "time_series", + "intervalFactor": 1, + "refId": "A" + } + ], + "thresholds": "1,2", + "timeFrom": "30s", + "timeShift": "30s", + "title": "Unavailable pods", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "0", + "value": "null" + } + ], + "valueName": "avg" + }, + { + "cacheTimeout": null, + "colorBackground": true, + "colorValue": false, + "colors": [ + "#F2495C", + "rgba(237, 129, 40, 0.89)", + "#299c46" + ], + "datasource": "$datasource", + "decimals": 0, + "format": "none", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 6, + "x": 12, + "y": 75 + }, + "hideTimeOverride": true, + "id": 37, + "interval": "", + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "options": {}, + "pluginVersion": "6.2.4", + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "count(count(container_memory_usage_bytes{namespace='$namespace',pod=~'$deploymentConfig-[a-z0-9]+-[a-z0-9]+'}) by (node))", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "", + "refId": "A" + } + ], + "thresholds": "1,2", + "timeFrom": "30s", + "timeShift": "30s", + "title": "Pods distributed on hosts", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "0", + "value": "null" + } + ], + "valueName": "avg" + }, + { + "cacheTimeout": null, + "colorBackground": true, + "colorValue": false, + "colors": [ + "#299c46", + "rgba(237, 129, 40, 0.89)", + "#d44a3a" + ], + "datasource": "$datasource", + "decimals": 0, + "format": "none", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 6, + "x": 18, + "y": 75 + }, + "hideTimeOverride": true, + "id": 36, + "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": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "max(sum(delta(kube_pod_container_status_restarts_total{namespace='$namespace',pod=~'$deploymentConfig-[a-z0-9]+-[a-z0-9]+'}[5m])) by (pod))", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "", + "refId": "A" + } + ], + "thresholds": "1,2", + "timeFrom": "30s", + "timeShift": "30s", + "title": "Max pods restarts (last 5 minutes)", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "0", + "value": "null" + } + ], + "valueName": "avg" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 78 + }, + "id": 11, + "legend": { + "avg": false, + "current": false, + "hideEmpty": true, + "hideZero": true, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null as zero", + "options": {}, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(kube_replicationcontroller_spec_replicas{namespace='$namespace',replicationcontroller=~'$deploymentConfig.*'})", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "total-pods", + "legendLink": null, + "refId": "A", + "step": 10 + }, + { + "expr": "sum(kube_replicationcontroller_status_ready_replicas{namespace='$namespace',replicationcontroller=~'$deploymentConfig.*'})", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "avail-pods", + "refId": "B" + }, + { + "expr": "sum(kube_replicationcontroller_spec_replicas{namespace='$namespace',replicationcontroller=~'$deploymentConfig.*'}) - sum(kube_replicationcontroller_status_ready_replicas{namespace='$namespace',replicationcontroller=~'$deploymentConfig.*'})", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "unavail-pods", + "refId": "C" + }, + { + "expr": "count(count(container_memory_usage_bytes{namespace='$namespace',pod=~'$deploymentConfig-[a-z0-9]+-[a-z0-9]+'}) by (node))", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "used-hosts", + "refId": "D" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Pod count (total, avail, unvail) and pods hosts distribution", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "decimals": 0, + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "gridPos": { + "h": 6, + "w": 24, + "x": 0, + "y": 85 + }, + "id": 9, + "legend": { + "avg": false, + "current": false, + "hideEmpty": true, + "hideZero": true, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": {}, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "repeatedByRow": false, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(delta(kube_pod_container_status_restarts_total{namespace='$namespace',pod=~'$deploymentConfig-[a-z0-9]+-[a-z0-9]+'}[5m])) by (pod)", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{`{{pod}}`}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Pods restarts (last 5 minutes)", + "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": 91 + }, + "id": 4, + "panels": [], + "repeat": "deploymentConfig", + "title": "CPU Usage ($deploymentConfig)", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 92 + }, + "id": 64, + "interval": "", + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null as zero", + "options": {}, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_rate{namespace=~'$namespace',pod=~'$deploymentConfig-[a-z0-9]+-[a-z0-9]+'}) by (pod)", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{`{{pod}}`}}", + "legendLink": null, + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "CPU Usage", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 99 + }, + "id": 5, + "panels": [], + "repeat": "deploymentConfig", + "title": "CPU Quota ($deploymentConfig)", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "columns": [], + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "fontSize": "100%", + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 100 + }, + "id": 1, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null as zero", + "options": {}, + "pageSize": null, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "scroll": true, + "seriesOverrides": [], + "showHeader": true, + "sort": { + "col": 1, + "desc": false + }, + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "styles": [ + { + "alias": "Time", + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "pattern": "Time", + "type": "hidden" + }, + { + "alias": "CPU Usage", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #A", + "thresholds": [], + "type": "number", + "unit": "short" + }, + { + "alias": "CPU Requests", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #B", + "thresholds": [], + "type": "number", + "unit": "short" + }, + { + "alias": "CPU Requests %", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #C", + "thresholds": [], + "type": "number", + "unit": "percentunit" + }, + { + "alias": "CPU Limits", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #D", + "thresholds": [], + "type": "number", + "unit": "short" + }, + { + "alias": "CPU Limits %", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #E", + "thresholds": [], + "type": "number", + "unit": "percentunit" + }, + { + "alias": "Pod", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": true, + "linkTooltip": "Drill down", + "linkUrl": "/d/{{ .Namespace }}/{{ .Namespace }}-3scale-kubernetes-compute-resources-pod?var-namespace=$namespace&var-pod=$__cell", + "pattern": "pod", + "thresholds": [], + "type": "number", + "unit": "short" + }, + { + "alias": "", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "pattern": "/.*/", + "thresholds": [], + "type": "string", + "unit": "short" + } + ], + "targets": [ + { + "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_rate{namespace=~'$namespace',pod=~'$deploymentConfig-[a-z0-9]+-[a-z0-9]+'}) by (pod)", + "format": "table", + "instant": true, + "intervalFactor": 2, + "legendFormat": "", + "refId": "A", + "step": 10 + }, + { + "expr": "sum(kube_pod_container_resource_requests_cpu_cores{namespace=~'$namespace',pod=~'$deploymentConfig-[a-z0-9]+-[a-z0-9]+'}) by (pod)", + "format": "table", + "instant": true, + "intervalFactor": 2, + "legendFormat": "", + "refId": "B", + "step": 10 + }, + { + "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_rate{namespace=~'$namespace',pod=~'$deploymentConfig-[a-z0-9]+-[a-z0-9]+'}) by (pod) / sum(kube_pod_container_resource_requests_cpu_cores{namespace=~'$namespace',pod=~'$deploymentConfig-[a-z0-9]+-[a-z0-9]+'}) by (pod)", + "format": "table", + "instant": true, + "intervalFactor": 2, + "legendFormat": "", + "refId": "C", + "step": 10 + }, + { + "expr": "sum(kube_pod_container_resource_limits_cpu_cores{namespace=~'$namespace',pod=~'$deploymentConfig-[a-z0-9]+-[a-z0-9]+'}) by (pod)", + "format": "table", + "instant": true, + "intervalFactor": 2, + "legendFormat": "", + "refId": "D", + "step": 10 + }, + { + "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_rate{namespace=~'$namespace',pod=~'$deploymentConfig-[a-z0-9]+-[a-z0-9]+'}) by (pod) / sum(kube_pod_container_resource_limits_cpu_cores{namespace=~'$namespace',pod=~'$deploymentConfig-[a-z0-9]+-[a-z0-9]+'}) by (pod)", + "format": "table", + "instant": true, + "intervalFactor": 2, + "legendFormat": "", + "refId": "E", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "CPU Quota", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transform": "table", + "type": "table", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 107 + }, + "id": 6, + "panels": [], + "repeat": "deploymentConfig", + "title": "Memory Usage ($deploymentConfig)", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 108 + }, + "id": 2, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null as zero", + "options": {}, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(container_memory_usage_bytes{namespace=~'$namespace', pod=~'$deploymentConfig-[a-z0-9]+-[a-z0-9]+', container!=''}) by (pod)", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{`{{pod}}`}}", + "legendLink": null, + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Memory Usage", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 115 + }, + "id": 7, + "panels": [], + "repeat": "deploymentConfig", + "title": "Memory Quota ($deploymentConfig)", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "columns": [], + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "fontSize": "100%", + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 116 + }, + "id": 3, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null as zero", + "options": {}, + "pageSize": null, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "scroll": true, + "seriesOverrides": [], + "showHeader": true, + "sort": { + "col": 1, + "desc": true + }, + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "styles": [ + { + "alias": "Time", + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "pattern": "Time", + "type": "hidden" + }, + { + "alias": "Memory Usage", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #A", + "thresholds": [], + "type": "number", + "unit": "decbytes" + }, + { + "alias": "Memory Requests", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #B", + "thresholds": [], + "type": "number", + "unit": "decbytes" + }, + { + "alias": "Memory Requests %", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #C", + "thresholds": [], + "type": "number", + "unit": "percentunit" + }, + { + "alias": "Memory Limits", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #D", + "thresholds": [], + "type": "number", + "unit": "decbytes" + }, + { + "alias": "Memory Limits %", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #E", + "thresholds": [], + "type": "number", + "unit": "percentunit" + }, + { + "alias": "Pod", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": true, + "linkTooltip": "Drill down", + "linkUrl": "/d/{{ .Namespace }}/{{ .Namespace }}-3scale-kubernetes-compute-resources-pod?var-namespace=$namespace&var-pod=$__cell", + "pattern": "pod", + "thresholds": [], + "type": "number", + "unit": "short" + }, + { + "alias": "", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "pattern": "/.*/", + "thresholds": [], + "type": "string", + "unit": "short" + } + ], + "targets": [ + { + "expr": "sum(container_memory_usage_bytes{namespace=~'$namespace',pod=~'$deploymentConfig-[a-z0-9]+-[a-z0-9]+', container!=''}) by (pod)", + "format": "table", + "instant": true, + "intervalFactor": 2, + "legendFormat": "", + "refId": "A", + "step": 10 + }, + { + "expr": "sum(kube_pod_container_resource_requests_memory_bytes{namespace=~'$namespace',pod=~'$deploymentConfig-[a-z0-9]+-[a-z0-9]+'}) by (pod)", + "format": "table", + "instant": true, + "intervalFactor": 2, + "legendFormat": "", + "refId": "B", + "step": 10 + }, + { + "expr": "sum(container_memory_usage_bytes{namespace=~'$namespace',pod=~'$deploymentConfig-[a-z0-9]+-[a-z0-9]+', container!=''}) by (pod) / sum(kube_pod_container_resource_requests_memory_bytes{namespace=~'$namespace',pod=~'$deploymentConfig-[a-z0-9]+-[a-z0-9]+'}) by (pod)", + "format": "table", + "instant": true, + "intervalFactor": 2, + "legendFormat": "", + "refId": "C", + "step": 10 + }, + { + "expr": "sum(kube_pod_container_resource_limits_memory_bytes{namespace=~'$namespace',pod=~'$deploymentConfig-[a-z0-9]+-[a-z0-9]+'}) by (pod)", + "format": "table", + "instant": true, + "intervalFactor": 2, + "legendFormat": "", + "refId": "D", + "step": 10 + }, + { + "expr": "sum(container_memory_usage_bytes{namespace=~'$namespace',pod=~'$deploymentConfig-[a-z0-9]+-[a-z0-9]+', container!=''}) by (pod) / sum(kube_pod_container_resource_limits_memory_bytes{namespace=~'$namespace',pod=~'$deploymentConfig-[a-z0-9]+-[a-z0-9]+'}) by (pod)", + "format": "table", + "instant": true, + "intervalFactor": 2, + "legendFormat": "", + "refId": "E", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory Quota", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transform": "table", + "type": "table", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 123 + }, + "id": 15, + "panels": [], + "repeat": "deploymentConfig", + "title": "Network Usage ($deploymentConfig)", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "gridPos": { + "h": 6, + "w": 24, + "x": 0, + "y": 124 + }, + "id": 17, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": {}, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(irate(container_network_receive_bytes_total{namespace=~'$namespace',pod=~'$deploymentConfig-[a-z0-9]+-[a-z0-9]+'}[5m])) by (pod)", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{`{{pod}}`}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Receive Bandwidth", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "decimals": null, + "format": "Bps", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "gridPos": { + "h": 6, + "w": 24, + "x": 0, + "y": 130 + }, + "id": 18, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": {}, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(irate(container_network_transmit_bytes_total{namespace=~'$namespace',pod=~'$deploymentConfig-[a-z0-9]+-[a-z0-9]+'}[5m])) by (pod)", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{`{{pod}}`}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Transmit Bandwidth", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "Bps", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + } + ], + "refresh": "10s", + "schemaVersion": 18, + "style": "dark", + "tags": [ + "3scale", + "backend" + ], + "templating": { + "list": [ + { + "hide": 0, + "includeAll": false, + "label": null, + "multi": false, + "name": "datasource", + "options": [], + "query": "prometheus", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "type": "datasource" + }, + { + "allValue": null, + "current": { + "tags": [], + "text": "{{ .Namespace }}", + "value": "{{ .Namespace }}" + }, + "hide": 0, + "includeAll": false, + "label": "namespace", + "multi": false, + "name": "namespace", + "options": [ + { + "selected": true, + "text": "{{ .Namespace }}", + "value": "{{ .Namespace }}" + } + ], + "query": "{{ .Namespace }}", + "skipUrlSync": false, + "type": "custom" + }, + { + "allValue": null, + "datasource": "$datasource", + "definition": "label_values(kube_pod_info{namespace='$namespace',pod=~'backend-.*'}, pod)", + "hide": 0, + "includeAll": true, + "label": "deploymentConfig", + "multi": false, + "name": "deploymentConfig", + "options": [], + "query": "label_values(kube_pod_info{namespace='$namespace',pod=~'backend-.*'}, pod)", + "refresh": 1, + "regex": "/(.*)-[a-z0-9]+-[a-z0-9]+/", + "skipUrlSync": false, + "sort": 1, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false + } + ] + }, + "time": { + "from": "now-1h", + "to": "now" + }, + "timepicker": { + "refresh_intervals": [ + "5s", + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ], + "time_options": [ + "5m", + "15m", + "1h", + "6h", + "12h", + "24h", + "2d", + "7d", + "30d" + ] + }, + "timezone": "", + "title": "{{ .Namespace }} / 3scale / Backend", + "version": 1 +} \ No newline at end of file diff --git a/pkg/assets/assets/monitoring/kubernetes-resources-by-namespace-grafana-dashboard-1.json.tpl b/pkg/assets/assets/monitoring/kubernetes-resources-by-namespace-grafana-dashboard-1.json.tpl new file mode 100644 index 000000000..e7f5a383b --- /dev/null +++ b/pkg/assets/assets/monitoring/kubernetes-resources-by-namespace-grafana-dashboard-1.json.tpl @@ -0,0 +1,1764 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "gnetId": null, + "graphTooltip": 0, + "id": 1, + "links": [], + "panels": [ + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 12, + "panels": [], + "repeat": null, + "title": "CPU Usage", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 10, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 1 + }, + "id": 1, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 0, + "links": [], + "nullPointMode": "null as zero", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_rate{cluster=\"$cluster\", namespace=\"$namespace\"}) by (pod)", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{`{{pod}}`}}", + "legendLink": null, + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "CPU Usage", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 8 + }, + "id": 13, + "panels": [], + "repeat": null, + "title": "CPU Quota", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "columns": [], + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "fontSize": "100%", + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 9 + }, + "id": 2, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null as zero", + "options": {}, + "pageSize": null, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "scroll": true, + "seriesOverrides": [], + "showHeader": true, + "sort": { + "col": 0, + "desc": true + }, + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "styles": [ + { + "alias": "Time", + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "pattern": "Time", + "type": "hidden" + }, + { + "alias": "CPU Usage", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #A", + "thresholds": [], + "type": "number", + "unit": "short" + }, + { + "alias": "CPU Requests", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #B", + "thresholds": [], + "type": "number", + "unit": "short" + }, + { + "alias": "CPU Requests %", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #C", + "thresholds": [], + "type": "number", + "unit": "percentunit" + }, + { + "alias": "CPU Limits", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #D", + "thresholds": [], + "type": "number", + "unit": "short" + }, + { + "alias": "CPU Limits %", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #E", + "thresholds": [], + "type": "number", + "unit": "percentunit" + }, + { + "alias": "Pod", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": true, + "linkTooltip": "Drill down", + "linkUrl": "./d/{{ .Namespace }}/{{ .Namespace }}-3scale-kubernetes-compute-resources-pod?var-datasource=$datasource&var-cluster=$cluster&var-namespace=$namespace&var-pod=$__cell", + "pattern": "pod", + "thresholds": [], + "type": "number", + "unit": "short" + }, + { + "alias": "", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "pattern": "/.*/", + "thresholds": [], + "type": "string", + "unit": "short" + } + ], + "targets": [ + { + "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_rate{cluster=\"$cluster\", namespace=\"$namespace\"}) by (pod)", + "format": "table", + "instant": true, + "intervalFactor": 2, + "legendFormat": "", + "refId": "A", + "step": 10 + }, + { + "expr": "sum(kube_pod_container_resource_requests_cpu_cores{cluster=\"$cluster\", namespace=\"$namespace\"}) by (pod)", + "format": "table", + "instant": true, + "intervalFactor": 2, + "legendFormat": "", + "refId": "B", + "step": 10 + }, + { + "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_rate{cluster=\"$cluster\", namespace=\"$namespace\"}) by (pod) / sum(kube_pod_container_resource_requests_cpu_cores{cluster=\"$cluster\", namespace=\"$namespace\"}) by (pod)", + "format": "table", + "instant": true, + "intervalFactor": 2, + "legendFormat": "", + "refId": "C", + "step": 10 + }, + { + "expr": "sum(kube_pod_container_resource_limits_cpu_cores{cluster=\"$cluster\", namespace=\"$namespace\"}) by (pod)", + "format": "table", + "instant": true, + "intervalFactor": 2, + "legendFormat": "", + "refId": "D", + "step": 10 + }, + { + "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_rate{cluster=\"$cluster\", namespace=\"$namespace\"}) by (pod) / sum(kube_pod_container_resource_limits_cpu_cores{cluster=\"$cluster\", namespace=\"$namespace\"}) by (pod)", + "format": "table", + "instant": true, + "intervalFactor": 2, + "legendFormat": "", + "refId": "E", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "CPU Quota", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "transform": "table", + "type": "table", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 16 + }, + "id": 14, + "panels": [], + "repeat": null, + "title": "Memory Usage", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 10, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 17 + }, + "id": 3, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 0, + "links": [], + "nullPointMode": "null as zero", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "sum(container_memory_working_set_bytes{cluster=\"$cluster\", namespace=\"$namespace\", container!=\"\"}) by (pod)", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{`{{pod}}`}}", + "legendLink": null, + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Memory Usage (w/o cache)", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 24 + }, + "id": 15, + "panels": [], + "repeat": null, + "title": "Memory Quota", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "columns": [], + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "fontSize": "100%", + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 25 + }, + "id": 4, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null as zero", + "options": {}, + "pageSize": null, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "scroll": true, + "seriesOverrides": [], + "showHeader": true, + "sort": { + "col": 0, + "desc": true + }, + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "styles": [ + { + "alias": "Time", + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "pattern": "Time", + "type": "hidden" + }, + { + "alias": "Memory Usage", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #A", + "thresholds": [], + "type": "number", + "unit": "bytes" + }, + { + "alias": "Memory Requests", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #B", + "thresholds": [], + "type": "number", + "unit": "bytes" + }, + { + "alias": "Memory Requests %", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #C", + "thresholds": [], + "type": "number", + "unit": "percentunit" + }, + { + "alias": "Memory Limits", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #D", + "thresholds": [], + "type": "number", + "unit": "bytes" + }, + { + "alias": "Memory Limits %", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #E", + "thresholds": [], + "type": "number", + "unit": "percentunit" + }, + { + "alias": "Memory Usage (RSS)", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #F", + "thresholds": [], + "type": "number", + "unit": "bytes" + }, + { + "alias": "Memory Usage (Cache)", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #G", + "thresholds": [], + "type": "number", + "unit": "bytes" + }, + { + "alias": "Memory Usage (Swap)", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #H", + "thresholds": [], + "type": "number", + "unit": "bytes" + }, + { + "alias": "Pod", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": true, + "linkTooltip": "Drill down", + "linkUrl": "./d/{{ .Namespace }}/{{ .Namespace }}-3scale-kubernetes-compute-resources-pod?var-datasource=$datasource&var-cluster=$cluster&var-namespace=$namespace&var-pod=$__cell", + "pattern": "pod", + "thresholds": [], + "type": "number", + "unit": "short" + }, + { + "alias": "", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "pattern": "/.*/", + "thresholds": [], + "type": "string", + "unit": "short" + } + ], + "targets": [ + { + "expr": "sum(container_memory_working_set_bytes{cluster=\"$cluster\", namespace=\"$namespace\",container!=\"\"}) by (pod)", + "format": "table", + "instant": true, + "intervalFactor": 2, + "legendFormat": "", + "refId": "A", + "step": 10 + }, + { + "expr": "sum(kube_pod_container_resource_requests_memory_bytes{cluster=\"$cluster\", namespace=\"$namespace\"}) by (pod)", + "format": "table", + "instant": true, + "intervalFactor": 2, + "legendFormat": "", + "refId": "B", + "step": 10 + }, + { + "expr": "sum(container_memory_working_set_bytes{cluster=\"$cluster\", namespace=\"$namespace\",container!=\"\"}) by (pod) / sum(kube_pod_container_resource_requests_memory_bytes{namespace=\"$namespace\"}) by (pod)", + "format": "table", + "instant": true, + "intervalFactor": 2, + "legendFormat": "", + "refId": "C", + "step": 10 + }, + { + "expr": "sum(kube_pod_container_resource_limits_memory_bytes{cluster=\"$cluster\", namespace=\"$namespace\"}) by (pod)", + "format": "table", + "instant": true, + "intervalFactor": 2, + "legendFormat": "", + "refId": "D", + "step": 10 + }, + { + "expr": "sum(container_memory_working_set_bytes{cluster=\"$cluster\", namespace=\"$namespace\",container!=\"\"}) by (pod) / sum(kube_pod_container_resource_limits_memory_bytes{namespace=\"$namespace\"}) by (pod)", + "format": "table", + "instant": true, + "intervalFactor": 2, + "legendFormat": "", + "refId": "E", + "step": 10 + }, + { + "expr": "sum(container_memory_rss{cluster=\"$cluster\", namespace=\"$namespace\",container!=\"\"}) by (pod)", + "format": "table", + "instant": true, + "intervalFactor": 2, + "legendFormat": "", + "refId": "F", + "step": 10 + }, + { + "expr": "sum(container_memory_cache{cluster=\"$cluster\", namespace=\"$namespace\",container!=\"\"}) by (pod)", + "format": "table", + "instant": true, + "intervalFactor": 2, + "legendFormat": "", + "refId": "G", + "step": 10 + }, + { + "expr": "sum(container_memory_swap{cluster=\"$cluster\", namespace=\"$namespace\",container!=\"\"}) by (pod)", + "format": "table", + "instant": true, + "intervalFactor": 2, + "legendFormat": "", + "refId": "H", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory Quota", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "transform": "table", + "type": "table", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 32 + }, + "id": 16, + "panels": [], + "repeat": null, + "title": "Network", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 33 + }, + "id": 5, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null as zero", + "options": {}, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "styles": [ + { + "alias": "Time", + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "pattern": "Time", + "type": "hidden" + }, + { + "alias": "Current Receive Bandwidth", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #A", + "thresholds": [], + "type": "number", + "unit": "Bps" + }, + { + "alias": "Current Transmit Bandwidth", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #B", + "thresholds": [], + "type": "number", + "unit": "Bps" + }, + { + "alias": "Rate of Received Packets", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #C", + "thresholds": [], + "type": "number", + "unit": "pps" + }, + { + "alias": "Rate of Transmitted Packets", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #D", + "thresholds": [], + "type": "number", + "unit": "pps" + }, + { + "alias": "Rate of Received Packets Dropped", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #E", + "thresholds": [], + "type": "number", + "unit": "pps" + }, + { + "alias": "Rate of Transmitted Packets Dropped", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #F", + "thresholds": [], + "type": "number", + "unit": "pps" + }, + { + "alias": "Pod", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": true, + "linkTooltip": "Drill down to pods", + "linkUrl": "./d/{{ .Namespace }}/{{ .Namespace }}-3scale-kubernetes-compute-resources-pod?var-datasource=$datasource&var-cluster=$cluster&var-namespace=$namespace&var-pod=$__cell", + "pattern": "pod", + "thresholds": [], + "type": "number", + "unit": "short" + }, + { + "alias": "", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "pattern": "/.*/", + "thresholds": [], + "type": "string", + "unit": "short" + } + ], + "targets": [ + { + "expr": "sum(irate(container_network_receive_bytes_total{cluster=\"$cluster\", namespace=~\"$namespace\"}[$interval])) by (pod)", + "format": "table", + "instant": true, + "intervalFactor": 2, + "legendFormat": "", + "refId": "A", + "step": 10 + }, + { + "expr": "sum(irate(container_network_transmit_bytes_total{cluster=\"$cluster\", namespace=~\"$namespace\"}[$interval])) by (pod)", + "format": "table", + "instant": true, + "intervalFactor": 2, + "legendFormat": "", + "refId": "B", + "step": 10 + }, + { + "expr": "sum(irate(container_network_receive_packets_total{cluster=\"$cluster\", namespace=~\"$namespace\"}[$interval])) by (pod)", + "format": "table", + "instant": true, + "intervalFactor": 2, + "legendFormat": "", + "refId": "C", + "step": 10 + }, + { + "expr": "sum(irate(container_network_transmit_packets_total{cluster=\"$cluster\", namespace=~\"$namespace\"}[$interval])) by (pod)", + "format": "table", + "instant": true, + "intervalFactor": 2, + "legendFormat": "", + "refId": "D", + "step": 10 + }, + { + "expr": "sum(irate(container_network_receive_packets_dropped_total{cluster=\"$cluster\", namespace=~\"$namespace\"}[$interval])) by (pod)", + "format": "table", + "instant": true, + "intervalFactor": 2, + "legendFormat": "", + "refId": "E", + "step": 10 + }, + { + "expr": "sum(irate(container_network_transmit_packets_dropped_total{cluster=\"$cluster\", namespace=~\"$namespace\"}[$interval])) by (pod)", + "format": "table", + "instant": true, + "intervalFactor": 2, + "legendFormat": "", + "refId": "F", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Current Network Usage", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "transform": "table", + "type": "table", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 40 + }, + "id": 17, + "panels": [], + "repeat": null, + "title": "Network", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 10, + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 41 + }, + "id": 6, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 0, + "links": [], + "nullPointMode": "null as zero", + "options": {}, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "sum(irate(container_network_receive_bytes_total{cluster=\"$cluster\", namespace=~\"$namespace\"}[$interval])) by (pod)", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{`{{pod}}`}}", + "legendLink": null, + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Receive Bandwidth", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "Bps", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 48 + }, + "id": 18, + "panels": [], + "repeat": null, + "title": "Network", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 10, + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 49 + }, + "id": 7, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 0, + "links": [], + "nullPointMode": "null as zero", + "options": {}, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "sum(irate(container_network_transmit_bytes_total{cluster=\"$cluster\", namespace=~\"$namespace\"}[$interval])) by (pod)", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{`{{pod}}`}}", + "legendLink": null, + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Transmit Bandwidth", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "Bps", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 56 + }, + "id": 19, + "panels": [], + "repeat": null, + "title": "Network", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 10, + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 57 + }, + "id": 8, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 0, + "links": [], + "nullPointMode": "null as zero", + "options": {}, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "sum(irate(container_network_receive_packets_total{cluster=\"$cluster\", namespace=~\"$namespace\"}[$interval])) by (pod)", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{`{{pod}}`}}", + "legendLink": null, + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Rate of Received Packets", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "Bps", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 64 + }, + "id": 20, + "panels": [], + "repeat": null, + "title": "Network", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 10, + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 65 + }, + "id": 9, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 0, + "links": [], + "nullPointMode": "null as zero", + "options": {}, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "sum(irate(container_network_receive_packets_total{cluster=\"$cluster\", namespace=~\"$namespace\"}[$interval])) by (pod)", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{`{{pod}}`}}", + "legendLink": null, + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Rate of Transmitted Packets", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "Bps", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 72 + }, + "id": 21, + "panels": [], + "repeat": null, + "title": "Network", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 10, + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 73 + }, + "id": 10, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 0, + "links": [], + "nullPointMode": "null as zero", + "options": {}, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "sum(irate(container_network_receive_packets_dropped_total{cluster=\"$cluster\", namespace=~\"$namespace\"}[$interval])) by (pod)", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{`{{pod}}`}}", + "legendLink": null, + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Rate of Received Packets Dropped", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "Bps", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 80 + }, + "id": 22, + "panels": [], + "repeat": null, + "title": "Network", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 10, + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 81 + }, + "id": 11, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 0, + "links": [], + "nullPointMode": "null as zero", + "options": {}, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "sum(irate(container_network_transmit_packets_dropped_total{cluster=\"$cluster\", namespace=~\"$namespace\"}[$interval])) by (pod)", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{`{{pod}}`}}", + "legendLink": null, + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Rate of Transmitted Packets Dropped", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "Bps", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + } + ], + "refresh": "10s", + "schemaVersion": 18, + "style": "dark", + "tags": [ + "kubernetes-mixin", + "3scale" + ], + "templating": { + "list": [ + { + "hide": 0, + "includeAll": false, + "label": null, + "multi": false, + "name": "datasource", + "options": [], + "query": "prometheus", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "type": "datasource" + }, + { + "allValue": null, + "datasource": "$datasource", + "definition": "", + "hide": 2, + "includeAll": false, + "label": "cluster", + "multi": false, + "name": "cluster", + "options": [], + "query": "label_values(kube_pod_info, cluster)", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 2, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "allValue": null, + "current": { + "tags": [], + "text": "{{ .Namespace }}", + "value": "{{ .Namespace }}" + }, + "hide": 0, + "includeAll": false, + "label": "namespace", + "multi": false, + "name": "namespace", + "options": [ + { + "selected": true, + "text": "{{ .Namespace }}", + "value": "{{ .Namespace }}" + } + ], + "query": "{{ .Namespace }}", + "skipUrlSync": false, + "type": "custom" + }, + { + "allValue": null, + "auto": false, + "auto_count": 30, + "auto_min": "10s", + "datasource": "prometheus", + "hide": 2, + "includeAll": false, + "label": null, + "multi": false, + "name": "interval", + "options": [ + { + "selected": true, + "text": "4h", + "value": "4h" + } + ], + "query": "4h", + "refresh": 2, + "regex": "", + "skipUrlSync": false, + "sort": 1, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "interval", + "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": "{{ .Namespace }} / 3scale / Kubernetes / Compute Resources / Namespace (Pods)", + "version": 1 +} \ No newline at end of file diff --git a/pkg/assets/assets/monitoring/kubernetes-resources-by-pod-grafana-dashboard-1.json.tpl b/pkg/assets/assets/monitoring/kubernetes-resources-by-pod-grafana-dashboard-1.json.tpl new file mode 100644 index 000000000..4f85ed7e0 --- /dev/null +++ b/pkg/assets/assets/monitoring/kubernetes-resources-by-pod-grafana-dashboard-1.json.tpl @@ -0,0 +1,1592 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "gnetId": null, + "graphTooltip": 0, + "id": 1, + "links": [], + "panels": [ + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 11, + "panels": [], + "repeat": null, + "title": "CPU Usage", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 10, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 1 + }, + "id": 1, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 0, + "links": [], + "nullPointMode": "null as zero", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_rate{namespace=\"$namespace\", pod=\"$pod\", container!=\"POD\", cluster=\"$cluster\"}) by (container)", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{`{{container}}`}}", + "legendLink": null, + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "CPU Usage", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 8 + }, + "id": 12, + "panels": [], + "repeat": null, + "title": "CPU Quota", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "columns": [], + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "fontSize": "100%", + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 9 + }, + "id": 2, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null as zero", + "options": {}, + "pageSize": null, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "scroll": true, + "seriesOverrides": [], + "showHeader": true, + "sort": { + "col": 0, + "desc": true + }, + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "styles": [ + { + "alias": "Time", + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "pattern": "Time", + "type": "hidden" + }, + { + "alias": "CPU Usage", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #A", + "thresholds": [], + "type": "number", + "unit": "short" + }, + { + "alias": "CPU Requests", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #B", + "thresholds": [], + "type": "number", + "unit": "short" + }, + { + "alias": "CPU Requests %", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #C", + "thresholds": [], + "type": "number", + "unit": "percentunit" + }, + { + "alias": "CPU Limits", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #D", + "thresholds": [], + "type": "number", + "unit": "short" + }, + { + "alias": "CPU Limits %", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #E", + "thresholds": [], + "type": "number", + "unit": "percentunit" + }, + { + "alias": "Container", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "container", + "thresholds": [], + "type": "number", + "unit": "short" + }, + { + "alias": "", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "pattern": "/.*/", + "thresholds": [], + "type": "string", + "unit": "short" + } + ], + "targets": [ + { + "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_rate{cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\", container!=\"POD\"}) by (container)", + "format": "table", + "instant": true, + "intervalFactor": 2, + "legendFormat": "", + "refId": "A", + "step": 10 + }, + { + "expr": "sum(kube_pod_container_resource_requests_cpu_cores{cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\"}) by (container)", + "format": "table", + "instant": true, + "intervalFactor": 2, + "legendFormat": "", + "refId": "B", + "step": 10 + }, + { + "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_rate{cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\"}) by (container) / sum(kube_pod_container_resource_requests_cpu_cores{cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\"}) by (container)", + "format": "table", + "instant": true, + "intervalFactor": 2, + "legendFormat": "", + "refId": "C", + "step": 10 + }, + { + "expr": "sum(kube_pod_container_resource_limits_cpu_cores{cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\"}) by (container)", + "format": "table", + "instant": true, + "intervalFactor": 2, + "legendFormat": "", + "refId": "D", + "step": 10 + }, + { + "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_rate{cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\"}) by (container) / sum(kube_pod_container_resource_limits_cpu_cores{cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\"}) by (container)", + "format": "table", + "instant": true, + "intervalFactor": 2, + "legendFormat": "", + "refId": "E", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "CPU Quota", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "transform": "table", + "type": "table", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 16 + }, + "id": 13, + "panels": [], + "repeat": null, + "title": "Memory Usage", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 10, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 17 + }, + "id": 3, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 0, + "links": [], + "nullPointMode": "null as zero", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "sum(container_memory_rss{cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\", container!=\"POD\", container!=\"\"}) by (container)", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{`{{container}}`}} (RSS)", + "legendLink": null, + "refId": "A", + "step": 10 + }, + { + "expr": "sum(container_memory_cache{cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\", container!=\"POD\", container!=\"\"}) by (container)", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{`{{container}}`}} (Cache)", + "legendLink": null, + "refId": "B", + "step": 10 + }, + { + "expr": "sum(container_memory_swap{cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\", container!=\"POD\", container!=\"\"}) by (container)", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{`{{container}}`}} (Swap)", + "legendLink": null, + "refId": "C", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Memory Usage", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 24 + }, + "id": 14, + "panels": [], + "repeat": null, + "title": "Memory Quota", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "columns": [], + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "fontSize": "100%", + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 25 + }, + "id": 4, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null as zero", + "options": {}, + "pageSize": null, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "scroll": true, + "seriesOverrides": [], + "showHeader": true, + "sort": { + "col": 0, + "desc": true + }, + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "styles": [ + { + "alias": "Time", + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "pattern": "Time", + "type": "hidden" + }, + { + "alias": "Memory Usage", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #A", + "thresholds": [], + "type": "number", + "unit": "bytes" + }, + { + "alias": "Memory Requests", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #B", + "thresholds": [], + "type": "number", + "unit": "bytes" + }, + { + "alias": "Memory Requests %", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #C", + "thresholds": [], + "type": "number", + "unit": "percentunit" + }, + { + "alias": "Memory Limits", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #D", + "thresholds": [], + "type": "number", + "unit": "bytes" + }, + { + "alias": "Memory Limits %", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #E", + "thresholds": [], + "type": "number", + "unit": "percentunit" + }, + { + "alias": "Memory Usage (RSS)", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #F", + "thresholds": [], + "type": "number", + "unit": "bytes" + }, + { + "alias": "Memory Usage (Cache)", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #G", + "thresholds": [], + "type": "number", + "unit": "bytes" + }, + { + "alias": "Memory Usage (Swap)", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #H", + "thresholds": [], + "type": "number", + "unit": "bytes" + }, + { + "alias": "Container", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "container", + "thresholds": [], + "type": "number", + "unit": "short" + }, + { + "alias": "", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "pattern": "/.*/", + "thresholds": [], + "type": "string", + "unit": "short" + } + ], + "targets": [ + { + "expr": "sum(container_memory_working_set_bytes{cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\", container!=\"POD\", container!=\"\"}) by (container)", + "format": "table", + "instant": true, + "intervalFactor": 2, + "legendFormat": "", + "refId": "A", + "step": 10 + }, + { + "expr": "sum(kube_pod_container_resource_requests_memory_bytes{cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\"}) by (container)", + "format": "table", + "instant": true, + "intervalFactor": 2, + "legendFormat": "", + "refId": "B", + "step": 10 + }, + { + "expr": "sum(container_memory_working_set_bytes{cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\"}) by (container) / sum(kube_pod_container_resource_requests_memory_bytes{namespace=\"$namespace\", pod=\"$pod\"}) by (container)", + "format": "table", + "instant": true, + "intervalFactor": 2, + "legendFormat": "", + "refId": "C", + "step": 10 + }, + { + "expr": "sum(kube_pod_container_resource_limits_memory_bytes{cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\", container!=\"\"}) by (container)", + "format": "table", + "instant": true, + "intervalFactor": 2, + "legendFormat": "", + "refId": "D", + "step": 10 + }, + { + "expr": "sum(container_memory_working_set_bytes{cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\", container!=\"\"}) by (container) / sum(kube_pod_container_resource_limits_memory_bytes{namespace=\"$namespace\", pod=\"$pod\"}) by (container)", + "format": "table", + "instant": true, + "intervalFactor": 2, + "legendFormat": "", + "refId": "E", + "step": 10 + }, + { + "expr": "sum(container_memory_rss{cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\", container != \"\", container != \"POD\"}) by (container)", + "format": "table", + "instant": true, + "intervalFactor": 2, + "legendFormat": "", + "refId": "F", + "step": 10 + }, + { + "expr": "sum(container_memory_cache{cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\", container != \"\", container != \"POD\"}) by (container)", + "format": "table", + "instant": true, + "intervalFactor": 2, + "legendFormat": "", + "refId": "G", + "step": 10 + }, + { + "expr": "sum(container_memory_swap{cluster=\"$cluster\", namespace=\"$namespace\", pod=\"$pod\", container != \"\", container != \"POD\"}) by (container)", + "format": "table", + "instant": true, + "intervalFactor": 2, + "legendFormat": "", + "refId": "H", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory Quota", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "transform": "table", + "type": "table", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 32 + }, + "id": 15, + "panels": [], + "repeat": null, + "title": "Network", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 10, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 33 + }, + "id": 5, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 0, + "links": [], + "nullPointMode": "null as zero", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "sum(irate(container_network_receive_bytes_total{namespace=~\"$namespace\", pod=~\"$pod\"}[$interval])) by (pod)", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{`{{pod}}`}}", + "legendLink": null, + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Receive Bandwidth", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "Bps", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 40 + }, + "id": 16, + "panels": [], + "repeat": null, + "title": "Network", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 10, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 41 + }, + "id": 6, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 0, + "links": [], + "nullPointMode": "null as zero", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "sum(irate(container_network_transmit_bytes_total{namespace=~\"$namespace\", pod=~\"$pod\"}[$interval])) by (pod)", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{`{{pod}}`}}", + "legendLink": null, + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Transmit Bandwidth", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "Bps", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 48 + }, + "id": 17, + "panels": [], + "repeat": null, + "title": "Network", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 10, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 49 + }, + "id": 7, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 0, + "links": [], + "nullPointMode": "null as zero", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "sum(irate(container_network_receive_packets_total{namespace=~\"$namespace\", pod=~\"$pod\"}[$interval])) by (pod)", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{`{{pod}}`}}", + "legendLink": null, + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Rate of Received Packets", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "Bps", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 56 + }, + "id": 18, + "panels": [], + "repeat": null, + "title": "Network", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 10, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 57 + }, + "id": 8, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 0, + "links": [], + "nullPointMode": "null as zero", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "sum(irate(container_network_transmit_packets_total{namespace=~\"$namespace\", pod=~\"$pod\"}[$interval])) by (pod)", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{`{{pod}}`}}", + "legendLink": null, + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Rate of Transmitted Packets", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "Bps", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 64 + }, + "id": 19, + "panels": [], + "repeat": null, + "title": "Network", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 10, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 65 + }, + "id": 9, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 0, + "links": [], + "nullPointMode": "null as zero", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "sum(irate(container_network_receive_packets_dropped_total{namespace=~\"$namespace\", pod=~\"$pod\"}[$interval])) by (pod)", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{`{{pod}}`}}", + "legendLink": null, + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Rate of Received Packets Dropped", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "Bps", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 72 + }, + "id": 20, + "panels": [], + "repeat": null, + "title": "Network", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 10, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 73 + }, + "id": 10, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 0, + "links": [], + "nullPointMode": "null as zero", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "sum(irate(container_network_transmit_packets_dropped_total{namespace=~\"$namespace\", pod=~\"$pod\"}[$interval])) by (pod)", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{`{{pod}}`}}", + "legendLink": null, + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Rate of Transmitted Packets Dropped", + "tooltip": { + "shared": false, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "Bps", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + } + ], + "refresh": "10s", + "schemaVersion": 18, + "style": "dark", + "tags": [ + "kubernetes-mixin", + "3scale" + ], + "templating": { + "list": [ + { + "hide": 0, + "includeAll": false, + "label": null, + "multi": false, + "name": "datasource", + "options": [], + "query": "prometheus", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "type": "datasource" + }, + { + "allValue": null, + "datasource": "$datasource", + "definition": "", + "hide": 2, + "includeAll": false, + "label": "cluster", + "multi": false, + "name": "cluster", + "options": [], + "query": "label_values(kube_pod_info, cluster)", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 2, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "allValue": null, + "current": { + "tags": [], + "text": "{{ .Namespace }}", + "value": "{{ .Namespace }}" + }, + "hide": 0, + "includeAll": false, + "label": "namespace", + "multi": false, + "name": "namespace", + "options": [ + { + "selected": true, + "text": "{{ .Namespace }}", + "value": "{{ .Namespace }}" + } + ], + "query": "{{ .Namespace }}", + "skipUrlSync": false, + "type": "custom" + }, + { + "allValue": null, + "datasource": "$datasource", + "definition": "", + "hide": 0, + "includeAll": false, + "label": "pod", + "multi": false, + "name": "pod", + "options": [], + "query": "label_values(kube_pod_info{cluster=\"$cluster\", namespace=\"$namespace\"}, pod)", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 2, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "allValue": null, + "auto": false, + "auto_count": 30, + "auto_min": "10s", + "datasource": "prometheus", + "hide": 2, + "includeAll": false, + "label": null, + "multi": false, + "name": "interval", + "options": [ + { + "selected": true, + "text": "4h", + "value": "4h" + } + ], + "query": "4h", + "refresh": 2, + "regex": "", + "skipUrlSync": false, + "sort": 1, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "interval", + "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": "{{ .Namespace }} / 3scale / Kubernetes / Compute Resources / Pod", + "uid": "{{ .Namespace }}", + "version": 1 +} \ No newline at end of file diff --git a/pkg/assets/assets/monitoring/system-grafana-dashboard-1.json.tpl b/pkg/assets/assets/monitoring/system-grafana-dashboard-1.json.tpl new file mode 100644 index 000000000..36ed4c9b5 --- /dev/null +++ b/pkg/assets/assets/monitoring/system-grafana-dashboard-1.json.tpl @@ -0,0 +1,1639 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "gnetId": null, + "graphTooltip": 0, + "id": 1, + "links": [], + "panels": [ + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 20, + "panels": [], + "title": "Sidekiq", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "gridPos": { + "h": 8, + "w": 24, + "x": 0, + "y": 1 + }, + "id": 22, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": {}, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sidekiq_job_runtime_seconds_count{namespace=\"$namespace\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{`{{queue}}`}}-{{`{{worker}}`}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Fake panel Job Runtime Seconds Count", + "tooltip": { + "shared": true, + "sort": 2, + "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": 9 + }, + "id": 13, + "panels": [], + "title": "Pods", + "type": "row" + }, + { + "cacheTimeout": null, + "colorBackground": true, + "colorValue": false, + "colors": [ + "#F2495C", + "rgba(237, 129, 40, 0.89)", + "#299c46" + ], + "datasource": "$datasource", + "decimals": 0, + "format": "none", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 6, + "x": 0, + "y": 10 + }, + "hideTimeOverride": true, + "id": 30, + "interval": "", + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "options": {}, + "pluginVersion": "6.2.4", + "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_replicationcontroller_status_ready_replicas{namespace='$namespace',replicationcontroller=~'system-.*'})", + "format": "time_series", + "intervalFactor": 1, + "refId": "A" + } + ], + "thresholds": "1,2", + "timeFrom": "30s", + "timeShift": "30s", + "title": "Running pods", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "0", + "value": "null" + } + ], + "valueName": "avg" + }, + { + "cacheTimeout": null, + "colorBackground": true, + "colorPrefix": false, + "colorValue": false, + "colors": [ + "#299c46", + "rgba(237, 129, 40, 0.89)", + "#F2495C" + ], + "datasource": "$datasource", + "decimals": 0, + "format": "none", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 6, + "x": 6, + "y": 10 + }, + "hideTimeOverride": true, + "id": 32, + "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": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "sum(kube_replicationcontroller_spec_replicas{namespace='$namespace',replicationcontroller=~'system-.*'}) - sum(kube_replicationcontroller_status_ready_replicas{namespace='$namespace',replicationcontroller=~'system-.*'})", + "format": "time_series", + "intervalFactor": 1, + "refId": "A" + } + ], + "thresholds": "1,2", + "timeFrom": "30s", + "timeShift": "30s", + "title": "Unavailable pods", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "0", + "value": "null" + } + ], + "valueName": "avg" + }, + { + "cacheTimeout": null, + "colorBackground": true, + "colorValue": false, + "colors": [ + "#F2495C", + "rgba(237, 129, 40, 0.89)", + "#299c46" + ], + "datasource": "$datasource", + "decimals": 0, + "format": "none", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 6, + "x": 12, + "y": 10 + }, + "hideTimeOverride": true, + "id": 37, + "interval": "", + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "options": {}, + "pluginVersion": "6.2.4", + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "count(count(container_memory_usage_bytes{namespace='$namespace',pod=~'system-.*'}) by (node))", + "format": "time_series", + "intervalFactor": 1, + "refId": "A" + } + ], + "thresholds": "1,2", + "timeFrom": "30s", + "timeShift": "30s", + "title": "Pods distributed on hosts", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "0", + "value": "null" + } + ], + "valueName": "avg" + }, + { + "cacheTimeout": null, + "colorBackground": true, + "colorValue": false, + "colors": [ + "#299c46", + "rgba(237, 129, 40, 0.89)", + "#d44a3a" + ], + "datasource": "$datasource", + "decimals": 0, + "format": "none", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 6, + "x": 18, + "y": 10 + }, + "hideTimeOverride": true, + "id": 36, + "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": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "max(sum(delta(kube_pod_container_status_restarts_total{namespace='$namespace',pod=~'system-.*'}[5m])) by (pod))", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "", + "refId": "A" + } + ], + "thresholds": "1,2", + "timeFrom": "30s", + "timeShift": "30s", + "title": "Max pods restarts (last 5 minutes)", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "0", + "value": "null" + } + ], + "valueName": "avg" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 13 + }, + "id": 11, + "legend": { + "avg": false, + "current": false, + "hideEmpty": true, + "hideZero": true, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null as zero", + "options": {}, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "kube_replicationcontroller_spec_replicas{namespace='$namespace',replicationcontroller=~'system-.*'}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{`{{replicationcontroller}}`}}-total-pods", + "legendLink": null, + "refId": "A", + "step": 10 + }, + { + "expr": "kube_replicationcontroller_status_ready_replicas{namespace='$namespace',replicationcontroller=~'system-.*'}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{`{{replicationcontroller}}`}}-avail-pods", + "refId": "B" + }, + { + "expr": "kube_replicationcontroller_spec_replicas{namespace='$namespace',replicationcontroller=~'system-.*'} - kube_replicationcontroller_status_ready_replicas{namespace='$namespace',replicationcontroller=~'system-.*'}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{`{{replicationcontroller}}`}}-unavail-pods", + "refId": "C" + }, + { + "expr": "count(count(container_memory_usage_bytes{namespace='$namespace',pod=~'system-.*'}) by (node))", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "used-hosts", + "refId": "D" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Pod count (total, avail, unvail) and pods hosts distribution", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "decimals": 0, + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "gridPos": { + "h": 6, + "w": 24, + "x": 0, + "y": 20 + }, + "id": 9, + "legend": { + "avg": false, + "current": false, + "hideEmpty": true, + "hideZero": true, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": {}, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(delta(kube_pod_container_status_restarts_total{namespace='$namespace',pod=~'system-.*'}[5m])) by (pod)", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{`{{pod}}`}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Pods restarts (last 5 minutes)", + "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": 26 + }, + "id": 4, + "panels": [], + "repeat": null, + "title": "CPU Usage", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 27 + }, + "id": 0, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null as zero", + "options": {}, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_rate{namespace=~'$namespace', pod=~'system-.*'}) by (pod)", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{`{{pod}}`}}", + "legendLink": null, + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "CPU Usage", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 34 + }, + "id": 5, + "panels": [], + "repeat": null, + "title": "CPU Quota", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "columns": [], + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "fontSize": "100%", + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 35 + }, + "id": 1, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null as zero", + "options": {}, + "pageSize": null, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "scroll": true, + "seriesOverrides": [], + "showHeader": true, + "sort": { + "col": 1, + "desc": false + }, + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "styles": [ + { + "alias": "Time", + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "pattern": "Time", + "type": "hidden" + }, + { + "alias": "CPU Usage", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #A", + "thresholds": [], + "type": "number", + "unit": "short" + }, + { + "alias": "CPU Requests", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #B", + "thresholds": [], + "type": "number", + "unit": "short" + }, + { + "alias": "CPU Requests %", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #C", + "thresholds": [], + "type": "number", + "unit": "percentunit" + }, + { + "alias": "CPU Limits", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #D", + "thresholds": [], + "type": "number", + "unit": "short" + }, + { + "alias": "CPU Limits %", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #E", + "thresholds": [], + "type": "number", + "unit": "percentunit" + }, + { + "alias": "Pod", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": true, + "linkTooltip": "Drill down", + "linkUrl": "/d/{{ .Namespace }}/{{ .Namespace }}-3scale-kubernetes-compute-resources-pod?var-namespace=$namespace&var-pod=$__cell", + "pattern": "pod", + "thresholds": [], + "type": "number", + "unit": "short" + }, + { + "alias": "", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "pattern": "/.*/", + "thresholds": [], + "type": "string", + "unit": "short" + } + ], + "targets": [ + { + "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_rate{namespace=~'$namespace', pod=~'system-.*'}) by (pod)", + "format": "table", + "instant": true, + "intervalFactor": 2, + "legendFormat": "", + "refId": "A", + "step": 10 + }, + { + "expr": "sum(kube_pod_container_resource_requests_cpu_cores{namespace=~'$namespace', pod=~'system-.*'}) by (pod)", + "format": "table", + "instant": true, + "intervalFactor": 2, + "legendFormat": "", + "refId": "B", + "step": 10 + }, + { + "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_rate{namespace=~'$namespace', pod=~'system-.*'}) by (pod) / sum(kube_pod_container_resource_requests_cpu_cores{namespace=~'$namespace', pod=~'system-.*'}) by (pod)", + "format": "table", + "instant": true, + "intervalFactor": 2, + "legendFormat": "", + "refId": "C", + "step": 10 + }, + { + "expr": "sum(kube_pod_container_resource_limits_cpu_cores{namespace=~'$namespace', pod=~'system-.*'}) by (pod)", + "format": "table", + "instant": true, + "intervalFactor": 2, + "legendFormat": "", + "refId": "D", + "step": 10 + }, + { + "expr": "sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_rate{namespace=~'$namespace', pod=~'system-.*'}) by (pod) / sum(kube_pod_container_resource_limits_cpu_cores{namespace=~'$namespace', pod=~'system-.*'}) by (pod)", + "format": "table", + "instant": true, + "intervalFactor": 2, + "legendFormat": "", + "refId": "E", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "CPU Quota", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transform": "table", + "type": "table", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 42 + }, + "id": 6, + "panels": [], + "repeat": null, + "title": "Memory Usage", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 43 + }, + "id": 2, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null as zero", + "options": {}, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(container_memory_usage_bytes{namespace=~'$namespace', pod=~'system-.*', container!=''}) by (pod)", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{`{{pod}}`}}", + "legendLink": null, + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Memory Usage", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 50 + }, + "id": 7, + "panels": [], + "repeat": null, + "title": "Memory Quota", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "columns": [], + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "fontSize": "100%", + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 51 + }, + "id": 3, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null as zero", + "options": {}, + "pageSize": null, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "scroll": true, + "seriesOverrides": [], + "showHeader": true, + "sort": { + "col": 1, + "desc": true + }, + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "styles": [ + { + "alias": "Time", + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "pattern": "Time", + "type": "hidden" + }, + { + "alias": "Memory Usage", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #A", + "thresholds": [], + "type": "number", + "unit": "decbytes" + }, + { + "alias": "Memory Requests", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #B", + "thresholds": [], + "type": "number", + "unit": "decbytes" + }, + { + "alias": "Memory Requests %", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #C", + "thresholds": [], + "type": "number", + "unit": "percentunit" + }, + { + "alias": "Memory Limits", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #D", + "thresholds": [], + "type": "number", + "unit": "decbytes" + }, + { + "alias": "Memory Limits %", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTooltip": "Drill down", + "linkUrl": "", + "pattern": "Value #E", + "thresholds": [], + "type": "number", + "unit": "percentunit" + }, + { + "alias": "Pod", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": true, + "linkTooltip": "Drill down", + "linkUrl": "/d/{{ .Namespace }}/{{ .Namespace }}-3scale-kubernetes-compute-resources-pod?var-namespace=$namespace&var-pod=$__cell", + "pattern": "pod", + "thresholds": [], + "type": "number", + "unit": "short" + }, + { + "alias": "", + "colorMode": null, + "colors": [], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "pattern": "/.*/", + "thresholds": [], + "type": "string", + "unit": "short" + } + ], + "targets": [ + { + "expr": "sum(container_memory_usage_bytes{namespace=~'$namespace', pod=~'system-.*', container!=''}) by (pod)", + "format": "table", + "instant": true, + "intervalFactor": 2, + "legendFormat": "", + "refId": "A", + "step": 10 + }, + { + "expr": "sum(kube_pod_container_resource_requests_memory_bytes{namespace=~'$namespace', pod=~'system-.*'}) by (pod)", + "format": "table", + "instant": true, + "intervalFactor": 2, + "legendFormat": "", + "refId": "B", + "step": 10 + }, + { + "expr": "sum(container_memory_usage_bytes{namespace=~'$namespace', pod=~'system-.*', container!=''}) by (pod) / sum(kube_pod_container_resource_requests_memory_bytes{namespace=~'$namespace', pod=~'system-.*'}) by (pod)", + "format": "table", + "instant": true, + "intervalFactor": 2, + "legendFormat": "", + "refId": "C", + "step": 10 + }, + { + "expr": "sum(kube_pod_container_resource_limits_memory_bytes{namespace=~'$namespace', pod=~'system-.*'}) by (pod)", + "format": "table", + "instant": true, + "intervalFactor": 2, + "legendFormat": "", + "refId": "D", + "step": 10 + }, + { + "expr": "sum(container_memory_usage_bytes{namespace=~'$namespace', pod=~'system-.*', container!=''}) by (pod) / sum(kube_pod_container_resource_limits_memory_bytes{namespace=~'$namespace', pod=~'system-.*'}) by (pod)", + "format": "table", + "instant": true, + "intervalFactor": 2, + "legendFormat": "", + "refId": "E", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory Quota", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transform": "table", + "type": "table", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 58 + }, + "id": 15, + "panels": [], + "title": "Network Usage", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "gridPos": { + "h": 6, + "w": 24, + "x": 0, + "y": 59 + }, + "id": 17, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": {}, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(irate(container_network_receive_bytes_total{namespace=~'$namespace', pod=~'system-.*'}[5m])) by (pod)", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{`{{pod}}`}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Receive Bandwidth", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "decimals": null, + "format": "Bps", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "gridPos": { + "h": 6, + "w": 24, + "x": 0, + "y": 65 + }, + "id": 18, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": {}, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(irate(container_network_transmit_bytes_total{namespace=~'$namespace', pod=~'system-.*'}[5m])) by (pod)", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{`{{pod}}`}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Transmit Bandwidth", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "Bps", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + } + ], + "refresh": "10s", + "schemaVersion": 18, + "style": "dark", + "tags": [ + "3scale", + "system" + ], + "templating": { + "list": [ + { + "hide": 0, + "includeAll": false, + "label": null, + "multi": false, + "name": "datasource", + "options": [], + "query": "prometheus", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "type": "datasource" + }, + { + "allValue": null, + "current": { + "tags": [], + "text": "{{ .Namespace }}", + "value": "{{ .Namespace }}" + }, + "hide": 0, + "includeAll": false, + "label": "namespace", + "multi": false, + "name": "namespace", + "options": [ + { + "selected": true, + "text": "{{ .Namespace }}", + "value": "{{ .Namespace }}" + } + ], + "query": "{{ .Namespace }}", + "skipUrlSync": false, + "type": "custom" + } + ] + }, + "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": "{{ .Namespace }} / 3scale / System", + "version": 1 +} \ No newline at end of file diff --git a/pkg/assets/assets/monitoring/zync-grafana-dashboard-1.json.tpl b/pkg/assets/assets/monitoring/zync-grafana-dashboard-1.json.tpl new file mode 100644 index 000000000..b1c37501e --- /dev/null +++ b/pkg/assets/assets/monitoring/zync-grafana-dashboard-1.json.tpl @@ -0,0 +1,146 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "gnetId": null, + "graphTooltip": 0, + "id": 2, + "links": [], + "panels": [ + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "fill": 1, + "gridPos": { + "h": 9, + "w": 12, + "x": 0, + "y": 0 + }, + "id": 2, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": {}, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rails_connection_pool_connections{job=\"zync-monitoring\",namespace=\"{{ .Namespace }}\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "Rails connections", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "ZYNC 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 + } + } + ], + "schemaVersion": 18, + "style": "dark", + "tags": [], + "templating": { + "list": [] + }, + "time": { + "from": "now-6h", + "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": "{{ .Namespace }}/Zync", + "version": 1 +} diff --git a/pkg/assets/assets/monitoring/zync-que-grafana-dashboard-1.json.tpl b/pkg/assets/assets/monitoring/zync-que-grafana-dashboard-1.json.tpl new file mode 100644 index 000000000..4e37f0a4d --- /dev/null +++ b/pkg/assets/assets/monitoring/zync-que-grafana-dashboard-1.json.tpl @@ -0,0 +1,146 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "gnetId": null, + "graphTooltip": 0, + "id": 2, + "links": [], + "panels": [ + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "fill": 1, + "gridPos": { + "h": 9, + "w": 12, + "x": 0, + "y": 0 + }, + "id": 2, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": {}, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rails_connection_pool_connections{job=\"zync-que-monitoring\",namespace=\"{{ .Namespace }}\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "Rails connections", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "ZYNC QUE 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 + } + } + ], + "schemaVersion": 18, + "style": "dark", + "tags": [], + "templating": { + "list": [] + }, + "time": { + "from": "now-6h", + "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": "{{ .Namespace }}/ZyncQue", + "version": 1 +} diff --git a/pkg/assets/bindata.go b/pkg/assets/bindata.go new file mode 100644 index 000000000..6a1aa5d40 --- /dev/null +++ b/pkg/assets/bindata.go @@ -0,0 +1,407 @@ +// Package assets Code generated by go-bindata. (@generated) DO NOT EDIT. +// sources: +// assets/monitoring/apicast-grafana-dashboard-1.json.tpl +// assets/monitoring/apicast-grafana-dashboard-2.json.tpl +// assets/monitoring/backend-grafana-dashboard-1.json.tpl +// assets/monitoring/kubernetes-resources-by-namespace-grafana-dashboard-1.json.tpl +// assets/monitoring/kubernetes-resources-by-pod-grafana-dashboard-1.json.tpl +// assets/monitoring/system-grafana-dashboard-1.json.tpl +// assets/monitoring/zync-grafana-dashboard-1.json.tpl +// assets/monitoring/zync-que-grafana-dashboard-1.json.tpl +package assets + +import ( + "bytes" + "compress/gzip" + "fmt" + "io" + "io/ioutil" + "os" + "path/filepath" + "strings" + "time" +) + +func bindataRead(data []byte, name string) ([]byte, error) { + gz, err := gzip.NewReader(bytes.NewBuffer(data)) + if err != nil { + return nil, fmt.Errorf("Read %q: %v", name, err) + } + + var buf bytes.Buffer + _, err = io.Copy(&buf, gz) + clErr := gz.Close() + + if err != nil { + return nil, fmt.Errorf("Read %q: %v", name, err) + } + if clErr != nil { + return nil, err + } + + return buf.Bytes(), nil +} + +type asset struct { + bytes []byte + info os.FileInfo +} + +type bindataFileInfo struct { + name string + size int64 + mode os.FileMode + modTime time.Time +} + +// Name return file name +func (fi bindataFileInfo) Name() string { + return fi.name +} + +// Size return file size +func (fi bindataFileInfo) Size() int64 { + return fi.size +} + +// Mode return file mode +func (fi bindataFileInfo) Mode() os.FileMode { + return fi.mode +} + +// Mode return file modify time +func (fi bindataFileInfo) ModTime() time.Time { + return fi.modTime +} + +// IsDir return file whether a directory +func (fi bindataFileInfo) IsDir() bool { + return fi.mode&os.ModeDir != 0 +} + +// Sys return file is sys mode +func (fi bindataFileInfo) Sys() interface{} { + return nil +} + +var _monitoringApicastGrafanaDashboard1JsonTpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5d\xff\x73\xdb\x36\xb2\xff\xfd\xfe\x0a\x3c\x36\xef\xe2\x76\xa4\x44\xdf\xec\xd8\x9e\xc9\xbc\x49\x9a\xe6\xb5\x33\x49\xcf\x97\x3a\x9d\xeb\xcb\x64\x54\x88\x84\x25\x8c\x41\x80\x05\x41\xc7\x6e\xea\xfe\xed\x6f\x08\x7e\x11\x45\x00\x14\x25\x53\x12\x25\xc3\x33\x77\x8d\x88\x05\x09\xec\x2e\x16\x9f\x5d\x2c\x80\xaf\xff\x00\x00\x00\x07\x52\xca\x04\x14\x98\xd1\xd0\x39\x07\xc9\x43\x59\x40\x70\x28\x9c\x73\xf0\x29\x7f\x12\xff\x7d\x5d\xf8\x25\xe9\x26\x11\x26\xe2\x27\xea\x9c\x83\x7e\x47\x2d\xf5\xa0\x80\x21\x8b\xb8\x8b\x9c\x73\xe0\x74\xbb\xe0\x7f\x39\xbc\x82\x14\x82\x6e\xd7\xd1\x90\x23\x0a\x27\x24\x26\x15\x3c\x42\x9a\xf2\x19\xf6\x2a\x4a\xb1\xcb\xe8\xf7\x8c\x30\x1e\x7f\x8b\x4f\x27\xf0\xa8\xd7\x01\x83\x7e\xbf\x03\x06\xc7\xc7\x1d\xd0\xff\x56\xf7\x49\x0a\x7d\xd9\xb6\x57\x73\x46\x80\x7f\x82\x57\x04\x71\x11\xea\xe8\xc5\x5d\x20\xe9\x3d\x18\xce\x26\x0c\x72\xcf\x59\xa0\xb9\xcf\x7f\x7d\x96\xff\xba\x4f\x5e\xe1\x20\x0f\x0b\xa5\x6f\xce\x94\x22\xf1\x93\xe7\x9c\x03\x1a\x11\x92\x3d\xe3\x30\x98\x5d\x32\x46\x04\x0e\x9c\x73\xd0\x4b\x1f\x13\x4c\xaf\x63\x11\x7d\xfa\x9c\x3e\x08\x20\x45\x24\x5c\x10\xd1\xa2\x78\x1c\x97\x11\x02\x83\x10\xc5\x1f\xb8\x82\x24\x2c\xf1\xcc\x99\x72\xec\x5d\xb0\x45\xb9\xcf\x59\x6d\x90\xe8\x17\xe7\x1c\x0c\x46\x9a\x82\xdb\x79\x63\x17\x9e\xdf\xc5\xcf\x17\x79\x54\x6a\x07\x8e\x1b\x38\x28\xd5\x2d\xf4\xef\x73\xa9\x44\x60\x41\x12\x99\x05\x01\xc1\xae\x14\x9a\x53\xa6\x49\xc5\xc4\xd9\x97\xb9\x80\x0a\x1f\x2e\xb1\x0a\x12\x0c\x43\xa9\x3b\x92\x1d\xe5\x16\x4e\xa0\x7c\xae\x63\x62\xac\x07\xef\x10\x9d\x0a\xc9\xb0\x72\x27\xe2\x52\x64\xae\x5a\x1c\x1c\x4f\x0a\x3f\x4b\x84\x57\x98\x10\x55\x1c\x35\xe4\xa7\x93\x47\x2c\xc0\xfe\x60\x45\x01\xf6\x97\x0b\x70\x78\x56\x7a\x4a\xd0\x14\x51\x4f\xdf\x3a\x78\x33\xd5\x33\x45\x96\xba\x11\xe7\x88\x8a\x0a\x0a\x1f\xde\x56\x95\x62\x5a\x51\x1a\xce\xd8\x17\xb3\x11\x11\x4c\x40\x52\x51\xfb\x06\x92\x68\x2e\xd1\x4a\xb6\x10\x4c\x25\xa5\xfa\x25\x59\xf4\x05\x7b\x42\x33\xca\x94\x91\x9e\x17\xc4\x46\xe2\x82\x61\x2a\xde\x33\x69\x06\xe5\x83\xb2\xae\xb0\x20\x37\xe6\xe5\xf6\x04\x88\xbb\x88\x0a\x38\x45\x06\x85\x0c\xe2\x97\x73\xe8\xe1\x28\xae\x3f\xd0\x95\x9a\x74\x99\x23\xea\x21\x8e\xa4\xe9\xbd\x22\x4c\x94\x9b\x15\x22\x8e\x51\xf8\xaf\x1b\xc4\x39\xf6\x90\xb6\x7b\x61\x00\x5d\x64\x1e\x4a\xa1\x80\xee\xb5\xe1\xeb\xa1\x40\x41\x80\xbc\x77\x98\x9a\xba\x26\x20\x9f\x22\x11\x2a\x33\x1a\xd0\xce\x6a\xb2\x0a\xba\x0d\x64\x77\xc2\xc8\x3f\xe2\x50\xa0\x23\x3a\xc5\xf4\x76\x3c\x13\x22\x18\xbb\x8c\x52\xe4\x4a\x4e\x7f\x8d\x67\x10\xd9\xf6\x97\x4f\x9f\xe4\xff\x7e\xda\x01\x01\xf3\x5e\xfe\xfd\x14\x06\xd8\x85\xa1\xe8\x3e\x41\xf4\xe6\xd9\x77\x4f\xef\x3f\xf5\xfd\xcf\xdf\x7e\x0b\x26\x77\xe0\x28\x14\x50\x20\xdd\xa4\x24\x3f\x7f\xc5\xb8\x0f\xe3\x31\xe0\x08\xec\xa3\x71\xc2\x40\x13\x31\xa6\x02\xf1\x1b\x48\xde\x42\x57\xc8\xf9\x4f\x63\xba\xc1\x7c\x50\xbe\xcd\xdf\xfd\xf5\xeb\xef\x5f\xbf\xca\x86\xdc\xdf\xff\x7e\x7f\x6f\x7a\x3f\x47\x57\x72\x9e\x72\x5e\x39\x0a\xc1\xfd\xc2\x13\xc5\x58\xcf\x38\x0a\x67\x8c\x78\x06\x53\xee\xa3\xb7\x9c\xf9\x0b\x53\xe0\x42\xe9\x07\x34\x4d\xf5\x59\x5b\xf9\x97\x19\xbe\x12\xa6\xda\xe9\x34\xf1\xe3\xe5\xe5\x05\x28\x48\x0c\x1c\x4d\x09\x9b\x40\x52\x66\xbd\x23\xf2\x59\x57\x63\xb2\xc2\x19\xe4\x72\x2a\x35\x18\x8e\x90\x71\xa1\x8e\x1a\x90\xdb\x8c\x71\x36\x25\x61\xea\xe1\x1b\xec\x45\x90\x38\x95\xe6\x23\xa3\x97\x80\xa0\xdc\xd4\x5b\x78\x8b\x0d\x96\x7f\x12\xb9\xd7\x89\xaa\xab\x4c\x91\x04\x7e\x6a\x3e\x62\xfe\x55\x40\x22\x43\xed\x6a\xf3\x99\x9b\xc7\x4f\x9f\x2b\x3b\x77\x07\x6f\xd1\x4a\xa3\xd1\x43\x2e\xf6\xa1\x04\x04\x9a\x49\x0a\x2c\x8e\x98\x70\x16\x0b\xc3\x34\x04\xe0\x04\x11\x63\xff\x12\x12\x36\x7d\x0d\x43\x54\x31\x8e\x92\x09\xa8\xe2\x15\xc9\x1c\x54\x41\x50\xe0\xa3\x3a\xa4\xd4\x3a\x06\xb6\x1c\x50\x9f\x2b\xcd\xc8\x9d\x59\xdf\x21\xc1\xd3\xaa\xf9\x5e\x96\xbf\x43\x37\x39\x03\x0c\x80\xdd\xa2\xc3\x65\xe8\x50\x5b\x50\x13\x1e\x8e\xca\x9d\xb7\xf0\xd0\xc2\xc3\x39\xd3\x1f\x2b\x3c\x7c\x12\x30\x6f\x01\x14\x06\xcc\xeb\xb4\x06\x18\x06\xcc\x93\xb0\xf0\x1c\x3c\x4e\x9c\xf8\x44\x72\xc0\xe2\xc4\x47\x8d\x13\x1d\x23\xc1\xae\x11\x93\x45\x89\x16\x25\xb6\x0f\x25\x1a\x63\x88\x75\x50\xe2\xa9\x45\x89\x16\x25\x1e\x32\x4a\x4c\xe3\x81\xe3\x18\x4b\x45\x2b\x06\x0f\x3b\x20\xa9\xf5\xf2\xef\xa7\xc7\xf3\x58\xe2\x6e\x71\xe2\xf1\x7f\xfe\xb3\x16\x18\xac\x3d\x77\x6d\x8a\x83\xa3\xb6\x70\x70\x54\x83\x83\xaf\xdb\xc8\xc1\x61\x5b\x38\x38\xac\xc1\xc1\xef\xdb\xc8\xc1\x41\x5b\x38\x38\xa8\xc1\xc1\x37\xfb\xea\xd2\x25\xec\x06\x2e\xf3\x90\x8d\xfd\x5b\x9f\xae\xed\x1e\xce\x1a\x5e\x1d\x47\x7f\x04\x46\xa3\xb0\x0f\x7d\xb6\x5e\x5d\xa9\xb0\x75\x5e\x9d\x39\xf6\x5f\xc3\xad\x3b\x29\xbb\x01\xd6\xad\xb3\x6e\xdd\x9c\xe9\xfb\xeb\xd6\xad\x0e\x06\x65\xc0\x5f\xeb\xc8\xb5\x2a\xde\xbf\x35\xb7\xee\xe1\x1c\x1c\xb5\x93\x83\x5b\x73\xeb\x1e\xce\xc1\x61\x3b\x39\xb8\x35\xb7\xee\xe1\x1c\x1c\xb4\x93\x83\x8f\xc8\xad\xb3\x4b\x75\xd6\xad\x6b\xb5\x8b\x63\xdd\x3a\xeb\xd6\x6d\xda\xad\x3b\x33\x78\x75\x2b\x6f\xd8\x18\xd4\x59\xab\x3b\xb1\x4e\x9d\x75\xea\x0e\xd0\xa9\xcb\xa3\xfc\x51\x10\x0a\x8e\xa0\x6f\x17\xeb\x76\xce\xc2\x47\xbc\x5a\xd7\x14\x0b\x1f\xf1\x72\x5d\x53\x2c\xb4\xeb\x75\x1b\x76\xec\x3e\xa6\x82\x5a\x70\xee\xac\x4f\x67\x7d\x3a\x3d\xc9\xae\xfd\x1b\xeb\xd3\x59\x9f\x6e\xd3\x3e\xdd\xa9\xc1\xa7\x5b\x39\xff\x72\x58\x63\x17\xfe\xb1\xdd\xa5\xb3\x0b\x9f\x0e\xc0\x10\xfc\x89\x38\xb3\xbe\xdd\xa6\x7d\x3b\x0f\x11\x01\xd3\xad\x3a\x88\x73\xc6\xc7\x84\x4d\x4d\x78\x70\x21\xd6\x4f\x62\xd3\xf4\xf2\xef\xa7\xb2\xd6\x5f\x2e\xc7\xe2\x2f\x48\x10\x17\x7f\x21\x1f\xf1\xe9\x26\xa2\xff\x31\x79\xdf\xdf\xca\xce\x1e\xd9\xb9\xc3\xdd\xd9\x23\x65\x16\x82\xe7\xc0\xc7\xd4\x2e\x15\x58\x58\xd9\x72\x88\xb5\x06\xac\xdc\xfb\x3e\xb7\x17\x56\xba\xd0\x9d\xa1\x4b\xec\x23\x16\x19\xec\x8c\x1b\x63\xce\xd7\xd0\xbd\x9e\x72\x16\x51\xd3\x71\x4b\x92\xea\x82\xa3\x2b\x6c\x80\x3d\x09\xc5\xaf\xf1\x18\xd2\x03\x0e\x37\xc3\xb6\xea\xb8\x71\xbe\x19\x9c\x9d\xb9\xa3\x13\xdd\x88\x96\x47\x61\x0d\x86\x2f\x3a\xa0\x3f\x38\xeb\x80\x51\xaf\x03\x7a\xcf\x4e\xcf\xb4\xc7\x61\x7d\xf3\x76\x30\x3a\x3b\x2e\x45\x5f\xca\xe2\xa8\x8d\x79\xcd\xc3\xb6\xa0\xba\x94\x51\xa5\xe2\x14\x46\x12\xd8\x68\x04\xee\xc3\xdb\x8c\x45\xfd\x9e\x0e\xeb\xfa\x98\x66\x04\xba\xe2\x54\x0b\x4d\xfa\x92\xcf\x56\xef\xe2\x41\x63\x40\x48\x8b\x94\xef\x21\xbf\x46\x3c\xd4\xa9\x76\xd9\xf0\x2d\x45\xfb\xba\x09\x64\xbd\xbc\xbc\x25\x70\x7f\x86\x3d\xa9\xd4\x19\x8a\xd3\x6b\x5c\xb2\xd0\x53\x06\x8f\x45\x80\x52\x96\x9c\x11\xf8\xfa\x30\x08\x30\x9d\x5e\x26\xf3\x5a\x19\x2f\x17\x4a\x57\x9a\x18\xb2\xe3\xdb\xe4\xcc\x03\x04\x03\x02\xdd\x1a\xed\xe0\x4d\xa6\x37\x0f\x30\xb9\xd9\x07\x39\xa4\xd3\xda\x1f\x1c\xac\x68\xef\x7c\x78\xfb\x06\x0a\x78\x91\x81\x74\x45\xd1\x55\x37\x22\xdd\xb7\x8c\xbc\xb2\x40\x62\xca\xcb\xb8\x8d\x5a\xd3\x55\xe5\x61\x90\x68\x8a\xe9\xaf\x88\x87\x98\xc5\x16\xd6\x39\x79\x36\x78\x36\x2a\xbf\x3e\x60\xa1\x48\x2c\x9a\xa2\x0a\x69\xd1\x5b\x46\xc5\x2f\xf8\x4f\xd9\xca\xe3\xde\x7f\x2b\x54\x99\x45\x54\xeb\xcb\x92\x25\xd5\xa5\x1c\xde\xc3\x60\x25\xad\xb9\x4a\x00\xa7\x6e\x3d\x2d\xa7\x11\x09\xcf\x9c\x9f\x9f\xbf\x32\x92\xb0\xfc\x25\x2b\x0a\x38\x0c\x20\xbf\x26\x89\x87\xa3\xb1\x04\x57\x98\x90\xc5\x93\x0c\x87\xfd\x0e\xe8\xf7\x4f\x3b\xa0\x7f\x7a\x16\x9b\xef\xfe\xa9\xd6\x7c\x5f\x45\xa4\xca\xef\x8d\xbf\x58\x7c\x6f\xf2\xda\x41\xaf\x03\xfa\x67\x43\xed\x0b\x8b\xd6\xb2\x1a\xaf\xc2\x09\x89\xdf\x1d\xf9\x54\x27\xcb\x07\x2e\xc7\xad\xe1\xb6\x29\x51\xfc\xe5\x0e\xdc\x6c\xeb\x71\xfd\x86\xbc\x2a\xa7\xdf\xe9\xf7\x3a\xfd\x5e\x4f\x61\xfb\xdc\xbb\x72\x86\x3d\x35\x92\x5e\xf0\x9f\xf4\xe5\xa9\x03\x75\xc9\x04\x24\xe0\xd5\xc5\x4f\x31\x4b\x41\xea\x4e\x1d\x91\xf8\xc7\x8c\x45\x5c\xf5\xa5\x52\xef\x25\xc4\x74\x4a\x50\x28\xa0\x12\x43\x90\xa6\xb1\x38\xb6\x4f\xd5\xb1\x2d\x69\x56\x1d\xdb\x2c\xf6\xe0\x9c\x97\xcb\x86\x75\x99\x55\x8b\x1f\x5d\x77\x5c\xcb\xca\x3f\xa7\x53\x44\x16\x01\xdb\x36\xc6\xb4\x08\xd2\x22\xc8\xc5\xe7\x6b\x22\xc8\x41\x53\x08\xf2\xd8\x22\x48\xf5\x83\x16\x41\xa6\x54\x16\x41\x5a\x04\x79\x18\x08\xf2\x64\x9f\x11\xe4\x49\xaf\x73\xb2\x13\x04\x79\x32\xb3\xf8\xb1\x58\xd9\xe2\x47\x8b\x1f\x0f\x02\x3f\x8e\x1a\xc3\x8f\xe5\x54\x73\x8b\x1f\x2d\x7e\xcc\xa9\x2c\x7e\xb4\xf8\xf1\x30\xf0\x63\x7f\xb0\xcf\x00\x32\x16\x63\x7f\xb0\x13\x08\xd9\x1f\x58\x0c\xb9\x50\xd9\x62\x48\x8b\x21\x0f\x02\x43\x9e\x34\x86\x21\x47\x16\x43\x2a\x1f\xb4\x18\x32\xa5\xb2\x18\xd2\x62\xc8\xc3\xc0\x90\x83\xd1\x3e\x63\xc8\xc1\xa8\x17\xff\x6f\x17\x18\x72\x30\xb2\x18\x72\xa1\xf2\x1a\x18\xf2\x30\xb7\xe0\x34\x76\xac\xc2\xf0\xb4\xd2\xfa\x24\x38\xc5\xde\xa3\xa8\x82\x31\x7b\xac\x42\xc6\xf4\xfd\xdd\x7a\x93\xef\xc6\x8e\x6d\x3e\x0a\x5d\x48\xd0\x78\x02\xdd\x6b\x44\xbd\xb1\x0b\x09\x79\xc0\x4d\x8a\x88\x7a\x92\xab\xd9\x56\xed\x36\x9c\xc2\x95\xb5\xa9\x7c\x81\x4e\x14\x1e\xee\x3e\x9b\xa1\x94\x2a\x78\x9d\x48\x15\x48\xa9\xda\x6d\x36\x76\x9b\x8d\x9e\x64\xd7\x5b\x4e\x6a\x7b\xcb\x07\xd4\xe7\x4a\x0b\xd2\xf2\x6d\x36\x6b\x6f\x95\xd6\x3d\xaf\x82\x69\xa3\x17\xcb\x61\xda\xa8\xa1\x70\xd2\xed\x05\xe2\x1f\xa4\xc0\x86\x66\x04\xa2\x36\xd3\xc3\x61\x40\xe0\x5d\x86\x60\x88\x5b\x8e\x98\x80\x04\xf0\x22\xe2\xfd\xab\xe2\x3d\x20\xe1\x3c\x71\xf5\x66\x62\xde\x4e\x04\xa9\x3a\x1f\x01\x55\x87\xe6\x0d\x44\x57\x30\x22\xc2\xfc\x59\x30\xd7\x76\x6d\x04\x74\x4e\x23\x15\xbe\x8a\x22\xa2\x58\x8e\xce\x14\x98\xe9\x1b\xaa\x19\xee\x69\x13\x64\xcc\x4e\x27\x9e\x9c\x86\xcd\xc3\x8b\x65\x34\x98\xd3\x2c\x4e\xbf\xc6\xc6\x9a\x99\x21\xdf\xe2\x66\x71\x8d\x29\x47\xa8\x7c\xab\xbd\x42\x8d\xa9\x87\x0c\x8a\xbc\x40\x97\xf9\x82\xca\xc0\x2c\xfe\x19\x3a\xb6\x4a\xa3\xbf\xf9\xe1\xd5\xeb\xd3\xe1\x59\xdd\x66\x1b\x6c\xa0\xd2\xec\xd3\xde\x26\x1b\xcd\x95\x68\xa3\xb1\xc1\x1a\xdc\xa1\x6d\xf0\x59\x45\x83\x57\x1a\x45\x15\x5e\x12\xd0\xf7\xde\x61\x1c\xc7\xce\x89\x48\xc3\x9d\x33\xc6\xf1\x9f\x8c\x8a\x65\x40\xa8\x5e\x9c\x94\xa3\x00\x25\x33\x61\xc0\x94\x18\x6d\x52\xf8\x06\xf3\xe4\xfe\x44\xf9\xf5\x06\x23\x68\xfd\x5e\x0f\x74\xc1\x11\x0b\x10\xe5\x28\x14\x77\xe3\x70\xe6\x61\x57\x8c\xaf\x38\x42\x63\xe9\x2a\x54\x85\xd2\xd2\x9b\x36\xc1\x73\xa0\xbc\xc0\x85\x01\x74\xb1\xb8\xab\x53\xfd\xbb\xd8\x58\x35\xbf\xcd\x7f\x33\x2e\x48\xdc\xbb\x4d\x39\x1b\x4b\xdd\x89\x5a\xc7\x3d\x85\xc8\x03\x09\xe6\x07\x71\x63\x31\xa3\x30\x66\x19\x90\x9c\x07\x47\x31\xd3\x8d\x31\xb9\x09\xe4\xc9\x02\x5b\x1d\x70\xc1\x08\x81\x41\x88\x4c\x6b\x96\xcb\x2f\x4c\x68\x2a\x04\x74\x7c\xbc\x1c\x5b\xf4\xcb\x50\x20\x80\x34\x59\xc5\xd3\x78\x66\x29\x2b\x2f\x98\xa7\xba\x5a\x29\xa7\x38\xfb\xb2\xa9\x05\x60\xd3\xfa\x6e\xb6\x76\x69\x5c\x20\x36\x2d\x00\xa7\x2b\xb7\x1a\xee\xad\xb4\x00\x9c\xae\x23\x57\xea\xb0\x5d\x00\x06\x9b\x5a\x00\x1e\x1a\x86\xcb\xc9\xaa\xa3\xa5\xb1\xe5\xdf\x61\x59\x72\x76\xf9\xd7\x2e\xff\xe6\x54\x76\xf9\xd7\x2e\xff\x6e\x7c\xf9\xf7\x3a\x9a\xa0\x31\x47\x01\xc1\xae\x84\xe7\x2e\xa3\x82\x33\x42\x10\x4f\xcf\x25\x1d\x73\x04\xbd\xbb\x8c\xc4\x18\x0f\xd7\xbe\x42\x13\x20\xdf\xdf\x45\xe0\x4d\xad\xfe\x7e\x88\x28\xc5\x74\x0a\x82\x0a\xb0\xf4\xa8\x97\x7a\xe1\xcd\x74\xdb\x48\xb1\xfe\x89\x38\x2b\x63\x49\x9b\x4c\x98\x11\x3c\x26\x2c\xa9\x7b\xde\x30\x96\xac\xd8\xce\xac\x19\x0b\x16\x4d\x6a\x3e\xb8\x9f\x68\xd2\xe2\x44\x8b\x13\x77\x8a\x13\x03\xe4\x36\x87\x0f\x41\x17\x58\x5c\x5a\xf8\xdb\x19\x2e\xfd\x48\xe1\x0d\xc4\x24\xd6\x2a\x8b\x4d\xcb\x95\x77\x88\x4d\x6d\x14\xd3\x22\xcf\xd2\xf3\x2a\xe4\x69\xdc\xc5\xd2\x20\xf4\x7c\x61\xc3\x98\xca\x07\x1f\x01\xf0\xb4\x61\x4c\x0b\x4f\x5b\x00\x4f\x5d\x16\x51\x71\x94\xfd\x3f\x15\x10\x53\xc4\xc7\x3e\xf2\x19\xbf\x1b\x47\x21\x9c\xa2\xf1\xe4\x4e\x20\x23\x44\xd4\x67\xf2\x26\x49\xbc\x94\x79\x68\x8f\x37\xae\x6c\x0a\x1b\x5e\x30\x2f\x04\x1e\x0e\x05\xc7\x93\x48\x20\x0f\x30\x0a\x66\x2c\x14\x16\x24\x16\x2b\xef\x23\x48\x6c\x28\x3c\xe9\x8d\x46\x70\x08\x2d\x48\xdc\x17\x90\xa8\xcb\x46\x6d\x18\x24\x56\x1c\x97\x63\xe3\x93\x87\x0c\x13\x2d\x00\xb4\x00\x70\xa3\x00\xd0\x87\xb7\x47\xf3\xad\xcc\x32\x72\x18\x30\x6f\x3c\xc7\x82\x79\xc4\x30\x14\x90\x8b\x70\x2c\xf7\x01\xae\x06\x07\x3f\x1d\xe7\x1b\xbb\x02\xe6\xed\xfa\xaa\xcd\x0d\x6f\xd4\xda\x24\x74\x7c\x0f\x6f\x65\x38\x11\x64\xd2\x48\x77\x3a\x1f\x03\x1f\xd3\x48\x20\x65\x9f\x9c\xc5\x90\x2b\x60\xc8\xc3\xdc\xeb\xfc\xc2\x00\x67\x56\x4f\x74\x3d\xab\x34\x51\x49\xa2\xab\xb2\x67\x77\x83\x7b\x9d\x63\x00\xf5\x83\x1f\x88\x3b\xf3\xc6\xba\x98\xe4\xff\x10\x67\x66\x0a\xbb\x61\xda\xd9\xda\x9d\x85\xc7\xba\xd2\x47\xba\x71\x7a\x6b\x6b\x82\x9b\x99\x6c\x0d\x1b\x67\x94\xc9\x56\x0e\x82\xae\x66\x09\xac\x54\xe3\x1d\xa6\xd7\xd5\xbb\x20\x0b\xd3\xb3\x81\x22\x96\x99\x94\xf3\x03\x5c\x8b\x44\x44\x8f\x21\xbb\xaf\x2c\x29\xb9\x60\x59\x29\xa9\xe6\xaf\xc3\xb7\x0b\xe3\x3b\xdf\x57\x14\xd1\x15\x04\xdf\xc8\x25\xfe\x87\x16\x72\x56\x38\x1a\x22\xaf\xab\x0b\xe8\xaa\xfc\xdc\xc7\x1b\xfd\x2f\x98\x07\xa4\xf0\xc0\x91\x34\xee\x1d\x20\x15\xa8\x03\x22\x1a\xff\xf7\x5b\x00\xa9\x97\x38\x29\x92\x07\xf3\x48\x37\x66\xe5\xed\xaf\xf6\xe8\x88\xa4\xdc\x1e\x1d\xd1\xd8\x31\x0a\xa6\xa6\x3e\xe2\x73\x23\x0c\x3b\x8d\x2b\xed\x8c\xbd\xf6\xbf\x71\x3f\x5c\xb7\x7c\xb0\x96\x1f\x7e\x52\xbd\xac\x20\xfd\xf0\x6d\x1e\x39\x66\xdd\x70\x7b\x6e\xd9\xde\xb9\xdf\x5b\x0c\x77\xef\x16\x8d\xca\x73\x03\x02\xe6\x1d\xee\x19\x65\x17\xab\x05\xc4\x1b\x80\x9c\x3a\xcb\x6c\x21\xe7\xc3\x21\xe7\x5e\xc2\xab\xc7\x08\x29\xf7\xee\x28\xb2\xd6\x9c\x16\xf2\xa2\xfa\x0a\xce\xe4\x24\xb2\xf2\x3c\x6d\x3c\x2c\x24\x3f\xbd\xa7\xca\x3e\x7e\x7f\xf1\x11\x7c\x0c\x63\x90\x60\x30\x3e\x35\x4f\x13\x39\x4c\x58\xde\xd8\xf2\xd8\x8b\xe1\x72\xc9\x96\xbb\x6e\x4f\x02\xb6\x0b\x5b\x87\x86\xac\x29\xf3\xd0\x38\xc7\xc8\x8b\xe8\xfa\x7c\x8e\xb3\xdd\x20\x4a\x83\xbd\x21\x72\x19\xf5\x52\xa4\x7d\x1e\x46\xfe\x98\x43\x51\x3c\xfa\xeb\xef\x3a\x87\x07\x6f\x1a\x6f\xd7\x5d\xf0\xaa\x85\xb7\xb7\xb2\xe6\xd5\x76\xdc\x6e\x9e\x97\x6c\x54\xd8\x42\x74\x1b\xf2\x35\x76\xf8\x00\x43\xbe\xed\x01\xe8\xa5\xa3\x49\xf5\x37\x3a\x34\x0f\xd0\xff\x1d\x31\x01\x77\x06\xd0\x5d\x99\x59\xaa\xed\xc1\x0e\xb1\xfb\x55\x21\x29\xb1\xdf\x53\xb3\x12\xb7\x87\xed\x4f\xfb\xcb\x95\x62\x9b\x99\x6f\x16\xdb\x3f\x04\xdb\xc3\x29\x4a\xd5\x4a\x33\x2a\x77\x8a\xfc\x5d\xce\xe4\x48\xd0\xb0\xac\x8e\x57\x30\x63\x5f\x7e\x44\xd0\x93\x1f\xd0\xbd\x22\x81\x46\x1a\x7d\x74\x99\x66\xfc\xc9\x12\x0f\x85\x6e\x2d\x69\x6f\xd4\x25\x09\xc5\x1d\x59\x0d\xa7\x48\x5b\x18\xf3\xf9\x52\x8f\xae\x40\x6a\xa0\xd0\x1c\xb9\xff\xf6\xdb\x6f\xbf\x75\xdf\xbf\xef\xbe\x79\x03\x7e\xfc\xf1\xdc\xf7\xcf\x43\xa3\x77\x10\x40\x21\x10\xa7\xcb\xde\x9f\xd9\xef\x19\xf6\x3c\xa4\x39\x6e\xbd\x3e\x0a\xc9\xbb\x63\x02\xcd\x39\xa5\xdc\xa0\x96\x8e\x90\x0a\xa0\x30\xdf\xc7\x66\x3c\xef\x7d\x5d\xe6\x14\x12\x07\x8c\x4e\x53\xe2\xf9\x18\x8c\x4c\x4e\x72\x99\x3b\x02\xce\x1b\x8e\x09\x01\x1e\xfb\x62\x3a\x42\x5d\x56\xf8\xc8\x2b\x93\xa4\x0a\x62\x93\xdb\xd3\xc0\x37\xe6\xcd\x27\x55\xfe\xd1\x9c\x2a\x15\x30\x8d\xfc\x09\xe2\xa6\x77\x65\xa7\xd9\x27\x00\xb2\x29\x2d\xf8\x80\xfe\x88\x50\x45\x92\x91\x55\x84\x55\x14\xe1\xf5\xfe\x2b\x02\x28\x03\xa4\x9c\xdc\xaa\xc2\x2a\xaa\xa0\x3b\xe5\x05\x6c\x4a\x15\x52\xb8\x21\x7f\x36\xa5\x10\xef\xb0\x8f\xad\x5d\xd0\x56\x58\x59\x19\xde\xec\xaf\x5d\x48\xd4\xc0\x5a\x05\x6d\x85\x95\x15\xe1\x87\x7d\xb6\x0a\x17\xca\xdd\x1e\x39\xcd\x3e\x69\x81\xde\x67\x05\x0f\x55\x82\xe7\xde\xf3\xaf\x5f\xc1\xb3\x9f\xb3\x35\x06\x70\x7f\xaf\x3c\xe8\x26\x37\xe1\x75\xaf\xa3\x09\xe2\x14\x09\x14\x76\x5d\xe6\x07\x91\x40\x5d\x8e\x92\xa8\x46\xd8\x0d\x98\xf7\x3f\x37\x90\x77\xe7\x4b\x17\xf3\x85\x8b\x7f\xc6\x05\x01\xf3\x5e\x3e\x19\x8f\x5d\x64\xde\x18\x5d\xd0\x3c\xf5\x46\x96\x9c\xaa\xdd\xd6\x67\xaf\x75\xad\x20\x80\xe7\xcf\xbe\x7b\xde\x8c\x04\x42\xc1\x31\x9d\xae\x2b\x81\x85\x27\xca\x72\xcb\xe1\x2f\xd7\xc1\x09\x31\xfa\xbb\x98\x86\x02\xca\x60\x59\x85\x75\x58\x7b\x35\xaf\x46\xc2\x9c\x81\xa2\xb9\xcd\x68\x85\xad\x52\x8b\xa9\x8a\x99\xe1\x19\xf3\xd4\x03\x90\x52\x72\x19\x5f\xd8\x3b\xf3\xa8\xc4\x61\x74\xe3\x9a\x16\xc7\xce\x87\x0d\x78\x0e\x36\xa7\x16\x87\xa4\x12\x46\x77\x6e\x9b\x23\x94\x48\x2c\x6e\xc7\xa7\xd1\x9d\x7a\x8c\xe3\x73\x5d\xa5\x38\x24\x85\x30\xba\x55\xbb\x4a\x6c\xa9\x9b\xb9\xa2\x5f\xb0\x6d\x57\x72\x39\x87\x34\x8c\xd5\xc0\xa4\x04\x39\x3c\xd5\x16\xda\xdc\x16\x83\x8e\xdb\xdc\x96\xcd\x75\xb8\xa1\xdc\x96\xfc\xd7\x5e\xa4\x9c\x9c\x56\xea\xb1\xcc\x2e\x28\x1f\x00\xf8\xc0\x94\x93\xf7\x72\xb7\xbd\x4d\x0b\xdf\x42\xea\x48\x8d\x53\x93\xca\x1b\xf3\x6c\xea\x48\x5b\x53\x47\x6c\x5a\xf8\xba\x71\xa6\x9a\x27\x7d\xd4\x41\xd9\x1d\x90\xbf\xec\xbf\x5e\x3e\xb5\xa9\xdf\x5b\x46\xc8\x0d\xa4\x7e\x57\x4e\x3f\x36\xfb\x7b\x0f\x10\xb2\x1c\xb7\x6d\x00\x8c\x16\x21\x2b\x7d\xb6\xd9\xdf\x6b\xa3\xb5\xb3\x1a\x67\x6b\x94\x2f\x6c\x69\x06\x8a\xdb\x04\xf0\x36\x27\x80\x9f\xbd\x58\xae\x17\xe5\x3b\xfe\x2d\x8a\x6f\x2b\x8a\xb7\x09\xe0\xa5\xbf\xe5\x09\xe0\x4b\xaf\x55\xb0\xf9\xdf\x2a\xd9\x06\xf2\xbf\x2b\x90\x73\x4e\xbc\x17\x69\x16\xad\x49\xec\xda\x6a\x0a\xb8\x87\xdc\x04\x39\x37\xa8\x0b\x36\x11\xbc\x49\x75\xd8\x6a\x22\xf8\x26\xd5\xc1\x26\x7e\x6a\x2b\x3c\xae\x74\xf0\x54\x27\x6c\x46\xb8\xb1\x42\xbb\x33\xc2\x37\x61\x20\x6c\x5e\x78\x93\xea\x60\xf3\xc2\x77\xaf\x05\x36\x2f\x3c\xa3\xb2\x79\xe1\x36\x2f\x3c\xfb\xc4\x61\xac\xd7\xb5\x38\x77\xad\x5d\xb9\xdf\xa9\x98\xd6\x11\xd0\xc1\x48\x64\x6b\xe9\xdf\x5b\x19\x1d\xab\xa4\x78\xaf\x23\xfd\x43\x92\x7c\x9b\xb2\xbc\xed\x48\xdc\x62\xa2\x77\x5b\x46\xe2\x03\x64\x7f\x48\x72\xdf\xcb\x7c\xee\xca\x25\x58\x9b\xd2\x9d\x10\xec\x79\xc2\x4a\x6b\xf2\x37\x6c\xc2\x8a\xd2\xe7\xc3\x4b\xe9\xee\xf7\x46\x95\x8a\x9c\x9c\x18\x57\xff\x1c\xc1\xdc\x54\xfd\x8c\xc4\x17\xc6\xaf\x6d\xe6\xf6\xe6\xef\xd9\xe9\xf7\x8e\x6b\xc8\xb0\x9c\x0d\x64\xb3\x3e\xec\x25\x39\x73\xa6\xef\x77\xce\x36\xe6\x50\xa0\x02\xc2\xa6\x89\xf1\x19\x73\xe4\x22\x7c\x93\x82\x6c\xe5\x86\x9c\x5a\x7e\xce\x56\xee\xc8\x69\x34\x71\x7b\xaf\xef\xc8\xf9\x90\x48\x0c\xbc\x86\xd4\x4b\x46\xe0\x06\x60\xae\xcd\xba\xde\xf8\x4d\x8c\x15\x58\x6a\x3e\x54\x5e\x07\xad\xc8\xcc\x36\xdf\xec\x6f\xa1\x6e\xb9\xd3\x95\xf6\xc3\x5e\xc6\xd8\x62\x90\xd8\xaf\x73\x34\xf4\xa9\x05\x89\x16\x24\x3e\x32\x90\x28\x43\x55\x3e\x16\x16\x25\x66\x7f\xad\x47\x89\x97\xa9\xc8\x2c\x4c\xdc\x47\x98\x68\x01\xe0\xee\xbb\xbc\xbf\x00\xf0\x1f\x85\x0f\xc7\x56\x2c\x36\x46\xc9\xbe\xab\x4c\x97\x9c\xd0\x9d\x21\x1f\xfe\x8a\x78\x88\x19\x2d\xc0\x9a\x64\x7b\x86\x4c\x57\x84\xfc\x3a\xa3\x16\x70\xba\xa8\xbe\x4e\x92\x2a\x55\x10\x93\x93\xda\x7b\x67\xe1\xe3\x02\xf9\x01\x81\x02\xd3\xe9\x42\x97\x1d\x82\x43\xa1\x8c\x07\x1d\xbe\xc3\x72\xf0\xea\x10\x1b\xa6\x2e\x89\x3c\xf4\x8a\x54\xc1\x98\x6a\x7d\x71\xfc\x88\x08\x5c\x51\x3d\xb5\x0d\x8e\x11\xb4\x82\x45\x2c\xa2\xcb\x11\x72\xfe\x88\x10\xbf\x93\xb9\x5e\x9c\xf9\x48\xcc\x50\xa4\x1b\xd1\x05\x39\xe9\x22\xd7\x1c\x4d\xd1\xad\x61\xd5\xce\x09\xaf\x71\xf0\x91\x93\x5f\xee\xa8\x5b\xd1\x99\xcc\xc2\x16\x3a\x53\x65\xb4\xb4\x0a\x4a\x64\xa6\xa4\x99\xa1\x73\x48\xab\x1b\xe7\xb9\x1e\x69\x53\xa9\x1c\x81\x6e\xd3\xc9\x79\x31\x2f\x4f\x6b\x0c\x12\xdb\xab\x25\xaf\x63\x86\x1a\xd3\x2c\x27\x47\x3e\x3a\xc9\xd4\x55\xb0\xca\x97\x14\xf4\x4b\xc3\x08\x83\x41\x0d\x11\x41\xae\xa8\x98\xc2\xc1\xca\x2c\x5f\x8d\xe9\x65\x43\x08\x54\x63\x08\x16\x86\x47\x8d\x36\xac\xa8\xe9\x6e\x14\x0a\xe6\x6f\x5b\xcb\x57\x66\x7e\xc0\x99\x17\xb9\xb1\x8c\x97\xb2\xbd\x40\xba\x5d\x2d\x47\xf4\x06\x73\x46\xfd\xb8\xdb\x0f\xd0\x73\x44\x6f\x56\xd7\x70\x93\x8e\x83\xda\xac\x06\x2b\xb1\x1b\xd4\x66\x39\xd0\xb3\xbd\x7e\x93\x2b\x72\xde\x17\xda\x1c\x0a\x38\x35\x27\x97\x2e\x36\x38\xa3\xd5\xb7\x76\xb5\x31\x39\xef\x7c\xc7\xdc\x84\x7d\x19\x95\x19\x33\x5f\x99\x33\xb3\x33\x26\xea\xd5\x50\x92\x3c\x19\x8f\x21\x21\x7a\xee\x7e\xae\x35\x28\xeb\x46\xc4\x12\x62\x74\x85\x29\x16\x09\x4a\x4b\xc6\xe3\x38\x71\x3b\x8e\xe8\x14\xd3\xdb\xf1\x4c\x88\x60\xec\x32\x4a\x91\x94\x53\x31\x53\xa9\x8e\x5b\x2e\x9f\xeb\xbc\xf1\xda\xb6\xc3\xe0\x1b\xd5\x84\x5e\x86\xda\x99\xc1\xd0\xe7\xc7\xd7\x86\x5c\xdb\xe4\xd7\x1c\xc0\xe9\xbc\xe2\x06\x00\x5c\x45\x06\x92\x80\x53\x39\x3a\xc2\x7f\x67\x3d\xd7\x7d\xa6\x02\x7e\xc9\xb2\xea\xca\xe9\xf0\x4d\x78\xab\x21\x88\x42\x74\x99\x7c\x40\x13\x33\xcc\x7f\x25\x43\xe4\x3e\xf3\x0f\xb0\x14\x73\xc1\x33\xb8\x4a\x02\x23\x0e\x65\x5f\xba\xfd\x62\x20\xc0\x11\x2c\x7d\xee\x28\xaf\x08\xb0\x7b\x2d\x83\x72\x85\x17\xa5\xe2\x18\x67\x31\x22\x75\x76\x71\x8e\xcb\x40\xbc\xe0\x21\xe5\x8f\x86\xea\xa3\xbe\x5f\x7e\x72\xac\x3c\xe9\xab\x8f\x86\x3d\x95\x4a\x09\x75\x0c\x94\x27\x7d\x6f\x6e\x6c\x3e\x17\xf9\x81\x7d\x34\x36\xcd\x9c\xf5\x5a\xa4\x7e\xfe\x44\xfd\xbc\xda\xa2\xc1\x48\x7d\x54\x1e\xa6\xce\x0b\xe5\xc9\xb0\x57\xec\x89\x22\xc4\x3f\x99\x0c\x6b\x3a\xb9\xd3\x99\x85\xb2\x94\x8d\x3b\x20\xf1\x3e\xc1\x73\xf0\x2a\x73\x3a\xef\xff\x3f\x00\x00\xff\xff\xfc\xc9\x51\xad\x33\x4b\x01\x00") + +func monitoringApicastGrafanaDashboard1JsonTplBytes() ([]byte, error) { + return bindataRead( + _monitoringApicastGrafanaDashboard1JsonTpl, + "monitoring/apicast-grafana-dashboard-1.json.tpl", + ) +} + +func monitoringApicastGrafanaDashboard1JsonTpl() (*asset, error) { + bytes, err := monitoringApicastGrafanaDashboard1JsonTplBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "monitoring/apicast-grafana-dashboard-1.json.tpl", size: 84787, mode: os.FileMode(436), modTime: time.Unix(1592930935, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +var _monitoringApicastGrafanaDashboard2JsonTpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5c\x5b\x6f\xdb\x38\x16\x7e\x9f\x5f\x41\x70\x83\x4d\xba\x70\x5a\x3b\x19\xb7\x49\x80\x3e\x24\xb3\x9b\x9d\x01\xba\x33\xdd\x26\x33\xc0\x6e\x11\x78\x68\xe9\x58\x26\x42\x89\x0a\x49\x39\xf6\x04\xde\xdf\xbe\x10\x75\xb3\x24\x92\x96\xdb\x24\x4e\x3a\xe9\x53\x4c\x1e\x4a\x87\xe7\xf6\x7d\xbc\xa8\x77\xdf\x21\x84\x10\x26\x51\xc4\x15\x51\x94\x47\x12\x9f\xa0\xac\x51\x77\x30\x2a\x15\x3e\x41\x9f\xcb\x96\xf4\xdf\x5d\xed\x97\x96\x1b\x27\x94\xa9\x9f\x22\x7c\x82\x06\xbd\x76\xaf\x4f\x14\x91\x3c\x11\x1e\xe0\x13\x84\xf7\xf7\xd1\x3f\x05\x99\x90\x88\xa0\xfd\x7d\x6c\x10\x87\x88\x8c\x59\x2a\xaa\x44\x02\x86\xfe\x29\xf5\x1d\xbd\xd4\xe3\xd1\x0f\x9c\x71\x91\xbe\x4b\x04\x63\xb2\xd7\xef\xa1\x83\xc1\xa0\x87\x0e\x86\xc3\x1e\x1a\xbc\x32\xbd\x32\x22\xa1\xd6\xed\xb4\x32\x04\xfa\x2b\x3a\x65\x20\x94\x34\xc9\xab\x45\xac\xe5\x7d\x22\xa7\x63\x4e\x84\x8f\x6b\x32\xcb\xf2\xd7\x95\xfe\x6b\x99\x3d\x02\x83\x4f\x55\x6b\x6e\x38\x88\x40\xfd\xe4\xe3\x13\x14\x25\x8c\x15\x6d\x82\xc4\xd3\x4b\xce\x99\xa2\x31\x3e\x41\xfd\xbc\x99\xd1\xe8\x3a\x75\xd1\xe7\xab\xbc\x21\x26\x11\x30\x59\x73\x51\xdd\x3d\xd8\xe3\x8c\x91\x58\x42\xfa\x82\x09\x61\xb2\x61\x33\x1c\x08\xea\x7f\xe4\x75\xbf\x57\xa6\xb6\x78\xf4\x16\x9f\xa0\x83\xef\x0d\x1d\xf3\x4a\xd9\x5a\xfb\x22\x6d\xaf\xdb\xa8\xa1\x07\x4d\x15\x3c\x68\x8c\x5d\x99\xdf\x55\xa3\x47\x40\x0c\x24\x0d\x4e\x2c\x41\xcc\xa8\x07\x23\xea\x37\x5c\x85\x15\x55\xda\xd8\x78\xa7\x92\x41\xfb\xa8\xfc\xa5\xdd\xde\x1c\x93\xbb\x56\xf0\xdb\xca\xa9\x2b\xca\x36\xcc\x4b\x18\x25\x52\xc7\x9b\x36\x61\x73\x56\x63\xa2\xdb\x4d\x86\x4f\x63\xe7\x03\x44\x81\xd2\x46\x6e\x4e\x3c\xed\x05\xfb\xd0\xd5\x84\xda\x59\xf9\xd9\x10\x9c\x50\xc6\xda\x2e\xec\xe0\x73\x93\x0f\x53\xa7\x0f\x0e\x36\x74\xfa\x60\xbd\xd3\xdf\x36\xe7\xce\x20\x80\xc8\x37\x6b\x47\x66\x81\xd9\x28\xba\xd7\x4b\x84\x80\x48\x39\x24\x42\x32\x77\xf5\xd2\xc8\xd1\x2b\xa7\xfc\xd6\x5e\x78\x14\x57\x84\x39\x46\xcf\x08\x4b\x2a\x8f\x3a\xcd\xc2\x68\xa4\x25\xdb\x6f\xd2\x5d\xb7\xd4\x57\x86\xcc\x6c\x55\x87\xb2\x23\x2d\x2c\x1f\x39\x8d\xd4\xbf\xb8\x2e\x9d\xba\xa1\x19\x2b\x3c\x2e\x01\xa0\xa9\x4f\x0c\xc2\x83\x48\x91\x00\x2c\x01\x19\xa7\x0f\x17\xc4\xa7\x49\x3a\xfe\xc0\xd4\x6b\x8b\x65\x01\x91\x0f\x02\x74\xb9\x9e\x30\xae\x9a\x6a\x49\x10\x14\xe4\x2f\x33\x10\x82\xfa\x60\x9c\x9e\x8c\x89\x07\xf6\x54\x92\x8a\x78\xd7\x96\xb7\x4b\x05\x71\x0c\xfe\x07\x1a\xd9\xa6\xa6\x88\x08\x40\xc9\x16\x0a\x22\x23\x12\xea\x21\x30\x8f\xf5\x74\x64\x12\xee\x09\xa2\x60\x2f\x89\xa5\x12\x40\xc2\x91\x54\x44\x25\xf2\x2e\xad\x3b\x5a\xe9\xf7\xbb\x3b\xe5\xdf\xbb\x3d\x14\x73\xff\xfd\xff\x76\x49\x4c\x3d\x22\xd5\xfe\x0e\x44\xb3\xd7\x7f\xdb\xed\xa1\xaa\x78\xbd\xdf\x5d\xa9\x64\xbb\xcb\xcf\x83\xf0\xea\xd5\x2b\x34\x5e\xa0\xbd\xec\xc9\x26\x70\xd3\x2a\x4d\xb8\x08\xb3\x6a\xa9\x68\x08\xa3\xcc\xa8\x36\x61\x1a\x29\x10\x33\xc2\xce\x89\xa7\x34\x8e\x1a\x20\x00\x55\x89\x7a\x5e\x3e\xfb\xee\xee\xf7\xbb\xbb\x4c\x93\xe5\xf2\xf7\xe5\xd2\xf6\x02\x01\x13\x0d\x78\xf8\x14\xb7\x04\x96\xb5\x96\xa6\xab\xd5\x54\x80\x9c\x72\xe6\x1b\x03\x21\x9d\xdb\xb9\xe0\x61\x0d\x4b\x6b\xbd\x9f\x20\xc8\x83\xdc\x38\xf8\x62\x4a\x27\xca\x36\x3a\xc7\x92\x5f\x73\x67\xa2\x1f\x2f\x2f\x3f\xa2\x6c\xb6\xc8\xe3\x3e\x48\xb4\x17\x83\x40\x12\x3c\x1e\xf9\x28\x75\x7c\xd3\x1d\x58\x95\x88\x6e\x28\x6d\x72\x4a\x84\x86\x69\x4b\x81\x91\x5c\xa8\x76\x76\xa1\xb2\xb6\x8c\x0a\xe8\xa2\x91\x4f\x67\xd4\x4f\x08\xc3\xce\x32\x53\xc8\x6b\xb2\xd1\x54\x75\x4e\xe6\xd4\x82\x10\xe3\xc4\xbb\xce\x52\xa2\x6d\x27\x2d\x10\xe6\x65\x26\x35\xa9\x83\x6e\x59\x46\xbb\xcb\x6c\x59\x46\x3f\x5f\x39\x27\xb7\x20\x73\xd8\x28\x6b\x7d\xf0\x68\x48\x34\xd9\x30\x80\x19\xaa\x67\x91\x9c\xa6\xce\xb0\xa5\x05\x19\x03\xb3\xce\x2f\x13\xe1\xc1\x19\x91\xe0\xc8\xad\x0c\xa8\x1c\x8f\xc8\xb0\xca\x21\xb0\x62\xc7\x76\x96\xb5\xc7\x58\xcc\x52\xcd\x59\xc0\x4d\x6c\xad\x19\xcf\x61\xce\xce\xca\xb2\xb0\xc7\x3b\x61\x34\x70\xf1\x02\xdd\xff\x01\x66\xa5\x01\x2c\x8b\x81\x27\xc6\x22\x73\x72\x38\x7c\x78\x72\x68\xec\xe8\xca\x0e\x0f\x5f\xd8\xe1\x0b\x3b\xfc\x06\xd9\xe1\x94\x4a\xc5\x03\x41\xc2\xd1\x4d\x42\x22\x45\x19\xec\xed\xe4\xa6\xa4\x0c\xde\x0c\xfa\xfd\x1e\x2a\x19\xa4\x0e\x9f\x91\x00\x19\xf3\x48\xc2\x28\x27\x71\x29\xd1\x90\xa3\x0c\x8e\x1f\x82\x54\x32\x78\xb5\x65\x46\x79\x99\xce\x1b\x09\xb8\x49\x40\x2a\x64\xe1\x13\x68\x2d\xa7\xec\x8c\x76\x5f\xe4\x9c\x92\xde\xff\xf9\xfc\x53\x92\xe1\x8d\x5c\x74\xf6\x0c\x69\x7f\x3b\x12\xd1\x4c\xa2\xc4\x34\x7f\xb4\xb7\x73\x57\x05\xcb\x52\x4d\x51\xf5\xeb\x65\x49\xf0\x3c\x97\x04\x0e\xce\xb9\xb2\x2a\x58\xc7\x8e\xb1\x55\x60\xdb\xdc\xf8\x0b\xd6\x03\xcf\x7e\x0d\xf4\x74\xd7\x03\x1e\x11\xbe\xe5\xe5\x69\xd7\x47\xe2\xfb\x34\x0a\xec\xf9\x92\x0a\x7d\xe2\x49\xe4\x1b\x15\x68\xcc\xd4\xcb\x4f\x4b\x2c\x2f\x2b\x0f\x53\xfe\xf2\xee\xf0\xec\xfc\xed\xb1\x29\x7b\xf5\x23\x2e\x3c\x92\x95\x4a\x79\x63\x8c\x8b\x42\x6a\x0a\x61\x5e\x93\x14\x88\x98\x33\xa2\xe0\x17\x41\xa2\xc0\x08\x4f\x29\x22\xf3\x28\x63\xed\xfd\xd7\x43\x47\x65\xe1\x31\xf1\xa8\x5a\xb8\xeb\x9b\x4f\x14\xa9\xd0\x4b\xc9\xa2\x6e\x19\xc4\x3a\x6d\xb0\x3f\xe6\x4e\xba\x7b\xb1\x34\x05\xa2\x42\x12\x9b\x08\xfa\x94\xfa\xf0\x5f\x10\xfc\xac\x2c\xd2\x26\x2a\x3b\xa5\xc1\x94\xd1\x60\xaa\x7e\xc8\x83\xcf\xb0\xbe\xd0\x2b\xb2\xe1\xd1\x06\x2b\x32\x5b\x02\x1a\x16\x35\xe6\xd5\x89\x63\xe1\x21\x60\x06\x42\xc2\x7f\xdc\xf3\xba\x8f\x0d\xdc\x7b\xa5\xdf\xfb\x9b\xf0\xbb\xf5\xf4\xae\x70\xbc\x95\xda\x49\x45\x5c\x8b\x5e\x64\x26\x80\xb6\x3d\x30\xe3\x9e\x2f\x83\x87\xda\xef\x5d\x4b\xed\xba\x70\xb7\x4f\xb9\xe3\x32\x76\x96\x1b\x0c\xed\x8d\x17\x59\x43\xe6\xc1\x4d\x99\x99\x8b\x91\xa4\xbd\x3f\x16\x4b\x88\x2e\xe1\x5f\xf0\x2e\xb3\x33\xf1\xfc\xd4\x0a\x46\x5d\x13\x6c\x9e\x65\xc9\xcf\x49\x38\xd6\xcb\x69\x83\xbd\x72\x91\x0b\xfa\x87\x99\x8a\xe1\x85\x5d\x0d\xf7\xee\xe9\x1a\x8e\xe4\xa6\x02\x4e\x1a\xe0\xa4\x00\xeb\xbc\x14\x33\xaa\xca\x88\x5f\x8b\x93\x8b\xcc\x3c\x67\x39\xae\x62\x92\x28\xde\x74\xd4\x62\xbd\x95\x17\x2d\x2b\x3f\x5b\x42\x70\x7e\xfa\xf7\x7f\x1c\x9c\xbe\x10\x82\x15\xc1\x47\xdd\x3d\x7d\x2a\x8c\xe0\x6d\x6b\xaf\xf1\x9b\x67\x04\xdb\xdc\xf3\xb9\x07\x4e\xf0\x2d\xa3\xfd\xca\x9e\xd4\x0b\xec\xbf\xc0\x7e\xbb\xf7\xc9\xc1\xbe\xfe\xab\xb8\xd2\x27\x60\x22\x40\xa6\x50\x81\x07\xfd\xc2\x6c\x58\xa6\x28\x49\x7e\x03\x21\x29\xd7\xf7\x2c\x8f\x8a\x0e\xb5\x60\xf9\x5d\x44\x71\x5d\x48\x2b\x12\xd4\xcb\x1b\x3e\x94\x1a\x8c\x2b\xa5\x70\x5e\x7d\x70\xed\xe5\x0a\xc2\x98\x11\x95\x71\x89\x2f\xb8\x08\x9a\xdf\xcd\x34\xc5\x02\x8d\x3c\x96\xf8\x70\xca\x5c\xc7\x60\xee\x6d\x23\x1c\x26\x4c\x51\xc7\xf0\xe2\x1e\xa7\x15\x9f\x51\x1d\x40\x9a\xd8\xa2\xbb\x6f\x12\x10\x29\xbc\xe2\x58\xf0\x10\xd4\x14\x12\x63\xf0\x56\x7e\x32\x05\xaf\x80\x00\xe6\x96\x1d\x3f\x2c\xaf\x69\xfc\xab\x60\x17\x8b\xc8\x73\x4c\xa6\xba\x64\x5a\x4e\xc6\x15\xa8\xc6\x8d\x2a\xf6\x1b\x61\x89\x63\x63\xb5\x3a\x12\xb5\x00\x5f\x11\x49\x06\x43\x65\xfd\x30\xcf\x81\x01\xbd\xfe\xb9\x40\x38\x64\x07\x87\x59\xae\x4f\x7b\x40\x1b\x2b\x0c\xfa\xde\x57\x7c\xe1\x12\x8d\x4d\xfe\xe9\x1a\x66\xce\x87\xac\x44\x99\xd1\x14\x66\x83\xeb\xa1\x12\x18\x78\xca\xb1\xf1\x5f\x4a\x6e\x68\x7e\xb4\xa1\x0b\x50\x0b\xb2\x51\x1b\xb6\x51\x2d\x69\x3a\x68\xb2\x61\xfc\x7b\x89\x54\x3c\xdc\x42\xec\xaf\xb8\xc1\xb5\x77\xd2\x35\x45\x62\xc1\xfd\xc4\x4b\x83\x62\x6d\x72\xac\x88\x3e\x6e\x5a\x40\x34\xa3\x82\x47\x61\x6a\x97\xaf\x48\x0c\x88\x66\x5b\x4f\x89\xb5\xe6\x46\x9d\x4d\x8e\xcc\x66\xef\xae\xb2\x23\x7c\x6a\x3a\x4b\x45\x82\x14\x7b\xbb\x28\x5c\xc8\xde\x47\xd2\x56\x93\xef\xd9\x55\x78\x22\x69\xdb\x75\x29\x9e\x09\xc3\x84\x46\x54\x65\x9c\x29\x0b\xf3\x51\x76\x5c\x78\xef\x57\x2a\x96\xab\xeb\x37\xe3\x57\x26\xf7\x96\xa5\xae\xd4\xb4\x90\xde\x22\x33\xad\x1f\x4b\xa0\x4d\x98\xd1\x96\x0d\x59\x51\x2f\xd3\xd6\xc8\x3d\x50\xaf\xfc\x5c\xdd\xe4\x29\x45\x02\x1d\xa0\xf2\xdf\x85\x31\x8c\x1f\x08\xd9\x31\x41\xf7\xb9\x07\xe7\x19\x94\x99\xdb\x20\x90\x48\xb8\xcc\x5e\xb0\xf6\xb6\xd8\x03\xb1\xc2\xbc\x5e\x91\x98\xae\xc5\xb2\x54\xa6\x13\x88\x3d\xc9\xc4\x5e\x73\x58\x53\x75\xc9\x85\x54\x10\xea\x4f\x8a\x5c\xc9\x6f\x0a\xd8\x47\x4f\x7e\xc3\x77\x4f\xe8\xd1\xf1\xd9\x1e\x3b\x68\x7d\xfc\xa0\xcd\x31\xee\x19\xc4\x48\x55\xd7\x4c\x95\xe7\xa5\xae\xad\xfc\xdb\xee\x6a\xf7\x78\xb8\xb6\xec\x1d\x0f\x1f\x97\xba\x7f\xe5\x8e\x49\x75\x43\xed\xe1\x0a\x43\x57\x16\x7c\x6c\xba\x63\x52\x4a\x55\x16\x3e\x7e\x00\xa6\xde\xb1\x78\x59\x03\x00\xad\x0d\x82\xaf\x56\xb1\xb3\x19\xfb\xdd\x74\xec\x6f\x51\xc7\xa3\x6e\x3a\x1e\x6d\x53\xc7\x77\xdd\x74\x7c\xb7\x4d\x1d\x87\xdd\x74\x1c\xda\x74\xdc\x0c\x4a\x8f\x8f\x7b\xe8\x78\xd8\x43\xc7\xfd\x1e\x3a\xea\xf7\xd0\xbb\x7e\x0f\x19\x35\xb8\x8f\x25\x63\xf9\xab\xfe\x2d\xbd\xbe\x48\x5a\xdb\xa3\x9e\x64\x27\x47\x38\xe2\xb7\xfb\x83\xd5\xcb\xab\x58\xf1\xbc\x1d\xb7\x1e\x11\x53\xef\x1a\xea\x87\xdd\x05\x0c\x8f\x8a\x63\xb2\x76\xdd\xc3\xc3\xd6\x09\x71\xb5\x57\x5f\x36\x1d\xb6\x9b\x06\x61\xb3\x65\xd8\x6a\x19\xb4\x9b\x0e\xfb\x6d\xa9\xd6\xf5\xdc\x83\x56\xcb\x60\xe5\xff\x25\xb8\x5a\xb5\x47\x4a\x77\x6c\x35\xbd\x9b\x46\xed\xd7\xbf\x6d\xbf\xbe\xad\xd1\xc1\xf7\xed\xa6\xd6\x67\xfb\xef\x5a\x2d\x87\xfd\xd5\x99\xb4\x9c\xf8\x07\xd7\x1f\x68\xe0\xf2\xf8\xa3\x38\x0a\x6c\x6e\x46\xa2\x37\x28\x3b\x08\x41\x6f\xd0\x69\xc6\xe0\xd0\x45\x46\xce\x24\xfe\x6e\xf9\xff\x00\x00\x00\xff\xff\xcd\x32\x35\x17\x0f\x43\x00\x00") + +func monitoringApicastGrafanaDashboard2JsonTplBytes() ([]byte, error) { + return bindataRead( + _monitoringApicastGrafanaDashboard2JsonTpl, + "monitoring/apicast-grafana-dashboard-2.json.tpl", + ) +} + +func monitoringApicastGrafanaDashboard2JsonTpl() (*asset, error) { + bytes, err := monitoringApicastGrafanaDashboard2JsonTplBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "monitoring/apicast-grafana-dashboard-2.json.tpl", size: 17167, mode: os.FileMode(436), modTime: time.Unix(1592930805, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +var _monitoringBackendGrafanaDashboard1JsonTpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5d\x6b\x73\xdb\x38\x96\xfd\x9e\x5f\x81\x65\xf7\x4c\x9c\x5e\x2b\x16\xf5\xf0\xab\x2a\xb5\x65\xc7\xc9\xf6\x4c\x25\x19\x4f\x3a\x99\x9d\x6c\x92\xd2\x40\x24\x24\xa1\x4d\x02\x6c\x00\xb4\xad\xb8\x3c\xbf\x7d\x8a\xe0\x0b\x7c\x49\x96\x45\x49\xb4\x84\x2f\x89\x05\xf0\x79\x71\x81\x73\xce\xc5\x25\x70\xf7\x0c\x00\x03\x12\x42\x05\x14\x98\x12\x6e\x9c\x82\xa0\x08\x00\xc3\xc1\x5c\x18\xa7\xe0\xab\xfc\x05\xa2\x52\x59\x33\xf4\xb1\x23\xfe\x42\x8c\x53\x60\xee\xa7\xa5\x36\x14\x90\x53\x9f\x59\xc8\x38\x05\x46\xab\x05\xfe\x97\xc1\x11\x24\x10\xb4\x5a\x86\x72\x18\x22\x70\xe8\x04\x87\x08\xe6\x23\xa5\x7c\x82\xed\x92\x52\x6c\x51\xf2\x9a\x3a\x94\x05\xd7\x64\xe3\x21\xdc\x6b\xef\x83\x8e\x69\xee\x83\x4e\xbf\xbf\x0f\xcc\x17\xea\xa5\x09\x74\xe5\xbd\xcf\xd2\xd7\x01\x7f\x06\x67\x0e\x62\x82\xab\xc7\x89\xa9\x27\x8f\xb3\x21\x9f\x0c\x29\x64\xb6\x11\xd5\xdd\xcb\xff\xbf\x3f\x03\xe0\x3e\x38\xdc\x40\x36\x16\xb9\xa7\x35\xc6\x04\x89\xbf\xd8\xc6\x29\x20\xbe\xe3\x84\x25\x0c\x7a\x93\x4f\x94\x3a\x02\x7b\xc6\x29\x68\xcb\x42\x6c\xc7\xe6\x31\x1c\x4c\xae\x02\xbb\x7e\xfd\x2e\x7f\x7a\x90\x20\x87\x27\x96\x8d\xed\x6a\x58\xd4\x71\xa0\xc7\x51\x70\xe2\x08\x3a\x3c\x31\x83\x31\x66\xd8\xbe\xa4\x69\xd3\x84\xf6\xca\x99\xff\xc6\x38\x05\x9d\x9e\x52\x70\x1b\x3f\x4b\xf4\x7b\x1a\xfc\x8e\x5f\x34\xb9\xb6\x7c\xce\x4e\x72\x9c\xf2\x74\xdf\x93\x32\x81\x85\xb4\x81\xf1\x0e\x73\x81\x08\x62\xa9\x35\x13\x5b\x32\x7a\x13\x5a\x31\xba\x74\xf2\x5a\xd0\xc1\x90\xcb\x26\x94\x2f\x90\xde\x79\x08\x65\x49\xf6\x55\x83\x26\x79\x87\xc8\x58\xc8\xd7\x6b\x67\xca\x51\xd9\xe1\xaa\xcf\xfd\xac\xfc\x4c\x0e\x19\x61\xc7\x51\x4d\x55\x6d\xcd\xe3\x9c\x35\xcd\xce\x1c\x6b\x9a\xe5\xd6\xec\x9e\x24\xbf\x1d\x34\x46\xc4\xce\xde\x0a\x5e\x8f\xf3\xef\x11\xb4\xbe\xcf\x18\x22\xa2\xa4\xc6\x85\xb7\x65\xa5\x98\x94\x94\xf2\x09\xbd\x29\x76\x22\x41\x05\x74\x4a\x8e\xbe\x86\x8e\x9f\x1a\xb5\xf0\x32\x0e\x26\xb2\x56\xbd\x9a\x2c\xbc\xc1\xb6\xc8\xb8\x5f\xce\xc5\x65\x51\xd0\x3d\x2e\x29\x26\xe2\x3d\x95\x1d\x5b\x16\xa4\xcd\x42\xbd\x64\xb8\x49\xef\xe8\x21\x66\x21\x22\xe0\x18\x15\x5a\xda\x0b\x2e\xc5\xa0\x8d\xfd\xe0\x9c\x4e\xb6\xbc\xe8\x18\x0c\x11\x1b\x31\x24\x87\x8d\x91\x43\x45\x7a\x63\x8e\x18\x46\xfc\x6f\xd7\x88\x31\x6c\xa3\xdc\x43\x73\x0f\x5a\xa8\xcc\xff\xb8\x80\xd6\x55\xe1\x2e\x5c\x20\xcf\x43\xf6\x3b\x4c\x8a\x0f\x2c\x20\x1b\x23\xc1\x95\x11\x54\x1d\x43\x83\xc1\xe5\xd6\x93\x8f\xc7\x7d\x77\x8f\x41\x81\xf6\xa0\x87\x39\x25\x50\x50\x36\x70\xa2\x8e\x36\x60\x88\x7b\x94\x70\x34\xb0\xa8\x8d\xf8\x5d\x30\xc2\xc9\x67\x7c\xf5\xcd\xf8\x39\xf9\xf1\xcd\xd8\x67\xe8\x0f\x1f\x71\x31\x08\xba\xe3\xab\x6f\x06\xf4\xc5\x84\x32\xfc\x03\x7d\x33\xee\xbf\x9a\xee\xf7\x17\xea\x38\x19\x74\x0a\xca\x5c\x18\x38\x9b\x21\xb0\x8b\x06\xa1\x4d\xb2\x87\x60\x22\x10\xbb\x96\x7e\x63\x98\x6e\x79\xdd\x5b\x68\x09\x39\x34\x9b\xed\x4c\x7d\xe8\xf6\x6f\x93\x9b\x24\x8f\x93\xbd\x0c\x43\x23\x39\x92\x1a\x67\x46\x52\x7c\xbf\xbf\x19\x6b\x31\xe4\x35\xc7\x56\x0c\x79\x15\x96\x3a\xdf\xac\xa5\x18\xf2\x28\x13\xcd\x30\x54\xf8\x2c\x15\x76\x7a\xbd\x79\x8f\x92\x0e\x3f\xa0\xc1\x9f\xcd\x30\x58\xee\xa1\x2a\x2c\x77\xb1\x79\xcb\x31\xe4\x35\xcd\x6e\xc9\x23\x55\x58\xed\x8d\x62\xb5\xe8\x2f\x85\x3f\x4d\x18\xe2\x13\xea\xd8\x05\x5e\xe5\xa2\xb7\x8c\xba\x0a\x99\x4c\xca\x3f\xa2\x71\x84\x8f\xb9\x13\x7e\x9b\xe0\x91\x28\x9e\x91\x63\x68\x20\x32\x2b\x07\x1e\x62\x80\x23\x8b\x12\x1b\xec\x0d\xa7\x71\x39\x08\xcc\xfd\x42\xa1\x71\x09\x7d\xbd\x53\xd9\x04\x64\x92\x8e\xe6\xf8\x04\x0f\xfa\x9d\x02\xc2\x31\x95\x18\xc4\x64\x10\x13\x1b\x5f\x63\xdb\x87\x8e\x51\x60\x15\xf1\x31\x92\x35\xa7\x0f\x70\x0b\x6f\x71\x8e\x93\x0d\x7d\xeb\x2a\x44\x50\xf5\x5d\x03\xee\x13\x31\x8a\xc0\x1c\x25\xfc\x3f\x77\x74\x39\x27\x4a\xb8\xcf\xd7\xef\x85\x47\x9c\xc2\x5b\x34\x03\xb8\x6d\x64\x61\x17\x4a\x92\xdc\xae\xf0\x4b\x86\xfe\xf0\x72\x1e\xe9\xc0\x21\x72\x0a\x4f\x17\x54\xd0\xf1\x39\xe4\x28\x4b\xe7\x13\xde\x57\x38\x3c\x24\x7e\x85\x62\xe5\x2d\xe7\xf6\xdf\xf4\x39\xf9\xa4\x30\x84\x6e\xe2\x39\x0b\x3d\x66\x5a\xf4\x06\xe8\xe0\x71\x19\xe5\x95\xe5\xef\xd0\x75\xf2\xd0\xcf\xd4\x8b\x6e\xb1\x1a\xc9\x14\xcc\x90\x23\x3d\xb3\x56\x39\x12\xe8\xf4\x37\xae\x27\xa6\xe5\x12\xfe\xff\x11\xa3\xc5\x1a\xad\x61\xb4\x86\x79\x00\x13\xe0\x9e\x3c\xe6\xd5\x37\xa3\x73\x7b\xdb\x0c\xf0\xef\xfc\xf3\x9f\x8d\x11\x2d\xa9\x79\x7a\xed\x6e\x33\xcc\xd3\x6b\x77\x1b\xa3\x54\x54\xf3\xf4\x9a\x62\x9e\x5e\x63\x04\x8a\x6a\x9e\x93\xa6\x98\xe7\xa4\x31\x2a\x24\x35\x4f\xbf\x29\x63\x4f\xbf\x72\xec\x79\x42\x72\x23\xb4\x3f\x08\x6c\xab\xf5\x86\xd6\x1b\x5a\x6f\x84\x15\x4f\x4f\x6f\xe4\x67\x3f\x4e\x2a\xe4\x46\xb7\x56\xb9\xa1\x95\x83\x56\x0e\x68\x10\x8c\xbc\x7c\x10\xe2\x0a\x1f\x84\x03\xf5\x12\x93\x21\x60\x38\x05\x7b\x0e\xaa\x44\xf7\x09\x82\xc2\x85\xde\xea\x90\xfd\xee\xee\x5f\x77\x77\xc0\x41\xe0\xfe\xfe\x5f\xf7\xf7\x0f\x10\x18\x9b\x04\xf9\xb3\xd8\x7e\xf3\x51\x3e\xb8\x18\x08\x9b\x07\x60\x12\x1d\xc2\x35\xee\x6b\xdc\xdf\x31\xdc\xb7\x20\xb3\x73\x17\x0e\x8a\x2e\xa1\x6d\x63\x32\x2e\x3a\x4f\x50\xf9\x91\xfa\xc4\xce\x5d\x3c\x79\x52\x2b\x4a\x82\xc9\x5d\x30\xc9\x8d\xf9\xe9\xed\xd9\xc5\x9b\xce\x99\xea\xa6\xf2\x94\xdf\x2c\x18\xf6\x62\xfe\x47\xa6\x05\xe2\xda\x09\x72\xa3\xae\x24\x10\xf3\xa8\x03\x05\xfa\x1b\x83\x64\x9c\xd1\x35\xc1\x68\x4d\x49\x08\xd0\xed\x97\xfd\x92\x2e\x42\x3d\x68\x61\x31\x2d\x76\xc3\x80\x94\xa4\xe3\x9e\xe0\x71\x67\x5b\x84\xc4\xd4\x18\x23\x2d\x92\x96\x78\xac\xcf\x40\x71\x1c\xc9\x3c\x4f\x86\x86\x2c\xbc\x4d\xf0\x78\xe2\xe0\xf1\x44\xbc\x8e\xda\x39\xc3\x12\x42\x1e\xd4\x9f\xc9\x83\x22\xff\xac\xe4\x1e\x79\x42\x51\xca\x18\x18\xba\x46\x8c\xa3\x2f\x55\x8f\xa9\x51\x78\xd5\x28\x3c\x03\x6d\x97\x01\xd5\xe8\xd5\xeb\x01\xd7\x32\x58\x0a\x4a\x7f\xc5\x5c\xd0\x31\x83\x6e\xa5\x1f\xc6\x18\x9a\x6f\x09\xe3\xf6\xac\x30\x6e\x16\x07\xdc\xf4\x3a\xb7\xa1\x83\x7e\xf0\xdd\xa1\x24\xa5\x19\x93\x44\x95\xbf\xe1\x1f\x79\x50\x35\xa6\xc5\xdb\x94\x83\xa2\x0a\x35\xea\xb8\x55\x8a\x25\xa5\x48\x52\x8a\x23\x55\xc6\xf3\x1c\x2c\x12\x27\x2b\x1d\xae\xa7\xe1\x4b\x9d\x47\x43\x7a\xe0\xfd\xd4\xc8\xd7\x96\xdb\x63\x5a\xb0\x47\x29\xc2\x6c\xb1\xb2\x34\x8f\x0a\xf6\x0c\x87\xd4\x23\x2d\x2d\xb5\xb4\x6c\x1a\xa8\xa9\x99\x63\xdb\x00\x69\xeb\x15\x96\x0c\x79\x5a\x56\x86\xe5\x5a\x56\x6a\x59\xd9\x38\x59\xd9\x3f\x3a\xe9\xbd\xed\x68\x59\x99\x14\x94\xa7\xde\x14\x19\xcb\xaa\x74\x65\x7f\xf6\xd7\x05\x3b\xa9\x2b\xb7\x0d\x82\x97\x52\x95\x55\x88\xaa\x35\x25\xd0\x9a\x72\x67\x35\x65\xa7\x5f\xb0\x67\x38\x9c\xb6\xb5\xa6\xd4\x9a\xb2\x49\x80\x96\xfb\xc6\x66\x1b\xf0\x6c\x7d\x92\xf2\xa3\x34\x9e\x56\x94\x61\xb9\x56\x94\x5a\x51\x36\x4e\x51\xbe\xed\xf4\x4e\xfa\xaf\xb5\xa2\x4c\x0a\x4a\x15\x65\x09\x5f\x59\x99\xa2\x3c\xd6\x8a\x72\xcb\x01\xf8\xd1\x82\x72\x06\x9e\x6a\x3d\x09\xb4\x9e\xdc\x59\x3d\xd9\xed\x16\xec\x29\x07\xd3\x43\xad\x27\xb5\x9e\x6c\x14\x9c\x55\xad\x45\xb0\x0d\xb8\xb6\x89\x24\xd8\x3d\x69\xc6\x17\x5a\x63\x86\xe5\x5a\x63\x6a\x8d\xd9\x3c\x8d\xf9\xf6\xe4\xb8\xdb\xd6\x1a\x33\x29\x28\xd5\x98\x25\x1c\x66\x55\x1a\xf3\x70\xf6\x22\x04\x3b\xa7\x31\xb7\x19\x94\x6b\xc8\x89\x9d\x85\xb1\x5a\x77\x02\xad\x3b\x77\x56\x77\xf6\x2a\x56\x79\x39\xec\x68\xdd\xa9\x75\x67\xd3\x20\xae\xb8\x92\xdb\x36\x00\xdc\xfa\x33\x64\xb5\xe6\xd4\x9a\xb3\xf8\x96\xa9\x8f\x6a\xcd\xb9\x79\xcd\x79\x7e\x7c\x74\x74\x71\xa2\x35\x67\x52\x50\xaa\x39\x4b\xf8\xcb\xca\x34\xe7\xec\x95\x28\x76\x52\x73\x6e\x27\x20\x2f\x9d\x2f\xab\xf5\x66\xa6\x52\xeb\xcd\x6c\xe5\x3c\xbd\xb9\x8e\xad\x1b\x7a\x15\xeb\xed\xf4\x15\x59\x32\x6b\xef\x86\xff\xa3\xec\x6a\x57\x76\x6e\x98\x6b\xcc\x7e\xc5\x46\x18\x3d\xbd\x75\x83\x56\xd1\xcb\x81\xf6\x8d\xec\x67\x83\xdf\xe9\x70\x60\x51\x9f\x54\xc3\xf3\x3d\x50\x00\x38\xbb\x1c\x37\x00\xeb\x5f\x6c\x30\x84\xe1\xe0\x39\x9e\x84\x32\xfe\x2b\x1d\x16\x54\xf0\xef\x74\xa8\xd7\x35\x5f\xa9\xdc\xa5\x5a\xec\x36\x51\xec\x3e\x5d\xa4\x9e\x1b\xef\xee\x1f\x57\xd0\x9e\x9e\x46\x6a\x8d\xd4\x75\x21\x35\xf3\x49\x04\xb2\x0f\x53\xd6\x91\xa2\x0e\xb3\x63\xff\x4a\x87\x5b\xa5\xa6\xd7\xfe\xb5\xce\xef\x25\x58\x1e\xb5\x88\x8e\x65\x6b\x70\xdf\x71\x70\xd7\x6b\x3e\x44\x07\x34\x2c\x92\x5d\xc2\x4c\x56\xf6\x85\xce\x53\x5f\x4b\x50\x43\xed\x6a\xbe\xcb\xc9\x23\x67\x26\x56\xfd\x78\x04\xd5\x51\xea\x6d\x8c\x52\x6f\xb1\x4a\x3c\x3c\x2c\xd8\x33\x1c\x38\x0f\xb5\x4a\xd4\x2a\x71\xc3\xd0\xf5\x81\x0a\x3c\x9a\x6e\x1b\x74\xad\x4f\x25\x86\xf6\xd3\x2a\x51\xab\xc4\xb8\x50\xab\xc4\x06\xa8\xc4\x61\x6f\x34\x6a\xeb\x6f\x6c\xb2\xc4\xa4\xa0\x12\x4b\x98\xc9\xca\x54\xe2\xec\xe5\x91\x77\x41\x25\x6e\x27\xd4\x3e\x5a\x25\x56\x20\xa7\x56\x89\x5a\x25\x6e\x34\x97\xe9\xa8\x57\x78\x31\x39\x82\x99\x69\xc6\x66\x59\x2e\x13\x43\x1e\x0a\x1b\xc3\x46\x9e\x43\xa7\x2e\x22\xe2\x35\x25\x23\x3c\x36\x8a\xbe\x7f\x49\x6d\x0e\xf6\x7e\xce\x1f\xf9\x62\x81\x04\x28\x0b\x5a\x13\xf4\x09\xbb\x88\xfa\x85\x3e\x26\xd1\xec\x1c\x5a\x57\x63\x16\xb5\x45\x66\x40\x96\xd5\xff\x08\x88\x58\xc1\x8c\x56\xac\xc0\xd3\x11\xb2\x6c\x51\x24\x36\x1e\xc2\xbd\x4e\xf7\x68\x1f\x98\x9d\x93\x7d\xd0\x6b\xef\x83\xf6\xcb\xe3\x13\x75\x20\x33\x7e\xea\x9c\x9c\x58\xbd\x43\xa3\x30\x64\x3c\x00\xe3\xca\x1c\x5e\x71\x77\x42\x89\x0a\x88\xd0\x97\x42\xf0\x2e\xe3\xec\xf1\xfb\x99\xed\x76\xd6\xe1\xe3\x8a\x76\xd1\xe5\xf3\x2c\x27\xd1\x11\xef\x02\x7a\x56\x00\x14\xf5\x88\xf7\x30\xcc\x60\xab\x18\x0c\x2a\xdd\xb3\x9b\x73\xcf\xc3\x79\xde\x59\xb2\xf4\x12\xb6\xa5\x23\xc4\x5a\xb5\x14\x7f\xbb\xa9\x1d\x55\x00\x31\x66\x81\xac\x0b\x3d\x0f\x93\xf1\xa7\xd0\x15\xcd\xb2\xf2\x19\x60\x1a\xa9\x82\x90\xf1\x03\x41\x81\x40\xb7\x39\xd6\x7b\x1d\xb7\x51\x0a\x30\x15\xe4\x39\xbe\x98\x24\x63\xb3\x2f\xd6\x99\x81\x56\x2e\xbc\xbd\x80\x02\x5e\xc6\xc1\x00\xc5\x39\x8a\x81\x08\x8b\x12\x82\x2c\x81\x6c\x23\x73\xcc\xa7\xe0\xce\xb9\x0e\x57\x1e\xa5\x70\xfc\x31\x26\xff\x40\x8c\x63\x1a\x0c\xb3\xc6\xe1\xcb\xce\xcb\x74\xcb\x5d\xc3\xa3\x5c\x8c\xf0\x6d\xb6\x19\xa2\xc2\xb7\x94\xc4\x83\xa1\xd1\x6f\xff\x49\xa9\x67\xa8\x78\x8e\x2c\xab\x3c\x45\xda\xec\x3d\xf4\x66\xb4\xd5\x28\x44\xf0\x6c\xec\x45\xd6\x88\xf0\x6d\x8d\x0f\x07\x67\xb9\x0a\x9a\x9c\x30\xc3\xe0\xdc\x83\xec\xca\x09\xe3\x1e\x8a\xe7\x8f\xb0\xe3\x24\x64\x5d\x0e\x26\x5d\x73\x1f\x98\xe6\xf1\x3e\x30\x8f\x4f\x82\xc1\xc4\x3c\xce\x0c\x26\x23\xdf\x29\x8b\x4c\x05\x57\x56\xaf\x13\x5e\xa6\xd3\xde\x07\xe6\x49\x37\x73\x81\x99\x04\x53\xc0\xa1\x13\x5c\xc7\x77\x49\xd6\xb2\x0b\x31\xc6\x2b\x7f\x88\x06\x0c\x79\x0e\xb6\x60\xe0\x0e\x16\x25\x82\x51\xc7\x41\x6c\xc0\x05\x14\x3e\x1f\x30\x04\xed\x69\x7c\x88\xba\xe1\xef\xf3\x94\x2f\x3e\xdf\x2f\xbd\xc4\xab\x7f\x3f\x2f\xc0\xc5\xcb\x5f\x9e\xdf\x3f\x3e\x2f\x2f\xe5\x88\x33\x29\xe2\xd2\xf1\x17\xc3\xdc\xef\x18\x65\x7c\xd1\xe8\xb6\xb9\x51\x4a\x18\xf3\x35\xf1\xbc\x82\x4f\x08\x26\x63\xe0\x51\xbb\x24\x55\x98\x63\x32\x76\x50\x60\xe9\xb4\x4e\x8e\x09\x6a\xc7\x38\x56\x3b\x86\xac\x9d\xdd\x31\x68\x40\x2c\x8d\x57\xe5\x7d\xa2\x5d\x3e\x00\xcd\xed\x14\xf2\xc0\x0f\xd1\x88\x06\xaf\xc7\xab\x01\xf8\xcb\x78\xa4\x28\x41\xf8\x05\xc0\x3f\x42\xf1\x45\xc1\x3f\xe2\x0c\x1a\xfc\x97\x01\xff\xc3\xba\xc0\xbf\x53\x06\xfe\x19\x8f\xd2\xf0\x5f\x3b\xfc\x6b\x78\xdf\x19\x78\xf7\x90\x55\x33\xac\x83\x16\xd8\x1e\x4e\xb1\x51\xd6\xf0\x99\xc0\x6b\x88\x9d\xc0\x07\x34\x73\xd0\xa1\x81\xed\x61\x07\x85\x70\xfe\xa3\xe9\xc1\x91\x8e\x0d\xe8\xd8\x80\x26\x0f\x2b\x22\x0f\xf2\x4b\xbb\xbd\xf8\x5f\x22\x20\x26\x88\x0d\x5c\xe4\x52\x36\x1d\xf8\x1c\x8e\xd1\x60\x38\x15\xa8\x12\xbb\x3d\x6a\x97\x21\x75\xeb\x2b\x6c\xfd\x68\xb7\x4e\xbe\xff\x77\xfa\x57\x40\x1c\x86\x53\xb0\x47\xa8\x8d\x5e\xec\x52\x68\x40\x06\xd4\x6d\xcc\x05\xc3\x43\x5f\x20\x1b\x50\x02\x26\x94\x0b\x8d\xf6\x75\xa2\xfd\x23\x63\x01\x76\xaf\x07\xbb\x50\xa3\xfd\x72\x68\x7f\x5c\x17\xda\x1f\xea\x60\xc0\xfa\xf1\x5e\xe3\xf9\xd6\xe0\xb9\x0b\x6f\xf7\x02\x6d\x6e\x23\x47\xc0\x50\xa1\x7b\xd4\x1e\xa4\xd0\x9e\x28\x73\x2e\x20\x13\x7c\x20\xf3\x6a\x6b\x41\xf7\xaf\xfd\x24\x6d\xc4\xa3\xf6\x4e\x21\xfc\x7b\x78\x2b\xe5\x3b\x88\xcd\x0a\xf6\x1c\xc8\x05\xe8\x03\x17\x13\x5f\x20\x5e\x32\x79\xbe\x6d\x50\xff\x74\x92\xe4\x8f\x72\x68\x36\x3f\xeb\xa2\xe2\x53\x6a\x73\xf6\xda\xcc\x8b\x26\xc9\x07\x08\xf9\xc6\xf5\xc4\xb4\x98\xe0\x12\x27\xb9\x15\x6b\xb6\x29\xb3\x1e\x40\x0e\x7e\x04\x6f\x39\x07\xaf\x1e\x9a\x61\xdf\xcf\x96\x3f\xf9\x0c\xfb\xf5\x46\x79\x97\x1f\xbf\x3b\x33\xc7\x6f\xe9\x77\xad\x4c\xd4\x53\x39\xee\x1d\x26\x57\x65\xd9\xc2\xca\x38\x9f\x29\x0f\x8c\x2c\x1b\x63\x2e\x45\xdb\xfe\x69\x71\x19\x53\x2e\xb1\x6c\x62\xbb\x73\xa3\x36\x2b\xe9\xd9\x85\x85\x9a\xc6\x27\x73\x1b\xe7\xf5\xc3\x1b\x67\x6b\xa3\x37\x3e\x47\x76\x2b\x1b\x23\xc9\x1a\xe9\xa2\x21\x9f\xd8\x5c\x52\x1b\x48\xfb\x83\x3d\x39\x9e\xed\x03\xd9\xbe\xfb\xc0\x27\xc1\xff\x2f\x00\x24\x76\x48\x0d\xe5\xdb\xa4\x61\x20\x4c\x89\xc2\x09\xf5\x97\x36\x75\x7e\x69\xb3\xf2\x6f\x58\xb2\x37\x7e\x62\x1f\xda\xa8\x74\x4e\x2f\xb6\x54\xaa\x10\x0e\x17\x55\x08\xc7\x15\x9b\xa4\xd7\xbb\x2a\xe2\xce\x0b\x84\xba\x84\xc1\x12\x9f\xde\x86\xa9\xf4\xc8\x3e\x9f\x7e\x2c\x46\x63\x9b\x29\x1b\x36\x1f\x0b\x5a\x35\x5d\x90\x9f\x0a\x79\xd4\x7e\x0a\x1f\xe5\x5e\x3e\x34\x4e\xf4\x08\x4e\xd0\xde\x51\x4e\xd0\x00\x54\x7d\x2a\xe8\xbf\xb1\xcf\x6c\xd7\xf0\x75\xd4\x49\xc5\x16\x3f\xe9\x8a\x87\x4b\x7f\x1c\xf5\xfa\xf2\x33\xf8\x1c\x08\xab\x25\xbf\x90\x7a\x3a\x5c\x68\xe1\x68\xe9\x49\xa7\xbc\x15\x0e\xd3\x66\xa8\xc8\xe4\xd1\x0b\x8d\xe8\x70\xe8\x02\xbc\x86\x50\x1b\x0d\x12\x86\x92\xe5\x36\xa7\x29\xcb\xb1\x3c\x3f\x8a\x85\xc4\xdf\x44\xcb\x26\x3e\xe5\xbe\x3b\x60\x50\x20\x85\xf0\xfc\x7b\xd9\xe8\x48\x3d\x64\x67\x76\xdc\x74\x06\xd9\xa9\x2d\x74\xba\x49\x82\x94\x0c\xb1\x3a\x3e\xd2\x70\x2e\xa4\xc3\x20\x4a\x79\xb3\x98\x50\xd5\x9e\x17\xf5\x32\xa1\xbf\xfb\x54\xc0\xb5\x32\x21\x4b\x26\x47\xe4\x9e\x7b\x0d\xf4\x68\xa4\x4c\xca\x9b\x6d\x75\x56\xbe\x3e\xe2\x64\xb6\x2b\x36\xd7\xa8\x77\x9a\x79\x17\x29\x12\x1c\xa3\xb2\xe5\x2c\xd6\x42\x9d\x2c\x46\xa5\x33\x65\x5e\x7b\x36\xa1\x9a\xd0\x9b\x5f\x11\xb4\xe5\xe5\xb2\xa7\x85\xd8\xa6\x2e\x2d\x44\x9d\xdc\x00\x61\x23\x6e\x55\xb6\x41\x8d\x5c\x8d\x8b\xa9\x33\x0b\x88\x64\xc7\x0e\xec\xf1\x29\x0b\x84\x61\x0f\x44\x29\xa1\xf9\xf2\xe5\xcb\x97\xd6\xfb\xf7\xad\x8b\x0b\xf0\xeb\xaf\xa7\xae\x7b\xca\x73\x04\xc9\x83\x42\x20\x46\xca\xaf\x95\x2c\x89\x82\x6d\x1b\x91\xf9\x73\x67\xc9\x63\x15\x79\x46\x6c\x50\xca\x22\x1f\x2b\x60\x47\x9a\x79\xfa\x7d\x99\x17\x52\xe6\x30\x72\x5c\x2f\xa4\x6e\xb9\x8e\x15\x55\x7c\x4a\x58\x90\x71\xc1\xb0\xe3\x00\x9b\xde\x10\xa3\x70\xd8\x67\xe6\x14\xd3\xa3\x14\x13\xca\xd4\x52\xf0\x53\x3e\x8d\xae\x9c\xe0\x65\x4c\x4c\xc2\xe5\x51\x32\x75\x3e\xc1\x0a\x8e\x2f\x66\xfd\x8f\xd1\xa6\x61\xbb\xd9\x00\xe7\xcd\x69\x00\xf0\xa7\xdd\x6c\x82\xd7\xf5\x36\x41\x04\x27\xf2\xe7\x62\x0d\xf1\x0e\xbb\x78\x57\xfb\xc1\xc5\xe6\xfb\x41\x68\xfe\x5d\xed\x05\x6f\x9a\xd0\x0b\x2e\xa9\xdd\x3c\xeb\x67\x79\xef\xa3\x8c\x7f\x60\x1f\xdc\xdd\x81\x97\x1f\xe2\xb0\x12\xb8\xbf\x2f\x14\xb4\xba\xdc\x82\x0e\x6a\x5d\xf9\x43\xc4\x08\x12\x88\xb7\x2c\xea\x7a\xbe\x40\x2d\x86\x42\x69\xc2\x5b\x1e\xb5\xff\xe7\x1a\xb2\x56\x1a\xad\x4a\x63\x55\x7f\x0e\x2a\x3c\x6a\xbf\xfa\x79\x30\xb0\x50\x3e\x75\x5e\x69\x71\x2f\x6f\xe5\x75\xf7\xb6\x06\xb5\xb1\x62\x96\x83\x97\xbf\x1c\x2c\x6e\x17\x2e\x18\x26\xe3\x87\xd9\x25\xfa\x4b\x89\x83\x6d\x73\xa4\x13\x0e\x1d\x94\x8f\x71\x72\x01\xa5\x1c\x2d\xf4\xa9\x05\xc3\x9f\x95\xd3\xbb\x99\xf2\x25\xd2\x41\xb3\x73\xe4\x71\x07\x1c\xc4\x3b\xdc\x4a\x2b\x5b\x94\x65\xb2\xea\xb6\xce\x9c\xe7\x75\x98\xb3\xa1\x6e\x0b\x0e\x80\x6e\xec\x6c\xc6\xe9\x8a\xfb\x8e\x23\xf9\xd5\x6e\x18\xf3\x62\xb7\x7b\xce\x2e\x35\xf5\x9b\xf5\xcc\xa3\xcd\x9f\x2e\x93\x71\xf8\x8d\xa4\x0e\x31\x48\x78\xd0\x08\xc5\x26\x48\x68\x52\xae\x58\x4f\xa5\xed\xca\x54\xda\x33\xb0\xa1\xd9\x2f\xb3\x7d\x54\x68\xea\x30\x05\x25\xf9\xb9\xf4\xf4\xd7\x7b\xf9\x91\x85\xce\x05\x9a\xd7\x12\x15\x9f\x4e\xa6\x19\xb8\x7a\x4a\x4b\x67\xfd\x2c\xa2\x85\x1f\xf8\x9d\x53\x96\x6c\x80\x45\xd8\xc6\x3e\x48\xee\xf1\x5f\xaf\x9e\xeb\xd4\x9e\xfa\x52\x7b\xd4\x41\x53\x67\xf7\x2c\x47\x49\xa4\xc3\x6b\x4a\xb2\x8b\xd9\x3d\xa6\x59\xf1\xb9\xd1\x51\xed\xfc\x46\x67\xf8\xd4\x4a\x87\xcc\x8a\xed\x16\xbb\x9a\x0e\xe9\x0c\x1f\x00\x16\xcb\xf0\x29\x5d\xc3\x4b\x27\xf8\x24\x8f\x55\xca\x36\x62\x93\x6e\x7c\x6e\xf1\x09\xe6\xf8\xd8\xc8\x0a\x59\xc7\xc2\x6d\xa0\x33\x7d\x1a\xd5\x0c\xbb\x9a\xe9\xd0\x88\x7c\x9f\xa8\x2d\x74\xca\x4f\x6d\xed\xf0\xf8\x0e\xa1\x13\x7f\x6a\x6c\x06\x9d\xf8\xa3\x13\x7f\x74\xe2\x4f\xad\x89\x3f\x8f\x0a\x76\xae\x38\xd6\xb9\xd5\xc9\x3d\x91\x99\xeb\x33\x70\x43\x2d\x5a\x4b\x7e\xcf\x06\xbd\x73\x91\x1c\x9e\x5d\x69\xd3\x75\xa5\xf1\xec\x8a\x3d\x6b\xc9\xe4\x69\x76\x1f\xd9\xb1\x16\x6d\x44\xc2\x8e\x1a\x59\xd7\x39\x3b\x3a\x67\xa7\x51\x13\x64\xcf\xc0\xa6\xe6\xb4\x3a\xdd\x42\x53\x87\x1f\x3f\xd7\xf8\xcd\xfa\x07\x24\x6e\x28\xbb\xda\xb1\xac\x9d\x85\x57\x33\x34\x3b\x55\xdb\xcc\xa7\x13\x8c\x7a\x9e\xaa\x71\x4b\x13\x36\x32\x5d\x07\x33\x28\x90\xc2\x82\x48\xd8\x05\x07\x0c\x59\x08\x5f\x47\x44\xa8\xb0\xf2\xe0\x12\xcc\xa3\xf6\xa5\x07\x1f\x9d\xb2\xd3\xb8\xa5\x07\x3f\x86\x36\x07\xe7\x90\xd8\xa1\xa7\x2f\x45\x3f\x76\x35\x07\x47\x09\x2c\x15\xd0\x35\x75\xb0\x73\x6f\xa5\xd9\x39\xf9\xdd\x3c\xb6\x83\x7e\xa8\x4d\xa0\x17\x21\x5e\x14\xb6\xbb\x55\xeb\xc7\x1c\x6b\xd8\xd6\xb0\x5d\x0b\x6c\x4b\xf1\xe8\x62\xa1\x71\x7b\x8d\xb8\xfd\x29\x32\xba\x06\xee\xba\x62\x03\x1a\x9c\x9b\x01\xce\xcf\xa2\xcb\x06\x7d\x2e\xe8\x4e\x61\xf2\x65\xd8\x36\x06\xb7\x26\xc8\x85\xe9\x3e\xc4\x21\x8c\x85\x69\x69\x52\xf0\x43\x76\x15\x1e\x29\xe0\x38\x6d\x76\x23\x9c\x54\x8d\x0c\x67\x0c\xa1\x75\x15\x40\x5e\x72\x2b\x81\x5c\xcf\x81\x02\x93\x71\xf2\x0a\x86\x83\xb9\x50\xfc\x46\x45\xe2\x70\xab\x4a\x15\x6b\x31\xb1\x1c\xdf\x46\x67\xe5\x3b\x01\x96\xb6\x90\xe1\xfa\x8e\xc0\x25\x87\xc7\xfb\x45\x96\x50\x85\x0c\x26\xa9\x33\x91\xc6\x1f\x3e\x62\x53\x39\xab\xcb\xa8\x8b\xc4\x04\xf9\xaa\x37\x2b\xb6\x34\x33\xa5\x63\x74\x9b\x8b\x8d\x1a\xfc\x0a\x7b\x9f\x99\xf3\xdb\x94\x58\x25\x0f\x17\xf7\x78\xe5\xe1\xf2\x5d\x2e\xe3\x02\x4e\xbc\x6b\x69\xee\xe5\x53\x2a\x91\xf1\xf4\xb8\xd5\x72\x93\xac\xd1\x6e\x75\xf9\xb9\xf2\x6c\x47\x48\x36\xaf\x2b\x1c\x56\xd6\xc1\x1e\xdd\x8a\x46\x82\x66\xc6\x02\x8d\x59\x7a\x92\xd2\x96\xca\x8b\xa8\x06\x91\x5c\xc0\x09\x77\xf2\x2c\x86\xc0\x1f\x6a\x9a\x87\x19\x27\xed\xd6\x4a\xc7\x56\x5d\x6b\xc6\x3d\x1e\xe8\x35\x96\xcf\x05\x75\x1f\xe7\x31\xf3\x89\xb4\xd4\x61\x23\x4c\xb0\x88\x36\x29\x97\x4d\x36\x08\xd1\x21\x9d\xf3\xc0\x64\x44\x67\xef\x68\x10\x8d\x0f\xad\x97\xbf\x3c\xbf\x97\xdf\x09\x65\xb6\xeb\x9c\xe7\x38\x39\x70\x4a\xfc\xa6\x32\x18\xf9\x90\xb1\x60\xc6\xb9\xf3\x46\x84\xd5\x58\x61\xce\x88\x72\xb0\xf7\xf2\x97\x17\x65\xac\xee\xe0\xe1\x5e\x13\x51\x13\xf5\xfa\x02\x8e\xa5\x7b\xf0\xbf\xc7\x6f\x67\x64\x6b\x0b\x66\x08\xca\xca\x0f\x8e\x7c\x32\xb4\x93\x52\xe1\x73\xf4\x29\xbc\x50\x46\x72\xc8\xff\x03\x7e\x71\x1f\x42\x06\x96\x2d\x13\x81\x45\xb2\x49\x2d\xbd\x69\x99\x31\x13\x8a\xf7\xa1\x0d\xc3\xc5\xe9\x69\x1e\xb6\xae\x24\xeb\x8f\x4e\x8e\x4c\x39\x88\xe9\xaa\x3a\x20\x18\x7d\x65\x73\x51\x53\xdd\x69\x34\xb3\xed\xa8\xe9\xa6\x7f\xf7\x95\xbf\x4d\xf5\x47\xb7\xad\xd6\x28\x7c\xad\xa3\xfc\x6d\xda\x61\xf7\xfc\x1e\xbf\x43\x40\xae\x8b\x03\x55\xf5\x5d\xd4\x0b\x1f\xaa\x17\x56\xef\xd2\xe9\xa9\x3f\x94\x5d\x8a\x8f\x6c\xf5\x79\xe3\x67\xc9\x98\xef\x07\x95\x4a\xc6\x88\x70\x3e\x66\xc4\xf9\xd1\x09\x1c\x80\x10\xf5\xc1\x01\x38\x8f\x00\x5f\x9e\x71\x9d\xb2\x87\x67\xf7\xff\x09\x00\x00\xff\xff\x9d\xdb\xd8\x6d\xb3\x1d\x01\x00") + +func monitoringBackendGrafanaDashboard1JsonTplBytes() ([]byte, error) { + return bindataRead( + _monitoringBackendGrafanaDashboard1JsonTpl, + "monitoring/backend-grafana-dashboard-1.json.tpl", + ) +} + +func monitoringBackendGrafanaDashboard1JsonTpl() (*asset, error) { + bytes, err := monitoringBackendGrafanaDashboard1JsonTplBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "monitoring/backend-grafana-dashboard-1.json.tpl", size: 73139, mode: os.FileMode(436), modTime: time.Unix(1592930951, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +var _monitoringKubernetesResourcesByNamespaceGrafanaDashboard1JsonTpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5d\xeb\x6e\xdb\x38\x16\xfe\x3f\x4f\xc1\xe5\x76\x06\xed\x22\x6e\x62\x27\x69\xda\x00\xc5\xa2\x4d\xb7\xed\x60\xdb\xd9\x4c\xd2\x0e\x50\xb4\x85\x87\x91\x18\x9b\x88\x44\x6a\x48\x2a\x97\x06\xde\x67\x1f\x88\xba\x91\x12\xad\xd8\x8e\x2f\x8a\xcd\xfe\xa9\x7d\x28\x51\xe4\xf9\xce\xe5\x13\x79\x42\xdf\xfe\x04\x00\x00\x10\x51\xca\x24\x92\x84\x51\x01\x0f\x41\x2a\x04\x00\x06\x44\x48\x78\x08\xbe\x66\xdf\x41\xd1\xa2\x5a\xcf\x62\x12\xc8\x5f\x29\x3c\x04\xdd\x2d\x5d\xee\x23\x89\x04\x8b\xb9\x87\xe1\x21\x80\x9d\x0e\x78\xc7\xd1\x39\xa2\x08\x74\x3a\xd0\xb8\x10\x53\x74\x16\x24\x17\x49\x1e\x63\xa3\x65\x48\x7c\xab\x9c\x78\x8c\x1e\xb1\x80\xf1\xa4\x67\x3e\x38\x43\x8f\x77\xb6\x40\xaf\xdb\xdd\x02\xbd\xfd\xfd\x2d\xd0\x7d\x62\x3e\x80\xa2\x50\x8d\xe1\x55\x39\x3d\xf0\x0b\x78\x15\x60\x2e\x85\x79\xa5\xbc\x89\xd4\x95\x3e\x12\xc3\x33\x86\xb8\x0f\x8b\xd6\x51\xf6\xe9\xbb\xfa\x7f\x94\xde\x06\xb1\x4f\x64\x6d\xf4\x70\x40\xb1\xfc\xd5\x87\x87\x80\xc6\x41\x90\xcb\x38\x8a\x86\x9f\x18\x0b\x24\x89\xe0\x21\xd8\xc9\xc4\xc4\x2f\x15\x07\x03\x42\x2f\x12\xcd\x7f\xfd\x9e\x09\x22\x44\x71\x20\x34\xdd\x97\x9a\x87\x1e\x0b\x02\x14\x09\x9c\x74\x70\x8e\x02\xa1\xa9\x08\x0e\x38\xf1\x8f\x99\x0e\x62\xaa\xcf\x1a\x48\x57\xf0\x10\xf4\xf6\x0c\xd1\x75\x39\xba\x4c\x72\x93\x48\x4a\x45\x68\xcf\x49\x47\xdf\xd3\x24\xe5\x88\xbf\x6b\x52\x8e\x23\x8c\xa4\xa1\x90\x54\xdf\x44\x2a\xdd\xc1\xa3\xe3\xcf\xe0\xb3\x40\x03\x0c\xf5\xd6\x0c\x0d\xce\xae\x72\x1c\x8a\x87\x6b\x8a\x40\x01\x41\x42\x99\x83\x9a\xb0\x3e\xbe\x33\xa4\x64\x55\xf5\x24\xf0\x7e\xc0\x74\x20\x95\x42\x76\x2a\x2d\xd8\x7e\x8b\x6e\xcd\x8f\xb4\xaf\xda\x45\xe7\x24\x08\xaa\x3d\x26\xb2\x77\x1c\xf9\x04\x53\x69\x6a\xb6\x09\xa5\x83\xd9\x50\xea\x36\xa0\xa4\x09\x02\x3c\xc0\xd4\xaf\x3e\x17\x5d\x0e\xea\x13\x4f\x0c\x2d\xe6\x3c\x1d\x7c\xbd\x2d\x44\xd7\x76\x39\xa1\x56\xb9\x18\xb2\x2b\x9b\x47\x4b\x26\x51\x60\xbd\xe3\x12\x05\x71\x89\x88\x75\x7e\x01\xa1\xea\x0a\xb3\x57\x25\xbe\x22\xbe\x02\x79\xc7\x94\x5f\xd4\x2c\x34\x31\xcc\x63\x46\xa8\xfc\xc8\x54\xcc\x51\x02\x80\x04\xf8\x81\x39\xd3\x31\x66\x51\x35\x3e\x82\xdc\x3e\x3e\x14\x1d\x5b\x87\x19\x61\xee\x61\x2a\x13\x23\xaf\xdb\x57\x94\x3c\x3b\x31\x93\x38\xe9\x61\xbf\xda\x62\x33\x49\x8e\xa9\x8f\x39\x56\x41\xf0\x3c\x60\x52\x1f\xa5\xc0\x9c\x60\xf1\xbf\x4b\xcc\x39\xf1\x71\x6d\xb6\x22\x42\x1e\xb6\x7b\x80\x90\xc8\xbb\xa8\x2b\x53\x48\x1c\x45\xd8\xff\x40\xa8\x6d\xf4\x12\xf1\x01\x96\xc2\x48\x12\x66\x9a\x48\x62\xe5\x75\xa4\xc6\x2a\xe2\xf0\x31\x65\x3e\xee\x27\x71\x59\x8d\xa4\x1f\x31\xbf\xef\x31\x2a\x11\xa1\x98\x1f\x16\x9f\xfa\x5e\x14\xf7\xe3\x24\x2c\xf4\x05\xf6\x18\xf5\x45\x5f\x19\xca\xa1\x88\xc3\x3e\x47\x12\xdf\x7a\x41\x2c\x24\xe6\x2f\xbf\xc1\x47\xd9\xc7\x6f\x70\x0b\x14\x1d\x27\xf2\xe2\xcb\x37\x38\x7a\x02\xce\x6e\xc0\xe3\x88\xf9\x66\x86\x48\xdc\x94\xf1\x50\x45\x28\x28\x49\x98\x3c\x2e\xd1\x5f\xf5\x22\x42\x25\xe6\x97\x28\x78\x8b\x3c\xa9\x92\x4f\xaf\x72\x41\xea\x58\x6f\x8b\xbe\x6e\x6f\xff\xbc\xbd\x8d\x98\x3f\x1a\xfd\x39\x1a\x55\x7b\x4b\x2f\x4e\x8c\xa6\x16\x18\x33\x7c\xcf\x55\x12\x81\xaf\xaa\x77\x26\x60\x28\xdc\x34\xf1\xa8\xf8\xac\x03\x2d\x87\x1c\x8b\x21\x0b\xfc\x9a\x09\x24\xd3\x7c\xcb\x59\x68\x0b\xca\x21\x3e\xc1\x83\xcc\xca\x6b\x37\x9d\x0e\xc9\xf9\xf4\xa1\xbc\x48\x7c\xb7\x66\x38\x40\xdc\x96\xc0\x92\x26\xc6\x65\x2d\xc6\xa9\x60\xd0\xcf\xf3\x02\xa1\x3e\xb9\x24\x7e\x8c\x02\x68\x75\xb8\xfc\x3a\x95\x7a\xf5\xd1\x5c\xa3\x6b\x52\xf3\xe0\xb3\xd8\xbb\x48\x6d\xb8\x8a\x05\x0c\xb3\x98\x90\x4c\xdf\x4a\x2d\x6a\x77\x8c\x8b\x73\x45\x34\x1b\x13\x23\x6e\xd0\x35\xbe\xc3\x8d\x4a\x4b\x15\xc3\x44\x47\x55\xab\x42\x67\x38\xb0\x1b\x54\xc0\x06\xaf\x91\xc0\x55\x12\x50\x84\x71\xcb\x2d\x69\x1c\xdf\xa9\xda\x5f\x39\x3b\xdd\x02\xb7\x5a\x35\x68\x4b\x43\x36\x6e\x33\x93\x8c\x73\x9d\x1b\x9b\x91\xa0\x80\x0c\xec\x99\x4d\xb5\x7c\xc0\x97\xc5\x3c\x6a\xcc\xd1\xc6\x5d\x96\x4b\xe2\x9e\x37\xd0\x83\xdd\xf9\x90\xb8\xdf\x63\x26\xd1\x52\x48\x9c\xc7\x82\x38\xac\x87\xa8\x45\x73\x3b\x5d\xc4\xa8\x3c\x25\x3f\xd4\x5d\xdd\x9d\x9d\x9f\xe1\x42\xb9\xdd\x8b\xf1\xe0\xf5\x36\x9a\xdb\x75\x17\xc1\xed\x0c\xe2\x86\x06\x38\xc3\xb9\x62\xfa\x4b\xa5\x74\x1e\x67\xca\x04\xab\xcc\xec\x0e\xaa\x37\x64\x57\xef\x31\xf2\x55\xa7\xd5\x5b\xd3\x1c\x6b\x58\x8a\xc7\x82\x9a\xf9\xf9\x58\x78\xd5\x78\x3f\x9a\x8e\x4e\x56\x67\xda\xcc\x27\x85\xbc\x09\xee\xca\x83\x2a\x62\x24\x8a\xfa\x54\xcd\xca\xa9\x4b\xe3\x92\x86\x7d\xf9\xf2\xe5\x4b\xe7\xe3\xc7\xce\x9b\x37\xe0\xfd\xfb\xc3\x30\x3c\x14\x35\x6a\x17\x21\x29\x31\xa7\xe3\xfa\xcb\xa3\xd8\x90\xf8\x3e\xa6\x70\xc2\xac\x57\x0c\xd1\xc6\x89\x72\x6d\x33\x9e\x99\xa5\x25\x61\x79\x79\x40\xd4\x21\x9d\x6d\x82\x3e\xf6\x48\x88\x54\x54\xaf\xb1\xd6\x94\x82\xd6\xfc\x33\x6b\x2a\x17\x2d\xe0\x1b\x4e\x82\x00\xf8\xec\x8a\xd6\x32\x38\xa1\x17\x9f\x79\x62\x3a\xb0\x41\xb5\x7f\x24\x0e\x0f\xfe\x59\x23\xb4\x63\x69\xaa\xa1\x7c\x1a\x87\x67\x98\x57\xef\x8d\x29\xd1\x88\xc5\x2c\xc8\x9c\xe0\xbf\x62\x2c\x64\x4d\x65\x9b\x09\xce\xeb\x76\x82\x03\x7e\x76\xf0\x24\xf0\x1c\x2d\x02\x9e\x2c\x8f\xa9\xaf\xb3\x80\xf4\x81\x84\xc4\xf9\x4f\x0a\xd0\x9b\x76\xf9\x4f\x0a\x8d\xf3\x9e\x14\x9c\xff\xb4\xcd\x7b\x8e\x99\xdf\x66\x64\xaa\x64\x7e\x46\x60\x9e\x6e\xfb\xdb\xb7\xb7\xe0\xe9\x6f\xf9\x5a\x1c\x18\x8d\x6a\x82\xce\xae\xf0\x50\x80\x3b\x17\xf1\x19\xe6\x14\x4b\x2c\x3a\x1e\x0b\xa3\x58\xe2\x0e\xc7\xe9\x0b\x99\xe8\x44\xcc\xff\xf7\x25\xe2\x9d\xf2\x25\xed\xa5\xf6\xc2\xf6\x4b\xd2\x94\xaf\x09\xe6\x2b\x82\x4a\x58\x2e\x09\x96\x0b\x82\xaa\x21\x62\xfe\xcb\x47\xfd\xbe\x87\x83\xa0\xc1\x7c\xa2\x3a\x4c\xab\x73\xeb\x56\x1a\x8c\xa6\xac\xed\xa7\xff\xda\x9e\x4d\x5b\x42\x72\x42\x07\x93\x6b\xab\xf8\x6c\x2c\x52\xae\xd3\x62\xb4\xda\x5c\xac\x34\x13\x2a\x24\x52\x2f\xed\x16\xf7\x9c\x7a\x8d\xba\xda\xfb\x94\xcb\xce\x0d\x06\xab\xeb\x38\x71\x6a\x53\xb3\xfd\xdc\xa9\xfb\x3c\xa3\x78\x4a\xc3\x1e\xe3\x58\xac\x9b\x2a\x6b\x9c\xfa\x3e\xaa\x5c\xb9\xb9\x82\x6d\xe0\x20\xad\xf1\xf0\x45\x79\x47\xa0\x08\xdc\xfa\x2a\xb2\xc6\x97\xd7\xdd\x37\xd6\x1d\xd0\x1a\xc7\x5e\xfc\x76\xe5\x24\x7b\x92\xf5\x9d\x89\x95\xec\x49\x72\x44\x45\x82\x93\x0d\xa5\x82\x07\xd5\x1a\xdc\x8e\x65\xa5\xc5\xed\x58\xa6\xff\x72\x50\x56\xbf\xb9\xd8\x7d\x66\xb5\x8f\x74\x77\x51\xeb\x60\xd6\xdd\xc5\x8f\x38\x64\xfc\xc6\x55\x89\x69\x48\xcd\x5a\x25\x76\x30\x1e\x29\x7d\x1b\x78\xf3\xb6\x12\x5d\x99\x58\xbb\xca\xc4\x4a\xf6\x14\x2a\xef\xef\x5f\x31\x7e\x41\xe8\xa0\x2f\xb0\xec\x9f\xdd\xc8\xa9\xc9\xd3\x16\x28\xba\xfc\xc7\xcb\x6f\xd0\x95\x84\x2d\xa5\x24\x4c\x0f\xdd\xe0\xf1\xd5\x36\x03\x1e\xf2\x86\xf8\xc9\xea\xd9\xd8\x9a\x57\x88\x29\x17\x71\x7c\xcb\x55\x88\x4d\x4a\x0d\x7a\x7b\x0d\x24\x6e\x7f\x6e\x24\xce\x55\x89\xdd\x09\xe0\x8c\xdc\xae\xb7\x3f\x1e\xc0\xbd\x8d\xe6\x76\xae\x4c\xcc\x95\x89\xb5\xbc\x4c\x6c\xcc\x2b\x6e\xae\xf0\xd5\x6f\xf2\xad\x47\xa5\x58\xca\x8a\x66\x04\xc7\x15\x8b\x2d\xbc\x58\x6c\x2e\xf8\xb8\x8a\x97\x96\xd6\x8b\x65\x38\xb9\x92\xb1\x05\x97\x8c\xdd\xcb\x8b\x5c\xd5\x58\xab\xab\xc6\xcc\x05\x95\x93\xd3\xd3\xda\xe2\xd5\x66\x02\xf5\xb6\x75\x8e\x94\x41\x74\x54\x5d\xef\xda\x60\x90\xde\xb5\x15\xa4\xd3\x2b\x14\x39\x8c\x14\x46\xef\xdb\x83\x91\xab\x90\x75\x15\xb2\xd3\xda\x4c\x2b\x0d\xe6\x01\x57\xc8\xce\x7f\x1f\x6e\xa6\x6d\xb8\x8d\x2a\x86\xcd\x34\x3d\x8b\x76\x5b\xaf\xcd\xb9\xd6\xc3\x2e\xd3\x38\xa7\x29\x7d\x35\x00\x7c\xb0\x50\x2d\xbb\xce\x75\x9d\xcd\x7e\xae\xa5\xae\x2d\x33\x7b\x1b\x7c\x0f\x16\xa8\xc9\x4a\x58\x67\x05\x8a\x8b\xb5\x4f\x97\xb5\x17\xf1\xb9\x2a\x50\x55\x8f\xac\xbb\x0a\x6b\xaf\xc9\x73\x55\xa1\xb8\x42\xd1\xba\x6b\xb0\xf6\x12\xbb\xfa\x42\xf4\xb1\xf5\x0f\xae\x16\xdd\x98\xb6\xab\x45\x5f\xf1\xa0\x1f\x76\x2d\xfa\x6e\xcf\x6a\x1f\x69\x19\xd3\x33\x4d\x32\x63\x19\xd3\x6f\x58\x26\x6c\x6b\x2d\xca\xd0\x27\x03\x62\xc6\x72\xa4\xdd\xdd\xf1\x40\xe8\xa5\x2e\xae\x1c\x69\xfe\xe5\x48\x0f\xaa\x8e\x7c\xb3\x0b\x7f\x8e\x52\x83\x06\x27\xd8\xc3\xe4\x12\x83\xd7\x88\xfa\xa9\xa1\x54\x9e\xd3\x8a\x85\xcc\xf5\xa8\x02\x7a\x1d\x4d\xbf\x17\x91\xe3\xf4\x29\x61\x4e\x21\x91\x0e\xa8\x25\x94\x03\xcd\x02\xd4\x09\x92\x18\xb0\xf3\xdc\xa1\x7c\x70\x8c\x52\x7e\xea\x60\x5a\x58\x4d\xd0\x3d\x60\xca\xfd\x49\x3a\xa4\x96\x50\x19\x74\x1f\xa4\xaa\x0e\x05\xde\x70\x96\x24\x6a\x07\xd7\xe2\x0a\x85\xe6\xeb\x58\x0e\xb1\x85\x57\x0c\xcd\x82\xd8\x1a\x95\x39\x00\xc9\x40\xc4\xfc\xfa\x1f\x9e\xb9\x72\x07\x57\xee\x30\x9d\xb6\x56\x53\xee\x40\x38\x92\x58\x5b\x33\xa7\xe9\x72\x4f\x9f\xa7\xc9\x2f\xdd\xdd\x4a\x8f\x8c\xb9\x73\x0d\xfd\xff\x95\xad\xaf\xaf\x8f\xf2\x05\xee\xef\x4f\xda\xbe\x80\x3e\xd7\xa2\x87\x71\x4a\x95\x59\x8a\xda\x18\xad\xce\xb5\xf8\xe1\x2e\x53\x8d\xd2\xa4\xbf\x01\x6a\x9d\x6b\xa1\xc2\x9d\xc6\xba\x39\x7a\x9d\x6b\xd1\xc2\xa4\xe6\xea\xa7\x1c\x75\x03\xd4\x3b\xd7\x52\x83\x89\xcd\x76\x73\xf4\x3b\x59\x25\x82\x9d\x37\x2c\xea\x34\xb2\x6c\x15\x31\xdb\x45\x6a\xcb\xaf\x25\xb9\xdd\x60\xb7\x1b\xbc\x96\xbb\xc1\x7b\x4d\x3f\x5e\xa9\x6d\x6c\xba\xdd\x60\xb3\xc7\xf9\x6f\x07\xef\x35\xfc\x40\xa5\xbe\x2d\xbf\x79\xdb\xc1\x0b\x39\x79\xec\xe1\x6e\x07\x2f\xf6\x58\xb1\x56\xbd\xdf\xbb\xb3\xc5\xee\x66\x4c\x4d\xfb\xe2\xee\xe4\x30\x7d\x02\xf3\xe2\x43\xaf\x23\x77\x6e\xd8\x9a\xb2\xa1\xa6\x5f\x81\x7c\xee\xd8\xd0\x12\xd9\x50\xc3\x4f\x3a\x1e\x38\x36\x54\xca\x1d\x1b\x5a\x05\x1b\x5a\xcd\xc2\xbc\xa3\x43\x77\xd3\xa1\xc6\xf2\x33\xc7\x87\xf4\x09\x38\x3e\xe4\xf8\x50\x2e\xb2\x67\xe1\xfd\xa6\x73\xeb\x5f\x38\x3e\xb4\x3c\x3e\xb4\xdf\x70\x2e\xfd\x73\xc7\x87\x4a\xb9\xe3\x43\xab\x5c\x1d\x5a\xf2\xd6\xaf\x23\x44\x13\xac\x0f\xdd\x5d\xee\xed\x68\x91\x3e\x01\x47\x8b\x1c\x2d\xca\x45\xf6\x64\xfc\xac\xe1\x24\xf8\xde\x8e\xa3\x45\xcb\xa3\x45\xcf\x1a\x8e\x74\x7f\xe1\x68\x51\x29\x77\xb4\xc8\xd1\x22\x47\x8b\x2c\xb4\xa8\xf9\xcf\xab\x1c\x33\xd2\x27\xe0\x98\x91\x63\x46\xb9\xc8\x9e\x8f\x0f\x1a\x0e\x97\xe8\x75\x1d\x33\x5a\x1e\x33\x3a\x68\x38\x5d\xc2\x78\xb4\xa3\x46\x8e\x1a\xb5\x80\x1a\x2d\xb9\xea\xda\x51\xa4\xd9\x57\x8e\x2c\x7f\x25\xeb\x78\x92\x3e\x01\xc7\x93\x1c\x4f\xca\x45\xf6\xec\xfc\xbc\xa1\xec\xba\xd7\x73\x3c\x69\x79\x3c\xe9\x79\x43\xd9\x75\xb7\xeb\x78\x52\x29\x77\x3c\x69\xa5\x95\x46\x8e\x28\xb5\x9e\x28\x4d\x76\xa2\x88\xe3\x4a\xfa\x04\x1c\x57\x6a\x39\x57\x52\xff\x67\xbe\x92\x78\x61\xe2\x42\x50\xfd\x5e\x6f\xae\x70\x28\xbc\x21\x0e\xd1\x1f\x98\x0b\xc2\xa8\x56\x2a\x9d\x9e\x45\x98\x5c\xec\xa3\x82\x8c\x40\x89\x06\x3a\xaa\x50\x3b\xc2\x24\x24\xd7\xa4\x3c\xb3\x06\xa6\x67\x9c\x40\x63\x04\x12\x87\x51\x80\x24\xa1\x03\xcd\x66\x61\x40\x84\x34\x2c\xc5\xa4\x07\x44\x99\xac\xe9\x3e\x84\x7a\x41\xec\xe3\x57\x81\x3d\x85\x8e\xc3\x01\x86\x71\x20\x89\xf5\x96\xcc\xfe\xa1\x95\xce\x18\x59\xd0\x3c\xd3\x03\xfe\x15\x63\x9e\x70\x11\x18\x71\x16\x62\x39\xc4\xb1\x69\xcb\x9a\xda\xbb\x15\xf9\x00\x5f\xd7\xfe\xc4\x17\x8a\x0b\x12\x7d\xe6\xc1\xe9\x0d\xf5\xac\x03\xcd\x63\x81\x36\x50\x9b\x03\x56\x7e\xbb\x3b\x50\xc7\x02\xd9\x54\x32\x09\x9d\x53\x07\xa2\x9c\x13\x4a\x64\x6a\x23\x95\x21\x67\x10\xf5\x66\x81\x08\x66\x99\x0f\x4e\x89\x93\xf5\xb6\xbb\x41\x52\x8f\xed\xa7\xc1\xab\x3c\xf6\x9f\xd0\x73\xb6\x05\xb2\x2e\x9f\x2c\x14\xbe\x2c\x1b\x98\xba\x92\x68\xa0\xf0\x11\xbf\xe7\xe3\x84\xd5\x76\xcb\xa4\x12\xe9\xb8\x1b\x32\x23\x49\xe7\x6d\x34\xc5\x02\x7f\x4a\xbb\x1b\xcb\x2f\x27\xb6\x9d\x92\x28\x57\xe2\xa4\x75\xc0\x2a\x00\x5c\x67\x6c\xc2\x3c\x11\xa9\x1a\x48\x2f\xb3\x27\xd6\x2f\x1c\x17\xa8\xef\x15\x27\x60\xc1\xb2\xa6\x35\xc3\x31\x37\x6a\x86\x68\x4c\xcc\x54\x93\x62\xb6\x01\xf6\xa4\x62\x0e\xf5\xd3\x02\x26\x57\xd8\xa4\x2a\xd3\x93\x84\x41\xaf\x74\x1f\x69\x7c\xd6\xc4\xf1\xc9\x8b\x85\x64\xe1\xfd\x62\x13\x8a\x25\xb3\x3e\x24\x69\xe8\x7b\x2c\x56\xb6\xb7\xbb\x53\x6f\x4b\x73\xa7\x96\xe7\xb2\x46\x33\xda\x8d\x0b\xd9\xf7\x09\x68\x33\xe4\x9c\x9c\x8c\x2f\xd8\x86\xf6\xaa\x87\xb9\xea\x56\xb3\x37\x9c\xda\x4e\x2a\xfd\x69\x91\xb2\x37\xc7\x48\xd9\x5d\x4e\xa4\xb4\x63\x30\x36\x58\x66\x9f\x52\xa2\x35\xca\xe9\x0d\x51\x78\x16\xc4\xe6\x3c\x7d\x29\x81\x94\x5d\x75\xba\xa5\xb2\xa0\x32\xea\x44\x0a\x6b\xb7\x47\xc4\xbb\x50\xef\xc0\x45\x27\x99\x56\xfb\xf9\x00\x4d\x83\x80\xfb\xc6\x8e\xb7\x69\xef\x70\xd7\xfc\xda\x0d\xf5\x6f\xfb\xc6\xb7\xae\xf9\x75\x77\xc7\x6c\x35\xde\x3a\x7a\xc6\xb7\xae\x9f\x5b\xce\xf7\x72\x86\xc9\x9b\xa7\xcd\x80\x9b\x9f\x6a\x3e\xe6\x99\xf9\x18\xf3\xa9\xbd\x3d\xf3\xab\xf1\x92\x76\xe0\x9b\x73\x29\x47\x58\x53\xf8\x0f\xa6\x96\x00\x60\x41\x70\xf3\xf7\xc2\x6a\x14\x04\xdb\x20\xa5\xb4\x60\x1b\xfc\xb7\x60\xbd\x60\x1b\x1c\xa5\x47\xf7\x81\x93\xfc\xe8\x3e\xb0\x0d\xca\x1b\x1f\x1f\x33\x5f\xe4\x94\x02\x5e\x96\x34\xfb\xa7\xd1\xdf\x01\x00\x00\xff\xff\xa7\x8b\x16\x65\x9d\xb6\x00\x00") + +func monitoringKubernetesResourcesByNamespaceGrafanaDashboard1JsonTplBytes() ([]byte, error) { + return bindataRead( + _monitoringKubernetesResourcesByNamespaceGrafanaDashboard1JsonTpl, + "monitoring/kubernetes-resources-by-namespace-grafana-dashboard-1.json.tpl", + ) +} + +func monitoringKubernetesResourcesByNamespaceGrafanaDashboard1JsonTpl() (*asset, error) { + bytes, err := monitoringKubernetesResourcesByNamespaceGrafanaDashboard1JsonTplBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "monitoring/kubernetes-resources-by-namespace-grafana-dashboard-1.json.tpl", size: 46749, mode: os.FileMode(436), modTime: time.Unix(1592930805, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +var _monitoringKubernetesResourcesByPodGrafanaDashboard1JsonTpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5d\xeb\x73\xdc\xa6\x16\xff\xde\xbf\x82\x72\xdb\x3b\xc9\x1d\xbb\xf6\xae\x5f\xad\x67\xf2\x21\x89\x6f\x92\xce\x4d\x5a\xd7\x4e\x3a\x93\x49\x32\x5b\x56\xc2\xbb\x8c\x25\x50\x01\xf9\x11\xcf\xf6\x6f\xbf\x23\xf4\x02\x81\x36\xeb\x7d\xd8\xb2\x97\x7c\xc9\xea\x20\x10\x9c\xdf\x39\x87\x1f\xe8\x08\xdf\x7c\x07\x00\x00\x10\x51\xca\x24\x92\x84\x51\x01\x0f\x41\x2e\x04\x00\x46\x44\x48\x78\x08\x3e\x15\xd7\xa0\x2a\x51\xa5\xc3\x94\x44\xf2\x57\x0a\x0f\x41\x6f\x43\x97\x87\x48\x22\xc1\x52\x1e\x60\x78\x08\xe0\xe6\x26\x78\xcd\xd1\x19\xa2\x08\x6c\x6e\x42\xe3\x46\x4c\xd1\x30\xca\x6e\x92\x3c\xc5\x46\xc9\x98\x84\x4e\x39\x09\x18\x7d\xc9\x22\xc6\xb3\x96\xf9\x68\x88\x9e\x6c\x6f\x80\x7e\xaf\xb7\x01\xfa\x7b\x7b\x1b\xa0\xf7\xd4\x7c\x00\x45\xb1\xea\xc3\xf3\x7a\x78\xe0\xdf\xe0\x79\x84\xb9\x14\xe6\x9d\xf2\x3a\x51\x77\x86\x48\x8c\x87\x0c\xf1\x10\x56\xa5\x93\xe2\xd7\x17\xf5\xff\x24\xaf\x06\x71\x48\xa4\xd5\x7b\x38\xa2\x58\xfe\x1a\xc2\x43\x40\xd3\x28\x2a\x65\x1c\x25\xe3\xf7\x8c\x45\x92\x24\xf0\x10\x6c\x17\x62\x12\xd6\x8a\x83\x11\xa1\xe7\x99\xe6\x3f\x7d\x29\x04\x09\xa2\x38\x12\x9a\xee\x6b\xcd\xc3\x80\x45\x11\x4a\x04\xce\x1a\x38\x43\x91\xd0\x54\x04\x47\x9c\x84\xc7\x4c\x07\x31\xd7\xa7\x05\xd2\x25\x3c\x04\xfd\x5d\x43\x74\x55\xf7\xae\x90\x5c\x67\x92\x5a\x11\xda\x73\xf2\xde\x6b\x4d\x6a\x3d\xfe\xa2\x49\x39\x4e\x30\x92\x86\x42\x72\x7d\x13\xa9\x74\x07\x5f\x1e\x7f\x00\x1f\x04\x1a\x61\xa8\x97\x16\x68\x70\x76\x59\xe2\x50\x3d\x5c\x53\x04\x8a\x08\x12\xca\x1c\xd4\x80\xf5\xfe\x0d\x91\x92\x35\xd5\x93\xc1\xfb\x16\xd3\x91\x54\x0a\xd9\x6e\x94\x60\x77\x15\xdd\x9a\x7f\xd0\x2e\xb5\x9b\xce\x48\x14\x35\x5b\xcc\x64\xaf\x39\x0a\x09\xa6\xd2\xd4\xec\x34\x94\x0e\xe6\x43\xa9\x37\x05\x25\x4d\x10\xe1\x11\xa6\x61\xf3\xb9\xe8\x62\x64\x0f\x3c\x33\xb4\x94\xf3\xbc\xf3\x76\x59\x8c\xae\xdc\x72\x42\x9d\x72\x31\x66\x97\x2e\x8f\x96\x4c\xa2\xc8\x59\xe3\x02\x45\x69\x8d\x88\x73\x7c\x11\xa1\xea\x0e\xb3\x55\x25\xbe\x24\xa1\x02\x79\xdb\x94\x9f\x5b\x16\x9a\x19\xe6\x31\x23\x54\xbe\x63\x2a\xe6\x28\x01\x40\x02\x7c\xc5\x9c\xe9\x18\xb3\xa4\x19\x1f\x41\x69\x1f\x6f\xab\x86\x9d\xdd\x4c\x30\x0f\x30\x95\x99\x91\xdb\xf6\x95\x64\xcf\xce\xcc\x24\xcd\x5a\xd8\x6b\x96\xb8\x4c\x92\x63\x1a\x62\x8e\x55\x10\x3c\x8b\x98\xd4\x7b\x29\x30\x27\x58\xfc\x7e\x81\x39\x27\x21\xb6\x46\x2b\x12\x14\x60\xb7\x07\x08\x89\x82\x73\x5b\x99\x42\xe2\x24\xc1\xe1\x5b\x42\x5d\xbd\x97\x88\x8f\xb0\x14\xc6\x24\x61\x4e\x13\x59\xac\xbc\x4a\x54\x5f\x45\x1a\x3f\xa1\x2c\xc4\x83\x2c\x2e\xab\x9e\x0c\x12\x16\x0e\x02\x46\x25\x22\x14\xf3\xc3\xea\xd7\x20\x48\xd2\x41\x9a\x85\x85\x81\xc0\x01\xa3\xa1\x18\x28\x43\x39\x14\x69\x3c\xe0\x48\xe2\x9b\xaa\x89\x67\x9f\xe1\x0f\xd5\xc5\x67\xb8\x01\x12\x16\x66\xb2\x84\x85\xd9\x55\xd5\xe4\xf7\xcf\x3e\xc3\xe3\xdf\x8f\x94\x2c\x4a\x85\xc4\x3c\xbb\xab\xf8\xf9\x19\x4e\x9e\x82\xe1\x35\x78\x52\xdd\x6e\xce\x24\x99\x3b\x33\x1e\xab\x48\x06\x25\x89\xb3\x6e\x65\x7a\x6e\xde\x44\xa8\xc4\xfc\x02\x45\xaf\x50\x20\xd5\x24\xd5\x6f\xdc\x90\x3b\xe0\xab\xaa\xad\x9b\x9b\xbf\x6e\x6e\xaa\x87\x4e\x26\x7f\x4d\x26\xcd\x36\xf3\x2a\x99\x89\x59\x61\xb4\xb0\x86\x33\x35\xe5\xc0\xe7\xcd\x9a\x19\x74\x0a\x65\x4d\x3c\xa9\x7e\xeb\x66\x21\xc7\x1c\x8b\x31\x8b\x42\xcb\x60\xb2\xc1\xbe\xe2\x2c\x76\x85\xf0\x18\x9f\xe0\x51\xe1\x13\x56\xa5\xd3\x31\x39\xbb\x7d\xe0\xaf\xa6\xc9\x1b\x33\x78\x20\xee\x9a\xee\xb2\x22\xc6\xa5\x15\x11\x55\xe8\x18\x94\xb3\x08\xa1\x21\xb9\x20\x61\x8a\x22\xe8\x74\xcf\xf2\x3e\x35\x51\xeb\xbd\xb9\x42\x57\xc4\xf2\xf7\x61\x1a\x9c\xe7\x16\xdf\xc4\x02\xc6\x45\x04\xc9\x86\xef\x24\x22\x56\x8d\xb6\xa8\x58\xc5\xbe\x96\x88\x72\x8d\xae\xf0\x37\x9c\xae\xb6\x57\x31\xce\x74\xd4\xb4\x2a\x34\xc4\x91\xdb\xa0\x22\x36\x7a\x81\x04\x6e\x52\x86\x2a\xe8\x3b\xaa\xe4\x51\x7f\xbb\x69\x7f\xf5\xe8\x74\x0b\xdc\xe8\x54\xa7\x1d\x05\x45\xbf\xcd\x79\xa7\xcd\x75\xae\x5d\x46\x82\x22\x32\x72\xcf\x83\xaa\xe4\x2d\xbe\xa8\xc6\x61\xf1\x4c\x17\xd3\xb9\x5b\xca\xf7\xf3\x14\x32\xd1\x5f\x0e\xe5\xfb\x23\x65\x12\xdd\x09\xe5\x0b\x58\x94\xc6\x76\x88\x5a\x35\x13\xd4\x45\x8c\xca\x53\xf2\x55\xd5\xea\x6d\x6f\xff\x08\x57\xca\x04\x7f\x69\x07\xaf\xbf\xd6\x4c\xb0\xb7\x0a\x26\x68\xd0\x3c\x34\xc2\x05\xce\x0d\xd3\xbf\x53\x02\x18\x70\xa6\x4c\xb0\xc9\xe3\xbe\x41\x0c\xc7\xec\xf2\x0d\x46\xa1\x6a\xb4\x59\x35\x9f\x63\x0d\x4b\x09\x58\x64\x99\x5f\x88\x45\xd0\x8c\xf7\x93\xdb\x91\xcf\xe6\x48\xa7\xb3\x4f\x21\xaf\xa3\x6f\xcd\x83\x2a\x62\x64\x8a\x7a\xdf\x9c\x95\x73\x97\xc6\x35\x19\xfb\xf8\xf1\xe3\xc7\xcd\x77\xef\x36\x8f\x8e\xc0\x9b\x37\x87\x71\x7c\x28\x2c\x82\x97\x20\x29\x31\xa7\x6d\xed\x95\x51\x6c\x4c\xc2\x10\x53\x38\xe3\xac\x57\x75\xd1\xc5\x89\x4a\x6d\x33\x5e\x98\xa5\x63\xc2\x0a\xca\x80\xa8\x43\x3a\xdf\x00\x43\x1c\x90\x18\xa9\xa8\x6e\x71\xd7\x9c\x82\x5a\xfe\x59\x14\xd5\x5b\x1c\xf0\x88\x93\x28\x02\x21\xbb\xa4\xd6\x0c\x4e\xe8\xf9\x07\x9e\x99\x0e\x9c\xa2\xda\x3f\x33\x87\x07\xff\xb2\x08\x6d\x2b\x4d\x35\x94\x4f\xd3\x78\x88\x79\xb3\x6e\x4a\x89\x46\x2c\xe6\x41\xe6\x04\xff\x9d\x62\x21\x2d\x95\xad\x27\x38\x2f\xba\x09\x0e\xf8\xd1\xc3\x93\xc1\xf3\x72\x15\xf0\x14\xf3\x98\xba\x9c\x07\xa4\xb7\x24\x26\xde\x7f\x72\x80\x8e\xba\xe5\x3f\x39\x34\xde\x7b\x72\x70\xfe\xdb\x39\xef\x29\xb7\x88\xd6\x1c\x9f\xa0\x4d\x0f\xf7\xe7\x3d\x9d\x44\x44\x53\xd9\xd6\x4f\xff\xd9\x9a\x4f\x5b\x42\x72\x42\x47\xb3\x6b\xab\xfa\x6d\xec\x05\xde\xd7\x0e\xb1\x6b\x97\x77\x03\xcc\xbf\x6f\x7c\x9b\x1d\x62\xf5\x66\xb0\x51\x4c\xa8\x90\x48\xad\xa1\x9b\x4b\xdf\x79\x36\x8e\x9b\xad\xdf\x72\x17\x78\x8a\x61\xeb\x58\x9c\xa7\xc3\x06\x02\x03\x8e\xf3\x4d\x8f\x01\x2f\x18\x97\x42\x22\x60\x1c\x8b\x85\x54\xfe\x40\xd4\x6b\xd1\xde\x45\xd4\xdb\x05\x53\xb7\xf4\x0e\xb6\x80\x87\xde\x05\xbd\x45\xa9\x57\xe5\x59\x91\xe2\x62\xeb\xa5\x5c\x8b\x0e\xaf\xa3\x5f\xad\x23\xf0\x16\xd5\x5e\xfd\x5b\xcb\x59\x5e\x4d\xda\x2f\x28\xee\xe5\xd5\x24\x47\x54\x64\x38\xb9\x50\xaa\x78\x9a\x55\xe0\x5f\x5c\x36\x4a\xfc\x8b\xcb\xfc\x5f\x09\xca\xfd\xbf\x63\xec\xed\x3b\xed\x23\x7f\xc9\xb8\xa3\x49\xe6\x7c\xc9\xf8\x0e\xc7\x8c\x5f\xfb\xd4\x32\x0d\xa9\x79\x53\xcb\x0e\xda\x91\xd2\x81\x5a\xbf\x37\x8a\x3e\xb7\xac\x5b\xb9\x65\x35\xa3\x8a\x95\xf7\x0f\xb8\x58\x8c\x42\xb5\xa4\x8f\xe9\xb2\x2e\x65\x8e\x81\x27\x27\xa7\xa7\xd6\xe3\x97\x9c\x3f\x36\x23\x05\xb7\xb0\x08\x50\x30\x5e\xfe\xa6\x4c\xa7\xd1\x78\x99\x0d\x79\x7e\x3c\x96\xba\xd5\x60\xe1\x21\x2e\x51\xb2\x5e\x70\x9c\x5e\xa2\x64\x7e\x34\x66\x5b\xfd\x2f\x75\x9d\xb2\x40\x76\x65\x2b\xfd\xf1\x09\x96\x60\xe9\xeb\x94\xe1\xb5\xb4\x6d\xd6\xaf\x53\x7c\x82\x65\x1b\xa5\xee\xef\x4e\x59\xfc\xec\x2e\x6d\xf1\xe3\x93\x2c\xbf\x09\xe0\x9c\x6b\xa2\xfe\x5e\x3b\x80\xbb\x6b\xbd\x26\xf2\x59\x96\x3e\xcb\xb2\xe3\x59\x96\x2d\xdc\xa8\x54\xf8\xfd\xbf\xbc\x7f\x1c\x89\x96\x39\x2b\x9a\x13\x1c\x9f\x6b\xb9\xf2\x5c\xcb\xa5\xe0\xe3\x13\xc6\x3a\x9a\x6e\x59\xe0\xe4\x33\x2e\x57\x9c\x71\xb9\x90\x17\xf9\xa4\xcb\x4e\x27\x5d\xea\x44\xc1\xbd\xb7\xba\x9e\x40\xbd\xea\x9c\x23\x15\x10\xb9\x37\x5c\xd7\x13\xa4\xd7\x5d\x05\xc9\xb9\x0d\xbb\x9e\x18\xbd\xe9\x0e\x46\x3e\xc1\xdc\x27\x98\xaf\x49\x82\xb9\xf5\x2a\xec\x92\xf1\x73\x42\x47\x03\x81\xe5\x40\x79\x4f\xb7\xde\x8b\xad\x55\x32\x79\x01\xc9\xe2\x30\x3c\x10\x0d\xaf\xf6\x25\xef\x72\x2d\x7b\xa1\x54\x71\x03\xd8\x47\x05\xe1\x5d\xe7\x85\x2f\xcd\x45\x1e\x6a\x54\x5a\x6a\xae\xf8\xdd\xce\x06\x0b\xe5\x85\x3f\x5e\x17\x9a\x2d\x09\x7c\x5e\x44\x97\x98\x06\x06\xbe\x7f\x06\x32\x14\x2d\xd1\x43\xfa\x44\xcc\x5a\xbf\x77\x37\xd1\xeb\x51\xe8\xdb\x5a\x8a\x77\x36\x91\xeb\x51\xa8\xdb\x5a\x55\xdf\xff\x17\x25\xad\x09\x19\xfe\xa3\x12\x63\xd8\xfe\xa3\x92\x7b\xee\xf4\xc3\xfe\xa8\x64\xa7\xef\xb4\x8f\x3c\xaf\xca\xc8\xf9\x98\x2f\xaf\xea\x37\x2c\x33\x76\xe8\xbf\x27\x59\x24\x77\x6a\x67\xa7\x1d\x24\x1d\xa3\xf5\xcb\x9d\xf2\xdf\x93\x74\xeb\x7b\x12\xc2\x91\xc4\x1a\xe1\xa2\xb9\xfb\x0f\x38\x0e\x30\xb9\xc0\xf9\x42\x2c\xff\x66\x58\x5b\x8e\xfd\xe3\xe2\x5a\xff\x54\x0b\xb2\x4f\x3f\x94\x4c\xe7\xcb\xd3\x9c\x4f\x25\x2c\xbc\xcb\xb4\xf8\x84\x85\xeb\x74\xce\xf0\x49\x0e\x16\x78\x81\x68\x98\x3b\xda\xbd\xf3\xaf\x47\x9e\x0e\xff\x22\xf1\xc9\xf0\x3e\x19\x7e\x66\x3e\xb0\x3b\xed\x2f\x4c\xec\x7b\xd2\xd6\x09\xd2\xb6\x3b\xe5\x0f\x4c\xec\x7b\xd2\x56\xcb\x3d\x69\xeb\x28\x69\x53\xbb\x1e\x31\x91\x9e\xb5\x69\x7a\xef\x2c\x6b\x7b\x5f\xa0\xe5\x69\x9b\xa7\x6d\x9e\xb6\x75\x92\xb6\x4d\xfb\x2b\x11\x07\x9e\xb6\x75\x83\xb6\x4d\xf9\x6b\x10\x07\x9e\xb6\xd5\x72\x4f\xdb\x3a\x4a\xdb\xca\xbd\xb6\x04\xa9\xf9\xd4\xf3\xb6\x6e\xf3\xb6\x13\x24\x31\x60\x67\xa0\xd8\x75\x0b\xc1\x71\x8e\x9b\x67\x6f\x9e\xbd\x35\xbb\xec\xd9\xdb\xfd\xb1\xb7\xbd\x69\xc7\xef\xfd\xec\xd9\x5b\x27\xd8\xdb\xde\x94\x93\xf7\x7e\xf6\xec\xad\x96\x7b\xf6\xd6\x51\xf6\x56\x6d\xba\x79\xfa\xa6\x6b\xbe\xf3\xf4\xad\xdc\x7e\x93\x9e\xc1\x79\x06\xe7\x19\x5c\x17\x19\xdc\xfe\xb4\x33\xc4\x7e\xf1\x0c\xae\x13\x0c\x6e\x7f\xca\x39\x61\xbf\x78\x06\x57\xcb\x3d\x83\xeb\x28\x83\x6b\xee\xbf\x85\x9c\x65\x8f\xf5\x44\xee\x61\x10\xb9\xe6\x3e\x1c\x38\xca\xf1\xf3\x6c\xce\xb3\xb9\x66\x97\x3d\x9b\xbb\x3f\x36\x77\x30\xe5\xcb\x85\xfe\xb6\x67\x73\x9d\x60\x73\x07\x53\xbe\x5c\x30\x7a\xe5\xe9\x9c\xa7\x73\xdd\xa4\x73\xd6\x86\x9c\xe7\x73\x3a\x02\x9d\xe7\x73\x8e\x8d\x39\x4f\xe9\x3c\xa5\xf3\x94\xae\xd9\x7c\xfe\x7f\xf1\x88\xcc\xeb\x33\x97\x85\xea\x70\xf8\x12\x45\x28\x82\x31\x8e\xd1\x9f\x98\x0b\xc2\xa8\xf6\xe2\x33\x3f\xf1\x3a\xbb\x39\x44\x15\x67\x82\x12\x8d\x74\x53\x81\xe7\xe9\x10\x73\x8a\x25\x16\x9b\x31\xb9\x22\xf5\x79\x63\x70\x47\x04\x28\xc2\xd0\xe8\x81\xc4\x71\x12\x21\x49\xe8\x48\x1b\x25\x8c\x88\x90\x86\xf9\x99\x54\x85\x28\x3f\x30\x7d\x92\xd0\x20\x4a\x43\xfc\x3c\x72\x4f\xe7\x6d\xe0\xc2\x38\x8d\x24\x71\x56\x29\x9c\x0a\x3a\x59\x97\x31\x23\x9b\x07\x79\xc1\xbf\x53\xcc\x33\x5e\x04\x13\xce\x62\x2c\xc7\x38\x35\x1d\x44\x53\x7b\xaf\x21\x1f\xe1\x2b\xeb\x1b\x7e\x28\xce\x49\xf2\x81\x47\xa7\xd7\x34\x70\x76\xb4\x0c\x30\x5a\x47\x5d\x5e\xdd\xb0\xa1\x48\x1d\xb6\xe7\x52\xc9\x2c\xac\x53\x9d\x82\x76\x46\x28\x91\xb9\x8d\x34\xba\x5c\x40\xd4\x9f\x07\x22\x58\x9c\xd4\x00\x6f\x89\x93\xb3\xda\xb7\x41\x52\x8f\x1d\xe4\x11\xb1\x3e\x6d\x86\xd0\x33\xb6\x01\x8a\x26\x9f\xae\x14\xbe\x62\x8a\x31\x75\x25\xd1\x48\xe1\x23\xfe\x28\xfb\x09\x9b\xe5\x8e\x41\x65\xd2\xb6\x0a\x85\x91\xe4\xe3\x36\x8a\x52\x81\xdf\xe7\xcd\xb5\x72\xdd\x99\x6d\xa7\x26\xed\x8d\xe0\xeb\xec\xb0\x0a\x00\x57\x05\x7b\x01\x3f\xfd\x56\x12\x2b\x60\x13\x98\x8b\xe2\x89\xf6\x8d\x6d\xd1\x7f\xa1\x38\x01\x2b\x92\x77\x5b\x33\x6c\xa9\xa8\x19\xa2\x31\x30\x53\x4d\x8a\x42\x47\x38\x90\x8a\x8e\xd8\xc7\x81\xcc\xae\xb0\x59\x55\xa6\xcf\x3c\xc6\xdc\xa3\xfb\xc8\xd4\x67\xcd\x1c\x9f\x82\x54\x48\x16\x77\x25\x36\xcd\x67\x16\x09\x0b\x6f\x6b\x10\x56\x95\x45\x62\xd2\x2d\x4f\xb4\x99\xa8\x05\x8a\x8f\x5f\x33\xdb\x17\x4a\x25\x73\x53\xab\x54\xb2\x41\xc0\x52\x15\xdb\x76\xb6\xed\xb2\x9c\xf0\x69\x3c\xaa\x28\x34\x2d\xb6\x8d\x12\x2c\x32\x61\xce\xc1\x69\xca\xc5\xe5\x8a\x63\xd4\xee\x78\x4a\x54\xda\x1d\xdf\x3a\x0e\x35\xda\xd3\x2c\xb9\xbf\x44\x4b\xee\xdd\x8d\x25\xbb\x31\x68\x35\xe6\xe2\x57\xbe\x60\x9b\x94\xf4\x99\x28\x3c\x2b\xe2\x7c\x96\x2f\xb2\x21\x65\x97\x9b\xbd\x5a\x59\x50\x19\x75\x26\x85\x56\xf5\x84\x04\xe7\x6a\x33\xa7\x6a\xa4\xd0\xea\xa0\xec\xa0\x69\x10\x70\xcf\xc8\x79\x31\xed\x1d\xee\x98\x97\xbd\x58\xbf\xda\x33\xae\x7a\xe6\xe5\xce\xb6\x59\x6a\x2c\x95\xfb\xc6\x55\x2f\x2c\x2d\xe7\x4b\x3d\x42\x12\xe3\x81\xcb\x80\xa7\x3f\xd5\x7c\xcc\xbe\xf9\x18\xf3\xa9\xfd\x5d\xf3\xd2\xd8\x59\x38\x08\xcd\xb1\xd4\x3d\xb4\x14\xfe\x95\xa9\xbd\x2c\x58\x2d\xa0\xca\xcd\x8c\xe6\x2c\x0b\xb6\x40\xbe\x64\x02\x5b\xe0\x7f\xd5\xaa\x0a\x6c\x81\x97\x2c\x4e\x52\x89\xc1\x49\x71\x10\x62\x26\x3b\xae\x66\x19\x98\xaa\x9d\xd7\xb6\x49\x1b\x5e\xd4\x0b\xbb\xef\x26\xff\x0f\x00\x00\xff\xff\x3a\xe3\x51\x96\xe9\xa2\x00\x00") + +func monitoringKubernetesResourcesByPodGrafanaDashboard1JsonTplBytes() ([]byte, error) { + return bindataRead( + _monitoringKubernetesResourcesByPodGrafanaDashboard1JsonTpl, + "monitoring/kubernetes-resources-by-pod-grafana-dashboard-1.json.tpl", + ) +} + +func monitoringKubernetesResourcesByPodGrafanaDashboard1JsonTpl() (*asset, error) { + bytes, err := monitoringKubernetesResourcesByPodGrafanaDashboard1JsonTplBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "monitoring/kubernetes-resources-by-pod-grafana-dashboard-1.json.tpl", size: 41705, mode: os.FileMode(436), modTime: time.Unix(1592930805, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +var _monitoringSystemGrafanaDashboard1JsonTpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5d\x69\x73\xdb\xb6\xba\xfe\x9e\x5f\x81\x8b\x2e\x71\x3a\x52\xac\xc5\x72\x6c\xcf\x64\xee\xc4\x76\x73\xdb\x3b\x71\xae\x6f\x96\xce\xe4\xa4\x1e\x15\x22\x61\x09\x47\x20\xc0\x00\xa0\x6d\xd5\xa3\xfe\xf6\x33\x00\x37\x70\x91\x2c\xd9\xb4\x22\x4b\xec\x87\xc6\x02\x40\x10\x78\xb7\xe7\x01\xf0\x92\xbc\x7d\x06\x00\x44\x8c\x71\x85\x14\xe1\x4c\xc2\x23\xa0\x8b\x00\x80\x94\x48\x05\x8f\xc0\x57\xf3\x0b\x44\xa5\xa6\x66\x10\x10\xaa\x7e\x67\xf0\x08\xb4\x1b\x69\xa9\x8b\x14\x92\x3c\x10\x0e\x86\x47\x00\x36\x9b\xe0\x7f\x04\xba\x44\x0c\x81\x66\x13\x5a\xcd\x30\x43\x03\xaa\x9b\x28\x11\x60\xab\x7c\x44\xdc\x92\x52\xe2\x70\x76\xc2\x29\x17\xba\x4f\x31\x1c\xa0\x9d\x56\x03\x74\xda\xed\x06\xe8\xf4\x7a\x0d\xd0\x7e\x61\x77\xcd\x90\x67\xee\xfd\x26\x9d\x0e\xf8\x19\xbc\xa1\x58\x28\x69\xb7\x53\x13\xdf\xb4\x73\x91\x1c\x0d\x38\x12\x2e\x8c\xea\xa6\xe6\xdf\x8b\x67\x00\x4c\x75\x73\x88\x5d\xa2\x72\xa3\x85\x43\x86\xd5\xef\x2e\x3c\x02\x2c\xa0\x34\x2c\x11\xc8\x1f\x7d\xe2\x9c\x2a\xe2\xc3\x23\xd0\x32\x85\xc4\x8d\xc5\x03\x29\x61\x63\x2d\xd7\xaf\x17\xe6\xa7\x8f\x18\xa6\x32\x91\x6c\x2c\x57\xe8\x70\x4a\x91\x2f\xb1\xbe\xf0\x12\x51\x99\x88\x01\x0e\x05\x71\xcf\x79\xaa\x9a\x50\x5e\x39\xf1\x5f\xc3\x23\xd0\xd9\xb3\x0a\x6e\xe2\xb1\x44\xbf\x27\xfa\x77\x3c\xd1\xa4\x6f\x33\xce\x4e\xd2\xce\x1a\xdd\x45\x52\xa6\x88\x32\x32\x80\x1f\x89\x8b\xc7\xe4\x1b\x4c\x6b\x22\x49\x0a\x7e\x1d\xca\x30\xea\x38\x99\x14\xa2\x04\x49\xa3\x40\x33\xfc\xf4\xbe\x03\x64\x4a\xb2\x13\xd5\x0a\x79\x87\xd9\x50\x99\xc9\xb5\x32\xe5\xb8\xac\xb9\x6d\x71\x3f\x5a\x3f\x93\x26\x97\x84\x52\x5b\x50\xb3\x65\x79\xb0\xac\x2c\xdb\x33\x64\xd9\x49\x7e\x53\x3c\xc4\xcc\xcd\xde\x0a\x5d\x0d\xf3\xf3\xd0\xba\x0f\x84\xc0\x4c\x95\xd4\x78\xe8\xa6\xac\x94\xb0\x92\x52\x39\xe2\xd7\x45\x17\x52\x5c\x21\x5a\xd2\xfa\x0a\xd1\x20\x15\x6a\x61\x32\x94\x30\x53\x6b\xf7\x66\x0a\xaf\x89\xab\x32\xc6\x97\x33\x70\x53\xa4\x9d\xe3\x9c\x13\xa6\xce\xb8\x71\x6b\x53\x90\xaa\x85\xfb\x49\xb0\x49\xef\xe8\x63\xe1\x60\xa6\xd0\x10\x17\x34\xed\xeb\xae\x04\x72\x49\xa0\xaf\xe9\x64\xcb\x8b\x86\x21\x30\x73\xb1\xc0\x26\x68\x5c\x52\xae\xd2\x1b\x4b\x2c\x08\x96\xff\x77\x85\x85\x20\x2e\xce\x0d\x5a\xfa\xc8\xc1\x65\xf6\x27\x15\x72\xc6\x85\xbb\x48\x85\x7d\x1f\xbb\xef\x08\x2b\x0e\x58\x21\x31\xc4\x4a\x5a\xf1\xd3\x8e\xa0\x3a\xb4\xdc\xf8\x66\x78\x32\x74\xa9\xfe\xbf\xf9\xa0\x2f\x02\xa6\x88\x87\xfb\x12\x3b\x9c\xb9\xb2\xef\xf0\x80\xa9\x5b\x1d\xd5\xcc\xc8\x5e\xff\x09\x7f\x4c\x7e\xfc\x09\xa7\x56\x48\xd3\x96\xce\x85\x87\xb4\x05\xc1\xa8\x0f\x3d\xd1\x6c\x13\xc2\x14\x16\x57\x88\xbe\x45\x8e\x32\x11\xb5\x9d\xa9\x0e\xcd\xf5\x6d\xd2\xcf\xed\xed\x5f\xb7\xb7\xdf\x02\x1c\xe0\xe9\xf4\xaf\xe9\xb4\x69\x7e\x5f\x73\x31\xc6\xc2\x14\x64\x3b\x17\xf8\xd2\x84\x45\xf8\x06\x26\xc5\xd3\xe8\x2f\x2b\x94\x8c\x04\x96\x23\x4e\xdd\x42\x88\xf1\xf0\x5b\xc1\x3d\x2b\xae\x26\xe5\x1f\xf0\x30\x32\x96\xdc\x05\x1f\x47\xe4\x52\x15\xaf\x88\x82\xd5\x5b\x34\xc6\xc0\x84\x33\xf0\xbf\x7c\x00\x3e\x84\xc2\x05\x1f\x43\xe1\x82\x13\x2d\x5c\x2b\x92\x25\xf1\xfb\xd6\x76\x28\x24\x4c\x3c\xce\xb9\x94\xe4\x42\xd9\x76\x18\x7b\x53\x3f\x8e\x87\x84\xb9\xe4\x8a\xb8\x01\xa2\xb0\xe0\x58\x71\x1b\x03\x1b\xe9\x00\x6e\xd0\x0d\xc9\x85\xa5\x41\xe0\x8c\x43\x23\xb2\x67\xa8\xdd\x3f\x72\x2a\x3d\xa1\x12\x00\xcc\xb5\x2e\x0f\x0b\x89\xfb\x7f\xbd\x28\x0c\x71\x82\x6e\xf0\x1c\xdb\x4d\x4d\x4d\x8e\xb4\x24\xb2\x56\x84\x06\x98\x16\x06\xa1\x2b\xf8\xf0\x18\x49\x5c\x30\xbb\x30\xc2\x15\x9a\x87\x21\xae\x50\x6c\x4d\x26\x35\xb3\xc6\x13\x19\x67\xc1\x1d\x26\x45\xa5\x23\x4a\x86\x65\xc1\xdd\x94\xbf\xc3\x57\xc9\xa0\x33\x9c\x25\x8f\xbb\xab\x20\x13\x87\xe5\x00\xd8\xee\x2e\x46\x26\xce\xb9\x2b\x97\x60\x12\x0e\x72\x46\xf8\x13\xf1\x30\x0f\x0a\x3e\xef\x68\x82\x71\x8c\x9c\xf1\x50\xf0\x80\xe5\x1d\x36\xac\xfe\x43\xdb\x7b\x41\x1a\x4e\x4c\x4d\x52\x53\x87\x3f\xbc\xed\xec\x1d\xf6\x4e\x6c\xc7\x32\xcc\xb3\xd3\x7d\xd5\x00\xed\xce\x61\x03\xec\xb5\x1a\xa0\xf5\xf2\xe0\x30\xc3\x3e\x7f\xe8\x1c\x1e\x3a\x7b\xfb\xb0\xa0\xe4\x05\x68\x8a\x8b\x1d\xe2\x21\x23\xaa\x14\x75\x52\xf3\x65\x9c\x59\x8d\x87\x28\x30\x10\x79\x9b\x61\x09\xf1\xfc\xda\xad\x56\x96\x28\xc4\x15\xad\x62\x48\xc8\xdb\x58\x12\x9d\xdf\x69\xe7\x28\xe0\xaa\xdd\xe2\x0c\x69\x1c\x90\x59\x13\x9f\xde\x6d\x65\xdd\x9c\x95\xed\xdf\xc5\xb2\x8a\x94\x55\xaf\x14\xb4\x21\xc4\x28\x9e\x57\xb7\xb1\xc2\x6e\x2a\xc7\x18\xf6\xb4\x24\xe1\x3c\xd2\xe2\x21\xdf\x27\x6c\xf8\x29\x34\xc5\x76\x59\xf9\x9c\xa8\x18\xaf\x3e\x4c\x60\x05\x8a\x03\x85\x6f\x72\x31\xe7\x2a\xd6\xd1\x9d\xa1\x2b\xee\x4c\x20\x36\xbc\xa3\xb3\xce\x9c\xf8\xe2\xa1\x9b\x53\xa4\xd0\x79\x4c\x93\x2c\xe3\x28\x52\x34\x87\x33\x86\x1d\x85\x5d\x98\x69\xf3\x49\xdf\x39\xe7\x70\xe5\xfc\x8d\x06\x43\xc2\xfe\xc0\x42\x12\xae\x23\x18\xdc\x7f\xd9\x79\xb9\x07\x2d\xb2\x26\xd5\x25\xb9\xc9\xaa\x21\x2a\x7c\xcb\x99\xfa\x48\xfe\x36\xe3\xe8\xb5\x7e\xb2\xea\x05\x2e\x5e\x63\xca\x66\x5e\x62\x64\x76\x86\xfc\x79\x08\x16\x52\x8d\x2c\x2b\x35\x35\x2a\x9c\x2d\x7c\xbf\xfb\x26\x57\xc1\x93\x0b\xe6\x08\x5c\xfa\x48\x8c\x69\xc8\x08\x2d\xcb\xd7\xcb\x90\xec\x32\xb6\xdb\x6e\x80\x76\xfb\xa0\x01\xda\x07\x87\x3a\x98\xb4\x0f\x32\xc1\xe4\x32\xa0\x65\x9c\x5d\xf7\x6c\xf7\x13\x76\xd3\x69\x35\x40\xfb\xb0\x9b\xe9\xc0\xf6\xf0\x22\x05\xd1\x8b\xda\x13\x4e\x03\x8f\x65\x25\xbb\x38\x6d\x0d\xbc\x9d\x71\x30\xc0\x7d\x81\x7d\x4a\x1c\xb3\xd8\x76\x38\x53\x82\x53\x8a\x45\x5f\x2a\xa4\x02\xd9\x17\x18\xb9\x93\xb8\x89\xb4\x98\xec\xf3\x94\xc8\x3e\x6f\x94\x76\xf1\xfa\x9f\xe7\x72\x22\x15\xf6\x9a\x2f\x7f\x79\x3e\x7d\x51\x35\xd7\xbd\x07\x5b\x85\xed\x46\x07\x96\x11\x56\xd8\x6d\x49\x58\x4a\x4c\xf3\x35\x11\xf2\x7d\x08\x18\x23\x6c\x08\xfc\x52\x04\x94\x84\x0d\x29\xd6\x12\x4c\xeb\x8c\xaf\xdb\x06\x7f\x60\x1b\xbc\xa9\x9d\x6f\xf0\x5c\x33\x5b\xf8\xba\xdc\xd6\x5b\xe5\x81\xe5\x4e\x63\x37\x0d\xdf\x47\x91\x4a\x2f\x6c\x1f\x05\xb8\xcf\xe3\x08\x50\x82\xdc\x4b\x80\x7a\x84\xce\xcb\x82\x7a\xc4\x05\x6a\x50\x7f\x08\xa8\xef\x57\x05\xea\x9d\x32\x50\xcf\x58\x54\x0d\xeb\x95\xc3\x7a\x0d\xdb\x5b\x03\xdb\x3e\x76\x2a\x81\x6b\xd0\x04\x35\x43\x78\x00\x43\xf8\xcc\xd0\x15\x22\x54\xeb\xbb\x66\x09\xf5\xf2\x7e\x73\x98\x40\xbb\x53\x15\x15\x78\x55\xaf\xef\xeb\xf5\x7d\x4d\x14\x1e\x89\x28\x98\xa3\xa7\x9d\xf8\xff\x4c\x21\xc2\xb0\xe8\x7b\xd8\xe3\x62\xd2\x0f\x24\x1a\xe2\xfe\x60\xa2\xf0\x4c\xc4\xf6\xb9\x9b\xa7\x04\x83\x09\xd8\x61\xdc\xc5\x2f\x36\x0b\xaa\xcf\xb9\x2b\x81\x4b\xa4\x12\x64\x10\x28\xec\x02\xce\xc0\x88\x4b\x55\x63\x76\x95\x98\x7d\xcf\xd5\xbb\xbb\xb7\x87\xba\xa8\xc6\xec\x87\x61\xf6\x41\x55\x98\xbd\x5f\x2f\xdf\x57\x8f\xda\x35\x2a\x6f\x0c\x2a\x7b\xe8\x66\x47\xaf\xab\x5d\x4c\x15\x0a\x57\xd7\x3e\x77\xfb\x29\x40\x27\xab\x6a\xa9\x90\x50\xb2\x6f\x72\x7f\x16\xc6\xe8\xaf\x3d\xef\xe2\x45\x08\xd4\x3e\x77\xab\xc7\xe9\x7c\x82\xc9\x83\x13\x48\xaa\x43\xf1\x33\x74\x63\x16\xda\x20\x16\x1d\xd8\xa1\x48\x2a\xd0\x03\x1e\x61\x81\xc2\xf2\xc5\xe6\xc3\xf9\xd3\xc9\xd5\x7b\x95\x43\xac\xbb\x73\xf5\xba\x05\x6f\x0c\x73\x15\xac\x24\xb6\x0a\x92\xf5\x34\x0a\xfe\xea\xf9\x6a\x52\x9e\xde\xfa\x2f\x2c\x78\xb1\x66\x93\x32\xfc\x00\x92\xe0\x6f\x3d\xcb\x3b\x30\x69\xd1\x4c\xbf\x5e\xb6\xfc\x49\x67\xfa\xad\x60\xdf\xf5\xe1\x01\xbb\x33\x37\x60\x9b\x0c\xc0\xd2\x71\x84\x19\x82\xc6\x10\x9b\x99\x0d\x4b\xab\x9f\x77\x84\x8d\xcb\x52\xa5\xac\xc0\x9f\x29\xd7\x52\xb7\xd9\xe6\x6c\x5e\xb6\x88\x88\x2b\xde\x6f\x5e\x49\xf2\xe5\x1c\x51\x9b\xfd\xe1\x12\x51\x27\xc2\x3c\x86\x95\x88\xad\x22\xcb\x04\x4d\xb0\x45\xca\x09\xd8\x9d\xea\x39\x59\x5c\x3d\x4f\x6a\x2f\x26\x2f\xaa\x40\x62\xb7\x99\xdd\x0f\xc9\x0a\xe2\x74\x4d\xd2\x85\xcf\xb9\x0b\x8c\x8c\xc1\x8e\x09\x63\x0d\x60\x74\xd8\x00\x01\xd3\xff\xbe\x00\x88\xb9\x21\x45\x34\xb3\x49\xb7\x7c\x08\x67\x16\x37\xac\xd3\x88\x17\x4e\x23\x2e\xdb\x61\xc9\x59\xe1\xa3\xe7\xed\x66\x6f\xfc\xc4\x92\x8b\x6d\x5a\xb7\xd2\xec\xe2\xa7\xb3\x52\xd8\x5f\x76\xa5\xd0\x99\xf1\x88\xd4\x61\xbd\x50\xa8\x1f\x05\x7a\xe4\x47\x81\x56\xb6\xb3\xb3\x12\x7e\xe4\x73\xf7\x29\x3c\x26\x74\xbe\xe8\xae\xcf\x3d\x90\xbd\xb5\xa5\xc8\xbe\x06\xd8\xf8\x54\x30\x7c\x93\x1f\x10\xea\xec\x97\x63\xe9\x5e\x1a\xb4\x4b\x1e\x10\x12\xd8\xc7\x68\xb6\xbf\x9e\x9c\x7f\x06\x9f\xf5\xa2\xa7\xb8\x21\xbb\x01\x4f\x21\x2f\xbd\xb3\xd9\x79\x55\x2e\xe3\x56\xa5\x7c\x65\x93\xa8\x47\xbd\x47\x69\xfe\x9b\x49\x41\x18\x77\x71\x3f\x21\x13\x59\x1a\x72\x94\x12\x12\xc7\x0f\xa2\xcd\x87\xf8\x71\x65\xa3\xe2\x23\x19\x78\x7d\x81\x14\xb6\xb8\xc9\x3f\x19\x72\x02\x66\xec\x47\x54\x43\x4c\x16\xd8\xc0\x2c\x27\x26\x95\xed\x51\x7e\x4f\x32\x53\x16\x1c\xeb\x1d\x89\x75\xe4\x2d\xf5\xc6\x83\x55\xbe\x56\xac\xa5\xbb\x57\x8e\xa8\xbd\x87\xb2\x96\xff\x0f\xb8\x42\x8f\xc6\x5a\x1c\x93\x58\x90\x1b\xd5\x0a\xa8\xcc\xa5\x75\xd8\xdd\x6e\xd9\xa7\xdd\xd5\x91\x9c\x6e\xaf\x5c\x25\xd5\x9e\xde\x6e\x23\xc9\x41\x43\x1c\x29\x2f\x63\xb7\x2b\x21\x3f\x8e\xe0\xc6\x96\x32\xd3\x9e\x4f\x89\x46\xfc\xfa\x37\x8c\x5c\xd3\x5d\xf6\xb2\x10\xb8\x2c\xed\x3b\x9c\xe6\x5f\x50\x85\xa5\x33\x53\x07\x15\xb2\x2d\xa9\x26\x74\x1e\xca\x18\xbf\xd6\xf2\xf8\x94\x45\xb9\xd0\x01\x71\xca\x56\xbe\x7c\xf9\xf2\xa5\x79\x76\xd6\x3c\x3d\x05\xbf\xfd\x76\xe4\x79\x47\x32\xc7\x7e\x7c\xa4\x14\x16\xac\xbc\xaf\x38\xbe\x8c\x88\xeb\x62\x76\xf7\x71\x53\x32\xac\x22\x89\x88\x05\xca\x45\x64\x63\x05\x60\x48\x93\x36\x2f\x1e\x32\x21\xeb\x48\x20\x47\xe4\x42\x5e\x96\x73\xac\xa8\x22\x7d\xf7\x16\x3c\x15\x84\x52\xe0\xf2\x6b\x06\x0b\xcd\x3e\x0b\x5a\xcc\x3a\xb2\x44\x68\xb2\x32\xc1\x0f\xf9\x0c\xb4\x72\xf6\x96\x11\x31\x0b\xbc\x01\x16\xd9\xeb\x02\x46\x2c\x90\x5e\x4e\xfa\x1f\xf0\xb7\x00\x17\x8e\xcc\xb6\x45\x01\xc7\xeb\xa3\x00\xf0\xd3\x76\xaa\xe0\xa4\x5a\x15\x44\x70\x62\x7e\x2e\xa7\x88\x77\xc4\x23\xdb\xea\x07\xa7\xdf\xdf\x0f\x42\xf1\x6f\xab\x17\xfc\xba\x0e\x5e\x70\xce\xdd\xf5\x93\x7e\x96\xf7\xde\x4b\xf8\xbb\xee\xee\xed\x2d\x78\xf9\x3e\xde\x18\x02\xd3\x69\xa1\xa0\xd9\x95\x0e\xa2\xb8\x39\x0e\x06\x58\x30\xac\xb0\x6c\x3a\xdc\xf3\x03\x85\x9b\x02\x87\x2b\x13\xd9\xf4\xb9\xfb\xdf\x57\x48\x34\xd3\xfd\xa6\x74\xb7\xe9\x67\x5d\xe1\x73\xf7\xf5\x8f\xfd\xbe\x83\xf3\x59\xe7\x96\xc6\xfd\xbc\x94\x57\xed\x6d\x6b\xa4\x63\x4b\x2c\xbb\x2f\x7f\xd9\x5d\x5e\x2e\x52\x09\xc2\x86\x8b\xc9\x25\xfa\xcb\xda\xe4\x7a\xf2\x7b\x95\xe6\x8d\xb1\x99\x4a\xc2\xa4\x42\x66\xcd\x59\x70\x9c\x25\x37\x30\x67\x1e\xa6\x66\xca\x97\xcf\x9c\x4c\x9e\xd6\xcf\x9e\x3a\xc7\x5e\xd6\x17\x11\x21\x32\xa2\x74\xb8\xc8\x64\x9b\x3d\x4d\x99\x1d\x57\x21\xb3\xef\x69\x80\x60\x17\x6c\xa1\xda\x4e\x1e\xdb\xd4\xa9\xe1\x3c\x1b\x24\xb1\xd3\x2d\x30\xf4\x8d\x53\xda\xaf\xab\x39\x67\xba\xfb\x38\x29\xbf\x6b\xbd\xba\x34\x18\x81\x98\xd4\x4a\x28\xaa\x20\x61\x1a\xb9\xe2\xfa\xa8\x69\x5b\x8e\x9a\x9e\x81\xef\x74\x3a\xb4\xd7\x29\x68\xda\x1c\x45\xa4\x8f\x36\xdf\xe3\x74\xe8\xcc\xe4\xf2\xd7\x69\x2d\x96\x98\x67\x3c\xb0\x57\xbf\x5c\xbf\x4e\x6b\xb9\xdf\x52\x71\xc1\x27\x67\xee\x60\x0b\x0d\x90\xf4\xf3\x5f\xaf\x9f\xd7\xa9\x2b\xd5\xa5\xae\xcc\x88\x81\x75\xf6\xca\x3d\x28\x85\x31\xea\x9a\x52\x6c\x63\xf6\x4a\x6f\xc6\xf3\x2b\xaf\x2a\xe0\x27\x75\x02\xcb\x7d\xe9\x4c\x6f\xc6\xc7\x82\xba\x35\x9d\xa9\x13\x58\x00\x58\x2e\x81\xa5\xf4\xed\x4e\x75\xfe\x4a\x32\xac\x52\x26\x11\x8b\xf4\xbb\x1f\x9d\x3d\xc1\x14\x16\x17\x3b\x21\xa3\x58\x5a\x07\x75\x22\xcb\x5a\xa9\x61\x5b\x0f\xf2\xd7\x22\x9d\x25\xd2\x45\x9d\xd1\x52\x99\x1e\xee\xef\x10\x75\x5e\x4b\x85\x6a\xa8\xf3\x5a\xea\xbc\x96\x3a\xaf\xa5\xd2\xbc\x96\xef\xb6\x59\xb9\xd1\xb9\x2b\x91\x2c\x97\x94\xe2\x9a\x8a\xad\x92\xf4\x95\xc7\xb6\xb3\x65\x52\x54\x36\x4a\x3b\xab\xca\x52\xd9\x28\xa1\x55\x92\xa8\xb2\x06\x26\xbd\x89\xba\x59\x8b\x7c\x94\x19\xfb\xd0\x75\x4a\x4a\x6e\x32\x75\x4a\xca\x36\xa5\xa4\xf4\x0e\x0a\x9a\x0e\x9f\x8e\x9d\xff\xc4\x72\xe2\x55\xef\xb1\xba\xe6\x62\xbc\xc1\xe9\x27\x4b\xbf\x05\xae\x37\xeb\xdb\xd6\xe9\x31\x5a\x7d\x60\x53\xbf\xd1\x6d\x91\xa5\x1c\x11\x48\x61\x8b\x95\xb0\xd0\xdb\xfa\x02\x3b\x98\x5c\x45\xc4\xa4\xf0\x3a\xb7\xbb\x48\x42\xe5\x2f\x74\xbb\x77\xf2\xc9\xda\xbd\xd0\xed\x43\x28\x58\x70\x8c\x98\x1b\x9a\xf3\x83\x98\xc2\xb6\x66\x93\x58\xdb\x28\x05\x20\x4c\x0d\xec\xd8\x7f\xd4\x3c\x93\xfc\x17\x0f\x36\x83\x29\xd8\x2a\xa8\x5f\xd0\xba\x24\x34\xef\xcf\x7a\x17\xc8\x41\x0d\xcd\x35\x34\x57\x02\xcd\x66\x99\xe7\x11\x55\x63\x73\xd5\xd8\xfc\x29\x92\x6c\x0d\xce\x55\x2d\xd5\x6b\x00\x5e\x0f\x00\x7e\x16\x75\xab\x7d\x4e\xbb\x53\x98\x4d\x18\xea\x06\x4a\x67\x84\x3d\x94\x7e\x39\x35\xc4\xaa\x30\xd1\xca\x1c\x64\x23\x31\x0e\x5b\x2a\x34\x4c\xd5\x0e\xc3\x63\xc2\x48\x70\x30\x0c\x31\x30\xb9\x93\xc2\x9e\x4f\x91\x22\x6c\x98\xcc\x00\x52\x22\x95\x65\x36\x36\xd8\x86\x5f\xe5\xb3\xe1\x94\x30\x87\x06\x2e\x7e\x53\xfe\xd1\xb3\x52\x05\x41\x2f\xa0\x8a\x94\x34\x8f\x3f\x8d\x57\xc2\x06\x32\xb8\x63\x1f\xad\xc1\x6f\x01\x16\x13\x73\x4c\x29\xb8\x87\xd5\x08\x07\xb6\x31\x5b\xa2\x6c\x67\x4a\x87\xf8\x26\xb7\x53\x09\xe5\x98\xf8\x9f\x05\xfd\x38\x61\x4e\xc9\xe0\x62\x87\xb7\x06\x97\xf7\xb8\x8c\x05\xd0\xf8\x03\x8d\xb9\xc9\xa7\x74\x21\x63\xe8\xb1\xd2\x72\xa7\x86\xd1\x47\xbb\xf2\x87\xbf\x59\x3f\x48\xbe\xe1\x55\x68\x56\xe6\x5f\xf7\xd6\x22\x4c\x10\x0b\x2e\xa1\xcc\xd2\x8b\x2c\x5d\x5a\x13\xb1\x05\x62\xf0\x9e\x86\x1f\x2d\x2c\x6e\x48\x2f\x2a\x9a\xc5\x84\x93\x7a\xb5\xe5\xd7\xb6\x69\xcd\xb9\xc7\x82\x56\xe3\x04\x52\x71\x0f\x66\xfc\x5d\x47\xec\x69\xe8\x85\xc4\xc8\x2a\xf2\xbf\xe4\x13\x87\xfc\xba\xd9\x8e\xb1\x25\xfe\x8a\x61\xb8\x91\x96\x5e\xe6\x13\x67\x6c\xc8\x52\x74\x71\x64\xef\xfd\x98\x00\xd8\x32\x86\x3d\xeb\xb3\x75\x6d\xfb\x1b\x76\x99\x0f\xda\xb5\xbd\xf4\xef\x9e\xf5\x77\xdb\xfe\xd1\x6d\xd9\x35\x16\x02\x76\xac\xbf\xdb\x6e\x38\xe3\x8b\x78\x0e\x9a\xae\x14\x75\x3f\xfb\x2e\x76\xc7\xfb\x76\xc7\xf6\x5d\x3a\x7b\xf6\x0f\xeb\x1b\x97\xaf\x5c\x7b\xbc\xf1\x58\x32\xe2\xfb\x9b\x1b\x02\x08\xa3\xc8\x19\x73\x8c\xbc\xc2\xc1\x2e\x08\xe3\x28\xd8\x05\x1f\xc3\x10\x6a\x2e\xb8\x4a\xc3\xf1\xb3\xe9\x7f\x02\x00\x00\xff\xff\xac\xb0\xe9\x0a\x07\x99\x00\x00") + +func monitoringSystemGrafanaDashboard1JsonTplBytes() ([]byte, error) { + return bindataRead( + _monitoringSystemGrafanaDashboard1JsonTpl, + "monitoring/system-grafana-dashboard-1.json.tpl", + ) +} + +func monitoringSystemGrafanaDashboard1JsonTpl() (*asset, error) { + bytes, err := monitoringSystemGrafanaDashboard1JsonTplBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "monitoring/system-grafana-dashboard-1.json.tpl", size: 39175, mode: os.FileMode(436), modTime: time.Unix(1592930805, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +var _monitoringZyncGrafanaDashboard1JsonTpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xd4\x56\x4d\x8f\x23\x35\x10\xbd\xcf\xaf\xb0\x7c\x40\x20\x25\x90\x64\x99\x05\x22\xed\x61\x18\x69\xd0\x4a\xc3\xb2\x5a\x10\x12\x3b\x33\x8a\x2a\xed\x4a\xb7\x89\x63\xb7\xec\xea\x4c\xb2\x51\xfe\x3b\xb2\xfb\xcb\xdd\x6e\xc1\x99\x4b\x62\x3f\x57\xdb\xf5\xf1\xea\xd9\x97\x1b\xc6\x38\x68\x6d\x08\x48\x1a\xed\xf8\x9a\x79\x88\x31\xae\xa4\x23\xbe\x66\x4f\x61\xc6\x1a\x34\xac\x6c\x2b\xa9\xe8\xbd\xe6\x6b\xb6\x9c\xf5\xa8\x00\x02\x67\x2a\x9b\x21\x5f\x33\x3e\x9f\xb3\x5f\x2c\xec\x40\x03\x9b\xcf\x79\x64\x86\x1a\xb6\xca\x9b\x90\xad\x30\xc2\x0b\x29\x26\x50\x99\x19\x7d\x6f\x94\xb1\x7e\x4f\x9b\x6f\xe1\xeb\xc5\x8c\xad\x96\xcb\x19\x5b\xdd\xde\xce\xd8\xf2\x9b\x78\x6b\x0d\x87\x70\xf6\x5d\x1f\x0e\xfb\x8a\xdd\x29\xb4\xe4\x62\x3b\x3a\x97\xc1\x4e\x80\x2b\xb6\x06\xac\xe0\xcd\xda\x35\xfc\xbf\xdc\x30\x76\xf5\xe6\x1c\x85\xa4\x91\xb7\x3c\xd7\x48\xef\x05\x5f\x33\x5d\x29\x55\x23\x16\xca\xe2\x0f\x63\x14\xc9\x92\xaf\xd9\x22\x80\xd2\x9b\xac\xc2\x50\x49\xbd\xf7\x79\x7d\x7a\x09\xd3\x12\x34\x2a\xd7\x65\xb6\xcd\x2b\x07\x25\xc1\x85\x58\x43\x11\xae\xad\xc3\x7c\x0b\x01\xd9\x81\x72\x5d\x6a\x82\xef\x8f\xa8\x73\x2a\x7c\x19\x16\x03\x1c\x53\xf3\x9d\x54\x2a\xae\x17\xcf\xad\x14\x1f\x4d\x5f\xee\xba\x06\x7c\xcd\x7e\x8a\x12\xf5\xea\x3f\x59\x45\xc0\xa9\x8d\xaf\x99\x9f\xfd\xbc\x4d\x5e\xb7\x77\x1f\x7b\x4d\x24\xcc\x51\x8b\xe1\x49\x70\xcc\xc7\x3e\x32\xc6\xb3\xca\x5a\xd4\x34\xb1\x72\x80\xd3\x14\x2a\xf5\x04\xea\x0a\xf3\x9a\x32\x89\x0c\x81\x9a\xb0\x3e\x82\xaa\xfa\x84\x25\xb1\x28\xa9\xc3\x6a\xbc\x5b\x00\x5f\xa5\xa8\x73\x1f\xa3\x51\x9d\x6b\x46\x56\x4a\x7d\x34\x52\xd3\xaf\x26\xb0\x3b\x00\x1d\x15\xb9\x29\xbb\x9e\xeb\x4f\x2c\xd1\x66\xa8\x09\x72\x4c\xaa\x58\xfa\xad\x2c\x08\x59\xb9\x41\x86\x03\x9e\x16\xdd\xa2\x16\x68\x31\xf4\xce\x4e\x19\xea\x0f\x76\x68\x25\xba\xdf\x8e\x68\xad\x14\x38\x72\xda\x95\x90\xe1\x14\xb7\x1c\x41\xb6\x4f\x4e\x71\x84\x65\x89\xe2\x51\xea\xd4\x61\x02\x9b\x23\xb9\x48\x46\x62\x21\xf1\x1d\x76\x2a\xeb\xd6\x06\xa9\xdc\x26\x33\x5a\x63\xe6\x73\xb2\x29\x8d\x51\xd1\xdc\x5d\xfe\x36\xdb\x77\xcf\xfc\xcb\x59\x67\xf3\x83\xd1\x92\x8c\x95\x3a\x7f\xe6\x33\xdf\xf4\xc1\xe3\x77\xcf\xfc\x72\x61\xdf\x7e\x68\xe7\xec\x7a\x7d\xe6\xd7\xa8\xef\x7d\x1b\x18\x7b\x00\xcf\x2f\x4e\xf2\x80\x9b\x3a\x0d\x43\x13\xa9\x09\xed\x31\x50\x85\x4f\xaf\x3c\x40\x46\x41\x90\x96\x83\xe5\x9a\xe6\x0f\xdd\x09\x9f\x7c\x48\x2c\x0a\x61\xb8\x9b\xc5\x5d\x90\x11\x7e\xc7\x3b\xf8\xda\x8c\xfa\x5a\x50\x61\xd1\x15\x46\x89\x51\x8d\xbc\xfb\x0f\xd6\x1c\x22\x1d\xea\xf0\x4f\x98\x37\xac\x1a\x7d\xf0\x7b\x21\x77\x94\x7e\x41\x41\xe0\xf8\xe7\xbf\x3e\xdc\xb3\xfb\x09\x77\x39\x75\xda\x76\x89\xbb\x0c\x2c\x8a\xb4\xcf\x9c\xb1\x34\x52\x89\xd0\x62\x9b\x56\x75\xa5\x16\xf2\x28\x45\x05\x8a\x27\xdd\xd6\xda\x04\x49\xed\x1d\x38\xc1\x49\x8e\xa4\x6a\x5b\x65\xfb\x9a\x59\x71\x34\x5e\x13\x9a\x4e\xf3\x01\x4f\x5c\x0e\x23\xeb\x69\xad\xe8\x34\xe1\xe9\x25\x71\xf1\x0c\x27\xfc\x17\x42\xf7\x0c\x73\x85\xcf\xc4\x90\x22\xb0\x45\x95\x38\xe1\x17\x4c\xfe\x33\x38\x4c\x38\x55\xcb\x5e\x62\x5e\xeb\x5e\x02\x47\xc1\xf4\x94\x9a\xfd\x4f\xfc\x4c\xa8\x7f\x4e\x8b\x0e\x4a\xe6\x53\x8a\x1f\xf0\x47\x3c\x76\x4e\x0f\xee\x73\xff\x5b\x5f\xbd\x2e\x2b\xf0\x00\x7f\xa2\x75\xd2\x84\xe7\xcb\x8f\x35\x4c\x67\xd5\x3c\x08\xec\x3e\x64\x82\x13\xe4\xd1\x95\x4d\x78\x28\x15\x90\xd4\x79\xfa\x3c\xea\x5f\x0b\x81\x71\xdd\xfa\xae\xee\x4e\xae\xcd\xeb\xfc\x6d\xcb\x65\x4e\xa6\xc1\xf8\xe0\xb3\x52\x66\xfb\xa0\xd3\xcd\xc7\x16\x77\xbe\xef\x37\xad\xe4\xc4\x84\xe3\xb7\x51\x6b\x2e\x17\xd1\xe4\x4d\x3c\x59\x1e\xfa\xf1\x6d\x34\x5e\xc6\x93\x37\x8b\x78\x25\xea\xb8\x55\x34\x5e\x36\xef\xa3\x97\x36\x06\x2f\x9d\xfd\xd5\xf5\xf4\x9f\xa7\xc4\x1b\xbf\x8d\x37\x8e\x4f\x59\x7d\x1f\x4f\x44\x3f\xfe\x41\xc4\xfe\xb6\xbe\x0c\xd2\xf7\xc5\x84\xbb\x87\x37\xb5\x6b\x15\x6d\x7c\x1d\x7c\xf7\xf9\xac\xb3\xda\xe6\xd8\x73\xe0\xe6\x7a\xf3\x4f\x00\x00\x00\xff\xff\x68\x5d\x11\x82\x05\x0b\x00\x00") + +func monitoringZyncGrafanaDashboard1JsonTplBytes() ([]byte, error) { + return bindataRead( + _monitoringZyncGrafanaDashboard1JsonTpl, + "monitoring/zync-grafana-dashboard-1.json.tpl", + ) +} + +func monitoringZyncGrafanaDashboard1JsonTpl() (*asset, error) { + bytes, err := monitoringZyncGrafanaDashboard1JsonTplBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "monitoring/zync-grafana-dashboard-1.json.tpl", size: 2821, mode: os.FileMode(436), modTime: time.Unix(1592930805, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +var _monitoringZyncQueGrafanaDashboard1JsonTpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xd4\x56\x5b\x6f\x23\x35\x14\x7e\xef\xaf\xb0\xce\x03\x02\x29\x81\x24\x4b\x17\x88\xb4\x0f\xa5\xa2\x68\xa5\xb2\xec\x2e\x17\x89\x6d\xab\xe8\x64\x7c\x32\x63\xe2\xd8\x83\xed\x49\x93\x46\xf9\xef\xc8\x9e\x9b\x27\x1e\xc1\xf3\xbe\x24\xf6\xe7\x33\xf6\xb9\x7c\xe7\xb3\x4f\x57\x8c\x01\x2a\xa5\x1d\x3a\xa1\x95\x85\x25\xf3\x10\x63\x20\x85\x75\xb0\x64\x0f\x61\xc6\x1a\x34\xac\xac\x2b\x21\xdd\x5b\x05\x4b\x36\x9f\xf4\x28\x47\x87\x56\x57\x26\x23\x58\x32\x98\x4e\xd9\xcf\x06\x37\xa8\x90\x4d\xa7\x10\x99\x91\xc2\xb5\xf4\x26\xce\x54\x14\xe1\x85\xe0\x23\xa8\xc8\xb4\xba\xd5\x52\x1b\xbf\xa7\xc9\xd7\xf8\xe5\x6c\xc2\x16\xf3\xf9\x84\x2d\xae\xaf\x27\x6c\xfe\x55\xbc\xb5\xc2\x5d\x38\xfb\xa6\x0f\x87\x7d\xc1\x6e\x24\x19\x67\x63\x3b\x77\x2c\x83\x1d\x47\x5b\xac\x35\x1a\x0e\xcd\xda\x39\xfc\x3f\x5d\x31\x76\xf6\xe6\x40\x5c\xb8\x0b\x6f\x21\x57\xe4\xde\x72\x58\x32\x55\x49\x59\x23\x06\xcb\xe2\x77\xad\xa5\x13\x25\x2c\xd9\x2c\x80\xc2\x9b\x2c\xc2\x50\x0a\xb5\xf5\x79\x7d\x78\x0a\xd3\x12\x15\x49\xdb\x65\xb6\xcd\x2b\xa0\x14\x68\x43\xac\xa1\x08\xe7\xd6\x61\x58\x63\x40\x36\x28\x6d\x97\x9a\xe0\xfb\x3d\xa9\xdc\x15\xbe\x0c\xb3\x01\x4e\xa9\xf9\x46\x48\x19\xd7\x0b\x72\x23\xf8\x7b\xdd\x97\xbb\xae\x01\x2c\xd9\x0f\x51\xa2\x9e\xfd\x27\x8b\x08\x38\xb4\xf1\x35\xf3\xa3\x9f\xb7\xc9\xeb\xf6\xee\x63\xaf\x89\x44\x39\x29\x3e\x3c\x09\xf7\xf9\xa5\x8f\x8c\x41\x56\x19\x43\xca\x8d\xac\xec\xf0\x30\x86\x0a\x35\x82\xda\x42\x3f\xa7\x4c\x72\xda\xa1\x1c\xb1\xde\xa3\xac\xfa\x84\x25\xb1\x48\xa1\xc2\x6a\xbc\x5b\x00\x9f\x05\xaf\x73\x1f\xa3\x51\x9d\x6b\x46\x56\x52\xbe\xd7\x42\xb9\x5f\x74\x60\x77\x00\x3a\x2a\x82\x2e\xbb\x9e\xeb\x4f\x2c\xc9\x64\xa4\x1c\xe6\x94\x54\xb1\xf4\x5b\x19\xe4\xa2\xb2\x83\x0c\x07\x3c\x2d\xba\x21\xc5\xc9\x50\xe8\x9d\x8d\xd4\xae\x3f\xd8\x92\x11\x64\x7f\xdd\x93\x31\x82\xd3\x85\xd3\xb6\xc4\x8c\xc6\xb8\x65\x1d\x66\xdb\xe4\x14\xeb\xa8\x2c\x89\xdf\x0b\x95\x3a\xec\xd0\xe4\xe4\x6c\x24\x23\xb1\x90\xf8\x0e\x3b\x94\x75\x6b\xa3\x90\x76\x95\x69\xa5\x28\xf3\x39\x59\x95\x5a\xcb\x68\x6e\x4f\x7f\xeb\xf5\x9b\x47\x78\x39\xaa\x6c\xfa\x4f\x45\xd3\x9d\x56\xc2\x69\x23\x54\xfe\x08\x13\xdf\xf8\xc1\xeb\x37\x8f\x70\x3a\xb1\xaf\xdf\xb5\x73\x76\x3e\x3f\xc2\x39\xea\x7d\xdf\x0a\xda\xec\xd0\x73\x0c\x9c\xd8\xd1\xaa\x4e\xc5\xd0\x44\x28\x47\x66\x1f\xe8\x02\xe3\x2b\x77\x98\xb9\x20\x4a\xf3\xc1\x72\x4d\xf5\xbb\xee\x84\x8f\x3e\x2c\x16\x85\x31\xdc\xcd\xd0\x26\x48\x09\xdc\x40\x07\x9f\x9b\x51\x5f\x0f\x57\x18\xb2\x85\x96\xfc\xa2\x4e\xde\xfd\x3b\xa3\x77\x91\x16\x75\xf8\x47\xca\x1b\x66\x5d\x7c\xf0\x5b\x21\x36\x2e\xfd\xc2\x05\x91\x83\x4f\x7f\xbd\xbb\x65\x1f\xfe\xf8\x89\xdd\x8e\xb8\x0c\xae\xd3\xb8\x53\xdc\x6d\x68\x88\xa7\xfd\x66\xb5\x71\x17\x6a\x11\x5a\x6d\xd5\xaa\xaf\x50\x5c\xec\x05\xaf\x50\x42\xd2\x75\xad\x4d\x90\xd6\xde\x81\x03\x1e\xc4\x85\x64\xad\xab\x6c\x5b\x33\x2c\x8e\xc8\x6b\x43\xd3\x71\x3e\xe8\x91\x4b\xe2\xc2\x7a\x5c\x33\x3a\x6d\x78\x78\x4a\x5c\x3c\xe2\x81\xfe\x83\xd8\x3d\xcb\x6c\xe1\x33\x31\xa4\x09\xae\x49\x26\x4e\xf8\x05\x9d\xff\x88\x96\x12\x5e\xd5\xf2\x97\x98\xd7\xfa\x97\xc0\x51\x30\x3d\xad\x26\x9f\x89\x9f\x09\xfd\x8f\x69\xd1\x51\x8a\x7c\x4c\xf9\x03\x7e\x4f\xfb\xce\xe9\xc1\xbd\xee\x7f\xeb\x2b\xd8\x66\x05\xed\xf0\x4f\x32\x56\xe8\xf0\x8c\xf9\xbe\x86\xdd\x51\x36\x0f\x03\xb3\x0d\x99\x00\x87\x79\x74\x75\x3b\xda\x95\x12\x9d\x50\x79\xfa\x4c\xea\x5f\x0d\x81\x71\xdd\xfa\xa6\xee\x50\x50\xfa\x79\xfa\xba\xe5\x32\x38\xdd\x60\x30\xf8\xac\x14\xd9\x36\xe8\x75\xf3\xb1\xa1\x8d\xef\xfd\x55\x2b\x3b\x31\xe1\xe0\x3a\x6a\xcd\xf9\x2c\x9a\xbc\x8a\x27\xf3\x5d\x3f\xbe\x8e\xc6\xf3\x78\xf2\x6a\x16\xaf\x44\x1d\xb7\x88\xc6\xf3\xe6\x9d\xf4\xd4\xc6\xe0\xe5\xb3\xbf\xc2\x1e\xfe\xf7\x94\x78\xe3\xd7\xf1\xc6\xf1\x29\x8b\x6f\xe3\x09\xef\xc7\xdf\xf1\xd8\xdf\xd6\x97\x41\xfa\x5e\x74\xb8\x83\xa0\xa9\x5d\xab\x6a\x97\x57\xc2\x37\x9f\x8e\x2a\xfb\x50\xd5\xb2\x00\xfb\x9e\x06\x57\xe7\xab\x7f\x03\x00\x00\xff\xff\x93\x34\xfc\x09\x10\x0b\x00\x00") + +func monitoringZyncQueGrafanaDashboard1JsonTplBytes() ([]byte, error) { + return bindataRead( + _monitoringZyncQueGrafanaDashboard1JsonTpl, + "monitoring/zync-que-grafana-dashboard-1.json.tpl", + ) +} + +func monitoringZyncQueGrafanaDashboard1JsonTpl() (*asset, error) { + bytes, err := monitoringZyncQueGrafanaDashboard1JsonTplBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "monitoring/zync-que-grafana-dashboard-1.json.tpl", size: 2832, mode: os.FileMode(436), modTime: time.Unix(1592930805, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +// Asset loads and returns the asset for the given name. +// It returns an error if the asset could not be found or +// could not be loaded. +func Asset(name string) ([]byte, error) { + cannonicalName := strings.Replace(name, "\\", "/", -1) + if f, ok := _bindata[cannonicalName]; ok { + a, err := f() + if err != nil { + return nil, fmt.Errorf("Asset %s can't read by error: %v", name, err) + } + return a.bytes, nil + } + return nil, fmt.Errorf("Asset %s not found", name) +} + +// MustAsset is like Asset but panics when Asset would return an error. +// It simplifies safe initialization of global variables. +func MustAsset(name string) []byte { + a, err := Asset(name) + if err != nil { + panic("asset: Asset(" + name + "): " + err.Error()) + } + + return a +} + +// AssetInfo loads and returns the asset info for the given name. +// It returns an error if the asset could not be found or +// could not be loaded. +func AssetInfo(name string) (os.FileInfo, error) { + cannonicalName := strings.Replace(name, "\\", "/", -1) + if f, ok := _bindata[cannonicalName]; ok { + a, err := f() + if err != nil { + return nil, fmt.Errorf("AssetInfo %s can't read by error: %v", name, err) + } + return a.info, nil + } + return nil, fmt.Errorf("AssetInfo %s not found", name) +} + +// AssetNames returns the names of the assets. +func AssetNames() []string { + names := make([]string, 0, len(_bindata)) + for name := range _bindata { + names = append(names, name) + } + return names +} + +// _bindata is a table, holding each asset generator, mapped to its name. +var _bindata = map[string]func() (*asset, error){ + "monitoring/apicast-grafana-dashboard-1.json.tpl": monitoringApicastGrafanaDashboard1JsonTpl, + "monitoring/apicast-grafana-dashboard-2.json.tpl": monitoringApicastGrafanaDashboard2JsonTpl, + "monitoring/backend-grafana-dashboard-1.json.tpl": monitoringBackendGrafanaDashboard1JsonTpl, + "monitoring/kubernetes-resources-by-namespace-grafana-dashboard-1.json.tpl": monitoringKubernetesResourcesByNamespaceGrafanaDashboard1JsonTpl, + "monitoring/kubernetes-resources-by-pod-grafana-dashboard-1.json.tpl": monitoringKubernetesResourcesByPodGrafanaDashboard1JsonTpl, + "monitoring/system-grafana-dashboard-1.json.tpl": monitoringSystemGrafanaDashboard1JsonTpl, + "monitoring/zync-grafana-dashboard-1.json.tpl": monitoringZyncGrafanaDashboard1JsonTpl, + "monitoring/zync-que-grafana-dashboard-1.json.tpl": monitoringZyncQueGrafanaDashboard1JsonTpl, +} + +// AssetDir returns the file names below a certain +// directory embedded in the file by go-bindata. +// For example if you run go-bindata on data/... and data contains the +// following hierarchy: +// data/ +// foo.txt +// img/ +// a.png +// b.png +// then AssetDir("data") would return []string{"foo.txt", "img"} +// AssetDir("data/img") would return []string{"a.png", "b.png"} +// AssetDir("foo.txt") and AssetDir("notexist") would return an error +// AssetDir("") will return []string{"data"}. +func AssetDir(name string) ([]string, error) { + node := _bintree + if len(name) != 0 { + cannonicalName := strings.Replace(name, "\\", "/", -1) + pathList := strings.Split(cannonicalName, "/") + for _, p := range pathList { + node = node.Children[p] + if node == nil { + return nil, fmt.Errorf("Asset %s not found", name) + } + } + } + if node.Func != nil { + return nil, fmt.Errorf("Asset %s not found", name) + } + rv := make([]string, 0, len(node.Children)) + for childName := range node.Children { + rv = append(rv, childName) + } + return rv, nil +} + +type bintree struct { + Func func() (*asset, error) + Children map[string]*bintree +} + +var _bintree = &bintree{nil, map[string]*bintree{ + "monitoring": &bintree{nil, map[string]*bintree{ + "apicast-grafana-dashboard-1.json.tpl": &bintree{monitoringApicastGrafanaDashboard1JsonTpl, map[string]*bintree{}}, + "apicast-grafana-dashboard-2.json.tpl": &bintree{monitoringApicastGrafanaDashboard2JsonTpl, map[string]*bintree{}}, + "backend-grafana-dashboard-1.json.tpl": &bintree{monitoringBackendGrafanaDashboard1JsonTpl, map[string]*bintree{}}, + "kubernetes-resources-by-namespace-grafana-dashboard-1.json.tpl": &bintree{monitoringKubernetesResourcesByNamespaceGrafanaDashboard1JsonTpl, map[string]*bintree{}}, + "kubernetes-resources-by-pod-grafana-dashboard-1.json.tpl": &bintree{monitoringKubernetesResourcesByPodGrafanaDashboard1JsonTpl, map[string]*bintree{}}, + "system-grafana-dashboard-1.json.tpl": &bintree{monitoringSystemGrafanaDashboard1JsonTpl, map[string]*bintree{}}, + "zync-grafana-dashboard-1.json.tpl": &bintree{monitoringZyncGrafanaDashboard1JsonTpl, map[string]*bintree{}}, + "zync-que-grafana-dashboard-1.json.tpl": &bintree{monitoringZyncQueGrafanaDashboard1JsonTpl, map[string]*bintree{}}, + }}, +}} + +// RestoreAsset restores an asset under the given directory +func RestoreAsset(dir, name string) error { + data, err := Asset(name) + if err != nil { + return err + } + info, err := AssetInfo(name) + if err != nil { + return err + } + err = os.MkdirAll(_filePath(dir, filepath.Dir(name)), os.FileMode(0755)) + if err != nil { + return err + } + err = ioutil.WriteFile(_filePath(dir, name), data, info.Mode()) + if err != nil { + return err + } + err = os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime()) + if err != nil { + return err + } + return nil +} + +// RestoreAssets restores an asset under the given directory recursively +func RestoreAssets(dir, name string) error { + children, err := AssetDir(name) + // File + if err != nil { + return RestoreAsset(dir, name) + } + // Dir + for _, child := range children { + err = RestoreAssets(dir, filepath.Join(name, child)) + if err != nil { + return err + } + } + return nil +} + +func _filePath(dir, name string) string { + cannonicalName := strings.Replace(name, "\\", "/", -1) + return filepath.Join(append([]string{dir}, strings.Split(cannonicalName, "/")...)...) +} diff --git a/pkg/common/constants.go b/pkg/common/constants.go new file mode 100644 index 000000000..ccdc86dff --- /dev/null +++ b/pkg/common/constants.go @@ -0,0 +1,6 @@ +package common + +// Constants +const ( + MonitoringKey = "middleware" +) diff --git a/pkg/controller/apimanager/apimanager_controller.go b/pkg/controller/apimanager/apimanager_controller.go index 92b91adc6..4906b3572 100644 --- a/pkg/controller/apimanager/apimanager_controller.go +++ b/pkg/controller/apimanager/apimanager_controller.go @@ -17,6 +17,7 @@ import ( "k8s.io/api/policy/v1beta1" "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/types" + "k8s.io/client-go/discovery" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller" "sigs.k8s.io/controller-runtime/pkg/handler" @@ -58,11 +59,16 @@ func newReconciler(mgr manager.Manager) (reconcile.Reconciler, error) { return nil, err } + discoveryClient, err := discovery.NewDiscoveryClientForConfig(mgr.GetConfig()) + if err != nil { + return nil, err + } + client := mgr.GetClient() scheme := mgr.GetScheme() ctx := context.TODO() return &ReconcileAPIManager{ - BaseReconciler: reconcilers.NewBaseReconciler(client, scheme, apiClientReader, ctx, log), + BaseReconciler: reconcilers.NewBaseReconciler(client, scheme, apiClientReader, ctx, log, discoveryClient), }, nil } @@ -283,6 +289,12 @@ func (r *ReconcileAPIManager) reconcileAPIManagerLogic(cr *appsv1alpha1.APIManag return result, err } + genericMonitoringReconciler := operator.NewGenericMonitoringReconciler(operator.NewBaseAPIManagerLogicReconciler(r.BaseReconciler, cr)) + result, err = genericMonitoringReconciler.Reconcile() + if err != nil || result.Requeue { + return result, err + } + return reconcile.Result{}, nil } diff --git a/pkg/controller/apimanager/apimanager_controller_test.go b/pkg/controller/apimanager/apimanager_controller_test.go index 90ee1de23..a48f1b82a 100644 --- a/pkg/controller/apimanager/apimanager_controller_test.go +++ b/pkg/controller/apimanager/apimanager_controller_test.go @@ -6,12 +6,16 @@ import ( appsv1alpha1 "github.com/3scale/3scale-operator/pkg/apis/apps/v1alpha1" "github.com/3scale/3scale-operator/pkg/reconcilers" + + monitoringv1 "github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1" + grafanav1alpha1 "github.com/integr8ly/grafana-operator/v3/pkg/apis/integreatly/v1alpha1" appsv1 "github.com/openshift/api/apps/v1" imagev1 "github.com/openshift/api/image/v1" routev1 "github.com/openshift/api/route/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" + fakeclientset "k8s.io/client-go/kubernetes/fake" "k8s.io/client-go/kubernetes/scheme" "sigs.k8s.io/controller-runtime/pkg/client/fake" "sigs.k8s.io/controller-runtime/pkg/reconcile" @@ -24,6 +28,8 @@ func TestAPIManagerControllerCreate(t *testing.T) { wildcardDomain = "test.3scale.net" ) + ctx := context.TODO() + apimanager := &appsv1alpha1.APIManager{ ObjectMeta: metav1.ObjectMeta{ Name: name, @@ -36,8 +42,6 @@ func TestAPIManagerControllerCreate(t *testing.T) { }, } - ctx := context.TODO() - // Objects to track in the fake client. objs := []runtime.Object{apimanager} @@ -56,14 +60,22 @@ func TestAPIManagerControllerCreate(t *testing.T) { if err != nil { t.Fatalf("Unable to add Route scheme: (%v)", err) } + if err := monitoringv1.AddToScheme(s); err != nil { + t.Fatal(err) + } + if err := grafanav1alpha1.AddToScheme(s); err != nil { + t.Fatal(err) + } // Create a fake client to mock API calls. cl := fake.NewFakeClient(objs...) clientAPIReader := fake.NewFakeClient(objs...) + clientset := fakeclientset.NewSimpleClientset() + baseReconciler := reconcilers.NewBaseReconciler(cl, s, clientAPIReader, ctx, log, clientset.Discovery()) // Create a ReconcileMemcached object with the scheme and fake client. r := &ReconcileAPIManager{ - BaseReconciler: reconcilers.NewBaseReconciler(cl, s, clientAPIReader, ctx, log), + BaseReconciler: baseReconciler, } req := reconcile.Request{ diff --git a/pkg/controller/apimanagerbackup/apimanagerbackup_controller.go b/pkg/controller/apimanagerbackup/apimanagerbackup_controller.go index 0e5a26143..cb9d8ced8 100644 --- a/pkg/controller/apimanagerbackup/apimanagerbackup_controller.go +++ b/pkg/controller/apimanagerbackup/apimanagerbackup_controller.go @@ -5,8 +5,10 @@ import ( appsv1alpha1 "github.com/3scale/3scale-operator/pkg/apis/apps/v1alpha1" "github.com/3scale/3scale-operator/pkg/reconcilers" + "k8s.io/apimachinery/pkg/api/errors" "sigs.k8s.io/controller-runtime/pkg/client" + "k8s.io/client-go/discovery" "sigs.k8s.io/controller-runtime/pkg/controller" "sigs.k8s.io/controller-runtime/pkg/handler" logf "sigs.k8s.io/controller-runtime/pkg/log" @@ -39,11 +41,16 @@ func newReconciler(mgr manager.Manager) (reconcile.Reconciler, error) { return nil, err } + discoveryClient, err := discovery.NewDiscoveryClientForConfig(mgr.GetConfig()) + if err != nil { + return nil, err + } + client := mgr.GetClient() scheme := mgr.GetScheme() ctx := context.TODO() return &ReconcileAPIManagerBackup{ - BaseReconciler: reconcilers.NewBaseReconciler(client, scheme, apiClientReader, ctx, log), + BaseReconciler: reconcilers.NewBaseReconciler(client, scheme, apiClientReader, ctx, log, discoveryClient), }, nil } diff --git a/pkg/controller/apimanagerrestore/apimanagerrestore_controller.go b/pkg/controller/apimanagerrestore/apimanagerrestore_controller.go index 2614cf758..fce7d57fc 100644 --- a/pkg/controller/apimanagerrestore/apimanagerrestore_controller.go +++ b/pkg/controller/apimanagerrestore/apimanagerrestore_controller.go @@ -6,8 +6,10 @@ import ( appsv1alpha1 "github.com/3scale/3scale-operator/pkg/apis/apps/v1alpha1" "github.com/3scale/3scale-operator/pkg/reconcilers" "github.com/3scale/3scale-operator/pkg/restore" + corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/client-go/discovery" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller" "sigs.k8s.io/controller-runtime/pkg/handler" @@ -41,11 +43,16 @@ func newReconciler(mgr manager.Manager) (reconcile.Reconciler, error) { return nil, err } + discoveryClient, err := discovery.NewDiscoveryClientForConfig(mgr.GetConfig()) + if err != nil { + return nil, err + } + client := mgr.GetClient() scheme := mgr.GetScheme() ctx := context.TODO() return &ReconcileAPIManagerRestore{ - BaseReconciler: reconcilers.NewBaseReconciler(client, scheme, apiClientReader, ctx, log), + BaseReconciler: reconcilers.NewBaseReconciler(client, scheme, apiClientReader, ctx, log, discoveryClient), }, nil } diff --git a/pkg/helper/envvarutils.go b/pkg/helper/envvarutils.go index 0953bb074..07f84e501 100644 --- a/pkg/helper/envvarutils.go +++ b/pkg/helper/envvarutils.go @@ -68,3 +68,13 @@ func EnvVarFromSecretOptional(envVarName string, secretName, secretKey string) v }, } } + +func FindEnvVar(vars []v1.EnvVar, name string) (v1.EnvVar, bool) { + for idx := range vars { + if vars[idx].Name == name { + return vars[idx], true + } + } + + return v1.EnvVar{}, false +} diff --git a/pkg/reconcilers/base_reconciler.go b/pkg/reconcilers/base_reconciler.go index 4720896da..6a21d6413 100644 --- a/pkg/reconcilers/base_reconciler.go +++ b/pkg/reconcilers/base_reconciler.go @@ -11,6 +11,7 @@ import ( "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" + "k8s.io/client-go/discovery" "sigs.k8s.io/controller-runtime/pkg/client" logf "sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/reconcile" @@ -31,19 +32,21 @@ type BaseReconciler struct { apiClientReader client.Reader ctx context.Context logger logr.Logger + discoveryClient discovery.DiscoveryInterface } // blank assignment to verify that BaseReconciler implements reconcile.Reconciler var _ reconcile.Reconciler = &BaseReconciler{} func NewBaseReconciler(client client.Client, scheme *runtime.Scheme, apiClientReader client.Reader, - ctx context.Context, logger logr.Logger) *BaseReconciler { + ctx context.Context, logger logr.Logger, discoveryClient discovery.DiscoveryInterface) *BaseReconciler { return &BaseReconciler{ client: client, scheme: scheme, apiClientReader: apiClientReader, ctx: ctx, logger: logger, + discoveryClient: discoveryClient, } } @@ -71,6 +74,10 @@ func (b *BaseReconciler) Logger() logr.Logger { return b.logger } +func (b *BaseReconciler) DiscoveryClient() discovery.DiscoveryInterface { + return b.discoveryClient +} + // ReconcileResource attempts to mutate the existing state // in order to match the desired state. The object's desired state must be reconciled // with the existing state inside the passed in callback MutateFn. diff --git a/pkg/reconcilers/base_reconciler_test.go b/pkg/reconcilers/base_reconciler_test.go index b31d5cc1d..6e475e9ad 100644 --- a/pkg/reconcilers/base_reconciler_test.go +++ b/pkg/reconcilers/base_reconciler_test.go @@ -6,11 +6,13 @@ import ( "testing" "github.com/3scale/3scale-operator/pkg/common" + appsv1 "github.com/openshift/api/apps/v1" v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" + fakeclientset "k8s.io/client-go/kubernetes/fake" "k8s.io/client-go/kubernetes/scheme" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client/fake" @@ -29,22 +31,22 @@ func TestBaseReconcilerCreate(t *testing.T) { namespace = "operator-unittest" ) + ctx := context.TODO() + s := scheme.Scheme err := appsv1.AddToScheme(s) if err != nil { t.Fatal(err) } - ctx := context.TODO() - // Objects to track in the fake client. objs := []runtime.Object{} // Create a fake client to mock API calls. cl := fake.NewFakeClient(objs...) clientAPIReader := fake.NewFakeClient(objs...) - - baseReconciler := NewBaseReconciler(cl, s, clientAPIReader, ctx, log) + clientset := fakeclientset.NewSimpleClientset() + baseReconciler := NewBaseReconciler(cl, s, clientAPIReader, ctx, log, clientset.Discovery()) desiredConfigmap := &v1.ConfigMap{ TypeMeta: metav1.TypeMeta{ @@ -84,14 +86,14 @@ func TestBaseReconcilerUpdateNeeded(t *testing.T) { namespace = "operator-unittest" ) + ctx := context.TODO() + s := runtime.NewScheme() err := appsv1.AddToScheme(s) if err != nil { t.Fatal(err) } - ctx := context.TODO() - existingConfigmap := &v1.ConfigMap{ TypeMeta: metav1.TypeMeta{ APIVersion: "v1", @@ -113,7 +115,8 @@ func TestBaseReconcilerUpdateNeeded(t *testing.T) { cl := fake.NewFakeClient(objs...) clientAPIReader := fake.NewFakeClient(objs...) - baseReconciler := NewBaseReconciler(cl, s, clientAPIReader, ctx, log) + clientset := fakeclientset.NewSimpleClientset() + baseReconciler := NewBaseReconciler(cl, s, clientAPIReader, ctx, log, clientset.Discovery()) desiredConfigmap := &v1.ConfigMap{ TypeMeta: metav1.TypeMeta{ @@ -172,14 +175,14 @@ func TestBaseReconcilerDelete(t *testing.T) { namespace = "operator-unittest" ) + ctx := context.TODO() + s := runtime.NewScheme() err := appsv1.AddToScheme(s) if err != nil { t.Fatal(err) } - ctx := context.TODO() - existing := &v1.ConfigMap{ TypeMeta: metav1.TypeMeta{ APIVersion: "v1", @@ -201,6 +204,9 @@ func TestBaseReconcilerDelete(t *testing.T) { cl := fake.NewFakeClient(objs...) clientAPIReader := fake.NewFakeClient(objs...) + clientset := fakeclientset.NewSimpleClientset() + baseReconciler := NewBaseReconciler(cl, s, clientAPIReader, ctx, log, clientset.Discovery()) + desired := &v1.ConfigMap{ TypeMeta: metav1.TypeMeta{ APIVersion: "v1", @@ -216,7 +222,6 @@ func TestBaseReconcilerDelete(t *testing.T) { } common.TagObjectToDelete(desired) - baseReconciler := NewBaseReconciler(cl, s, clientAPIReader, ctx, log) err = baseReconciler.ReconcileResource(&v1.ConfigMap{}, desired, CreateOnlyMutator) if err != nil { t.Fatal(err) diff --git a/test/e2e/apimanager_controller_test.go b/test/e2e/apimanager_controller_test.go index fcc79101b..b3598a82f 100644 --- a/test/e2e/apimanager_controller_test.go +++ b/test/e2e/apimanager_controller_test.go @@ -9,13 +9,13 @@ import ( appsgroup "github.com/3scale/3scale-operator/pkg/apis/apps" appsv1alpha1 "github.com/3scale/3scale-operator/pkg/apis/apps/v1alpha1" e2eutil "github.com/3scale/3scale-operator/test/e2e/e2eutil" + + clientappsv1 "github.com/openshift/client-go/apps/clientset/versioned/typed/apps/v1" + clientroutev1 "github.com/openshift/client-go/route/clientset/versioned/typed/route/v1" framework "github.com/operator-framework/operator-sdk/pkg/test" frameworke2eutil "github.com/operator-framework/operator-sdk/pkg/test/e2eutil" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" - - clientappsv1 "github.com/openshift/client-go/apps/clientset/versioned/typed/apps/v1" - clientroutev1 "github.com/openshift/client-go/route/clientset/versioned/typed/route/v1" ) func TestApiManagerController(t *testing.T) { diff --git a/tools.go b/tools.go index 3d5e5c0bc..0e49e2d2b 100644 --- a/tools.go +++ b/tools.go @@ -2,4 +2,8 @@ // Place any runtime dependencies as imports in this file. // Go modules will be forced to download and install them. -package tools +package main + +import ( + _ "github.com/go-bindata/go-bindata/go-bindata" +)